勢いで作ってたけど、なんとなくつくり方がわかってきたので、自分のためにもまとめていきます
描画するものは、
・頂点
・辺
・面
・ボタンなどUI
があるけど、取り敢えず頂点を描画させるのをまずやるのがいいと思う
面とかはマテリアルとかを意識しないといけないけど、頂点は描画周りの基礎ができれば行けるので・・・
あと、構造について
上に書いたとおりまずは頂点を描画させることを目標としてつくります
なので頂点の描画を中心に考えてみた
・WorldOperatorクラス
・WorldBaseクラス
・VertexOperatorクラス
・VertexBaseクラス
・FaceOperatorクラス
・FaceBaseクラス
・Drawクラス
今すぐに決められるものだけ書きました
マテリアルとかは複雑なので今度に(後回し\(^o^)/)
Drawクラスは描画に関することを行います
WorldOperator、WorldBaseクラスですが、オブジェクトを作るときに、仕事場を分けられたほうが便利じゃないかなーと思って作りました
WolrdBaseクラスがその仕事場に関する情報が入ってて、それをWorldOperatorがまとめます
ではそのWorldBaseクラスについて・・・
VertexOperator、FaceOperatorはそれぞれ頂点と面に関する情報を扱います
で、VertexBaseが1つの頂点、FaceBaseが1つの面に関することです
多分VertexBase、VertexOperatorは特につまずかずに作れると思います
面なんですけどね~、色々めんどそうです
まず、何角形でも登録できるようにしたいので、頂点の数から始まります
あ、あと、頂点はVertexOperator内での頂点のID的なので管理します(DirectXもそんなかんじだよね)
マテリアルを適用したいんですけど、ここがネック・・・
SetTextureなどで、テクスチャーをセットするのって結構重いじゃないですか
なので、なるべくSetTextureを使わないようにするんですけど・・・
面によってテクスチャーはばらばらなので、マテリアル順でソートしないといけないかもしれません
ソートの方法はまだ考えてないっす・・・
途中でマテリアルを消されたりすると面倒なんだよな・・・
作ってた時に思ったことが1つ
このソフトは、IDirect3DVertexBuffer9に情報を入れて、StreamSourceなどを利用して描画しようと思ってるんですけど、
頂点の数が少しでも変われば、VerytexBufferを作り直さないといけないっぽいです
だったら動的な頂点バッファにすればいいかとも思いましたけど、そこまででもない気がします(1フレームごとに頂点の数がかわるとかでは無いので)
あと、VertexBufferのロックは結構遅いと言われてます
なので、なるべくロック、バッファーの作り直しを少なめにするべきです
最初はWorldBaseクラスで頂点バッファを管理しようとしましたけど、それだと頂点の情報がどう変わったかなどを監視しにくいため、
WorldBaseとVertexOperatorで頂点バッファーを共有することにしました
正確には、WorldBaseとVertexOperator両方が同じ頂点バッファーのポインターを持っている
これで、頂点バッファーの中身の書き換えはVertexOperator内で、
描画はWolrdBaseで
と役割分担をします
幸いCOMポインターも作ったので、すぐプログラムを組めそうです
今のところこんな感じですけど、作る!って決めた頃よりは形になってきた気がします(当たり前か(^_^;)
でも、今までのプログラムを消して、作り直そうかなー
それはもったいないよな
でもそしたら新しいプロジェクトの名前、何にするか・・・