Made SceneNode name change reflect on the Scene

Former-commit-id: b924b0b9d103e4fce6ab2faf952b9153d49cce06
This commit is contained in:
Lynix 2015-01-25 16:34:19 +01:00
parent 6d8b266b4c
commit bc6dd44009
4 changed files with 53 additions and 3 deletions

View File

@ -27,6 +27,8 @@ class NzSceneNode;
class NAZARA_API NzScene class NAZARA_API NzScene
{ {
friend NzSceneNode;
public: public:
NzScene(); NzScene();
~NzScene() = default; ~NzScene() = default;
@ -88,6 +90,7 @@ class NAZARA_API NzScene
operator const NzSceneNode&() const; operator const NzSceneNode&() const;
private: private:
bool ChangeNodeName(NzSceneNode* node, const NzString& newName);
bool RegisterSceneNode(const NzString& name, NzSceneNode* node); bool RegisterSceneNode(const NzString& name, NzSceneNode* node);
void RecursiveFrustumCull(NzAbstractRenderQueue* renderQueue, const NzFrustumf& frustum, NzNode* node); void RecursiveFrustumCull(NzAbstractRenderQueue* renderQueue, const NzFrustumf& frustum, NzNode* node);

View File

@ -52,7 +52,7 @@ class NAZARA_API NzSceneNode : public NzNode
bool IsDrawingEnabled() const; bool IsDrawingEnabled() const;
bool IsVisible() const; bool IsVisible() const;
void SetName(const NzString& name); bool SetName(const NzString& name);
NzSceneNode& operator=(const NzSceneNode& sceneNode); NzSceneNode& operator=(const NzSceneNode& sceneNode);
NzSceneNode& operator=(NzSceneNode&& sceneNode) = delete; NzSceneNode& operator=(NzSceneNode&& sceneNode) = delete;
@ -65,6 +65,7 @@ class NAZARA_API NzSceneNode : public NzNode
virtual void OnVisibilityChange(bool visibility); virtual void OnVisibilityChange(bool visibility);
void RecursiveSetScene(NzScene* scene, NzNode* node); void RecursiveSetScene(NzScene* scene, NzNode* node);
virtual void Register(); virtual void Register();
void SetNameInternal(const NzString& name);
void SetScene(NzScene* scene); void SetScene(NzScene* scene);
virtual void Unregister(); virtual void Unregister();
virtual void Update(); virtual void Update();

View File

@ -383,6 +383,38 @@ NzScene::operator const NzSceneNode&() const
return m_root; return m_root;
} }
bool NzScene::ChangeNodeName(NzSceneNode* node, const NzString& newName)
{
#ifdef NAZARA_DEBUG
std::unique_ptr<NzSceneNode> 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) bool NzScene::RegisterSceneNode(const NzString& name, NzSceneNode* node)
{ {
if (!name.IsEmpty()) if (!name.IsEmpty())
@ -396,6 +428,7 @@ bool NzScene::RegisterSceneNode(const NzString& name, NzSceneNode* node)
m_nodeMap[name] = node; m_nodeMap[name] = node;
} }
node->SetNameInternal(name);
node->SetParent(m_root, true); node->SetParent(m_root, true);
m_nodes.emplace_back(node); m_nodes.emplace_back(node);

View File

@ -144,9 +144,17 @@ bool NzSceneNode::IsVisible() const
return m_visible; 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) 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) void NzSceneNode::SetScene(NzScene* scene)
{ {
if (m_scene != scene) if (m_scene != scene)