summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/sim/rb_sim/mod.rs40
-rw-r--r--src/sim/rb_sim/rb_entity.rs3
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 {