Skip to content

Commit

Permalink
#5584: Solid patch renderable is not rendered twice anymore when node…
Browse files Browse the repository at this point in the history
… is selected
  • Loading branch information
codereader committed Nov 18, 2021
1 parent aec7f05 commit 8913d75
Show file tree
Hide file tree
Showing 8 changed files with 61 additions and 38 deletions.
7 changes: 7 additions & 0 deletions include/irenderable.h
Expand Up @@ -101,6 +101,13 @@ class IRenderableCollector
const LitObject* litObject = nullptr,
const IRenderEntity* entity = nullptr) = 0;

/**
* Submits a renderable object that is used for highlighting an object.
* Depending on the view, this might be a coloured, transparent overlay
* or a wireframe outline.
*/
virtual void addHighlightRenderable(const OpenGLRenderable& renderable, const Matrix4& localToWorld) = 0;

/**
* \brief Submit a light source for the render operation.
*
Expand Down
47 changes: 26 additions & 21 deletions libs/render/CamRenderer.h
Expand Up @@ -208,27 +208,7 @@ class CamRenderer :
const LitObject* litObject = nullptr,
const IRenderEntity* entity = nullptr) override
{
if (_editMode == IMap::EditMode::Merge && (_flags & Highlight::Flags::MergeAction) != 0)
{
const auto& mergeShader = (_flags & Highlight::Flags::MergeActionAdd) != 0 ? _shaders.mergeActionShaderAdd :
(_flags & Highlight::Flags::MergeActionRemove) != 0 ? _shaders.mergeActionShaderRemove :
(_flags & Highlight::Flags::MergeActionConflict) != 0 ? _shaders.mergeActionShaderConflict : _shaders.mergeActionShaderChange;

if (mergeShader)
{
mergeShader->addRenderable(renderable, localToWorld, nullptr, entity);
}
}

if ((_flags & Highlight::Flags::Primitives) != 0 && _shaders.primitiveHighlightShader)
{
_shaders.primitiveHighlightShader->addRenderable(renderable, localToWorld, nullptr, entity);
}

if ((_flags & Highlight::Flags::Faces) != 0 && _shaders.faceHighlightShader)
{
_shaders.faceHighlightShader->addRenderable(renderable, localToWorld, nullptr, entity);
}
addHighlightRenderable(renderable, localToWorld);

// Construct an entry for this shader in the map if it is the first
// time we've seen it
Expand All @@ -252,6 +232,31 @@ class CamRenderer :
iter->second.emplace_back(std::move(lr));
}

void addHighlightRenderable(const OpenGLRenderable& renderable, const Matrix4& localToWorld) override
{
if (_editMode == IMap::EditMode::Merge && (_flags & Highlight::Flags::MergeAction) != 0)
{
const auto& mergeShader = (_flags & Highlight::Flags::MergeActionAdd) != 0 ? _shaders.mergeActionShaderAdd :
(_flags & Highlight::Flags::MergeActionRemove) != 0 ? _shaders.mergeActionShaderRemove :
(_flags & Highlight::Flags::MergeActionConflict) != 0 ? _shaders.mergeActionShaderConflict : _shaders.mergeActionShaderChange;

if (mergeShader)
{
mergeShader->addRenderable(renderable, localToWorld, nullptr, nullptr);
}
}

if ((_flags & Highlight::Flags::Primitives) != 0 && _shaders.primitiveHighlightShader)
{
_shaders.primitiveHighlightShader->addRenderable(renderable, localToWorld, nullptr, nullptr);
}

if ((_flags & Highlight::Flags::Faces) != 0 && _shaders.faceHighlightShader)
{
_shaders.faceHighlightShader->addRenderable(renderable, localToWorld, nullptr, nullptr);
}
}

#ifdef RENDERABLE_GEOMETRY
void addGeometry(RenderableGeometry& geometry, std::size_t flags) override
{
Expand Down
23 changes: 14 additions & 9 deletions radiant/xyview/XYRenderer.h
Expand Up @@ -71,50 +71,55 @@ class XYRenderer :
const Matrix4& localToWorld,
const LitObject* /* litObject */,
const IRenderEntity* entity = nullptr) override
{
addHighlightRenderable(renderable, localToWorld);

shader.addRenderable(renderable, localToWorld, nullptr, entity);
}

