将C ++虚拟方法绑定到具有覆盖function的js

假设我有一个C ++类:

class cRenderer { ... virtual void draw(); ... } 

这是渲染引擎的一部分,所以任何inheritancecRenderer C ++类cRenderer可以重写draw方法,并在屏幕上绘制东西。

问题是我如何实现与v8绑定相同的行为(这将最终是一个Node.js模块)?

有人可能会说,我可以这样做:

 class cApplication : public cRenderer, public node::ObjectWrap { ... define bindings ... } 

然后在我的JavaScript我做了这样的事情:

 var app = new cApplication(); var oldDraw = app.draw; //saving old instance of draw app.draw = function() { ... do drawing api calls ... oldDraw(); //calling old draw } 

这是行不通的,因为所有绘图API调用都是在draw之外发生的。

更具体地说,JS绑定怎么能在draw方法内插入dynamicAPI调用? 如何解决这个问题? 请记住,编辑渲染引擎的架构不是一个选项。

编辑:

我的意思是:

 drawCircle(100, 100, 11); //outside of render loop draw(); //nothing happens at this point. 

但是如果你在抽奖的方式里面有你的电话:

 void draw() { //inside of render loop drawCircle(100, 100, 11); //it draws a circle at (100, 100) with radius 11 } 

我的Sciter引擎使用所谓的即时绘图模型。 我高度怀疑你正在尝试在这里做同样的事情。

即时的绘图模式:

Sciter中的任何DOM元素可能都附有“绘制处理程序”:

 var someEl = ... someEl.paintBackground = function(gfx) {... } someEl.paintContent = function(gfx) {... } ... 

当元素需要绘制时,这些画家将由本地代码调用。 为了以防万一,在HTML / CSS元素绘图被分割在多个层:背景,内容,前景/大纲。

下面是如何实现本地draw_background的例子:

 class Element { void draw_background(graphics* gfx) { if( has_paintBackground() ) { if(invoke(paintBackground, object_wrap(gfx)) == TRUE_VALUE) return; // default background drawing was suppressed by script } default_draw_background(gfx); } } 

在这种情况下,脚本可能会在元素的背景层下面绘制一些东西,甚至是完全代替默认的渲染器。

更新:

由object_wrap(gfx)生成的脚本对象仅在渲染调用中连接到实际渲染表面。 任何在其他地方存储和使用gfx对象的尝试都会抛出一个错误:“无效的渲染表面”。

我不确定,但怀疑你需要这样的东西。