随笔 - 833  文章 - 1  评论 - 106  阅读 - 200万

数据库的应用——直接从内存中读取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();

}

posted on   3D入魔  阅读(1610)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示