From 13b505f91f76ed4c6b3802ebafe1e8ff7c373be9 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 9 Aug 2013 19:04:29 +0200 Subject: [PATCH] SceneNode::VisiblityTest now use Camera instead of Frustum Former-commit-id: 71199e3e80c5fbd6116d5fedb13276480f4e4731 --- include/Nazara/Graphics/Camera.hpp | 2 +- include/Nazara/Graphics/Light.hpp | 2 +- include/Nazara/Graphics/Model.hpp | 2 +- include/Nazara/Graphics/Scene.hpp | 2 +- include/Nazara/Graphics/SceneNode.hpp | 4 ++-- include/Nazara/Graphics/SceneRoot.hpp | 2 +- src/Nazara/Graphics/Camera.cpp | 5 ++--- src/Nazara/Graphics/Light.cpp | 7 ++++--- src/Nazara/Graphics/Model.cpp | 6 +++--- src/Nazara/Graphics/Scene.cpp | 11 ++++++----- src/Nazara/Graphics/SceneNode.cpp | 4 ++-- src/Nazara/Graphics/SceneRoot.cpp | 4 ++-- src/Nazara/Graphics/SkyboxBackground.cpp | 1 + src/Nazara/Renderer/RenderTarget.cpp | 2 -- 14 files changed, 27 insertions(+), 27 deletions(-) diff --git a/include/Nazara/Graphics/Camera.hpp b/include/Nazara/Graphics/Camera.hpp index 9d182fdb4..d85da5b71 100644 --- a/include/Nazara/Graphics/Camera.hpp +++ b/include/Nazara/Graphics/Camera.hpp @@ -63,7 +63,7 @@ class NAZARA_API NzCamera : public NzSceneNode, NzRenderTarget::Listener void UpdateViewMatrix() const; void UpdateViewport() const; - bool VisibilityTest(const NzFrustumf& frustum) override; + bool VisibilityTest(const NzCamera* camera) override; mutable NzFrustumf m_frustum; mutable NzMatrix4f m_projectionMatrix; diff --git a/include/Nazara/Graphics/Light.hpp b/include/Nazara/Graphics/Light.hpp index f0ba6a909..b82000aa7 100644 --- a/include/Nazara/Graphics/Light.hpp +++ b/include/Nazara/Graphics/Light.hpp @@ -53,7 +53,7 @@ class NAZARA_API NzLight : public NzSceneNode void Register(); void Unregister(); void UpdateBoundingVolume() const; - bool VisibilityTest(const NzFrustumf& frustum); + bool VisibilityTest(const NzCamera* camera) override; nzLightType m_type; mutable NzBoundingVolumef m_boundingVolume; diff --git a/include/Nazara/Graphics/Model.hpp b/include/Nazara/Graphics/Model.hpp index 05588efce..74ef71edd 100644 --- a/include/Nazara/Graphics/Model.hpp +++ b/include/Nazara/Graphics/Model.hpp @@ -93,7 +93,7 @@ class NAZARA_API NzModel : public NzSceneNode, public NzUpdatable void Unregister() override; void Update() override; void UpdateBoundingVolume() const; - bool VisibilityTest(const NzFrustumf& frustum) override; + bool VisibilityTest(const NzCamera* camera) override; std::vector m_materials; NzAnimationRef m_animation; diff --git a/include/Nazara/Graphics/Scene.hpp b/include/Nazara/Graphics/Scene.hpp index c537c7906..147450f8f 100644 --- a/include/Nazara/Graphics/Scene.hpp +++ b/include/Nazara/Graphics/Scene.hpp @@ -59,7 +59,7 @@ class NAZARA_API NzScene operator const NzSceneNode&() const; private: - void RecursiveFrustumCull(NzAbstractRenderQueue* renderQueue, const NzFrustumf& frustum, NzNode* node); + void RecursiveCameraCull(NzAbstractRenderQueue* renderQueue, const NzCamera* camera, NzNode* node); void SetActiveCamera(NzCamera* camera); NzSceneImpl* m_impl; diff --git a/include/Nazara/Graphics/SceneNode.hpp b/include/Nazara/Graphics/SceneNode.hpp index ea2f257d6..b45d6cc53 100644 --- a/include/Nazara/Graphics/SceneNode.hpp +++ b/include/Nazara/Graphics/SceneNode.hpp @@ -40,13 +40,13 @@ class NAZARA_API NzSceneNode : public NzNode void SetScene(NzScene* scene); virtual void Unregister(); virtual void Update(); - virtual bool VisibilityTest(const NzFrustumf& frustum) = 0; + virtual bool VisibilityTest(const NzCamera* camera) = 0; NzScene* m_scene; bool m_visible; private: - void UpdateVisibility(const NzFrustumf& frustum); + void UpdateVisibility(const NzCamera* camera); }; #endif // NAZARA_SCENENODE_HPP diff --git a/include/Nazara/Graphics/SceneRoot.hpp b/include/Nazara/Graphics/SceneRoot.hpp index c67eba60e..a01fd5216 100644 --- a/include/Nazara/Graphics/SceneRoot.hpp +++ b/include/Nazara/Graphics/SceneRoot.hpp @@ -28,7 +28,7 @@ class NAZARA_API NzSceneRoot : public NzSceneNode void Register(); void Unregister(); - bool VisibilityTest(const NzFrustumf& frustum) override; + bool VisibilityTest(const NzCamera* camera) override; }; #endif // NAZARA_SCENEROOT_HPP diff --git a/src/Nazara/Graphics/Camera.cpp b/src/Nazara/Graphics/Camera.cpp index ba67735f3..259762129 100644 --- a/src/Nazara/Graphics/Camera.cpp +++ b/src/Nazara/Graphics/Camera.cpp @@ -158,7 +158,6 @@ void NzCamera::SetFOV(float fov) void NzCamera::SetTarget(const NzRenderTarget* renderTarget) { - NazaraError(NzString::Pointer(m_target)); if (m_target) m_target->RemoveListener(this); @@ -307,9 +306,9 @@ void NzCamera::UpdateViewport() const m_viewportUpdated = true; } -bool NzCamera::VisibilityTest(const NzFrustumf& frustum) +bool NzCamera::VisibilityTest(const NzCamera* camera) { - NazaraUnused(frustum); + NazaraUnused(camera); //NazaraInternalError("SceneNode::IsVisible() called on Camera"); return false; } diff --git a/src/Nazara/Graphics/Light.cpp b/src/Nazara/Graphics/Light.cpp index 5a959a797..0a6a79548 100644 --- a/src/Nazara/Graphics/Light.cpp +++ b/src/Nazara/Graphics/Light.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -307,7 +308,7 @@ void NzLight::UpdateBoundingVolume() const m_boundingVolumeUpdated = true; } -bool NzLight::VisibilityTest(const NzFrustumf& frustum) +bool NzLight::VisibilityTest(const NzCamera* camera) { switch (m_type) { @@ -319,13 +320,13 @@ bool NzLight::VisibilityTest(const NzFrustumf& frustum) UpdateDerived(); // Un test sphérique est bien plus rapide et précis que celui de la bounding box - return frustum.Contains(NzSpheref(m_derivedPosition, m_radius)); + return camera->GetFrustum().Contains(NzSpheref(m_derivedPosition, m_radius)); case nzLightType_Spot: if (!m_boundingVolumeUpdated) UpdateBoundingVolume(); - return frustum.Contains(m_boundingVolume); + return camera->GetFrustum().Contains(m_boundingVolume); } NazaraError("Invalid light type (0x" + NzString::Number(m_type, 16) + ')'); diff --git a/src/Nazara/Graphics/Model.cpp b/src/Nazara/Graphics/Model.cpp index 0cb09ecb5..23a777445 100644 --- a/src/Nazara/Graphics/Model.cpp +++ b/src/Nazara/Graphics/Model.cpp @@ -4,11 +4,11 @@ #include #include +#include #include #include #include #include -#include #include bool NzModelParameters::IsValid() const @@ -671,7 +671,7 @@ void NzModel::UpdateBoundingVolume() const m_boundingVolumeUpdated = true; } -bool NzModel::VisibilityTest(const NzFrustumf& frustum) +bool NzModel::VisibilityTest(const NzCamera* camera) { #if NAZARA_GRAPHICS_SAFE if (!IsDrawable()) @@ -687,7 +687,7 @@ bool NzModel::VisibilityTest(const NzFrustumf& frustum) if (!m_boundingVolumeUpdated) UpdateBoundingVolume(); - return frustum.Contains(m_boundingVolume); + return camera->GetFrustum().Contains(m_boundingVolume); } NzModelLoader::LoaderList NzModel::s_loaders; diff --git a/src/Nazara/Graphics/Scene.cpp b/src/Nazara/Graphics/Scene.cpp index 4000f8d06..0ecd18436 100644 --- a/src/Nazara/Graphics/Scene.cpp +++ b/src/Nazara/Graphics/Scene.cpp @@ -76,8 +76,8 @@ void NzScene::Cull() m_impl->visibleUpdateList.clear(); - // Frustum culling - RecursiveFrustumCull(m_impl->renderTechnique->GetRenderQueue(), m_impl->activeCamera->GetFrustum(), &m_impl->root); + // Frustum culling/Viewport culling + RecursiveCameraCull(m_impl->renderTechnique->GetRenderQueue(), m_impl->activeCamera, &m_impl->root); ///TODO: Occlusion culling @@ -209,21 +209,22 @@ NzScene::operator const NzSceneNode&() const return m_impl->root; } -void NzScene::RecursiveFrustumCull(NzAbstractRenderQueue* renderQueue, const NzFrustumf& frustum, NzNode* node) +void NzScene::RecursiveCameraCull(NzAbstractRenderQueue* renderQueue, const NzCamera* camera, NzNode* node) { for (NzNode* child : node->GetChilds()) { if (child->GetNodeType() == nzNodeType_Scene) { NzSceneNode* sceneNode = static_cast(child); + ///TODO: Empêcher le rendu des enfants si le parent est cullé selon un flag - sceneNode->UpdateVisibility(frustum); + sceneNode->UpdateVisibility(camera); if (sceneNode->IsVisible()) sceneNode->AddToRenderQueue(renderQueue); } if (child->HasChilds()) - RecursiveFrustumCull(renderQueue, frustum, child); + RecursiveCameraCull(renderQueue, camera, child); } } diff --git a/src/Nazara/Graphics/SceneNode.cpp b/src/Nazara/Graphics/SceneNode.cpp index 25c014967..c16cef292 100644 --- a/src/Nazara/Graphics/SceneNode.cpp +++ b/src/Nazara/Graphics/SceneNode.cpp @@ -97,11 +97,11 @@ void NzSceneNode::Update() { } -void NzSceneNode::UpdateVisibility(const NzFrustumf& frustum) +void NzSceneNode::UpdateVisibility(const NzCamera* camera) { bool wasVisible = m_visible; - m_visible = VisibilityTest(frustum); + m_visible = VisibilityTest(camera); if (m_visible != wasVisible) OnVisibilityChange(m_visible); diff --git a/src/Nazara/Graphics/SceneRoot.cpp b/src/Nazara/Graphics/SceneRoot.cpp index 45dc5bcfc..0102a5d9f 100644 --- a/src/Nazara/Graphics/SceneRoot.cpp +++ b/src/Nazara/Graphics/SceneRoot.cpp @@ -41,9 +41,9 @@ void NzSceneRoot::Unregister() NazaraInternalError("SceneNode::Unregister() called on SceneRoot"); } -bool NzSceneRoot::VisibilityTest(const NzFrustumf& frustum) +bool NzSceneRoot::VisibilityTest(const NzCamera* camera) { - NazaraUnused(frustum); + NazaraUnused(camera); return true; // Toujours visible } diff --git a/src/Nazara/Graphics/SkyboxBackground.cpp b/src/Nazara/Graphics/SkyboxBackground.cpp index 0403d617b..86e2de4d5 100644 --- a/src/Nazara/Graphics/SkyboxBackground.cpp +++ b/src/Nazara/Graphics/SkyboxBackground.cpp @@ -204,6 +204,7 @@ void NzSkyboxBackground::Draw(const NzScene* scene) const skyboxMatrix.SetTranslation(NzVector3f::Zero()); NzRenderer::SetIndexBuffer(m_indexBuffer); + NzRenderer::SetMatrix(nzMatrixType_Projection, camera->GetProjectionMatrix()); NzRenderer::SetMatrix(nzMatrixType_View, skyboxMatrix); NzRenderer::SetMatrix(nzMatrixType_World, NzMatrix4f::Scale(NzVector3f(camera->GetZNear()))); NzRenderer::SetRenderStates(states); diff --git a/src/Nazara/Renderer/RenderTarget.cpp b/src/Nazara/Renderer/RenderTarget.cpp index e2e45552d..5e9b34e2d 100644 --- a/src/Nazara/Renderer/RenderTarget.cpp +++ b/src/Nazara/Renderer/RenderTarget.cpp @@ -20,10 +20,8 @@ NzRenderTarget::~NzRenderTarget() void NzRenderTarget::AddListener(Listener* listener, void* userdata) const { - NazaraError("What the"); if (!m_listenersLocked) m_listeners.insert(std::make_pair(listener, userdata)); - NazaraError("What the"); } bool NzRenderTarget::IsActive() const