数据库的应用——直接从内存中读取osg节点
来源:互联网 发布:知乎 团队协作工具 编辑:程序博客网 时间:2024/04/30 09:45
http://blog.csdn.net/zhuqinglu/archive/2007/12/03/1914047.aspx
目的:要从数据库中读取节点数据到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
- python从数据库读取几百万条的数据结果内存直接爆掉
- 用treeview从数据库中读取子节点
- 从数据库读取节点,动态绑定TreeView
- 从数据库中读取换行的字符串
- OSG — 内存管理策略
- Java学习笔记——从文件中直接读取已知对象
- android 直接从配置文件中读取图片
- osg中内存管理
- 直接从数据库中导出表结构的脚本
- 从数据库中读取图像
- 从数据库中读取文件
- 从数据库中读取word
- 如何从内存中读取受保护的文件?
- 从XML中读取数据到内存的实例
- 用cpuid指令获取cpu信息
- discuz论坛插件开发小教程
- Java调用.net的WebService
- 配置Tomcat 6.0 使之对ssi支持~
- 用PreparedStatement在Oracle中插入日期
- 数据库的应用——直接从内存中读取osg节点
- Java面试系列【静态导入】-静态导入,基础篇
- Linux Shell常用技巧
- 一个简单的osg控件开发例子
- jar包生成
- 使用jdbcTemplate.queryForRowSet()遇到UncategorizedSQLException:Invalid precision value. Cannot be less than zero解决办法
- 行轉列
- Linux下sendmail的设置,修改发信domain的方法
- 为页面添加正确的DOCTYPE