Skip to content

srcs__world__mesh_builder_cpp

Ishi_eenn edited this page May 19, 2026 · 2 revisions

srcs/world/mesh_builder.cpp

役割

チャンクのブロック配列から、実際に見える面だけを頂点/インデックスに変換する。水は透明描画用に別インデックスへ分ける。

関数一覧

  • getAtlasUV: 行 65-79
  • MeshBuilder::getNeighborBlock: 行 87-108
  • MeshBuilder::getNeighborWaterLevel: 行 111-131
  • MeshBuilder::getWaterSurfaceHeight: 行 139-152
  • MeshBuilder::computeWaterTopHeights: 行 160-188
  • getFaceTopHeight: 行 191-199
  • getFaceAverageHeight: 行 202-205
  • MeshBuilder::addFace: 行 214-267
  • MeshBuilder::build: 行 280-352

関数ごとの説明

getAtlasUV

  • 場所: 行 65-79
  • シグネチャ: static void getAtlasUV(BlockType type, Face face, float& u0, float& v0, float& uw, float& vh)
  • 内容: 内部状態または計算結果を取得して返す。
  • 主な呼び出し: getAtlasUV()

MeshBuilder::getNeighborBlock

  • 場所: 行 87-108
  • シグネチャ: BlockType MeshBuilder::getNeighborBlock( int nx, int ny, int nz, const Chunk& chunk, const ChunkNeighbors& nb)
  • 内容: 内部状態または計算結果を取得して返す。
  • 主な呼び出し: getBlock()

MeshBuilder::getNeighborWaterLevel

  • 場所: 行 111-131
  • シグネチャ: uint8_t MeshBuilder::getNeighborWaterLevel( int nx, int ny, int nz, const Chunk& chunk, const ChunkNeighbors& nb)
  • 内容: 内部状態または計算結果を取得して返す。
  • 主な呼び出し: getWaterLevel()

MeshBuilder::getWaterSurfaceHeight

  • 場所: 行 139-152
  • シグネチャ: float MeshBuilder::getWaterSurfaceHeight( int x, int y, int z, const Chunk& chunk, const ChunkNeighbors& neighbors)
  • 内容: 内部状態または計算結果を取得して返す。
  • 主な呼び出し: getNeighborBlock(), getNeighborWaterLevel()

MeshBuilder::computeWaterTopHeights

  • 場所: 行 160-188
  • シグネチャ: void MeshBuilder::computeWaterTopHeights( float out[4], int x, int y, int z, const Chunk& chunk, const ChunkNeighbors& neighbors)
  • 内容: このファイルの責務に沿った補助処理を行う。
  • 主な呼び出し: getNeighborBlock(), max(), getWaterSurfaceHeight()

getFaceTopHeight

  • 場所: 行 191-199
  • シグネチャ: static float getFaceTopHeight(const float water_top[4], Face face, int vertex_index)
  • 内容: 内部状態または計算結果を取得して返す。
  • 主な呼び出し: getFaceTopHeight()

getFaceAverageHeight

  • 場所: 行 202-205
  • シグネチャ: static float getFaceAverageHeight(const float water_top[4], Face face)
  • 内容: 内部状態または計算結果を取得して返す。
  • 主な呼び出し: getFaceAverageHeight(), getFaceTopHeight()

MeshBuilder::addFace

  • 場所: 行 214-267
  • シグネチャ: void MeshBuilder::addFace( std::vector<Vertex>& verts, std::vector<uint32_t>& indices, int x, int y, int z, Face face, BlockType type, const Chunk& chunk, const ChunkNeighbors& neighbors)
  • 内容: このファイルの責務に沿った補助処理を行う。
  • 主な呼び出し: getAtlasUV(), float(), size(), computeWaterTopHeights(), getFaceTopHeight(), push_back()

手順:

  1. 入力値や現在状態を検査し、処理すべき条件を絞る。
  2. 対象範囲やキューをループで走査する。
  3. 必要な参照データや現在状態を取得する。
  4. 計算結果を内部状態、配列、キュー、または対象オブジェクトへ反映する。

MeshBuilder::build

  • 場所: 行 280-352
  • シグネチャ: void MeshBuilder::build(Chunk& chunk, const ChunkNeighbors& neighbors)
  • 内容: チャンク全体を走査し、空気に接して見える面だけを頂点化する。不透明面と水面を別インデックスに分ける。
  • 主な呼び出し: build(), clear(), reserve(), getBlock(), getNeighborBlock(), addFace(), computeWaterTopHeights(), getFaceAverageHeight()

手順:

  1. 既存の頂点/インデックス配列を空にする。
  2. チャンク内の全ブロックを走査する。
  3. 空気ブロックは無視し、水と不透明ブロックを分けて扱う。
  4. 各面について隣接ブロックを調べ、隠れている面は生成しない。
  5. 見える面だけaddFaceで頂点とインデックスに変換する。
  6. 水面は高さと透明描画用インデックスを別扱いにする。
  7. メッシュ構築後、dirtyフラグを落とす。

Clone this wiki locally