From 625b78bba16dcbbe97fa84bbf8f2273472d79ade Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Thu, 6 Mar 2025 00:25:22 +0000 Subject: Pass frustum into render functions Support for culling objects outside the view frustum --- ui/editNetwork.cpp | 8 ++++---- ui/editNetwork.h | 4 ++-- ui/gameMainSelector.cpp | 6 +++--- ui/gameMainSelector.h | 4 ++-- ui/gameMainWindow.cpp | 8 ++++---- ui/gameMainWindow.h | 2 +- ui/worldOverlay.h | 3 ++- 7 files changed, 18 insertions(+), 17 deletions(-) (limited to 'ui') diff --git a/ui/editNetwork.cpp b/ui/editNetwork.cpp index c4c0297..2887491 100644 --- a/ui/editNetwork.cpp +++ b/ui/editNetwork.cpp @@ -48,19 +48,19 @@ EditNetwork::handleInput(const SDL_Event & e, const UIComponent::Position & pare } void -EditNetwork::render(const SceneShader & shader) const +EditNetwork::render(const SceneShader & shader, const Frustum & frustum) const { if (builder) { blue.bind(); shader.absolute.use(); - builder->render(shader); + builder->render(shader, frustum); } } void -EditNetwork::Builder::render(const SceneShader & shader) const +EditNetwork::Builder::render(const SceneShader & shader, const Frustum & frustum) const { - candidateLinks.apply(&Renderable::render, shader); + candidateLinks.apply(&Renderable::render, shader, frustum); } void diff --git a/ui/editNetwork.h b/ui/editNetwork.h index 2ae467d..ae887bd 100644 --- a/ui/editNetwork.h +++ b/ui/editNetwork.h @@ -18,7 +18,7 @@ public: bool click(const SDL_MouseButtonEvent & e, const Ray &) override; bool move(const SDL_MouseMotionEvent & e, const Ray &) override; bool handleInput(const SDL_Event & e, const UIComponent::Position &) override; - void render(const SceneShader &) const override; + void render(const SceneShader &, const Frustum &) const override; void render(const UIShader & shader, const UIComponent::Position & pos) const override; using NetworkClickPos = std::variant; @@ -26,7 +26,7 @@ public: class Builder { public: virtual ~Builder() = default; - virtual void render(const SceneShader & shader) const; + virtual void render(const SceneShader & shader, const Frustum &) const; virtual std::string hint() const = 0; virtual void click(Network *, const GeoData *, const SDL_MouseButtonEvent &, const Ray &) = 0; virtual void move(Network *, const GeoData *, const SDL_MouseMotionEvent &, const Ray &) = 0; diff --git a/ui/gameMainSelector.cpp b/ui/gameMainSelector.cpp index a817f69..23ae8c0 100644 --- a/ui/gameMainSelector.cpp +++ b/ui/gameMainSelector.cpp @@ -33,10 +33,10 @@ GameMainSelector::render(const UIShader & shader, const Position & parentPos) co } void -GameMainSelector::render(const SceneShader & shader) const +GameMainSelector::render(const SceneShader & shader, const Frustum & frustum) const { if (target) { - target->render(shader); + target->render(shader, frustum); } } @@ -115,6 +115,6 @@ GameMainSelector::Component::render(const UIShader &, const UIComponent::Positio } void -GameMainSelector::Component::render(const SceneShader &) const +GameMainSelector::Component::render(const SceneShader &, const Frustum &) const { } diff --git a/ui/gameMainSelector.h b/ui/gameMainSelector.h index ccf0fa0..e715823 100644 --- a/ui/gameMainSelector.h +++ b/ui/gameMainSelector.h @@ -24,13 +24,13 @@ public: virtual bool move(const SDL_MouseMotionEvent &, const Ray &); virtual bool handleInput(const SDL_Event &, const Position & pos); virtual void render(const UIShader & shader, const Position & pos) const; - virtual void render(const SceneShader &) const; + virtual void render(const SceneShader &, const Frustum &) const; }; GameMainSelector(const Camera * c, ScreenAbsCoord size); void render(const UIShader & shader, const Position & pos) const override; - void render(const SceneShader & shader) const override; + void render(const SceneShader & shader, const Frustum &) const override; bool handleInput(const SDL_Event & e, const Position &) override; diff --git a/ui/gameMainWindow.cpp b/ui/gameMainWindow.cpp index c53300b..3403afa 100644 --- a/ui/gameMainWindow.cpp +++ b/ui/gameMainWindow.cpp @@ -54,15 +54,15 @@ GameMainWindow::render() const } void -GameMainWindow::content(const SceneShader & shader) const +GameMainWindow::content(const SceneShader & shader, const Frustum & frustum) const { for (const auto & [id, asset] : gameState->assets) { if (const auto r = std::dynamic_pointer_cast(asset)) { - r->render(shader); + r->render(shader, frustum); } } - gameState->world.apply(&Renderable::render, shader); - uiComponents.apply(&WorldOverlay::render, shader); + gameState->world.apply(&Renderable::render, shader, frustum); + uiComponents.apply(&WorldOverlay::render, shader, frustum); } void diff --git a/ui/gameMainWindow.h b/ui/gameMainWindow.h index fcbd135..112d23b 100644 --- a/ui/gameMainWindow.h +++ b/ui/gameMainWindow.h @@ -17,7 +17,7 @@ public: void render() const override; private: - void content(const SceneShader &) const override; + void content(const SceneShader &, const Frustum &) const override; void environment(const SceneShader &, const SceneRenderer &) const override; void lights(const SceneShader &) const override; void shadows(const ShadowMapper &) const override; diff --git a/ui/worldOverlay.h b/ui/worldOverlay.h index 18fab3f..a0f3b65 100644 --- a/ui/worldOverlay.h +++ b/ui/worldOverlay.h @@ -1,9 +1,10 @@ #pragma once class SceneShader; +class Frustum; class WorldOverlay { public: virtual ~WorldOverlay() = default; - virtual void render(const SceneShader &) const = 0; + virtual void render(const SceneShader &, const Frustum &) const = 0; }; -- cgit v1.2.3 From 194148abd9ab89a5a514a37b7717b7c4de6aa758 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Mon, 10 Mar 2025 02:12:16 +0000 Subject: Pass a Frustum to shadow renderers The frustum might not be correct at this stage. --- game/scenary/foliage.cpp | 2 +- game/scenary/foliage.h | 2 +- game/terrain.cpp | 2 +- game/terrain.h | 2 +- game/vehicles/railVehicleClass.cpp | 2 +- game/vehicles/railVehicleClass.h | 2 +- gfx/aabb.h | 2 +- gfx/gl/sceneProvider.cpp | 2 +- gfx/gl/sceneProvider.h | 2 +- gfx/gl/shadowMapper.cpp | 9 ++++++++- gfx/renderable.cpp | 2 +- gfx/renderable.h | 2 +- test/test-assetFactory.cpp | 4 ++-- test/test-geoData.cpp | 4 ++-- test/test-render.cpp | 14 +++++++------- ui/gameMainWindow.cpp | 6 +++--- ui/gameMainWindow.h | 2 +- 17 files changed, 34 insertions(+), 27 deletions(-) (limited to 'ui') diff --git a/game/scenary/foliage.cpp b/game/scenary/foliage.cpp index c1bf9b9..159a078 100644 --- a/game/scenary/foliage.cpp +++ b/game/scenary/foliage.cpp @@ -41,7 +41,7 @@ Foliage::render(const SceneShader & shader, const Frustum &) const } void -Foliage::shadows(const ShadowMapper & mapper) const +Foliage::shadows(const ShadowMapper & mapper, const Frustum &) const { if (const auto count = instances.size()) { const auto dimensions = bodyMesh->getDimensions(); diff --git a/game/scenary/foliage.h b/game/scenary/foliage.h index 422c7aa..71bc734 100644 --- a/game/scenary/foliage.h +++ b/game/scenary/foliage.h @@ -25,7 +25,7 @@ public: mutable InstanceVertices instances; void render(const SceneShader &, const Frustum &) const override; - void shadows(const ShadowMapper &) const override; + void shadows(const ShadowMapper &, const Frustum &) const override; void updateStencil(const ShadowStenciller &) const override; glTexture shadowStencil = ShadowStenciller::createStencilTexture(256, 256); diff --git a/game/terrain.cpp b/game/terrain.cpp index 577d9e5..e9e9463 100644 --- a/game/terrain.cpp +++ b/game/terrain.cpp @@ -128,7 +128,7 @@ Terrain::render(const SceneShader & shader, const Frustum & frustum) const } void -Terrain::shadows(const ShadowMapper & shadowMapper) const +Terrain::shadows(const ShadowMapper & shadowMapper, const Frustum &) const { shadowMapper.landmess.use(); for (const auto & [surface, sab] : meshes) { diff --git a/game/terrain.h b/game/terrain.h index 5f03634..eaec01d 100644 --- a/game/terrain.h +++ b/game/terrain.h @@ -17,7 +17,7 @@ public: } void render(const SceneShader & shader, const Frustum &) const override; - void shadows(const ShadowMapper &) const override; + void shadows(const ShadowMapper &, const Frustum &) const override; void tick(TickDuration) override; diff --git a/game/vehicles/railVehicleClass.cpp b/game/vehicles/railVehicleClass.cpp index 179b570..162a29a 100644 --- a/game/vehicles/railVehicleClass.cpp +++ b/game/vehicles/railVehicleClass.cpp @@ -47,7 +47,7 @@ RailVehicleClass::render(const SceneShader & shader, const Frustum &) const } void -RailVehicleClass::shadows(const ShadowMapper & mapper) const +RailVehicleClass::shadows(const ShadowMapper & mapper, const Frustum &) const { if (const auto count = static_cast(instances.size())) { mapper.dynamicPointInst.use(); diff --git a/game/vehicles/railVehicleClass.h b/game/vehicles/railVehicleClass.h index 2c1fd2b..6eb4ca5 100644 --- a/game/vehicles/railVehicleClass.h +++ b/game/vehicles/railVehicleClass.h @@ -15,7 +15,7 @@ class Location; class RailVehicleClass : public Renderable, public Asset { public: void render(const SceneShader & shader, const Frustum &) const override; - void shadows(const ShadowMapper & shadowMapper) const override; + void shadows(const ShadowMapper & shadowMapper, const Frustum &) const override; struct LocationVertex { glm::mat3 body, front, back; diff --git a/gfx/aabb.h b/gfx/aabb.h index a661f66..ce15a0f 100644 --- a/gfx/aabb.h +++ b/gfx/aabb.h @@ -37,5 +37,5 @@ public: })); } - V min, max; + V min {}, max {}; }; diff --git a/gfx/gl/sceneProvider.cpp b/gfx/gl/sceneProvider.cpp index 4e271db..e01532e 100644 --- a/gfx/gl/sceneProvider.cpp +++ b/gfx/gl/sceneProvider.cpp @@ -9,6 +9,6 @@ SceneProvider::environment(const SceneShader &, const SceneRenderer & renderer) } void -SceneProvider::shadows(const ShadowMapper &) const +SceneProvider::shadows(const ShadowMapper &, const Frustum &) const { } diff --git a/gfx/gl/sceneProvider.h b/gfx/gl/sceneProvider.h index 93b384f..f6b7009 100644 --- a/gfx/gl/sceneProvider.h +++ b/gfx/gl/sceneProvider.h @@ -16,5 +16,5 @@ public: virtual void content(const SceneShader &, const Frustum &) const = 0; virtual void environment(const SceneShader &, const SceneRenderer &) const; virtual void lights(const SceneShader &) const = 0; - virtual void shadows(const ShadowMapper &) const; + virtual void shadows(const ShadowMapper &, const Frustum &) const; }; diff --git a/gfx/gl/shadowMapper.cpp b/gfx/gl/shadowMapper.cpp index 231f203..dc461e0 100644 --- a/gfx/gl/shadowMapper.cpp +++ b/gfx/gl/shadowMapper.cpp @@ -118,7 +118,14 @@ ShadowMapper::update(const SceneProvider & scene, const LightDirection & dir, co &landmess, &dynamicPoint, &dynamicPointInst, &dynamicPointInstWithTextures, &stencilShadowProgram}) { p->setView(out, sizes, lightViewPoint); } - scene.shadows(*this); + ExtentsBoundingBox extents; + for (const auto & point : bandViewExtents.back()) { + extents += point; + } + const auto lightProjection + = glm::ortho(extents.min.x, extents.max.x, extents.min.y, extents.max.y, -extents.max.z, -extents.min.z); + Frustum frustum {lightViewPoint, lightViewDir, lightProjection}; + scene.shadows(*this, frustum); glCullFace(GL_BACK); diff --git a/gfx/renderable.cpp b/gfx/renderable.cpp index 3594968..27f2459 100644 --- a/gfx/renderable.cpp +++ b/gfx/renderable.cpp @@ -6,7 +6,7 @@ Renderable::lights(const SceneShader &) const } void -Renderable::shadows(const ShadowMapper &) const +Renderable::shadows(const ShadowMapper &, const Frustum &) const { } diff --git a/gfx/renderable.h b/gfx/renderable.h index 9fbeccd..140c570 100644 --- a/gfx/renderable.h +++ b/gfx/renderable.h @@ -15,7 +15,7 @@ public: virtual void render(const SceneShader & shader, const Frustum &) const = 0; virtual void lights(const SceneShader & shader) const; - virtual void shadows(const ShadowMapper & shadowMapper) const; + virtual void shadows(const ShadowMapper & shadowMapper, const Frustum &) const; virtual void updateStencil(const ShadowStenciller & lightDir) const; }; diff --git a/test/test-assetFactory.cpp b/test/test-assetFactory.cpp index 02f0202..9bade82 100644 --- a/test/test-assetFactory.cpp +++ b/test/test-assetFactory.cpp @@ -58,10 +58,10 @@ public: } void - shadows(const ShadowMapper & mapper) const override + shadows(const ShadowMapper & mapper, const Frustum & frustum) const override { mapper.dynamicPoint.use(Location {{0, 0, 0}, {0, 0, 0}}); - objects.apply(&Renderable::shadows, mapper); + objects.apply(&Renderable::shadows, mapper, frustum); } void diff --git a/test/test-geoData.cpp b/test/test-geoData.cpp index fb8b5c5..e3ef9ad 100644 --- a/test/test-geoData.cpp +++ b/test/test-geoData.cpp @@ -273,9 +273,9 @@ BOOST_DATA_TEST_CASE(deform, loadFixtureJson("geoData/deform/ } void - shadows(const ShadowMapper & shadowMapper) const override + shadows(const ShadowMapper & shadowMapper, const Frustum & frustum) const override { - terrain.shadows(shadowMapper); + terrain.shadows(shadowMapper, frustum); } }; diff --git a/test/test-render.cpp b/test/test-render.cpp index 080e635..f205b89 100644 --- a/test/test-render.cpp +++ b/test/test-render.cpp @@ -92,12 +92,12 @@ public: } void - shadows(const ShadowMapper & shadowMapper) const override + shadows(const ShadowMapper & shadowMapper, const Frustum & frustum) const override { - terrain->shadows(shadowMapper); - std::ranges::for_each(gameState->assets, [&shadowMapper](const auto & asset) { + terrain->shadows(shadowMapper, frustum); + std::ranges::for_each(gameState->assets, [&shadowMapper, &frustum](const auto & asset) { if (const auto renderable = std::dynamic_pointer_cast(asset.second)) { - renderable->shadows(shadowMapper); + renderable->shadows(shadowMapper, frustum); } }); } @@ -190,9 +190,9 @@ BOOST_AUTO_TEST_CASE(terrain) } void - shadows(const ShadowMapper & shadowMapper) const override + shadows(const ShadowMapper & shadowMapper, const Frustum & frustum) const override { - terrain->shadows(shadowMapper); + terrain->shadows(shadowMapper, frustum); } }; @@ -237,7 +237,7 @@ BOOST_AUTO_TEST_CASE(railnet) } void - shadows(const ShadowMapper &) const override + shadows(const ShadowMapper &, const Frustum &) const override { } }; diff --git a/ui/gameMainWindow.cpp b/ui/gameMainWindow.cpp index 3403afa..f63137c 100644 --- a/ui/gameMainWindow.cpp +++ b/ui/gameMainWindow.cpp @@ -78,12 +78,12 @@ GameMainWindow::lights(const SceneShader & shader) const } void -GameMainWindow::shadows(const ShadowMapper & shadowMapper) const +GameMainWindow::shadows(const ShadowMapper & shadowMapper, const Frustum & frustum) const { for (const auto & [id, asset] : gameState->assets) { if (const auto r = std::dynamic_pointer_cast(asset)) { - r->shadows(shadowMapper); + r->shadows(shadowMapper, frustum); } } - gameState->world.apply(&Renderable::shadows, shadowMapper); + gameState->world.apply(&Renderable::shadows, shadowMapper, frustum); } diff --git a/ui/gameMainWindow.h b/ui/gameMainWindow.h index 112d23b..43980e8 100644 --- a/ui/gameMainWindow.h +++ b/ui/gameMainWindow.h @@ -20,5 +20,5 @@ private: void content(const SceneShader &, const Frustum &) const override; void environment(const SceneShader &, const SceneRenderer &) const override; void lights(const SceneShader &) const override; - void shadows(const ShadowMapper &) const override; + void shadows(const ShadowMapper &, const Frustum &) const override; }; -- cgit v1.2.3