From 1a84bf2af34176508bdda8d0f2ad2e46dc5c4df9 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Sun, 16 May 2021 17:49:20 +0200 Subject: Replace Kiss3d by Bevy for the testbed renderer. --- Cargo.toml | 1 + assets/FiraSans-Bold.ttf | Bin 0 -> 438028 bytes benchmarks3d/all_benchmarks3.rs | 6 +- benchmarks3d/balls3.rs | 5 - benchmarks3d/boxes3.rs | 5 - benchmarks3d/capsules3.rs | 5 - benchmarks3d/ccd3.rs | 5 - benchmarks3d/compound3.rs | 5 - benchmarks3d/convex_polyhedron3.rs | 5 - benchmarks3d/heightfield3.rs | 5 - benchmarks3d/joint_ball3.rs | 5 - benchmarks3d/joint_fixed3.rs | 5 - benchmarks3d/joint_prismatic3.rs | 5 - benchmarks3d/joint_revolute3.rs | 5 - benchmarks3d/keva3.rs | 9 +- benchmarks3d/pyramid3.rs | 5 - benchmarks3d/stacks3.rs | 5 - benchmarks3d/trimesh3.rs | 5 - build/rapier_testbed2d/Cargo.toml | 13 +- build/rapier_testbed3d/Cargo.toml | 15 +- examples2d/add_remove2.rs | 15 +- examples2d/all_examples2.rs | 4 +- examples2d/ccd2.rs | 7 +- examples2d/collision_groups2.rs | 11 +- examples2d/convex_polygons2.rs | 5 - examples2d/debug_box_ball2.rs | 8 +- examples2d/heightfield2.rs | 5 - examples2d/joints2.rs | 5 - examples2d/locked_rotations2.rs | 5 - examples2d/one_way_platforms2.rs | 11 +- examples2d/platform2.rs | 7 +- examples2d/polyline2.rs | 5 - examples2d/pyramid2.rs | 5 - examples2d/restitution2.rs | 5 - examples2d/sensor2.rs | 11 +- examples2d/trimesh2.rs | 5 - examples3d/Cargo.toml | 8 +- examples3d/all_examples3.rs | 5 +- examples3d/all_examples3_wasm.rs | 136 ++ examples3d/ccd3.rs | 19 +- examples3d/collision_groups3.rs | 11 +- examples3d/compound3.rs | 5 - examples3d/convex_decomposition3.rs | 67 +- examples3d/convex_polyhedron3.rs | 5 - examples3d/debug_add_remove_collider3.rs | 14 +- examples3d/debug_big_colliders3.rs | 5 - examples3d/debug_boxes3.rs | 5 - examples3d/debug_cylinder3.rs | 5 - examples3d/debug_dynamic_collider_add3.rs | 19 +- examples3d/debug_friction3.rs | 7 +- examples3d/debug_infinite_fall3.rs | 5 - examples3d/debug_prismatic3.rs | 5 - examples3d/debug_rollback3.rs | 7 +- examples3d/debug_shape_modification3.rs | 7 +- examples3d/debug_triangle3.rs | 5 - examples3d/debug_trimesh3.rs | 18 +- examples3d/domino3.rs | 7 +- examples3d/fountain3.rs | 15 +- examples3d/heightfield3.rs | 5 - examples3d/joints3.rs | 5 - examples3d/keva3.rs | 9 +- examples3d/locked_rotations3.rs | 5 - examples3d/one_way_platforms3.rs | 11 +- examples3d/platform3.rs | 7 +- examples3d/primitives3.rs | 5 - examples3d/restitution3.rs | 5 - examples3d/sensor3.rs | 11 +- examples3d/trimesh3.rs | 5 - src_testbed/camera.rs | 94 ++ src_testbed/engine.rs | 712 ----------- src_testbed/graphics.rs | 400 ++++++ src_testbed/harness/mod.rs | 59 +- src_testbed/lib.rs | 9 +- src_testbed/objects/ball.rs | 76 -- src_testbed/objects/box_node.rs | 76 -- src_testbed/objects/capsule.rs | 77 -- src_testbed/objects/cone.rs | 77 -- src_testbed/objects/convex.rs | 96 -- src_testbed/objects/cylinder.rs | 77 -- src_testbed/objects/heightfield.rs | 128 -- src_testbed/objects/mesh.rs | 111 -- src_testbed/objects/mod.rs | 12 - src_testbed/objects/node.rs | 547 +++++--- src_testbed/objects/plane.rs | 132 -- src_testbed/objects/polyline.rs | 67 - src_testbed/plugin.rs | 12 +- src_testbed/testbed.rs | 1928 +++++++++++++---------------- src_testbed/ui.rs | 719 ++++------- 88 files changed, 2236 insertions(+), 3849 deletions(-) create mode 100644 assets/FiraSans-Bold.ttf create mode 100644 examples3d/all_examples3_wasm.rs create mode 100644 src_testbed/camera.rs delete mode 100644 src_testbed/engine.rs create mode 100644 src_testbed/graphics.rs delete mode 100644 src_testbed/objects/ball.rs delete mode 100644 src_testbed/objects/box_node.rs delete mode 100644 src_testbed/objects/capsule.rs delete mode 100644 src_testbed/objects/cone.rs delete mode 100644 src_testbed/objects/convex.rs delete mode 100644 src_testbed/objects/cylinder.rs delete mode 100644 src_testbed/objects/heightfield.rs delete mode 100644 src_testbed/objects/mesh.rs delete mode 100644 src_testbed/objects/plane.rs delete mode 100644 src_testbed/objects/polyline.rs diff --git a/Cargo.toml b/Cargo.toml index de3add6..7021ade 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,7 @@ [workspace] members = [ "build/rapier2d", "build/rapier2d-f64", "build/rapier_testbed2d", "examples2d", "benchmarks2d", "build/rapier3d", "build/rapier3d-f64", "build/rapier_testbed3d", "examples3d", "benchmarks3d" ] +resolver = "2" [patch.crates-io] #wrapped2d = { git = "https://github.com/Bastacyclop/rust_box2d.git" } diff --git a/assets/FiraSans-Bold.ttf b/assets/FiraSans-Bold.ttf new file mode 100644 index 0000000..95e1660 Binary files /dev/null and b/assets/FiraSans-Bold.ttf differ diff --git a/benchmarks3d/all_benchmarks3.rs b/benchmarks3d/all_benchmarks3.rs index 38d71cd..d62c72c 100644 --- a/benchmarks3d/all_benchmarks3.rs +++ b/benchmarks3d/all_benchmarks3.rs @@ -7,7 +7,7 @@ use wasm_bindgen::prelude::*; use inflector::Inflector; -use rapier_testbed3d::Testbed; +use rapier_testbed3d::{Testbed, TestbedApp}; use std::cmp::Ordering; mod balls3; @@ -80,12 +80,12 @@ pub fn main() { .iter() .position(|builder| builder.0.to_camel_case().as_str() == demo.as_str()) { - Testbed::from_builders(0, vec![builders[i]]).run() + TestbedApp::from_builders(0, vec![builders[i]]).run() } else { eprintln!("Invalid example to run provided: '{}'", demo); } } - Command::RunAll => Testbed::from_builders(0, builders).run(), + Command::RunAll => TestbedApp::from_builders(0, builders).run(), Command::List => { for builder in &builders { println!("{}", builder.0.to_camel_case()) diff --git a/benchmarks3d/balls3.rs b/benchmarks3d/balls3.rs index 1f0f1df..492aeac 100644 --- a/benchmarks3d/balls3.rs +++ b/benchmarks3d/balls3.rs @@ -51,8 +51,3 @@ pub fn init_world(testbed: &mut 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![("Balls", init_world)]); - testbed.run() -} diff --git a/benchmarks3d/boxes3.rs b/benchmarks3d/boxes3.rs index 0eb31f5..86213af 100644 --- a/benchmarks3d/boxes3.rs +++ b/benchmarks3d/boxes3.rs @@ -61,8 +61,3 @@ pub fn init_world(testbed: &mut 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/benchmarks3d/capsules3.rs b/benchmarks3d/capsules3.rs index 0e8ad94..edd6d57 100644 --- a/benchmarks3d/capsules3.rs +++ b/benchmarks3d/capsules3.rs @@ -62,8 +62,3 @@ pub fn init_world(testbed: &mut 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/benchmarks3d/ccd3.rs b/benchmarks3d/ccd3.rs index f1831e7..a496648 100644 --- a/benchmarks3d/ccd3.rs +++ b/benchmarks3d/ccd3.rs @@ -78,8 +78,3 @@ pub fn init_world(testbed: &mut 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/benchmarks3d/compound3.rs b/benchmarks3d/compound3.rs index a8a9939..3f82ca0 100644 --- a/benchmarks3d/compound3.rs +++ b/benchmarks3d/compound3.rs @@ -69,8 +69,3 @@ pub fn init_world(testbed: &mut 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/benchmarks3d/convex_polyhedron3.rs b/benchmarks3d/convex_polyhedron3.rs index 30d77ac..0e14782 100644 --- a/benchmarks3d/convex_polyhedron3.rs +++ b/benchmarks3d/convex_polyhedron3.rs @@ -76,8 +76,3 @@ pub fn init_world(testbed: &mut 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/benchmarks3d/heightfield3.rs b/benchmarks3d/heightfield3.rs index fc64856..062e7c5 100644 --- a/benchmarks3d/heightfield3.rs +++ b/benchmarks3d/heightfield3.rs @@ -75,8 +75,3 @@ pub fn init_world(testbed: &mut 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/benchmarks3d/joint_ball3.rs b/benchmarks3d/joint_ball3.rs index 12b62a9..e7b3e3d 100644 --- a/benchmarks3d/joint_ball3.rs +++ b/benchmarks3d/joint_ball3.rs @@ -63,8 +63,3 @@ pub fn init_world(testbed: &mut Testbed) { Point3::new(54.0, -38.0, 29.0), ); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Joints", init_world)]); - testbed.run() -} diff --git a/benchmarks3d/joint_fixed3.rs b/benchmarks3d/joint_fixed3.rs index 9839e38..0475258 100644 --- a/benchmarks3d/joint_fixed3.rs +++ b/benchmarks3d/joint_fixed3.rs @@ -85,8 +85,3 @@ pub fn init_world(testbed: &mut Testbed) { Point3::new(46.0, 12.0, 23.0), ); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Joints", init_world)]); - testbed.run() -} diff --git a/benchmarks3d/joint_prismatic3.rs b/benchmarks3d/joint_prismatic3.rs index 3267ada..afc18fb 100644 --- a/benchmarks3d/joint_prismatic3.rs +++ b/benchmarks3d/joint_prismatic3.rs @@ -74,8 +74,3 @@ pub fn init_world(testbed: &mut Testbed) { Point3::new(101.0, 4.0, -3.0), ); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Joints", init_world)]); - testbed.run() -} diff --git a/benchmarks3d/joint_revolute3.rs b/benchmarks3d/joint_revolute3.rs index 040fc3e..0c647a6 100644 --- a/benchmarks3d/joint_revolute3.rs +++ b/benchmarks3d/joint_revolute3.rs @@ -82,8 +82,3 @@ pub fn init_world(testbed: &mut Testbed) { Point3::new(134.0, 83.0, -116.0), ); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Joints", init_world)]); - testbed.run() -} diff --git a/benchmarks3d/keva3.rs b/benchmarks3d/keva3.rs index 6862f25..9e6807a 100644 --- a/benchmarks3d/keva3.rs +++ b/benchmarks3d/keva3.rs @@ -51,7 +51,7 @@ pub fn build_block( let collider = ColliderBuilder::cuboid(dim.x, dim.y, dim.z).build(); colliders.insert(collider, handle, bodies); - testbed.set_body_color(handle, color0); + testbed.set_initial_body_color(handle, color0); std::mem::swap(&mut color0, &mut color1); } } @@ -73,7 +73,7 @@ pub fn build_block( let handle = bodies.insert(rigid_body); let collider = ColliderBuilder::cuboid(dim.x, dim.y, dim.z).build(); colliders.insert(collider, handle, bodies); - testbed.set_body_color(handle, color0); + testbed.set_initial_body_color(handle, color0); std::mem::swap(&mut color0, &mut color1); } } @@ -137,8 +137,3 @@ pub fn init_world(testbed: &mut 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/benchmarks3d/pyramid3.rs b/benchmarks3d/pyramid3.rs index 5b6f34e..3b31eac 100644 --- a/benchmarks3d/pyramid3.rs +++ b/benchmarks3d/pyramid3.rs @@ -76,8 +76,3 @@ pub fn init_world(testbed: &mut 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/benchmarks3d/stacks3.rs b/benchmarks3d/stacks3.rs index 435dcb5..31dff0a 100644 --- a/benchmarks3d/stacks3.rs +++ b/benchmarks3d/stacks3.rs @@ -184,8 +184,3 @@ pub fn init_world(testbed: &mut 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/benchmarks3d/trimesh3.rs b/benchmarks3d/trimesh3.rs index e0701f1..0501d6f 100644 --- a/benchmarks3d/trimesh3.rs +++ b/benchmarks3d/trimesh3.rs @@ -80,8 +80,3 @@ pub fn init_world(testbed: &mut 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/rapier_testbed2d/Cargo.toml b/build/rapier_testbed2d/Cargo.toml index eb713aa..b501a1f 100644 --- a/build/rapier_testbed2d/Cargo.toml +++ b/build/rapier_testbed2d/Cargo.toml @@ -27,7 +27,6 @@ other-backends = [ "wrapped2d", "nphysics2d" ] [dependencies] nalgebra = { version = "0.26", features = [ "rand" ] } -kiss3d = { version = "0.31", features = [ "conrod" ] } rand = "0.8" rand_pcg = "0.3" instant = { version = "0.1", features = [ "web-sys", "now" ]} @@ -42,6 +41,18 @@ bincode = "1" Inflector = "0.11" md5 = "0.7" +bevy_egui = "0.4" +bevy-orbit-controls = "2" + +# Dependencies for native only. +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +bevy = {version = "0.5", default-features = false, features = ["bevy_wgpu", "bevy_winit", "render", "x11"]} + +# Dependencies for WASM only. +[target.'cfg(target_arch = "wasm32")'.dependencies] +bevy = {version = "0.5", default-features = false, features = ["bevy_winit", "render"]} +bevy_webgl2 = "0.5" + [dependencies.rapier2d] path = "../rapier2d" version = "0.8" diff --git a/build/rapier_testbed3d/Cargo.toml b/build/rapier_testbed3d/Cargo.toml index ea10307..0038fa8 100644 --- a/build/rapier_testbed3d/Cargo.toml +++ b/build/rapier_testbed3d/Cargo.toml @@ -26,7 +26,6 @@ other-backends = [ "physx", "physx-sys", "glam", "nphysics3d" ] [dependencies] nalgebra = { version = "0.26", features = [ "rand" ] } -kiss3d = { version = "0.31", features = [ "conrod" ] } rand = "0.8" rand_pcg = "0.3" instant = { version = "0.1", features = [ "web-sys", "now" ]} @@ -44,7 +43,19 @@ md5 = "0.7" Inflector = "0.11" serde = { version = "1", features = [ "derive" ] } +bevy_egui = "0.4" +bevy-orbit-controls = "2" + +# Dependencies for native only. +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +bevy = {version = "0.5", default-features = false, features = ["bevy_wgpu", "bevy_winit", "render", "x11"]} + +# Dependencies for WASM only. +[target.'cfg(target_arch = "wasm32")'.dependencies] +bevy = {version = "0.5", default-features = false, features = ["bevy_winit", "render"]} +bevy_webgl2 = "0.5" + [dependencies.rapier3d] path = "../rapier3d" version = "0.8" -features = [ "serde-serialize" ] +features = [ "serde-serialize" ] \ No newline at end of file diff --git a/examples2d/add_remove2.rs b/examples2d/add_remove2.rs index 826d5c9..9f9f65a 100644 --- a/examples2d/add_remove2.rs +++ b/examples2d/add_remove2.rs @@ -10,7 +10,7 @@ pub fn init_world(testbed: &mut Testbed) { let rad = 0.5; // Callback that will be executed on the main loop to handle proximities. - testbed.add_callback(move |mut window, mut graphics, physics, _, _| { + testbed.add_callback(move |mut graphics, physics, _, _| { let rigid_body = RigidBodyBuilder::new_dynamic() .translation(0.0, 10.0) .build(); @@ -20,8 +20,8 @@ pub fn init_world(testbed: &mut Testbed) { .colliders .insert(collider, handle, &mut physics.bodies); - if let (Some(graphics), Some(window)) = (&mut graphics, &mut window) { - graphics.add(*window, handle, &physics.bodies, &physics.colliders); + if let Some(graphics) = &mut graphics { + graphics.add_body(handle, &physics.bodies, &physics.colliders); } let to_remove: Vec<_> = physics @@ -38,8 +38,8 @@ pub fn init_world(testbed: &mut Testbed) { &mut physics.joints, ); - if let (Some(graphics), Some(window)) = (&mut graphics, &mut window) { - graphics.remove_body_nodes(*window, handle); + if let Some(graphics) = &mut graphics { + graphics.remove_body(handle); } } }); @@ -50,8 +50,3 @@ pub fn init_world(testbed: &mut Testbed) { testbed.set_world(bodies, colliders, joints); testbed.look_at(Point2::new(0.0, 0.0), 20.0); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Add-remove", init_world)]); - testbed.run() -} diff --git a/examples2d/all_examples2.rs b/examples2d/all_examples2.rs index 8f38ced..1b45eac 100644 --- a/examples2d/all_examples2.rs +++ b/examples2d/all_examples2.rs @@ -7,7 +7,7 @@ use wasm_bindgen::prelude::*; use inflector::Inflector; -use rapier_testbed2d::Testbed; +use rapier_testbed2d::{Testbed, TestbedApp}; use std::cmp::Ordering; mod add_remove2; @@ -89,7 +89,7 @@ pub fn main() { .iter() .position(|builder| builder.0.to_camel_case().as_str() == demo.as_str()) .unwrap_or(0); - let testbed = Testbed::from_builders(i, builders); + let testbed = TestbedApp::from_builders(i, builders); testbed.run() } diff --git a/examples2d/ccd2.rs b/examples2d/ccd2.rs index 852fad3..18a6bfe 100644 --- a/examples2d/ccd2.rs +++ b/examples2d/ccd2.rs @@ -90,7 +90,7 @@ pub fn init_world(testbed: &mut Testbed) { } // Callback that will be executed on the main loop to handle proximities. - testbed.add_callback(move |_, mut graphics, physics, events, _| { + 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) @@ -117,8 +117,3 @@ pub fn init_world(testbed: &mut 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/examples2d/collision_groups2.rs b/examples2d/collision_groups2.rs index 9fd9f0b..08b73fb 100644 --- a/examples2d/collision_groups2.rs +++ b/examples2d/collision_groups2.rs @@ -39,7 +39,7 @@ pub fn init_world(testbed: &mut Testbed) { .build(); let green_collider_handle = colliders.insert(green_floor, floor_handle, &mut bodies); - testbed.set_collider_initial_color(green_collider_handle, Point3::new(0.0, 1.0, 0.0)); + testbed.set_initial_collider_color(green_collider_handle, Point3::new(0.0, 1.0, 0.0)); /* * A blue floor that will collide with the BLUE group only. @@ -50,7 +50,7 @@ pub fn init_world(testbed: &mut Testbed) { .build(); let blue_collider_handle = colliders.insert(blue_floor, floor_handle, &mut bodies); - testbed.set_collider_initial_color(blue_collider_handle, Point3::new(0.0, 0.0, 1.0)); + testbed.set_initial_collider_color(blue_collider_handle, Point3::new(0.0, 0.0, 1.0)); /* * Create the cubes @@ -81,7 +81,7 @@ pub fn init_world(testbed: &mut Testbed) { .build(); colliders.insert(collider, handle, &mut bodies); - testbed.set_body_color(handle, color); + testbed.set_initial_body_color(handle, color); } } @@ -91,8 +91,3 @@ pub fn init_world(testbed: &mut Testbed) { testbed.set_world(bodies, colliders, joints); testbed.look_at(Point2::new(0.0, 1.0), 100.0); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Boxes", init_world)]); - testbed.run() -} diff --git a/examples2d/convex_polygons2.rs b/examples2d/convex_polygons2.rs index d936fb6..0e4fb0c 100644 --- a/examples2d/convex_polygons2.rs +++ b/examples2d/convex_polygons2.rs @@ -79,8 +79,3 @@ pub fn init_world(testbed: &mut Testbed) { testbed.set_world(bodies, colliders, joints); testbed.look_at(Point2::new(0.0, 50.0), 10.0); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Balls", init_world)]); - testbed.run() -} diff --git a/examples2d/debug_box_ball2.rs b/examples2d/debug_box_ball2.rs index 62933ff..aad72ae 100644 --- a/examples2d/debug_box_ball2.rs +++ b/examples2d/debug_box_ball2.rs @@ -1,3 +1,4 @@ +use na::Point2; use rapier2d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet}; use rapier2d::geometry::{ColliderBuilder, ColliderSet}; use rapier_testbed2d::Testbed; @@ -35,10 +36,5 @@ pub fn init_world(testbed: &mut Testbed) { * Set up the testbed. */ testbed.set_world(bodies, colliders, joints); - // testbed.look_at(Point2::new(10.0, 10.0, 10.0), Point2::origin()); -} - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Boxes", init_world)]); - testbed.run() + testbed.look_at(Point2::new(0.0, 0.0), 50.0); } diff --git a/examples2d/heightfield2.rs b/examples2d/heightfield2.rs index f5ddff9..a834a2c 100644 --- a/examples2d/heightfield2.rs +++ b/examples2d/heightfield2.rs @@ -65,8 +65,3 @@ pub fn init_world(testbed: &mut Testbed) { testbed.set_world(bodies, colliders, joints); testbed.look_at(Point2::new(0.0, 0.0), 10.0); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Heightfield", init_world)]); - testbed.run() -} diff --git a/examples2d/joints2.rs b/examples2d/joints2.rs index 4d7d060..ff5c663 100644 --- a/examples2d/joints2.rs +++ b/examples2d/joints2.rs @@ -68,8 +68,3 @@ pub fn init_world(testbed: &mut Testbed) { testbed.set_world(bodies, colliders, joints); testbed.look_at(Point2::new(numk as f32 * rad, numi as f32 * -rad), 20.0); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Joints", init_world)]); - testbed.run() -} diff --git a/examples2d/locked_rotations2.rs b/examples2d/locked_rotations2.rs index f3d7fc2..03fb2e7 100644 --- a/examples2d/locked_rotations2.rs +++ b/examples2d/locked_rotations2.rs @@ -56,8 +56,3 @@ pub fn init_world(testbed: &mut Testbed) { testbed.set_world(bodies, colliders, joints); testbed.look_at(Point2::new(0.0, 0.0), 40.0); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Boxes", init_world)]); - testbed.run() -} diff --git a/examples2d/one_way_platforms2.rs b/examples2d/one_way_platforms2.rs index 90607f7..19b9968 100644 --- a/examples2d/one_way_platforms2.rs +++ b/examples2d/one_way_platforms2.rs @@ -100,7 +100,7 @@ pub fn init_world(testbed: &mut Testbed) { * Spawn cubes at regular intervals and apply a custom gravity * depending on their position. */ - testbed.add_callback(move |mut window, mut graphics, physics, _, run_state| { + testbed.add_callback(move |graphics, physics, _, run_state| { if run_state.timestep_id % 50 == 0 && physics.bodies.len() <= 7 { // Spawn a new cube. let collider = ColliderBuilder::cuboid(1.5, 2.0).build(); @@ -112,8 +112,8 @@ pub fn init_world(testbed: &mut Testbed) { .colliders .insert(collider, handle, &mut physics.bodies); - if let (Some(graphics), Some(window)) = (&mut graphics, &mut window) { - graphics.add(window, handle, &physics.bodies, &physics.colliders); + if let Some(graphics) = graphics { + graphics.add_body(handle, &physics.bodies, &physics.colliders); } } @@ -139,8 +139,3 @@ pub fn init_world(testbed: &mut Testbed) { ); testbed.look_at(Point2::new(0.0, 0.0), 20.0); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Boxes", init_world)]); - testbed.run() -} diff --git a/examples2d/platform2.rs b/examples2d/platform2.rs index afd4d64..7542cd6 100644 --- a/examples2d/platform2.rs +++ b/examples2d/platform2.rs @@ -60,7 +60,7 @@ pub fn init_world(testbed: &mut Testbed) { /* * Setup a callback to control the platform. */ - testbed.add_callback(move |_, _, physics, _, run_state| { + testbed.add_callback(move |_, physics, _, run_state| { let platform = physics.bodies.get_mut(platform_handle).unwrap(); let mut next_pos = *platform.position(); @@ -84,8 +84,3 @@ pub fn init_world(testbed: &mut Testbed) { testbed.set_world(bodies, colliders, joints); testbed.look_at(Point2::new(0.0, 1.0), 40.0); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Kinematic body", init_world)]); - testbed.run() -} diff --git a/examples2d/polyline2.rs b/examples2d/polyline2.rs index 3aa4a47..0b3be0c 100644 --- a/examples2d/polyline2.rs +++ b/examples2d/polyline2.rs @@ -67,8 +67,3 @@ pub fn init_world(testbed: &mut Testbed) { testbed.set_world(bodies, colliders, joints); testbed.look_at(Point2::new(0.0, 0.0), 10.0); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Heightfield", init_world)]); - testbed.run() -} diff --git a/examples2d/pyramid2.rs b/examples2d/pyramid2.rs index 689e9c0..dfa64c9 100644 --- a/examples2d/pyramid2.rs +++ b/examples2d/pyramid2.rs @@ -53,8 +53,3 @@ pub fn init_world(testbed: &mut 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/examples2d/restitution2.rs b/examples2d/restitution2.rs index fc97456..025a9cd 100644 --- a/examples2d/restitution2.rs +++ b/examples2d/restitution2.rs @@ -49,8 +49,3 @@ pub fn init_world(testbed: &mut Testbed) { testbed.set_world(bodies, colliders, joints); testbed.look_at(Point2::new(0.0, 1.0), 25.0); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Boxes", init_world)]); - testbed.run() -} diff --git a/examples2d/sensor2.rs b/examples2d/sensor2.rs index e53abe3..a651f64 100644 --- a/examples2d/sensor2.rs +++ b/examples2d/sensor2.rs @@ -43,7 +43,7 @@ pub fn init_world(testbed: &mut Testbed) { let collider = ColliderBuilder::cuboid(rad, rad).build(); colliders.insert(collider, handle, &mut bodies); - testbed.set_body_color(handle, Point3::new(0.5, 0.5, 1.0)); + testbed.set_initial_body_color(handle, Point3::new(0.5, 0.5, 1.0)); } /* @@ -66,10 +66,10 @@ pub fn init_world(testbed: &mut Testbed) { let sensor_collider = ColliderBuilder::ball(rad * 5.0).sensor(true).build(); colliders.insert(sensor_collider, sensor_handle, &mut bodies); - testbed.set_body_color(sensor_handle, Point3::new(0.5, 1.0, 1.0)); + testbed.set_initial_body_color(sensor_handle, Point3::new(0.5, 1.0, 1.0)); // Callback that will be executed on the main loop to handle proximities. - testbed.add_callback(move |_, mut graphics, physics, events, _| { + 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) @@ -96,8 +96,3 @@ pub fn init_world(testbed: &mut Testbed) { testbed.set_world(bodies, colliders, joints); testbed.look_at(Point2::new(0.0, 1.0), 100.0); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Sensor", init_world)]); - testbed.run() -} diff --git a/examples2d/trimesh2.rs b/examples2d/trimesh2.rs index baed184..adc8b6b 100644 --- a/examples2d/trimesh2.rs +++ b/examples2d/trimesh2.rs @@ -109,11 +109,6 @@ pub fn init_world(testbed: &mut Testbed) { testbed.look_at(Point2::new(0.0, 20.0), 17.0); } -fn main() { - let testbed = Testbed::from_builders(0, vec![("Balls", init_world)]); - testbed.run() -} - const RAPIER_SVG_STR: &'static str = r#" diff --git a/examples3d/Cargo.toml b/examples3d/Cargo.toml index b7c71e0..37c641f 100644 --- a/examples3d/Cargo.toml +++ b/examples3d/Cargo.toml @@ -17,7 +17,8 @@ rand = "0.8" getrandom = { version = "0.2", features = [ "js" ] } Inflector = "0.11" nalgebra = "0.26" -kiss3d = "0.31" +wasm-bindgen = "0.2" +obj-rs = { version = "0.6", default-features = false } [dependencies.rapier_testbed3d] path = "../build/rapier_testbed3d" @@ -32,3 +33,8 @@ path = "./all_examples3.rs" [[bin]] name = "harness_capsules3" path = "./harness_capsules3.rs" + +#[lib] +#crate-type = ["cdylib", "rlib"] +#path = "./all_examples3_wasm.rs" + diff --git a/examples3d/all_examples3.rs b/examples3d/all_examples3.rs index 8031814..f587da3 100644 --- a/examples3d/all_examples3.rs +++ b/examples3d/all_examples3.rs @@ -7,7 +7,7 @@ use wasm_bindgen::prelude::*; use inflector::Inflector; -use rapier_testbed3d::Testbed; +use rapier_testbed3d::{Testbed, TestbedApp}; use std::cmp::Ordering; mod ccd3; @@ -131,7 +131,6 @@ pub fn main() { .position(|builder| builder.0.to_camel_case().as_str() == demo.as_str()) .unwrap_or(0); - let testbed = Testbed::from_builders(i, builders); - + let testbed = TestbedApp::from_builders(i, builders); testbed.run() } diff --git a/examples3d/all_examples3_wasm.rs b/examples3d/all_examples3_wasm.rs new file mode 100644 index 0000000..f587da3 --- /dev/null +++ b/examples3d/all_examples3_wasm.rs @@ -0,0 +1,136 @@ +#![allow(dead_code)] + +extern crate nalgebra as na; + +#[cfg(target_arch = "wasm32")] +use wasm_bindgen::prelude::*; + +use inflector::Inflector; + +use rapier_testbed3d::{Testbed, TestbedApp}; +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; +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; +mod fountain3; +mod heightfield3; +mod joints3; +mod keva3; +mod locked_rotations3; +mod one_way_platforms3; +mod platform3; +mod primitives3; +mod restitution3; +mod sensor3; +mod trimesh3; + +fn demo_name_from_command_line() -> Option { + let mut args = std::env::args(); + + while let Some(arg) = args.next() { + if &arg[..] == "--example" { + return args.next(); + } + } + + None +} + +#[cfg(any(target_arch = "wasm32", target_arch = "asmjs"))] +fn demo_name_from_url() -> Option { + None + // let window = stdweb::web::window(); + // let hash = window.location()?.search().ok()?; + // if hash.len() > 0 { + // Some(hash[1..].to_string()) + // } else { + // None + // } +} + +#[cfg(not(any(target_arch = "wasm32", target_arch = "asmjs")))] +fn demo_name_from_url() -> Option { + None +} + +#[cfg_attr(target_arch = "wasm32", wasm_bindgen(start))] +pub fn main() { + let demo = demo_name_from_command_line() + .or_else(|| demo_name_from_url()) + .unwrap_or(String::new()) + .to_camel_case(); + + let mut builders: Vec<(_, fn(&mut Testbed))> = vec![ + ("Fountain", fountain3::init_world), + ("Primitives", primitives3::init_world), + ("CCD", ccd3::init_world), + ("Collision groups", collision_groups3::init_world), + ("Compound", compound3::init_world), + ("Convex decomposition", convex_decomposition3::init_world), + ("Convex polyhedron", convex_polyhedron3::init_world), + ("Damping", damping3::init_world), + ("Domino", domino3::init_world), + ("Heightfield", heightfield3::init_world), + ("Joints", joints3::init_world), + ("Locked rotations", locked_rotations3::init_world), + ("One-way platforms", one_way_platforms3::init_world), + ("Platform", platform3::init_world), + ("Restitution", restitution3::init_world), + ("Sensor", sensor3::init_world), + ("TriMesh", trimesh3::init_world), + ("Keva tower", keva3::init_world), + ( + "(Debug) add/rm collider", + debug_add_remove_collider3::init_world, + ), + ("(Debug) big colliders", debug_big_colliders3::init_world), + ("(Debug) boxes", debug_boxes3::init_world), + ( + "(Debug) dyn. coll. add", + debug_dynamic_collider_add3::init_world, + ), + ("(Debug) friction", debug_friction3::init_world), + ("(Debug) triangle", debug_triangle3::init_world), + ("(Debug) trimesh", debug_trimesh3::init_world), + ("(Debug) cylinder", debug_cylinder3::init_world), + ("(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. + builders.sort_by(|a, b| match (a.0.starts_with("("), b.0.starts_with("(")) { + (true, true) | (false, false) => a.0.cmp(b.0), + (true, false) => Ordering::Greater, + (false, true) => Ordering::Less, + }); + + let i = builders + .iter() + .position(|builder| builder.0.to_camel_case().as_str() == demo.as_str()) + .unwrap_or(0); + + let testbed = TestbedApp::from_builders(i, builders); + testbed.run() +} diff --git a/examples3d/ccd3.rs b/examples3d/ccd3.rs index f6b558d..e5dee33 100644 --- a/examples3d/ccd3.rs +++ b/examples3d/ccd3.rs @@ -30,9 +30,15 @@ fn create_wall( colliders.insert(collider, handle, bodies); k += 1; if k % 2 == 0 { - testbed.set_body_color(handle, Point3::new(255. / 255., 131. / 255., 244.0 / 255.)); + testbed.set_initial_body_color( + handle, + Point3::new(255. / 255., 131. / 255., 244.0 / 255.), + ); } else { - testbed.set_body_color(handle, Point3::new(131. / 255., 255. / 255., 244.0 / 255.)); + testbed.set_initial_body_color( + handle, + Point3::new(131. / 255., 255. / 255., 244.0 / 255.), + ); } } } @@ -114,10 +120,10 @@ pub fn init_world(testbed: &mut Testbed) { .build(); let handle = bodies.insert(rigid_body); colliders.insert(collider.clone(), handle, &mut bodies); - testbed.set_body_color(handle, Point3::new(0.2, 0.2, 1.0)); + testbed.set_initial_body_color(handle, Point3::new(0.2, 0.2, 1.0)); // Callback that will be executed on the main loop to handle proximities. - testbed.add_callback(move |_, mut graphics, physics, events, _| { + 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) @@ -145,8 +151,3 @@ pub fn init_world(testbed: &mut 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/examples3d/collision_groups3.rs b/examples3d/collision_groups3.rs index 625bc50..a79a4bc 100644 --- a/examples3d/collision_groups3.rs +++ b/examples3d/collision_groups3.rs @@ -39,7 +39,7 @@ pub fn init_world(testbed: &mut Testbed) { .build(); let green_collider_handle = colliders.insert(green_floor, floor_handle, &mut bodies); - testbed.set_collider_initial_color(green_collider_handle, Point3::new(0.0, 1.0, 0.0)); + testbed.set_initial_collider_color(green_collider_handle, Point3::new(0.0, 1.0, 0.0)); /* * A blue floor that will collide with the BLUE group only. @@ -50,7 +50,7 @@ pub fn init_world(testbed: &mut Testbed) { .build(); let blue_collider_handle = colliders.insert(blue_floor, floor_handle, &mut bodies); - testbed.set_collider_initial_color(blue_collider_handle, Point3::new(0.0, 0.0, 1.0)); + testbed.set_initial_collider_color(blue_collider_handle, Point3::new(0.0, 0.0, 1.0)); /* * Create the cubes @@ -84,7 +84,7 @@ pub fn init_world(testbed: &mut Testbed) { .build(); colliders.insert(collider, handle, &mut bodies); - testbed.set_body_color(handle, color); + testbed.set_initial_body_color(handle, color); } } } @@ -95,8 +95,3 @@ pub fn init_world(testbed: &mut 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/compound3.rs b/examples3d/compound3.rs index 4168fe9..51523f3 100644 --- a/examples3d/compound3.rs +++ b/examples3d/compound3.rs @@ -93,8 +93,3 @@ pub fn init_world(testbed: &mut 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/examples3d/convex_decomposition3.rs b/examples3d/convex_decomposition3.rs index e175f57..1d19597 100644 --- a/examples3d/convex_decomposition3.rs +++ b/examples3d/convex_decomposition3.rs @@ -1,10 +1,11 @@ -use kiss3d::loader::obj; -use na::{Point3, Translation3}; +use na::Point3; +use obj::raw::object::Polygon; use rapier3d::dynamics::{JointSet, RigidBodyBuilder, RigidBodySet}; use rapier3d::geometry::{ColliderBuilder, ColliderSet, SharedShape}; -use rapier3d::parry::bounding_volume::{self, BoundingVolume}; +use rapier3d::parry::bounding_volume; use rapier_testbed3d::Testbed; -use std::path::Path; +use std::fs::File; +use std::io::BufReader; /* * NOTE: The `r` macro is only here to convert from f64 to the `N` scalar type. @@ -42,47 +43,45 @@ pub fn init_world(testbed: &mut Testbed) { for (igeom, obj_path) in geoms.into_iter().enumerate() { let deltas = na::one(); - let mtl_path = Path::new(""); let mut shapes = Vec::new(); println!("Parsing and decomposing: {}", obj_path); - let obj = obj::parse_file(&Path::new(&obj_path), &mtl_path, ""); + let input = BufReader::new(File::open(obj_path).unwrap()); - if let Ok(model) = obj { - let meshes: Vec<_> = model + if let Ok(model) = obj::raw::parse_obj(input) { + let mut vertices: Vec<_> = model + .positions + .iter() + .map(|v| Point3::new(v.0, v.1, v.2)) + .collect(); + use std::iter::FromIterator; + let indices: Vec<_> = model + .polygons .into_iter() - .map(|mesh| mesh.1.to_trimesh().unwrap()) + .flat_map(|p| match p { + Polygon::P(idx) => idx.into_iter(), + Polygon::PT(idx) => Vec::from_iter(idx.into_iter().map(|i| i.0)).into_iter(), + Polygon::PN(idx) => Vec::from_iter(idx.into_iter().map(|i| i.0)).into_iter(), + Polygon::PTN(idx) => Vec::from_iter(idx.into_iter().map(|i| i.0)).into_iter(), + }) .collect(); // Compute the size of the model, to scale it and have similar size for everything. - let mut aabb = - bounding_volume::details::point_cloud_aabb(&deltas, &meshes[0].coords[..]); - - for mesh in meshes[1..].iter() { - aabb.merge(&bounding_volume::details::point_cloud_aabb( - &deltas, - &mesh.coords[..], - )); - } - - let center = aabb.center().coords; + let aabb = bounding_volume::details::point_cloud_aabb(&deltas, &vertices); + let center = aabb.center(); let diag = (aabb.maxs - aabb.mins).norm(); - for mut trimesh in meshes.into_iter() { - trimesh.translate_by(&Translation3::from(-center)); - trimesh.scale_by_scalar(6.0 / diag); + vertices + .iter_mut() + .for_each(|p| *p = (*p - center.coords) * 6.0 / diag); - let vertices = trimesh.coords; - let indices: Vec<_> = trimesh - .indices - .unwrap_unified() - .into_iter() - .map(|idx| [idx.x, idx.y, idx.z]) - .collect(); + let indices: Vec<_> = indices + .chunks(3) + .map(|idx| [idx[0] as u32, idx[1] as u32, idx[2] as u32]) + .collect(); - let decomposed_shape = SharedShape::convex_decomposition(&vertices, &indices); - shapes.push(decomposed_shape); - } + let decomposed_shape = SharedShape::convex_decomposition(&vertices, &indices); + shapes.push(decomposed_shape); // let compound = SharedShape::compound(compound_parts); @@ -122,7 +121,7 @@ fn models() -> Vec { "media/models/hornbug.obj".to_string(), "media/models/octopus_decimated.obj".to_string(), "media/models/rabbit_decimated.obj".to_string(), - "media/models/rust_logo.obj".to_string(), + // "media/models/rust_logo.obj".to_string(), "media/models/rust_logo_simplified.obj".to_string(), "media/models/screwdriver_decimated.obj".to_string(), "media/models/table.obj".to_string(), diff --git a/examples3d/convex_polyhedron3.rs b/examples3d/convex_polyhedron3.rs index 3cbcbf1..c43a781 100644 --- a/examples3d/convex_polyhedron3.rs +++ b/examples3d/convex_polyhedron3.rs @@ -71,8 +71,3 @@ pub fn init_world(testbed: &mut Testbed) { testbed.set_world(bodies, colliders, joints); testbed.look_at(Point3::new(30.0, 30.0, 30.0), Point3::origin()); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Boxes", init_world)]); - testbed.run() -} diff --git a/examples3d/debug_add_remove_collider3.rs b/examples3d/debug_add_remove_collider3.rs index 9aab754..00a0ff3 100644 --- a/examples3d/debug_add_remove_collider3.rs +++ b/examples3d/debug_add_remove_collider3.rs @@ -34,12 +34,13 @@ pub fn init_world(testbed: &mut Testbed) { let collider = ColliderBuilder::ball(ball_rad).density(100.0).build(); colliders.insert(collider, ball_handle, &mut bodies); - testbed.add_callback(move |mut window, mut graphics, physics, _, _| { + testbed.add_callback(move |_, physics, _, _| { // Remove then re-add the ground collider. + let removed_collider_handle = ground_collider_handle; let coll = physics .colliders .remove( - ground_collider_handle, + removed_collider_handle, &mut physics.islands, &mut physics.bodies, true, @@ -48,10 +49,6 @@ pub fn init_world(testbed: &mut Testbed) { ground_collider_handle = physics .colliders .insert(coll, ground_handle, &mut physics.bodies); - - if let (Some(graphics), Some(window)) = (&mut graphics, &mut window) { - graphics.add_collider(window, ground_collider_handle, &physics.colliders); - } }); /* @@ -60,8 +57,3 @@ pub fn init_world(testbed: &mut 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/debug_big_colliders3.rs b/examples3d/debug_big_colliders3.rs index 956f36a..a524f97 100644 --- a/examples3d/debug_big_colliders3.rs +++ b/examples3d/debug_big_colliders3.rs @@ -43,8 +43,3 @@ pub fn init_world(testbed: &mut 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/debug_boxes3.rs b/examples3d/debug_boxes3.rs index 919cdd6..cba9d01 100644 --- a/examples3d/debug_boxes3.rs +++ b/examples3d/debug_boxes3.rs @@ -44,8 +44,3 @@ pub fn init_world(testbed: &mut 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/debug_cylinder3.rs b/examples3d/debug_cylinder3.rs index 0717c67..0b68b62 100644 --- a/examples3d/debug_cylinder3.rs +++ b/examples3d/debug_cylinder3.rs @@ -58,8 +58,3 @@ pub fn init_world(testbed: &mut 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/examples3d/debug_dynamic_collider_add3.rs b/examples3d/debug_dynamic_collider_add3.rs index 61c1482..6a4589b 100644 --- a/examples3d/debug_dynamic_collider_add3.rs +++ b/examples3d/debug_dynamic_collider_add3.rs @@ -45,7 +45,7 @@ pub fn init_world(testbed: &mut Testbed) { let mut extra_colliders = Vec::new(); let snapped_frame = 51; - testbed.add_callback(move |mut window, mut graphics, physics, _, _| { + testbed.add_callback(move |mut graphics, physics, _, _| { step += 1; // Add a bigger ball collider @@ -57,8 +57,8 @@ pub fn init_world(testbed: &mut Testbed) { .colliders .insert(collider, ball_handle, &mut physics.bodies); - if let (Some(graphics), Some(window)) = (&mut graphics, &mut window) { - graphics.add_collider(window, new_ball_collider_handle, &physics.colliders); + if let Some(graphics) = &mut graphics { + graphics.add_collider(new_ball_collider_handle, &physics.colliders); } extra_colliders.push(new_ball_collider_handle); @@ -79,6 +79,10 @@ pub fn init_world(testbed: &mut Testbed) { step = snapped_frame; for handle in &extra_colliders { + if let Some(graphics) = &mut graphics { + graphics.remove_collider(*handle, &physics.colliders); + } + physics .colliders .remove(*handle, &mut physics.islands, &mut physics.bodies, true); @@ -102,8 +106,8 @@ pub fn init_world(testbed: &mut Testbed) { .colliders .insert(coll, ground_handle, &mut physics.bodies); - if let (Some(graphics), Some(window)) = (&mut graphics, &mut window) { - graphics.add_collider(window, new_ground_collider_handle, &physics.colliders); + if let Some(graphics) = &mut graphics { + graphics.add_collider(new_ground_collider_handle, &physics.colliders); } extra_colliders.push(new_ground_collider_handle); @@ -115,8 +119,3 @@ pub fn init_world(testbed: &mut 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/debug_friction3.rs b/examples3d/debug_friction3.rs index 5cf40b3..72631a7 100644 --- a/examples3d/debug_friction3.rs +++ b/examples3d/debug_friction3.rs @@ -41,10 +41,5 @@ pub fn init_world(testbed: &mut Testbed) { * 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() + testbed.look_at(Point3::new(100.0, 100.0, 100.0), Point3::origin()); } diff --git a/examples3d/debug_infinite_fall3.rs b/examples3d/debug_infinite_fall3.rs index e70a386..ef41c92 100644 --- a/examples3d/debug_infinite_fall3.rs +++ b/examples3d/debug_infinite_fall3.rs @@ -48,8 +48,3 @@ pub fn init_world(testbed: &mut Testbed) { testbed.look_at(Point3::new(100.0, -10.0, 100.0), Point3::origin()); testbed.set_world(bodies, colliders, joints); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Boxes", init_world)]); - testbed.run() -} diff --git a/examples3d/debug_prismatic3.rs b/examples3d/debug_prismatic3.rs index 5ccf2eb..07cf381 100644 --- a/examples3d/debug_prismatic3.rs +++ b/examples3d/debug_prismatic3.rs @@ -103,8 +103,3 @@ pub fn init_world(testbed: &mut 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/debug_rollback3.rs b/examples3d/debug_rollback3.rs index 27b27cf..8f1bede 100644 --- a/examples3d/debug_rollback3.rs +++ b/examples3d/debug_rollback3.rs @@ -44,7 +44,7 @@ pub fn init_world(testbed: &mut Testbed) { let mut step = 0; let snapped_frame = 51; - testbed.add_callback(move |_, _, physics, _, _| { + testbed.add_callback(move |_, physics, _, _| { step += 1; // Snap the ball velocity or restore it. @@ -70,8 +70,3 @@ pub fn init_world(testbed: &mut 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/debug_shape_modification3.rs b/examples3d/debug_shape_modification3.rs index 7ec06dd..bef56fa 100644 --- a/examples3d/debug_shape_modification3.rs +++ b/examples3d/debug_shape_modification3.rs @@ -44,7 +44,7 @@ pub fn init_world(testbed: &mut Testbed) { let mut step = 0; let snapped_frame = 51; - testbed.add_callback(move |_, _, physics, _, _| { + testbed.add_callback(move |_, physics, _, _| { step += 1; // Snap the ball velocity or restore it. @@ -116,8 +116,3 @@ pub fn init_world(testbed: &mut 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/debug_triangle3.rs b/examples3d/debug_triangle3.rs index 42bd06c..341f396 100644 --- a/examples3d/debug_triangle3.rs +++ b/examples3d/debug_triangle3.rs @@ -41,8 +41,3 @@ pub fn init_world(testbed: &mut 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/debug_trimesh3.rs b/examples3d/debug_trimesh3.rs index 186e673..5a8ed4b 100644 --- a/examples3d/debug_trimesh3.rs +++ b/examples3d/debug_trimesh3.rs @@ -24,16 +24,16 @@ pub fn init_world(testbed: &mut Testbed) { Point3::new(-width, -width, width), ]; let idx = vec![ - [0, 1, 2], - [0, 2, 3], + [0, 2, 1], + [0, 3, 2], [4, 5, 6], [4, 6, 7], [0, 4, 7], [0, 7, 3], - [1, 5, 6], - [1, 6, 2], - [3, 2, 7], - [2, 6, 7], + [1, 6, 5], + [1, 2, 6], + [3, 7, 2], + [2, 7, 6], [0, 1, 5], [0, 5, 4], ]; @@ -54,6 +54,7 @@ pub fn init_world(testbed: &mut Testbed) { let handle = bodies.insert(rigid_body); let collider = ColliderBuilder::trimesh(vtx, idx).build(); colliders.insert(collider, handle, &mut bodies); + testbed.set_initial_body_color(handle, Point3::new(0.3, 0.3, 0.3)); /* * Set up the testbed. @@ -61,8 +62,3 @@ pub fn init_world(testbed: &mut 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/domino3.rs b/examples3d/domino3.rs index 66d0f41..b619da5 100644 --- a/examples3d/domino3.rs +++ b/examples3d/domino3.rs @@ -60,7 +60,7 @@ pub fn init_world(testbed: &mut Testbed) { let handle = bodies.insert(rigid_body); let collider = ColliderBuilder::cuboid(thickness, width * 2.0, width).build(); colliders.insert(collider, handle, &mut bodies); - testbed.set_body_color(handle, colors[i % 2]); + testbed.set_initial_body_color(handle, colors[i % 2]); } else { skip -= 1; } @@ -78,8 +78,3 @@ pub fn init_world(testbed: &mut 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/examples3d/fountain3.rs b/examples3d/fountain3.rs index 08e1dfe..0d228c7 100644 --- a/examples3d/fountain3.rs +++ b/examples3d/fountain3.rs @@ -25,7 +25,7 @@ pub fn init_world(testbed: &mut Testbed) { colliders.insert(collider, handle, &mut bodies); // Callback that will be executed on the main loop to handle proximities. - testbed.add_callback(move |mut window, mut graphics, physics, _, run_state| { + testbed.add_callback(move |mut graphics, physics, _, run_state| { let rigid_body = RigidBodyBuilder::new_dynamic() .translation(0.0, 10.0, 0.0) .build(); @@ -40,8 +40,8 @@ pub fn init_world(testbed: &mut Testbed) { .colliders .insert(collider, handle, &mut physics.bodies); - if let (Some(graphics), Some(window)) = (&mut graphics, &mut window) { - graphics.add(window, handle, &physics.bodies, &physics.colliders); + if let Some(graphics) = &mut graphics { + graphics.add_body(handle, &physics.bodies, &physics.colliders); } if physics.bodies.len() > MAX_NUMBER_OF_BODIES { @@ -68,8 +68,8 @@ pub fn init_world(testbed: &mut Testbed) { &mut physics.joints, ); - if let (Some(graphics), Some(window)) = (&mut graphics, &mut window) { - graphics.remove_body_nodes(window, *handle); + if let Some(graphics) = &mut graphics { + graphics.remove_body(*handle); } } } @@ -85,8 +85,3 @@ pub fn init_world(testbed: &mut Testbed) { // .velocity_based_erp = 0.2; testbed.look_at(Point3::new(-30.0, 4.0, -30.0), Point3::new(0.0, 1.0, 0.0)); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Add-remove", init_world)]); - testbed.run() -} diff --git a/examples3d/heightfield3.rs b/examples3d/heightfield3.rs index f603bb1..414ffdd 100644 --- a/examples3d/heightfield3.rs +++ b/examples3d/heightfield3.rs @@ -97,8 +97,3 @@ pub fn init_world(testbed: &mut 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/examples3d/joints3.rs b/examples3d/joints3.rs index 5b082fb..c7f8a1c 100644 --- a/examples3d/joints3.rs +++ b/examples3d/joints3.rs @@ -472,8 +472,3 @@ pub fn init_world(testbed: &mut Testbed) { testbed.set_world(bodies, colliders, joints); testbed.look_at(Point3::new(15.0, 5.0, 42.0), Point3::new(13.0, 1.0, 1.0)); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Joints", init_world)]); - testbed.run() -} diff --git a/examples3d/keva3.rs b/examples3d/keva3.rs index 6862f25..9e6807a 100644 --- a/examples3d/keva3.rs +++ b/examples3d/keva3.rs @@ -51,7 +51,7 @@ pub fn build_block( let collider = ColliderBuilder::cuboid(dim.x, dim.y, dim.z).build(); colliders.insert(collider, handle, bodies); - testbed.set_body_color(handle, color0); + testbed.set_initial_body_color(handle, color0); std::mem::swap(&mut color0, &mut color1); } } @@ -73,7 +73,7 @@ pub fn build_block( let handle = bodies.insert(rigid_body); let collider = ColliderBuilder::cuboid(dim.x, dim.y, dim.z).build(); colliders.insert(collider, handle, bodies); - testbed.set_body_color(handle, color0); + testbed.set_initial_body_color(handle, color0); std::mem::swap(&mut color0, &mut color1); } } @@ -137,8 +137,3 @@ pub fn init_world(testbed: &mut 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/examples3d/locked_rotations3.rs b/examples3d/locked_rotations3.rs index c626925..9748c17 100644 --- a/examples3d/locked_rotations3.rs +++ b/examples3d/locked_rotations3.rs @@ -59,8 +59,3 @@ pub fn init_world(testbed: &mut Testbed) { testbed.set_world(bodies, colliders, joints); testbed.look_at(Point3::new(10.0, 3.0, 0.0), Point3::new(0.0, 3.0, 0.0)); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Boxes", init_world)]); - testbed.run() -} diff --git a/examples3d/one_way_platforms3.rs b/examples3d/one_way_platforms3.rs index f5a2f1b..7933f78 100644 --- a/examples3d/one_way_platforms3.rs +++ b/examples3d/one_way_platforms3.rs @@ -100,7 +100,7 @@ pub fn init_world(testbed: &mut Testbed) { * Spawn cubes at regular intervals and apply a custom gravity * depending on their position. */ - testbed.add_callback(move |mut window, mut graphics, physics, _, run_state| { + testbed.add_callback(move |graphics, physics, _, run_state| { if run_state.timestep_id % 50 == 0 && physics.bodies.len() <= 7 { // Spawn a new cube. let collider = ColliderBuilder::cuboid(1.0, 2.0, 1.5).build(); @@ -112,8 +112,8 @@ pub fn init_world(testbed: &mut Testbed) { .colliders .insert(collider, handle, &mut physics.bodies); - if let (Some(graphics), Some(window)) = (&mut graphics, &mut window) { - graphics.add(window, handle, &physics.bodies, &physics.colliders); + if let Some(graphics) = graphics { + graphics.add_body(handle, &physics.bodies, &physics.colliders); } } @@ -139,8 +139,3 @@ pub fn init_world(testbed: &mut Testbed) { ); testbed.look_at(Point3::new(-100.0, 0.0, 0.0), Point3::origin()); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Boxes", init_world)]); - testbed.run() -} diff --git a/examples3d/platform3.rs b/examples3d/platform3.rs index 7b5c986..786ddbf 100644 --- a/examples3d/platform3.rs +++ b/examples3d/platform3.rs @@ -65,7 +65,7 @@ pub fn init_world(testbed: &mut Testbed) { * Setup a callback to control the platform. */ let mut count = 0; - testbed.add_callback(move |_, _, physics, _, run_state| { + testbed.add_callback(move |_, physics, _, run_state| { count += 1; if count % 100 > 50 { return; @@ -95,8 +95,3 @@ pub fn init_world(testbed: &mut Testbed) { testbed.set_world(bodies, colliders, joints); testbed.look_at(Point3::new(-10.0, 5.0, -10.0), Point3::origin()); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Kinematic body", init_world)]); - testbed.run() -} diff --git a/examples3d/primitives3.rs b/examples3d/primitives3.rs index 2711ba9..afa5dfd 100644 --- a/examples3d/primitives3.rs +++ b/examples3d/primitives3.rs @@ -73,8 +73,3 @@ pub fn init_world(testbed: &mut 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/examples3d/restitution3.rs b/examples3d/restitution3.rs index c8d4b28..8fa3275 100644 --- a/examples3d/restitution3.rs +++ b/examples3d/restitution3.rs @@ -49,8 +49,3 @@ pub fn init_world(testbed: &mut Testbed) { testbed.set_world(bodies, colliders, joints); testbed.look_at(Point3::new(0.0, 3.0, 30.0), Point3::new(0.0, 3.0, 0.0)); } - -fn main() { - let testbed = Testbed::from_builders(0, vec![("Boxes", init_world)]); - testbed.run() -} diff --git a/examples3d/sensor3.rs b/examples3d/sensor3.rs index 641e93d..e55bf72 100644 --- a/examples3d/sensor3.rs +++ b/examples3d/sensor3.rs @@ -46,7 +46,7 @@ pub fn init_world(testbed: &mut Testbed) { let collider = ColliderBuilder::cuboid(rad, rad, rad).build(); colliders.insert(collider, handle, &mut bodies); - testbed.set_body_color(handle, Point3::new(0.5, 0.5, 1.0)); + testbed.set_initial_body_color(handle, Point3::new(0.5, 0.5, 1.0)); } } @@ -70,10 +70,10 @@ pub fn init_world(testbed: &mut Testbed) { let sensor_collider = ColliderBuilder::ball(rad * 5.0).sensor(true).build(); colliders.insert(sensor_collider, sensor_handle, &mut bodies); - testbed.set_body_color(sensor_handle, Point3::new(0.5, 1.0, 1.0)); + testbed.set_initial_body_color(sensor_handle, Point3::new(0.5, 1.0, 1.0)); // Callback that will be executed on the main loop to handle proximities. - testbed.add_callback(move |_, mut graphics, physics, events, _| { + testbed.add_callback(move |mut graphics, physics, events, _| {