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] } }