summaryrefslogtreecommitdiff
path: root/src/content/materials/mod.rs
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2026-08-23 00:38:32 -0700
committerKai Stevenson <kai@kaistevenson.com>2026-08-23 00:38:32 -0700
commit350c74bc8ef61833be11bbb2bab6747245e3ae0d (patch)
treeb9286d694eaedaef93cf36434a5c80e6aa9e8dce /src/content/materials/mod.rs
parenta0ff76837ca7ed6bd90cedcfee3832c1d9ad2287 (diff)
refactor out content
Diffstat (limited to 'src/content/materials/mod.rs')
-rw-r--r--src/content/materials/mod.rs111
1 files changed, 111 insertions, 0 deletions
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<fn(ctx: &mut UpdateCtx) -> 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]
+ }
+}