Fix shape modification not updating graphics in testbed (#708)

* Fix shape modification not updating graphics in testbed

* Add update collider to Testbed

* chore: lint shape_modifications3

* chore: simplify GraphicsManager::remove_collider_nodes

---------

Co-authored-by: Sébastien Crozet <sebcrozet@dimforge.com>
This commit is contained in:
Austin J. Garrett
2025-01-08 12:03:01 -05:00
committed by GitHub
parent 2ed1934756
commit 552cfebab0
3 changed files with 52 additions and 11 deletions

View File

@@ -35,13 +35,32 @@ pub fn init_world(testbed: &mut Testbed) {
let collider = ColliderBuilder::ball(ball_rad).density(100.0);
let ball_coll_handle = colliders.insert_with_parent(collider, ball_handle, &mut bodies);
/*
* Colliders without bodies
*/
let shape_size = 3.0;
let static_collider =
ColliderBuilder::ball(shape_size).translation(vector![-15.0, shape_size, 18.0]);
colliders.insert(static_collider);
let shapes = [
SharedShape::ball(shape_size),
SharedShape::cuboid(shape_size, shape_size, shape_size),
SharedShape::cone(shape_size, shape_size),
SharedShape::cylinder(shape_size, shape_size),
];
let mut shape_idx = 0;
let shapeshifting_collider = ColliderBuilder::new(shapes[shape_idx].clone())
.translation(vector![-15.0, shape_size, 9.0]);
let shapeshifting_coll_handle = colliders.insert(shapeshifting_collider);
let mut linvel = Vector::zeros();
let mut angvel = Vector::zeros();
let mut pos = Isometry::identity();
let mut step = 0;
let snapped_frame = 51;
testbed.add_callback(move |_, physics, _, _| {
testbed.add_callback(move |mut gfx, physics, _, _| {
step += 1;
// Snap the ball velocity or restore it.
@@ -53,6 +72,15 @@ pub fn init_world(testbed: &mut Testbed) {
pos = *ball.position();
}
let shapeshifting_coll = physics
.colliders
.get_mut(shapeshifting_coll_handle)
.unwrap();
if step % 50 == 0 {
shape_idx = (shape_idx + 1) % 4;
shapeshifting_coll.set_shape(shapes[shape_idx].clone())
}
if step == 100 {
ball.set_linvel(linvel, true);
ball.set_angvel(angvel, true);
@@ -62,6 +90,11 @@ pub fn init_world(testbed: &mut Testbed) {
let ball_coll = physics.colliders.get_mut(ball_coll_handle).unwrap();
ball_coll.set_shape(SharedShape::ball(ball_rad * step as f32 * 2.0));
if let Some(gfx) = &mut gfx {
gfx.update_collider(ball_coll_handle, &physics.colliders);
gfx.update_collider(shapeshifting_coll_handle, &physics.colliders);
}
});
/*
@@ -111,5 +144,5 @@ pub fn init_world(testbed: &mut Testbed) {
* Set up the testbed.
*/
testbed.set_world(bodies, colliders, impulse_joints, multibody_joints);
testbed.look_at(point![10.0, 10.0, 10.0], Point::origin());
testbed.look_at(point![40.0, 40.0, 40.0], Point::origin());
}