查看: 1452|回复: 0

制作自己的plugin失败

[复制链接]

该用户从未签到

发表于 2015-5-7 18:14:45 | 显示全部楼层 |阅读模式
本帖最后由 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工程。
QQ截图20150507174608.png
2.然后建立一个main.cpp文件,把书上的代码写进去。
设置好工程的Include Directories和Library Directories的位置,保证程序能够编译。
代码如下(为了方便,相比书上的代码,加入了pragma comment几句)
  1. #ifdef _DEBUG
  2. #pragma comment(lib,"osgd.lib")
  3. #pragma comment(lib,"osgDBd.lib")
  4. #else
  5. #pragma comment(lib,"osg.lib")
  6. #pragma comment(lib,"osgDB.lib")
  7. #endif

  8. #include <osg/ShapeDrawable>
  9. #include <osg/Geode>
  10. #include <osgDB/FileNameUtils>
  11. #include <osgDB/FileUtils>
  12. #include <osgDB/Registry>

  13. class ReaderWriterSimple : public osgDB::ReaderWriter
  14. {
  15. public:
  16.         ReaderWriterSimple()
  17.         {
  18.                 supportsExtension("simple","Simple box format");
  19.         }

  20.         virtual const char* className() const
  21.         {
  22.                 return "Simple Reader";
  23.         }

  24.         virtual ReadResult readNode(std::istream& stream,
  25.                 const osgDB::ReaderWriter::Options* )const
  26.         {
  27.                 ReadResult rr = buildBoxes(stream);
  28.                 return rr;
  29.         }
  30.         virtual ReadResult readNode(const std::string file,
  31.                 const osgDB::ReaderWriter::Options* options) const
  32.         {
  33.                 std::string ext = osgDB::getLowerCaseFileExtension(file);
  34.                 if(!acceptsExtension(ext))
  35.                         return ReadResult::FILE_NOT_HANDLED;

  36.                 std::string fileName = osgDB::findDataFile(file,options);
  37.                 if (fileName.empty() ) return ReadResult::FILE_NOT_FOUND;

  38.                 std::ifstream stream(fileName.c_str(),std::ios::in|std::ios::binary);
  39.                 if(!stream) return ReadResult::ERROR_IN_READING_FILE;
  40.                 return readNode(stream,options);

  41.         }
  42. protected:
  43.         osg::Geode* buildBoxes( std::istream& stream ) const
  44.         {
  45.                 osg::ref_ptr<osg::Geode> geode = new osg::Geode;
  46.                 osgDB::Input fr;
  47.                 fr.attach( &stream );
  48.                 while ( !fr.eof() )
  49.                 {
  50.                         if (fr.matchSequence("%f%f%f%f"))
  51.                         {
  52.                                 osg::Vec3 center;
  53.                                 float width = 0.0;
  54.                                 fr.readSequence(center);
  55.                                 fr.readSequence(width);
  56.                                 geode->addDrawable(new osg::ShapeDrawable(new osg::Box(center,width)));
  57.                         }
  58.                         else ++fr;
  59.                 }
  60.                 return geode.release();
  61.         }
  62. };

  63. REGISTER_OSGPLUGIN(simple,ReaderWriterSimple)
复制代码

3.编译程序,生成了两个dll。将他们改名为osgdb_simple.dll和osgdb_simpled.dll,放置到osg的plugin文件夹下。
QQ截图20150507180221.png




然后打开命令行,使用osgviewr打开文件。
osgviewer 说 No Data Loaded.
QQ截图20150507180820.png


我还试了一下,如果没有把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都没有加这个)。
我不懂为什么,知道的人可以告诉我。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表