Skip to content

Commit 1d88bd2

Browse files
committed
Merge branch 'fix-realtime-reflection-probe-sh2'
2 parents 9a1e849 + 2fee485 commit 1d88bd2

3 files changed

Lines changed: 98 additions & 7 deletions

File tree

crates/renderide/src/reflection_probes/source_resolution.rs

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,10 @@ pub(super) fn resolve_task_source(
8686
));
8787
}
8888

89-
if state.r#type == ReflectionProbeType::OnChanges {
89+
if matches!(
90+
state.r#type,
91+
ReflectionProbeType::OnChanges | ReflectionProbeType::Realtime
92+
) {
9093
return resolve_runtime_capture_source(render_space_id, probe, captures);
9194
}
9295
None
@@ -145,6 +148,7 @@ fn cubemap_residency_from_pool(
145148
#[cfg(test)]
146149
mod tests {
147150
use super::*;
151+
use crate::backend::AssetTransferQueue;
148152
use crate::shared::{ReflectionProbeClear, ReflectionProbeState};
149153

150154
#[test]
@@ -209,4 +213,50 @@ mod tests {
209213
assert!(matches!(skybox_source, Sh2ResolvedSource::Postpone));
210214
assert!(matches!(color_source, Sh2ResolvedSource::Postpone));
211215
}
216+
217+
#[test]
218+
fn realtime_task_without_capture_postpones_runtime_cubemap_source() {
219+
let mut scene = SceneCoordinator::new();
220+
let space_id = RenderSpaceId(7);
221+
scene.test_seed_space_identity_worlds(space_id, Vec::new(), Vec::new());
222+
scene.test_push_reflection_probes(
223+
space_id,
224+
[ReflectionProbeEntry {
225+
renderable_index: 0,
226+
transform_id: 12,
227+
state: ReflectionProbeState {
228+
renderable_index: 0,
229+
clear_flags: ReflectionProbeClear::Skybox,
230+
r#type: ReflectionProbeType::Realtime,
231+
..Default::default()
232+
},
233+
}],
234+
);
235+
let assets = AssetTransferQueue::new();
236+
let captures = RuntimeReflectionProbeCaptureStore::default();
237+
238+
let (key, source) = resolve_task_source(
239+
&scene,
240+
&assets,
241+
&captures,
242+
space_id.0,
243+
TaskHeader {
244+
renderable_index: 42,
245+
reflection_probe_renderable_index: 0,
246+
},
247+
)
248+
.expect("realtime probes should resolve to a postponed runtime cubemap source");
249+
250+
assert_eq!(
251+
key,
252+
Sh2SourceKey::RuntimeCubemap {
253+
render_space_id: space_id.0,
254+
renderable_index: 0,
255+
generation: 0,
256+
size: 0,
257+
sample_size: DEFAULT_SAMPLE_SIZE,
258+
}
259+
);
260+
assert!(matches!(source, Sh2ResolvedSource::Postpone));
261+
}
212262
}

crates/renderide/src/scene/coordinator/tests.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
1010
use crate::scene::overrides::RenderTransformOverrideEntry;
1111
use crate::scene::render_space::{LayerAssignmentEntry, RenderSpaceState};
12-
use crate::scene::{CameraRenderableEntry, SkinnedMeshRenderer, StaticMeshRenderer};
12+
use crate::scene::{
13+
CameraRenderableEntry, ReflectionProbeEntry, SkinnedMeshRenderer, StaticMeshRenderer,
14+
};
1315
use crate::shared::{LayerType, RenderTransform, RenderingContext};
1416

1517
use super::super::ids::RenderSpaceId;
@@ -140,6 +142,16 @@ impl SceneCoordinator {
140142
space.cameras.extend(cameras);
141143
}
142144

145+
/// Appends reflection-probe renderables to a seeded render space (unit tests only).
146+
pub(crate) fn test_push_reflection_probes(
147+
&mut self,
148+
id: RenderSpaceId,
149+
probes: impl IntoIterator<Item = ReflectionProbeEntry>,
150+
) {
151+
let space = self.spaces.get_mut(&id).expect("seeded space");
152+
space.reflection_probes.extend(probes);
153+
}
154+
143155
/// Inserts a render space with skinned mesh renderers (unit tests only).
144156
pub(crate) fn test_insert_skinned_mesh_renderers(
145157
&mut self,

crates/renderide/src/scene/reflection_probe.rs

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -229,11 +229,8 @@ pub(crate) fn drain_reflection_probe_render_changes(
229229
unique_id: task.unique_id,
230230
});
231231
} else if entry.state.r#type == ReflectionProbeType::Realtime {
232-
logger::debug!(
233-
"reflection probe changed render not completed: render_space={} renderable_index={} is realtime",
234-
space.id.0,
235-
task.renderable_index
236-
);
232+
out.completed
233+
.push(changed_probe_completion(space.id.0, task.unique_id, false));
237234
}
238235
}
239236
out
@@ -432,6 +429,38 @@ mod tests {
432429
assert!(results.scene_captures.is_empty());
433430
}
434431

432+
#[test]
433+
fn changed_realtime_probe_returns_immediate_completion() {
434+
let mut space = RenderSpaceState {
435+
id: crate::scene::RenderSpaceId(12),
436+
..RenderSpaceState::default()
437+
};
438+
space.reflection_probes.push(ReflectionProbeEntry {
439+
renderable_index: 0,
440+
transform_id: 1,
441+
state: ReflectionProbeState {
442+
renderable_index: 0,
443+
r#type: ReflectionProbeType::Realtime,
444+
..ReflectionProbeState::default()
445+
},
446+
});
447+
space
448+
.pending_reflection_probe_render_changes
449+
.push(ReflectionProbeChangeRenderTask {
450+
renderable_index: 0,
451+
unique_id: 101,
452+
});
453+
454+
let results = drain_reflection_probe_render_changes(&mut space);
455+
456+
assert_eq!(results.completed.len(), 1);
457+
assert_eq!(results.completed[0].render_space_id, 12);
458+
assert_eq!(results.completed[0].render_probe_unique_id, 101);
459+
assert_eq!(results.completed[0].require_reset, 0);
460+
assert!(results.scene_captures.is_empty());
461+
assert!(space.pending_reflection_probe_render_changes.is_empty());
462+
}
463+
435464
#[test]
436465
fn changed_missing_probe_returns_reset_completion() {
437466
let mut space = RenderSpaceState {

0 commit comments

Comments
 (0)