1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
use rapier3d::dynamics::*; use rapier3d::geometry::*; use rapier3d::math::Real; use rapier3d::na::Vector3; use rapier3d::pipeline::{ChannelEventCollector, PhysicsPipeline}; pub struct Physics { pipeline: PhysicsPipeline, gravity: Vector3<Real>, integration_parameters: IntegrationParameters, broad_phase: BroadPhase, narrow_phase: NarrowPhase, bodies: RigidBodySet, colliders: ColliderSet, joints: JointSet, ccd_solver: CCDSolver, event_handler: Option<ChannelEventCollector>, } impl Physics { pub fn new() -> Self { Self { pipeline: PhysicsPipeline::new(), gravity: Vector3::new(0.0, -10.0, 0.0), integration_parameters: IntegrationParameters::default(), broad_phase: BroadPhase::new(), narrow_phase: NarrowPhase::new(), bodies: RigidBodySet::new(), colliders: ColliderSet::new(), joints: JointSet::new(), ccd_solver: CCDSolver::new(), event_handler: None, } } pub fn set_event_handler(&mut self, event_handler: Option<ChannelEventCollector>) { self.event_handler = event_handler; } pub fn step(&mut self) { match self.event_handler.as_ref() { Some(event_handler) => self.pipeline.step( &self.gravity, &self.integration_parameters, &mut self.broad_phase, &mut self.narrow_phase, &mut self.bodies, &mut self.colliders, &mut self.joints, &mut self.ccd_solver, &(), event_handler, ), None => self.pipeline.step( &self.gravity, &self.integration_parameters, &mut self.broad_phase, &mut self.narrow_phase, &mut self.bodies, &mut self.colliders, &mut self.joints, &mut self.ccd_solver, &(), &(), ), } } pub fn add( &mut self, body: RigidBody, collider: Collider, ) -> (RigidBodyHandle, ColliderHandle) { let body_handle = self.bodies.insert(body); let collider_handle = self .colliders .insert(collider, body_handle, &mut self.bodies); (body_handle, collider_handle) } pub fn remove(&mut self, body_handle: RigidBodyHandle) { self.bodies .remove(body_handle, &mut self.colliders, &mut self.joints); } pub fn body(&self, body_handle: RigidBodyHandle) -> Option<&RigidBody> { self.bodies.get(body_handle) } pub fn body_mut(&mut self, body_handle: RigidBodyHandle) -> Option<&mut RigidBody> { self.bodies.get_mut(body_handle) } pub fn collider(&self, collider_handle: ColliderHandle) -> Option<&Collider> { self.colliders.get(collider_handle) } pub fn collider_mut(&mut self, collider_handle: ColliderHandle) -> Option<&mut Collider> { self.colliders.get_mut(collider_handle) } }