Added visibility state to SceneNode

Former-commit-id: 5325e268a4276d6e2e3e72648641ca03225ab4da
This commit is contained in:
Lynix 2013-03-05 12:09:51 +01:00
parent e26728c424
commit 0e49132cd9
12 changed files with 99 additions and 73 deletions

View File

@ -51,12 +51,12 @@ class NAZARA_API NzCamera : public NzSceneNode
private:
void AddToRenderQueue(NzRenderQueue& renderQueue) const;
void Invalidate();
bool IsVisible(const NzFrustumf& frustum) const override;
void Register();
void Unregister();
void UpdateFrustum() const;
void UpdateProjectionMatrix() const;
void UpdateViewMatrix() const;
bool VisibilityTest(const NzFrustumf& frustum) override;
mutable NzFrustumf m_frustum;
mutable NzMatrix4f m_projectionMatrix;

View File

@ -36,8 +36,6 @@ class NAZARA_API NzLight : public NzSceneNode
nzSceneNodeType GetSceneNodeType() const;
NzColor GetSpecularColor() const;
bool IsVisible(const NzFrustumf& frustum) const;
void SetAmbientColor(const NzColor& ambient);
void SetAttenuation(float attenuation);
void SetDiffuseColor(const NzColor& diffuse);
@ -52,6 +50,7 @@ class NAZARA_API NzLight : public NzSceneNode
void Register();
void Unregister();
void UpdateFrustum();
bool VisibilityTest(const NzFrustumf& frustum);
nzLightType m_type;
NzBoundingBoxf m_boundingBox;

View File

@ -54,7 +54,6 @@ class NAZARA_API NzModel : public NzSceneNode, public NzUpdatable
bool IsAnimationEnabled() const;
bool IsDrawEnabled() const;
bool IsVisible(const NzFrustumf& frustum) const override;
bool LoadFromFile(const NzString& meshPath, 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 Update() override;
void UpdateBoundingBox() const;
bool VisibilityTest(const NzFrustumf& frustum) override;
std::vector<NzMaterial*> m_materials;
mutable NzBoundingBoxf m_boundingBox;

View File

@ -10,10 +10,12 @@
#include <Nazara/Prerequesites.hpp>
#include <Nazara/Core/Color.hpp>
#include <Nazara/Core/Updatable.hpp>
#include <Nazara/Math/Frustum.hpp>
class NzCamera;
class NzLight;
class NzModel;
class NzRenderQueue;
class NzSceneNode;
struct NzSceneImpl;
@ -45,6 +47,7 @@ class NAZARA_API NzScene
operator const NzSceneNode&() const;
private:
void RecursiveFrustumCull(NzRenderQueue& renderQueue, const NzFrustumf& frustum, NzSceneNode* node);
void SetActiveCamera(const NzCamera* camera);
NzSceneImpl* m_impl;

View File

@ -31,17 +31,22 @@ class NAZARA_API NzSceneNode : public NzNode
NzScene* GetScene() const;
virtual nzSceneNodeType GetSceneNodeType() const = 0;
virtual bool IsVisible(const NzFrustumf& frustum) const = 0;
bool IsVisible() const;
protected:
virtual void OnParenting(const NzNode* parent) override;
virtual void OnVisibilityChange(bool visibility);
virtual void Register();
void SetScene(NzScene* scene);
virtual bool ShouldUpdateWhenVisible();
virtual void Unregister();
virtual void Update();
virtual bool VisibilityTest(const NzFrustumf& frustum) = 0;
NzScene* m_scene;
bool m_visible;
private:
void UpdateVisibility(const NzFrustumf& frustum);
};
#endif // NAZARA_SCENENODE_HPP

View File

