diff --git a/include/Nazara/Utility/Node.hpp b/include/Nazara/Utility/Node.hpp index 0af3b619f..8bf5bb26d 100644 --- a/include/Nazara/Utility/Node.hpp +++ b/include/Nazara/Utility/Node.hpp @@ -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*/); diff --git a/src/Nazara/Utility/Node.cpp b/src/Nazara/Utility/Node.cpp index 0b70e69f9..3b4e6f8ac 100644 --- a/src/Nazara/Utility/Node.cpp +++ b/src/Nazara/Utility/Node.cpp @@ -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