diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2025-03-07 20:35:42 +0000 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2025-03-11 01:13:59 +0000 |
commit | af6b27fa0a3b16d7d0fe7f7be33109af1dcf5f88 (patch) | |
tree | f5b76d6ce4a08c53415cf1b72708f32c2cf5c506 /game/terrain.cpp | |
parent | AxisAlignedBoundingBox construct from range instead of span (diff) | |
download | ilt-af6b27fa0a3b16d7d0fe7f7be33109af1dcf5f88.tar.bz2 ilt-af6b27fa0a3b16d7d0fe7f7be33109af1dcf5f88.tar.xz ilt-af6b27fa0a3b16d7d0fe7f7be33109af1dcf5f88.zip |
Construct terrain tile AxisAlignedBoundingBox during mesh generation
No surface is simply the tile bounds, but with a surface, it's
constrained to just the bounds of the surface itself.
Diffstat (limited to 'game/terrain.cpp')
-rw-r--r-- | game/terrain.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/game/terrain.cpp b/game/terrain.cpp index 9202d20..dae295a 100644 --- a/game/terrain.cpp +++ b/game/terrain.cpp @@ -77,6 +77,16 @@ Terrain::generateMeshes() .data(verticesBuffer, GL_ARRAY_BUFFER); } meshItr->second.count = static_cast<GLsizei>(indices.size()); + if (!surfaceKey.surface) { + meshItr->second.aabb = {{surfaceKey.basePosition * TILE_SIZE || getExtents().min.z}, + {(surfaceKey.basePosition + 1) * TILE_SIZE || getExtents().max.z}}; + } + else { + meshItr->second.aabb = AxisAlignedBoundingBox::fromPoints( + indices | std::views::transform([this](const auto vertex) -> GlobalPosition3D { + return this->point(VertexHandle {static_cast<int>(vertex)}); + })); + } } if (meshes.size() > surfaceIndices.size()) { std::erase_if(meshes, [&surfaceIndices](const auto & mesh) { @@ -102,9 +112,7 @@ Terrain::render(const SceneShader & shader, const Frustum & frustum) const grass->bind(); std::ranges::for_each(meshes, [ext = getExtents(), &frustum](const auto & surfaceDef) { - const AxisAlignedBoundingBox tileAabb {{surfaceDef.first.basePosition * TILE_SIZE || ext.min.z}, - {(surfaceDef.first.basePosition + 1) * TILE_SIZE || ext.max.z}}; - surfaceDef.second.visible = frustum.contains(tileAabb); + surfaceDef.second.visible = frustum.contains(surfaceDef.second.aabb); }); const auto chunkBySurface = std::views::chunk_by([](const auto & itr1, const auto & itr2) { |