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

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

}

时间: 2024-12-08 00:29:40

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

ffmpeg 从内存中读取数据

http://blog.csdn.net/leixiaohua1020/article/details/12980423 ffmpeg一般情况下支持打开一个本地文件,例如"C:\test.avi" 或者是一个流媒体协议的URL,例如"rtmp://222.31.64.208/vod/test.flv" 其打开文件的函数是avformat_open_input(),直接将文件路径或者流媒体URL的字符串传递给该函数就可以了. 但其是否支持从内存中读取数据呢?这个问题困

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

本示例以植物大战僵尸为例, 实现功能为 每1秒让阳光刷新为 9999.本示例使用的游戏版本为 [植物大战僵尸2010年度版], 使用的辅助查看内存地址的工具是  CE. 由于每次启动游戏, 游戏中阳光地址都是变的, 唯一不变的基址1, 我们要通过CE工具找到基址1的地址, 可以算出阳光的地址. 基址2的地址 = 基址1中的值 + 偏移1; 阳光的的地址 = 基址2中的值 + 偏移2; 以下为简单示例:  窗口界面一个按钮 和 一个定时器 using System; using System.Co

Windows口令安全与破解之--Getpass本地内存中读取windows口令

[实验目的] 1).理解Getpass本地内存中读取windows口令的原理 2)学习Getpass本地内存中读取windows口令的过程 [实验原理] 我们之前学习的是通过获得SAM,破解SAM来获得管理口令,今天我们介绍的是getpass这款软件,在2012年被开发出来,可以直接从 lsass.exe 里获取windows处于active状态账号明文密码.比破解SAM更快,更准. [实验环境] Getpass常用于黑客在已经获得目标系统webshell,且拥有system权限时的操作,此次实

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

麻痹的找了好久,真恶心! #include <stdio.h> #include <stdlib.h> #ifdef WIN32 #include <windows.h> #endif #include "openssl/rsa.h" #include "openssl/pem.h" #include "Base64.h" #ifdef WIN32 #pragma comment(lib,"User3

深入理解计算机系统 1.4 处理器读取和解释存储在内存中的指令

到如今,我们的hello.c源程序已经已经被编译系统翻译为可运行对象文件了,这个可运行对象文件叫做hello,被存储在磁盘上.为了在Unix系统上运行可运行文件,我们在一个叫做shell的应用程序中输入它的名字: unix> ./hello hello, world unix> shell程序是一个命令行解释器,它打印出一条提示,等着你输入一条命令行.然后运行命令.如果输入的命令行的第一个单词没有匹配到内建的shell命令.那么shell如果这个单词是一个可运行文件的名字.这个文件应该被载入进

SQL Server 内存中OLTP内部机制概述(一)

----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory OLTP Internals Overview>:http://technet.microsoft.com/en-us/library/dn720242.aspx ----------------------------我是分割线------------------------------- SQL S

cocos2dx中加载图片资源的方法,和从内存中获取已经加载的图片资源的方法

游戏中通常需要将常用的资源如:声音,图片,plist文件,提前加载进内存,以加快游戏的流畅度 1.预加载声音: SimpleAudioEngine::getInstance()->preloadBackgroundMusic("boom.mp3"); 加载之后就可以直接播放:SimpleAudioEngine::getInstance()->playBackgroundMusic("boom.mp3"); 2.预加载图片资源: 图片资源的加载分为同步加载

Android逆向之旅---运行时修改内存中的Dalvik指令来改变代码逻辑

一.前言 最近在弄脱壳的时候发现有些加固平台的加固方式是修改了dex文件结构,然后在加载dex到内存的时候,在进行dex格式修复,从而达到了apk保护的效果,那么在dex加载到内存的时候,如何进行dex格式的修复呢?其实原理就是基于运行时修改内存中的Dalvik数据,本文就来用一个简单的例子来介绍一下如何在内存中去修改Dalvik指令代码来改变代码本生的运行逻辑.在讲解本文之前,一定要先看这篇文章:Android中Dex文件格式详解 这篇文章主要介绍了关于Dex文件的格式介绍,这个对于后面修改内

VC++使用CImage在内存中Jpeg转换Bmp图片

VC++中Jpeg与Bmp图片格式互转应该是会经常遇到,Jpeg相比Bmp在图片大小上有很大优势. 本文重点介绍使用现有的CImage类在内存中进行转换,不需要保存为文件,也不需要引入第三方库. Libjpeg库在8以后也支持了内存读取和转换,不过使用起来较为麻烦,还需要手动编译,用CImage类完全可以实现,代码更简洁. 实现方法: VC++对Jpeg.Png图片的操作主要使用CImage,相信很多人用过CImage的Load和Save函数从文件读取或保存Jpeg或Png格式的文件,这两个重载