ゆとりーなの日記

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

図形拡張の方法

図形拡張の方法が大体固まってきたのでそれの話でも。
取り敢えずngy313::drawable_adaptorを継承して、コンストラクタで基底クラスに初期化頂点情報配列を渡してやればいいことにする予定です。ngy313::drawable_baseはテンプレートクラスになっていて、適切なテンプレート引数とコンストラクタに渡す頂点情報配列によって様々な図形クラスが書けるようになる筈です。
ngy313::drawable_baseのテンプレート引数は、派生クラスの型、配列の要素数、プリミティブカウント、fvfタグ、プリミティブタグとなります。派生クラスの型と配列の要素数はまんまで、プリミティブカウント、FVFタグ、プリミティブタグに関しては少しDirectXの知識がいります。DirectXの描画機構に関してはそれぞれ調べてもらうとして、対応関係はそれぞれ次のようになっています。

  • プリミティブカウント IDirect3DDevice9::DrawPrimitiveUPの第二引数に渡す数
  • FVFタグ IDirect3DDevice9::SetFVFに渡す数
  • プリミティブタグ IDirect3DDevice9::DrawPrimitiveUPの第一引数に渡す数

FVFタグとプリミティブタグに関しては数ではなく型を渡すようになっています。
FVFに関する値と型の対応関係は以下の表の通りです。

DirectXのFVFDWORD値 FVFタグ
D3DFVF_XYZRHW dimension2_fvf_tag
D3DFVF_XYZ dimension3_fvf_tag
D3DFVF_NORMAL normal_fvf_tag
D3DFVF_DIFFUSE diffuse_fvf_tag
D3DFVF_SPECULAR specular_fvf_tag
D3DFVF_TEX1 tex1_fvf_tag
D3DFVF_TEX2 tex2_fvf_tag

二次元図形として良く使うFVF値は

D3DFVF_XYZRHW | D3DFVF_DIFFUSE

ですが、これの場合ngy313::drawable_baseに渡す第三引数は

ngy313::make_fvf_tag<dimension2_fvf_tag, diffuse_fvf_tag>

になります。また、よく使うFVF値に関しては既にtypdefしてあるので、今回の例ではこれでもいけます。

ngy313::shape_2d_fvf_tag

続いてD3DPRIMITIVETYPEとプリミティブタグの対応関係は、

D3DPRIMITIVETYPE プリミティブタグ
D3DPT_POINTLIST point_list_primitive_tag
D3DPT_LINELIST line_list_primitive_tag
D3DPT_LINESTRIP line_strip_primitive_tag
D3DPT_TRIANGLELIST triangle_list_primitive_tag
D3DPT_TRIANGLESTRIP triangle_strip_primitive_tag
D3DPT_TRIANGLEFAN triangle_fan_primitive_tag

になるので、使いたいやつをそのまま第四引数に突っ込んでやります。
例としてライブラリ側が提供しているngy313::boxクラスだと長方形しか書けないので、任意の4頂点を指定して四角形を書くクラスを作るとします。

class quadrangle : public ngy313::drawable_base<quadrangle,
                                                4,
                                                2, 
                                                ngy313::shape_2d_fvf_tag, 
                                                ngy313::triangle_strip_primitive_tag> {
 public:
  quadrangle(float x1,
             float y1,
             float x2,
             float y2,
             float x3,
             float y3, 
             float x4,
             float y4) 
      : ngy313::drawable_base<quadrangle, 
                              4, 
                              2,
                              ngy313::shape_2d_fvf_tag,               
                              ngy313::triangle_strip_primitive_tag>(init_vertex(x1,
                                                                                y1, 
                                                                                x2,  
                                                                                y2,
                                                                                x3,
                                                                                y3,
                                                                                x4,
                                                                                y4)) {}
 private:
  static vertex_array_type init_vertex(float x1,
                                       float y1,
                                       float x2,
                                       float y2,
                                       float x3,
                                       float y3, 
                                       float x4,
                                       float y4) {
    const vertex_array_type vertex = {{
      {{x1, y1, 0.f, 1.f}, 0xFFFFFFFF},
      {{x2, y2, 0.f, 1.f}, 0xFFFFFFFF},
      {{x3, y3, 0.f, 1.f}, 0xFFFFFFFF},
      {{x4, y4, 0.f, 1.f}, 0xFFFFFFFF}
    }};
    return vertex;
  }
};

現状こんな感じで作れます。ライブラリが提供している図形クラスもこの機構で作られています。