Skip to content

Commit

Permalink
#5623: Spike code to render nodes affected by merge actions
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed May 24, 2021
1 parent 93fd736 commit 7e8193d
Show file tree
Hide file tree
Showing 12 changed files with 170 additions and 12 deletions.
1 change: 1 addition & 0 deletions include/inode.h
Expand Up @@ -102,6 +102,7 @@ class INode :
Model,
Particle,
EntityConnection,
MergeAction,
};

public:
Expand Down
2 changes: 2 additions & 0 deletions include/irenderable.h
Expand Up @@ -99,6 +99,7 @@ class RenderableCollector
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
};
};

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

Expand Down
9 changes: 9 additions & 0 deletions libs/render/RenderableCollectionWalker.h
Expand Up @@ -62,6 +62,15 @@ class RenderableCollectionWalker :
highlightFlags |= parent->getHighlightFlags();
}

if (highlightFlags & Renderable::Highlight::MergeAction)
{
_collector.setHighlightFlag(RenderableCollector::Highlight::MergeAction, true);
}
else
{
_collector.setHighlightFlag(RenderableCollector::Highlight::MergeAction, false);
}

if (highlightFlags & Renderable::Highlight::Selected)
{
if (GlobalSelectionSystem().Mode() != SelectionSystem::eComponent)
Expand Down
34 changes: 27 additions & 7 deletions libs/scene/merge/MergeAction.h
Expand Up @@ -46,6 +46,10 @@ class MergeAction
// It's the caller's responsibility to set up any Undo operations.
// Implementations are allowed to throw std::runtime_errors on failure.
virtual void applyChanges() = 0;

// Returns the node this action is affecting when applied
// This is used to identify the scene node and display it appropriately
virtual scene::INodePtr getAffectedNode() = 0;
};

// Various implementations of the above MergeAction base type following
Expand Down Expand Up @@ -74,6 +78,11 @@ class RemoveNodeFromParentAction :
{
removeNodeFromParent(_nodeToRemove);
}

scene::INodePtr getAffectedNode() override
{
return getNodeToRemove();
}
};

class RemoveChildAction :
Expand All @@ -100,6 +109,7 @@ class AddCloneToParentAction :
private:
scene::INodePtr _node;
scene::INodePtr _parent;
scene::INodePtr _cloneToBeInserted;

protected:
// Will add the given node to the parent when applyChanges() is called
Expand All @@ -110,20 +120,20 @@ class AddCloneToParentAction :
{
assert(_node);
assert(Node_getCloneable(node));
}

public:
void applyChanges() override
{
// No post-clone callback since we don't care about selection groups right now
auto cloned = cloneNodeIncludingDescendants(_node, PostCloneCallback());
_cloneToBeInserted = cloneNodeIncludingDescendants(_node, PostCloneCallback());

if (!cloned)
if (!_cloneToBeInserted)
{
throw std::runtime_error("Node " + _node->name() + " is not cloneable");
}
}

addNodeToContainer(cloned, _parent);
public:
void applyChanges() override
{
addNodeToContainer(_cloneToBeInserted, _parent);
}

const scene::INodePtr& getParent() const
Expand All @@ -135,6 +145,11 @@ class AddCloneToParentAction :
{
return _node;
}

scene::INodePtr getAffectedNode() override
{
return _cloneToBeInserted;
}
};

class AddEntityAction :
Expand Down Expand Up @@ -203,6 +218,11 @@ class SetEntityKeyValueAction :
{
return _value;
}

scene::INodePtr getAffectedNode() override
{
return getEntityNode();
}
};

class AddEntityKeyValueAction :
Expand Down
21 changes: 17 additions & 4 deletions radiant/xyview/XYRenderer.h
Expand Up @@ -10,11 +10,13 @@ class XYRenderer: public RenderableCollector
{
bool highlightPrimitives;
bool highlightAsGroupMember;
bool highlightAsMergeAction;

// Constructor
State() :
highlightPrimitives(false),
highlightAsGroupMember(false)
highlightAsGroupMember(false),
highlightAsMergeAction(false)
{}
};

Expand All @@ -24,12 +26,14 @@ class XYRenderer: public RenderableCollector
// Shader to use for highlighted objects
Shader* _selectedShader;
Shader* _selectedShaderGroup;
Shader* _mergeActionShader;

