Skip to content

Commit

Permalink
#5623: Lots of refactoring with regards to camera rendering, use dist…
Browse files Browse the repository at this point in the history
…inct highlights for the various merge actions
  • Loading branch information
codereader committed May 25, 2021
1 parent 45a6dcb commit aead38f
Show file tree
Hide file tree
Showing 9 changed files with 103 additions and 70 deletions.
2 changes: 1 addition & 1 deletion include/imergeaction.h
Expand Up @@ -56,7 +56,7 @@ class IMergeActionNode :
virtual ~IMergeActionNode() {}

// Return the action type represented by this node
virtual merge::ActionType getType() const = 0;
virtual merge::ActionType getActionType() const = 0;
};

}
14 changes: 8 additions & 6 deletions include/irenderable.h
Expand Up @@ -95,11 +95,14 @@ class RenderableCollector
{
enum Flags
{
NoHighlight = 0,
Faces = 1 << 0, /// Highlight faces of subsequently-submitted objects, if supported
Primitives = 1 << 1, /// Highlight primitives of subsequently-submitted objects, if supported
GroupMember = 1 << 2, /// Highlight as member of group, if supported
MergeAction = 1 << 3, /// Highlight as merge action
NoHighlight = 0,
Faces = 1 << 0, /// Highlight faces of subsequently-submitted objects, if supported
Primitives = 1 << 1, /// Highlight primitives of subsequently-submitted objects, if supported
GroupMember = 1 << 2, /// Highlight as member of group, if supported
MergeAction = 1 << 3, /// Highlight as merge action (combined with the flags below)
MergeActionAdd = 1 << 4, /// Highlight as merge action that is adding something
MergeActionRemove = 1 << 5, /// Highlight as merge action that is removing something
MergeActionChange = 1 << 6, /// Highlight as merge action that is changing something
};
};

Expand Down Expand Up @@ -150,7 +153,6 @@ class Renderable
NoHighlight = 0,
Selected = 1 << 0,
GroupMember = 1 << 1,
MergeAction = 1 << 2,
};
};

