aboutsummaryrefslogtreecommitdiff
path: root/examples3d
diff options
context:
space:
mode:
authorSébastien Crozet <developer@crozet.re>2021-05-01 10:17:23 +0200
committerGitHub <noreply@github.com>2021-05-01 10:17:23 +0200
commita385efc5582c7918f11c01a2b6bf26a46919d3a0 (patch)
treec5b9c5e6fcb5561421e2b4b9d99f28e4c83c745e /examples3d
parentaaf80bfa872c6f29b248cab8eb5658ab0d73cb4a (diff)
parent2dfbd9ae92c139e306afc87994adac82489f30eb (diff)
downloadrapier-a385efc5582c7918f11c01a2b6bf26a46919d3a0.tar.gz
rapier-a385efc5582c7918f11c01a2b6bf26a46919d3a0.tar.bz2
rapier-a385efc5582c7918f11c01a2b6bf26a46919d3a0.zip
Merge pull request #183 from dimforge/bundles
Make Rapier accept any kind of data storage instead of RigidBodySet/ColliderSet
Diffstat (limited to 'examples3d')
-rw-r--r--examples3d/all_examples3.rs5
-rw-r--r--examples3d/debug_add_remove_collider3.rs7
-rw-r--r--examples3d/debug_dynamic_collider_add3.rs4
-rw-r--r--examples3d/debug_shape_modification3.rs123
-rw-r--r--examples3d/fountain3.rs9
-rw-r--r--examples3d/joints3.rs20
-rw-r--r--examples3d/one_way_platforms3.rs43
-rw-r--r--examples3d/primitives3.rs2
8 files changed, 177 insertions, 36 deletions
diff --git a/examples3d/all_examples3.rs b/examples3d/all_examples3.rs
index 2611a2f..8031814 100644
--- a/examples3d/all_examples3.rs
+++ b/examples3d/all_examples3.rs
@@ -25,6 +25,7 @@ mod debug_friction3;
mod debug_infinite_fall3;
mod debug_prismatic3;
mod debug_rollback3;
+mod debug_shape_modification3;
mod debug_triangle3;
mod debug_trimesh3;
mod domino3;
@@ -112,6 +113,10 @@ pub fn main() {
("(Debug) infinite fall", debug_infinite_fall3::init_world),
("(Debug) prismatic", debug_prismatic3::init_world),
("(Debug) rollback", debug_rollback3::init_world),
+ (
+ "(Debug) shape modification",
+ debug_shape_modification3::init_world,
+ ),
];
// Lexicographic sort, with stress tests moved at the end of the list.
diff --git a/examples3d/debug_add_remove_collider3.rs b/examples3d/debug_add_remove_collider3.rs
index f353162..9aab754 100644
--- a/examples3d/debug_add_remove_collider3.rs
+++ b/examples3d/debug_add_remove_collider3.rs
@@ -38,7 +38,12 @@ pub fn init_world(testbed: &mut Testbed) {
// Remove then re-add the ground collider.
let coll = physics
.colliders
- .remove(ground_collider_handle, &mut physics.bodies, true)
+ .remove(
+ ground_collider_handle,
+ &mut physics.islands,
+ &mut physics.bodies,
+ true,
+ )
.unwrap();
ground_collider_handle = physics
.colliders
diff --git a/examples3d/debug_dynamic_collider_add3.rs b/examples3d/debug_dynamic_collider_add3.rs
index bd7205e..61c1482 100644
--- a/examples3d/debug_dynamic_collider_add3.rs
+++ b/examples3d/debug_dynamic_collider_add3.rs
@@ -79,7 +79,9 @@ pub fn init_world(testbed: &mut Testbed) {
step = snapped_frame;
for handle in &extra_colliders {
- physics.colliders.remove(*handle, &mut physics.bodies, true);
+ physics
+ .colliders
+ .remove(*handle, &mut physics.islands, &mut physics.bodies, true);
}
extra_colliders.clear();
diff --git a/examples3d/debug_shape_modification3.rs b/examples3d/debug_shape_modification3.rs
new file mode 100644
index 0000000..7ec06dd
--- /dev/null
+++ b/examples3d/debug_shape_modification3.rs
@@ -0,0 +1,123 @@
+use na::{Isometry3, Point3, Vector3};
+use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet};
+use rapier3d::geometry::{ColliderBuilder, ColliderSet, SharedShape};
+use rapier_testbed3d::Testbed;
+
+pub fn init_world(testbed: &mut Testbed) {
+ /*
+ * World
+ */
+ let mut bodies = RigidBodySet::new();
+ let mut colliders = ColliderSet::new();
+ let joints = JointSet::new();
+ /*
+ * Ground.
+ */
+ let ground_size = 20.0;
+ let ground_height = 0.1;
+
+ let rigid_body = RigidBodyBuilder::new_static()
+ .translation(0.0, -ground_height, 0.0)
+ .build();
+ let ground_handle = bodies.insert(rigid_body);
+ let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size)
+ .friction(0.15)
+ // .restitution(0.5)
+ .build();
+ colliders.insert(collider, ground_handle, &mut bodies);
+
+ /*
+ * Rolling ball
+ */
+ let ball_rad = 0.1;
+ let rb = RigidBodyBuilder::new_dynamic()
+ .translation(0.0, 0.2, 0.0)
+ .linvel(10.0, 0.0, 0.0)
+ .build();
+ let ball_handle = bodies.insert(rb);
+ let collider = ColliderBuilder::ball(ball_rad).density(100.0).build();
+ let ball_coll_handle = colliders.insert(collider, ball_handle, &mut bodies);
+
+ let mut linvel = Vector3::zeros();
+ let mut angvel = Vector3::zeros();
+ let mut pos = Isometry3::identity();
+ let mut step = 0;
+ let snapped_frame = 51;
+
+ testbed.add_callback(move |_, _, physics, _, _| {
+ step += 1;
+
+ // Snap the ball velocity or restore it.
+ let ball = physics.bodies.get_mut(ball_handle).unwrap();
+
+ if step == snapped_frame {
+ linvel = *ball.linvel();
+ angvel = *ball.angvel();
+ pos = *ball.position();
+ }
+
+ if step == 100 {
+ ball.set_linvel(linvel, true);
+ ball.set_angvel(angvel, true);
+ ball.set_position(pos, true);
+ step = snapped_frame;
+ }
+
+ let ball_coll = physics.colliders.get_mut(ball_coll_handle).unwrap();
+ ball_coll.set_shape(SharedShape::ball(ball_rad * step as f32 * 2.0));
+ });
+
+ /*
+ * Create the primitives
+ */
+ let num = 8;
+ let rad = 1.0;
+
+ let shiftx = rad * 2.0 + rad;
+ let shifty = rad * 2.0 + rad;
+ let shiftz = rad * 2.0 + rad;
+ let centerx = shiftx * (num / 2) as f32;
+ let centery = shifty / 2.0;
+ let centerz = shiftz * (num / 2) as f32;
+
+ let mut offset = -(num as f32) * (rad * 2.0 + rad) * 0.5;
+
+ for j in 0usize..20 {
+ for i in 0..num {
+ for k in 0usize..num {
+ let x = i as f32 * shiftx - centerx + offset + 5.0;
+ let y = j as f32 * shifty + centery + 3.0;
+ let z = k as f32 * shiftz - centerz + offset;
+
+ // Build the rigid body.
+ let rigid_body = RigidBodyBuilder::new_dynamic().translation(x, y, z).build();
+ let handle = bodies.insert(rigid_body);
+
+ let collider = match j % 5 {
+ 0 => ColliderBuilder::cuboid(rad, rad, rad).build(),
+ 1 => ColliderBuilder::ball(rad).build(),
+ // Rounded cylinders are much more efficient that cylinder, even if the
+ // rounding margin is small.
+ 2 => ColliderBuilder::round_cylinder(rad, rad, rad / 10.0).build(),
+ 3 => ColliderBuilder::cone(rad, rad).build(),
+ _ => ColliderBuilder::capsule_y(rad, rad).build(),
+ };
+
+ colliders.insert(collider, handle, &mut bodies);
+ }
+ }
+
+ offset -= 0.05 * rad * (num as f32 - 1.0);
+ }
+
+ /*
+ * Set up the testbed.
+ */
+ testbed.set_world(bodies, colliders, joints);
+ testbed.look_at(Point3::new(10.0, 10.0, 10.0), Point3::origin());
+}
+
+fn main() {
+ let testbed = Testbed::from_builders(0, vec![("Boxes", init_world)]);
+ testbed.run()
+}
diff --git a/examples3d/fountain3.rs b/examples3d/fountain3.rs
index 6c80562..08e1dfe 100644
--- a/examples3d/fountain3.rs
+++ b/examples3d/fountain3.rs
@@ -61,9 +61,12 @@ pub fn init_world(testbed: &mut Testbed) {
let num_to_remove = to_remove.len() - MAX_NUMBER_OF_BODIES;
for (handle, _) in &to_remove[..num_to_remove] {
- physics
- .bodies
- .remove(*handle, &mut physics.colliders, &mut physics.joints);
+ physics.bodies.remove(
+ *handle,
+ &mut physics.islands,
+ &mut physics.colliders,
+ &mut physics.joints,
+ );
if let (Some(graphics), Some(window)) = (&mut graphics, &mut window) {
graphics.remove_body_nodes(window, *handle);
diff --git a/examples3d/joints3.rs b/examples3d/joints3.rs
index 6ba9461..5b082fb 100644
--- a/examples3d/joints3.rs
+++ b/examples3d/joints3.rs
@@ -1,7 +1,7 @@
use na::{Isometry3, Point3, Unit, UnitQuaternion, Vector3};
use rapier3d::dynamics::{
- BallJoint, BodyStatus, FixedJoint, JointSet, PrismaticJoint, RevoluteJoint, RigidBodyBuilder,
- RigidBodyHandle, RigidBodySet,
+ BallJoint, FixedJoint, JointSet, PrismaticJoint, RevoluteJoint, RigidBodyBuilder,
+ RigidBodyHandle, RigidBodySet, RigidBodyType,
};
use rapier3d::geometry::{ColliderBuilder, ColliderSet};
use rapier_testbed3d::Testbed;
@@ -203,9 +203,9 @@ fn create_fixed_joints(
// fixed bodies. Because physx will crash if we add
// a joint between these.
let status = if i == 0 && (k % 4 == 0 && k != num - 2 || k == num - 1) {
- BodyStatus::Static
+ RigidBodyType::Static
} else {
- BodyStatus::Dynamic
+ RigidBodyType::Dynamic
};
let rigid_body = RigidBodyBuilder::new(status)
@@ -258,9 +258,9 @@ fn create_ball_joints(
let fi = i as f32;
let status = if i == 0 && (k % 4 == 0 || k == num - 1) {
- BodyStatus::Static
+ RigidBodyType::Static
} else {
- BodyStatus::Dynamic
+ RigidBodyType::Dynamic
};
let rigid_body = RigidBodyBuilder::new(status)
@@ -317,9 +317,9 @@ fn create_actuated_revolute_joints(
// fixed bodies. Because physx will crash if we add
// a joint between these.
let status = if i == 0 {
- BodyStatus::Static
+ RigidBodyType::Static
} else {
- BodyStatus::Dynamic
+ RigidBodyType::Dynamic
};
let shifty = (i >= 1) as u32 as f32 * -2.0;
@@ -378,9 +378,9 @@ fn create_actuated_ball_joints(
// fixed bodies. Because physx will crash if we add
// a joint between these.
let status = if i == 0 {
- BodyStatus::Static
+ RigidBodyType::Static
} else {
- BodyStatus::Dynamic
+ RigidBodyType::Dynamic
};
let rigid_body = RigidBodyBuilder::new(status)
diff --git a/examples3d/one_way_platforms3.rs b/examples3d/one_way_platforms3.rs
index d117a5b..f5a2f1b 100644
--- a/examples3d/one_way_platforms3.rs
+++ b/examples3d/one_way_platforms3.rs
@@ -9,36 +9,39 @@ struct OneWayPlatformHook {
platform2: ColliderHandle,
}
-impl PhysicsHooks for OneWayPlatformHook {
+impl PhysicsHooks<RigidBodySet, ColliderSet> for OneWayPlatformHook {
fn active_hooks(&self) -> PhysicsHooksFlags {
PhysicsHooksFlags::MODIFY_SOLVER_CONTACTS
}
- fn modify_solver_contacts(&self, context: &mut ContactModificationContext) {
+ fn modify_solver_contacts(
+ &self,
+ context: &mut ContactModificationContext<RigidBodySet, ColliderSet>,
+ ) {
// The allowed normal for the first platform is its local +y axis, and the
// allowed normal for the second platform is its local -y axis.
//
// Now we have to be careful because the `manifold.local_n1` normal points
// toward the outside of the shape of `context.co1`. So we need to flip the
- // allowed normal direction if the platform is in `context.collider_handle2`.
+ // allowed normal direction if the platform is in `context.collider2`.
//
// Therefore:
- // - If context.collider_handle1 == self.platform1 then the allowed normal is +y.
- // - If context.collider_handle2 == self.platform1 then the allowed normal is -y.
- // - If context.collider_handle1 == self.platform2 then its allowed normal +y needs to be flipped to -y.
- // - If context.collider_handle2 == self.platform2 then the allowed normal -y needs to be flipped to +y.
+ // - If context.collider1 == self.platform1 then the allowed normal is +y.
+ // - If context.collider2 == self.platform1 then the allowed normal is -y.
+ // - If context.collider1 == self.platform2 then its allowed normal +y needs to be flipped to -y.
+ // - If context.collider2 == self.platform2 then the allowed normal -y needs to be flipped to +y.
let mut allowed_local_n1 = Vector3::zeros();
- if context.collider_handle1 == self.platform1 {
+ if context.collider1 == self.platform1 {
allowed_local_n1 = Vector3::y();
- } else if context.collider_handle2 == self.platform1 {
+ } else if context.collider2 == self.platform1 {
// Flip the allowed direction.
allowed_local_n1 = -Vector3::y();
}
- if context.collider_handle1 == self.platform2 {
+ if context.collider1 == self.platform2 {
allowed_local_n1 = -Vector3::y();
- } else if context.collider_handle2 == self.platform2 {
+ } else if context.collider2 == self.platform2 {
// Flip the allowed direction.
allowed_local_n1 = Vector3::y();
}
@@ -47,13 +50,12 @@ impl PhysicsHooks for OneWayPlatformHook {
context.update_as_oneway_platform(&allowed_local_n1, 0.1);
// Set the surface velocity of the accepted contacts.
- let tangent_velocity = if context.collider_handle1 == self.platform1
- || context.collider_handle2 == self.platform2
- {
- -12.0
- } else {
- 12.0
- };
+ let tangent_velocity =
+ if context.collider1 == self.platform1 || context.collider2 == self.platform2 {
+ -12.0
+ } else {
+ 12.0
+ };
for contact in context.solver_contacts.iter_mut() {
contact.tangent_velocity.z = tangent_velocity;
@@ -115,13 +117,14 @@ pub fn init_world(testbed: &mut Testbed) {
}
}
- physics.bodies.foreach_active_dynamic_body_mut(|_, body| {
+ for handle in physics.islands.active_dynamic_bodies() {
+ let body = physics.bodies.get_mut(*handle).unwrap();
if body.position().translation.y > 1.0 {
body.set_gravity_scale(1.0, false);
} else if body.position().translation.y < -1.0 {
body.set_gravity_scale(-1.0, false);
}
- });
+ }
});
/*
diff --git a/examples3d/primitives3.rs b/examples3d/primitives3.rs
index db15341..2711ba9 100644
--- a/examples3d/primitives3.rs
+++ b/examples3d/primitives3.rs
@@ -25,7 +25,7 @@ pub fn init_world(testbed: &mut Testbed) {
colliders.insert(collider, handle, &mut bodies);
/*
- * Create the cubes
+ * Create the primitives
*/
let num = 8;
let rad = 1.0;