nodejs addon binding osg

姬昊焱
2023-12-01

绑定过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 的初接触吧









 类似资料:

相关阅读

相关文章

相关问答