void addHighlightRenderable(const OpenGLRenderable& renderable, const Matrix4& localToWorld) override
{
if (_editMode == IMap::EditMode::Merge)
{
if (_flags & Highlight::Flags::MergeAction)
{
// This is a merge-relevant node that should be rendered in a special colour
const auto& mergeShader = (_flags & Highlight::Flags::MergeActionAdd) != 0 ? _shaders.mergeActionShaderAdd :
(_flags & Highlight::Flags::MergeActionRemove) != 0 ? _shaders.mergeActionShaderRemove :
(_flags & Highlight::Flags::MergeActionRemove) != 0 ? _shaders.mergeActionShaderRemove :
(_flags & Highlight::Flags::MergeActionConflict) != 0 ? _shaders.mergeActionShaderConflict : _shaders.mergeActionShaderChange;

if (mergeShader)
{
mergeShader->addRenderable(renderable, localToWorld, nullptr, entity);
mergeShader->addRenderable(renderable, localToWorld, nullptr, nullptr);
}
}
else
{
// Everything else is using the shader for non-merge-affected nodes
_shaders.nonMergeActionNodeShader->addRenderable(renderable, localToWorld, nullptr, entity);
_shaders.nonMergeActionNodeShader->addRenderable(renderable, localToWorld, nullptr, nullptr);
}

// Elements can still be selected in merge mode
if ((_flags & Highlight::Flags::Primitives) != 0)
{
_shaders.selectedShader->addRenderable(renderable, localToWorld, nullptr, entity);
_shaders.selectedShader->addRenderable(renderable, localToWorld, nullptr, nullptr);
}

return;
}

// Regular editing mode, add all highlighted nodes to the corresponding shader
if ((_flags & Highlight::Flags::Primitives) != 0)
{
if ((_flags & Highlight::Flags::GroupMember) != 0)
{
_shaders.selectedShaderGroup->addRenderable(renderable, localToWorld, nullptr, entity);
_shaders.selectedShaderGroup->addRenderable(renderable, localToWorld, nullptr, nullptr);
}
else
{
_shaders.selectedShader->addRenderable(renderable, localToWorld, nullptr, entity);
_shaders.selectedShader->addRenderable(renderable, localToWorld, nullptr, nullptr);
}
}

shader.addRenderable(renderable, localToWorld, nullptr, entity);
}

void render(const Matrix4& modelview, const Matrix4& projection)
Expand Down
5 changes: 1 addition & 4 deletions radiantcore/brush/BrushNode.cpp
Expand Up @@ -427,10 +427,7 @@ void BrushNode::renderHighlights(IRenderableCollector& collector, const VolumeTe
collector.setHighlightFlag(IRenderableCollector::Highlight::Faces, true);

// greebo: BrushNodes have always an identity l2w, don't do any transforms
collector.addRenderable(
*face.getFaceShader().getGLShader(), face.getWinding(),
Matrix4::getIdentity(), this, _renderEntity
);
collector.addHighlightRenderable(face.getWinding(), Matrix4::getIdentity());

if (highlight)
collector.setHighlightFlag(IRenderableCollector::Highlight::Faces, false);
Expand Down
1 change: 1 addition & 0 deletions radiantcore/patch/Patch.cpp
Expand Up @@ -583,6 +583,7 @@ void Patch::updateTesselation(bool force)
}
}

_node.onTesselationChanged();
_solidRenderable.queueUpdate();

if (_patchDef3)
Expand Down
11 changes: 7 additions & 4 deletions radiantcore/patch/PatchNode.cpp
Expand Up @@ -386,10 +386,7 @@ void PatchNode::renderWireframe(IRenderableCollector& collector, const VolumeTes

void PatchNode::renderHighlights(IRenderableCollector& collector, const VolumeTest& volume)
{
collector.addRenderable(
*m_patch._shader.getGLShader(), m_patch._solidRenderable,
localToWorld(), this, _renderEntity
);
collector.addHighlightRenderable(m_patch._solidRenderable, localToWorld());

// Render the selected components
renderComponentsSelected(collector, volume);
Expand Down Expand Up @@ -551,6 +548,12 @@ const Vector3& PatchNode::getUntransformedOrigin()
return _untransformedOrigin;
}

void PatchNode::onTesselationChanged()
{
_renderableSurfaceSolid.queueUpdate();
_renderableSurfaceWireframe.queueUpdate();
}

void PatchNode::onControlPointsChanged()
{
_renderableSurfaceSolid.queueUpdate();
Expand Down
1 change: 1 addition & 0 deletions radiantcore/patch/PatchNode.h
Expand Up @@ -153,6 +153,7 @@ class PatchNode final :

void onControlPointsChanged();
void onMaterialChanged();
void onTesselationChanged();

protected:
// Gets called by the Transformable implementation whenever
Expand Down
4 changes: 4 additions & 0 deletions test/Entity.cpp
Expand Up @@ -427,6 +427,10 @@ namespace
renderablePtrs.push_back(std::make_pair(&shader, &renderable));
}

void addHighlightRenderable(const OpenGLRenderable& renderable,
const Matrix4& localToWorld) override
{}

void addLight(const RendererLight& light)
{
++lights;
Expand Down

0 comments on commit 8913d75

Please sign in to comment.