diff --git a/include/Nazara/3D/Scene.hpp b/include/Nazara/3D/Scene.hpp index 86e36c5d7..94f5a60b0 100644 --- a/include/Nazara/3D/Scene.hpp +++ b/include/Nazara/3D/Scene.hpp @@ -15,6 +15,7 @@ class NzCamera; class NzLight; class NzModel; +class NzNode; class NzRenderQueue; class NzSceneNode; struct NzSceneImpl; @@ -47,7 +48,7 @@ class NAZARA_API NzScene operator const NzSceneNode&() const; private: - void RecursiveFrustumCull(NzRenderQueue& renderQueue, const NzFrustumf& frustum, NzSceneNode* node); + void RecursiveFrustumCull(NzRenderQueue& renderQueue, const NzFrustumf& frustum, NzNode* node); void SetActiveCamera(const NzCamera* camera); NzSceneImpl* m_impl; diff --git a/include/Nazara/3D/SceneNode.hpp b/include/Nazara/3D/SceneNode.hpp index 3501c366f..5fd281bc7 100644 --- a/include/Nazara/3D/SceneNode.hpp +++ b/include/Nazara/3D/SceneNode.hpp @@ -36,6 +36,7 @@ class NAZARA_API NzSceneNode : public NzNode protected: virtual void OnParenting(const NzNode* parent) override; virtual void OnVisibilityChange(bool visibility); + void RecursiveSetScene(NzScene* scene, NzNode* node); virtual void Register(); void SetScene(NzScene* scene); virtual void Unregister(); diff --git a/src/Nazara/3D/Scene.cpp b/src/Nazara/3D/Scene.cpp index f8a90a8c5..4f2aa2dbc 100644 --- a/src/Nazara/3D/Scene.cpp +++ b/src/Nazara/3D/Scene.cpp @@ -389,7 +389,7 @@ NzScene::operator const NzSceneNode&() const return m_impl->root; } -void NzScene::RecursiveFrustumCull(NzRenderQueue& renderQueue, const NzFrustumf& frustum, NzSceneNode* node) +void NzScene::RecursiveFrustumCull(NzRenderQueue& renderQueue, const NzFrustumf& frustum, NzNode* node) { for (NzNode* child : node->GetChilds()) { @@ -400,10 +400,10 @@ void NzScene::RecursiveFrustumCull(NzRenderQueue& renderQueue, const NzFrustumf& sceneNode->UpdateVisibility(frustum); if (sceneNode->IsVisible()) sceneNode->AddToRenderQueue(renderQueue); - - if (sceneNode->HasChilds()) - RecursiveFrustumCull(renderQueue, frustum, sceneNode); } + + if (child->HasChilds()) + RecursiveFrustumCull(renderQueue, frustum, child); } } diff --git a/src/Nazara/3D/SceneNode.cpp b/src/Nazara/3D/SceneNode.cpp index 644da8306..aa7096d56 100644 --- a/src/Nazara/3D/SceneNode.cpp +++ b/src/Nazara/3D/SceneNode.cpp @@ -54,6 +54,21 @@ void NzSceneNode::OnVisibilityChange(bool visibility) ///TODO: Envoyer l'évènements aux listeners } +void NzSceneNode::RecursiveSetScene(NzScene* scene, NzNode* node) +{ + for (NzNode* child : node->GetChilds()) + { + if (child->GetNodeType() == nzNodeType_Scene) + { + NzSceneNode* sceneNode = static_cast(child); + sceneNode->SetScene(scene); + } + + if (node->HasChilds()) + RecursiveSetScene(scene, node); + } +} + void NzSceneNode::Register() { } @@ -69,11 +84,7 @@ void NzSceneNode::SetScene(NzScene* scene) if (m_scene) Register(); - for (NzNode* child : m_childs) - { - if (child->GetNodeType() == nzNodeType_Scene) - static_cast(child)->SetScene(scene); - } + RecursiveSetScene(scene, this); } }