diff options
Diffstat (limited to 'src/sim/cell.rs')
| -rw-r--r-- | src/sim/cell.rs | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/sim/cell.rs b/src/sim/cell.rs new file mode 100644 index 0000000..5a9fc1f --- /dev/null +++ b/src/sim/cell.rs @@ -0,0 +1,87 @@ +use crate::{config::SETTLED_THRESOHLD, content::materials::MaterialId}; + +#[derive(Clone, Copy)] +pub struct Cell { + pub material: MaterialId, + pub flags: u8, + pub data: u16, +} + +impl Cell { + // only update the cell if this matches the parity of the seqno + const FLAG_PARITY: u8 = 0b0000_0001; + // is this cell owned by an entity? + const FLAG_ENTITY_INTEGRATED: u8 = 0b0000_0010; + // how close is the cell to settling? + const MASK_SETTLED: u8 = 0b0001_1100; + + #[inline] + pub fn parity(self) -> u8 { + self.flags & Self::FLAG_PARITY + } + #[inline] + pub fn flip_parity(&mut self) { + self.flags ^= Self::FLAG_PARITY; + } + #[inline] + pub fn match_parity(&mut self, seqno: u64) { + let parity = !seqno.is_multiple_of(2); + if parity { + self.flags |= Self::FLAG_PARITY; + } else { + self.flags &= !Self::FLAG_PARITY + } + } + + #[inline] + pub fn entity_integrated(self) -> bool { + (self.flags & Self::FLAG_ENTITY_INTEGRATED) == Self::FLAG_ENTITY_INTEGRATED + } + #[inline] + pub fn set_entity_integrated(&mut self, entity_integrated: bool) { + if entity_integrated { + self.flags |= Self::FLAG_ENTITY_INTEGRATED + } else { + self.flags &= !Self::FLAG_ENTITY_INTEGRATED + } + } + + #[inline] + pub fn settled(self) -> u8 { + (self.flags & Self::MASK_SETTLED) >> 2 + } + #[inline] + fn set_settled(&mut self, settled: u8) { + debug_assert!(settled <= 7); + self.flags = (settled << 2) | (self.flags & !Self::MASK_SETTLED); + } + #[inline] + pub fn reset_settled(&mut self) { + self.flags &= !Self::MASK_SETTLED; + } + + #[inline] + pub fn increment_settled(&mut self) { + let s = self.settled(); + if s < SETTLED_THRESOHLD { + self.set_settled(s + 1); + } + } +} + +impl Cell { + pub fn void() -> Cell { + Cell { + material: MaterialId::Void, + flags: 0, + data: 0, + } + } + pub fn from_material(material: MaterialId) -> Cell { + Cell { + material, + flags: 0, + data: 0, + } + } +} |
