From 287ff37b349e3e630b78a21fa6289f7c61b7830b Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 10 Mar 2009 15:00:39 +0000 Subject: [PATCH] From Ralf Habacker, "The appended patch fixes this issue by adding a virtual method named supportedFeatures() to the class ReaderWriter, which could be overriden by a specific plugin to adjust the set of features. Single features are implemented as bits asother enums in ReaderWriter class already does, so that combinations are possible and fast comparison operations are possible By default all features are enabled. I have added this virtual method to the dot plugin to get an idea how to use these features. With this patch osgconv --formats shows an additional line 'features' for each plugin" --- include/osgDB/PluginQuery | 1 + include/osgDB/ReaderWriter | 32 ++++++++++++++++++++++++++++++++ src/osgDB/PluginQuery.cpp | 13 ++++++++++++- src/osgDB/ReaderWriter.cpp | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 82 insertions(+), 1 deletion(-) diff --git a/include/osgDB/PluginQuery b/include/osgDB/PluginQuery index e144c83b0..1a392f56d 100644 --- a/include/osgDB/PluginQuery +++ b/include/osgDB/PluginQuery @@ -39,6 +39,7 @@ class ReaderWriterInfo : public osg::Referenced ReaderWriter::FormatDescriptionMap protocols; ReaderWriter::FormatDescriptionMap extensions; ReaderWriter::FormatDescriptionMap options; + ReaderWriter::Features features; protected: diff --git a/include/osgDB/ReaderWriter b/include/osgDB/ReaderWriter index 237d74298..e638ddc95 100644 --- a/include/osgDB/ReaderWriter +++ b/include/osgDB/ReaderWriter @@ -48,6 +48,7 @@ class OSGDB_EXPORT ReaderWriter : public osg::Object META_Object(osgDB,ReaderWriter); typedef std::map FormatDescriptionMap; + typedef std::list FeatureList; /** return which protocols are supported by ReaderWriter. */ virtual const FormatDescriptionMap& supportedProtocols() const { return _supportedProtocols; } @@ -61,6 +62,37 @@ class OSGDB_EXPORT ReaderWriter : public osg::Object /** return true if ReaderWriter accepts specified file extension.*/ virtual bool acceptsExtension(const std::string& /*extension*/) const; + /// bit mask for setting up which feature types are available for read and/or write + enum Features + { + FEATURE_NONE = 0, + FEATURE_READ_OBJECT = 1<<0, + FEATURE_READ_IMAGE = 1<<1, + FEATURE_READ_HEIGHT_FIELD = 1<<2, + FEATURE_READ_NODE = 1<<3, + FEATURE_READ_SHADER = 1<<4, + FEATURE_WRITE_OBJECT = 1<<5, + FEATURE_WRITE_IMAGE = 1<<6, + FEATURE_WRITE_HEIGHT_FIELD = 1<<7, + FEATURE_WRITE_NODE = 1<<8, + FEATURE_WRITE_SHADER = 1<<9, + FEATURE_ALL = FEATURE_READ_OBJECT | + FEATURE_READ_IMAGE | + FEATURE_READ_HEIGHT_FIELD | + FEATURE_READ_NODE | + FEATURE_READ_SHADER | + FEATURE_WRITE_OBJECT | + FEATURE_WRITE_IMAGE | + FEATURE_WRITE_HEIGHT_FIELD | + FEATURE_WRITE_NODE | + FEATURE_WRITE_SHADER + }; + /** return available features*/ + virtual Features supportedFeatures() const; + + /** return feature as string */ + static FeatureList featureAsString(Features feature); + /** Options base class used for passing options into plugins to control their operation.*/ class Options : public osg::Object { diff --git a/src/osgDB/PluginQuery.cpp b/src/osgDB/PluginQuery.cpp index becaff0a7..e13d1b16c 100644 --- a/src/osgDB/PluginQuery.cpp +++ b/src/osgDB/PluginQuery.cpp @@ -80,6 +80,7 @@ bool osgDB::queryPlugin(const std::string& fileName, ReaderWriterInfoList& infoL rwi->protocols = rw->supportedProtocols(); rwi->extensions = rw->supportedExtensions(); rwi->options = rw->supportedOptions(); + rwi->features = rw->supportedFeatures(); infoList.push_back(rwi.get()); } @@ -116,7 +117,17 @@ bool osgDB::outputPluginDetails(std::ostream& out, const std::string& fileName) osgDB::ReaderWriterInfo& info = *(*rwi_itr); out<<" ReaderWriter : "<feature != 0; p++) + { + if ((feature & p->feature) != 0) + result.push_back(p->s); + } + return result; +}