diff options
| author | Valentin Popov <valentin@popov.link> | 2026-07-18 16:31:13 +0300 |
|---|---|---|
| committer | Valentin Popov <valentin@popov.link> | 2026-07-18 16:31:13 +0300 |
| commit | 575124830b678d0c4d5b37a708bba9692a4e47ef (patch) | |
| tree | e36ae21ca5eb4cbac35523809991ffdbe6099e84 /crates/fparkan-terrain-format | |
| parent | 7a7578d0db2a0f6bd0a440f5ef1f72432f8b38ae (diff) | |
| download | fparkan-575124830b678d0c4d5b37a708bba9692a4e47ef.tar.xz fparkan-575124830b678d0c4d5b37a708bba9692a4e47ef.zip | |
feat(terrain): separate shade material selections
Diffstat (limited to 'crates/fparkan-terrain-format')
| -rw-r--r-- | crates/fparkan-terrain-format/src/lib.rs | 23 |
1 files changed, 23 insertions, 0 deletions
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()); |
