From 91167c3c23201226df7ab10b5c64225495de1205 Mon Sep 17 00:00:00 2001 From: Kaleb Reid <78945904+Kaleb-Reid@users.noreply.github.com> Date: Wed, 24 Sep 2025 22:37:28 -0700 Subject: [PATCH] Use correct AABB for SpotLight3Ds when spot_angle > 90 --- drivers/gles3/storage/light_storage.cpp | 9 ++++++++- .../rendering/renderer_rd/storage_rd/light_storage.cpp | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/drivers/gles3/storage/light_storage.cpp b/drivers/gles3/storage/light_storage.cpp index f58f769b3e4..75dbd8869da 100644 --- a/drivers/gles3/storage/light_storage.cpp +++ b/drivers/gles3/storage/light_storage.cpp @@ -350,7 +350,14 @@ AABB LightStorage::light_get_aabb(RID p_light) const { switch (light->type) { case RS::LIGHT_SPOT: { float len = light->param[RS::LIGHT_PARAM_RANGE]; - float size = Math::tan(Math::deg_to_rad(light->param[RS::LIGHT_PARAM_SPOT_ANGLE])) * len; + float angle = Math::deg_to_rad(light->param[RS::LIGHT_PARAM_SPOT_ANGLE]); + + if (angle > Math::PI * 0.5) { + // Light casts backwards as well. + return AABB(Vector3(-1, -1, -1) * len, Vector3(2, 2, 2) * len); + } + + float size = Math::sin(angle) * len; return AABB(Vector3(-size, -size, -len), Vector3(size * 2, size * 2, len)); }; case RS::LIGHT_OMNI: { diff --git a/servers/rendering/renderer_rd/storage_rd/light_storage.cpp b/servers/rendering/renderer_rd/storage_rd/light_storage.cpp index bfbf85aa350..b0268c2c83d 100644 --- a/servers/rendering/renderer_rd/storage_rd/light_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/light_storage.cpp @@ -432,7 +432,14 @@ AABB LightStorage::light_get_aabb(RID p_light) const { switch (light->type) { case RS::LIGHT_SPOT: { float len = light->param[RS::LIGHT_PARAM_RANGE]; - float size = Math::tan(Math::deg_to_rad(light->param[RS::LIGHT_PARAM_SPOT_ANGLE])) * len; + float angle = Math::deg_to_rad(light->param[RS::LIGHT_PARAM_SPOT_ANGLE]); + + if (angle > Math::PI * 0.5) { + // Light casts backwards as well. + return AABB(Vector3(-1, -1, -1) * len, Vector3(2, 2, 2) * len); + } + + float size = Math::sin(angle) * len; return AABB(Vector3(-size, -size, -len), Vector3(size * 2, size * 2, len)); }; case RS::LIGHT_OMNI: {