2011-12-04 11 views
1

私は現在、LeadWerks 2エンジンでゲームを開発しており、Qt4をGUIとウィンドウマネージャとして使用することに決めました。私がしたいことは、Qt QGLWidgetウィンドウを作成し、その内部でLeadWerksエンジンを実行させることです。 基本的なQGLWidgetアプリケーションを構築するための情報がありますhereQt4から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でクラスを派生として(コールバックラッパーを作成ですから、

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); –

関連する問題