绑定过webpage 到osg 窗口,我需要一个回调机制对osg 显示进行后台显示. 具体的做法是osg作为一个状态机, 前台web界面向后台发送命令, 消息 .
后台接收消息,改变状态.我想架在soket上. 我需要一个网络的服务的状态机.nodejs 正好短小精悍.相对开发比较火热.并且前后台保持开发语言的一致.
避免了,开发者在不同语言下切换.v8引擎有全球上亿的人口在做测试.想来也不用忧虑.
以上是绑定js的目的.
在网上搜寻js的资料发现都是2010年的一篇,那时node.js 才0.02版. node.js 社区对其进行修改使用一个叫node-gyp的集成工具进行addon的开发.
具体请见 node.js addon
> 下载node-js 执行vcbuild.bat 批处理文件编译node-js
> 下载addon的例子, 执行node-gyp 变异node.js C++拓展.
第二点具体的执行是出现一些状况,
> 直接按照默认的流程执行,最后出现的版本是x64位的. 使用node.js执行js脚本,启动addon回弹出一个异常,大概的意思是讲,你的dll是x64位的,而你的
node.exe 是win32 的不匹配. 这个问题困扰了我很久,我尝试了node-gyp 构建工具的命令, 详细的观察输出信息.但是一直不得要领. 在google中搜寻资料
关于node-gyp 构建的命令很少.官方的文档更是精简,只要按照默认的configure->build . 尝试很久msvs 中的工厂选项一直只是显示x64 版本,并且只有
Release本的工程师配置完全的,可以编译通过. 在屡屡受挫的情况下.我甚至尝试要重新编译x64版本的地node.js 但是因为我不能得到Debug版本的addon
所以暂时没有考虑这种方式。随后了解到node-gyp是gyp的延伸。node-gyp的命令应该和gyp的命令是有共同点。所以尝试google搜寻 gyp build win32 的
信息,但是还是很少。最后在一篇问答上看到有这样一行命令
--arch ia32
尝试了下
node-gyp configure -arch ia32 竟然可以产生 win32 的版本。但是根据build时输出的信息,仍旧是Release版本 。 有关node.exe 加载 example addon OK
终于出现久违的hello 了。
再接再厉, 尝试 --mode debug 不行
--Debug 竟然可以。 具体的command
node-gyp configure -arch ia32 --debug
总是这个addon的绑定流程算是跑通。接下来就是osg 的暴力绑定了。我直接在addjs 加入下列代码。
Handle<Value> Method(const Arguments& args) {
HandleScope scope;
osgViewer::Viewer viewer;
osg::Group *root = new osg::Group();
osg::Box *unitCube = new osg::Box( osg::Vec3(0,0,0), 1.0f );
unitCube->setDataVariance(osg::Object::DYNAMIC);
osg::ShapeDrawable *unitCubeDrawable = new osg::ShapeDrawable(unitCube);
osg::Geode *basicShapeGeode = new osg::Geode;
basicShapeGeode->addDrawable( unitCubeDrawable );
root->addChild( basicShapeGeode );
viewer.setSceneData( root );
viewer.setCameraManipulator( new osgGA::TrackballManipulator() );
viewer.realize();
//viewer.setUpViewInWindow( 20, 20, 640, 480 );
while ( !viewer.done() ) {
viewer.frame();
}
return scope.Close(String::New("world"));
}
这个是osg sample中的独有例子,渲染界面全屏显示。
当我设置osg 的窗口大小。会出现
Error: [Screen #0] GraphicsWindowWin32::makeCurrentImplementation() - Window not realized; cannot do makeCurrent.
的error
http://comments.gmane.org/gmane.comp.graphics.openscenegraph.user/12009 与链接中的描述一致。
这个问答中的讲 是因为线程的原因, 本人表示不懂。但是隐隐约约觉得 node.js 本身有一个基于事件的libuv框架。
不过当mark掉也没有人很问题。所以不提。
这是对node.js 的初接触吧