我目前正在LeadWerks 2引擎中开发一个游戏,我决定使用Qt4作为GUI和窗口管理器。我想要做的是创建一个Qt QGLWidget窗口,并在其中运行LeadWerks引擎。有一些关于构建基本QGLWidget应用程序这里的信息。
我真的很难理解如何做到这一点。我可以在LeadWerks引擎中创建一个自定义GL缓冲区,我相信我需要做的是给这个缓冲区创建GL上下文Qt。至于事物的LeadWerks方面,我需要做的主要事情是调用一个名为CreateCustomBuffer的方法,并传递一些东西:
虚拟空缓冲区::CreateCustom(字节* getsize,字节* makecurrent)
创建并返回新的自定义缓冲区。GetSize (定义为void _stdcall GetSize(int* _stdcall GetSize,int* GetSize))和MakeCurrent (定义为void _stdcall MakeCurrent(void))是缓冲区的回调函数。GetSize应该返回(通过更改指针提供的值)所使用的OpenGL缓冲区/上下文的大小。MakeCurrent应该将自定义缓冲区设置为当前的OpenGL上下文。
发布于 2011-12-04 13:37:21
MakeCurrent (定义为void _stdcall MakeCurrent(void))是缓冲区的回调函数。
如果我理解它是正确的,这个回调将被调用,无论何时LeadWerks希望上下文变为活动(它自己不管理它自己),类似的getsize回调是为了获得可用窗口的大小。因此,通常您会使用它从另一个您可以访问的接口激活上下文。
不幸的是,这些回调不允许传递指针,这意味着不能传递QGLWidget类实例指针,这样就可以将调用委托给类成员函数。无法将用户数据传递给回调是API设计错误的一个标志,因为这会使事情变得很困难,否则就会很容易。
有一个名为ffCall的库,它提供了一种绕过这个http://www.gnu.org/s/libffcall/callback.html的机制。
所以你会写一个委托函数
void qglwidget_makecurrent(void *data, va_list alist)
{
GQLWidget *widget = (QGLWidget*) data;
widget->makeCurrent();
}
void qglwidget_getsize(void *data, va_list alist)
{
int *widthptr, *heightptr;
GQLWidget *widget = (QGLWidget*) data;
va_start_ptr(alist, void);
widthptr = va_arg_ptr(alist, int*);
heightptr = va_arg_ptr(alist, int*);
va_return_void(alist);
*widthptr = widget->width();
*heightptr = widget->height();
}将回调包装器(如QGLWidget派生类的构造函数)创建为类成员变量:
class MyGLWidget : QGLWidget {
/* ... */
__TR_function qglwidget_makecurrent_callback;
__TR_function qglwidget_getsize_callback;
}
MyGLWidget::MyGLWidget() {
qglwidget_makecurrent_callback = alloc_callback(qglwidget_makecurrent, (void)this);
qglwidget_getsize_callback = alloc_callback(qglwidget_makecurrent, (void*)this);
}那些你可以传递给LeadEngine的:
buffer->CreateCustom((void(*)(int, int))qglwidget_getsize_callback, (void(*)(void))qglwidget_makecurrent_callback);https://stackoverflow.com/questions/8372791
复制相似问题