Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
#5584: Move some common code to a RenderableGeometry base class
  • Loading branch information
codereader committed Dec 4, 2021
1 parent 593ccd1 commit 1afccd0
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 55 deletions.
66 changes: 66 additions & 0 deletions libs/render/RenderableGeometry.h
@@ -0,0 +1,66 @@
#pragma once

#include "igeometryrenderer.h"
#include "irender.h"

namespace render
{

/**
* Geometry base type, taking care of adding/removing/updating
* indexed vertex data to an IGeometryRenderer instance.
*
* It implements the OpenGLRenderable interface which will instruct
* the shader to render just the geometry batch managed by this object.
* This is used to render highlights (such as selection overlays).
*/
class RenderableGeometry :
public OpenGLRenderable
{
protected:
ShaderPtr _shader;
IGeometryRenderer::Slot _surfaceSlot;

protected:
RenderableGeometry() :
_surfaceSlot(IGeometryRenderer::InvalidSlot)
{}

public:
// Removes any geometry attached to a shader
virtual void clear()
{
if (_shader && _surfaceSlot != IGeometryRenderer::InvalidSlot)
{
_shader->removeGeometry(_surfaceSlot);
}

_shader.reset();
_surfaceSlot = IGeometryRenderer::InvalidSlot;
}

virtual void render(const RenderInfo& info) const override
{
if (_surfaceSlot != IGeometryRenderer::InvalidSlot && _shader)
{
_shader->renderGeometry(_surfaceSlot);
}
}

protected:
virtual void addOrUpdateGeometry(const ShaderPtr& shader, GeometryType type,
const std::vector<ArbitraryMeshVertex>& vertices,
const std::vector<unsigned int>& indices)
{
if (_surfaceSlot == IGeometryRenderer::InvalidSlot)
{
_surfaceSlot = shader->addGeometry(type, vertices, indices);
}
else
{
shader->updateGeometry(_surfaceSlot, vertices, indices);
}
}
};

}
32 changes: 5 additions & 27 deletions radiantcore/entity/target/RenderableTargetLines.h
Expand Up @@ -5,6 +5,7 @@
#include "irenderable.h"
#include "ivolumetest.h"
#include "math/Segment.h"
#include "render/RenderableGeometry.h"

namespace entity
{
Expand All @@ -24,21 +25,18 @@ namespace
* frontend render pass.
*/
class RenderableTargetLines :
public OpenGLRenderable
public render::RenderableGeometry
{
private:
const TargetKeyCollection& _targetKeys;

bool _needsUpdate;
ShaderPtr _shader;
render::IGeometryRenderer::Slot _surfaceSlot;
std::size_t _numVisibleLines;

public:
RenderableTargetLines(const TargetKeyCollection& targetKeys) :
_targetKeys(targetKeys),
_needsUpdate(true),
_surfaceSlot(render::IGeometryRenderer::InvalidSlot),
_numVisibleLines(0)
{}

Expand All @@ -52,15 +50,10 @@ class RenderableTargetLines :
_needsUpdate = true;
}

void clear()
void clear() override
{
if (_shader && _surfaceSlot != render::IGeometryRenderer::InvalidSlot)
{
_shader->removeGeometry(_surfaceSlot);
}
RenderableGeometry::clear();

_shader.reset();
_surfaceSlot = render::IGeometryRenderer::InvalidSlot;
_numVisibleLines = 0;
}

Expand Down Expand Up @@ -104,24 +97,9 @@ class RenderableTargetLines :
_shader = shader;
_numVisibleLines = numVisibleLines;

if (_surfaceSlot == render::IGeometryRenderer::InvalidSlot)
{
_surfaceSlot = shader->addGeometry(render::GeometryType::Lines, vertices, indices);
}
else
{
shader->updateGeometry(_surfaceSlot, vertices, indices);
}
addOrUpdateGeometry(shader, render::GeometryType::Lines, vertices, indices);
}

void render(const RenderInfo& info) const override
{
if (_surfaceSlot != render::IGeometryRenderer::InvalidSlot && _shader)
{
_shader->renderGeometry(_surfaceSlot);
}
}

private:
// Adds points to the vector, defining a line from start to end, with arrow indicators
// in the XY plane (located at the midpoint between start/end).
Expand Down
33 changes: 5 additions & 28 deletions radiantcore/patch/PatchRenderables.h
Expand Up @@ -13,6 +13,7 @@

#include "render/VertexBuffer.h"
#include "render/IndexedVertexBuffer.h"
#include "render/RenderableGeometry.h"

#if 0
/// Helper class to render a PatchTesselation in solid mode
Expand Down Expand Up @@ -158,35 +159,26 @@ class TesselationIndexer_Quads :

template<typename TesselationIndexerT>
class RenderablePatchTesselation :
public OpenGLRenderable
public render::RenderableGeometry
{
private:
static_assert(std::is_base_of_v<ITesselationIndexer, TesselationIndexerT>, "Indexer must implement ITesselationIndexer");
TesselationIndexerT _indexer;

const PatchTesselation& _tess;
bool _needsUpdate;
ShaderPtr _shader;
std::size_t _size;

render::IGeometryRenderer::Slot _surfaceSlot;

public:
RenderablePatchTesselation(const PatchTesselation& tess) :
_tess(tess),
_needsUpdate(true),
_surfaceSlot(render::IGeometryRenderer::InvalidSlot),
_size(0)
{}

void clear()
void clear() override
{
if (!_shader || _surfaceSlot == render::IGeometryRenderer::InvalidSlot) return;

_shader->removeGeometry(_surfaceSlot);
_shader.reset();

_surfaceSlot = render::IGeometryRenderer::InvalidSlot;
RenderableGeometry::clear();
_size = 0;
}

Expand Down Expand Up @@ -218,21 +210,6 @@ class RenderablePatchTesselation :

_indexer.generateIndices(_tess, std::back_inserter(indices));

if (_surfaceSlot == render::IGeometryRenderer::InvalidSlot)
{
_surfaceSlot = shader->addGeometry(_indexer.getType(), _tess.vertices, indices);
}
else
{
shader->updateGeometry(_surfaceSlot, _tess.vertices, indices);
}
}

void render(const RenderInfo& info) const override
{
if (_surfaceSlot != render::IGeometryRenderer::InvalidSlot && _shader)
{
_shader->renderGeometry(_surfaceSlot);
}
addOrUpdateGeometry(shader, _indexer.getType(), _tess.vertices, indices);
}
};
1 change: 1 addition & 0 deletions tools/msvc/libs.vcxproj
Expand Up @@ -216,6 +216,7 @@
<ClInclude Include="..\..\libs\render\NopVolumeTest.h" />
<ClInclude Include="..\..\libs\render\RenderableCollectionWalker.h" />
<ClInclude Include="..\..\libs\render\RenderableCollectorBase.h" />
<ClInclude Include="..\..\libs\render\RenderableGeometry.h" />
<ClInclude Include="..\..\libs\render\RenderablePivot.h" />
<ClInclude Include="..\..\libs\render\RenderableSpacePartition.h" />
<ClInclude Include="..\..\libs\render\SceneRenderWalker.h" />
Expand Down
3 changes: 3 additions & 0 deletions tools/msvc/libs.vcxproj.filters
Expand Up @@ -344,6 +344,9 @@
<ClInclude Include="..\..\libs\render\RenderableCollectorBase.h">
<Filter>render</Filter>
</ClInclude>
<ClInclude Include="..\..\libs\render\RenderableGeometry.h">
<Filter>render</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="util">
Expand Down

0 comments on commit 1afccd0

Please sign in to comment.