直接从内存中读取osg节点
来源:互联网 发布:nginx 目录重定向域名 编辑:程序博客网 时间:2024/05/21 12:47
目的:要从数据库中读取节点数据到osg。
一开始的方法是这样的,每当我要添加一个数据库中的节点数据时,首先把它读取到内存中,然后写入一个文件,最后再次从文件中用osg的osgDB::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();
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhuqinglu/archive/2007/12/03/1914047.aspx
- 直接从内存中读取osg节点
- 数据库的应用——直接从内存中读取osg节点
- 数据库的应用——直接从内存中读取osg节点
- 从内存数据读取osg::node
- android 直接从配置文件中读取图片
- osg中内存管理
- python pickle模块使用-将内存数据保存到文本中以及从文本中直接读取信息到内存中
- Delphi直接从流中读取HTML到WebBrower中
- 从文件中读取数组到内存
- 从手机内存rom中读取数据
- ffmpeg 从内存中读取数据
- ffmpeg 从内存中读取数据
- openssl从内存中读取RSA公钥
- ffmpeg 从内存中读取数据
- CImage 从内存中读取图像
- OSG::节点
- OSG中读取osg文件到geode中
- 不下载直接从TMEMORYSTREAM中读取图片.
- 使用邮槽实现进程间通信的技巧
- 位运算符的一些用途
- Servlet
- struts2.1.6 Bug post 乱码
- Linux驱动的一些基本操作
- 直接从内存中读取osg节点
- C#获取RES32资源的方法
- android网址推荐(转)
- 生成osg图像并保存
- OpenGL ES 的经典源代码网站
- 含dropdownlist的GirdView编辑删除完整例子
- SQLServer DBA常見問題
- 如何禁用SMI中断,以增强PC实时性能?
- onchange与onpropertychange的联系与区别!