summaryrefslogtreecommitdiff
path: root/game/terrain.cpp
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2025-03-07 20:35:42 +0000
committerDan Goodliffe <dan@randomdan.homeip.net>2025-03-11 01:13:59 +0000
commitaf6b27fa0a3b16d7d0fe7f7be33109af1dcf5f88 (patch)
treef5b76d6ce4a08c53415cf1b72708f32c2cf5c506 /game/terrain.cpp
parentAxisAlignedBoundingBox construct from range instead of span (diff)
downloadilt-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.cpp14
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) {