diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/sim/rb_sim/mod.rs | 40 | ||||
| -rw-r--r-- | src/sim/rb_sim/rb_entity.rs | 3 |
2 files changed, 35 insertions, 8 deletions
diff --git a/src/sim/rb_sim/mod.rs b/src/sim/rb_sim/mod.rs index 17f605e..f81d5f1 100644 --- a/src/sim/rb_sim/mod.rs +++ b/src/sim/rb_sim/mod.rs @@ -121,32 +121,58 @@ impl RbSimManager { .build(); let rb_handle = self.physics_manager.rigid_body_set.insert(rb); - let entity: RbEntity = RbEntity { + let mut entity: RbEntity = RbEntity { id, cells, - rb_parent: rb_handle, width: w, height: h, + rb: rb_handle, + collider: None, }; let collider = self .convex_hull_collider_from_marchable(&entity, None) .build(); - - self.rb_entities.insert(id, entity); - self.physics_manager.collider_set.insert_with_parent( + let collider_handle = self.physics_manager.collider_set.insert_with_parent( collider, rb_handle, &mut self.physics_manager.rigid_body_set, ); + entity.collider = Some(collider_handle); + + self.rb_entities.insert(id, entity); + id } + pub fn update_rb_entity(&mut self, entity_id: u32) { + let entity = self.rb_entities.get(&entity_id).unwrap(); + let new_collider = self + .convex_hull_collider_from_marchable(entity, None) + .build(); + + self.physics_manager.collider_set.remove( + entity.collider.unwrap(), + &mut self.physics_manager.island_manager, + &mut self.physics_manager.rigid_body_set, + false, + ); + + let new_collider_handle = self.physics_manager.collider_set.insert_with_parent( + new_collider, + entity.rb, + &mut self.physics_manager.rigid_body_set, + ); + + let entity = self.rb_entities.get_mut(&entity_id).unwrap(); + entity.collider = Some(new_collider_handle); + } + pub fn destroy_rb_entity(&mut self, entity_id: u32) { if let Some(entity) = self.rb_entities.get(&entity_id) { self.physics_manager.rigid_body_set.remove( - entity.rb_parent, + entity.rb, &mut self.physics_manager.island_manager, &mut self.physics_manager.collider_set, &mut self.physics_manager.impulse_joint_set, @@ -161,7 +187,7 @@ impl RbSimManager { let entity = self.rb_entities.get(&entity_id); match entity { Some(entity) => { - let rb = self.physics_manager.rigid_body_set.get(entity.rb_parent); + let rb = self.physics_manager.rigid_body_set.get(entity.rb); rb.map(|rb| { let position = rb.position(); let angle = position.rotation.angle(); diff --git a/src/sim/rb_sim/rb_entity.rs b/src/sim/rb_sim/rb_entity.rs index 08813f6..18a6693 100644 --- a/src/sim/rb_sim/rb_entity.rs +++ b/src/sim/rb_sim/rb_entity.rs @@ -10,7 +10,8 @@ pub struct RbEntity { pub width: i32, pub height: i32, pub cells: Vec<Cell>, - pub rb_parent: prelude::RigidBodyHandle, + pub rb: prelude::RigidBodyHandle, + pub collider: Option<prelude::ColliderHandle>, } impl RbEntity { |
