diff options
69 files changed, 4637 insertions, 1430 deletions
@@ -19,10 +19,10 @@ members = [ "build/rapier2d", "build/rapier2d-f64", "build/rapier_testbed2d", "e #kiss3d = { git = "https://github.com/sebcrozet/kiss3d" } #nalgebra = { git = "https://github.com/dimforge/nalgebra", branch = "dev" } -#parry2d = { git = "https://github.com/dimforge/parry" } -#parry3d = { git = "https://github.com/dimforge/parry" } -#parry2d-f64 = { git = "https://github.com/dimforge/parry" } -#parry3d-f64 = { git = "https://github.com/dimforge/parry" } +parry2d = { git = "https://github.com/dimforge/parry", branch = "special_cases" } +parry3d = { git = "https://github.com/dimforge/parry", branch = "special_cases" } +parry2d-f64 = { git = "https://github.com/dimforge/parry", branch = "special_cases" } +parry3d-f64 = { git = "https://github.com/dimforge/parry", branch = "special_cases" } #ncollide2d = { git = "https://github.com/dimforge/ncollide" } #ncollide3d = { git = "https://github.com/dimforge/ncollide" } #nphysics2d = { git = "https://github.com/dimforge/nphysics" } diff --git a/benchmarks3d/all_benchmarks3.rs b/benchmarks3d/all_benchmarks3.rs index f35cb8e..38d71cd 100644 --- a/benchmarks3d/all_benchmarks3.rs +++ b/benchmarks3d/all_benchmarks3.rs @@ -13,6 +13,7 @@ use std::cmp::Ordering; mod balls3; mod boxes3; mod capsules3; +mod ccd3; mod compound3; mod convex_polyhedron3; mod heightfield3; @@ -52,6 +53,7 @@ pub fn main() { ("Balls", balls3::init_world), ("Boxes", boxes3::init_world), ("Capsules", capsules3::init_world), + ("CCD", ccd3::init_world), ("Compound", compound3::init_world), ("Convex polyhedron", convex_polyhedron3::init_world), ("Heightfield", heightfield3::init_world), diff --git a/benchmarks3d/ccd3.rs b/benchmarks3d/ccd3.rs new file mode 100644 index 0000000..f1831e7 --- /dev/null +++ b/benchmarks3d/ccd3.rs @@ -0,0 +1,85 @@ +use na::Point3; +use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet}; +use rapier3d::geometry::{ColliderBuilder, ColliderSet}; +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 = 100.1; + let ground_height = 0.1; + + let rigid_body = RigidBodyBuilder::new_static() + .translation(0.0, -ground_height, 0.0) + .build(); + let handle = bodies.insert(rigid_body); + let collider = ColliderBuilder::cuboid(ground_size, ground_height, ground_size).build(); + colliders.insert(collider, handle, &mut bodies); + + /* + * Create the cubes + */ + let num = 4; + let numj = 20; + 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..numj { + for i in 0..num { + for k in 0usize..num { + let x = i as f32 * shiftx - centerx + offset; + 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) + .linvel(0.0, -1000.0, 0.0) + .ccd_enabled(true) + .build(); + let handle = bodies.insert(rigid_body); + + let collider = match j % 5 { + 0 => ColliderBuilder::cuboid(rad, rad, rad), + 1 => ColliderBuilder::ball(rad), + // Rounded cylinders are much more efficient that cylinder, even if the + // rounding margin is small. + // 2 => ColliderBuilder::round_cylinder(rad, rad, rad / 10.0), + // 3 => ColliderBuilder::cone(rad, rad), + _ => ColliderBuilder::capsule_y(rad, rad), + }; + + colliders.insert(collider.build(), 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(100.0, 100.0, 100.0), Point3::origin()); +} + +fn main() { + let testbed = Testbed::from_builders(0, vec![("Boxes", init_world)]); + testbed.run() +} diff --git a/build/rapier2d-f64/Cargo.toml b/build/rapier2d-f64/Cargo.toml index c6bc8f3..8924c40 100644 --- a/build/rapier2d-f64/Cargo.toml +++ b/build/rapier2d-f64/Cargo.toml @@ -29,6 +29,10 @@ wasm-bindgen = [ "instant/wasm-bindgen" ] serde-serialize = [ "nalgebra/serde-serialize", "parry2d-f64/serde-serialize", "serde", "bit-vec/serde", "arrayvec/serde" ] enhanced-determinism = [ "simba/libm_force", "parry2d-f64/enhanced-determinism", "indexmap" ] +# Feature used for development and debugging only. +# Do not enable this unless you are working on the engine internals. +dev-remove-slow-accessors = [] + [lib] name = "rapier2d_f64" path = "../../src/lib.rs" diff --git a/build/rapier2d/Cargo.toml b/build/rapier2d/Cargo.toml index fa73f4e..d936bb6 100644 --- a/build/rapier2d/Cargo.toml +++ b/build/rapier2d/Cargo.toml @@ -29,6 +29,10 @@ wasm-bindgen = [ "instant/wasm-bindgen" ] serde-serialize = [ "nalgebra/serde-serialize", "parry2d/serde-serialize", "serde", "bit-vec/serde", "arrayvec/serde" ] enhanced-determinism = [ "simba/libm_force", "parry2d/enhanced-determinism", "indexmap" ] +# Feature used for development and debugging only. +# Do not enable this unless you are working on the engine internals. +dev-remove-slow-accessors = [] + [lib] name = "rapier2d" path = "../../src/lib.rs" diff --git a/build/rapier3d-f64/Cargo.toml b/build/rapier3d-f64/Cargo.toml index e201811..49c0a35 100644 --- a/build/rapier3d-f64/Cargo.toml +++ b/build/rapier3d-f64/Cargo.toml @@ -29,6 +29,10 @@ wasm-bindgen = [ "instant/wasm-bindgen" ] serde-serialize = [ "nalgebra/serde-serialize", "parry3d-f64/serde-serialize", "serde", "bit-vec/serde" ] enhanced-determinism = [ "simba/libm_force", "parry3d-f64/enhanced-determinism" ] +# Feature used for development and debugging only. +# Do not enable this unless you are working on the engine internals. +dev-remove-slow-accessors = [] + [lib] name = "rapier3d_f64" path = "../../src/lib.rs" diff --git a/build/rapier3d/Cargo.toml b/build/rapier3d/Cargo.toml index 0a83872..aec823d 100644 --- a/build/rapier3d/Cargo.toml +++ b/build/rapier3d/Cargo.toml @@ -29,6 +29,10 @@ wasm-bindgen = [ "instant/wasm-bindgen" ] serde-serialize = [ "nalgebra/serde-serialize", "parry3d/serde-serialize", "serde", "bit-vec/serde" ] enhanced-determinism = [ "simba/libm_force", "parry3d/enhanced-determinism" ] +# Feature used for development and debugging only. +# Do not enable this unless you are working on the engine internals. +dev-remove-slow-accessors = [] + [lib] name = "rapier3d" path = "../../src/lib.rs" diff --git a/examples2d/Cargo.toml b/examples2d/Cargo.toml index 48f5a65..a226f12 100644 --- a/examples2d/Cargo.toml +++ b/examples2d/Cargo.toml @@ -3,6 +3,7 @@ name = "rapier-examples-2d" version = "0.1.0" authors = [ "Sébastien Crozet <developer@crozet.re>" ] edition = "2018" +default-run = "all_examples2" [features] parallel = [ "rapier2d/parallel", "rapier_testbed2d/parallel" ] @@ -26,4 +27,4 @@ path = "../build/rapier2d" [[bin]] name = "all_examples2" -path = "./all_examples2.rs"
\ No newline at end of file +path = "./all_examples2.rs" diff --git a/examples2d/all_examples2.rs b/examples2d/all_examples2.rs index f4430aa..8f38ced 100644 --- a/examples2d/all_examples2.rs +++ b/examples2d/all_examples2.rs @@ -11,6 +11,7 @@ use rapier_testbed2d::Testbed; use std::cmp::Ordering; mod add_remove2; +mod ccd2; mod collision_groups2; mod convex_polygons2; mod damping2; @@ -60,6 +61,7 @@ pub fn main() { let mut builders: Vec<(_, fn(&mut Testbed))> = vec![ ("Add remove", add_remove2::init_world), + ("CCD", ccd2::init_world), ("Collision groups", collision_groups2::init_world), ("Convex polygons", convex_polygons2::init_world), ("Damping", damping2::init_world), diff --git a/examples2d/ccd2.rs b/examples2d/ccd2.rs new file mode 100644 index 0000000..852fad3 --- /dev/null +++ b/examples2d/ccd2.rs @@ -0,0 +1,124 @@ +use na::{Isometry2, Point2, Point3}; +use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet}; +use rapier2d::geometry::{ColliderBuilder, ColliderSet, SharedShape}; +use rapier_testbed2d::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 = 25.0; + let ground_thickness = 0.1; + + let rigid_body = RigidBodyBuilder::new_static().ccd_enabled(true).build(); + let ground_handle = bodies.insert(rigid_body); + + let collider = ColliderBuilder::cuboid(ground_size, ground_thickness).build(); + colliders.insert(collider, ground_handle, &mut bodies); + + let collider = ColliderBuilder::cuboid(ground_thickness, ground_size) + .translation(-3.0, 0.0) + .build(); + colliders.insert(collider, ground_handle, &mut bodies); + + let collider = ColliderBuilder::cuboid(ground_thickness, ground_size) + .translation(6.0, 0.0) + .build(); + colliders.insert(collider, ground_handle, &mut bodies); + + let collider = ColliderBuilder::cuboid(ground_thickness, ground_size) + .translation(2.5, 0.0) + .sensor(true) + .build(); + let sensor_handle = colliders.insert(collider, ground_handle, &mut bodies); + + /* + * Create the shapes + */ + let radx = 0.4; + let rady = 0.05; + + let delta1 = Isometry2::translation(0.0, radx - rady); + let delta2 = Isometry2::translation(-radx + rady, 0.0); + let delta3 = Isometry2::translation(radx - rady, 0.0); + + let mut compound_parts = Vec::new(); + let vertical = SharedShape::cuboid(rady, radx); + let horizontal = SharedShape::cuboid(radx, rady); + compound_parts.push((delta1, horizontal)); + compound_parts.push((delta2, vertical.clone())); + compound_parts.push((delta3, vertical)); + + let compound_shape = SharedShape::compound(compound_parts); + + let num = 6; + let shift = (radx + 0.01) * 2.0; + let centerx = shift * num as f32 / 2.0 - 0.5; + let centery = shift / 2.0 + 4.0; + + for i in 0usize..num { + for j in 0..num { + let x = i as f32 * shift - centerx; + let y = j as f32 * shift + centery; + + // Build the rigid body. + let rigid_body = RigidBodyBuilder::new_dynamic() + .translation(x, y) + .linvel(100.0, -10.0) + .ccd_enabled(true) + .build(); + let handle = bodies.insert(rigid_body); + + // for part in &compound_parts { + // let collider = ColliderBuilder::new(part.1.clone()) + // .position_wrt_parent(part.0) + // .build(); + // colliders.insert(collider, handle, &mut bodies); + // } + + let collider = ColliderBuilder::new(compound_shape.clone()).build(); + // let collider = ColliderBuilder::cuboid(radx, rady).build(); + colliders.insert(collider, handle, &mut bodies); + } + } + + // Callback that will be executed on the main loop to handle proximities. + testbed.add_callback(move |_, mut graphics, physics, events, _| { + while let Ok(prox) = events.intersection_events.try_recv() { + let color = if prox.intersecting { + Point3::new(1.0, 1.0, 0.0) + } else { + Point3::new(0.5, 0.5, 1.0) + }; + + let parent_handle1 = physics.colliders.get(prox.collider1).unwrap().parent(); + let parent_handle2 = physics.colliders.get(prox.collider2).unwrap().parent(); + if let Some(graphics) = &mut graphics { + if parent_handle1 != ground_handle && prox.collider1 != sensor_handle { + graphics.set_body_color(parent_handle1, color); + } + if parent_handle2 != ground_handle && prox.collider2 != sensor_handle { + graphics.set_body_color(parent_handle2, color); + } + } + } + }); + + /* + * Set up the testbed. + */ + testbed.set_world(bodies, colliders, joints); + testbed.look_at(Point2::new(0.0, 2.5), 20.0); +} + +fn main() { + let testbed = Testbed::from_builders(0, vec![("Balls", init_world)]); + testbed.run() +} diff --git a/examples3d/Cargo.toml b/examples3d/Cargo.toml index b27b97c..1f84857 100644 --- a/examples3d/Cargo.toml +++ b/examples3d/Cargo.toml @@ -3,6 +3,7 @@ name = "rapier-examples-3d" version = "0.1.0" authors = [ "Sébastien Crozet <developer@crozet.re>" ] edition = "2018" +default-run = "all_examples3" [features] parallel = [ "rapier3d/parallel", "rapier_testbed3d/parallel" ] diff --git a/examples3d/all_examples3.rs b/examples3d/all_examples3.rs index 724aa45..8122583 100644 --- a/examples3d/all_examples3.rs +++ b/examples3d/all_examples3.rs @@ -10,12 +10,14 @@ use inflector::Inflector; use rapier_testbed3d::Testbed; use std::cmp::Ordering; +mod ccd3; mod collision_groups3; mod compound3; mod convex_decomposition3; mod convex_polyhedron3; mod damping3; mod debug_add_remove_collider3; +mod debug_big_colliders3; mod debug_boxes3; mod debug_cylinder3; mod debug_dynamic_collider_add3; @@ -76,6 +78,7 @@ pub fn main() { let mut builders: Vec<(_, fn(&mut Testbed))> = vec