From e5a16de7d4fac82e791d610f7b802a26ae806577 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Fri, 3 Feb 2012 11:10:17 +0000 Subject: [PATCH] Improved handling of archives --- include/osgDB/Registry | 2 ++ src/osgDB/Registry.cpp | 23 ++++++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/include/osgDB/Registry b/include/osgDB/Registry index 1215d814e..a38f5c644 100644 --- a/include/osgDB/Registry +++ b/include/osgDB/Registry @@ -548,6 +548,8 @@ class OSGDB_EXPORT Registry : public osg::Referenced virtual bool isValid(ReaderWriter::ReadResult& readResult) const = 0; virtual bool isValid(osg::Object* object) const = 0; + virtual ReadFunctor* cloneType(const std::string& filename, const Options* options) const = 0; + std::string _filename; const Options* _options; }; diff --git a/src/osgDB/Registry.cpp b/src/osgDB/Registry.cpp index b94c20396..cd73db561 100644 --- a/src/osgDB/Registry.cpp +++ b/src/osgDB/Registry.cpp @@ -33,6 +33,7 @@ #include #include +#include #include @@ -251,6 +252,7 @@ Registry::Registry() // add default osga archive extension _archiveExtList.push_back("osga"); + _archiveExtList.push_back("zip"); initFilePathLists(); @@ -899,6 +901,8 @@ struct Registry::ReadObjectFunctor : public Registry::ReadFunctor virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw) const { return rw.readObject(_filename, _options); } virtual bool isValid(ReaderWriter::ReadResult& readResult) const { return readResult.validObject(); } virtual bool isValid(osg::Object* object) const { return object!=0; } + + virtual ReadFunctor* cloneType(const std::string& filename, const Options* options) const { return new ReadObjectFunctor(filename, options); } }; struct Registry::ReadImageFunctor : public Registry::ReadFunctor @@ -908,6 +912,8 @@ struct Registry::ReadImageFunctor : public Registry::ReadFunctor virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw)const { return rw.readImage(_filename, _options); } virtual bool isValid(ReaderWriter::ReadResult& readResult) const { return readResult.validImage(); } virtual bool isValid(osg::Object* object) const { return dynamic_cast(object)!=0; } + + virtual ReadFunctor* cloneType(const std::string& filename, const Options* options) const { return new ReadImageFunctor(filename, options); } }; struct Registry::ReadHeightFieldFunctor : public Registry::ReadFunctor @@ -917,6 +923,8 @@ struct Registry::ReadHeightFieldFunctor : public Registry::ReadFunctor virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw) const { return rw.readHeightField(_filename, _options); } virtual bool isValid(ReaderWriter::ReadResult& readResult) const { return readResult.validHeightField(); } virtual bool isValid(osg::Object* object) const { return dynamic_cast(object)!=0; } + + virtual ReadFunctor* cloneType(const std::string& filename, const Options* options) const { return new ReadHeightFieldFunctor(filename, options); } }; struct Registry::ReadNodeFunctor : public Registry::ReadFunctor @@ -927,6 +935,7 @@ struct Registry::ReadNodeFunctor : public Registry::ReadFunctor virtual bool isValid(ReaderWriter::ReadResult& readResult) const { return readResult.validNode(); } virtual bool isValid(osg::Object* object) const { return dynamic_cast(object)!=0; } + virtual ReadFunctor* cloneType(const std::string& filename, const Options* options) const { return new ReadNodeFunctor(filename, options); } }; struct Registry::ReadArchiveFunctor : public Registry::ReadFunctor @@ -943,6 +952,7 @@ struct Registry::ReadArchiveFunctor : public Registry::ReadFunctor virtual bool isValid(ReaderWriter::ReadResult& readResult) const { return readResult.validArchive(); } virtual bool isValid(osg::Object* object) const { return dynamic_cast(object)!=0; } + virtual ReadFunctor* cloneType(const std::string& filename, const Options* options) const { return new ReadArchiveFunctor(filename, _status, _indexBlockSizeHint, options); } }; struct Registry::ReadShaderFunctor : public Registry::ReadFunctor @@ -952,6 +962,8 @@ struct Registry::ReadShaderFunctor : public Registry::ReadFunctor virtual ReaderWriter::ReadResult doRead(ReaderWriter& rw)const { return rw.readShader(_filename, _options); } virtual bool isValid(ReaderWriter::ReadResult& readResult) const { return readResult.validShader(); } virtual bool isValid(osg::Object* object) const { return dynamic_cast(object)!=0; } + + virtual ReadFunctor* cloneType(const std::string& filename, const Options* options) const { return new ReadShaderFunctor(filename, options); } }; void Registry::addArchiveExtension(const std::string ext) @@ -1088,7 +1100,16 @@ ReaderWriter::ReadResult Registry::read(const ReadFunctor& readFunctor) options->setDatabasePath(archiveName); - return archive->readObject(fileName,options.get()); + std::auto_ptr rf(readFunctor.cloneType(fileName, options)); + + result = rf->doRead(*archive); + + if (rf->isValid(result)) + { + OSG_INFO<<"Read object from archive"<