From 8f56350d287b79810af1b7232fed3de760d5fc9f Mon Sep 17 00:00:00 2001 From: codereader Date: Thu, 27 Jan 2022 07:29:15 +0100 Subject: [PATCH] #5893: Add IRenderEntity::foreachSurfaceTouchingBounds to enumerate the ones intersecting with a given light. --- include/irender.h | 7 +++++++ radiantcore/entity/EntityNode.cpp | 6 ++++++ radiantcore/entity/EntityNode.h | 2 ++ .../rendersystem/LightingModeRenderResult.h | 5 ++++- .../rendersystem/OpenGLRenderSystem.cpp | 18 +++++++++++++++++- 5 files changed, 36 insertions(+), 2 deletions(-) diff --git a/include/irender.h b/include/irender.h index dcb80221d8..341103fe31 100644 --- a/include/irender.h +++ b/include/irender.h @@ -180,6 +180,13 @@ class IRenderEntity * Removes the surface from this entity. */ virtual void removeSurface(const render::IRenderableSurface::Ptr& surface) = 0; + + /** + * Enumerate all entity surfaces (partially) intersecting with the given bounds. + * The bounds are specified in world coordinates. + */ + virtual void foreachSurfaceTouchingBounds(const AABB& bounds, + const std::function& functor) = 0; }; typedef std::shared_ptr IRenderEntityPtr; typedef std::weak_ptr IRenderEntityWeakPtr; diff --git a/radiantcore/entity/EntityNode.cpp b/radiantcore/entity/EntityNode.cpp index 416a53a630..ef4b079ae4 100644 --- a/radiantcore/entity/EntityNode.cpp +++ b/radiantcore/entity/EntityNode.cpp @@ -210,6 +210,12 @@ void EntityNode::removeSurface(const render::IRenderableSurface::Ptr& surface) // TODO } +void EntityNode::foreachSurfaceTouchingBounds(const AABB& bounds, + const std::function& functor) +{ + // TODO +} + std::string EntityNode::getFingerprint() { std::map sortedKeyValues; diff --git a/radiantcore/entity/EntityNode.h b/radiantcore/entity/EntityNode.h index 79fc13dae5..cdf3b9e613 100644 --- a/radiantcore/entity/EntityNode.h +++ b/radiantcore/entity/EntityNode.h @@ -126,6 +126,8 @@ class EntityNode : virtual void addSurface(const render::IRenderableSurface::Ptr& surface) override; virtual void removeSurface(const render::IRenderableSurface::Ptr& surface) override; + virtual void foreachSurfaceTouchingBounds(const AABB& bounds, + const std::function& functor) override; // IMatrixTransform implementation Matrix4 localToParent() const override { return _localToParent; } diff --git a/radiantcore/rendersystem/LightingModeRenderResult.h b/radiantcore/rendersystem/LightingModeRenderResult.h index 2031f0b7a0..c3df1973dc 100644 --- a/radiantcore/rendersystem/LightingModeRenderResult.h +++ b/radiantcore/rendersystem/LightingModeRenderResult.h @@ -13,9 +13,12 @@ class LightingModeRenderResult : std::size_t visibleLights = 0; std::size_t skippedLights = 0; + std::size_t entities = 0; + std::size_t surfaces = 0; + std::string toString() override { - return fmt::format("Lights: {0} of {1}", visibleLights, skippedLights); + return fmt::format("Lights: {0} of {1} | Entities: {2} | Surfaces: {3}", visibleLights, skippedLights, entities, surfaces); } }; diff --git a/radiantcore/rendersystem/OpenGLRenderSystem.cpp b/radiantcore/rendersystem/OpenGLRenderSystem.cpp index 723335c579..0cbfc701b6 100644 --- a/radiantcore/rendersystem/OpenGLRenderSystem.cpp +++ b/radiantcore/rendersystem/OpenGLRenderSystem.cpp @@ -310,7 +310,23 @@ IRenderResult::Ptr OpenGLRenderSystem::renderLitScene(RenderStateFlags globalFla result->visibleLights++; - // TODO: Insert rendering code here + // Now check all the entities intersecting with this light + for (const auto& entity : _entities) + { + auto entitySurfaceCount = 0; + + entity->foreachSurfaceTouchingBounds(light->lightAABB(), + [&](const render::IRenderableSurface::Ptr& surface) + { + entitySurfaceCount++; + }); + + if (entitySurfaceCount > 0) + { + result->surfaces += entitySurfaceCount; + result->entities++; + } + } } finishRendering();