source: experimental/distortionNG/ReaderWriterDist.cpp @ 422

Last change on this file since 422 was 371, checked in by Torben Dannhauer, 12 years ago
File size: 5.8 KB
Line 
1/* osgVisual test. distortionNG, experimental.
2*
3*  Permission is hereby granted, free of charge, to any person obtaining a copy
4*  of this software and associated documentation files (the "Software"), to deal
5*  in the Software without restriction, including without limitation the rights
6*  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7*  copies of the Software, and to permit persons to whom the Software is
8*  furnished to do so, subject to the following conditions:
9*
10*  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
11*  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
12*  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
13*  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
14*  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
15*  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
16*  THE SOFTWARE.
17*/
18
19#include "ReaderWriterDist.h"
20#include <osg/KdTree>
21
22ReaderWriterDist::ReaderWriterDist()
23{
24        supportsExtension( "dist", "distortion set loader");
25        extensionToAdd = ".dist";
26
27        // Configure Compression and instantiate read/write-options
28        bool asAscii = true;
29        bool compressionEnabled = false;
30
31        std::string readOptionString = "";
32        std::string writeOptionString = "";
33        if(asAscii)
34        {
35                readOptionString = "Ascii";
36                writeOptionString = "Ascii";
37        }
38        if (compressionEnabled)
39                writeOptionString+=" Compressor=zlib";
40        readOptions = new osgDB::Options( readOptionString.c_str() );
41        writeOptions = new osgDB::Options( writeOptionString.c_str() );
42
43        // Get ReaderWriter
44        rw = osgDB::Registry::instance()->getReaderWriterForExtension("osgt"); 
45}
46
47ReaderWriterDist::Options* ReaderWriterDist::prepareReading( ReadResult& result, std::string& fileName, std::ios::openmode& mode, const Options* options ) const
48{
49        std::string ext = osgDB::getLowerCaseFileExtension( fileName );
50        if ( !acceptsExtension(ext) )
51        {
52                result = ReadResult::FILE_NOT_HANDLED;
53                return 0;
54        }
55        fileName = osgDB::findDataFile( fileName, options );
56        if ( fileName.empty() )
57        {
58                result = ReadResult::FILE_NOT_FOUND;
59                return 0;
60        }
61
62        osg::ref_ptr<Options> local_opt = options ?
63                static_cast<Options*>(options->clone(osg::CopyOp::SHALLOW_COPY)) : new Options;
64        local_opt->getDatabasePathList().push_front(osgDB::getFilePath(fileName));
65
66        mode |= std::ios::binary;
67
68        return local_opt.release();
69}
70
71ReaderWriterDist::ReadResult ReaderWriterDist::readObject( const std::string& file, const Options* options) const
72{
73        // This function must be reimplemented because the osgb|t|x plugin would test for a valid filename extension and thus would block the fiel due to it's .dist extension.
74        ReadResult result = ReadResult::FILE_LOADED;
75        std::string fileName = file;
76        std::ios::openmode mode = std::ios::in;
77        Options* local_opt = prepareReading( result, fileName, mode, options );
78        if ( !result.success() ) return result;
79
80        osgDB::ifstream istream( fileName.c_str(), mode );
81        return readObject( istream, local_opt );
82}
83
84ReaderWriterDist::ReadResult ReaderWriterDist::readObject( std::istream& fin, const Options* options ) const
85{
86        // This function uses the osgb|t|x plugin to perform the operation
87        if ( rw )
88        {
89                osgDB::ReaderWriter::ReadResult rr = rw->readObject( fin, readOptions );
90                if (rr.success())
91                {
92                        return( rr.takeObject() );
93                }
94                else
95                        OSG_NOTIFY( osg::WARN ) << "ERROR: Unable to convert stream to node" << std::endl;
96        }
97        OSG_NOTIFY( osg::WARN ) << "ERROR: Unable to get ReaderWriter for internally used extension" << std::endl;
98        return( ReadResult::NOT_IMPLEMENTED );
99}
100
101ReaderWriterDist::Options* ReaderWriterDist::prepareWriting( WriteResult& result, const std::string& fileName, std::ios::openmode& mode, const Options* options ) const
102{
103        std::string ext = osgDB::getFileExtension( fileName );
104        if ( !acceptsExtension(ext) ) result = WriteResult::FILE_NOT_HANDLED;
105
106        osg::ref_ptr<Options> local_opt = options ?
107                static_cast<Options*>(options->clone(osg::CopyOp::SHALLOW_COPY)) : new Options;
108        local_opt->getDatabasePathList().push_front(osgDB::getFilePath(fileName));
109
110        mode |= std::ios::binary;
111
112        return local_opt.release();
113}
114
115ReaderWriterDist::WriteResult ReaderWriterDist::writeObject( const osg::Object& object, const std::string& fileName, const osgDB::ReaderWriter::Options* options ) const
116{
117        // This function must be reimplemented because the osgb|t|x plugin would test for a valid filename extension and thus would block the fiel due to it's .dist extension.
118        WriteResult result = WriteResult::FILE_SAVED;
119        std::ios::openmode mode = std::ios::out;
120        osg::ref_ptr<Options> local_opt = prepareWriting( result, fileName, mode, options );
121        if ( !result.success() ) return result;
122
123        osgDB::ofstream fout( fileName.c_str(), mode );
124        if ( !fout ) return WriteResult::ERROR_IN_WRITING_FILE;
125
126        result = writeObject( object, fout, local_opt.get() );
127        fout.close();
128        return result;
129}
130
131ReaderWriterDist::WriteResult ReaderWriterDist::writeObject( const osg::Object& object, std::ostream& fout, const osgDB::ReaderWriter::Options* options ) const
132{
133        // This function uses the osgb|t|x plugin to perform the operation
134        if ( rw )
135        {
136                osgDB::ReaderWriter::WriteResult wr = rw->writeObject( object, fout, writeOptions );
137                if (wr.success() )                     
138                {
139                        OSG_NOTIFY( osg::WARN ) << "schreiben geschafft!"<< std::endl;
140                }
141                else OSG_NOTIFY( osg::WARN ) << "ERROR: Save failed: " << wr.message() << std::endl;
142                return(wr);
143        }
144        OSG_NOTIFY( osg::WARN ) << "ERROR: Unable to get ReaderWriter for internally used extension" << std::endl;
145        return( WriteResult::NOT_IMPLEMENTED );
146}
147
148// Add ourself to the Registry to instantiate the reader/writer.
149REGISTER_OSGPLUGIN(dist, ReaderWriterDist)
Note: See TracBrowser for help on using the repository browser.