zoukankan      html  css  js  c++  java
  • 数据库的应用——直接从内存中读取osg节点 (转)

    数据库的应用——直接从内存中读取osg节点

    目的:要从数据库中读取节点数据到osg

     

    一开始的方法是这样的,每当我要添加一个数据库中的节点数据时,首先把它读取到内存中,然后写入一个文件,最后再次从文件中用osgosgDB::readNodeFile()读取,这个方法是可行的,但是却很糟糕。我的初衷是不要经过文件转换。

     

    现在问题解决了,多亏了osg::ReaderWriter提供一个虚函数:

    virtual ReadResult  readNode (std::istream &, const Options *=NULL) const

    这样的话,就可以从istream类中直接读取到osg了,现在的问题是,只要解决从一个buffer的数据能转换到istream的数据,我们的问题就解决了。

    下面一段代码演示了如何从buffer中把节点数据转化为istream,然后显示节点,稍加修改就可以读取图像等信息。

     

    #include <iostream>

    #include <fstream>

    #include <osgDB/ReadFile>

    #include <osg/Node>

    #include <osgViewer/Viewer>

     

    class NodeBuf : public std::basic_streambuf<char, std::char_traits<char>> {

    public:

         //构造函数,参数意义:buffer的地址和长度

         NodeBuf(char * mem, int sz) {

             //参数意义:起始位置,当前位置,最后的位置

             setg(mem, mem, mem + sz);

         }

    };

     

    osg::Node* readNodeFromBuffer(char* buffer, size_t length, const char*

                                       extension)

    {

         osgDB::ReaderWriter* rw =

             osgDB::Registry::instance()->getReaderWriterForExtension(extension);

         if (rw)

         {

             NodeBuf sb(buffer, length);

             std::istream stream(&sb);

             osgDB::ReaderWriter::ReadResult rr = rw->readNode(stream);

     

             return rr.takeNode();

         }

         return NULL;

    }

     

     

    int main( int argc, char **argv )

    {

         //输入自己要读取的节点位置

         std::ifstream fin("E://OSG2.2//OpenSceneGraph-Data//axes.osg");

         //得到文件的长度

         fin.seekg(0,std::ios_base::end);

         unsigned long sz=fin.tellg();

         //指针指向文件头

         fin.seekg(0,std::ios_base::beg);

     

         char *buffer=new char[sz];

         fin.read(buffer,sz);

         fin.close();

     

         NodeBuf my_buf(buffer, sz);

         std::istream stream(&my_buf);

     

         osgViewer::Viewer viewer;

         //第三个参数是后缀名

         viewer.setSceneData(readNodeFromBuffer(buffer,sz,"osg"));

         delete buffer;

         viewer.run();

    }

  • 相关阅读:
    Linux tar指令
    关于Json-lib类库的使用
    安卓开发笔记——Fragment+FragmentTabHost组件(实现新浪微博底部菜单)
    安卓开发笔记——TabHost组件(二)(实现底部菜单导航)
    安卓开发笔记——TabHost组件(一)(实现底部菜单导航)
    安卓开发笔记——ViewPager组件(仿微信引导界面)
    安卓开发笔记——Menu菜单组件(选项菜单,上下文菜单,子菜单)
    安卓开发笔记——Gallery组件+ImageSwitcher组件
    安卓开发笔记——GridView组件
    安卓开发笔记——WebView组件
  • 原文地址:https://www.cnblogs.com/mazhenyu/p/4111340.html
Copyright © 2011-2022 走看看