diff options
Diffstat (limited to 'examples3d')
32 files changed, 228 insertions, 220 deletions
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<String> { + 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<String> { + 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<String> { + 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<String> { "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, &physic |
