From 575124830b678d0c4d5b37a708bba9692a4e47ef Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Sat, 18 Jul 2026 17:31:13 +0400 Subject: feat(terrain): separate shade material selections --- crates/fparkan-terrain-format/src/lib.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'crates/fparkan-terrain-format/src') diff --git a/crates/fparkan-terrain-format/src/lib.rs b/crates/fparkan-terrain-format/src/lib.rs index ce97d62..764de09 100644 --- a/crates/fparkan-terrain-format/src/lib.rs +++ b/crates/fparkan-terrain-format/src/lib.rs @@ -211,6 +211,22 @@ pub struct TerrainMaterialPair { pub flags: u16, } +impl TerrainMaterialPair { + /// Returns the material-manager selection used by `GetShade`. + /// + /// `GetShade` owns a manager loaded only with `Shade.wea`, so its + /// 16-bit lookup occupies row bits of that manager's table zero. It is + /// deliberately separate from the `Land1.wea`/`Land2.wea` selections + /// carried by [`TerrainMaterialLayers`]. + #[must_use] + pub const fn shade_selection(self) -> TerrainMaterialSelection { + TerrainMaterialSelection { + table_index: 0, + material_index: self.material_lookup, + } + } +} + impl TerrainSlotTable { /// Returns the render-dispatch header for one decoded slot record. #[must_use] @@ -1569,6 +1585,13 @@ mod tests { }, ]) ); + assert_eq!( + document.slot_material_pairs(0).expect("material pairs")[0].shade_selection(), + TerrainMaterialSelection { + table_index: 0, + material_index: 0x0102, + } + ); assert_eq!(document.slot_material_pairs(1), None); document.slots.slots_raw[0][2..4].copy_from_slice(&3_u16.to_le_bytes()); -- cgit v1.2.3