|
本帖最后由 xiacanni 于 2015-5-8 09:57 编辑
【2015.5.8补充】
问题已经解决了。因为不认真,函数参数写错了。(这样osg就找不到了相应的函数了。)
应该写成:(file是引用类型)
virtual ReadResult readNode(const std::string& file,
const osgDB::ReaderWriter::Options* options) const
我却写成了:(漏掉了file的引用)
virtual ReadResult readNode(const std::string file,
const osgDB::ReaderWriter::Options* options) const
我按照《OpenSceneGraph三维渲染引擎设计与实践》上的例子,设计plugin。
上面说,要把代码编译成dll才能使用。但是我编译之后,不能使用,我不知道是哪里不对。
我的方法如下。
1.首先使用vs2012,创建一个空的dll工程。
2.然后建立一个main.cpp文件,把书上的代码写进去。
设置好工程的Include Directories和Library Directories的位置,保证程序能够编译。
代码如下(为了方便,相比书上的代码,加入了pragma comment几句)
- #ifdef _DEBUG
- #pragma comment(lib,"osgd.lib")
- #pragma comment(lib,"osgDBd.lib")
- #else
- #pragma comment(lib,"osg.lib")
- #pragma comment(lib,"osgDB.lib")
- #endif
- #include <osg/ShapeDrawable>
- #include <osg/Geode>
- #include <osgDB/FileNameUtils>
- #include <osgDB/FileUtils>
- #include <osgDB/Registry>
- class ReaderWriterSimple : public osgDB::ReaderWriter
- {
- public:
- ReaderWriterSimple()
- {
- supportsExtension("simple","Simple box format");
- }
- virtual const char* className() const
- {
- return "Simple Reader";
- }
- virtual ReadResult readNode(std::istream& stream,
- const osgDB::ReaderWriter::Options* )const
- {
- ReadResult rr = buildBoxes(stream);
- return rr;
- }
- virtual ReadResult readNode(const std::string file,
- const osgDB::ReaderWriter::Options* options) const
- {
- std::string ext = osgDB::getLowerCaseFileExtension(file);
- if(!acceptsExtension(ext))
- return ReadResult::FILE_NOT_HANDLED;
- std::string fileName = osgDB::findDataFile(file,options);
- if (fileName.empty() ) return ReadResult::FILE_NOT_FOUND;
- std::ifstream stream(fileName.c_str(),std::ios::in|std::ios::binary);
- if(!stream) return ReadResult::ERROR_IN_READING_FILE;
- return readNode(stream,options);
- }
- protected:
- osg::Geode* buildBoxes( std::istream& stream ) const
- {
- osg::ref_ptr<osg::Geode> geode = new osg::Geode;
- osgDB::Input fr;
- fr.attach( &stream );
- while ( !fr.eof() )
- {
- if (fr.matchSequence("%f%f%f%f"))
- {
- osg::Vec3 center;
- float width = 0.0;
- fr.readSequence(center);
- fr.readSequence(width);
- geode->addDrawable(new osg::ShapeDrawable(new osg::Box(center,width)));
- }
- else ++fr;
- }
- return geode.release();
- }
- };
- REGISTER_OSGPLUGIN(simple,ReaderWriterSimple)
复制代码
3.编译程序,生成了两个dll。将他们改名为osgdb_simple.dll和osgdb_simpled.dll,放置到osg的plugin文件夹下。
然后打开命令行,使用osgviewr打开文件。
osgviewer 说 No Data Loaded.
我还试了一下,如果没有把osgdb_simple.dll放过去的话。osgviewer会说“Warning: Could not find plugin to read objects from file "test.simple".”
现在不说这个,说明osgdb_simple.dll还是起了效果。但是不明白为什么会说No Data Loaded。
(如果test.simple文件不存在的话,会说No Data Loaded。但文件显然是存在的,不是这个问题。)
另外,我原来写过一些dll。
那时候都要加上__declspec(dllexport)。但是这个似乎不用(书上的教程,和osg源码里的plugins都没有加这个)。
我不懂为什么,知道的人可以告诉我。 |
|