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"
This commit is contained in:
@@ -39,6 +39,7 @@ class ReaderWriterInfo : public osg::Referenced
|
||||
ReaderWriter::FormatDescriptionMap protocols;
|
||||
ReaderWriter::FormatDescriptionMap extensions;
|
||||
ReaderWriter::FormatDescriptionMap options;
|
||||
ReaderWriter::Features features;
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
@@ -48,6 +48,7 @@ class OSGDB_EXPORT ReaderWriter : public osg::Object
|
||||
META_Object(osgDB,ReaderWriter);
|
||||
|
||||
typedef std::map<std::string, std::string> FormatDescriptionMap;
|
||||
typedef std::list<std::string> 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
|
||||
{
|
||||
|
||||
@@ -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 : "<<info.description<<std::endl;
|
||||
out<<" {"<<std::endl;
|
||||
|
||||
out<<" features : ";
|
||||
osgDB::ReaderWriter::FeatureList fl = ReaderWriter::featureAsString(info.features);
|
||||
osgDB::ReaderWriter::FeatureList::iterator fl_itr;
|
||||
for(fl_itr = fl.begin();
|
||||
fl_itr != fl.end();
|
||||
++fl_itr)
|
||||
{
|
||||
out << *fl_itr << " ";
|
||||
}
|
||||
out << std::endl;
|
||||
|
||||
unsigned int longestOptionLength = 0;
|
||||
osgDB::ReaderWriter::FormatDescriptionMap::iterator fdm_itr;
|
||||
for(fdm_itr = info.protocols.begin();
|
||||
|
||||
@@ -60,3 +60,40 @@ void ReaderWriter::supportsOption(const std::string& fmt, const std::string& des
|
||||
{
|
||||
_supportedOptions[fmt] = description;
|
||||
}
|
||||
|
||||
ReaderWriter::Features ReaderWriter::supportedFeatures() const
|
||||
{
|
||||
Features features = FEATURE_ALL;
|
||||
return features;
|
||||
}
|
||||
|
||||
ReaderWriter::FeatureList ReaderWriter::featureAsString(ReaderWriter::Features feature)
|
||||
{
|
||||
typedef struct {
|
||||
ReaderWriter::Features feature;
|
||||
const char *s;
|
||||
} FeatureStringList;
|
||||
|
||||
FeatureStringList list[] = {
|
||||
{ FEATURE_READ_OBJECT, "readObject" },
|
||||
{ FEATURE_READ_IMAGE, "readImage" },
|
||||
{ FEATURE_READ_HEIGHT_FIELD, "readHeightField" },
|
||||
{ FEATURE_READ_NODE, "readNode" },
|
||||
{ FEATURE_READ_SHADER, "readShader" },
|
||||
{ FEATURE_WRITE_OBJECT, "writeObject" },
|
||||
{ FEATURE_WRITE_IMAGE, "writeImage" },
|
||||
{ FEATURE_WRITE_HEIGHT_FIELD, "writeHeightField" },
|
||||
{ FEATURE_WRITE_NODE, "writeNode" },
|
||||
{ FEATURE_WRITE_SHADER, "writeShader" },
|
||||
{ FEATURE_NONE,0 }
|
||||
};
|
||||
|
||||
FeatureList result;
|
||||
|
||||
for(FeatureStringList *p=list; p->feature != 0; p++)
|
||||
{
|
||||
if ((feature & p->feature) != 0)
|
||||
result.push_back(p->s);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user