Skip to content

Commit

Permalink
#5893: Move common code to RenderableCollectorBase. Migrate the Rende…
Browse files Browse the repository at this point in the history
…rFixture and two unit tests.
  • Loading branch information
codereader committed Feb 12, 2022
1 parent 74de961 commit 9b4adc6
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 76 deletions.
25 changes: 0 additions & 25 deletions libs/render/CamRenderer.h
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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,
Expand Down
32 changes: 32 additions & 0 deletions libs/render/RenderableCollectorBase.h
Expand Up @@ -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);
Expand Down
24 changes: 0 additions & 24 deletions radiant/xyview/XYRenderer.h
Expand Up @@ -20,7 +20,6 @@ class XYRenderer :
};

private:
std::size_t _flags;
RenderStateFlags _globalstate;

IMap::EditMode _editMode;
Expand All @@ -29,7 +28,6 @@ class XYRenderer :

public:
XYRenderer(RenderStateFlags globalstate, const HighlightShaders& shaders) :
_flags(Highlight::Flags::NoHighlight),
_globalstate(globalstate),
_editMode(GlobalMapModule().getEditMode()),
_shaders(shaders)
Expand All @@ -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,
Expand Down
54 changes: 27 additions & 27 deletions test/Entity.cpp
Expand Up @@ -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"
Expand Down Expand Up @@ -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)
Expand All @@ -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
Expand All @@ -464,6 +466,8 @@ namespace
// List of renderables and their shaders
std::vector< std::pair<const Shader*, const OpenGLRenderable*> > renderablePtrs;

std::vector<const OpenGLRenderable*> highlightRenderablePtrs;

void addRenderable(Shader& shader, const OpenGLRenderable& renderable,
const Matrix4& localToWorld,
const LitObject* litObject = nullptr,
Expand All @@ -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
{
Expand All @@ -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
Expand Down Expand Up @@ -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<ISelectable>(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");
Expand Down

0 comments on commit 9b4adc6

Please sign in to comment.