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

目的:要从数据库中读取节点数据到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();

}

数据库的应用——直接从内存中读取osg节点 (转)的更多相关文章

  1. ffmpeg 从内存中读取数据(或将数据输出到内存)

    更新记录(2014.7.24): 1.为了使本文更通俗易懂,更新了部分内容,将例子改为从内存中打开. 2.增加了将数据输出到内存的方法. 从内存中读取数据 ffmpeg一般情况下支持打开一个本地文件, ...

  2. ffmpeg 从内存中读取数据(或将数据输出到内存)(转)

    更新记录(2014.7.24): 1.为了使本文更通俗易懂,更新了部分内容,将例子改为从内存中打开. 2.增加了将数据输出到内存的方法. 从内存中读取数据 ffmpeg一般情况下支持打开一个本地文件, ...

  3. ffmpeg 从内存中读取数据 .

    http://blog.csdn.net/leixiaohua1020/article/details/12980423 ——————————————————————————————————————— ...

  4. FFMPEG内存操作(二)从内存中读取数及数据格式的转换

    相关博客列表: FFMPEG内存操作(一) avio_reading.c 回调读取数据到内存解析 FFMPEG内存操作(二)从内存中读取数及数据格式的转换 FFmpeg内存操作(三)内存转码器 在雷神 ...

  5. C# 操作地址 从内存中读取写入数据(初级)

    本示例以植物大战僵尸为例, 实现功能为 每1秒让阳光刷新为 9999.本示例使用的游戏版本为 [植物大战僵尸2010年度版], 使用的辅助查看内存地址的工具是  CE. 由于每次启动游戏, 游戏中阳光 ...

  6. php 如何在有限的内存中读取大文件

    突然遇到了一个要读取超过80M文件的需求,很悲剧的,不管是file_get_content还是file什么的,都会将读取的文件一次性加载到内存中. 正常情况下,我们可以使用fseek来读取,好处就是不 ...

  7. PJzhang:如何缓解Mimikatz从Windows2008 R2内存中读取域控密码?

    猫宁!!! 参考: https://xz.aliyun.com/t/4180 https://www.anquanke.com/post/id/156299 https://www.cnblogs.c ...

  8. openssl从内存中读取私钥进行签名

    麻痹的找了好久,真恶心! #include <stdio.h> #include <stdlib.h> #ifdef WIN32 #include <windows.h& ...

  9. EF如何操作内存中的数据以及加载相关联表的数据:延迟加载、贪婪加载、显示加载

    之前的EF Code First系列讲了那么多如何配置实体和数据库表的关系,显然配置只是辅助,使用EF操作数据库才是每天开发中都需要用的,这个系列讲讲如何使用EF操作数据库.老版本的EF主要是通过Ob ...

随机推荐

  1. redhat 下Redis安装

    Redis 官网:http://redis.io/  下载地址: http://redis.io/download 安装方法:   cd opt wget http://download.redis. ...

  2. Free Candies

    题意: 有4堆东西,每堆有n个每个有一个颜色,现在有一个篮子最多能装5个不同的颜色的东西,每次都从堆顶拿,当篮子出现两个相同颜色,可以获得这两个东西,求获得的最大数量 分析: 因为就4推,可以把各堆的 ...

  3. iOS学习笔记之Category

    iOS学习笔记之Category 写在前面 Category是类别(也称为类目或范畴),使用Category,程序员可以为任何已有的类添加方法.使用类别可以对框架提供的类(无法获取源码,不能直接修改) ...

  4. EF Code First学习笔记

    EF Code First学习笔记 初识Code First EF Code First 学习笔记:约定配置 Entity Framework 复杂类型 Entity Framework 数据生成选项 ...

  5. 关于微信聊天与朋友圈如何快速切换 Mark

    用微信时,你是否遇到这样的情况.你正刷着朋友圈,享受着各种鸡汤,这时候,你收到一条微信,一看是女王大人,不得不回.你诚恳的回了一条,等了二十秒不见有什么回应,于是就退了出来,进入朋友圈找到那篇没看完的 ...

  6. Hadoop-chd4.4.0安装

    Hadoop-cdh4下载地址: http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDHTarballs/3.25.201 ...

  7. 让一个div可以编辑加上contenteditable=true 复制来的内容带有样式,需要清除复制的样式

    sEv传keyup进去 function(id,sEv){ id.on(sEv,function(){ var str = $(this).html(); //获取复制进来的内容 var re=/&l ...

  8. 【JSON】JSON字符串的操作(不断积累中)

    一.JS遍历JSON串 示例01 目标:返回的JSON串中,一个Key对应的Value是一个数组(若在Java程序中,是一个List). 现在要求获取每个数组中的第一个对象元素中的name属性的值. ...

  9. 【转】SQL常用的语句和函数

    原文链接:http://www.cnblogs.com/mailingfeng/archive/2013/01/07/2850116.html order by 的数值型灵活使用 select * f ...

  10. JXTA+JavaFX实现的网络黑白棋测试地址

    http://www.qhdbaobao.com/dist/secondegg-reversi.html ——————————————————————————————————————————————— ...