From 80824a8b69b70e6e40577e4f0236c28c4ad5c15b Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Sun, 23 Aug 2026 02:48:43 -0700 Subject: explosions affect rigidbodies, use "world" for rapier --- src/sim/rb_manager/mod.rs | 83 ++++++++++++++--------------------------------- 1 file changed, 25 insertions(+), 58 deletions(-) (limited to 'src/sim/rb_manager') diff --git a/src/sim/rb_manager/mod.rs b/src/sim/rb_manager/mod.rs index a70c677..2d95eb7 100644 --- a/src/sim/rb_manager/mod.rs +++ b/src/sim/rb_manager/mod.rs @@ -2,7 +2,13 @@ pub mod debug_render; use fxhash::FxHashMap; use glam::Vec2; -use rapier2d::{geometry, glamx::vec2, prelude}; +use rapier2d::{ + dynamics::IntegrationParameters, + geometry, + glamx::vec2, + pipeline::{DebugRenderPipeline, PhysicsWorld}, + prelude, +}; use crate::{ config::{CELLS_TO_METRES, CHUNK_SIZE, PHYSICS_DELTA_TIME}, @@ -16,37 +22,23 @@ use crate::{ pub use rapier2d::pipeline::DebugRenderMode; pub struct PhysicsManager { - pub rigid_body_set: prelude::RigidBodySet, - pub collider_set: prelude::ColliderSet, - pub physics_pipeline: prelude::PhysicsPipeline, - pub integration_parameters: prelude::IntegrationParameters, - pub island_manager: prelude::IslandManager, - pub broad_phase: prelude::DefaultBroadPhase, - pub narrow_phase: prelude::NarrowPhase, - pub impulse_joint_set: prelude::ImpulseJointSet, - pub multibody_joint_set: prelude::MultibodyJointSet, - pub ccd_solver: prelude::CCDSolver, - pub debug_render_pipeline: prelude::DebugRenderPipeline, + pub world: PhysicsWorld, + pub debug_render_pipeline: DebugRenderPipeline, } impl PhysicsManager { pub fn new() -> Self { + let mut world = PhysicsWorld::new(); + let gravity = vec2(0.0, 9.81); + world.gravity = gravity; + world.integration_parameters = IntegrationParameters { + // 20 pixels <-> 1 meter + length_unit: CELLS_TO_METRES, + dt: PHYSICS_DELTA_TIME, + ..prelude::IntegrationParameters::default() + }; 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: CELLS_TO_METRES, - 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(), + world, debug_render_pipeline: prelude::DebugRenderPipeline::new( prelude::DebugRenderStyle { sleep_color_multiplier: [1.0; 4], @@ -70,37 +62,17 @@ pub struct RbManager { impl RbManager { pub fn 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, - &(), - &(), - ); + self.physics_manager.world.step(); } pub fn debug_render(&mut self, mode: DebugRenderMode) -> &[DebugVertex] { puffin::profile_function!(); - let physics = &mut self.physics_manager; self.debug_line_buffer.vertices.clear(); - physics.debug_render_pipeline.mode = mode; - physics.debug_render_pipeline.render( + self.physics_manager.debug_render_pipeline.mode = mode; + self.physics_manager.world.debug_render( + &mut self.physics_manager.debug_render_pipeline, &mut self.debug_line_buffer, - &physics.rigid_body_set, - &physics.collider_set, - &physics.impulse_joint_set, - &physics.multibody_joint_set, - &physics.narrow_phase, ); &self.debug_line_buffer.vertices @@ -160,15 +132,10 @@ impl RbManager { ); if let Some(handle) = self.chunk_colliders.remove(&(cx, cy)) { - self.physics_manager.collider_set.remove( - handle, - &mut self.physics_manager.island_manager, - &mut self.physics_manager.rigid_body_set, - false, - ); + self.physics_manager.world.remove_collider(handle); } - let handle = self.physics_manager.collider_set.insert(collider); + let handle = self.physics_manager.world.insert_collider(collider, None); self.chunk_colliders.insert((cx, cy), handle); } -- cgit v1.3.1