From 82240e8e76045bd6feeeb92888f951e3e1bef5bd Mon Sep 17 00:00:00 2001
From: pkuzic
Date: Fri, 25 Sep 2026 23:28:28 +0100
Subject: [PATCH] MONKEY (reviewfix): isolate animated sky materials
Co-Authored-By: GPT-5.6 Sol (Codex)
---
crates/benilla-world/src/skybox.rs | 4 ++-
crates/benilla-world/src/skybox_anim.rs | 39 ++++++++++++++++++-------
2 files changed, 31 insertions(+), 12 deletions(-)
diff --git a/crates/benilla-world/src/skybox.rs b/crates/benilla-world/src/skybox.rs
index ba807803..36c94b76 100644
--- a/crates/benilla-world/src/skybox.rs
+++ b/crates/benilla-world/src/skybox.rs
@@ -542,14 +542,16 @@ fn build_skybox(
}
}
}
+ let mut lane_materials = [pair.steady.clone(), pair.fade_blend.clone()];
let lane = SkyMatLane::register(
sub,
uv,
tint,
&mut table,
mats.materials(),
- &[pair.steady.id(), pair.fade_blend.id()],
+ &mut lane_materials,
);
+ [pair.steady, pair.fade_blend] = lane_materials;
let mesh = meshes.add(mesh);
let pose = match sole_bone(sub) {
Some(b) if rig.bone_moves(b) => PartPose::Rigid(b),
diff --git a/crates/benilla-world/src/skybox_anim.rs b/crates/benilla-world/src/skybox_anim.rs
index 652fa163..408e4534 100644
--- a/crates/benilla-world/src/skybox_anim.rs
+++ b/crates/benilla-world/src/skybox_anim.rs
@@ -333,21 +333,38 @@ impl SkyMatLane {
tint: Option>,
table: &mut crate::mat_anim_table::MatAnimTable,
materials: &mut Assets,
- mats: &[AssetId],
+ mats: &mut [Handle],
) -> Self {
- let mut lane = SkyMatLane::default();
- let write = |materials: &mut Assets,
- f: &dyn Fn(&mut benilla_assets::materials::WowModelMaterial)| {
- for id in mats {
- crate::model_render::lazy::with_material_mut(materials, *id, |m| f(m));
+ // MONKEY (reviewfix): `model_material` is a cache. Animation slots are per sky batch, so
+ // detach its handles before writing any slot (notably affine-only `.z`) into the material.
+ let originals = mats.to_vec();
+ for i in 0..mats.len() {
+ if let Some(prior) = (0..i).find(|&j| originals[j].id() == originals[i].id()) {
+ mats[i] = mats[prior].clone();
+ continue;
}
- };
+ if let Some(material) =
+ crate::model_render::lazy::with_material_mut(materials, originals[i].id(), |m| {
+ m.clone()
+ })
+ {
+ mats[i] = materials.add(material);
+ }
+ }
+ let mut lane = SkyMatLane::default();
+ let write =
+ |materials: &mut Assets,
+ f: &dyn Fn(&mut benilla_assets::materials::WowModelMaterial)| {
+ for id in mats.iter() {
+ crate::model_render::lazy::with_material_mut(materials, id.id(), |m| f(m));
+ }
+ };
if let Some(uv) = uv.filter(|a| a.period > 0.0) {
if let Some(slot) = table.alloc() {
let seed = mats
.first()
- .and_then(|id| {
- crate::model_render::lazy::with_material_mut(materials, *id, |m| {
+ .and_then(|handle| {
+ crate::model_render::lazy::with_material_mut(materials, handle.id(), |m| {
[m.extension.sun_scale.z, m.extension.sun_scale.w]
})
})
@@ -376,8 +393,8 @@ impl SkyMatLane {
if let Some(slot) = table.alloc() {
let seed = mats
.first()
- .and_then(|id| {
- crate::model_render::lazy::with_material_mut(materials, *id, |m| {
+ .and_then(|handle| {
+ crate::model_render::lazy::with_material_mut(materials, handle.id(), |m| {
[m.extension.tint.x, m.extension.tint.y, m.extension.tint.z]
})
})