diff --git a/include/Nazara/Graphics/Scene.hpp b/include/Nazara/Graphics/Scene.hpp index 60dd21d43..b0e51575d 100644 --- a/include/Nazara/Graphics/Scene.hpp +++ b/include/Nazara/Graphics/Scene.hpp @@ -27,6 +27,8 @@ class NzSceneNode; class NAZARA_API NzScene { + friend NzSceneNode; + public: NzScene(); ~NzScene() = default; @@ -88,6 +90,7 @@ class NAZARA_API NzScene operator const NzSceneNode&() const; private: + bool ChangeNodeName(NzSceneNode* node, const NzString& newName); bool RegisterSceneNode(const NzString& name, NzSceneNode* node); void RecursiveFrustumCull(NzAbstractRenderQueue* renderQueue, const NzFrustumf& frustum, NzNode* node); diff --git a/include/Nazara/Graphics/SceneNode.hpp b/include/Nazara/Graphics/SceneNode.hpp index 8c99787ad..b695a5d57 100644 --- a/include/Nazara/Graphics/SceneNode.hpp +++ b/include/Nazara/Graphics/SceneNode.hpp @@ -52,7 +52,7 @@ class NAZARA_API NzSceneNode : public NzNode bool IsDrawingEnabled() const; bool IsVisible() const; - void SetName(const NzString& name); + bool SetName(const NzString& name); NzSceneNode& operator=(const NzSceneNode& sceneNode); NzSceneNode& operator=(NzSceneNode&& sceneNode) = delete; @@ -65,6 +65,7 @@ class NAZARA_API NzSceneNode : public NzNode virtual void OnVisibilityChange(bool visibility); void RecursiveSetScene(NzScene* scene, NzNode* node); virtual void Register(); + void SetNameInternal(const NzString& name); void SetScene(NzScene* scene); virtual void Unregister(); virtual void Update(); diff --git a/src/Nazara/Graphics/Scene.cpp b/src/Nazara/Graphics/Scene.cpp index 55c2165fe..d40344810 100644 --- a/src/Nazara/Graphics/Scene.cpp +++ b/src/Nazara/Graphics/Scene.cpp @@ -383,6 +383,38 @@ NzScene::operator const NzSceneNode&() const return m_root; } +bool NzScene::ChangeNodeName(NzSceneNode* node, const NzString& newName) +{ + #ifdef NAZARA_DEBUG + std::unique_ptr ptr(node); + auto it = std::find(m_nodes.begin(), m_nodes.end(), ptr); + ptr.release(); + + if (it == m_nodes.end()) + { + NazaraInternalError("Node isn't part of the scene"); + return false; + } + #endif + + if (!newName.IsEmpty()) + { + auto pair = m_nodeMap.insert(std::make_pair(newName, node)); + if (!pair.second) + { + NazaraError("Name \"" + newName + "\" is already in use"); + return false; + } + } + + NzString oldName = node->GetName(); + if (!oldName.IsEmpty()) + m_nodeMap.erase(oldName); + + node->SetNameInternal(newName); + return true; +} + bool NzScene::RegisterSceneNode(const NzString& name, NzSceneNode* node) { if (!name.IsEmpty()) @@ -396,6 +428,7 @@ bool NzScene::RegisterSceneNode(const NzString& name, NzSceneNode* node) m_nodeMap[name] = node; } + node->SetNameInternal(name); node->SetParent(m_root, true); m_nodes.emplace_back(node); diff --git a/src/Nazara/Graphics/SceneNode.cpp b/src/Nazara/Graphics/SceneNode.cpp index 0c795d956..bace91038 100644 --- a/src/Nazara/Graphics/SceneNode.cpp +++ b/src/Nazara/Graphics/SceneNode.cpp @@ -144,9 +144,17 @@ bool NzSceneNode::IsVisible() const return m_visible; } -void NzSceneNode::SetName(const NzString& name) +bool NzSceneNode::SetName(const NzString& name) { - m_name = name; + if (m_scene) + // On demande à la scène de changer notre nom + return m_scene->ChangeNodeName(this, name); + else + { + // Pas de scène ? Changeons notre nom nous-même + SetNameInternal(name); + return true; + } } NzSceneNode& NzSceneNode::operator=(const NzSceneNode& sceneNode) @@ -211,6 +219,11 @@ void NzSceneNode::Register() { } +void NzSceneNode::SetNameInternal(const NzString& name) +{ + m_name = name; +} + void NzSceneNode::SetScene(NzScene* scene) { if (m_scene != scene)