@ -22,14 +22,13 @@ class NAZARA_API NzSceneRoot : public NzSceneNode
const NzBoundingBoxf& GetBoundingBox() const override;
nzSceneNodeType GetSceneNodeType() const override;
bool IsVisible(const NzFrustumf& frustum) const override;
private:
NzSceneRoot(NzScene* scene);
virtual ~NzSceneRoot();
void Register();
void Unregister();
bool VisibilityTest(const NzFrustumf& frustum) override;
};
#endif // NAZARA_SCENEROOT_HPP

View File

@ -216,13 +216,6 @@ void NzCamera::Invalidate()
m_viewMatrixUpdated = false;
}
bool NzCamera::IsVisible(const NzFrustumf& frustum) const
{
NazaraUnused(frustum);
//NazaraInternalError("SceneNode::IsVisible() called on Camera");
return false;
}
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_viewMatrixUpdated = true;
}
bool NzCamera::VisibilityTest(const NzFrustumf& frustum)
{
NazaraUnused(frustum);
//NazaraInternalError("SceneNode::IsVisible() called on Camera");
return false;
}

View File

@ -179,14 +179,6 @@ NzColor NzLight::GetSpecularColor() const
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)
{
m_ambientColor = ambient;
@ -236,3 +228,11 @@ void NzLight::Register()
void NzLight::Unregister()
{
}
bool NzLight::VisibilityTest(const NzFrustumf& frustum)
{
NazaraUnused(frustum);
///FIXME: Pour l'instant toujours visible
return true; // Toujours visible
}

View File

@ -258,25 +258,6 @@ bool NzModel::IsDrawEnabled() const
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)
{
///TODO: ResourceManager
@ -620,3 +601,22 @@ void NzModel::UpdateBoundingBox() const
m_boundingBox.Update(m_transformMatrix);
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);
}

View File

@ -36,23 +36,6 @@ namespace
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
@ -402,6 +385,24 @@ NzScene::operator const NzSceneNode&() const
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)
{
m_impl->activeCamera = camera;

View File

@ -7,13 +7,15 @@
#include <Nazara/3D/Debug.hpp>
NzSceneNode::NzSceneNode() :
m_scene(nullptr)
m_scene(nullptr),
m_visible(false)
{
}
NzSceneNode::NzSceneNode(const NzSceneNode& 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;
}
bool NzSceneNode::IsVisible() const
{
return m_visible;
}
void NzSceneNode::OnParenting(const NzNode* parent)
{
if (parent)
@ -40,6 +47,13 @@ void NzSceneNode::OnParenting(const NzNode* parent)
SetScene(nullptr);
}
void NzSceneNode::OnVisibilityChange(bool visibility)
{
NazaraUnused(visibility);
///TODO: Envoyer l'évènements aux listeners
}
void NzSceneNode::Register()
{
}
@ -63,11 +77,6 @@ void NzSceneNode::SetScene(NzScene* scene)
}
}
bool NzSceneNode::ShouldUpdateWhenVisible()
{
return false;
}
void NzSceneNode::Unregister()
{
}
@ -75,3 +84,13 @@ void NzSceneNode::Unregister()
void NzSceneNode::Update()
{
}
void NzSceneNode::UpdateVisibility(const NzFrustumf& frustum)
{
bool wasVisible = m_visible;
m_visible = VisibilityTest(frustum);
if (m_visible != wasVisible)
OnVisibilityChange(m_visible);
}

View File

@ -31,13 +31,6 @@ nzSceneNodeType NzSceneRoot::GetSceneNodeType() const
return nzSceneNodeType_Root;
}
bool NzSceneRoot::IsVisible(const NzFrustumf& frustum) const
{
NazaraUnused(frustum);
return true; // Toujours visible
}
void NzSceneRoot::Register()
{
NazaraInternalError("SceneNode::Register() called on SceneRoot");
@ -47,3 +40,10 @@ void NzSceneRoot::Unregister()
{
NazaraInternalError("SceneNode::Unregister() called on SceneRoot");
}
bool NzSceneRoot::VisibilityTest(const NzFrustumf& frustum)
{
NazaraUnused(frustum);
return true; // Toujours visible
}