Added visibility state to SceneNode
Former-commit-id: 5325e268a4276d6e2e3e72648641ca03225ab4da
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user