Enabled Frustum culling for Sprites

Former-commit-id: 5c5bf7da97f10b43c204bb336c2e979899f506d0
This commit is contained in:
Lynix 2013-08-21 21:17:39 +02:00
parent 6556acfa32
commit 198d13be20
2 changed files with 38 additions and 6 deletions

View File

@ -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

View File

@ -6,24 +6,30 @@
#include <Nazara/Graphics/Debug.hpp>
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;
}