diff --git a/include/Nazara/Graphics/Sprite.hpp b/include/Nazara/Graphics/Sprite.hpp index 8acc1e513..1fd8fb9e5 100644 --- a/include/Nazara/Graphics/Sprite.hpp +++ b/include/Nazara/Graphics/Sprite.hpp @@ -34,12 +34,16 @@ class NAZARA_API NzSprite : public NzSceneNode private: bool FrustumCull(const NzFrustumf& frustum) override; + void Invalidate() override; void Register() override; void Unregister() override; + void UpdateBoundingVolume() const; + mutable NzBoundingVolumef m_boundingVolume; + NzMaterialRef m_material; NzRectf m_textureCoords; NzVector2f m_size; - NzMaterialRef m_material; + mutable bool m_boundingVolumeUpdated; }; #endif // NAZARA_SPRITE_HPP diff --git a/src/Nazara/Graphics/Sprite.cpp b/src/Nazara/Graphics/Sprite.cpp index 0357ec81b..4c9a05a8f 100644 --- a/src/Nazara/Graphics/Sprite.cpp +++ b/src/Nazara/Graphics/Sprite.cpp @@ -6,24 +6,30 @@ #include NzSprite::NzSprite() : +m_boundingVolume(NzBoundingVolumef::Null()), m_textureCoords(0.f, 0.f, 1.f, 1.f), -m_size(64.f, 64.f) +m_size(64.f, 64.f), +m_boundingVolumeUpdated(true) { } NzSprite::NzSprite(const NzSprite& sprite) : NzSceneNode(sprite), +m_boundingVolume(sprite.m_boundingVolume), +m_material(sprite.m_material), m_textureCoords(sprite.m_textureCoords), m_size(sprite.m_size), -m_material(sprite.m_material) +m_boundingVolumeUpdated(sprite.m_boundingVolumeUpdated) { } NzSprite::NzSprite(NzSprite&& sprite) : NzSceneNode(sprite), +m_boundingVolume(sprite.m_boundingVolume), +m_material(std::move(sprite.m_material)), m_textureCoords(sprite.m_textureCoords), m_size(sprite.m_size), -m_material(std::move(sprite.m_material)) +m_boundingVolumeUpdated(sprite.m_boundingVolumeUpdated) { } @@ -68,6 +74,7 @@ void NzSprite::SetMaterial(NzMaterial* material) void NzSprite::SetSize(const NzVector2f& size) { m_size = size; + m_boundingVolume.MakeNull(); } void NzSprite::SetTextureCoords(const NzRectf& coords) @@ -101,8 +108,17 @@ void NzSprite::SetTextureRect(const NzRectui& rect) bool NzSprite::FrustumCull(const NzFrustumf& frustum) { - ///TODO: Effectuer un vrai test - return true; + if (!m_boundingVolumeUpdated) + UpdateBoundingVolume(); + + return frustum.Contains(m_boundingVolume); +} + +void NzSprite::Invalidate() +{ + NzSceneNode::Invalidate(); + + m_boundingVolumeUpdated = false; } void NzSprite::Register() @@ -112,3 +128,15 @@ void NzSprite::Register() 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, 1.f); + + if (!m_transformMatrixUpdated) + UpdateTransformMatrix(); + + m_boundingVolume.Update(m_transformMatrix); + m_boundingVolumeUpdated = true; +}