ゆとりーなの日記

日記的な事を書いて行くと思はれる

ユーザー定義図形の方法をどうするか

VC++2010でゲームが作れるかもしれないライブラリ」ではユーザーが図形型を定義出来るようにしようと考えているわけですが、その方法をどうするかに悩んでいる訳です。長方形や線分など、ライブラリが予め用意しておく型もこの機構を使って定義しておきたいのです。

class box : public drawable_adaptor<box, 4, 2, make_drawable_tag<dimension2_fvf_tag, diffuse_fvf_tag, triangle_sprit_primitive_tag>> {
};

取り敢えず現状drawable_adaptorのテンプレート引数に頂点数、描画カウント、FVFタイプ、プリミティブタイプを渡す流れになっています。FVFタイプとプリミティブタイプはタグ構造体が定義されており、こいつらをmake_drawable_tagに渡してやるようにしようかと思案中です。make_drawable_tagでは、fvfタグやprimitiveタグがなかっかたりprimitiveタグが二つ以上あったらコンパイルでこけるようにしてあるんですが、ひょっとするとmake_fvf_tagとprimitiveタグでテンプレート引数を分けた方がいいのかなと思わないこともないです。
あとは初期化ですね。boxだとコンストラクタが

box(float x, float y, float width, float height);

で、頂点初期化は

{
{x, y, 0.f, 1.f, 0xFFFFFFFF},
{x + width, y, 0.f, 1.f, 0xFFFFFFFF},
{x, y + height, 0.f, 1.f, 0xFFFFFFFF},
{x + width, y + height, 0.f, 1.f, 0xFFFFFFFF}
}

になります。一方で他の図形ではまた全然違った形になるわけです。これを統一的に扱うにはどうすればいいのか悩んでるわけです。各図形毎に頂点配列とレンジ返すメソッドを定義させればいいって言えばいいんですが、明らかにコードの重複ですし、あまり複雑な決まりを持ち込みたくないんです。コンストラクタと頂点初期化リストだけで定義できるようにしたいところです。