GPUPPURUT開発8

やはりGDXUTのフルスクリーン処理にまだバグがあるようです。一度フルスクリーン化した後にAlt+Tabを押した後、またフルスクリーンに戻ると、見た目はちゃんとフルスクリーンされているように見えます。ですがマウスポインタを画面の端へ持っていくとウィンドウのサイズを変えることができちゃいます。それでウィンドウのサイズを変えるとクラッシュします。一旦ウィンドウモードに戻った後に再びフルスクリーン化すると大丈夫なんですが。

このバグ取りはかなり時間がかかりそうなので放置し、次に進むことにしました。

今日初めて、Boostのpreprocessorを触ってみました。
で気づいたのですが、マクロの引数にマクロを使うとうまくいかないときがあるようです。本家のマニュアルにはマクロ引数にマクロを使っている例はあるので、うまくいくマクロとそうでないのがあるようですが。
例えば、g++で試したのですが


BOOST_PP_IF(BOOST_PP_IS_NIL(LIST), hoge, hige)
は正しく展開されません。
ここでBOOST_PP_IS_NIL(LIST)が先に1か0に展開された後にBOOST_PP_IF()マクロが展開されればいいのですが、実際は先にBOOST_PP_IFマクロが展開さます。このとき、引数の"BOOST_PP_IS_NIL(LIST)"は他のトークンにくっつけられているようなので、もはや展開されません。
BOOST_PP_IS_NIL(LIST)を先に展開した後にBOOST_PP_IFに渡せばうまく行くと思うのですが、どうやればよいのか思いつきません。

boostのpreprocessorは凄いなーと思ったのですが、うまく使えないので使わないことにしました。というか自分のやろうとしたことが変態的過ぎたのかもしれません。

後はGPUPPURUTのGDXUTとGGLUTを上手く組み合わせたりするところを作れば、とりあえずはGPUPPURUTの完成です。
GDXUTとGGLUTは一つのオブジェクトが一つのウィンドウと3D関連のcontextに対応していて、オブジェクトをコピーできるようになるといろいろ面倒なあ問題が起きそうなので、コピーできないようになっています。ですのでvectorとすることはできません。その代わり、vector >とかboost::ptr_listを使ってもらうことになります。

http://d.hatena.ne.jp/gpuppur/20060825
で、virtual関数のないgdxutをそのまま使っていますが、GPUPPURUTにあるオブジェクトはDirectXみたいに常にポインタを介してvirtual関数を呼び出して使うようにしようかと思います。