Ignore:
Timestamp:
May 13, 2012, 6:21:34 PM (12 years ago)
Author:
Torben Dannhauer
Message:
 
File:
1 edited

Legend:

Unmodified
Added
Removed
  • experimental/distortionNG/ReaderWriterDist.cpp

    r365 r366  
    55{
    66        supportsExtension( "dist", "distortion set loader");
     7        extensionToAdd = ".dist";
    78
     9        // Configure Compression and instantiate read/write-options
     10        bool asAscii = true;
     11        bool compressionEnabled = false;
    812
    9         extensionToAdd = ".dist";
     13        std::string readOptionString = "";
     14        std::string writeOptionString = "";
     15        if(asAscii)
     16        {
     17                readOptionString = "Ascii";
     18                writeOptionString = "Ascii";
     19        }
     20        if (compressionEnabled)
     21                writeOptionString+=" Compressor=zlib";
     22        readOptions = new osgDB::Options( readOptionString.c_str() );
     23        writeOptions = new osgDB::Options( writeOptionString.c_str() );
     24
     25        // Get ReaderWriter
     26        rw = osgDB::Registry::instance()->getReaderWriterForExtension("osgt"); 
     27
    1028}
    1129
    1230ReaderWriterDist::ReadResult ReaderWriterDist::readNode( const std::string& file, const osgDB::ReaderWriter::Options* options) const
    1331{
    14         // Check if its a valid file for this pseudo loader
    1532        std::string ext = osgDB::getLowerCaseFileExtension( file );
    1633        if( !acceptsExtension(ext) )
    1734                return ReadResult::FILE_NOT_HANDLED;
    1835
    19         // Strip the pseudo-loader extension
    20     std::string realName = osgDB::getNameLessExtension( file );
    21 
    22         // check if stripped file exists
    23         std::string fileName = osgDB::findDataFile( realName, options );
     36        // check if file exists
     37        std::string fileName = osgDB::findDataFile( file, options );
    2438        if( fileName.empty() )
    2539                return ReadResult::FILE_NOT_FOUND;
    2640
    27         // If options are available: Save it'S original KdTree Hint.
    28         Options::BuildKdTreesHint originalHint = Options::NO_PREFERENCE;
    29         if(options)
     41        std::ifstream stream( fileName.c_str(), std::ios::in );
     42        if (!stream)    return ReadResult::ERROR_IN_READING_FILE;
     43        return readNode( stream, options );
     44}
     45
     46ReaderWriterDist::ReadResult ReaderWriterDist:: readNode( std::istream& fin, const osgDB::ReaderWriter::Options* options ) const
     47{
     48        if ( rw )
    3049        {
    31                 originalHint = options->getBuildKdTreesHint();
    32                 const_cast<osgDB::ReaderWriter::Options*>(options)->setBuildKdTreesHint(Options::DO_NOT_BUILD_KDTREES);
     50                osgDB::ReaderWriter::ReadResult rr = rw->readObject( fin, readOptions );
     51                if (rr.success())
     52                {
     53                        return( rr.takeObject() );
     54                }
     55                else
     56                        OSG_NOTIFY( osg::WARN ) << "ERROR: Unable to convert stream to node" << std::endl;
    3357        }
     58        else
     59                OSG_NOTIFY( osg::WARN ) << "ERROR: Unable to get ReaderWriter for internally used extension" << std::endl;
     60}
    3461
    35         // Load real file
    36         osg::Node *node = osgDB::readNodeFile( fileName, options );
    37     if( !node )
    38     {
    39         // propagate the read failure upwards
    40         OSG_WARN << "Subfile \"" << fileName << "\" could not be loaded" << std::endl;
    41         return ReadResult::FILE_NOT_HANDLED;
    42     }
     62ReaderWriterDist::WriteResult writeNode( const osg::Node& node, const std::string& fileName, const Options* options ) const
     63{
     64        std::string ext = osgDB::getLowerCaseFileExtension( file );
     65        if( !acceptsExtension(ext) )
     66                return WriteResult::FILE_NOT_HANDLED;
    4367
    44         return node;
     68        std::ifstream stream( fileName.c_str(), std::ios::in );
     69        if (!stream)    return ReadResult::ERROR_IN_READING_FILE;
     70        return readNode( stream, options );
     71// ------------------
     72    WriteResult result = WriteResult::FILE_SAVED;
     73    std::ios::openmode mode = std::ios::out;
     74    osg::ref_ptr<Options> local_opt = prepareWriting( result, fileName, mode, options );
     75    if ( !result.success() ) return result;
     76
     77    osgDB::ofstream fout( fileName.c_str(), mode );
     78    if ( !fout ) return WriteResult::ERROR_IN_WRITING_FILE;
     79
     80    result = writeNode( node, fout, local_opt.get() );
     81    fout.close();
     82    return result;
     83}
     84
     85ReaderWriterDist::WriteResult writeNode( const osg::Node& node, std::ostream& fout, const Options* options ) const
     86{
     87        if ( rw )
     88        {
     89                osgDB::ReaderWriter::WriteResult wr = rw->writeObject( node, fout, writeOptions );
     90                if (wr.success() )                     
     91                {
     92                        OSG_NOTIFY( osg::WARN ) << "schreiben geschafft!"<< std::endl;
     93                }
     94                else OSG_NOTIFY( osg::WARN ) << "ERROR: Save failed: " << wr.message() << std::endl;
     95                return(wr);
     96        }
     97        OSG_NOTIFY( osg::WARN ) << "ERROR: Unable to get ReaderWriter for internally used extension" << std::endl;
    4598}
    4699
Note: See TracChangeset for help on using the changeset viewer.