quad treeとかめんどいんで

物凄く広いマップデータのメッシュを処理しなくてはならないことになりました。(というかしました。)マップは広々としたランドスケープではなくて、多数の部屋の集合として作られるようで、部屋ごとに区切って描画したり地面や壁との衝突判定をする必要が多分でてきます。こんな感じにしました。この前のGoogle Code Jamの波紋問題の解き方が参考になりました。惨敗したけど参加したのは無駄ではなかったな。

mapのキーになるクラスを定義。例えばメッシュをxz平面で単位方形に区切りたいなら…


class GeomMapKey
{
public:
GeomMapKey() { m_key = 0x7fffffff7fffffffi64; }
GeomMapKey(float x, float z) { Apply(x,z); }
GeomMapKey(const GeomMapKey& src) { m_key = src.m_key; }

void Apply(float x, float z)
{
if(x < 0) x -= CLIP_CLUSTER_SIZE;
if(z < 0) z -= CLIP_CLUSTER_SIZE;

x /= CLIP_CLUSTER_SIZE;
z /= CLIP_CLUSTER_SIZE;

m_key = ((__int64)(int)x) << 32 | ((0xffffffff) & (int)z);

}

bool operator<(const GeomMapKey& g) const { return m_key < g.m_key; }
private:
__int64 m_key;
};

そしてこんな感じの入れ物を用意して

map m_terrain_indices_map;
区分け部分に属する面をindex bufferへぶち込むわけです。GeomMapKeyの内容を変えれば区分けの方法は簡単に変更できます。とってもフレキシブル。