public:
XYRenderer(RenderStateFlags globalstate, Shader* selected, Shader* selectedGroup) :
XYRenderer(RenderStateFlags globalstate, Shader* selected, Shader* selectedGroup, Shader* mergeActionShader) :
_globalstate(globalstate),
_selectedShader(selected),
_selectedShaderGroup(selectedGroup)
_selectedShaderGroup(selectedGroup),
_mergeActionShader(mergeActionShader)
{}

bool supportsFullMaterials() const override
Expand All @@ -48,6 +52,11 @@ class XYRenderer: public RenderableCollector
{
_state.highlightAsGroupMember = enabled;
}

if (flags & Highlight::MergeAction)
{
_state.highlightAsMergeAction = enabled;
}
}

// Ortho view never processes lights
Expand All @@ -59,7 +68,11 @@ class XYRenderer: public RenderableCollector
const LitObject* /* litObject */,
const IRenderEntity* entity = nullptr) override
{
if (_state.highlightPrimitives)
if (_state.highlightAsMergeAction)
{
_mergeActionShader->addRenderable(renderable, localToWorld, nullptr, entity);
}
else if (_state.highlightPrimitives)
{
if (_state.highlightAsGroupMember)
_selectedShaderGroup->addRenderable(renderable, localToWorld,
Expand Down
12 changes: 11 additions & 1 deletion radiant/xyview/XYWnd.cpp
Expand Up @@ -223,12 +223,14 @@ void XYWnd::captureStates()
{
_selectedShader = GlobalRenderSystem().capture("$XY_OVERLAY");
_selectedShaderGroup = GlobalRenderSystem().capture("$XY_OVERLAY_GROUP");
_mergeActionShader = GlobalRenderSystem().capture("$XY_OVERLAY_GROUP");
}

void XYWnd::releaseStates()
{
_selectedShader.reset();
_selectedShaderGroup.reset();
_mergeActionShader.reset();
}

void XYWnd::ensureFont()
Expand Down Expand Up @@ -897,6 +899,13 @@ void XYWnd::drawGrid()
}
}

if (GlobalMapModule().getEditMode() == IMap::EditMode::Merge)
{
glColor3d(0.9, 0, 0);
glRasterPos2d(_origin[nDim1] - 50 / _scale, _origin[nDim2] + h - 30 / _scale);
_font->drawString("Merge Mode");
}

if (GlobalXYWnd().showAxes())
{
const char* g_AxisName[3] = { "X", "Y", "Z" };
Expand Down Expand Up @@ -1351,7 +1360,7 @@ void XYWnd::draw()

{
// Construct the renderer and render the scene
XYRenderer renderer(flagsMask, _selectedShader.get(), _selectedShaderGroup.get());
XYRenderer renderer(flagsMask, _selectedShader.get(), _selectedShaderGroup.get(), _mergeActionShader.get());

// First pass (scenegraph traversal)
render::RenderableCollectionWalker::CollectRenderablesInScene(renderer,
Expand Down Expand Up @@ -1708,5 +1717,6 @@ IInteractiveView& XYWnd::getInteractiveView()
/* STATICS */
ShaderPtr XYWnd::_selectedShader;
ShaderPtr XYWnd::_selectedShaderGroup;
ShaderPtr XYWnd::_mergeActionShader;

} // namespace
1 change: 1 addition & 0 deletions radiant/xyview/XYWnd.h
Expand Up @@ -58,6 +58,7 @@ class XYWnd :
// Shader to use for selected items
static ShaderPtr _selectedShader;
static ShaderPtr _selectedShaderGroup;
static ShaderPtr _mergeActionShader;

Vector3 _mousePosition;

Expand Down
14 changes: 14 additions & 0 deletions radiantcore/map/Map.cpp
Expand Up @@ -54,6 +54,7 @@
#include "command/ExecutionNotPossible.h"
#include "MapPropertyInfoFileModule.h"
#include "messages/NotificationMessage.h"
#include "MergeActionNode.h"

#include <fmt/format.h>
#include "scene/ChildPrimitives.h"
Expand Down Expand Up @@ -982,6 +983,19 @@ void Map::mergeMap(const cmd::ArgumentList& args)
// Create the merge actions
_mergeOperation = scene::merge::MergeOperation::CreateFromComparisonResult(*result);

// Create renderable merge actions
_mergeOperation->foreachAction([&](const scene::merge::MergeAction::Ptr& action)
{
if (action->getType() == scene::merge::ActionType::AddChildNode ||
action->getType() == scene::merge::ActionType::AddEntity)
{
return;
}

_mergeActionNodes.emplace_back(std::make_shared<MergeActionNode>(action));
getRoot()->addChildNode(_mergeActionNodes.back());
});

// Switch to merge mode
setEditMode(EditMode::Merge);
}
Expand Down
2 changes: 2 additions & 0 deletions radiantcore/map/Map.h
Expand Up @@ -18,6 +18,7 @@
#include <sigc++/signal.h>
#include "time/StopWatch.h"
#include "scene/merge/MergeOperation.h"
#include "MergeActionNode.h"

class TextInputStream;

Expand Down Expand Up @@ -67,6 +68,7 @@ class Map :
std::size_t _shutdownListener;

scene::merge::MergeOperation::Ptr _mergeOperation;
std::list<MergeActionNode::Ptr> _mergeActionNodes;

private:
std::string getSaveConfirmationText() const;
Expand Down
82 changes: 82 additions & 0 deletions radiantcore/map/MergeActionNode.h
@@ -0,0 +1,82 @@
#pragma once

#include "math/AABB.h"
#include "scene/SelectableNode.h"
#include "scene/merge/MergeAction.h"

namespace map
{

class MergeActionNode :
public scene::SelectableNode
{
private:
scene::merge::MergeAction::Ptr _action;
scene::INodePtr _affectedNode;

public:
using Ptr = std::shared_ptr<MergeActionNode>;

MergeActionNode(const scene::merge::MergeAction::Ptr& action) :
_action(action)
{
_affectedNode = _action->getAffectedNode();

// Hide the affected node itself
_affectedNode->enable(Node::eHidden);
}

void onInsertIntoScene(scene::IMapRootNode& root) override
{
SelectableNode::onInsertIntoScene(root);

if (_affectedNode->getRootNode() != getRootNode())
{
scene::addNodeToContainer(_affectedNode, getRootNode());
}
}

void onRemoveFromScene(scene::IMapRootNode& root) override
{
SelectableNode::onRemoveFromScene(root);

if (!_affectedNode->inScene())
{
scene::removeNodeFromParent(_affectedNode);
}
}

void setRenderSystem(const RenderSystemPtr& renderSystem) override
{
SelectableNode::setRenderSystem(renderSystem);

_affectedNode->setRenderSystem(renderSystem);
}

scene::INode::Type getNodeType() const override
{
return scene::INode::Type::MergeAction;
}

const AABB& localAABB() const override
{
return _affectedNode->localAABB();
}

void renderSolid(RenderableCollector& collector, const VolumeTest& volume) const override
{
_affectedNode->renderSolid(collector, volume);
}

void renderWireframe(RenderableCollector& collector, const VolumeTest& volume) const override
{
_affectedNode->renderWireframe(collector, volume);
}

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

}
1 change: 1 addition & 0 deletions tools/msvc/DarkRadiantCore.vcxproj
Expand Up @@ -841,6 +841,7 @@
<ClInclude Include="..\..\radiantcore\map\MapResource.h" />
<ClInclude Include="..\..\radiantcore\map\MapResourceLoader.h" />
<ClInclude Include="..\..\radiantcore\map\MapResourceManager.h" />
<ClInclude Include="..\..\radiantcore\map\MergeActionNode.h" />
<ClInclude Include="..\..\radiantcore\map\ModelBreakdown.h" />
<ClInclude Include="..\..\radiantcore\map\mru\MRU.h" />
<ClInclude Include="..\..\radiantcore\map\mru\MRUList.h" />
Expand Down
3 changes: 3 additions & 0 deletions tools/msvc/DarkRadiantCore.vcxproj.filters
Expand Up @@ -2139,5 +2139,8 @@
<ClInclude Include="..\..\radiantcore\log\SegFaultHandler.h">
<Filter>src\log</Filter>
</ClInclude>
<ClInclude Include="..\..\radiantcore\map\MergeActionNode.h">
<Filter>src\map</Filter>
</ClInclude>
</ItemGroup>
</Project>

0 comments on commit 7e8193d

Please sign in to comment.