Skip to content

Commit

Permalink
#5623: Scene removal of MergeActionNodes.
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed May 29, 2021
1 parent c0ab4db commit b5f1779
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 10 deletions.
54 changes: 52 additions & 2 deletions radiantcore/map/MergeActionNode.h
@@ -1,16 +1,18 @@
#pragma once

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

namespace map
{

class MergeActionNode :
class MergeActionNode final :
public scene::IMergeActionNode,
public scene::SelectableNode
public scene::SelectableNode,
public SelectionTestable
{
private:
scene::merge::MergeAction::Ptr _action;
Expand Down Expand Up @@ -42,6 +44,27 @@ class MergeActionNode :
});
}

void onRemoveFromScene(scene::IMapRootNode& rootNode) override
{
auto addNodeAction = std::dynamic_pointer_cast<scene::merge::AddCloneToParentAction>(_action);

if (addNodeAction)
{
scene::removeNodeFromParent(_affectedNode);
}

// Release the hidden state of the contained nodes
_affectedNode->disable(Node::eHidden);

_affectedNode->foreachNode([&](const scene::INodePtr& child)
{
child->disable(Node::eHidden);
return true;
});

SelectableNode::onRemoveFromScene(rootNode);
}

scene::merge::ActionType getActionType() const override
{
return _action->getType();
Expand Down Expand Up @@ -85,6 +108,33 @@ class MergeActionNode :
{
return Highlight::NoHighlight;
}

void testSelect(Selector& selector, SelectionTest& test) override
{
testSelectNode(_affectedNode, selector, test);

_affectedNode->foreachNode([&](const scene::INodePtr& child)
{
testSelectNode(child, selector, test);
return true;
});
}

private:
void testSelectNode(const scene::INodePtr& node, Selector& selector, SelectionTest& test)
{
auto selectionTestable = std::dynamic_pointer_cast<SelectionTestable>(node);

// Regardless of what node we test, it will always be the MergeActionNode that will be selected
selector.pushSelectable(*this);

if (selectionTestable)
{
selectionTestable->testSelect(selector, test);
}

selector.popSelectable();
}
};

}
10 changes: 2 additions & 8 deletions radiantcore/selection/SelectionTestWalkers.cpp
Expand Up @@ -54,7 +54,7 @@ void SelectionTestWalker::performSelectionTest(const scene::INodePtr& selectable

_selector.pushSelectable(*selectable);

// Test the entity for selection, this will add an intersection to the selector
// Test the node for selection, this will add an intersection to the selector
auto selectionTestable = Node_getSelectionTestable(nodeToBeTested);

if (selectionTestable)
Expand Down Expand Up @@ -196,14 +196,8 @@ MergeActionSelector::MergeActionSelector(Selector& selector, SelectionTest& test

bool MergeActionSelector::visit(const scene::INodePtr& node)
{
if (node->getNodeType() != scene::INode::Type::MergeAction)
{
return true; // skip over every mismatching type
}

performSelectionTest(node, node);

return false;
return true;
}

bool MergeActionSelector::nodeIsEligibleForTesting(const scene::INodePtr& node)
Expand Down

0 comments on commit b5f1779

Please sign in to comment.