From 7469caa2894f4748b66d2c296ed4ad0a800d77d8 Mon Sep 17 00:00:00 2001
From: pkuzic
Date: Fri, 25 Sep 2026 12:31:47 +0100
Subject: [PATCH] MONKEY (skybox): Stratholme skybox scenario, rig test timing
Co-Authored-By: Claude Opus 5.5
---
crates/benilla-app/src/capture/scenarios.rs | 11 +++++++++++
crates/benilla-world/src/skybox_anim.rs | 11 ++++++-----
2 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/crates/benilla-app/src/capture/scenarios.rs b/crates/benilla-app/src/capture/scenarios.rs
index 07631c96..6b489dd9 100644
--- a/crates/benilla-app/src/capture/scenarios.rs
+++ b/crates/benilla-app/src/capture/scenarios.rs
@@ -1381,6 +1381,15 @@ pub(super) const ON_DEMAND: &[Scenario] = &[
}, // MONKEY (skybox): zone skyboxes (run with `WOW_ZONE_SKYBOXES=1`) and the two stock skybox
// lanes. Karazahn40 (Turtle map 814) is the one stock sphere naming a clear-slot skybox
// (Light 553, HellfireSkyBox); the zone shots need the sky patch.
+ // The stock MOSB lane: Stratholme_B's groups flagged 0x40000, weight = the interior crossfade.
+ Scenario {
+ name: "skybox-stratholme-noon",
+ map: Some(329),
+ eye: SKYBOX_STRAT_EYE,
+ look: SKYBOX_STRAT_LOOK,
+ minute: 720,
+ ui: None,
+ },
Scenario {
name: "skybox-karazhan-noon",
map: Some(814),
@@ -1550,6 +1559,8 @@ pub(crate) fn ui_opted_in() -> bool {
// MONKEY (skybox): the skybox shots, eye just above the ground at a sphere's centre, pitched up so
// the upper frame is sky.
+const SKYBOX_STRAT_EYE: [f32; 3] = [3450.0, -3380.0, 150.0];
+const SKYBOX_STRAT_LOOK: [f32; 3] = [3600.0, -3300.0, 200.0];
const SKYBOX_KZ_EYE: [f32; 3] = [-6474.0, -2912.0, 40.0];
const SKYBOX_KZ_LOOK: [f32; 3] = [-6300.0, -2800.0, 95.0];
const SKYBOX_STEPPES_EYE: [f32; 3] = [-7979.0, -2571.0, 260.0];
diff --git a/crates/benilla-world/src/skybox_anim.rs b/crates/benilla-world/src/skybox_anim.rs
index 9f835f40..0ea157b7 100644
--- a/crates/benilla-world/src/skybox_anim.rs
+++ b/crates/benilla-world/src/skybox_anim.rs
@@ -435,7 +435,8 @@ mod tests {
use super::*;
fn spin_rig() -> SkyRig {
- // One parentless bone at pivot (1,0,0) turning about +Y over 4 s, linear.
+ // One parentless bone at pivot (1,0,0) turning 135° about +Y over 4 s, linear; the quarter
+ // turn falls at 8/3 s.
SkyRig {
parents: vec![-1],
pivots: vec![Vec3::X],
@@ -443,7 +444,7 @@ mod tests {
rotation: Channel {
keys: vec![
(0.0, Quat::IDENTITY),
- (4.0, Quat::from_rotation_y(std::f32::consts::PI)),
+ (4.0, Quat::from_rotation_y(std::f32::consts::FRAC_PI_2 * 1.5)),
],
linear: true,
},
@@ -458,8 +459,8 @@ mod tests {
#[test]
fn a_bone_turns_about_its_pivot() {
let rig = spin_rig();
- let m = rig.pose(rig.band_time(4.0 + 2.0), 0.0)[0];
- // Half way: a quarter turn about the pivot; the pivot itself stays put.
+ let m = rig.pose(rig.band_time(4.0 + 8.0 / 3.0), 0.0)[0];
+ // A quarter turn about the pivot; the pivot itself stays put.
assert!(m.transform_point3(Vec3::X).abs_diff_eq(Vec3::X, 1e-5));
let p = m.transform_point3(Vec3::new(2.0, 0.0, 0.0));
assert!(p.abs_diff_eq(Vec3::new(1.0, 0.0, -1.0), 1e-5), "{p}");
@@ -477,7 +478,7 @@ mod tests {
},
..Default::default()
});
- let pose = rig.pose(2.0, 0.0);
+ let pose = rig.pose(8.0 / 3.0, 0.0);
let p = pose[1].transform_point3(Vec3::new(2.0, 0.0, 0.0));
// Lifted by the child, then turned a quarter by the parent.
assert!(p.abs_diff_eq(Vec3::new(1.0, 1.0, -1.0), 1e-5), "{p}");