From 9b4adc6488b4e16da0598cfc9c46265f2f0eaacb Mon Sep 17 00:00:00 2001 From: codereader Date: Sat, 12 Feb 2022 08:29:37 +0100 Subject: [PATCH] #5893: Move common code to RenderableCollectorBase. Migrate the RenderFixture and two unit tests. --- libs/render/CamRenderer.h | 25 ------------- libs/render/RenderableCollectorBase.h | 32 ++++++++++++++++ radiant/xyview/XYRenderer.h | 24 ------------ test/Entity.cpp | 54 +++++++++++++-------------- 4 files changed, 59 insertions(+), 76 deletions(-) diff --git a/libs/render/CamRenderer.h b/libs/render/CamRenderer.h index 47b1a9ade5..28d3767bda 100644 --- a/libs/render/CamRenderer.h +++ b/libs/render/CamRenderer.h @@ -36,9 +36,6 @@ class CamRenderer : int _totalLights = 0; int _visibleLights = 0; - // Highlight state - std::size_t _flags = Highlight::Flags::NoHighlight; - const HighlightShaders& _shaders; // All lights we have received from the scene @@ -163,23 +160,6 @@ class CamRenderer : bool supportsFullMaterials() const override { return true; } - bool hasHighlightFlags() const override - { - return _flags != 0; - } - - void setHighlightFlag(Highlight::Flags flags, bool enabled) override - { - if (enabled) - { - _flags |= flags; - } - else - { - _flags &= ~flags; - } - } - void addLight(const RendererLight& light) override { // Determine if this light is visible within the view frustum @@ -197,11 +177,6 @@ class CamRenderer : ++_totalLights; } - void processRenderable(Renderable& renderable, const VolumeTest& volume) override - { - renderable.onPreRender(volume); - } - void addRenderable(Shader& shader, const OpenGLRenderable& renderable, const Matrix4& localToWorld, diff --git a/libs/render/RenderableCollectorBase.h b/libs/render/RenderableCollectorBase.h index 2ad57070b4..d0313e2f4d 100644 --- a/libs/render/RenderableCollectorBase.h +++ b/libs/render/RenderableCollectorBase.h @@ -18,7 +18,39 @@ namespace render class RenderableCollectorBase : public IRenderableCollector { +protected: + std::size_t _flags; + public: + RenderableCollectorBase() : + _flags(Highlight::Flags::NoHighlight) + {} + + virtual ~RenderableCollectorBase() + {} + + virtual bool hasHighlightFlags() const override + { + return _flags != 0; + } + + virtual void setHighlightFlag(Highlight::Flags flags, bool enabled) override + { + if (enabled) + { + _flags |= flags; + } + else + { + _flags &= ~flags; + } + } + + virtual void processRenderable(Renderable& renderable, const VolumeTest& volume) override + { + renderable.onPreRender(volume); + } + virtual void processNode(const scene::INodePtr& node, const VolumeTest& volume) { node->onPreRender(volume); diff --git a/radiant/xyview/XYRenderer.h b/radiant/xyview/XYRenderer.h index 31de9a4693..8e1de934a2 100644 --- a/radiant/xyview/XYRenderer.h +++ b/radiant/xyview/XYRenderer.h @@ -20,7 +20,6 @@ class XYRenderer : }; private: - std::size_t _flags; RenderStateFlags _globalstate; IMap::EditMode _editMode; @@ -29,7 +28,6 @@ class XYRenderer : public: XYRenderer(RenderStateFlags globalstate, const HighlightShaders& shaders) : - _flags(Highlight::Flags::NoHighlight), _globalstate(globalstate), _editMode(GlobalMapModule().getEditMode()), _shaders(shaders) @@ -40,31 +38,9 @@ class XYRenderer : return false; } - bool hasHighlightFlags() const override - { - return _flags != 0; - } - - void setHighlightFlag(Highlight::Flags flags, bool enabled) override - { - if (enabled) - { - _flags |= flags; - } - else - { - _flags &= ~flags; - } - } - // Ortho view never processes lights void addLight(const RendererLight&) override {} - void processRenderable(Renderable& renderable, const VolumeTest& volume) override - { - renderable.onPreRender(volume); - } - void addRenderable(Shader& shader, const OpenGLRenderable& renderable, const Matrix4& localToWorld, diff --git a/test/Entity.cpp b/test/Entity.cpp index 49e4ff9c54..136435d228 100644 --- a/test/Entity.cpp +++ b/test/Entity.cpp @@ -9,6 +9,7 @@ #include "ishaders.h" #include "icolourscheme.h" #include "ieclasscolours.h" +#include "render/RenderableCollectionWalker.h" #include "render/NopVolumeTest.h" #include "string/convert.h" @@ -446,7 +447,7 @@ namespace { // A simple RenderableCollector which just logs/stores whatever is submitted struct TestRenderableCollector : - public IRenderableCollector + public render::RenderableCollectorBase { TestRenderableCollector(bool solid) : renderSolid(solid) @@ -456,6 +457,7 @@ namespace // Count of submitted renderables and lights int renderables = 0; + int highlightRenderables = 0; int lights = 0; // List of actual RendererLight objects @@ -464,6 +466,8 @@ namespace // List of renderables and their shaders std::vector< std::pair > renderablePtrs; + std::vector highlightRenderablePtrs; + void addRenderable(Shader& shader, const OpenGLRenderable& renderable, const Matrix4& localToWorld, const LitObject* litObject = nullptr, @@ -475,7 +479,10 @@ namespace void addHighlightRenderable(const OpenGLRenderable& renderable, const Matrix4& localToWorld) override - {} + { + ++highlightRenderables; + highlightRenderablePtrs.push_back(&renderable); + } void addLight(const RendererLight& light) override { @@ -484,17 +491,6 @@ namespace } bool supportsFullMaterials() const override { return true; } - bool hasHighlightFlags() const override - { - return true; - } - void setHighlightFlag(Highlight::Flags flags, bool enabled) override - {} - - void processRenderable(Renderable& renderable, const VolumeTest& volume) override - { - renderable.onPreRender(volume); - } }; // Collection of objects needed for rendering. Since not all tests require @@ -912,37 +908,41 @@ TEST_F(EntityTest, LightTransformedByParent) EXPECT_EQ(lightCount, 1) << "No light registered in the render system"; } -#if 0 TEST_F(EntityTest, RenderUnselectedLightEntity) { + RenderFixture fixture; + auto light = createByClassName("light"); - RenderFixture renderF; + scene::addNodeToContainer(light, GlobalMapModule().getRoot()); - // Render the light in wireframe mode. - light->setRenderSystem(renderF.backend); - //light->renderWireframe(renderF.collector, renderF.volumeTest); + // Run the front-end collector through the scene + render::RenderableCollectionWalker::CollectRenderablesInScene(fixture.collector, fixture.volumeTest); // Only the light origin diamond should be rendered - EXPECT_EQ(renderF.collector.renderables, 1); - EXPECT_EQ(renderF.collector.lights, 0); + EXPECT_EQ(fixture.collector.highlightRenderables, 0); + EXPECT_EQ(fixture.collector.lights, 0); } TEST_F(EntityTest, RenderSelectedLightEntity) { + RenderFixture fixture; + auto light = createByClassName("light"); - RenderFixture renderF; + scene::addNodeToContainer(light, GlobalMapModule().getRoot()); - // Select the light then render it in wireframe mode - scene::node_cast(light)->setSelected(true); - light->setRenderSystem(renderF.backend); - //light->renderWireframe(renderF.collector, renderF.volumeTest); + // Select the light then render it + Node_setSelected(light, true); + + // Run the front-end collector through the scene + render::RenderableCollectionWalker::CollectRenderablesInScene(fixture.collector, fixture.volumeTest); // With the light selected, we should get the origin diamond, the radius and // the center vertex. - EXPECT_EQ(renderF.collector.renderables, 3); - EXPECT_EQ(renderF.collector.lights, 0); + EXPECT_EQ(fixture.collector.highlightRenderables, 2); + EXPECT_EQ(fixture.collector.lights, 0); } +#if 0 TEST_F(EntityTest, RenderLightAsLightSource) { auto light = createByClassName("light_torchflame_small");