CMeshを変更しよう(2)

早速CMeshを変更してみました。まだ途中なので、頂点はまだ構造体を使っています。

class CMesh {
  vector<SMaterial*> m_materials;
  vector<SVertex> m_verts;
  vector< vector<SPolygon> > m_faces;
}

ちょこちょこっと書き換えるだけなので、メッシュのロードと描画はうまくいきました。ですが若干問題が発生。それは、「m_vertsをpublicにしていいのか」ということです。CMeshSubsetではm_vertsをpublicにして堂々と使っていたのですが、CMeshが直にm_vertsを持つ今、果たしてpublicにしてもおかしくないだろうかと頭を悩ませています。
ちなみに、DirectXのID3DXBasicMeshではVertexBufferとして持たせているので、LockをしてからGet*()で取得してからアクセスする必要があるようです。ってことは、m_vertsをprivateにして、GetVerts()というアクセス用のメソッドを作ってやれば万事OKかな? しかし、そうするのならばm_vertsには"vector"を使うのではなく、"SVertex*"で済ませたいものです。vectorを使っている以上、もし頂点が100万個のメッシュを扱った際には、頂点200万個分のメモリを確保してしまいそうですし、vectorでなければVBOを使うのにもすぐに移行できますし。
そんなわけで、m_vertsをSVertex*にしたいのですが、どうやれば実現できるのでしょう。3dsファイルから読み込んでいるのですが、3dsのフォーマットだとファイルをひと通り読むまでは頂点数がわからないので、newで一気にメモリを確保することができません。今のようにm_vertsをvectorとして持つCMeshTempなんてクラスを作り、そこからCMeshを作るというやり方が一番簡単だと思うんですがどうなんでしょう。あるいは、独自のファイル形式を吐き出すコンバーターを作って、独自ファイルから直接読み込んでもいいかもしれません。
そのあたり、DirectXは内部でどうやっているのだろうと思い調べていたら、ここにヒットしました。http://d.hatena.ne.jp/NyaRuRu/20040602 今考えていたこととは直接の関係はないのですが、D3DXMeshの構造について触れているのでメモメモ。なるほど、Attibute Tablesといものがあるのか。DrawSubset()に渡すのはこのIDなわけですね。マテリアルの違いだけでなく、他の要因でもFACEをグループ化しているようです。
……で、結局どうすればいいのかはわからずじまい。コンバーターを作るのが一番綺麗に収まるかなぁ。よし、勇気を振り絞ってBBXあたりに質問してみよう。