From 9999b91ee1c50e06f16d6e867d1bf39165451005 Mon Sep 17 00:00:00 2001 From: Kearwood Gilbert Date: Sat, 1 Feb 2014 16:07:02 -0800 Subject: [PATCH] Corrected infinite loop in octree generation that occurred due to NaN being returned as the AABB bounds for point lights and spot lights. --HG-- branch : nfb --- KREngine/kraken/KRPointLight.cpp | 4 ++-- KREngine/kraken/KRScene.cpp | 4 ++-- KREngine/kraken/KRSpotLight.cpp | 10 ++++++++++ KREngine/kraken/KRSpotLight.h | 2 +- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/KREngine/kraken/KRPointLight.cpp b/KREngine/kraken/KRPointLight.cpp index fd7cbce..8ce2f07 100644 --- a/KREngine/kraken/KRPointLight.cpp +++ b/KREngine/kraken/KRPointLight.cpp @@ -34,7 +34,7 @@ std::string KRPointLight::getElementName() { } KRAABB KRPointLight::getBounds() { - float influence_radius = sqrt((m_intensity / 100.0) / KRLIGHT_MIN_INFLUENCE - 1.0) + m_decayStart; + float influence_radius = m_decayStart - sqrt(m_intensity * 0.01f) / sqrt(KRLIGHT_MIN_INFLUENCE); if(influence_radius < m_flareOcclusionSize) { influence_radius = m_flareOcclusionSize; } @@ -56,7 +56,7 @@ void KRPointLight::render(KRCamera *pCamera, std::vector &point_ KRVector3 light_position = getLocalTranslation(); - float influence_radius = sqrt((m_intensity / 100.0) / KRLIGHT_MIN_INFLUENCE - 1.0) + m_decayStart; + float influence_radius = m_decayStart - sqrt(m_intensity * 0.01f) / sqrt(KRLIGHT_MIN_INFLUENCE); KRMat4 sphereModelMatrix = KRMat4(); sphereModelMatrix.scale(influence_radius); diff --git a/KREngine/kraken/KRScene.cpp b/KREngine/kraken/KRScene.cpp index 5e31dce..b103167 100644 --- a/KREngine/kraken/KRScene.cpp +++ b/KREngine/kraken/KRScene.cpp @@ -479,8 +479,8 @@ void KRScene::updateOctree(const KRViewport &viewport) { m_pRootNode->updateLODVisibility(viewport); - std::set newNodes = m_newNodes; - std::set modifiedNodes = m_modifiedNodes; + std::set newNodes = std::move(m_newNodes); + std::set modifiedNodes = std::move(m_modifiedNodes); m_newNodes.clear(); m_modifiedNodes.clear(); diff --git a/KREngine/kraken/KRSpotLight.cpp b/KREngine/kraken/KRSpotLight.cpp index 0ca149c..f8018c5 100644 --- a/KREngine/kraken/KRSpotLight.cpp +++ b/KREngine/kraken/KRSpotLight.cpp @@ -49,3 +49,13 @@ void KRSpotLight::setInnerAngle(float innerAngle) { void KRSpotLight::setOuterAngle(float outerAngle) { m_outerAngle = outerAngle; } + +KRAABB KRSpotLight::getBounds() { + float influence_radius = m_decayStart - sqrt(m_intensity * 0.01f) / sqrt(KRLIGHT_MIN_INFLUENCE); + if(influence_radius < m_flareOcclusionSize) { + influence_radius = m_flareOcclusionSize; + } + return KRAABB(KRVector3(-influence_radius), KRVector3(influence_radius), getModelMatrix()); +} + + diff --git a/KREngine/kraken/KRSpotLight.h b/KREngine/kraken/KRSpotLight.h index 6ea1b60..7ab2772 100644 --- a/KREngine/kraken/KRSpotLight.h +++ b/KREngine/kraken/KRSpotLight.h @@ -19,7 +19,7 @@ public: virtual std::string getElementName(); virtual tinyxml2::XMLElement *saveXML( tinyxml2::XMLNode *parent); virtual void loadXML(tinyxml2::XMLElement *e); - + virtual KRAABB getBounds(); float getInnerAngle(); float getOuterAngle();