summaryrefslogtreecommitdiffstats
path: root/servers/rendering/renderer_scene_cull.cpp
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-03-05 09:56:05 +0100
committerRémi Verschelde <rverschelde@gmail.com>2024-03-05 09:56:05 +0100
commita52e575652c16a4c856a0065f0d9c7b5f9a84cde (patch)
tree27a259c92a2e0f63d68642dd82470aebe82356b2 /servers/rendering/renderer_scene_cull.cpp
parent2862cb19a8af5c0af2b0ddd0fba444946dbd511e (diff)
parenta5d3d23db4573fbf52b115aad6b0f20e93f5087b (diff)
downloadredot-engine-a52e575652c16a4c856a0065f0d9c7b5f9a84cde.tar.gz
Merge pull request #89134 from BastiaanOlij/fix_recursive_reflection_probes
Fix never ending loop with overlapping probes
Diffstat (limited to 'servers/rendering/renderer_scene_cull.cpp')
-rw-r--r--servers/rendering/renderer_scene_cull.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/servers/rendering/renderer_scene_cull.cpp b/servers/rendering/renderer_scene_cull.cpp
index 59d70958f1..4e5539e6a4 100644
--- a/servers/rendering/renderer_scene_cull.cpp
+++ b/servers/rendering/renderer_scene_cull.cpp
@@ -3482,8 +3482,13 @@ bool RendererSceneCull::_render_reflection_probe_step(Instance *p_instance, int
if (p_step == 0) {
if (!RSG::light_storage->reflection_probe_instance_begin_render(reflection_probe->instance, scenario->reflection_atlas)) {
- return true; //all full
+ return true; // All full, no atlas entry to render to.
}
+ } else if (!RSG::light_storage->reflection_probe_has_atlas_index(reflection_probe->instance)) {
+ // We don't have an atlas to render to, just round off.
+ // This is likely due to the atlas being reset.
+ // If so the probe will be marked as dirty and start over.
+ return true;
}
if (p_step >= 0 && p_step < 6) {
@@ -3558,6 +3563,7 @@ void RendererSceneCull::render_probes() {
/* REFLECTION PROBES */
SelfList<InstanceReflectionProbeData> *ref_probe = reflection_probe_render_list.first();
+ Vector<SelfList<InstanceReflectionProbeData> *> done_list;
bool busy = false;
@@ -3573,7 +3579,7 @@ void RendererSceneCull::render_probes() {
bool done = _render_reflection_probe_step(ref_probe->self()->owner, ref_probe->self()->render_step);
if (done) {
- reflection_probe_render_list.remove(ref_probe);
+ done_list.push_back(ref_probe);
} else {
ref_probe->self()->render_step++;
}
@@ -3588,13 +3594,18 @@ void RendererSceneCull::render_probes() {
step++;
}
- reflection_probe_render_list.remove(ref_probe);
+ done_list.push_back(ref_probe);
} break;
}
ref_probe = next;
}
+ // Now remove from our list
+ for (SelfList<InstanceReflectionProbeData> *rp : done_list) {
+ reflection_probe_render_list.remove(rp);
+ }
+
/* VOXEL GIS */
SelfList<InstanceVoxelGIData> *voxel_gi = voxel_gi_update_list.first();