summaryrefslogtreecommitdiff
path: root/src/sim
diff options
context:
space:
mode:
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.rs2
-rw-r--r--src/sim/cell_sim/chunk.rs (renamed from src/sim/chunk.rs)2
-rw-r--r--src/sim/cell_sim/mod.rs4
-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.rs7
-rw-r--r--src/sim/rb_sim/mod.rs131
-rw-r--r--src/sim/rb_sim/rb_entity.rs24
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;
+ }
+}