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; +}