void Light::_updateBoundingBox() noexcept { BoundingBox boundingBox; if (!_shadowCamera) { Vector3 min(-_lightRange, -_lightRange, -_lightRange); Vector3 max(_lightRange, _lightRange, _lightRange); BoundingBox bound; bound.encapsulate(min); bound.encapsulate(max); boundingBox.encapsulate(bound); } else { if (_lightType == LightType::LightTypeAmbient || _lightType == LightType::LightTypeEnvironment) { Vector3 min(-_lightRange, -_lightRange, -_lightRange); Vector3 max(_lightRange, _lightRange, _lightRange); BoundingBox bound; bound.encapsulate(min); bound.encapsulate(max); boundingBox.encapsulate(bound); } else { float znear = _shadowCamera->getNear(); float zfar = _lightRange; float3 corners[8]; corners[0].set(-znear, +znear, znear); corners[1].set(+znear, +znear, znear); corners[2].set(-znear, -znear, znear); corners[3].set(+znear, -znear, znear); corners[4].set(-zfar, +zfar, zfar); corners[5].set(+zfar, +zfar, zfar); corners[6].set(-zfar, -zfar, zfar); corners[7].set(+zfar, -zfar, zfar); BoundingBox bound; bound.encapsulate(corners, 8); bound.transform((float3x3)_shadowCamera->getTransform()); boundingBox.encapsulate(bound); if (_lightType == LightType::LightTypeSun || _lightType == LightType::LightTypeDirectional) { float w = bound.size().x * 0.5f; float h = bound.size().y * 0.5f; _shadowCamera->setOrtho(float4(-w, w, -h, h)); _shadowCamera->setFar(zfar); _shadowCamera->setCameraType(CameraType::CameraTypeOrtho); } else if (_lightType == LightType::LightTypeSpot) { _shadowCamera->setAperture(this->getSpotOuterCone().x * 2); _shadowCamera->setFar(zfar); _shadowCamera->setCameraType(CameraType::CameraTypePerspective); } else if (_lightType == LightType::LightTypePoint) { _shadowCamera->setAperture(90.0f); _shadowCamera->setCameraType(CameraType::CameraTypePerspective); } } } this->setBoundingBox(boundingBox); }