javascript — привязка виртуальных методов C ++ к js с возможностью переопределения

Предположим, у меня есть класс C ++:

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

Это часть механизма рендеринга, поэтому любой класс 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 могут вставлять динамические вызовы API в draw метод? Как можно решить эту проблему? Пожалуйста, помните, редактирование архитектуры движка рендеринга не вариант.

РЕДАКТИРОВАТЬ:

Снаружи и внутри draw Я имел в виду:

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

Но если у вас был вызов внутри метода draw:

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

2

Решение

мой Sciter Двигатель использует так называемую модель непосредственного рисования. Я очень подозреваю, что вы пытаетесь сделать то же самое здесь.

Непосредственная модель рисунка:

К любому элементу DOM в Sciter могут быть прикреплены «обработчики рисования»:

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 в другом месте приведет к ошибке: «неверная поверхность рендеринга».

Я не уверен, но подозреваю, что вам нужно что-то подобное.

-1

Другие решения


По вопросам рекламы [email protected]