From 38d33c7685ab1263d7731d9c91c99cdbe31e642c Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Sun, 30 Sep 2007 19:53:02 +0000 Subject: [PATCH] From Paul Martz, "here's the osgDB::Registry changes to add Options to the read*File() interface. As we discussed, this preserves the old interface for backwards compatibility. osgconv also changed to use the new Registry::writeNode() interface. No other applications or examples were affected." --- applications/osgconv/osgconv.cpp | 2 +- include/osgDB/Registry | 48 +++++++++++++-------------- include/osgDB/WriteFile | 57 +++++++++++++++++++++++++++++--- src/osgDB/Registry.cpp | 24 +++++++------- src/osgDB/WriteFile.cpp | 16 ++++----- 5 files changed, 97 insertions(+), 50 deletions(-) diff --git a/applications/osgconv/osgconv.cpp b/applications/osgconv/osgconv.cpp index bf9e267a4..a1a4553d7 100644 --- a/applications/osgconv/osgconv.cpp +++ b/applications/osgconv/osgconv.cpp @@ -671,7 +671,7 @@ int main( int argc, char **argv ) } } - osgDB::ReaderWriter::WriteResult result = osgDB::Registry::instance()->writeNode(*root,fileNameOut); + osgDB::ReaderWriter::WriteResult result = osgDB::Registry::instance()->writeNode(*root,fileNameOut,osgDB::Registry::instance()->getOptions()); if (result.success()) { osg::notify(osg::NOTICE)<<"Data written to '"<writeObjectImplementation(obj,fileName); + return osgDB::Registry::instance()->writeObjectImplementation(obj,fileName,options); } - virtual ReaderWriter::WriteResult writeImage(const osg::Image& obj, const std::string& fileName) + virtual ReaderWriter::WriteResult writeImage(const osg::Image& obj, const std::string& fileName,const ReaderWriter::Options* options) { - return osgDB::Registry::instance()->writeImageImplementation(obj,fileName); + return osgDB::Registry::instance()->writeImageImplementation(obj,fileName,options); } - virtual ReaderWriter::WriteResult writeHeightField(const osg::HeightField& obj, const std::string& fileName) + virtual ReaderWriter::WriteResult writeHeightField(const osg::HeightField& obj, const std::string& fileName,const ReaderWriter::Options* options) { - return osgDB::Registry::instance()->writeHeightFieldImplementation(obj,fileName); + return osgDB::Registry::instance()->writeHeightFieldImplementation(obj,fileName,options); } - virtual ReaderWriter::WriteResult writeNode(const osg::Node& obj, const std::string& fileName) + virtual ReaderWriter::WriteResult writeNode(const osg::Node& obj, const std::string& fileName,const ReaderWriter::Options* options) { - return osgDB::Registry::instance()->writeNodeImplementation(obj,fileName); + return osgDB::Registry::instance()->writeNodeImplementation(obj,fileName,options); } protected: @@ -249,33 +249,33 @@ class OSGDB_EXPORT Registry : public osg::Referenced const WriteFileCallback* getWriteFileCallback() const { return _writeFileCallback.get(); } - ReaderWriter::WriteResult writeObject(const osg::Object& obj, const std::string& fileName) + ReaderWriter::WriteResult writeObject(const osg::Object& obj, const std::string& fileName,const ReaderWriter::Options* options) { - if (_writeFileCallback.valid()) return _writeFileCallback->writeObject(obj,fileName); - else return writeObjectImplementation(obj,fileName); + if (_writeFileCallback.valid()) return _writeFileCallback->writeObject(obj,fileName,options); + else return writeObjectImplementation(obj,fileName,options); } - ReaderWriter::WriteResult writeObjectImplementation(const osg::Object& obj, const std::string& fileName); + ReaderWriter::WriteResult writeObjectImplementation(const osg::Object& obj, const std::string& fileName,const ReaderWriter::Options* options); - ReaderWriter::WriteResult writeImage(const osg::Image& obj, const std::string& fileName) + ReaderWriter::WriteResult writeImage(const osg::Image& obj, const std::string& fileName,const ReaderWriter::Options* options) { - if (_writeFileCallback.valid()) return _writeFileCallback->writeImage(obj,fileName); - else return writeImageImplementation(obj,fileName); + if (_writeFileCallback.valid()) return _writeFileCallback->writeImage(obj,fileName,options); + else return writeImageImplementation(obj,fileName,options); } - ReaderWriter::WriteResult writeImageImplementation(const osg::Image& obj, const std::string& fileName); + ReaderWriter::WriteResult writeImageImplementation(const osg::Image& obj, const std::string& fileName,const ReaderWriter::Options* options); - ReaderWriter::WriteResult writeHeightField(const osg::HeightField& obj, const std::string& fileName) + ReaderWriter::WriteResult writeHeightField(const osg::HeightField& obj, const std::string& fileName,const ReaderWriter::Options* options) { - if (_writeFileCallback.valid()) return _writeFileCallback->writeHeightField(obj,fileName); - else return writeHeightFieldImplementation(obj,fileName); + if (_writeFileCallback.valid()) return _writeFileCallback->writeHeightField(obj,fileName,options); + else return writeHeightFieldImplementation(obj,fileName,options); } - ReaderWriter::WriteResult writeHeightFieldImplementation(const osg::HeightField& obj, const std::string& fileName); + ReaderWriter::WriteResult writeHeightFieldImplementation(const osg::HeightField& obj, const std::string& fileName,const ReaderWriter::Options* options); - ReaderWriter::WriteResult writeNode(const osg::Node& node, const std::string& fileName) + ReaderWriter::WriteResult writeNode(const osg::Node& node, const std::string& fileName,const ReaderWriter::Options* options) { - if (_writeFileCallback.valid()) return _writeFileCallback->writeNode(node,fileName); - else return writeNodeImplementation(node,fileName); + if (_writeFileCallback.valid()) return _writeFileCallback->writeNode(node,fileName,options); + else return writeNodeImplementation(node,fileName,options); } - ReaderWriter::WriteResult writeNodeImplementation(const osg::Node& node, const std::string& fileName); + ReaderWriter::WriteResult writeNodeImplementation(const osg::Node& node, const std::string& fileName,const ReaderWriter::Options* options); diff --git a/include/osgDB/WriteFile b/include/osgDB/WriteFile index 1c9a22069..3823e7a8c 100644 --- a/include/osgDB/WriteFile +++ b/include/osgDB/WriteFile @@ -19,6 +19,7 @@ #include #include +#include #include @@ -27,11 +28,31 @@ namespace osgDB { /** Write an osg::Object to file. * Return true on success, * return false on failure. + * Use the Options object to control cache operations and file search paths in osgDB::Registry. * The osgDB::Registry is used to load the appropriate ReaderWriter plugin * for the filename extension, and this plugin then handles the request * to write the specified file.*/ +extern OSGDB_EXPORT bool writeObjectFile(const osg::Object& object, const std::string& filename, const ReaderWriter::Options* options ); -extern OSGDB_EXPORT bool writeObjectFile(const osg::Object& object, const std::string& filename); +/** Write an osg::Object to file. + * Return true on success, + * return false on failure. + * The osgDB::Registry is used to load the appropriate ReaderWriter plugin + * for the filename extension, and this plugin then handles the request + * to write the specified file.*/ +inline bool writeObjectFile(const osg::Object& object, const std::string& filename) +{ + return writeObjectFile( object, filename, Registry::instance()->getOptions() ); +} + +/** Write an osg::Image to file. + * Return true on success, + * return false on failure. + * Use the Options object to control cache operations and file search paths in osgDB::Registry. + * The osgDB::Registry is used to load the appropriate ReaderWriter plugin + * for the filename extension, and this plugin then handles the request + * to write the specified file.*/ +extern OSGDB_EXPORT bool writeImageFile(const osg::Image& image, const std::string& filename, const ReaderWriter::Options* options ); /** Write an osg::Image to file. * Return true on success, @@ -39,7 +60,19 @@ extern OSGDB_EXPORT bool writeObjectFile(const osg::Object& object, const std::s * The osgDB::Registry is used to load the appropriate ReaderWriter plugin * for the filename extension, and this plugin then handles the request * to write the specified file.*/ -extern OSGDB_EXPORT bool writeImageFile(const osg::Image& image, const std::string& filename); +inline bool writeImageFile(const osg::Image& image, const std::string& filename) +{ + return writeImageFile( image, filename, Registry::instance()->getOptions() ); +} + +/** Write an osg::HeightField to file. + * Return true on success, + * return false on failure. + * Use the Options object to control cache operations and file search paths in osgDB::Registry. + * The osgDB::Registry is used to load the appropriate ReaderWriter plugin + * for the filename extension, and this plugin then handles the request + * to write the specified file.*/ +extern OSGDB_EXPORT bool writeHeightFieldFile(const osg::HeightField& hf, const std::string& filename, const ReaderWriter::Options* options ); /** Write an osg::HeightField to file. * Return true on success, @@ -47,7 +80,19 @@ extern OSGDB_EXPORT bool writeImageFile(const osg::Image& image, const std::stri * The osgDB::Registry is used to load the appropriate ReaderWriter plugin * for the filename extension, and this plugin then handles the request * to write the specified file.*/ -extern OSGDB_EXPORT bool writeHeightFieldFile(const osg::HeightField& hf, const std::string& filename); +inline bool writeHeightFieldFile(const osg::HeightField& hf, const std::string& filename) +{ + return writeHeightFieldFile( hf, filename, Registry::instance()->getOptions() ); +} + +/** Write an osg::Node to file. + * Return true on success, + * return false on failure. + * Use the Options object to control cache operations and file search paths in osgDB::Registry. + * The osgDB::Registry is used to load the appropriate ReaderWriter plugin + * for the filename extension, and this plugin then handles the request + * to write the specified file.*/ +extern OSGDB_EXPORT bool writeNodeFile(const osg::Node& node, const std::string& filename, const ReaderWriter::Options* options ); /** Write an osg::Node to file. * Return true on success, @@ -55,8 +100,10 @@ extern OSGDB_EXPORT bool writeHeightFieldFile(const osg::HeightField& hf, const * The osgDB::Registry is used to load the appropriate ReaderWriter plugin * for the filename extension, and this plugin then handles the request * to write the specified file.*/ -extern OSGDB_EXPORT bool writeNodeFile(const osg::Node& node, const std::string& filename); - +inline bool writeNodeFile(const osg::Node& node, const std::string& filename) +{ + return writeNodeFile( node, filename, Registry::instance()->getOptions() ); +} } diff --git a/src/osgDB/Registry.cpp b/src/osgDB/Registry.cpp index bfb8e6a96..1d0b0a668 100644 --- a/src/osgDB/Registry.cpp +++ b/src/osgDB/Registry.cpp @@ -1586,7 +1586,7 @@ ReaderWriter::ReadResult Registry::readObjectImplementation(const std::string& f options ? (options->getObjectCacheHint()&ReaderWriter::Options::CACHE_OBJECTS)!=0: false); } -ReaderWriter::WriteResult Registry::writeObjectImplementation(const Object& obj,const std::string& fileName) +ReaderWriter::WriteResult Registry::writeObjectImplementation(const Object& obj,const std::string& fileName,const ReaderWriter::Options* options) { // record the errors reported by readerwriters. typedef std::vector Results; @@ -1596,7 +1596,7 @@ ReaderWriter::WriteResult Registry::writeObjectImplementation(const Object& obj, AvailableReaderWriterIterator itr(_rwList); for(;itr.valid();++itr) { - ReaderWriter::WriteResult rr = itr->writeObject(obj,fileName,_options.get()); + ReaderWriter::WriteResult rr = itr->writeObject(obj,fileName,options); if (rr.success()) return rr; else results.push_back(rr); } @@ -1607,7 +1607,7 @@ ReaderWriter::WriteResult Registry::writeObjectImplementation(const Object& obj, { for(;itr.valid();++itr) { - ReaderWriter::WriteResult rr = itr->writeObject(obj,fileName,_options.get()); + ReaderWriter::WriteResult rr = itr->writeObject(obj,fileName,options); if (rr.success()) return rr; else results.push_back(rr); } @@ -1639,7 +1639,7 @@ ReaderWriter::ReadResult Registry::readImageImplementation(const std::string& fi options ? (options->getObjectCacheHint()&ReaderWriter::Options::CACHE_IMAGES)!=0: false); } -ReaderWriter::WriteResult Registry::writeImageImplementation(const Image& image,const std::string& fileName) +ReaderWriter::WriteResult Registry::writeImageImplementation(const Image& image,const std::string& fileName,const ReaderWriter::Options* options) { // record the errors reported by readerwriters. typedef std::vector Results; @@ -1649,7 +1649,7 @@ ReaderWriter::WriteResult Registry::writeImageImplementation(const Image& image, AvailableReaderWriterIterator itr(_rwList); for(;itr.valid();++itr) { - ReaderWriter::WriteResult rr = itr->writeImage(image,fileName,_options.get()); + ReaderWriter::WriteResult rr = itr->writeImage(image,fileName,options); if (rr.success()) return rr; else results.push_back(rr); } @@ -1662,7 +1662,7 @@ ReaderWriter::WriteResult Registry::writeImageImplementation(const Image& image, { for(;itr.valid();++itr) { - ReaderWriter::WriteResult rr = itr->writeImage(image,fileName,_options.get()); + ReaderWriter::WriteResult rr = itr->writeImage(image,fileName,options); if (rr.success()) return rr; else results.push_back(rr); } @@ -1693,7 +1693,7 @@ ReaderWriter::ReadResult Registry::readHeightFieldImplementation(const std::stri options ? (options->getObjectCacheHint()&ReaderWriter::Options::CACHE_HEIGHTFIELDS)!=0: false); } -ReaderWriter::WriteResult Registry::writeHeightFieldImplementation(const HeightField& HeightField,const std::string& fileName) +ReaderWriter::WriteResult Registry::writeHeightFieldImplementation(const HeightField& HeightField,const std::string& fileName,const ReaderWriter::Options* options) { // record the errors reported by readerwriters. typedef std::vector Results; @@ -1703,7 +1703,7 @@ ReaderWriter::WriteResult Registry::writeHeightFieldImplementation(const HeightF AvailableReaderWriterIterator itr(_rwList); for(;itr.valid();++itr) { - ReaderWriter::WriteResult rr = itr->writeHeightField(HeightField,fileName,_options.get()); + ReaderWriter::WriteResult rr = itr->writeHeightField(HeightField,fileName,options); if (rr.success()) return rr; else results.push_back(rr); } @@ -1716,7 +1716,7 @@ ReaderWriter::WriteResult Registry::writeHeightFieldImplementation(const HeightF { for(;itr.valid();++itr) { - ReaderWriter::WriteResult rr = itr->writeHeightField(HeightField,fileName,_options.get()); + ReaderWriter::WriteResult rr = itr->writeHeightField(HeightField,fileName,options); if (rr.success()) return rr; else results.push_back(rr); } @@ -1747,7 +1747,7 @@ ReaderWriter::ReadResult Registry::readNodeImplementation(const std::string& fil options ? (options->getObjectCacheHint()&ReaderWriter::Options::CACHE_NODES)!=0: false); } -ReaderWriter::WriteResult Registry::writeNodeImplementation(const Node& node,const std::string& fileName) +ReaderWriter::WriteResult Registry::writeNodeImplementation(const Node& node,const std::string& fileName,const ReaderWriter::Options* options) { // record the errors reported by readerwriters. typedef std::vector Results; @@ -1757,7 +1757,7 @@ ReaderWriter::WriteResult Registry::writeNodeImplementation(const Node& node,con AvailableReaderWriterIterator itr(_rwList); for(;itr.valid();++itr) { - ReaderWriter::WriteResult rr = itr->writeNode(node,fileName,_options.get()); + ReaderWriter::WriteResult rr = itr->writeNode(node,fileName,options); if (rr.success()) return rr; else results.push_back(rr); } @@ -1772,7 +1772,7 @@ ReaderWriter::WriteResult Registry::writeNodeImplementation(const Node& node,con { for(;itr.valid();++itr) { - ReaderWriter::WriteResult rr = itr->writeNode(node,fileName,_options.get()); + ReaderWriter::WriteResult rr = itr->writeNode(node,fileName,options); if (rr.success()) return rr; else results.push_back(rr); diff --git a/src/osgDB/WriteFile.cpp b/src/osgDB/WriteFile.cpp index 154777032..0417997d3 100644 --- a/src/osgDB/WriteFile.cpp +++ b/src/osgDB/WriteFile.cpp @@ -24,32 +24,32 @@ using namespace osg; using namespace osgDB; -bool osgDB::writeObjectFile(const Object& object,const std::string& filename) +bool osgDB::writeObjectFile(const Object& object,const std::string& filename, const ReaderWriter::Options* options ) { - ReaderWriter::WriteResult wr = Registry::instance()->writeObject(object,filename); + ReaderWriter::WriteResult wr = Registry::instance()->writeObject( object, filename, options ); if (wr.error()) notify(WARN) << "Error writing file " << filename << ": " << wr.message() << std::endl; return wr.success(); } -bool osgDB::writeImageFile(const Image& image,const std::string& filename) +bool osgDB::writeImageFile(const Image& image,const std::string& filename, const ReaderWriter::Options* options ) { - ReaderWriter::WriteResult wr = Registry::instance()->writeImage(image,filename); + ReaderWriter::WriteResult wr = Registry::instance()->writeImage( image, filename, options ); if (wr.error()) notify(WARN) << "Error writing file " << filename << ": " << wr.message() << std::endl; return wr.success(); } -bool osgDB::writeHeightFieldFile(const HeightField& HeightField,const std::string& filename) +bool osgDB::writeHeightFieldFile(const HeightField& HeightField,const std::string& filename, const ReaderWriter::Options* options ) { - ReaderWriter::WriteResult wr = Registry::instance()->writeHeightField(HeightField,filename); + ReaderWriter::WriteResult wr = Registry::instance()->writeHeightField( HeightField, filename, options ); if (wr.error()) notify(WARN) << "Error writing file " << filename << ": " << wr.message() << std::endl; return wr.success(); } -bool osgDB::writeNodeFile(const Node& node,const std::string& filename) +bool osgDB::writeNodeFile(const Node& node,const std::string& filename, const ReaderWriter::Options* options ) { - ReaderWriter::WriteResult wr = Registry::instance()->writeNode(node,filename); + ReaderWriter::WriteResult wr = Registry::instance()->writeNode( node, filename, options ); if (wr.error()) notify(WARN) << "Error writing file " << filename << ": " << wr.message() << std::endl; return wr.success(); }