Added visibility state to SceneNode
Former-commit-id: 5325e268a4276d6e2e3e72648641ca03225ab4da
This commit is contained in:
parent
e26728c424
commit
0e49132cd9
|
|
@ -51,12 +51,12 @@ class NAZARA_API NzCamera : public NzSceneNode
|
||||||
private:
|
private:
|
||||||
void AddToRenderQueue(NzRenderQueue& renderQueue) const;
|
void AddToRenderQueue(NzRenderQueue& renderQueue) const;
|
||||||
void Invalidate();
|
void Invalidate();
|
||||||
bool IsVisible(const NzFrustumf& frustum) const override;
|
|
||||||
void Register();
|
void Register();
|
||||||
void Unregister();
|
void Unregister();
|
||||||
void UpdateFrustum() const;
|
void UpdateFrustum() const;
|
||||||
void UpdateProjectionMatrix() const;
|
void UpdateProjectionMatrix() const;
|
||||||
void UpdateViewMatrix() const;
|
void UpdateViewMatrix() const;
|
||||||
|
bool VisibilityTest(const NzFrustumf& frustum) override;
|
||||||
|
|
||||||
mutable NzFrustumf m_frustum;
|
mutable NzFrustumf m_frustum;
|
||||||
mutable NzMatrix4f m_projectionMatrix;
|
mutable NzMatrix4f m_projectionMatrix;
|
||||||
|
|
|
||||||
|
|
@ -36,8 +36,6 @@ class NAZARA_API NzLight : public NzSceneNode
|
||||||
nzSceneNodeType GetSceneNodeType() const;
|
nzSceneNodeType GetSceneNodeType() const;
|
||||||
NzColor GetSpecularColor() const;
|
NzColor GetSpecularColor() const;
|
||||||
|
|
||||||
bool IsVisible(const NzFrustumf& frustum) const;
|
|
||||||
|
|
||||||
void SetAmbientColor(const NzColor& ambient);
|
void SetAmbientColor(const NzColor& ambient);
|
||||||
void SetAttenuation(float attenuation);
|
void SetAttenuation(float attenuation);
|
||||||
void SetDiffuseColor(const NzColor& diffuse);
|
void SetDiffuseColor(const NzColor& diffuse);
|
||||||
|
|
@ -52,6 +50,7 @@ class NAZARA_API NzLight : public NzSceneNode
|
||||||
void Register();
|
void Register();
|
||||||
void Unregister();
|
void Unregister();
|
||||||
void UpdateFrustum();
|
void UpdateFrustum();
|
||||||
|
bool VisibilityTest(const NzFrustumf& frustum);
|
||||||
|
|
||||||
nzLightType m_type;
|
nzLightType m_type;
|
||||||
NzBoundingBoxf m_boundingBox;
|
NzBoundingBoxf m_boundingBox;
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,6 @@ class NAZARA_API NzModel : public NzSceneNode, public NzUpdatable
|
||||||
|
|
||||||
bool IsAnimationEnabled() const;
|
bool IsAnimationEnabled() const;
|
||||||
bool IsDrawEnabled() const;
|
bool IsDrawEnabled() const;
|
||||||
bool IsVisible(const NzFrustumf& frustum) const override;
|
|
||||||
|
|
||||||
bool LoadFromFile(const NzString& meshPath, const NzModelParameters& modelParameters = NzModelParameters());
|
bool LoadFromFile(const NzString& meshPath, const NzModelParameters& modelParameters = NzModelParameters());
|
||||||
bool LoadFromMemory(const void* data, std::size_t size, const NzModelParameters& modelParameters = NzModelParameters());
|
bool LoadFromMemory(const void* data, std::size_t size, const NzModelParameters& modelParameters = NzModelParameters());
|
||||||
|
|
@ -77,6 +76,7 @@ class NAZARA_API NzModel : public NzSceneNode, public NzUpdatable
|
||||||
void Unregister() override;
|
void Unregister() override;
|
||||||
void Update() override;
|
void Update() override;
|
||||||
void UpdateBoundingBox() const;
|
void UpdateBoundingBox() const;
|
||||||
|
bool VisibilityTest(const NzFrustumf& frustum) override;
|
||||||
|
|
||||||
std::vector<NzMaterial*> m_materials;
|
std::vector<NzMaterial*> m_materials;
|
||||||
mutable NzBoundingBoxf m_boundingBox;
|
mutable NzBoundingBoxf m_boundingBox;
|
||||||
|
|
|
||||||
|
|
@ -10,10 +10,12 @@
|
||||||
#include <Nazara/Prerequesites.hpp>
|
#include <Nazara/Prerequesites.hpp>
|
||||||
#include <Nazara/Core/Color.hpp>
|
#include <Nazara/Core/Color.hpp>
|
||||||
#include <Nazara/Core/Updatable.hpp>
|
#include <Nazara/Core/Updatable.hpp>
|
||||||
|
#include <Nazara/Math/Frustum.hpp>
|
||||||
|
|
||||||
class NzCamera;
|
class NzCamera;
|
||||||
class NzLight;
|
class NzLight;
|
||||||
class NzModel;
|
class NzModel;
|
||||||
|
class NzRenderQueue;
|
||||||
class NzSceneNode;
|
class NzSceneNode;
|
||||||
struct NzSceneImpl;
|
struct NzSceneImpl;
|
||||||
|
|
||||||
|
|
@ -45,6 +47,7 @@ class NAZARA_API NzScene
|
||||||
operator const NzSceneNode&() const;
|
operator const NzSceneNode&() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void RecursiveFrustumCull(NzRenderQueue& renderQueue, const NzFrustumf& frustum, NzSceneNode* node);
|
||||||
void SetActiveCamera(const NzCamera* camera);
|
void SetActiveCamera(const NzCamera* camera);
|
||||||
|
|
||||||
NzSceneImpl* m_impl;
|
NzSceneImpl* m_impl;
|
||||||
|
|
|
||||||
|
|
@ -31,17 +31,22 @@ class NAZARA_API NzSceneNode : public NzNode
|
||||||
NzScene* GetScene() const;
|
NzScene* GetScene() const;
|
||||||
virtual nzSceneNodeType GetSceneNodeType() const = 0;
|
virtual nzSceneNodeType GetSceneNodeType() const = 0;
|
||||||
|
|
||||||
virtual bool IsVisible(const NzFrustumf& frustum) const = 0;
|
bool IsVisible() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void OnParenting(const NzNode* parent) override;
|
virtual void OnParenting(const NzNode* parent) override;
|
||||||
|
virtual void OnVisibilityChange(bool visibility);
|
||||||
virtual void Register();
|
virtual void Register();
|
||||||
void SetScene(NzScene* scene);
|
void SetScene(NzScene* scene);
|
||||||
virtual bool ShouldUpdateWhenVisible();
|
|
||||||
virtual void Unregister();
|
virtual void Unregister();
|
||||||
virtual void Update();
|
virtual void Update();
|
||||||
|
virtual bool VisibilityTest(const NzFrustumf& frustum) = 0;
|
||||||
|
|
||||||
NzScene* m_scene;
|
NzScene* m_scene;
|
||||||
|
bool m_visible;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void UpdateVisibility(const NzFrustumf& frustum);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // NAZARA_SCENENODE_HPP
|
#endif // NAZARA_SCENENODE_HPP
|
||||||
|
|
|
||||||
|
|
@ -22,14 +22,13 @@ class NAZARA_API NzSceneRoot : public NzSceneNode
|
||||||
const NzBoundingBoxf& GetBoundingBox() const override;
|
const NzBoundingBoxf& GetBoundingBox() const override;
|
||||||
nzSceneNodeType GetSceneNodeType() const override;
|
nzSceneNodeType GetSceneNodeType() const override;
|
||||||
|
|
||||||
bool IsVisible(const NzFrustumf& frustum) const override;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
NzSceneRoot(NzScene* scene);
|
NzSceneRoot(NzScene* scene);
|
||||||
virtual ~NzSceneRoot();
|
virtual ~NzSceneRoot();
|
||||||
|
|
||||||
void Register();
|
void Register();
|
||||||
void Unregister();
|
void Unregister();
|
||||||
|
bool VisibilityTest(const NzFrustumf& frustum) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // NAZARA_SCENEROOT_HPP
|
#endif // NAZARA_SCENEROOT_HPP
|
||||||
|
|
|
||||||
|
|
@ -216,13 +216,6 @@ void NzCamera::Invalidate()
|
||||||
m_viewMatrixUpdated = false;
|
m_viewMatrixUpdated = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NzCamera::IsVisible(const NzFrustumf& frustum) const
|
|
||||||
{
|
|
||||||
NazaraUnused(frustum);
|
|
||||||
//NazaraInternalError("SceneNode::IsVisible() called on Camera");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void NzCamera::Register()
|
void NzCamera::Register()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
@ -251,3 +244,10 @@ void NzCamera::UpdateViewMatrix() const
|
||||||
m_viewMatrix.MakeLookAt(m_derivedPosition, m_derivedPosition + m_derivedRotation*NzVector3f::Forward(), m_upVector);
|
m_viewMatrix.MakeLookAt(m_derivedPosition, m_derivedPosition + m_derivedRotation*NzVector3f::Forward(), m_upVector);
|
||||||
m_viewMatrixUpdated = true;
|
m_viewMatrixUpdated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NzCamera::VisibilityTest(const NzFrustumf& frustum)
|
||||||
|
{
|
||||||
|
NazaraUnused(frustum);
|
||||||
|
//NazaraInternalError("SceneNode::IsVisible() called on Camera");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -179,14 +179,6 @@ NzColor NzLight::GetSpecularColor() const
|
||||||
return m_specularColor;
|
return m_specularColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NzLight::IsVisible(const NzFrustumf& frustum) const
|
|
||||||
{
|
|
||||||
NazaraUnused(frustum);
|
|
||||||
|
|
||||||
///FIXME: Pour l'instant toujours visible
|
|
||||||
return true; // Toujours visible
|
|
||||||
}
|
|
||||||
|
|
||||||
void NzLight::SetAmbientColor(const NzColor& ambient)
|
void NzLight::SetAmbientColor(const NzColor& ambient)
|
||||||
{
|
{
|
||||||
m_ambientColor = ambient;
|
m_ambientColor = ambient;
|
||||||
|
|
@ -236,3 +228,11 @@ void NzLight::Register()
|
||||||
void NzLight::Unregister()
|
void NzLight::Unregister()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NzLight::VisibilityTest(const NzFrustumf& frustum)
|
||||||
|
{
|
||||||
|
NazaraUnused(frustum);
|
||||||
|
|
||||||
|
///FIXME: Pour l'instant toujours visible
|
||||||
|
return true; // Toujours visible
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -258,25 +258,6 @@ bool NzModel::IsDrawEnabled() const
|
||||||
return m_drawEnabled;
|
return m_drawEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NzModel::IsVisible(const NzFrustumf& frustum) const
|
|
||||||
{
|
|
||||||
#if NAZARA_3D_SAFE
|
|
||||||
if (!m_mesh)
|
|
||||||
{
|
|
||||||
NazaraError("Model has no mesh");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!m_drawEnabled)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (!m_boundingBoxUpdated)
|
|
||||||
UpdateBoundingBox();
|
|
||||||
|
|
||||||
return frustum.Contains(m_boundingBox);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool NzModel::LoadFromFile(const NzString& meshPath, const NzModelParameters& modelParameters)
|
bool NzModel::LoadFromFile(const NzString& meshPath, const NzModelParameters& modelParameters)
|
||||||
{
|
{
|
||||||
///TODO: ResourceManager
|
///TODO: ResourceManager
|
||||||
|
|
@ -620,3 +601,22 @@ void NzModel::UpdateBoundingBox() const
|
||||||
m_boundingBox.Update(m_transformMatrix);
|
m_boundingBox.Update(m_transformMatrix);
|
||||||
m_boundingBoxUpdated = true;
|
m_boundingBoxUpdated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NzModel::VisibilityTest(const NzFrustumf& frustum)
|
||||||
|
{
|
||||||
|
#if NAZARA_3D_SAFE
|
||||||
|
if (!m_mesh)
|
||||||
|
{
|
||||||
|
NazaraError("Model has no mesh");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!m_drawEnabled)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!m_boundingBoxUpdated)
|
||||||
|
UpdateBoundingBox();
|
||||||
|
|
||||||
|
return frustum.Contains(m_boundingBox);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -36,23 +36,6 @@ namespace
|
||||||
|
|
||||||
NzVector3f pos;
|
NzVector3f pos;
|
||||||
};
|
};
|
||||||
|
|
||||||
void RecursiveFrustumCull(NzRenderQueue& renderQueue, const NzFrustumf& frustum, NzSceneNode* node)
|
|
||||||
{
|
|
||||||
for (NzNode* child : node->GetChilds())
|
|
||||||
{
|
|
||||||
if (child->GetNodeType() == nzNodeType_Scene)
|
|
||||||
{
|
|
||||||
NzSceneNode* sceneNode = static_cast<NzSceneNode*>(child);
|
|
||||||
///TODO: Empêcher le rendu des enfants si le parent est cullé selon un flag
|
|
||||||
if (sceneNode->IsVisible(frustum))
|
|
||||||
sceneNode->AddToRenderQueue(renderQueue);
|
|
||||||
|
|
||||||
if (sceneNode->HasChilds())
|
|
||||||
RecursiveFrustumCull(renderQueue, frustum, sceneNode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct NzSceneImpl
|
struct NzSceneImpl
|
||||||
|
|
@ -402,6 +385,24 @@ NzScene::operator const NzSceneNode&() const
|
||||||
return m_impl->root;
|
return m_impl->root;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NzScene::RecursiveFrustumCull(NzRenderQueue& renderQueue, const NzFrustumf& frustum, NzSceneNode* node)
|
||||||
|
{
|
||||||
|
for (NzNode* child : node->GetChilds())
|
||||||
|
{
|
||||||
|
if (child->GetNodeType() == nzNodeType_Scene)
|
||||||
|
{
|
||||||
|
NzSceneNode* sceneNode = static_cast<NzSceneNode*>(child);
|
||||||
|
///TODO: Empêcher le rendu des enfants si le parent est cullé selon un flag
|
||||||
|
sceneNode->UpdateVisibility(frustum);
|
||||||
|
if (sceneNode->IsVisible())
|
||||||
|
sceneNode->AddToRenderQueue(renderQueue);
|
||||||
|
|
||||||
|
if (sceneNode->HasChilds())
|
||||||
|
RecursiveFrustumCull(renderQueue, frustum, sceneNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void NzScene::SetActiveCamera(const NzCamera* camera)
|
void NzScene::SetActiveCamera(const NzCamera* camera)
|
||||||
{
|
{
|
||||||
m_impl->activeCamera = camera;
|
m_impl->activeCamera = camera;
|
||||||
|
|
|
||||||
|
|
@ -7,13 +7,15 @@
|
||||||
#include <Nazara/3D/Debug.hpp>
|
#include <Nazara/3D/Debug.hpp>
|
||||||
|
|
||||||
NzSceneNode::NzSceneNode() :
|
NzSceneNode::NzSceneNode() :
|
||||||
m_scene(nullptr)
|
m_scene(nullptr),
|
||||||
|
m_visible(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
NzSceneNode::NzSceneNode(const NzSceneNode& node) :
|
NzSceneNode::NzSceneNode(const NzSceneNode& node) :
|
||||||
NzNode(node),
|
NzNode(node),
|
||||||
m_scene(node.m_scene)
|
m_scene(node.m_scene),
|
||||||
|
m_visible(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -29,6 +31,11 @@ NzScene* NzSceneNode::GetScene() const
|
||||||
return m_scene;
|
return m_scene;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NzSceneNode::IsVisible() const
|
||||||
|
{
|
||||||
|
return m_visible;
|
||||||
|
}
|
||||||
|
|
||||||
void NzSceneNode::OnParenting(const NzNode* parent)
|
void NzSceneNode::OnParenting(const NzNode* parent)
|
||||||
{
|
{
|
||||||
if (parent)
|
if (parent)
|
||||||
|
|
@ -40,6 +47,13 @@ void NzSceneNode::OnParenting(const NzNode* parent)
|
||||||
SetScene(nullptr);
|
SetScene(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NzSceneNode::OnVisibilityChange(bool visibility)
|
||||||
|
{
|
||||||
|
NazaraUnused(visibility);
|
||||||
|
|
||||||
|
///TODO: Envoyer l'évènements aux listeners
|
||||||
|
}
|
||||||
|
|
||||||
void NzSceneNode::Register()
|
void NzSceneNode::Register()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
@ -63,11 +77,6 @@ void NzSceneNode::SetScene(NzScene* scene)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NzSceneNode::ShouldUpdateWhenVisible()
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void NzSceneNode::Unregister()
|
void NzSceneNode::Unregister()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
@ -75,3 +84,13 @@ void NzSceneNode::Unregister()
|
||||||
void NzSceneNode::Update()
|
void NzSceneNode::Update()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NzSceneNode::UpdateVisibility(const NzFrustumf& frustum)
|
||||||
|
{
|
||||||
|
bool wasVisible = m_visible;
|
||||||
|
|
||||||
|
m_visible = VisibilityTest(frustum);
|
||||||
|
|
||||||
|
if (m_visible != wasVisible)
|
||||||
|
OnVisibilityChange(m_visible);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,13 +31,6 @@ nzSceneNodeType NzSceneRoot::GetSceneNodeType() const
|
||||||
return nzSceneNodeType_Root;
|
return nzSceneNodeType_Root;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NzSceneRoot::IsVisible(const NzFrustumf& frustum) const
|
|
||||||
{
|
|
||||||
NazaraUnused(frustum);
|
|
||||||
|
|
||||||
return true; // Toujours visible
|
|
||||||
}
|
|
||||||
|
|
||||||
void NzSceneRoot::Register()
|
void NzSceneRoot::Register()
|
||||||
{
|
{
|
||||||
NazaraInternalError("SceneNode::Register() called on SceneRoot");
|
NazaraInternalError("SceneNode::Register() called on SceneRoot");
|
||||||
|
|
@ -47,3 +40,10 @@ void NzSceneRoot::Unregister()
|
||||||
{
|
{
|
||||||
NazaraInternalError("SceneNode::Unregister() called on SceneRoot");
|
NazaraInternalError("SceneNode::Unregister() called on SceneRoot");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NzSceneRoot::VisibilityTest(const NzFrustumf& frustum)
|
||||||
|
{
|
||||||
|
NazaraUnused(frustum);
|
||||||
|
|
||||||
|
return true; // Toujours visible
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue