diff --git a/include/osgDB/ReaderWriter b/include/osgDB/ReaderWriter index e638ddc95..698d14471 100644 --- a/include/osgDB/ReaderWriter +++ b/include/osgDB/ReaderWriter @@ -235,6 +235,7 @@ class OSGDB_EXPORT ReaderWriter : public osg::Object enum ReadStatus { + NOT_IMPLEMENTED, //!< raad*() method not implemented in concreate ReaderWriter. FILE_NOT_HANDLED, //!< File is not appropriate for this file reader, due to some incompatibility, but *not* a read error. FILE_NOT_FOUND, //!< File could not be found or could not be read. FILE_LOADED, //!< File successfully found, loaded, and converted into osg. @@ -278,7 +279,7 @@ class OSGDB_EXPORT ReaderWriter : public osg::Object bool success() const { return _status==FILE_LOADED || _status==FILE_LOADED_FROM_CACHE ; } bool loadedFromCache() const { return _status==FILE_LOADED_FROM_CACHE; } bool error() const { return _status==ERROR_IN_READING_FILE; } - bool notHandled() const { return _status==FILE_NOT_HANDLED; } + bool notHandled() const { return _status==FILE_NOT_HANDLED || _status==NOT_IMPLEMENTED; } bool notFound() const { return _status==FILE_NOT_FOUND; } protected: @@ -295,6 +296,7 @@ class OSGDB_EXPORT ReaderWriter : public osg::Object enum WriteStatus { + NOT_IMPLEMENTED, //!< write*() method not implemented in concreate ReaderWriter. FILE_NOT_HANDLED, FILE_SAVED, ERROR_IN_WRITING_FILE @@ -312,7 +314,7 @@ class OSGDB_EXPORT ReaderWriter : public osg::Object WriteStatus status() const { return _status; } bool success() const { return _status==FILE_SAVED; } bool error() const { return _status==ERROR_IN_WRITING_FILE; } - bool notHandled() const { return _status==FILE_NOT_HANDLED; } + bool notHandled() const { return _status==FILE_NOT_HANDLED || _status==NOT_IMPLEMENTED; } protected: @@ -328,34 +330,34 @@ class OSGDB_EXPORT ReaderWriter : public osg::Object }; /** open an archive for reading, writing, or to create an empty archive for writing to.*/ - virtual ReadResult openArchive(const std::string& /*fileName*/,ArchiveStatus, unsigned int =4096, const Options* =NULL) const { return ReadResult(ReadResult::FILE_NOT_HANDLED); } + virtual ReadResult openArchive(const std::string& /*fileName*/,ArchiveStatus, unsigned int =4096, const Options* =NULL) const { return ReadResult(ReadResult::NOT_IMPLEMENTED); } /** open an archive for reading.*/ - virtual ReadResult openArchive(std::istream& /*fin*/,const Options* =NULL) const { return ReadResult(ReadResult::FILE_NOT_HANDLED); } + virtual ReadResult openArchive(std::istream& /*fin*/,const Options* =NULL) const { return ReadResult(ReadResult::NOT_IMPLEMENTED); } - virtual ReadResult readObject(const std::string& /*fileName*/,const Options* =NULL) const { return ReadResult(ReadResult::FILE_NOT_HANDLED); } - virtual ReadResult readImage(const std::string& /*fileName*/,const Options* =NULL) const { return ReadResult(ReadResult::FILE_NOT_HANDLED); } - virtual ReadResult readHeightField(const std::string& /*fileName*/,const Options* =NULL) const { return ReadResult(ReadResult::FILE_NOT_HANDLED); } - virtual ReadResult readNode(const std::string& /*fileName*/,const Options* =NULL) const { return ReadResult(ReadResult::FILE_NOT_HANDLED); } - virtual ReadResult readShader(const std::string& /*fileName*/,const Options* =NULL) const { return ReadResult(ReadResult::FILE_NOT_HANDLED); } + virtual ReadResult readObject(const std::string& /*fileName*/,const Options* =NULL) const { return ReadResult(ReadResult::NOT_IMPLEMENTED); } + virtual ReadResult readImage(const std::string& /*fileName*/,const Options* =NULL) const { return ReadResult(ReadResult::NOT_IMPLEMENTED); } + virtual ReadResult readHeightField(const std::string& /*fileName*/,const Options* =NULL) const { return ReadResult(ReadResult::NOT_IMPLEMENTED); } + virtual ReadResult readNode(const std::string& /*fileName*/,const Options* =NULL) const { return ReadResult(ReadResult::NOT_IMPLEMENTED); } + virtual ReadResult readShader(const std::string& /*fileName*/,const Options* =NULL) const { return ReadResult(ReadResult::NOT_IMPLEMENTED); } - virtual WriteResult writeObject(const osg::Object& /*obj*/,const std::string& /*fileName*/,const Options* =NULL) const {return WriteResult(WriteResult::FILE_NOT_HANDLED); } - virtual WriteResult writeImage(const osg::Image& /*image*/,const std::string& /*fileName*/,const Options* =NULL) const {return WriteResult(WriteResult::FILE_NOT_HANDLED); } - virtual WriteResult writeHeightField(const osg::HeightField& /*heightField*/,const std::string& /*fileName*/,const Options* =NULL) const {return WriteResult(WriteResult::FILE_NOT_HANDLED); } - virtual WriteResult writeNode(const osg::Node& /*node*/,const std::string& /*fileName*/,const Options* =NULL) const { return WriteResult(WriteResult::FILE_NOT_HANDLED); } - virtual WriteResult writeShader(const osg::Shader& /*shader*/,const std::string& /*fileName*/,const Options* =NULL) const {return WriteResult(WriteResult::FILE_NOT_HANDLED); } + virtual WriteResult writeObject(const osg::Object& /*obj*/,const std::string& /*fileName*/,const Options* =NULL) const {return WriteResult(WriteResult::NOT_IMPLEMENTED); } + virtual WriteResult writeImage(const osg::Image& /*image*/,const std::string& /*fileName*/,const Options* =NULL) const {return WriteResult(WriteResult::NOT_IMPLEMENTED); } + virtual WriteResult writeHeightField(const osg::HeightField& /*heightField*/,const std::string& /*fileName*/,const Options* =NULL) const {return WriteResult(WriteResult::NOT_IMPLEMENTED); } + virtual WriteResult writeNode(const osg::Node& /*node*/,const std::string& /*fileName*/,const Options* =NULL) const { return WriteResult(WriteResult::NOT_IMPLEMENTED); } + virtual WriteResult writeShader(const osg::Shader& /*shader*/,const std::string& /*fileName*/,const Options* =NULL) const {return WriteResult(WriteResult::NOT_IMPLEMENTED); } - virtual ReadResult readObject(std::istream& /*fin*/,const Options* =NULL) const { return ReadResult(ReadResult::FILE_NOT_HANDLED); } - virtual ReadResult readImage(std::istream& /*fin*/,const Options* =NULL) const { return ReadResult(ReadResult::FILE_NOT_HANDLED); } - virtual ReadResult readHeightField(std::istream& /*fin*/,const Options* =NULL) const { return ReadResult(ReadResult::FILE_NOT_HANDLED); } - virtual ReadResult readNode(std::istream& /*fin*/,const Options* =NULL) const { return ReadResult(ReadResult::FILE_NOT_HANDLED); } - virtual ReadResult readShader(std::istream& /*fin*/,const Options* =NULL) const { return ReadResult(ReadResult::FILE_NOT_HANDLED); } + virtual ReadResult readObject(std::istream& /*fin*/,const Options* =NULL) const { return ReadResult(ReadResult::NOT_IMPLEMENTED); } + virtual ReadResult readImage(std::istream& /*fin*/,const Options* =NULL) const { return ReadResult(ReadResult::NOT_IMPLEMENTED); } + virtual ReadResult readHeightField(std::istream& /*fin*/,const Options* =NULL) const { return ReadResult(ReadResult::NOT_IMPLEMENTED); } + virtual ReadResult readNode(std::istream& /*fin*/,const Options* =NULL) const { return ReadResult(ReadResult::NOT_IMPLEMENTED); } + virtual ReadResult readShader(std::istream& /*fin*/,const Options* =NULL) const { return ReadResult(ReadResult::NOT_IMPLEMENTED); } - virtual WriteResult writeObject(const osg::Object& /*obj*/,std::ostream& /*fout*/,const Options* =NULL) const { return WriteResult(WriteResult::FILE_NOT_HANDLED); } - virtual WriteResult writeImage(const osg::Image& /*image*/,std::ostream& /*fout*/,const Options* =NULL) const { return WriteResult(WriteResult::FILE_NOT_HANDLED); } - virtual WriteResult writeHeightField(const osg::HeightField& /*heightField*/,std::ostream& /*fout*/,const Options* =NULL) const { return WriteResult(WriteResult::FILE_NOT_HANDLED); } - virtual WriteResult writeNode(const osg::Node& /*node*/,std::ostream& /*fout*/,const Options* =NULL) const { return WriteResult(WriteResult::FILE_NOT_HANDLED); } - virtual WriteResult writeShader(const osg::Shader& /*shader*/,std::ostream& /*fout*/,const Options* =NULL) const { return WriteResult(WriteResult::FILE_NOT_HANDLED); } + virtual WriteResult writeObject(const osg::Object& /*obj*/,std::ostream& /*fout*/,const Options* =NULL) const { return WriteResult(WriteResult::NOT_IMPLEMENTED); } + virtual WriteResult writeImage(const osg::Image& /*image*/,std::ostream& /*fout*/,const Options* =NULL) const { return WriteResult(WriteResult::NOT_IMPLEMENTED); } + virtual WriteResult writeHeightField(const osg::HeightField& /*heightField*/,std::ostream& /*fout*/,const Options* =NULL) const { return WriteResult(WriteResult::NOT_IMPLEMENTED); } + virtual WriteResult writeNode(const osg::Node& /*node*/,std::ostream& /*fout*/,const Options* =NULL) const { return WriteResult(WriteResult::NOT_IMPLEMENTED); } + virtual WriteResult writeShader(const osg::Shader& /*shader*/,std::ostream& /*fout*/,const Options* =NULL) const { return WriteResult(WriteResult::NOT_IMPLEMENTED); } protected: diff --git a/src/osgDB/ReaderWriter.cpp b/src/osgDB/ReaderWriter.cpp index 57f856fb1..3bc18b1f6 100644 --- a/src/osgDB/ReaderWriter.cpp +++ b/src/osgDB/ReaderWriter.cpp @@ -63,8 +63,27 @@ void ReaderWriter::supportsOption(const std::string& fmt, const std::string& des ReaderWriter::Features ReaderWriter::supportedFeatures() const { - Features features = FEATURE_ALL; - return features; + int features = FEATURE_NONE; + std::string dummyFilename; + + if (readObject(dummyFilename,0).status()!=ReadResult::NOT_IMPLEMENTED) features |= FEATURE_READ_OBJECT; + if (readImage(dummyFilename,0).status()!=ReadResult::NOT_IMPLEMENTED) features |= FEATURE_READ_IMAGE; + if (readHeightField(dummyFilename,0).status()!=ReadResult::NOT_IMPLEMENTED) features |= FEATURE_READ_HEIGHT_FIELD; + if (readShader(dummyFilename,0).status()!=ReadResult::NOT_IMPLEMENTED) features |= FEATURE_READ_SHADER; + if (readNode(dummyFilename,0).status()!=ReadResult::NOT_IMPLEMENTED) features |= FEATURE_READ_NODE; + + osg::ref_ptr image = new osg::Image; + osg::ref_ptr hf = new osg::HeightField; + osg::ref_ptr shader = new osg::Shader; + osg::ref_ptr node = new osg::Node; + + if (writeObject(*image, dummyFilename,0).status()!=WriteResult::NOT_IMPLEMENTED) features |= FEATURE_WRITE_OBJECT; + if (writeImage(*image,dummyFilename,0).status()!=WriteResult::NOT_IMPLEMENTED) features |= FEATURE_WRITE_IMAGE; + if (writeHeightField(*hf,dummyFilename,0).status()!=WriteResult::NOT_IMPLEMENTED) features |= FEATURE_WRITE_HEIGHT_FIELD; + if (writeShader(*shader,dummyFilename,0).status()!=WriteResult::NOT_IMPLEMENTED) features |= FEATURE_WRITE_SHADER; + if (writeNode(*node, dummyFilename,0).status()!=WriteResult::NOT_IMPLEMENTED) features |= FEATURE_WRITE_NODE; + + return Features(features); } ReaderWriter::FeatureList ReaderWriter::featureAsString(ReaderWriter::Features feature) diff --git a/src/osgPlugins/OpenFlight/ReaderWriterFLT.cpp b/src/osgPlugins/OpenFlight/ReaderWriterFLT.cpp index 836b1a4c0..a794cb8d9 100644 --- a/src/osgPlugins/OpenFlight/ReaderWriterFLT.cpp +++ b/src/osgPlugins/OpenFlight/ReaderWriterFLT.cpp @@ -429,9 +429,9 @@ class FLTReaderWriter : public ReaderWriter { if ( fileName.empty() ) { - osg::notify( osg::FATAL ) << "fltexp: writeNode: empty file name" << std::endl; return WriteResult::FILE_NOT_HANDLED; } + std::string ext = osgDB::getLowerCaseFileExtension( fileName ); if ( !acceptsExtension(ext) ) return WriteResult::FILE_NOT_HANDLED; diff --git a/src/osgPlugins/gdal/ReaderWriterGDAL.cpp b/src/osgPlugins/gdal/ReaderWriterGDAL.cpp index 06df53b70..ea1f99b2f 100644 --- a/src/osgPlugins/gdal/ReaderWriterGDAL.cpp +++ b/src/osgPlugins/gdal/ReaderWriterGDAL.cpp @@ -58,6 +58,8 @@ class ReaderWriterGDAL : public osgDB::ReaderWriter virtual ReadResult readObject(const std::string& file, const osgDB::ReaderWriter::Options* options) const { + if (file.empty()) return ReadResult::FILE_NOT_FOUND; + if (osgDB::equalCaseInsensitive(osgDB::getFileExtension(file),"gdal")) { return readObject(osgDB::getNameLessExtension(file),options); @@ -81,6 +83,8 @@ class ReaderWriterGDAL : public osgDB::ReaderWriter virtual ReadResult readImage(const std::string& fileName, const osgDB::ReaderWriter::Options* options) const { + if (fileName.empty()) return ReadResult::FILE_NOT_FOUND; + if (osgDB::equalCaseInsensitive(osgDB::getFileExtension(fileName),"gdal")) { return readImage(osgDB::getNameLessExtension(fileName),options); @@ -92,6 +96,8 @@ class ReaderWriterGDAL : public osgDB::ReaderWriter virtual ReadResult readHeightField(const std::string& fileName, const osgDB::ReaderWriter::Options* options) const { + if (fileName.empty()) return ReadResult::FILE_NOT_FOUND; + if (osgDB::equalCaseInsensitive(osgDB::getFileExtension(fileName),"gdal")) { return readHeightField(osgDB::getNameLessExtension(fileName),options); diff --git a/src/osgPlugins/gecko/ReaderWriterUBrowser.cpp b/src/osgPlugins/gecko/ReaderWriterUBrowser.cpp index dc9bee004..0cf2f5341 100644 --- a/src/osgPlugins/gecko/ReaderWriterUBrowser.cpp +++ b/src/osgPlugins/gecko/ReaderWriterUBrowser.cpp @@ -25,7 +25,7 @@ class ReaderWriterUBrowser : public osgDB::ReaderWriter ReaderWriterUBrowser() { - osg::notify(osg::NOTICE)<<"ReaderWriterUBrowser::ReaderWriterUBrowser()"<setApplication(previousManager->getApplication()); } - osg::notify(osg::NOTICE)<<"ReaderWriterUBrowser::ReaderWriterUBrowser() done"<setDone(true); - - while(_thread->isRunning()) + if (_thread.valid()) { - OpenThreads::Thread::YieldCurrentThread(); - } + _thread->setDone(true); - _thread = 0; + while(_thread->isRunning()) + { + OpenThreads::Thread::YieldCurrentThread(); + } + + _thread = 0; + } } osgWidget::BrowserImage* UBrowserManager::createBrowserImage(const std::string& url, int width, int height) diff --git a/src/osgPlugins/ogr/ReaderWriterOGR.cpp b/src/osgPlugins/ogr/ReaderWriterOGR.cpp index 0fb9084a0..f3d25c589 100644 --- a/src/osgPlugins/ogr/ReaderWriterOGR.cpp +++ b/src/osgPlugins/ogr/ReaderWriterOGR.cpp @@ -109,7 +109,9 @@ public: virtual ReadResult readNode(const std::string& file, const osgDB::ReaderWriter::Options* options) const { - osg::notify(osg::NOTICE)<<"OGR::readNode("<getOptionString() == "separateFiles")) { - osg::notify(osg::INFO) << "ReaderWriterSTL::writeNode: Files are seperated written" << std::endl; + CreateStlVisitor( std::string const & fout, const osgDB::ReaderWriter::Options* options = 0): osg::NodeVisitor( osg::NodeVisitor::TRAVERSE_ACTIVE_CHILDREN ), counter(0), m_fout(fout), m_options(options) + { + if (options && (options->getOptionString() == "separateFiles")) + { + osg::notify(osg::INFO) << "ReaderWriterSTL::writeNode: Files are seperated written" << std::endl; } else { - m_f = new std::ofstream(m_fout.c_str()); - *m_f << "solid " << counter << std::endl; + m_f = new std::ofstream(m_fout.c_str()); + *m_f << "solid " << counter << std::endl; } }; @@ -448,16 +450,20 @@ bool ReaderWriterSTL::ReaderObject::readStlBinary(FILE* fp) return true; } -osgDB::ReaderWriter::WriteResult ReaderWriterSTL::writeNode(const osg::Node& node,const std::string& fout, const Options* opts) const { - std::string ext = osgDB::getLowerCaseFileExtension(fout); - if (ext != "stl" ){ +osgDB::ReaderWriter::WriteResult ReaderWriterSTL::writeNode(const osg::Node& node,const std::string& fileName, const Options* opts) const +{ + if (fileName.empty()) return WriteResult::FILE_NOT_HANDLED; + + std::string ext = osgDB::getLowerCaseFileExtension(fileName); + if (ext != "stl" ) + { // sta - extension implies STL-Binary... - osg::notify(osg::FATAL) << "ReaderWriterSTL::writeNode: Only STL-ASCII-files supported'" << std::endl; + osg::notify(osg::INFO) << "ReaderWriterSTL::writeNode: Only STL-ASCII-files supported'" << std::endl; return WriteResult::FILE_NOT_HANDLED; } try { - CreateStlVisitor createStlVisitor( fout, opts ); + CreateStlVisitor createStlVisitor( fileName, opts ); const_cast(node).accept( createStlVisitor ); } catch(...) { return WriteResult::ERROR_IN_WRITING_FILE; diff --git a/src/osgWidget/Browser.cpp b/src/osgWidget/Browser.cpp index 3e62aba48..338fb1097 100644 --- a/src/osgWidget/Browser.cpp +++ b/src/osgWidget/Browser.cpp @@ -30,12 +30,12 @@ osg::ref_ptr& BrowserManager::instance() BrowserManager::BrowserManager() { - osg::notify(osg::NOTICE)<<"Constructing base BrowserManager"<