diff --git a/include/Nazara/Graphics/Light.hpp b/include/Nazara/Graphics/Light.hpp index 6d9ba346b..4a53eed94 100644 --- a/include/Nazara/Graphics/Light.hpp +++ b/include/Nazara/Graphics/Light.hpp @@ -53,7 +53,7 @@ class NAZARA_API NzLight : public NzSceneNode static void Disable(const NzShader* program, const NzLightUniforms& uniforms, int offset = 0); private: - bool FrustumCull(const NzFrustumf& frustum) override; + bool FrustumCull(const NzFrustumf& frustum) const override; void InvalidateNode() override; void Register() override; void Unregister() override; diff --git a/include/Nazara/Graphics/Model.hpp b/include/Nazara/Graphics/Model.hpp index 813394afa..ea5b937ba 100644 --- a/include/Nazara/Graphics/Model.hpp +++ b/include/Nazara/Graphics/Model.hpp @@ -86,7 +86,6 @@ class NAZARA_API NzModel : public NzSceneNode NzModel& operator=(NzModel&& node); protected: - bool FrustumCull(const NzFrustumf& frustum) override; void InvalidateNode() override; virtual void UpdateBoundingVolume() const; diff --git a/include/Nazara/Graphics/SceneNode.hpp b/include/Nazara/Graphics/SceneNode.hpp index e65cd7ab7..09aa1fab3 100644 --- a/include/Nazara/Graphics/SceneNode.hpp +++ b/include/Nazara/Graphics/SceneNode.hpp @@ -40,9 +40,9 @@ class NAZARA_API NzSceneNode : public NzNode NzSceneNode& operator=(NzSceneNode&& sceneNode); protected: + virtual bool FrustumCull(const NzFrustumf& frustum) const; virtual void OnParenting(const NzNode* parent) override; virtual void OnVisibilityChange(bool visibility); - virtual bool FrustumCull(const NzFrustumf& frustum) = 0; void RecursiveSetScene(NzScene* scene, NzNode* node); virtual void Register(); void SetScene(NzScene* scene); diff --git a/include/Nazara/Graphics/SceneRoot.hpp b/include/Nazara/Graphics/SceneRoot.hpp index 1eaec83b8..7b81fd5ac 100644 --- a/include/Nazara/Graphics/SceneRoot.hpp +++ b/include/Nazara/Graphics/SceneRoot.hpp @@ -26,7 +26,6 @@ class NAZARA_API NzSceneRoot : public NzSceneNode NzSceneRoot(NzScene* scene); virtual ~NzSceneRoot(); - bool FrustumCull(const NzFrustumf& frustum) override; void Register(); void Unregister(); }; diff --git a/include/Nazara/Graphics/Sprite.hpp b/include/Nazara/Graphics/Sprite.hpp index 3adb29596..54ebb71a1 100644 --- a/include/Nazara/Graphics/Sprite.hpp +++ b/include/Nazara/Graphics/Sprite.hpp @@ -37,7 +37,6 @@ class NAZARA_API NzSprite : public NzSceneNode void SetTextureRect(const NzRectui& rect); private: - bool FrustumCull(const NzFrustumf& frustum) override; void InvalidateNode() override; void Register() override; void Unregister() override; diff --git a/src/Nazara/Graphics/Light.cpp b/src/Nazara/Graphics/Light.cpp index 95cabf7e4..d3ce97152 100644 --- a/src/Nazara/Graphics/Light.cpp +++ b/src/Nazara/Graphics/Light.cpp @@ -229,7 +229,7 @@ void NzLight::Disable(const NzShader* shader, const NzLightUniforms& uniforms, i shader->SendInteger(uniforms.locations.type + offset, -1); } -bool NzLight::FrustumCull(const NzFrustumf& frustum) +bool NzLight::FrustumCull(const NzFrustumf& frustum) const { switch (m_type) { @@ -244,10 +244,7 @@ bool NzLight::FrustumCull(const NzFrustumf& frustum) return frustum.Contains(NzSpheref(m_derivedPosition, m_radius)); case nzLightType_Spot: - if (!m_boundingVolumeUpdated) - UpdateBoundingVolume(); - - return frustum.Contains(m_boundingVolume); + return NzSceneNode::FrustumCull(frustum); } 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 6a6da27c7..8f9b85122 100644 --- a/src/Nazara/Graphics/Model.cpp +++ b/src/Nazara/Graphics/Model.cpp @@ -438,14 +438,6 @@ NzModel& NzModel::operator=(NzModel&& node) return *this; } -bool NzModel::FrustumCull(const NzFrustumf& frustum) -{ - if (!m_boundingVolumeUpdated) - UpdateBoundingVolume(); - - return frustum.Contains(m_boundingVolume); -} - void NzModel::InvalidateNode() { NzSceneNode::InvalidateNode(); diff --git a/src/Nazara/Graphics/SceneNode.cpp b/src/Nazara/Graphics/SceneNode.cpp index 5d48018e4..fbd88b866 100644 --- a/src/Nazara/Graphics/SceneNode.cpp +++ b/src/Nazara/Graphics/SceneNode.cpp @@ -73,6 +73,11 @@ NzSceneNode& NzSceneNode::operator=(NzSceneNode&& sceneNode) return *this; } +bool NzSceneNode::FrustumCull(const NzFrustumf& frustum) const +{ + return frustum.Contains(GetBoundingVolume()); +} + void NzSceneNode::OnParenting(const NzNode* parent) { if (parent) diff --git a/src/Nazara/Graphics/SceneRoot.cpp b/src/Nazara/Graphics/SceneRoot.cpp index f9c839172..46e446eaa 100644 --- a/src/Nazara/Graphics/SceneRoot.cpp +++ b/src/Nazara/Graphics/SceneRoot.cpp @@ -36,13 +36,6 @@ bool NzSceneRoot::IsDrawable() const return true; } -bool NzSceneRoot::FrustumCull(const NzFrustumf& frustum) -{ - NazaraUnused(frustum); - - return true; // Toujours visible -} - void NzSceneRoot::Register() { NazaraInternalError("SceneNode::Register() called on SceneRoot"); diff --git a/src/Nazara/Graphics/Sprite.cpp b/src/Nazara/Graphics/Sprite.cpp index a72be7b69..7d14a1a8e 100644 --- a/src/Nazara/Graphics/Sprite.cpp +++ b/src/Nazara/Graphics/Sprite.cpp @@ -116,10 +116,11 @@ void NzSprite::SetSize(const NzVector2f& size) void NzSprite::SetTexture(NzTexture* texture, bool resizeSprite) { std::unique_ptr material(new NzMaterial); - material->Enable(nzRendererParameter_DepthBuffer, false); + material->SetPersistent(false); + + material->Enable(nzRendererParameter_FaceCulling, false); material->EnableLighting(false); material->SetDiffuseMap(texture); - material->SetPersistent(false); SetMaterial(material.get(), resizeSprite); material.release(); @@ -154,14 +155,6 @@ void NzSprite::SetTextureRect(const NzRectui& rect) SetTextureCoords(NzRectf(invWidth*rect.x, invHeight*rect.y, invWidth*rect.width, invHeight*rect.height)); } -bool NzSprite::FrustumCull(const NzFrustumf& frustum) -{ - if (!m_boundingVolumeUpdated) - UpdateBoundingVolume(); - - return frustum.Contains(m_boundingVolume); -} - void NzSprite::InvalidateNode() { NzSceneNode::InvalidateNode(); @@ -180,7 +173,7 @@ void NzSprite::Unregister() void NzSprite::UpdateBoundingVolume() const { if (m_boundingVolume.IsNull()) - m_boundingVolume.Set(-m_size.x*0.5f, -m_size.y*0.5f, 0, m_size.x, m_size.y, 0.f); + m_boundingVolume.Set(-m_size.x*0.5f, -m_size.y*0.5f, 0.f, m_size.x, m_size.y, 0.f); if (!m_transformMatrixUpdated) UpdateTransformMatrix();