Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
#5623: Hack CamRenderer to display merge and non-merge nodes as overlays
  • Loading branch information
codereader committed May 25, 2021
1 parent 7e5ad90 commit 3641eab
Show file tree
Hide file tree
Showing 4 changed files with 75 additions and 6 deletions.
33 changes: 31 additions & 2 deletions libs/render/CamRenderer.h
@@ -1,6 +1,7 @@
#pragma once

#include "irenderable.h"
#include "imap.h"
#include "ivolumetest.h"

#include "VectorLightList.h"
Expand All @@ -16,15 +17,20 @@ class CamRenderer: public RenderableCollector
// The VolumeTest object for object culling
const VolumeTest& _view;

IMap::EditMode _editMode;

// Render statistics
int _totalLights = 0;
int _visibleLights = 0;

// Highlight state
bool _highlightFaces = false;
bool _highlightPrimitives = false;
bool _highlightAsMergeAction = false;
Shader* _highlightedPrimitiveShader = nullptr;
Shader* _highlightedFaceShader = nullptr;
Shader* _highlightedMergeActionShader = nullptr;
Shader* _nonMergeActionNodeShader = nullptr;

// All lights we have received from the scene
std::list<const RendererLight*> _sceneLights;
Expand Down Expand Up @@ -73,10 +79,14 @@ class CamRenderer: public RenderableCollector

/// Initialise CamRenderer with optional highlight shaders
CamRenderer(const VolumeTest& view, Shader* primHighlightShader = nullptr,
Shader* faceHighlightShader = nullptr)
Shader* faceHighlightShader = nullptr, Shader* highlightedMergeActionShader = nullptr,
Shader* nonMergeActionNodeShader = nullptr)
: _view(view),
_editMode(GlobalMapModule().getEditMode()),
_highlightedPrimitiveShader(primHighlightShader),
_highlightedFaceShader(faceHighlightShader)
_highlightedFaceShader(faceHighlightShader),
_highlightedMergeActionShader(highlightedMergeActionShader),
_nonMergeActionNodeShader(nonMergeActionNodeShader)
{}

/**
Expand Down Expand Up @@ -134,6 +144,11 @@ class CamRenderer: public RenderableCollector
{
_highlightPrimitives = enabled;
}

if (flags & Highlight::MergeAction)
{
_highlightAsMergeAction = enabled;
}
}

void addLight(const RendererLight& light) override
Expand All @@ -159,6 +174,20 @@ class CamRenderer: public RenderableCollector
const LitObject* litObject = nullptr,
const IRenderEntity* entity = nullptr) override
{
if (_editMode == IMap::EditMode::Merge)
{
if (_highlightAsMergeAction && _highlightedMergeActionShader)
{
_highlightedMergeActionShader->addRenderable(renderable, localToWorld, nullptr, entity);
}
else if (!_highlightAsMergeAction && _nonMergeActionNodeShader)
{
_nonMergeActionNodeShader->addRenderable(renderable, localToWorld, nullptr, entity);
}

return;
}

if (_highlightPrimitives && _highlightedPrimitiveShader)
_highlightedPrimitiveShader->addRenderable(renderable, localToWorld,
nullptr, entity);
Expand Down
16 changes: 12 additions & 4 deletions radiant/camera/CamWnd.cpp
Expand Up @@ -778,7 +778,8 @@ void CamWnd::Cam_Draw()
{
// Front end (renderable collection from scene)
render::CamRenderer renderer(_view, _primitiveHighlightShader.get(),
_faceHighlightShader.get());
_faceHighlightShader.get(), _mergeActionShader.get(),
_nonMergeActionNodeShader.get());
render::RenderableCollectionWalker::CollectRenderablesInScene(renderer, _view);

// Accumulate render statistics
Expand Down Expand Up @@ -959,11 +960,16 @@ void CamWnd::captureStates()
{
_faceHighlightShader = GlobalRenderSystem().capture("$CAM_HIGHLIGHT");
_primitiveHighlightShader = GlobalRenderSystem().capture("$CAM_OVERLAY");
_mergeActionShader = GlobalRenderSystem().capture("$MERGE_ACTION_OVERLAY");
_nonMergeActionNodeShader = GlobalRenderSystem().capture("$CAM_INACTIVE_NODE");
}

void CamWnd::releaseStates() {
_faceHighlightShader = ShaderPtr();
_primitiveHighlightShader = ShaderPtr();
void CamWnd::releaseStates()
{
_faceHighlightShader.reset();
_primitiveHighlightShader.reset();
_mergeActionShader.reset();
_nonMergeActionNodeShader.reset();
}

void CamWnd::queueDraw()
Expand Down Expand Up @@ -1380,6 +1386,8 @@ void CamWnd::rotateRightDiscrete()

ShaderPtr CamWnd::_faceHighlightShader;
ShaderPtr CamWnd::_primitiveHighlightShader;
ShaderPtr CamWnd::_mergeActionShader;
ShaderPtr CamWnd::_nonMergeActionNodeShader;
int CamWnd::_maxId = 0;

} // namespace
2 changes: 2 additions & 0 deletions radiant/camera/CamWnd.h
Expand Up @@ -63,6 +63,8 @@ class CamWnd :

static ShaderPtr _faceHighlightShader;
static ShaderPtr _primitiveHighlightShader;
static ShaderPtr _mergeActionShader;
static ShaderPtr _nonMergeActionNodeShader;

wxutil::FreezePointer _freezePointer;

Expand Down
30 changes: 30 additions & 0 deletions radiantcore/rendersystem/backend/OpenGLShader.cpp
Expand Up @@ -802,6 +802,36 @@ void OpenGLShader::construct()
hiddenLine.setDepthFunc(GL_GREATER);
hiddenLine.m_linestipple_factor = 2;
}
else if (_name == "$MERGE_ACTION_OVERLAY")
{
// This is the shader drawing a coloured overlay
// over faces/polys. Its colour is configurable,
// and it has depth test activated.
state.setRenderFlag(RENDER_FILL);
state.setRenderFlag(RENDER_DEPTHTEST);
state.setRenderFlag(RENDER_CULLFACE);
state.setRenderFlag(RENDER_BLEND);

state.setColour(Colour4(0, 0.4, 0.9, 0.4));
state.setSortPosition(OpenGLState::SORT_HIGHLIGHT);
state.polygonOffset = 0.5f;
state.setDepthFunc(GL_LEQUAL);
}
else if (_name == "$CAM_INACTIVE_NODE")
{
// This is the shader drawing a coloured overlay
// over faces/polys. Its colour is configurable,
// and it has depth test activated.
state.setRenderFlag(RENDER_FILL);
state.setRenderFlag(RENDER_DEPTHTEST);
state.setRenderFlag(RENDER_CULLFACE);
state.setRenderFlag(RENDER_BLEND);

state.setColour(Colour4(0.3, 0.3, 0.3, 0.3));
state.setSortPosition(OpenGLState::SORT_FULLBRIGHT);
state.polygonOffset = 0.5f;
state.setDepthFunc(GL_LEQUAL);
}
else if (_name == "$XY_OVERLAY")
{
Vector3 colorSelBrushes = GlobalColourSchemeManager().getColour("selected_brush");
Expand Down

0 comments on commit 3641eab

Please sign in to comment.