- 读取文件进度
由上一节可简单知道其文件加载流程,所有的文件都会转成点集,通过注册的关键字,分别调用不同的解析器,既自定义的readerwriter,若想进一步修改,可以在读取文件时设置回调。
class MyReadFileCallback :public osgDB::Registry::ReadFileCallback
{
public:
virtual osgDB::ReaderWriter::ReadResult readNode(const std::string&filename, const osgDB::Options* options)
{
//第一步获取不同文件的readerWriter
std::string ext = osgDB::getLowerCaseFileExtension(filename);
osgDB::ReaderWriter *rw = osgDB::Registry::instance()->getReaderWriterForExtension(ext);
if (rw!=nullptr)
{
return rw->readNode(filename, options);//将其readNode分开,将其流部分进行
//重写其中的readNode(std::string,osd::options);文件读取部分
}
}
};
int main()
{
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
osgDB::Registry::instance()->setReadFileCallback(new MyReadFileCallback);
viewer->setSceneData(osgDB::readNodeFile("test.ttt"));
return viewer->run();
}
继承 osgDB::Registry::ReadFileCallback,重写其中的readNode,其实和自定义的继承readerwriter一样,通过osgDB::Registry::instance()->getReaderWriterForExtension获取不同文件类型的读写器,模型读写分为两部分,一是文件,二是流,其中费时最大的为读文件,所以若需要进度条,只需要在readNode(std::string,osgdb::options)中对文件流的读取监控即可,底层使用的是ifstream;
然后把读取的流给到readnode(std::istream& fin, const Options* options)进行解析以及渲染,返回osgDB::ReaderWriter::ReadResult,osg::node的子类。