void FrustumShadowData::updateShadowCasterReceiverBox(const AABBox<float> &shadowCasterReceiverBox, bool forceUpdateAllShadowMap) { if(areIdenticalAABBox(shadowCasterReceiverBox, this->shadowCasterReceiverBox) && !forceUpdateAllShadowMap) { this->shadowCasterReceiverBoxUpdated = false; }else { this->shadowCasterReceiverBox = shadowCasterReceiverBox; this->lightProjectionMatrix = shadowCasterReceiverBox.toProjectionMatrix(); this->shadowCasterReceiverBoxUpdated = true; } }
/** * Updates frustum shadow data (models, shadow caster/receiver box, projection matrix) */ void ShadowManager::updateFrustumShadowData(const Light *const light, ShadowData *const shadowData) { if(light->hasParallelBeams()) { //sun light for(unsigned int i=0; i<splittedFrustum.size(); ++i) { AABBox<float> aabboxSceneIndependent = createSceneIndependentBox(splittedFrustum[i], light, shadowData->getLightViewMatrix()); OBBox<float> obboxSceneIndependentViewSpace = shadowData->getLightViewMatrix().inverse() * OBBox<float>(aabboxSceneIndependent); const std::set<Model *> models = modelOctreeManager->getOctreeablesIn(obboxSceneIndependentViewSpace); shadowData->getFrustumShadowData(i)->setModels(models); AABBox<float> aabboxSceneDependent = createSceneDependentBox(aabboxSceneIndependent, obboxSceneIndependentViewSpace, models, shadowData->getLightViewMatrix()); shadowData->getFrustumShadowData(i)->setShadowCasterReceiverBox(aabboxSceneDependent); shadowData->getFrustumShadowData(i)->setLightProjectionMatrix(aabboxSceneDependent.toProjectionMatrix()); } }else { throw std::runtime_error("Shadow not supported on omnidirectional light."); } }