2011-12-04 7 views
1

저는 LeadWerks 2 엔진에서 게임을 개발 중입니다. Qt4를 GUI 및 창 관리자로 사용하기로했습니다. Qt QGLWidget 창을 생성하고 LeadWerks 엔진을 내부에서 실행하도록하고 싶습니다. 기본 QGLWidget 응용 프로그램을 빌드하는 데 대한 정보가 있습니다 here.Qt4에서 OpenGL 컨텍스트를 전달하려면 어떻게합니까?

저는이 작업을 정확히 수행하는 방법을 이해하기 위해 애 쓰고 있습니다. LeadWerks 엔진 내에서 커스텀 GL 버퍼를 생성 할 수 있으며, Qt가 생성 한 GL 컨텍스트에 그 버퍼를 제공해야한다고 믿습니다. 사물의 LeadWerks 측에 관해서는 , 내가해야 할 중요한 것은 몇 가지 CreateCustomBuffer라는 메소드를 호출하고 전달할 수 있습니다 :

가상 무효 버퍼 :: CreateCustom (바이트 *의 getSize 바이트 * makecurrent)

새 사용자 지정 버퍼를 만들고 반환합니다. GetSize (void _stdcall GetSize (int * width, int * height)로 정의) 및 MakeCurrent (void _stdcall MakeCurrent (void)로 정의 됨)는 버퍼에 대한 콜백 함수입니다. GetSize는 사용 된 custum OpenGL 버퍼/컨텍스트의 크기를 포인터로 제공된 값을 변경하여 반환해야합니다. MakeCurrent는 사용자 정의 버퍼를 현재 OpenGL 컨텍스트로 설정해야합니다.

+1

귀하는 등록해야하는 포럼에 링크되어 있습니다. –

+0

Qt와 LeadWerks를 결합하려고하는 몇 가지 이유가 있습니다. 어느 쪽도 다른 것과 호환되도록 설계되지 않았고 둘 다 똑같은 일을하려고 할 때입니까? Leadwerks가 제공하지 않는 Qt는 무엇입니까? 다른 창문? 그렇다면 왜 LeadWerks 창을 사용하지 않고 옆에 Qt 창을 만드시겠습니까? –

+0

내가 만든 포럼 게시물의 정보를 제공 할 것입니다. LeadWerks는 렌더링 엔진입니다. GUI 기능을 제공하지 않습니다. Qt를 사용하여 해당 기능을 수행하려고합니다. –

답변

1

및 MakeCurrent (정의 무효 _stdcall MakeCurrent (무효)),이 콜백은 LeadWerks 컨텍스트가 활성화되고 싶다 때마다 호출됩니다 내가 올바른 이해하면 버퍼

에 대한 콜백 함수이다 (그것 자체를 관리하지 않는다), 비슷한 getsize 콜백은 사용 가능한 윈도우의 크기를 얻는 것이다. 따라서 일반적으로 액세스 권한이있는 다른 인터페이스에서 컨텍스트를 활성화하려면이 옵션을 사용하십시오.

불행히도 이러한 콜백은 포인터를 전달할 수 없습니다. 즉, QGLWidget 클래스 인스턴스 포인터를 전달할 수 없기 때문에 호출을 클래스 멤버 함수에 위임 할 수 있습니다. 콜백에 사용자 데이터를 전달할 수 없다는 것은 API 설계가 잘못되었음을 나타냅니다.

라는 라이브러리가 당신의 QGLWidget 클래스를 파생에 그래서 당신이 (A 위임자 기능

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(); 
} 

콜백 래퍼를 생성을 써서이 http://www.gnu.org/s/libffcall/callback.html

주위에 얻을 수있는 메커니즘을 제공 ffcall'생성자)를 클래스 멤버 변수로 사용할 수 있습니다.

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); 
+0

고마워했다. @ datenwolf! 그러나 몇 가지 오류가 발생했습니다 : 1. qglwidget_getsize()는 va_start_ptr에 충분한 인수가없는 것과 같은 몇 가지 불만을 나타냅니다. va_return_type이 전혀 존재하지 않습니다. 2. qglwidget_makecurrent_callback = alloc_callback (qglwidget_makecurrent, & qglwidget_instance)은 qglwidget_instance가 존재하지 않는다고 불평합니다. 나는 이것을 'this'로 바꾸려고했지만 qglwidget_makecurrent_callback은 "__TR_function"을 할당하는 것을 좋아하지 않습니다. 어떤 조언이 필요합니까? –

+0

@ S.Richmond : 나는 이것을 서둘러 쓰고 있었기 때문에 몇 가지를 놓쳤다. 내 변경 사항을 참조하십시오. – datenwolf

+0

아하. 마지막 오류는 "유형"__TR_function "의 값을"void (*) (void *, va_list list) "유형의 엔터티에 할당 할 수 없습니다." "qglwidget_makecurrent_callback = alloc_callback (qglwidget_makecurrent, (void *) this); –

관련 문제