« ゴールオブジェクトは残す? | メイン | 描画されない »

2005年03月16日

吉里吉里 DirectX拡張:: Direct3Dを使えるようにしようとする

    

LAMPばかり触っていて疲れてきたので、Direct3Dを直接使い、吉里吉里上で表示させてみようと考え、作り始めた。
Direct3Dに設定したWindowに対して、GDIで描画したらどうなるか試してみる。
両方描画できているっぽい。
これならオーバーレイのような感じで使えそう。(オーバードローと言うような表現が良いかも)
まずはとにかく表示できるようにすることとし、チュートリアルのメッシュをベースに、各機能をクラス化した。
ただし、VectorやMatrixのクラスも追加するのは面倒なので、引数にx,y,zを渡すなどして少し省力化。
各クラスが出来たので、クラスプラグインとして利用できるように、インターフェイスとなるクラスと登録用の関数を書く。
激しく面倒くさい。
SWIGを拡張してTJSに対応させるか、簡単なスクリプトからクラスと関数を生成してくれるようなツールが欲しいと切に願う。
でも、今回はすべて手書き。
そもそもどうやって書くかまだあまり知らないし。

クラスを返したり、受け取ったりする部分はどのように書くのだろう?
よくわからないので、勘で次のように書いてみる。
tTJSVariant result;
iTJSDispatch2 *tjsclass = Create_NC_Transform3D();
tTJSVariant val = (tjs_int)m_XObject->getTransform();
tjsclass->PropSet( TJS_MEMBERMUSTEXIST, TJS_W("transform3d"), NULL, &val, tjsclass );
result = tTJSVariant(tjsclass);
tjsclass->Release();
val.Clear();
return result;

実行させてみるが、どうもうまくいっていない様子。
Transform3Dと言うクラスにネイティブにクラスのポインタを持たせ、transform3dというプロパティでそのメンバへ直接値を入れられるようにして、PropSetで渡せば何とかなるかと思ったのだが・・・
吉里吉里の内部のコードを見てみると、コンストラクタの引数で値を渡している物があった。
そうか! コンストラクタで実態を渡せるようにした方が良いか。
よく考えるとそれではまずいこともありそうな気がするが、とりあえずそうする。
で、次のように書く。

tTJSVariant result;
iTJSDispatch2 *tjsclass = Create_NC_Scene();
iTJSDispatch2 *out;
tTJSVariant param((tjs_int)m_Graphics.getRootScene());
tTJSVariant *pparam = &param;
tjsclass->CreateNew(0, NULL, NULL, &out, 1, &pparam, tjsclass);
result = tTJSVariant(out,out);
tjsclass->Release();
//out->Release();
return result;

このソースは上のソースとは違う場所。
コメントアウトしている場所は、これをやると開放しすぎてしまうので、コメントアウト。
ここは、なんかわからないけど、初期化されてねー、アクセス違反が出るなどなどかなり悩んだ。
なので、ここではRelease()をコールするのは間違いのよう。
とりあえず、これで吉里吉里からこのクラスプラグインが使えるようになった。
いろいろとはまったけど。



投稿者 Takenori : 2005年03月16日 01:28




comments powered by Disqus
Total : Today : Yesterday : なかのひと