summaryrefslogtreecommitdiff
path: root/src/sim/mod.rs
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2026-08-22 15:00:35 -0700
committerKai Stevenson <kai@kaistevenson.com>2026-08-22 15:00:35 -0700
commit1a515237afb7ad09353a65f5fbc6e98a7c29ce8e (patch)
tree48cd4b4bcf8f8e357811f905f22607838d7c1f96 /src/sim/mod.rs
parent6350e4ffca8ce1e46465284ef3d7559e0f40229b (diff)
sim manager refactor
Diffstat (limited to 'src/sim/mod.rs')
-rw-r--r--src/sim/mod.rs69
1 files changed, 5 insertions, 64 deletions
diff --git a/src/sim/mod.rs b/src/sim/mod.rs
index d9e358b..95fb2db 100644
--- a/src/sim/mod.rs
+++ b/src/sim/mod.rs
@@ -1,66 +1,7 @@
-use crate::sim::{cell::materials::MaterialId, cell_sim::world::World, rb_sim::RbSimManager};
-
pub mod cell;
-pub mod cell_sim;
+pub mod cell_manager;
+pub mod entity;
pub mod lib;
-pub mod particle_sim;
-pub mod rb_sim;
-
-pub fn write_rb_entity_to_world(
- world: &mut World,
- rb_sim_manager: &RbSimManager,
- rb_entity_id: u32,
- // make sure these cells will be simulated
- seqno: u64,
- // (entity_x, entity_y, cell_x, cell_y)
-) -> Vec<(u8, u8, i32, i32)> {
- let mut cells_written: Vec<(u8, u8, i32, i32)> = Vec::new();
- if let Some(rb_entity) = rb_sim_manager.rb_entities.get(&rb_entity_id)
- && let Some((rb_x, rb_y, cos, sin)) = rb_sim_manager.get_rb_entity_transform(rb_entity_id)
- {
- let (half_size_x, half_size_y) =
- (rb_entity.width as f32 / 2.0, rb_entity.height as f32 / 2.0);
- // half-extent of the rotated grid's axis-aligned bounding box, plus a cell of margin
- let (radius_x, radius_y) = (
- half_size_x * (cos.abs() + sin.abs()) + 1.0,
- half_size_y * (cos.abs() + sin.abs()) + 1.0,
- );
-
- let world_xl = (rb_x - radius_x).floor() as i32;
- let world_xu = (rb_x + radius_x).ceil() as i32;
- let world_yl = (rb_y - radius_y).floor() as i32;
- let world_yu = (rb_y + radius_y).ceil() as i32;
-
- for world_x in world_xl..=world_xu {
- for world_y in world_yl..=world_yu {
- if let Some(cur_world_cell) = world.get_cell_from_game_position(world_x, world_y)
- && cur_world_cell.material == MaterialId::Void
- {
- // same as shader
- let d = (world_x as f32 + 0.5 - rb_x, world_y as f32 + 0.5 - rb_y);
- let q = (d.0.floor() + 0.5, d.1.floor() + 0.5);
- let (lx, ly) = (
- (q.0 * cos + q.1 * sin + half_size_x).floor() as i32,
- (-q.0 * sin + q.1 * cos + half_size_y).floor() as i32,
- );
-
- if lx < 0 || ly < 0 || lx >= rb_entity.width || ly >= rb_entity.height {
- continue;
- }
-
- let mut cell = rb_entity.get_cell_at_local_position(lx as u8, ly as u8);
- if cell.material == MaterialId::Void {
- continue;
- }
-
- cell.match_parity(seqno);
-
- // TODO: OPTIMIZE!!
- world.set_cell_from_game_position(world_x, world_y, cell, false);
- cells_written.push((lx as u8, ly as u8, world_x, world_y));
- }
- }
- }
- }
- cells_written
-}
+pub mod particle_manager;
+pub mod rb_manager;
+pub mod sim_manager;