From 350c74bc8ef61833be11bbb2bab6747245e3ae0d Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Sun, 23 Aug 2026 00:38:32 -0700 Subject: refactor out content --- src/content/materials/mod.rs | 111 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/content/materials/mod.rs (limited to 'src/content/materials/mod.rs') diff --git a/src/content/materials/mod.rs b/src/content/materials/mod.rs new file mode 100644 index 0000000..8116565 --- /dev/null +++ b/src/content/materials/mod.rs @@ -0,0 +1,111 @@ +use crate::sim::cell_manager::sim::{PostUpdateAction, UpdateCtx}; + +pub mod fire; +pub mod gas; +pub mod liquid; +pub mod powder; + +#[repr(u8)] +#[derive(Clone, Copy, PartialEq, Eq, Debug)] +pub enum MaterialId { + Void = 0, + Sand, + Wood, + Water, + Fire, + Smoke, + Steel, +} + +#[repr(u8)] +#[derive(Clone, Copy, PartialEq, Eq, Debug)] +pub enum MaterialForm { + Void, + Gas, + Liquid, + Powder, + Solid, +} + +pub struct MaterialDef { + pub name: &'static str, + pub color: (u8, u8, u8, u8), + pub density: u8, + pub form: MaterialForm, + pub sim_update: Option PostUpdateAction>, +} + +static MATERIALS: [MaterialDef; 7] = [ + MaterialDef { + name: "Void", + color: (0x00, 0x00, 0x00, 0x00), + density: 0, + // form usually but not always determines the update fn + form: MaterialForm::Void, + sim_update: None, + }, + MaterialDef { + name: "Sand", + color: (0xDE, 0xCB, 0x85, 0xFF), + density: 50, + form: MaterialForm::Powder, + sim_update: Some(powder::sim_update), + }, + MaterialDef { + name: "Wood", + color: (0x85, 0x56, 0x1D, 0xFF), + density: 50, + form: MaterialForm::Solid, + sim_update: None, + }, + MaterialDef { + name: "Water", + color: (0x38, 0xA9, 0xFF, 0xFF), + density: 40, + form: MaterialForm::Liquid, + sim_update: Some(liquid::sim_update), + }, + // TODO this is not a material + MaterialDef { + name: "Fire", + color: (0xFC, 0x66, 0x00, 0xAA), + // for now this matches wood + density: 50, + form: MaterialForm::Gas, + sim_update: Some(fire::sim_update), + }, + MaterialDef { + name: "Smoke", + color: (0x32, 0x35, 0x36, 0xAA), + density: 15, + form: MaterialForm::Gas, + sim_update: Some(gas::sim_update), + }, + MaterialDef { + name: "Steel", + color: (0x60, 0x60, 0x60, 0xFF), + density: 150, + form: MaterialForm::Solid, + sim_update: None, + }, +]; + +impl MaterialId { + pub const ALL: [MaterialId; 7] = [ + MaterialId::Void, + MaterialId::Sand, + MaterialId::Wood, + MaterialId::Water, + MaterialId::Fire, + MaterialId::Smoke, + MaterialId::Steel, + ]; + #[inline] + pub fn def(self) -> &'static MaterialDef { + &MATERIALS[self as usize] + } + + pub fn from_index(idx: u8) -> MaterialId { + MaterialId::ALL[idx as usize] + } +} -- cgit v1.3.1