From 7fa3ae9b5eb0190662a3decddcf93be7d87ffb34 Mon Sep 17 00:00:00 2001 From: Zhixing Zhang Date: Mon, 1 Jul 2024 23:19:19 -0700 Subject: [PATCH 1/4] Use Shape::clone_scaled --- src/geometry/shape_views/collider_view.rs | 192 +++++----------------- 1 file changed, 39 insertions(+), 153 deletions(-) diff --git a/src/geometry/shape_views/collider_view.rs b/src/geometry/shape_views/collider_view.rs index 2cf2107be..33213752e 100644 --- a/src/geometry/shape_views/collider_view.rs +++ b/src/geometry/shape_views/collider_view.rs @@ -2,8 +2,7 @@ use std::fmt; use super::*; use crate::math::Vect; -use rapier::geometry::{RoundShape, SharedShape}; -use rapier::parry::either::Either; +use rapier::geometry::{Shape, SharedShape}; use rapier::parry::shape::TypedShape; /// Read-only access to the properties of a collider. @@ -61,6 +60,8 @@ pub enum ColliderView<'a> { /// A convex polygon with rounded corners. #[cfg(feature = "dim2")] RoundConvexPolygon(RoundConvexPolygonView<'a>), + /// A custom user-defined shape with a type identified by a number. + Custom(&'a dyn Shape), } impl<'a> fmt::Debug for ColliderView<'a> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { @@ -93,6 +94,7 @@ impl<'a> fmt::Debug for ColliderView<'a> { ColliderView::RoundConvexPolyhedron(view) => write!(f, "{:?}", view.raw), #[cfg(feature = "dim2")] ColliderView::RoundConvexPolygon(view) => write!(f, "{:?}", view.raw), + ColliderView::Custom(_) => write!(f, "Custom"), } } } @@ -142,7 +144,7 @@ impl<'a> From> for ColliderView<'a> { TypedShape::RoundConvexPolyhedron(s) => { ColliderView::RoundConvexPolyhedron(RoundConvexPolyhedronView { raw: s }) } - TypedShape::Custom(_) => todo!(), + TypedShape::Custom(i) => ColliderView::Custom(i), } } } @@ -205,6 +207,7 @@ impl<'a> ColliderView<'a> { ColliderView::RoundConvexPolyhedron(RoundConvexPolyhedronView { raw: s }) => { TypedShape::RoundConvexPolyhedron(s) } + ColliderView::Custom(s) => TypedShape::Custom(s), } } @@ -245,166 +248,49 @@ impl<'a> ColliderView<'a> { ColliderView::RoundConvexPolyhedron(RoundConvexPolyhedronView { raw }) => { SharedShape::new(raw.clone()) } + ColliderView::Custom(i) => SharedShape(i.clone_box().into()), } } - /// Compute the scaled version of `self.raw`. - pub fn raw_scale_by(&self, scale: Vect, num_subdivisions: u32) -> Option { - let result = match self { - ColliderView::Cuboid(s) => SharedShape::new(s.raw.scaled(&scale.into())), - ColliderView::RoundCuboid(s) => SharedShape::new(RoundShape { - border_radius: s.raw.border_radius, - inner_shape: s.raw.inner_shape.scaled(&scale.into()), - }), - ColliderView::Capsule(c) => match c.raw.scaled(&scale.into(), num_subdivisions) { - None => { - log::error!("Failed to apply scale {} to Capsule shape.", scale); - SharedShape::ball(0.0) - } - Some(Either::Left(b)) => SharedShape::new(b), - Some(Either::Right(b)) => SharedShape::new(b), - }, - ColliderView::Ball(b) => match b.raw.scaled(&scale.into(), num_subdivisions) { - None => { - log::error!("Failed to apply scale {} to Ball shape.", scale); - SharedShape::ball(0.0) - } - Some(Either::Left(b)) => SharedShape::new(b), - Some(Either::Right(b)) => SharedShape::new(b), - }, - ColliderView::Segment(s) => SharedShape::new(s.raw.scaled(&scale.into())), - // ColliderView::RoundSegment(s) => SharedShape::new(RoundShape { - // border_radius: s.raw.border_radius, - // inner_shape: s.raw.inner_shape.scaled(&scale.into()), - // }), - ColliderView::Triangle(t) => SharedShape::new(t.raw.scaled(&scale.into())), - ColliderView::RoundTriangle(t) => SharedShape::new(RoundShape { - border_radius: t.raw.border_radius, - inner_shape: t.raw.inner_shape.scaled(&scale.into()), - }), - ColliderView::TriMesh(t) => SharedShape::new(t.raw.clone().scaled(&scale.into())), - ColliderView::Polyline(p) => SharedShape::new(p.raw.clone().scaled(&scale.into())), - ColliderView::HalfSpace(h) => match h.raw.scaled(&scale.into()) { - None => { - log::error!("Failed to apply scale {} to HalfSpace shape.", scale); - SharedShape::ball(0.0) - } - Some(scaled) => SharedShape::new(scaled), - }, - ColliderView::HeightField(h) => SharedShape::new(h.raw.clone().scaled(&scale.into())), - #[cfg(feature = "dim2")] - ColliderView::ConvexPolygon(cp) => match cp.raw.clone().scaled(&scale.into()) { - None => { - log::error!("Failed to apply scale {} to ConvexPolygon shape.", scale); - SharedShape::ball(0.0) - } - Some(scaled) => SharedShape::new(scaled), - }, + pub fn to_shape(&self) -> &dyn Shape { + match self { + ColliderView::Ball(BallView { raw }) => *raw, + ColliderView::Cuboid(CuboidView { raw }) => *raw, + ColliderView::Capsule(CapsuleView { raw }) => *raw, + ColliderView::Segment(SegmentView { raw }) => *raw, + ColliderView::Triangle(TriangleView { raw }) => *raw, + ColliderView::TriMesh(TriMeshView { raw }) => *raw, + ColliderView::Polyline(PolylineView { raw }) => *raw, + ColliderView::HalfSpace(HalfSpaceView { raw }) => *raw, + ColliderView::HeightField(HeightFieldView { raw }) => *raw, + ColliderView::Compound(CompoundView { raw }) => *raw, #[cfg(feature = "dim2")] - ColliderView::RoundConvexPolygon(cp) => { - match cp.raw.inner_shape.clone().scaled(&scale.into()) { - None => { - log::error!( - "Failed to apply scale {} to RoundConvexPolygon shape.", - scale - ); - SharedShape::ball(0.0) - } - Some(scaled) => SharedShape::new(RoundShape { - border_radius: cp.raw.border_radius, - inner_shape: scaled, - }), - } - } + ColliderView::ConvexPolygon(ConvexPolygonView { raw }) => *raw, #[cfg(feature = "dim3")] - ColliderView::ConvexPolyhedron(cp) => match cp.raw.clone().scaled(&scale.into()) { - None => { - log::error!("Failed to apply scale {} to ConvexPolyhedron shape.", scale); - SharedShape::ball(0.0) - } - Some(scaled) => SharedShape::new(scaled), - }, + ColliderView::ConvexPolyhedron(ConvexPolyhedronView { raw }) => *raw, #[cfg(feature = "dim3")] - ColliderView::RoundConvexPolyhedron(cp) => { - match cp.raw.clone().inner_shape.scaled(&scale.into()) { - None => { - log::error!( - "Failed to apply scale {} to RoundConvexPolyhedron shape.", - scale - ); - SharedShape::ball(0.0) - } - Some(scaled) => SharedShape::new(RoundShape { - border_radius: cp.raw.border_radius, - inner_shape: scaled, - }), - } - } + ColliderView::Cylinder(CylinderView { raw }) => *raw, #[cfg(feature = "dim3")] - ColliderView::Cylinder(c) => match c.raw.scaled(&scale.into(), num_subdivisions) { - None => { - log::error!("Failed to apply scale {} to Cylinder shape.", scale); - SharedShape::ball(0.0) - } - Some(Either::Left(b)) => SharedShape::new(b), - Some(Either::Right(b)) => SharedShape::new(b), - }, + ColliderView::Cone(ConeView { raw }) => *raw, + ColliderView::RoundCuboid(RoundCuboidView { raw }) => *raw, + ColliderView::RoundTriangle(RoundTriangleView { raw }) => *raw, + #[cfg(feature = "dim2")] + ColliderView::RoundConvexPolygon(RoundConvexPolygonView { raw }) => *raw, #[cfg(feature = "dim3")] - ColliderView::RoundCylinder(c) => { - match c.raw.inner_shape.scaled(&scale.into(), num_subdivisions) { - None => { - log::error!("Failed to apply scale {} to RoundCylinder shape.", scale); - SharedShape::ball(0.0) - } - Some(Either::Left(scaled)) => SharedShape::new(RoundShape { - border_radius: c.raw.border_radius, - inner_shape: scaled, - }), - Some(Either::Right(scaled)) => SharedShape::new(RoundShape { - border_radius: c.raw.border_radius, - inner_shape: scaled, - }), - } - } + ColliderView::RoundCylinder(RoundCylinderView { raw }) => *raw, #[cfg(feature = "dim3")] - ColliderView::Cone(c) => match c.raw.scaled(&scale.into(), num_subdivisions) { - None => { - log::error!("Failed to apply scale {} to Cone shape.", scale); - SharedShape::ball(0.0) - } - Some(Either::Left(b)) => SharedShape::new(b), - Some(Either::Right(b)) => SharedShape::new(b), - }, + ColliderView::RoundCone(RoundConeView { raw }) => *raw, #[cfg(feature = "dim3")] - ColliderView::RoundCone(c) => { - match c.raw.inner_shape.scaled(&scale.into(), num_subdivisions) { - None => { - log::error!("Failed to apply scale {} to RoundCone shape.", scale); - SharedShape::ball(0.0) - } - Some(Either::Left(scaled)) => SharedShape::new(RoundShape { - border_radius: c.raw.border_radius, - inner_shape: scaled, - }), - Some(Either::Right(scaled)) => SharedShape::new(RoundShape { - border_radius: c.raw.border_radius, - inner_shape: scaled, - }), - } - } - ColliderView::Compound(c) => { - let mut scaled = Vec::with_capacity(c.shapes().len()); - - for (tra, rot, shape) in c.shapes() { - scaled.push(( - (tra * scale, rot).into(), - shape.raw_scale_by(scale, num_subdivisions)?, - )); - } - SharedShape::compound(scaled) - } - }; + ColliderView::RoundConvexPolyhedron(RoundConvexPolyhedronView { raw }) => *raw, + ColliderView::Custom(raw) => *raw, + } + } - Some(result) + /// Compute the scaled version of `self.raw`. + pub fn raw_scale_by(&self, scale: Vect, num_subdivisions: u32) -> Option { + let shape = self + .to_shape() + .clone_scaled(&scale.into(), num_subdivisions)?; + Some(SharedShape(shape.into())) } } From edaad1429707dcd74ca132d0cec8eb17f1a85d9c Mon Sep 17 00:00:00 2001 From: Zhixing Zhang Date: Tue, 2 Jul 2024 08:57:59 -0700 Subject: [PATCH 2/4] Update src/geometry/shape_views/collider_view.rs Co-authored-by: Thierry Berger --- src/geometry/shape_views/collider_view.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/geometry/shape_views/collider_view.rs b/src/geometry/shape_views/collider_view.rs index 33213752e..29a7f168e 100644 --- a/src/geometry/shape_views/collider_view.rs +++ b/src/geometry/shape_views/collider_view.rs @@ -286,7 +286,7 @@ impl<'a> ColliderView<'a> { } } - /// Compute the scaled version of `self.raw`. + /// Compute the scaled version of its inner [`Shape`]. pub fn raw_scale_by(&self, scale: Vect, num_subdivisions: u32) -> Option { let shape = self .to_shape() From 528f7666a0091b75aa9746fa606de6407e68bda5 Mon Sep 17 00:00:00 2001 From: Zhixing Zhang Date: Sat, 20 Jul 2024 15:52:59 -0700 Subject: [PATCH 3/4] Upgrade dependency --- bevy_rapier2d/Cargo.toml | 8 ++++---- bevy_rapier3d/Cargo.toml | 8 ++++---- src/geometry/shape_views/collider_view.rs | 4 +--- src/plugin/context.rs | 2 +- src/plugin/systems/character_controller.rs | 2 +- 5 files changed, 11 insertions(+), 13 deletions(-) diff --git a/bevy_rapier2d/Cargo.toml b/bevy_rapier2d/Cargo.toml index 88fdc92bf..9cb92c089 100644 --- a/bevy_rapier2d/Cargo.toml +++ b/bevy_rapier2d/Cargo.toml @@ -44,15 +44,15 @@ headless = [] async-collider = ["bevy/bevy_asset", "bevy/bevy_scene"] [dependencies] -bevy = { version = "0.14.0-rc.3", default-features = false } -nalgebra = { version = "0.32.6", features = ["convert-glam027"] } -rapier2d = "0.20" +bevy = { version = "0.14.0", default-features = false } +nalgebra = { version = "0.33", features = ["convert-glam027"] } +rapier2d = "0.22" bitflags = "2.4" log = "0.4" serde = { version = "1", features = ["derive"], optional = true } [dev-dependencies] -bevy = { version = "0.14.0-rc.3", default-features = false, features = [ +bevy = { version = "0.14.0", default-features = false, features = [ "x11", "bevy_state", ] } diff --git a/bevy_rapier3d/Cargo.toml b/bevy_rapier3d/Cargo.toml index 000b6c03f..31ac513e3 100644 --- a/bevy_rapier3d/Cargo.toml +++ b/bevy_rapier3d/Cargo.toml @@ -45,15 +45,15 @@ headless = [] async-collider = ["bevy/bevy_asset", "bevy/bevy_scene"] [dependencies] -bevy = { version = "0.14.0-rc.3", default-features = false } -nalgebra = { version = "0.32.6", features = ["convert-glam027"] } -rapier3d = "0.20" +bevy = { version = "0.14.0", default-features = false } +nalgebra = { version = "0.33", features = ["convert-glam027"] } +rapier3d = "0.22" bitflags = "2.4" log = "0.4" serde = { version = "1", features = ["derive"], optional = true } [dev-dependencies] -bevy = { version = "0.14.0-rc.3", default-features = false, features = [ +bevy = { version = "0.14.0", default-features = false, features = [ "x11", "tonemapping_luts", "bevy_state", diff --git a/src/geometry/shape_views/collider_view.rs b/src/geometry/shape_views/collider_view.rs index 29a7f168e..5deb44371 100644 --- a/src/geometry/shape_views/collider_view.rs +++ b/src/geometry/shape_views/collider_view.rs @@ -288,9 +288,7 @@ impl<'a> ColliderView<'a> { /// Compute the scaled version of its inner [`Shape`]. pub fn raw_scale_by(&self, scale: Vect, num_subdivisions: u32) -> Option { - let shape = self - .to_shape() - .clone_scaled(&scale.into(), num_subdivisions)?; + let shape = self.to_shape().scale_dyn(&scale.into(), num_subdivisions)?; Some(SharedShape(shape.into())) } } diff --git a/src/plugin/context.rs b/src/plugin/context.rs index 4d39149b7..2032c8f80 100644 --- a/src/plugin/context.rs +++ b/src/plugin/context.rs @@ -454,7 +454,7 @@ impl RapierContext { query_pipeline, (&scaled_shape).into(), shape_mass, - collisions.iter().copied(), + collisions.iter(), filter, ) } diff --git a/src/plugin/systems/character_controller.rs b/src/plugin/systems/character_controller.rs index 57e05da03..c9e2cb58f 100644 --- a/src/plugin/systems/character_controller.rs +++ b/src/plugin/systems/character_controller.rs @@ -122,7 +122,7 @@ pub fn update_character_controls( &context.query_pipeline, character_shape, character_mass, - collisions.iter().copied(), + collisions.iter(), filter, ) } From a7cf839d3dafb6a2fe7351d75a1b67f26bd13d20 Mon Sep 17 00:00:00 2001 From: Zhixing Zhang Date: Sat, 20 Jul 2024 16:25:27 -0700 Subject: [PATCH 4/4] Fix clippy --- src/geometry/shape_views/collider_view.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/geometry/shape_views/collider_view.rs b/src/geometry/shape_views/collider_view.rs index 3da3e5ef3..1191f5343 100644 --- a/src/geometry/shape_views/collider_view.rs +++ b/src/geometry/shape_views/collider_view.rs @@ -251,10 +251,11 @@ impl<'a> ColliderView<'a> { ColliderView::RoundConvexPolyhedron(RoundConvexPolyhedronView { raw }) => { SharedShape::new(raw.clone()) } - ColliderView::Custom(i) => SharedShape(i.clone_box().into()), + ColliderView::Custom(i) => SharedShape(i.clone_dyn().into()), } } + /// Convert to &dyn [`Shape`]. pub fn to_shape(&self) -> &dyn Shape { match self { ColliderView::Ball(BallView { raw }) => *raw,