From 9bf1321f8f1d2e116f44c2461a53f302c4ef4171 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Tue, 8 Dec 2020 17:31:49 +0100 Subject: Outsource the contact manifold, SAT, and some shapes. --- src_testbed/engine.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src_testbed/engine.rs') diff --git a/src_testbed/engine.rs b/src_testbed/engine.rs index 040c883..a864cfd 100644 --- a/src_testbed/engine.rs +++ b/src_testbed/engine.rs @@ -501,7 +501,7 @@ impl GraphicsManager { object: DefaultColliderHandle, colliders: &DefaultColliderSet, delta: Isometry, - shape: &Cuboid, + shape: &Cuboid, color: Point3, out: &mut Vec, ) { -- cgit From 486fbd972f7951edf2d576c7c6bcbd02dcc28011 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Mon, 21 Dec 2020 16:01:22 +0100 Subject: Add example for 3D convex polyhedron. --- src_testbed/engine.rs | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) (limited to 'src_testbed/engine.rs') diff --git a/src_testbed/engine.rs b/src_testbed/engine.rs index a864cfd..b1ecc8b 100644 --- a/src_testbed/engine.rs +++ b/src_testbed/engine.rs @@ -14,7 +14,7 @@ use crate::objects::node::{GraphicsNode, Node}; use rapier::dynamics::{RigidBodyHandle, RigidBodySet}; use rapier::geometry::{Collider, ColliderHandle, ColliderSet}; //use crate::objects::capsule::Capsule; -//use crate::objects::convex::Convex; +use crate::objects::convex::Convex; //#[cfg(feature = "dim3")] //use crate::objects::mesh::Mesh; //use crate::objects::plane::Plane; @@ -292,7 +292,10 @@ impl GraphicsManager { // window, // ))), - if let Some(cuboid) = shape.as_cuboid() { + if let Some(cuboid) = shape + .as_cuboid() + .or(shape.as_round_cuboid().map(|r| &r.base_shape)) + { out.push(Node::Box(BoxNode::new( handle, cuboid.half_extents, @@ -305,7 +308,10 @@ impl GraphicsManager { out.push(Node::Capsule(Capsule::new(handle, capsule, color, window))) } - if let Some(triangle) = shape.as_triangle() { + if let Some(triangle) = shape + .as_triangle() + .or(shape.as_round_triangle().map(|r| &r.base_shape)) + { out.push(Node::Mesh(Mesh::new( handle, vec![triangle.a, triangle.b, triangle.c], @@ -338,10 +344,21 @@ impl GraphicsManager { ))) } + #[cfg(feature = "dim3")] + if let Some(convex_polyhedron) = shape + .as_convex_polyhedron() + .or(shape.as_round_convex_polyhedron().map(|r| &r.base_shape)) + { + let (vertices, indices) = convex_polyhedron.to_trimesh(); + out.push(Node::Convex(Convex::new( + handle, vertices, indices, color, window, + ))) + } + #[cfg(feature = "dim3")] if let Some(cylinder) = shape .as_cylinder() - .or(shape.as_round_cylinder().map(|r| &r.cylinder)) + .or(shape.as_round_cylinder().map(|r| &r.base_shape)) { out.push(Node::Cylinder(Cylinder::new( handle, @@ -353,7 +370,10 @@ impl GraphicsManager { } #[cfg(feature = "dim3")] - if let Some(cone) = shape.as_cone() { + if let Some(cone) = shape + .as_cone() + .or(shape.as_round_cone().map(|r| &r.base_shape)) + { out.push(Node::Cone(Cone::new( handle, cone.half_height, -- cgit From 8d925a02ef97844bc937584a9095c1396daeee35 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Sun, 27 Dec 2020 18:14:22 +0100 Subject: Add convex polygons support. --- src_testbed/engine.rs | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src_testbed/engine.rs') diff --git a/src_testbed/engine.rs b/src_testbed/engine.rs index b1ecc8b..a1fd74e 100644 --- a/src_testbed/engine.rs +++ b/src_testbed/engine.rs @@ -344,6 +344,15 @@ impl GraphicsManager { ))) } + #[cfg(feature = "dim2")] + if let Some(convex_polygon) = shape + .as_convex_polygon() + .or(shape.as_round_convex_polygon().map(|r| &r.base_shape)) + { + let vertices = convex_polygon.points().to_vec(); + out.push(Node::Convex(Convex::new(handle, vertices, color, window))) + } + #[cfg(feature = "dim3")] if let Some(convex_polyhedron) = shape .as_convex_polyhedron() -- cgit From 00da4aaa42cc921bbd8c469b45c5c1e304f46260 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Tue, 5 Jan 2021 15:34:48 +0100 Subject: Add compound shape support. --- src_testbed/engine.rs | 61 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 18 deletions(-) (limited to 'src_testbed/engine.rs') diff --git a/src_testbed/engine.rs b/src_testbed/engine.rs index a1fd74e..1b7ab4b 100644 --- a/src_testbed/engine.rs +++ b/src_testbed/engine.rs @@ -6,13 +6,13 @@ use kiss3d::window::Window; use na::Point3; -use crate::math::Point; +use crate::math::{Isometry, Point}; use crate::objects::ball::Ball; use crate::objects::box_node::Box as BoxNode; use crate::objects::heightfield::HeightField; use crate::objects::node::{GraphicsNode, Node}; use rapier::dynamics::{RigidBodyHandle, RigidBodySet}; -use rapier::geometry::{Collider, ColliderHandle, ColliderSet}; +use rapier::geometry::{Collider, ColliderHandle, ColliderSet, Shape}; //use crate::objects::capsule::Capsule; use crate::objects::convex::Convex; //#[cfg(feature = "dim3")] @@ -237,7 +237,14 @@ impl GraphicsManager { for collider_handle in bodies[handle].colliders() { let color = self.c2color.get(collider_handle).copied().unwrap_or(color); let collider = &colliders[*collider_handle]; - self.do_add_collider(window, *collider_handle, collider, color, &mut new_nodes); + self.do_add_shape( + window, + *collider_handle, + collider.shape(), + &Isometry::identity(), + color, + &mut new_nodes, + ); } new_nodes.iter_mut().for_each(|n| n.update(colliders)); @@ -267,37 +274,49 @@ impl GraphicsManager { let color = self.c2color.get(&handle).copied().unwrap_or(color); let mut nodes = std::mem::replace(self.b2sn.get_mut(&collider.parent()).unwrap(), Vec::new()); - self.do_add_collider(window, handle, collider, color, &mut nodes); + self.do_add_shape( + window, + handle, + collider.shape(), + &Isometry::identity(), + color, + &mut nodes, + ); self.b2sn.insert(collider.parent(), nodes); } - fn do_add_collider( + fn do_add_shape( &mut self, window: &mut Window, handle: ColliderHandle, - collider: &Collider, + shape: &dyn Shape, + delta: &Isometry, color: Point3, out: &mut Vec, ) { - let shape = collider.shape(); + if let Some(compound) = shape.as_compound() { + for (shape_pos, shape) in compound.shapes() { + self.do_add_shape(window, handle, &**shape, shape_pos, color, out) + } + } if let Some(ball) = shape.as_ball() { - out.push(Node::Ball(Ball::new(handle, ball.radius, color, window))) + out.push(Node::Ball(Ball::new( + handle, + *delta, + ball.radius, + color, + window, + ))) } - // Shape::Polygon(poly) => out.push(Node::Convex(Convex::new( - // handle, - // poly.vertices().to_vec(), - // color, - // window, - // ))), - if let Some(cuboid) = shape .as_cuboid() .or(shape.as_round_cuboid().map(|r| &r.base_shape)) { out.push(Node::Box(BoxNode::new( handle, + *delta, cuboid.half_extents, color, window, @@ -305,7 +324,9 @@ impl GraphicsManager { } if let Some(capsule) = shape.as_capsule() { - out.push(Node::Capsule(Capsule::new(handle, capsule, color, window))) + out.push(Node::Capsule(Capsule::new( + handle, *delta, capsule, color, window, + ))) } if let Some(triangle) = shape @@ -350,7 +371,9 @@ impl GraphicsManager { .or(shape.as_round_convex_polygon().map(|r| &r.base_shape)) { let vertices = convex_polygon.points().to_vec(); - out.push(Node::Convex(Convex::new(handle, vertices, color, window))) + out.push(Node::Convex(Convex::new( + handle, *delta, vertices, color, window, + ))) } #[cfg(feature = "dim3")] @@ -360,7 +383,7 @@ impl GraphicsManager { { let (vertices, indices) = convex_polyhedron.to_trimesh(); out.push(Node::Convex(Convex::new( - handle, vertices, indices, color, window, + handle, *delta, vertices, indices, color, window, ))) } @@ -371,6 +394,7 @@ impl GraphicsManager { { out.push(Node::Cylinder(Cylinder::new( handle, + *delta, cylinder.half_height, cylinder.radius, color, @@ -385,6 +409,7 @@ impl GraphicsManager { { out.push(Node::Cone(Cone::new( handle, + *delta, cone.half_height, cone.radius, color, -- cgit From d1ed279c4e70c46928c84cf9b7f4a1db539fd7cb Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Wed, 6 Jan 2021 12:22:46 +0100 Subject: Tesbted physx backend: add heightfield, trimesh, and convex mesh support. --- src_testbed/engine.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src_testbed/engine.rs') diff --git a/src_testbed/engine.rs b/src_testbed/engine.rs index 1b7ab4b..0e415ea 100644 --- a/src_testbed/engine.rs +++ b/src_testbed/engine.rs @@ -12,7 +12,7 @@ use crate::objects::box_node::Box as BoxNode; use crate::objects::heightfield::HeightField; use crate::objects::node::{GraphicsNode, Node}; use rapier::dynamics::{RigidBodyHandle, RigidBodySet}; -use rapier::geometry::{Collider, ColliderHandle, ColliderSet, Shape}; +use rapier::geometry::{ColliderHandle, ColliderSet, Shape}; //use crate::objects::capsule::Capsule; use crate::objects::convex::Convex; //#[cfg(feature = "dim3")] -- cgit From 28b7866aee68ca844406bea4761d630a7913188d Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Wed, 20 Jan 2021 15:40:00 +0100 Subject: Switch to [u32; DIM] instead of Point for element indices. --- src_testbed/engine.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'src_testbed/engine.rs') diff --git a/src_testbed/engine.rs b/src_testbed/engine.rs index 0e415ea..cef12d6 100644 --- a/src_testbed/engine.rs +++ b/src_testbed/engine.rs @@ -336,7 +336,7 @@ impl GraphicsManager { out.push(Node::Mesh(Mesh::new( handle, vec![triangle.a, triangle.b, triangle.c], - vec![Point3::new(0, 1, 2)], + vec![[0, 1, 2]], color, window, ))) @@ -346,11 +346,7 @@ impl GraphicsManager { out.push(Node::Mesh(Mesh::new( handle, trimesh.vertices().to_vec(), - trimesh - .indices() - .iter() - .map(|idx| na::convert(*idx)) - .collect(), + trimesh.indices().to_vec(), color, window, ))) -- cgit From 23a86c294e48da9c3aad82284a09791aabfeb88d Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Tue, 26 Jan 2021 16:41:21 +0100 Subject: Allow using polylines as a collider shape. --- src_testbed/engine.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'src_testbed/engine.rs') diff --git a/src_testbed/engine.rs b/src_testbed/engine.rs index cef12d6..bcdbbca 100644 --- a/src_testbed/engine.rs +++ b/src_testbed/engine.rs @@ -26,6 +26,7 @@ use crate::objects::cone::Cone; #[cfg(feature = "dim3")] use crate::objects::cylinder::Cylinder; use crate::objects::mesh::Mesh; +use crate::objects::polyline::Polyline; use rand::{Rng, SeedableRng}; use rand_pcg::Pcg32; use std::collections::HashMap; @@ -352,6 +353,15 @@ impl GraphicsManager { ))) } + if let Some(polyline) = shape.as_polyline() { + out.push(Node::Polyline(Polyline::new( + handle, + polyline.vertices().to_vec(), + polyline.indices().to_vec(), + color, + ))) + } + if let Some(heightfield) = shape.as_heightfield() { out.push(Node::HeightField(HeightField::new( handle, -- cgit