From 8dba8599d2696697ae9869a3af20594023c0ca7d Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 31 Jul 2013 14:19:20 +0200 Subject: [PATCH] Optimized closest lights handling Former-commit-id: 9db6300cb2a48907e4d558e721a5f63d0c9e967c --- .../Graphics/ForwardRenderTechnique.cpp | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/Nazara/Graphics/ForwardRenderTechnique.cpp b/src/Nazara/Graphics/ForwardRenderTechnique.cpp index 300e2eff9..85ece8ba5 100644 --- a/src/Nazara/Graphics/ForwardRenderTechnique.cpp +++ b/src/Nazara/Graphics/ForwardRenderTechnique.cpp @@ -25,7 +25,7 @@ namespace LightManager() = default; ~LightManager() = default; - unsigned int FindClosestLights(const NzLight** lights, unsigned int lightCount, const NzSpheref& object) + unsigned int FindClosestLights(const NzLight** lights, unsigned int lightCount, const NzVector3f& position, float squaredRadius) { for (Light& light : m_lights) { @@ -46,21 +46,23 @@ namespace case nzLightType_Point: { - NzSpheref lightSphere(light->GetPosition(), light->GetRadius()); + float lightRadius = light->GetRadius(); - if (lightSphere.Intersect(object)) - score = static_cast(light->GetPosition().SquaredDistance(object.GetPosition())*1000.f); + float squaredDistance = position.SquaredDistance(light->GetPosition()); + if (squaredDistance - squaredRadius <= lightRadius*lightRadius) + score = static_cast(squaredDistance*1000.f); break; } case nzLightType_Spot: { - NzSpheref lightSphere(light->GetPosition(), light->GetRadius()); + float lightRadius = light->GetRadius(); ///TODO: Attribuer bonus/malus selon l'angle du spot ? - if (lightSphere.Intersect(object)) - score = static_cast(light->GetPosition().SquaredDistance(object.GetPosition())*1000.f); + float squaredDistance = position.SquaredDistance(light->GetPosition()); + if (squaredDistance - squaredRadius <= lightRadius*lightRadius) + score = static_cast(squaredDistance*1000.f); break; } @@ -217,7 +219,7 @@ void NzForwardRenderTechnique::Draw(const NzScene* scene) // Calcul des lumières les plus proches if (lightCount < m_maxLightsPerObject && !m_renderQueue.lights.empty()) { - unsigned int count = lightManager.FindClosestLights(&m_renderQueue.lights[0], m_renderQueue.lights.size(), data.aabb.GetBoundingSphere()); + unsigned int count = lightManager.FindClosestLights(&m_renderQueue.lights[0], m_renderQueue.lights.size(), data.aabb.GetCenter(), data.aabb.GetSquaredRadius()); count -= lightCount; for (unsigned int i = 0; i < count; ++i) @@ -300,7 +302,7 @@ void NzForwardRenderTechnique::Draw(const NzScene* scene) // Calcul des lumières les plus proches if (lightCount < m_maxLightsPerObject && !m_renderQueue.lights.empty()) { - unsigned int count = lightManager.FindClosestLights(&m_renderQueue.lights[0], m_renderQueue.lights.size(), staticModel.aabb.GetBoundingSphere()); + unsigned int count = lightManager.FindClosestLights(&m_renderQueue.lights[0], m_renderQueue.lights.size(), staticModel.aabb.GetCenter(), staticModel.aabb.GetSquaredRadius()); count -= lightCount; for (unsigned int i = 0; i < count; ++i)