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 +++++++++++++++++++++++ crates/fparkan-terrain/src/lib.rs | 4 +++- 2 files changed, 26 insertions(+), 1 deletion(-) (limited to 'crates') 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()); diff --git a/crates/fparkan-terrain/src/lib.rs b/crates/fparkan-terrain/src/lib.rs index 4eef871..a69df2a 100644 --- a/crates/fparkan-terrain/src/lib.rs +++ b/crates/fparkan-terrain/src/lib.rs @@ -27,7 +27,9 @@ use std::collections::VecDeque; /// /// Applications access this semantic terrain API through this terrain crate /// rather than taking a direct dependency on the binary-format parser. -pub use fparkan_terrain_format::{TerrainMaterialLayers, TerrainMaterialSelection}; +pub use fparkan_terrain_format::{ + TerrainMaterialLayers, TerrainMaterialPair, TerrainMaterialSelection, +}; /// Terrain world. #[derive(Clone, Debug, Default)] -- cgit v1.2.3