diff options
Diffstat (limited to 'src/sim')
| -rw-r--r-- | src/sim/cell/cell.rs (renamed from src/sim/cell.rs) | 2 | ||||
| -rw-r--r-- | src/sim/cell/materials/fire.rs (renamed from src/sim/materials/fire.rs) | 5 | ||||
| -rw-r--r-- | src/sim/cell/materials/gas.rs (renamed from src/sim/materials/gas.rs) | 2 | ||||
| -rw-r--r-- | src/sim/cell/materials/mod.rs (renamed from src/sim/materials/mod.rs) | 2 | ||||
| -rw-r--r-- | src/sim/cell/materials/sand.rs (renamed from src/sim/materials/sand.rs) | 2 | ||||
| -rw-r--r-- | src/sim/cell/materials/smoke.rs (renamed from src/sim/materials/smoke.rs) | 2 | ||||
| -rw-r--r-- | src/sim/cell/materials/water.rs (renamed from src/sim/materials/water.rs) | 2 | ||||
| -rw-r--r-- | src/sim/cell/mod.rs | 2 | ||||
| -rw-r--r-- | src/sim/cell_sim/chunk.rs (renamed from src/sim/chunk.rs) | 2 | ||||
| -rw-r--r-- | src/sim/cell_sim/mod.rs | 4 | ||||
| -rw-r--r-- | src/sim/cell_sim/overlay.rs (renamed from src/sim/overlay.rs) | 2 | ||||
| -rw-r--r-- | src/sim/cell_sim/sim.rs (renamed from src/sim/sim.rs) | 5 | ||||
| -rw-r--r-- | src/sim/cell_sim/world.rs (renamed from src/sim/world.rs) | 2 | ||||
| -rw-r--r-- | src/sim/mod.rs | 7 | ||||
| -rw-r--r-- | src/sim/rb_sim/mod.rs | 131 | ||||
| -rw-r--r-- | src/sim/rb_sim/rb_entity.rs | 24 |
16 files changed, 180 insertions, 16 deletions
diff --git a/src/sim/cell.rs b/src/sim/cell/cell.rs index d3ca302..d35fa76 100644 --- a/src/sim/cell.rs +++ b/src/sim/cell/cell.rs @@ -1,4 +1,4 @@ -use crate::sim::materials::MaterialId; +use crate::sim::cell::materials::MaterialId; #[derive(Clone, Copy)] pub struct Cell { diff --git a/src/sim/materials/fire.rs b/src/sim/cell/materials/fire.rs index 97027d5..e0416b0 100644 --- a/src/sim/materials/fire.rs +++ b/src/sim/cell/materials/fire.rs @@ -1,6 +1,9 @@ use rand::RngExt; -use crate::sim::{cell::Cell, materials::MaterialId, sim::UpdateCtx}; +use crate::sim::{ + cell::{cell::Cell, materials::MaterialId}, + cell_sim::sim::UpdateCtx, +}; trait FireCellView { fn get_ticks_lived(self) -> u16; diff --git a/src/sim/materials/gas.rs b/src/sim/cell/materials/gas.rs index 8d9f42b..c0cd9f9 100644 --- a/src/sim/materials/gas.rs +++ b/src/sim/cell/materials/gas.rs @@ -1,4 +1,4 @@ -use crate::sim::sim::UpdateCtx; +use crate::sim::cell_sim::sim::UpdateCtx; #[inline] pub fn sim_update(ctx: &mut UpdateCtx) { diff --git a/src/sim/materials/mod.rs b/src/sim/cell/materials/mod.rs index 10f0a06..a55ed51 100644 --- a/src/sim/materials/mod.rs +++ b/src/sim/cell/materials/mod.rs @@ -1,4 +1,4 @@ -use crate::sim::sim::UpdateCtx; +use crate::sim::cell_sim::sim::UpdateCtx; mod fire; mod gas; diff --git a/src/sim/materials/sand.rs b/src/sim/cell/materials/sand.rs index ac8889f..d2d1265 100644 --- a/src/sim/materials/sand.rs +++ b/src/sim/cell/materials/sand.rs @@ -1,4 +1,4 @@ -use crate::sim::sim::UpdateCtx; +use crate::sim::cell_sim::sim::UpdateCtx; #[inline] pub fn sim_update(ctx: &mut UpdateCtx) { diff --git a/src/sim/materials/smoke.rs b/src/sim/cell/materials/smoke.rs index 5240bc9..2ee7c00 100644 --- a/src/sim/materials/smoke.rs +++ b/src/sim/cell/materials/smoke.rs @@ -1,6 +1,6 @@ use rand::RngExt; -use crate::sim::sim::UpdateCtx; +use crate::sim::cell_sim::sim::UpdateCtx; #[inline] pub fn sim_update(ctx: &mut UpdateCtx) { diff --git a/src/sim/materials/water.rs b/src/sim/cell/materials/water.rs index 1ba8eb4..4b848fb 100644 --- a/src/sim/materials/water.rs +++ b/src/sim/cell/materials/water.rs @@ -1,4 +1,4 @@ -use crate::sim::sim::UpdateCtx; +use crate::sim::cell_sim::sim::UpdateCtx; #[inline] pub fn sim_update(ctx: &mut UpdateCtx) { diff --git a/src/sim/cell/mod.rs b/src/sim/cell/mod.rs new file mode 100644 index 0000000..2d2175c --- /dev/null +++ b/src/sim/cell/mod.rs @@ -0,0 +1,2 @@ +pub mod cell; +pub mod materials; diff --git a/src/sim/chunk.rs b/src/sim/cell_sim/chunk.rs index 478af12..116a38a 100644 --- a/src/sim/chunk.rs +++ b/src/sim/cell_sim/chunk.rs @@ -1,6 +1,6 @@ use crate::{ config::{CELLS_IN_CHUNK, CHUNK_SIZE}, - sim::cell::Cell, + sim::cell::cell::Cell, }; pub struct Chunk { diff --git a/src/sim/cell_sim/mod.rs b/src/sim/cell_sim/mod.rs new file mode 100644 index 0000000..a1db2a1 --- /dev/null +++ b/src/sim/cell_sim/mod.rs @@ -0,0 +1,4 @@ +pub mod chunk; +pub mod overlay; +pub mod sim; +pub mod world; diff --git a/src/sim/overlay.rs b/src/sim/cell_sim/overlay.rs index c9fdf17..ee494ae 100644 --- a/src/sim/overlay.rs +++ b/src/sim/cell_sim/overlay.rs @@ -1,4 +1,4 @@ -use crate::{Config, Input, sim::world::World}; +use crate::{Config, Input, sim::cell_sim::world::World}; pub fn create_compute_combined_overlay_offset( world: &World, diff --git a/src/sim/sim.rs b/src/sim/cell_sim/sim.rs index b9f4b76..fd9b6c9 100644 --- a/src/sim/sim.rs +++ b/src/sim/cell_sim/sim.rs @@ -6,7 +6,10 @@ use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; use crate::{ config::CHUNK_SIZE, - sim::{cell::Cell, chunk::Chunk, materials::MaterialDef, world::World}, + sim::{ + cell::{cell::Cell, materials::MaterialDef}, + cell_sim::{chunk::Chunk, world::World}, + }, }; struct ChunkAccess<'a> { diff --git a/src/sim/world.rs b/src/sim/cell_sim/world.rs index d54906c..924639a 100644 --- a/src/sim/world.rs +++ b/src/sim/cell_sim/world.rs @@ -2,7 +2,7 @@ use fxhash::FxHashMap; use crate::{ config::CHUNK_SIZE, - sim::{cell::Cell, chunk::Chunk}, + sim::{cell::cell::Cell, cell_sim::chunk::Chunk}, }; pub struct World { diff --git a/src/sim/mod.rs b/src/sim/mod.rs index 7553f89..63a9c56 100644 --- a/src/sim/mod.rs +++ b/src/sim/mod.rs @@ -1,6 +1,3 @@ pub mod cell; -pub mod chunk; -pub mod materials; -pub mod overlay; -pub mod sim; -pub mod world; +pub mod cell_sim; +pub mod rb_sim; diff --git a/src/sim/rb_sim/mod.rs b/src/sim/rb_sim/mod.rs new file mode 100644 index 0000000..1818052 --- /dev/null +++ b/src/sim/rb_sim/mod.rs @@ -0,0 +1,131 @@ +pub mod rb_entity; + +use fxhash::FxHashMap; +use rapier2d::{ + dynamics::{self}, + geometry, + glamx::vec2, + math, prelude, +}; + +use crate::{ + config::{CELLS_IN_CHUNK, PHYSICS_DELTA_TIME}, + sim::{ + cell::{cell::Cell, materials::MaterialId}, + rb_sim::rb_entity::RbEntity, + }, +}; + +pub struct PhysicsManager { + rigid_body_set: prelude::RigidBodySet, + collider_set: prelude::ColliderSet, + physics_pipeline: prelude::PhysicsPipeline, + integration_parameters: prelude::IntegrationParameters, + island_manager: prelude::IslandManager, + broad_phase: prelude::DefaultBroadPhase, + narrow_phase: prelude::NarrowPhase, + impulse_joint_set: prelude::ImpulseJointSet, + multibody_joint_set: prelude::MultibodyJointSet, + ccd_solver: prelude::CCDSolver, +} + +impl PhysicsManager { + pub fn new() -> Self { + PhysicsManager { + rigid_body_set: prelude::RigidBodySet::new(), + collider_set: prelude::ColliderSet::new(), + physics_pipeline: prelude::PhysicsPipeline::new(), + integration_parameters: prelude::IntegrationParameters { + // 20 pixels = 1 meter + length_unit: 20.0, + dt: PHYSICS_DELTA_TIME, + ..prelude::IntegrationParameters::default() + }, + island_manager: prelude::IslandManager::new(), + broad_phase: prelude::DefaultBroadPhase::new(), + narrow_phase: prelude::NarrowPhase::new(), + impulse_joint_set: prelude::ImpulseJointSet::new(), + multibody_joint_set: prelude::MultibodyJointSet::new(), + ccd_solver: prelude::CCDSolver::new(), + } + } +} + +pub struct RbSimManager { + physics_manager: PhysicsManager, + pub rb_entities: FxHashMap<u32, RbEntity>, +} + +impl RbSimManager { + pub fn rb_tick(&mut self, delta_time: f32) { + let gravity = vec2(0.0, -9.81); + + self.physics_manager.physics_pipeline.step( + gravity, + &self.physics_manager.integration_parameters, + &mut self.physics_manager.island_manager, + &mut self.physics_manager.broad_phase, + &mut self.physics_manager.narrow_phase, + &mut self.physics_manager.rigid_body_set, + &mut self.physics_manager.collider_set, + &mut self.physics_manager.impulse_joint_set, + &mut self.physics_manager.multibody_joint_set, + &mut self.physics_manager.ccd_solver, + &(), + &(), + ); + } + + pub fn get_rb_entity_position(&self, entity_id: u32) -> Option<(f32, f32)> { + let entity = self.rb_entities.get(&entity_id); + match entity { + Some(entity) => { + let rb = self.physics_manager.rigid_body_set.get(entity.rb_parent); + rb.map(|rb| (rb.position().translation.x, rb.position().translation.y)) + } + None => return None, + } + } + + pub fn test(&mut self) { + /* Create the ground. */ + let collider = geometry::ColliderBuilder::cuboid(100.0, 0.1).build(); + self.physics_manager.collider_set.insert(collider); + + /* Create the bouncing ball. */ + let rigid_body = dynamics::RigidBodyBuilder::dynamic() + .translation(math::Vector::new(0.0, 10.0)) + .build(); + let collider = geometry::ColliderBuilder::ball(0.5) + .restitution(0.7) + .build(); + let ball_body_handle = self.physics_manager.rigid_body_set.insert(rigid_body); + self.physics_manager.collider_set.insert_with_parent( + collider, + ball_body_handle, + &mut self.physics_manager.rigid_body_set, + ); + + let test_cells = Box::new([Cell::void(); CELLS_IN_CHUNK]); + let mut rb_entity = RbEntity { + id: 0, + cells: test_cells, + rb_parent: ball_body_handle, + }; + + for x in 0..10 { + for y in 0..10 { + rb_entity.set_cell_at_local_position(x, y, Cell::from_material(MaterialId::Wood)); + } + } + + self.rb_entities.insert(0, rb_entity); + } + + pub fn new() -> Self { + RbSimManager { + physics_manager: PhysicsManager::new(), + rb_entities: FxHashMap::default(), + } + } +} diff --git a/src/sim/rb_sim/rb_entity.rs b/src/sim/rb_sim/rb_entity.rs new file mode 100644 index 0000000..50243bc --- /dev/null +++ b/src/sim/rb_sim/rb_entity.rs @@ -0,0 +1,24 @@ +use rapier2d::prelude; + +use crate::{ + config::{CELLS_IN_CHUNK, CHUNK_SIZE}, + sim::cell::cell::Cell, +}; + +pub struct RbEntity { + pub id: u32, + // TODO resizable + pub cells: Box<[Cell; CELLS_IN_CHUNK]>, + 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] + } + #[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; + } +} |
