From 096417905b7fc2dcf0c18eeed9b46f61c4258749 Mon Sep 17 00:00:00 2001 From: Cory Petkovsek <632766+tinmanjuggernaut@users.noreply.github.com> Date: Thu, 22 Jul 2021 07:41:31 +0800 Subject: [PATCH] Calculate instance depth after shadow calculation in VisualServer --- servers/visual/visual_server_scene.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/servers/visual/visual_server_scene.cpp b/servers/visual/visual_server_scene.cpp index fb1c07faa7f..8bc85a10ded 100644 --- a/servers/visual/visual_server_scene.cpp +++ b/servers/visual/visual_server_scene.cpp @@ -2547,9 +2547,6 @@ void VisualServerScene::_prepare_scene(const Transform p_cam_transform, const Ca geom->gi_probes_dirty = false; } - Vector3 aabb_center = ins->transformed_aabb.position + (ins->transformed_aabb.size * 0.5); - ins->depth = near_plane.distance_to(aabb_center); - ins->depth_layer = CLAMP(int(ins->depth * 16 / z_far), 0, 15); } if (!keep) { @@ -2698,6 +2695,17 @@ void VisualServerScene::_prepare_scene(const Transform p_cam_transform, const Ca } } } + + // Calculate instance->depth from the camera, after shadow calculation has stopped overwriting instance->depth + for (int i = 0; i < instance_cull_count; i++) { + Instance *ins = instance_cull_result[i]; + + if (((1 << ins->base_type) & VS::INSTANCE_GEOMETRY_MASK) && ins->visible && ins->cast_shadows != VS::SHADOW_CASTING_SETTING_SHADOWS_ONLY) { + Vector3 aabb_center = ins->transformed_aabb.position + (ins->transformed_aabb.size * 0.5); + ins->depth = near_plane.distance_to(aabb_center); + ins->depth_layer = CLAMP(int(ins->depth * 16 / z_far), 0, 15); + } + } } void VisualServerScene::_render_scene(const Transform p_cam_transform, const CameraMatrix &p_cam_projection, const int p_eye, bool p_cam_orthogonal, RID p_force_environment, RID p_scenario, RID p_shadow_atlas, RID p_reflection_probe, int p_reflection_probe_pass) {