Expand Down
75 changes: 37 additions & 38 deletions libs/render/CamRenderer.h
Expand Up @@ -12,8 +12,21 @@ namespace render
{

/// RenderableCollector for use with 3D camera views or preview widgets
class CamRenderer: public RenderableCollector
class CamRenderer :
public RenderableCollector
{
public:
struct HighlightShaders
{
ShaderPtr faceHighlightShader;
ShaderPtr primitiveHighlightShader;
ShaderPtr mergeActionShaderAdd;
ShaderPtr mergeActionShaderChange;
ShaderPtr mergeActionShaderRemove;
ShaderPtr nonMergeActionNodeShader;
};

private:
// The VolumeTest object for object culling
const VolumeTest& _view;

Expand All @@ -24,13 +37,9 @@ class CamRenderer: public RenderableCollector
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;
std::size_t _flags = Highlight::Flags::NoHighlight;

const HighlightShaders& _shaders;

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

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

/**
Expand Down Expand Up @@ -135,19 +139,13 @@ class CamRenderer: public RenderableCollector

void setHighlightFlag(Highlight::Flags flags, bool enabled) override
{
if (flags & Highlight::Faces)
if (enabled)
{
_highlightFaces = enabled;
_flags |= flags;
}

if (flags & Highlight::Primitives)
else
{
_highlightPrimitives = enabled;
}

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

Expand All @@ -174,25 +172,26 @@ class CamRenderer: public RenderableCollector
const LitObject* litObject = nullptr,
const IRenderEntity* entity = nullptr) override
{
if (_editMode == IMap::EditMode::Merge)
if (_editMode == IMap::EditMode::Merge && (_flags & Highlight::Flags::MergeAction) != 0)
{
if (_highlightAsMergeAction && _highlightedMergeActionShader)
{
_highlightedMergeActionShader->addRenderable(renderable, localToWorld, nullptr, entity);
}
else if (!_highlightAsMergeAction && _nonMergeActionNodeShader)
const auto& mergeShader = (_flags & Highlight::Flags::MergeActionAdd) != 0 ? _shaders.mergeActionShaderAdd :
(_flags & Highlight::Flags::MergeActionRemove) != 0 ? _shaders.mergeActionShaderRemove : _shaders.mergeActionShaderChange;

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

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

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

// Construct an entry for this shader in the map if it is the first
// time we've seen it
Expand Down
34 changes: 33 additions & 1 deletion libs/render/RenderableCollectionWalker.h
@@ -1,6 +1,7 @@
#pragma once

#include "iselection.h"
#include "imergeaction.h"
#include "ientity.h"
#include "ieclass.h"
#include "iscenegraph.h"
Expand Down Expand Up @@ -62,13 +63,44 @@ class RenderableCollectionWalker :
highlightFlags |= parent->getHighlightFlags();
}

if (highlightFlags & Renderable::Highlight::MergeAction)
if (node->getNodeType() == scene::INode::Type::MergeAction)
{
_collector.setHighlightFlag(RenderableCollector::Highlight::MergeAction, true);

auto mergeActionNode = std::dynamic_pointer_cast<scene::IMergeActionNode>(node);
assert(mergeActionNode);

switch (mergeActionNode->getActionType())
{
case scene::merge::ActionType::AddChildNode:
case scene::merge::ActionType::AddEntity:
_collector.setHighlightFlag(RenderableCollector::Highlight::MergeActionAdd, true);
_collector.setHighlightFlag(RenderableCollector::Highlight::MergeActionChange, false);
_collector.setHighlightFlag(RenderableCollector::Highlight::MergeActionRemove, false);
break;

case scene::merge::ActionType::AddKeyValue:
case scene::merge::ActionType::ChangeKeyValue:
case scene::merge::ActionType::RemoveKeyValue:
_collector.setHighlightFlag(RenderableCollector::Highlight::MergeActionChange, true);
_collector.setHighlightFlag(RenderableCollector::Highlight::MergeActionAdd, false);
_collector.setHighlightFlag(RenderableCollector::Highlight::MergeActionRemove, false);
break;

case scene::merge::ActionType::RemoveChildNode:
case scene::merge::ActionType::RemoveEntity:
_collector.setHighlightFlag(RenderableCollector::Highlight::MergeActionRemove, true);
_collector.setHighlightFlag(RenderableCollector::Highlight::MergeActionAdd, false);
_collector.setHighlightFlag(RenderableCollector::Highlight::MergeActionChange, false);
break;
}
}
else
{
_collector.setHighlightFlag(RenderableCollector::Highlight::MergeAction, false);
_collector.setHighlightFlag(RenderableCollector::Highlight::MergeActionAdd, false);
_collector.setHighlightFlag(RenderableCollector::Highlight::MergeActionChange, false);
_collector.setHighlightFlag(RenderableCollector::Highlight::MergeActionRemove, false);
}

if (highlightFlags & Renderable::Highlight::Selected)
Expand Down
4 changes: 2 additions & 2 deletions libs/wxutil/preview/RenderPreview.cpp
Expand Up @@ -492,7 +492,7 @@ bool RenderPreview::drawPreview()
}

// Front-end render phase, collect OpenGLRenderable objects from the scene
render::CamRenderer renderer(_volumeTest);
render::CamRenderer renderer(_volumeTest, _shaders);
render::SceneRenderWalker sceneWalker(renderer, _volumeTest);
getScene()->foreachVisibleNodeInVolume(_volumeTest, sceneWalker);

Expand All @@ -519,7 +519,7 @@ void RenderPreview::renderWireFrame()
Matrix4 projection = camera::calculateProjectionMatrix(0.1f, 10000, PREVIEW_FOV, _previewWidth, _previewHeight);

// Front-end render phase, collect OpenGLRenderable objects from the scene
render::CamRenderer renderer(_volumeTest);
render::CamRenderer renderer(_volumeTest, _shaders);
render::SceneRenderWalker sceneWalker(renderer, _volumeTest);
getScene()->foreachVisibleNodeInVolume(_volumeTest, sceneWalker);

Expand Down
3 changes: 3 additions & 0 deletions libs/wxutil/preview/RenderPreview.h
Expand Up @@ -13,6 +13,7 @@

#include "../FreezePointer.h"
#include "render/NopVolumeTest.h"
#include "render/CamRenderer.h"

class wxToolBarToolBase;

Expand Down Expand Up @@ -85,6 +86,8 @@ class RenderPreview :

bool _renderGrid;

render::CamRenderer::HighlightShaders _shaders;

protected:
const unsigned int MSEC_PER_FRAME = 16;

Expand Down
29 changes: 14 additions & 15 deletions radiant/camera/CamWnd.cpp
Expand Up @@ -777,9 +777,7 @@ void CamWnd::Cam_Draw()
// Main scene render
{
// Front end (renderable collection from scene)
render::CamRenderer renderer(_view, _primitiveHighlightShader.get(),
_faceHighlightShader.get(), _mergeActionShader.get(),
_nonMergeActionNodeShader.get());
render::CamRenderer renderer(_view, _shaders);
render::RenderableCollectionWalker::CollectRenderablesInScene(renderer, _view);

// Accumulate render statistics
Expand Down Expand Up @@ -958,18 +956,22 @@ camera::ICameraView& CamWnd::getCamera()

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");
_shaders.faceHighlightShader = GlobalRenderSystem().capture("$CAM_HIGHLIGHT");
_shaders.primitiveHighlightShader = GlobalRenderSystem().capture("$CAM_OVERLAY");
_shaders.mergeActionShaderAdd = GlobalRenderSystem().capture("$MERGE_ACTION_ADD");
_shaders.mergeActionShaderChange = GlobalRenderSystem().capture("$MERGE_ACTION_CHANGE");
_shaders.mergeActionShaderRemove = GlobalRenderSystem().capture("$MERGE_ACTION_REMOVE");
_shaders.nonMergeActionNodeShader = GlobalRenderSystem().capture("$CAM_INACTIVE_NODE");
}

void CamWnd::releaseStates()
{
_faceHighlightShader.reset();
_primitiveHighlightShader.reset();
_mergeActionShader.reset();
_nonMergeActionNodeShader.reset();
_shaders.faceHighlightShader.reset();
_shaders.primitiveHighlightShader.reset();
_shaders.mergeActionShaderAdd.reset();
_shaders.mergeActionShaderChange.reset();
_shaders.mergeActionShaderRemove.reset();
_shaders.nonMergeActionNodeShader.reset();
}

void CamWnd::queueDraw()
Expand Down Expand Up @@ -1384,10 +1386,7 @@ void CamWnd::rotateRightDiscrete()

// -------------------------------------------------------------------------------

ShaderPtr CamWnd::_faceHighlightShader;
ShaderPtr CamWnd::_primitiveHighlightShader;
ShaderPtr CamWnd::_mergeActionShader;
ShaderPtr CamWnd::_nonMergeActionNodeShader;
render::CamRenderer::HighlightShaders CamWnd::_shaders;
int CamWnd::_maxId = 0;

} // namespace
6 changes: 2 additions & 4 deletions radiant/camera/CamWnd.h
Expand Up @@ -26,6 +26,7 @@
#include <sigc++/connection.h>
#include "tools/CameraMouseToolEvent.h"
#include "render/RenderStatistics.h"
#include "render/CamRenderer.h"

const int CAMWND_MINSIZE_X = 240;
const int CAMWND_MINSIZE_Y = 200;
Expand Down Expand Up @@ -61,10 +62,7 @@ class CamWnd :
// The contained camera
camera::ICameraView::Ptr _camera;

static ShaderPtr _faceHighlightShader;
static ShaderPtr _primitiveHighlightShader;
static ShaderPtr _mergeActionShader;
static ShaderPtr _nonMergeActionNodeShader;
static render::CamRenderer::HighlightShaders _shaders;

wxutil::FreezePointer _freezePointer;

Expand Down
6 changes: 3 additions & 3 deletions radiantcore/map/MergeActionNode.h
Expand Up @@ -42,7 +42,7 @@ class MergeActionNode :
});
}

scene::merge::ActionType getType() const override
scene::merge::ActionType getActionType() const override
{
return _action->getType();
}
Expand All @@ -55,7 +55,7 @@ class MergeActionNode :
const AABB& localAABB() const override
{
return _affectedNode->localAABB();
}
}

void renderSolid(RenderableCollector& collector, const VolumeTest& volume) const override
{
Expand Down Expand Up @@ -83,7 +83,7 @@ class MergeActionNode :

std::size_t getHighlightFlags() override
{
return Highlight::MergeAction;
return Highlight::NoHighlight;
}
};

Expand Down

0 comments on commit aead38f

Please sign in to comment.