Skip to content

Commit

Permalink
Fixed shadow fade to actually avoid updating shadows!
Browse files Browse the repository at this point in the history
  • Loading branch information
jitspoe committed Mar 21, 2024
1 parent 85bc26f commit 9d04826
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 4 deletions.
22 changes: 22 additions & 0 deletions drivers/gles3/storage/light_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,27 @@ class LightStorage : public RendererLightStorage {
return light->shadow;
}

virtual bool light_is_shadow_visible_at_position(RID p_light_instance, const Vector3 position) const override {
const LightInstance *light_instance = light_instance_owner.get_or_null(p_light_instance);
ERR_FAIL_NULL_V(light_instance, RS::LIGHT_DIRECTIONAL);
const Light *light = light_owner.get_or_null(light_instance->light);
ERR_FAIL_NULL_V(light, RS::LIGHT_DIRECTIONAL);

if (!light->shadow) {
return false;
}

if (!light->distance_fade) {
return true;
}

real_t distance = position.distance_to(light_instance->transform.origin);

if (distance > light->distance_fade_shadow + light->distance_fade_length) {
return false;
}
}

virtual bool light_has_projector(RID p_light) const override {
const Light *light = light_owner.get_or_null(p_light);
ERR_FAIL_NULL_V(light, RS::LIGHT_DIRECTIONAL);
Expand Down Expand Up @@ -444,6 +465,7 @@ class LightStorage : public RendererLightStorage {
#ifdef DEBUG_ENABLED
ERR_FAIL_COND_V(!shadow_atlas->shadow_owners.has(p_light_instance), 0);
#endif

uint32_t key = shadow_atlas->shadow_owners[p_light_instance];

uint32_t quadrant = (key >> QUADRANT_SHIFT) & 0x3;
Expand Down
1 change: 1 addition & 0 deletions servers/rendering/dummy/storage/light_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ class LightStorage : public RendererLightStorage {
virtual RS::LightOmniShadowMode light_omni_get_shadow_mode(RID p_light) override { return RS::LIGHT_OMNI_SHADOW_DUAL_PARABOLOID; }

virtual bool light_has_shadow(RID p_light) const override { return false; }
virtual bool light_is_shadow_visible_at_position(RID p_light_instance, const Vector3 p_position) const { return false; }
virtual bool light_has_projector(RID p_light) const override { return false; }

virtual RS::LightType light_get_type(RID p_light) const override { return RS::LIGHT_OMNI; }
Expand Down
21 changes: 21 additions & 0 deletions servers/rendering/renderer_rd/storage_rd/light_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -544,6 +544,27 @@ class LightStorage : public RendererLightStorage {
return light->shadow;
}

virtual bool light_is_shadow_visible_at_position(RID p_light_instance, const Vector3 position) const override {
const LightInstance *light_instance = light_instance_owner.get_or_null(p_light_instance);
ERR_FAIL_NULL_V(light_instance, RS::LIGHT_DIRECTIONAL);
const Light *light = light_owner.get_or_null(light_instance->light);
ERR_FAIL_NULL_V(light, RS::LIGHT_DIRECTIONAL);

if (!light->shadow) {
return false;
}

if (!light->distance_fade) {
return true;
}

real_t distance = position.distance_to(light_instance->transform.origin);

if (distance > light->distance_fade_shadow + light->distance_fade_length) {
return false;
}
}

virtual bool light_has_projector(RID p_light) const override {
const Light *light = light_owner.get_or_null(p_light);
ERR_FAIL_NULL_V(light, RS::LIGHT_DIRECTIONAL);
Expand Down
13 changes: 9 additions & 4 deletions servers/rendering/renderer_scene_cull.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2993,6 +2993,7 @@ void RendererSceneCull::_render_scene(const RendererSceneRender::CameraData *p_c
Instance *render_reflection_probe = instance_owner.get_or_null(p_reflection_probe); //if null, not rendering to it

Scenario *scenario = scenario_owner.get_or_null(p_scenario);
Vector3 camera_position = p_camera_data->main_transform.origin;

ERR_FAIL_COND(p_render_buffers.is_null());

Expand All @@ -3002,7 +3003,7 @@ void RendererSceneCull::_render_scene(const RendererSceneRender::CameraData *p_c

if (p_reflection_probe.is_null()) {
//no rendering code here, this is only to set up what needs to be done, request regions, etc.
scene_render->sdfgi_update(p_render_buffers, p_environment, p_camera_data->main_transform.origin); //update conditions for SDFGI (whether its used or not)
scene_render->sdfgi_update(p_render_buffers, p_environment, camera_position); //update conditions for SDFGI (whether its used or not)
}

RENDER_TIMESTAMP("Update Visibility Dependencies");
Expand All @@ -3015,7 +3016,7 @@ void RendererSceneCull::_render_scene(const RendererSceneRender::CameraData *p_c
VisibilityCullData visibility_cull_data;
visibility_cull_data.scenario = scenario;
visibility_cull_data.viewport_mask = scenario->viewport_visibility_masks[p_viewport];
visibility_cull_data.camera_position = p_camera_data->main_transform.origin;
visibility_cull_data.camera_position = camera_position;

for (int i = scenario->instance_visibility.get_bin_count() - 1; i > 0; i--) { // We skip bin 0
visibility_cull_data.cull_offset = scenario->instance_visibility.get_bin_start(i);
Expand Down Expand Up @@ -3183,16 +3184,20 @@ void RendererSceneCull::_render_scene(const RendererSceneRender::CameraData *p_c
}
}

// Positional Shadowss
// Positional Shadows
for (uint32_t i = 0; i < (uint32_t)scene_cull_result.lights.size(); i++) {
Instance *ins = scene_cull_result.lights[i];

if (!p_shadow_atlas.is_valid() || !RSG::light_storage->light_has_shadow(ins->base)) {
if (!p_shadow_atlas.is_valid()) {
continue;
}

InstanceLightData *light = static_cast<InstanceLightData *>(ins->base_data);

if (!RSG::light_storage->light_is_shadow_visible_at_position(light->instance, camera_position)) {
continue;
}

float coverage = 0.f;

{ //compute coverage
Expand Down
1 change: 1 addition & 0 deletions servers/rendering/storage/light_storage.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ class RendererLightStorage {
virtual RS::LightOmniShadowMode light_omni_get_shadow_mode(RID p_light) = 0;

virtual bool light_has_shadow(RID p_light) const = 0;
virtual bool light_is_shadow_visible_at_position(RID p_light, const Vector3 p_position) const = 0;

virtual bool light_has_projector(RID p_light) const = 0;

Expand Down

0 comments on commit 9d04826

Please sign in to comment.