From e754af5db84f16774df4c878bbda466be08522c6 Mon Sep 17 00:00:00 2001
From: pkuzic
Date: Fri, 25 Sep 2026 23:21:11 +0100
Subject: [PATCH] MONKEY (reviewfix): keep skybox clocks precise
Co-Authored-By: GPT-5.6 Sol (Codex)
---
crates/benilla-world/src/skybox.rs | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/crates/benilla-world/src/skybox.rs b/crates/benilla-world/src/skybox.rs
index f14b946b..5c153c57 100644
--- a/crates/benilla-world/src/skybox.rs
+++ b/crates/benilla-world/src/skybox.rs
@@ -714,7 +714,9 @@ fn animate_skyboxes(
return;
}
let deterministic = crate::dev_state::deterministic_run();
- let now = time.elapsed_secs();
+ // MONKEY (reviewfix): retain sub-frame precision for skybox loops across long sessions; only
+ // narrow the wrapped sequence clock that the f32 track sampler consumes.
+ let now = time.elapsed_secs_f64();
let day = clock.minute.min(1439) as f32 / 1440.0;
clocks.clear();
for layer in want.0.iter().filter(|l| l.weight > 0.0) {
@@ -724,12 +726,17 @@ fn animate_skyboxes(
// A capture poses at `t = 0`, not the bind pose: a converted skybox places its layers with
// bone keys, and every row at `t = 0` is its seed.
let (band_t, gseq, live) = if layer.flags & SKYBOX_FULL_DAY != 0 {
- let g = if deterministic { 0.0 } else { f64::from(now) };
+ let g = if deterministic { 0.0 } else { now };
(rig.duration * day, g, true)
} else if deterministic {
(capture_t(), f64::from(capture_t()), true)
} else {
- (now, f64::from(now), true)
+ let band_t = if rig.duration > 0.0 {
+ (now % f64::from(rig.duration)) as f32
+ } else {
+ 0.0
+ };
+ (band_t, now, true)
};
let pose = if live && rig.animates() {
rig.pose(rig.band_time(band_t), gseq)