Utility/Node: Implement movement

This commit is contained in:
Jérôme Leclercq 2021-06-20 13:29:12 +02:00
parent b13c5c950a
commit 1ac0b2e11a
2 changed files with 67 additions and 0 deletions

View File

@ -23,6 +23,7 @@ namespace Nz
public:
Node();
Node(const Node& node);
Node(Node&& node) noexcept;
virtual ~Node();
void EnsureDerivedUpdate() const;
@ -92,6 +93,7 @@ namespace Nz
Vector3f ToLocalScale(const Vector3f& globalScale) const;
Node& operator=(const Node& node);
Node& operator=(Node&& node) noexcept;
// Signals:
NazaraSignal(OnNodeInvalidation, const Node* /*node*/);

View File

@ -41,6 +41,35 @@ namespace Nz
SetParent(node.m_parent, false);
}
Node::Node(Node&& node) noexcept :
m_childs(std::move(node.m_childs)),
m_initialRotation(node.m_initialRotation),
m_rotation(node.m_rotation),
m_initialPosition(node.m_initialPosition),
m_initialScale(node.m_initialScale),
m_position(node.m_position),
m_scale(node.m_scale),
m_parent(node.m_parent),
m_derivedUpdated(false),
m_inheritPosition(node.m_inheritPosition),
m_inheritRotation(node.m_inheritRotation),
m_inheritScale(node.m_inheritScale),
m_transformMatrixUpdated(false),
OnNodeInvalidation(std::move(node.OnNodeInvalidation)),
OnNodeNewParent(std::move(node.OnNodeNewParent)),
OnNodeRelease(std::move(node.OnNodeRelease))
{
if (m_parent)
{
m_parent->RemoveChild(&node);
m_parent->AddChild(this);
node.m_parent = nullptr;
}
for (Node* child : m_childs)
child->m_parent = this;
}
Node::~Node()
{
OnNodeRelease(this);
@ -643,6 +672,42 @@ namespace Nz
return *this;
}
Node& Node::operator=(Node&& node) noexcept
{
if (m_parent)
SetParent(nullptr);
m_inheritPosition = node.m_inheritPosition;
m_inheritRotation = node.m_inheritRotation;
m_inheritScale = node.m_inheritScale;
m_initialPosition = node.m_initialPosition;
m_initialRotation = node.m_initialRotation;
m_initialScale = node.m_initialScale;
m_position = node.m_position;
m_rotation = node.m_rotation;
m_scale = node.m_scale;
m_childs = std::move(node.m_childs);
for (Node* child : m_childs)
child->m_parent = this;
m_parent = node.m_parent;
if (m_parent)
{
m_parent->RemoveChild(&node);
m_parent->AddChild(this);
node.m_parent = nullptr;
}
OnNodeInvalidation = std::move(node.OnNodeInvalidation);
OnNodeNewParent = std::move(node.OnNodeNewParent);
OnNodeRelease = std::move(node.OnNodeRelease);
InvalidateNode();
return *this;
}
void Node::AddChild(Node* node) const
{
#ifdef NAZARA_DEBUG