osgDB.RegisterReaderWriterProxy函数用于注册自定义的osgDB::ReaderWriter对象。
void osgDB::RegisterReaderWriterProxy(osgDB::ReaderWriter* rw);
rw
: 要注册的osgDB::ReaderWriter对象。无。
#include <osgDB/ReadFile>
#include <osgDB/Registry>
#include <osgDB/ReaderWriter>
#include <osgDB/FileNameUtils>
class MyReaderWriter : public osgDB::ReaderWriter
{
public:
MyReaderWriter()
{
supportsExtension("myext", "My extension reader/writer");
}
virtual const char* className() const
{
return "MyReaderWriter";
}
virtual bool acceptsExtension(const std::string& extension) const
{
return osgDB::equalCaseInsensitive(extension, "myext");
}
virtual ReadResult readNode(const std::string& file,
const Options* options) const
{
// 读取myext格式的文件,并返回osg::Node对象
return ReadResult(new osg::Node);
}
virtual WriteResult writeNode(const osg::Node& node,
const std::string& file,
const Options* options) const
{
// 写入myext格式的文件,并返回成功标志
return WriteResult::FILE_SAVED;
}
};
int main()
{
osgDB::Registry::instance()->loadLibrary("osgdb_myext.so");
osgDB::RegisterReaderWriterProxy(new MyReaderWriter);
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("myModel.myext");
if (node.valid())
osgDB::writeNodeFile(*node, "myModel.myext", new osgDB::Options);
}
osgDB::RegisterReaderWriterProxy必须在osgDB::Registry::instance()被调用之后,对于动态加载的插件库,需要先通过osdDB::Registry::instance()->loadLibrary函数加载插件,再注册对应的ReaderWriter。
如果要注册多个自定义的ReaderWriter,可以多次调用osgDB::RegisterReaderWriterProxy函数,注意不要重复注册同一个ReaderWriter对象。
自定义的ReaderWriter所支持的扩展名应使用osgDB::ReaderWriter::supportsExtension函数在构造函数中进行注册。