From 92dd02d7cc4d9fc930760d26d81edbe2197a3fc0 Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Tue, 18 Aug 2026 20:20:32 -0700 Subject: marching rigid bodies --- src/sim/rb_sim/rb_entity.rs | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) (limited to 'src/sim/rb_sim/rb_entity.rs') diff --git a/src/sim/rb_sim/rb_entity.rs b/src/sim/rb_sim/rb_entity.rs index 50243bc..08813f6 100644 --- a/src/sim/rb_sim/rb_entity.rs +++ b/src/sim/rb_sim/rb_entity.rs @@ -1,24 +1,38 @@ use rapier2d::prelude; -use crate::{ - config::{CELLS_IN_CHUNK, CHUNK_SIZE}, - sim::cell::cell::Cell, +use crate::sim::{ + cell::{cell::Cell, materials::MaterialId}, + lib::marching_squares::Marchable, }; pub struct RbEntity { pub id: u32, - // TODO resizable - pub cells: Box<[Cell; CELLS_IN_CHUNK]>, + pub width: i32, + pub height: i32, + pub cells: Vec, pub rb_parent: prelude::RigidBodyHandle, } impl RbEntity { #[inline] pub fn get_cell_at_local_position(&self, x: u8, y: u8) -> Cell { - self.cells[x as usize + y as usize * CHUNK_SIZE as usize] + self.cells[x as usize + y as usize * self.width as usize] } #[inline] pub fn set_cell_at_local_position(&mut self, x: u8, y: u8, cell: Cell) { - self.cells[x as usize + y as usize * CHUNK_SIZE as usize] = cell; + self.cells[x as usize + y as usize * self.width as usize] = cell; + } +} + +impl Marchable for RbEntity { + fn occupied(&self, x: i32, y: i32) -> bool { + if x < 0 || x >= self.width || y < 0 || y >= self.height { + false + } else { + self.get_cell_at_local_position(x as u8, y as u8).material != MaterialId::Void + } + } + fn size(&self) -> (i32, i32) { + (self.width, self.height) } } -- cgit v1.3.1