ゆとりーなの日記

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

図形描画インターフェイス審議

取りあえず

template <typename Drawable>
void draw(const Drawable &drawable);

に描画対象オブジェクトを投げれば描画してくれる仕様を考えているのですが、なかなか詰めが進みません。取りあえず2D描画だけをサポートするとして、描画対象オブジェクトは次のメソッドを適切に実装させることは決まっています。

// 図形頂点格納用構造体
struct fugure_vertex {
  vector2 pos_; // D3DXVECTOR2的なサムシング
  color4 color_; // D3DXCOLOR的なサムシング
};

// プリミティブタイプ
enum primitive_type {
  // DirectXもOpenGLも意外と似てる
};

// プリミティブフォーマット
struct primitive_format {
  std::uint32_t fvf_; // DirectX用に定義させる
  primitive_type type_;
  int count_; // DirectX用に定義させる

class drawable {
 public:
  // 必須typedef
  typedef figure_vertexの配列(組み込みは現状不可。arrayかvectorを使ってもらう) vertex_array_type;
  typedef figure_vertex vertex_type;
  // 図形の頂点配列を返す
  vertex_array_type vertex() const;
  // 図形のフォーマットを返す
  primitive_format primitive() const;
  // 図形の合成方式を返す
  blend_mode blend() const;
  // 変形基準座標を返す
  vector2 base_point() const;
};

で、これを元に四角形クラスを作るとして当初考えていたのは、

class box {
 public:
  typedef std::array<figure_vertex, 4> vertex_array_type;
  typedef figure_vertex vertex_type;
  box(float width, float height);
  // 左上(0, 0)、右下(width, height)の長方形座標を返す
  vertex_array_type vertex() const;
  // 図形のフォーマットを返す
  primitive_format primitive() const;
  // 図形の合成方式を返す
  blend_mode blend() const;
  // 変形基準座標(0, 0)を返す
  vector2 base_point() const;

という感じのものです。ところが4頂点をそれぞれダイレクトに指定したいという要望があるかもしれないので、もう一段rectangle_baseという感じのクラスを用意したほうがいい気がしてきました。

class rectangle_base {
 public:
  typedef std::array<figure_vertex, 4> vertex_array_type;
  typedef figure_vertex vertex_type;
  // 適当な四角形座標を返す
  vertex_array_type vertex() const;
  // 図形のフォーマットを返す
  primitive_format primitive() const;
  // 図形の合成方式を返す
  blend_mode blend() const;
  // 適当な変形基準座標を返す
  vector2 base_point() const;

で、こいつを利用して色々実装するわけです。

class box {
 public:
  box(float width, float height);
  // 左上(0, 0)、右下(width, height)の長方形座標を返す
  vertex_array_type vertex() const;
  // 変形基準座標(0, 0)を返す
  vector2 base_point() const;
 private:
  rectangle_base base_;
};

class rectangle {
 public:
  rectangle(const vector2 &pos1, const vector2 &pos2, const vector2 &pos3, const vector2 &pos4);
  // pos1,pos2,pos3,pos4を頂点とする四角形座標を返す
  vertex_array_type vertex() const;
  // 変形基準座標として左上の座標を返す
  vector2 base_point() const;
 private:
  rectangle_base base_;
};

なんか別々に書く場合と比べてあんまりコード書く量が減らない感じがします。has_aというよりもis_aな感じがするので継承にしてもいいのですが(というかした方が多分大分コード量減る)、最近仮想関数がマイブームではないのでなんか敬遠してしまいます。
う〜ん。rectangle_baseはあった方がいいのでしょうか。あった方がいいとするとやっぱり継承ベースにした方がいいのでしょうか。するとするとvirtual vertex_array_type vertex() const; virtual vector2 base_point() const;と仮想デストラクタが付くわけですか・・・。