aboutsummaryrefslogtreecommitdiff
path: root/src/geometry/contact_generator
diff options
context:
space:
mode:
authorCrozet Sébastien <developer@crozet.re>2020-12-14 15:51:43 +0100
committerCrozet Sébastien <developer@crozet.re>2020-12-29 11:31:00 +0100
commitcc6d1b973002b4d366bc81ec6bf9e8240ad7b404 (patch)
tree66827195ef82f22e545fc9ee4e0bade9baa8031b /src/geometry/contact_generator
parent9bf1321f8f1d2e116f44c2461a53f302c4ef4171 (diff)
downloadrapier-cc6d1b973002b4d366bc81ec6bf9e8240ad7b404.tar.gz
rapier-cc6d1b973002b4d366bc81ec6bf9e8240ad7b404.tar.bz2
rapier-cc6d1b973002b4d366bc81ec6bf9e8240ad7b404.zip
Outsource the Shape trait, wquadtree, and shape types.
Diffstat (limited to 'src/geometry/contact_generator')
-rw-r--r--src/geometry/contact_generator/ball_ball_contact_generator.rs8
-rw-r--r--src/geometry/contact_generator/contact_dispatcher.rs8
-rw-r--r--src/geometry/contact_generator/contact_generator.rs8
-rw-r--r--src/geometry/contact_generator/contact_generator_workspace.rs6
-rw-r--r--src/geometry/contact_generator/heightfield_shape_contact_generator.rs9
-rw-r--r--src/geometry/contact_generator/mod.rs2
-rw-r--r--src/geometry/contact_generator/serializable_workspace_tag.rs2
-rw-r--r--src/geometry/contact_generator/trimesh_shape_contact_generator.rs32
8 files changed, 38 insertions, 37 deletions
diff --git a/src/geometry/contact_generator/ball_ball_contact_generator.rs b/src/geometry/contact_generator/ball_ball_contact_generator.rs
index 7122998..f2ca7af 100644
--- a/src/geometry/contact_generator/ball_ball_contact_generator.rs
+++ b/src/geometry/contact_generator/ball_ball_contact_generator.rs
@@ -5,12 +5,12 @@ use crate::math::{Point, Vector};
use {
crate::geometry::contact_generator::PrimitiveContactGenerationContextSimd,
crate::geometry::{WBall, WContact},
- crate::math::{Isometry, SimdFloat, SIMD_WIDTH},
+ crate::math::{Isometry, SimdReal, SIMD_WIDTH},
simba::simd::SimdValue,
};
#[cfg(feature = "simd-is-enabled")]
-fn generate_contacts_simd(ball1: &WBall, ball2: &WBall, pos21: &Isometry<SimdFloat>) -> WContact {
+fn generate_contacts_simd(ball1: &WBall, ball2: &WBall, pos21: &Isometry<SimdReal>) -> WContact {
let dcenter = ball2.center - ball1.center;
let center_dist = dcenter.magnitude();
let normal = dcenter / center_dist;
@@ -30,9 +30,9 @@ fn generate_contacts_simd(ball1: &WBall, ball2: &WBall, pos21: &Isometry<SimdFlo
pub fn generate_contacts_ball_ball_simd(ctxt: &mut PrimitiveContactGenerationContextSimd) {
let pos_ba = ctxt.positions2.inverse() * ctxt.positions1;
let radii_a =
- SimdFloat::from(array![|ii| ctxt.shapes1[ii].as_ball().unwrap().radius; SIMD_WIDTH]);
+ SimdReal::from(array![|ii| ctxt.shapes1[ii].as_ball().unwrap().radius; SIMD_WIDTH]);
let radii_b =
- SimdFloat::from(array![|ii| ctxt.shapes2[ii].as_ball().unwrap().radius; SIMD_WIDTH]);
+ SimdReal::from(array![|ii| ctxt.shapes2[ii].as_ball().unwrap().radius; SIMD_WIDTH]);
let wball_a = WBall::new(Point::origin(), radii_a);
let wball_b = WBall::new(pos_ba.inverse_transform_point(&Point::origin()), radii_b);
diff --git a/src/geometry/contact_generator/contact_dispatcher.rs b/src/geometry/contact_generator/contact_dispatcher.rs
index 7c32714..9b247f3 100644
--- a/src/geometry/contact_generator/contact_dispatcher.rs
+++ b/src/geometry/contact_generator/contact_dispatcher.rs
@@ -3,9 +3,9 @@ use crate::geometry::contact_generator::PfmPfmContactManifoldGeneratorWorkspace;
use crate::geometry::contact_generator::{
ContactGenerator, ContactGeneratorWorkspace, ContactPhase,
HeightFieldShapeContactGeneratorWorkspace, PrimitiveContactGenerator,
- TrimeshShapeContactGeneratorWorkspace,
+ TriMeshShapeContactGeneratorWorkspace,
};
-use crate::geometry::ShapeType;
+use buckler::shape::ShapeType;
/// Trait implemented by structures responsible for selecting a collision-detection algorithm
/// for a given pair of shapes.
@@ -114,13 +114,13 @@ impl ContactDispatcher for DefaultContactDispatcher {
shape2: ShapeType,
) -> (ContactPhase, Option<ContactGeneratorWorkspace>) {
match (shape1, shape2) {
- (ShapeType::Trimesh, _) | (_, ShapeType::Trimesh) => (
+ (ShapeType::TriMesh, _) | (_, ShapeType::TriMesh) => (
ContactPhase::NearPhase(ContactGenerator {
generate_contacts: super::generate_contacts_trimesh_shape,
..ContactGenerator::default()
}),
Some(ContactGeneratorWorkspace::from(
- TrimeshShapeContactGeneratorWorkspace::new(),
+ TriMeshShapeContactGeneratorWorkspace::new(),
)),
),
(ShapeType::HeightField, _) | (_, ShapeType::HeightField) => (
diff --git a/src/geometry/contact_generator/contact_generator.rs b/src/geometry/contact_generator/contact_generator.rs
index b1b1be6..06ab265 100644
--- a/src/geometry/contact_generator/contact_generator.rs
+++ b/src/geometry/contact_generator/contact_generator.rs
@@ -1,11 +1,11 @@
use crate::data::MaybeSerializableData;
use crate::geometry::{
Collider, ColliderSet, ContactDispatcher, ContactEvent, ContactManifold, ContactPair, Shape,
- SolverFlags,
+ ShapeType, SolverFlags,
};
use crate::math::Isometry;
#[cfg(feature = "simd-is-enabled")]
-use crate::math::{SimdFloat, SIMD_WIDTH};
+use crate::math::{SimdReal, SIMD_WIDTH};
use crate::pipeline::EventHandler;
#[derive(Copy, Clone)]
@@ -158,8 +158,8 @@ pub struct PrimitiveContactGenerationContextSimd<'a, 'b> {
pub colliders2: [&'a Collider; SIMD_WIDTH],
pub shapes1: [&'a dyn Shape; SIMD_WIDTH],
pub shapes2: [&'a dyn Shape; SIMD_WIDTH],
- pub positions1: &'a Isometry<SimdFloat>,
- pub positions2: &'a Isometry<SimdFloat>,
+ pub positions1: &'a Isometry<SimdReal>,
+ pub positions2: &'a Isometry<SimdReal>,
pub manifolds: &'a mut [&'b mut ContactManifold],
pub workspaces: &'a mut [Option<&'b mut (dyn MaybeSerializableData)>],
}
diff --git a/src/geometry/contact_generator/contact_generator_workspace.rs b/src/geometry/contact_generator/contact_generator_workspace.rs
index e89395f..7aac592 100644
--- a/src/geometry/contact_generator/contact_generator_workspace.rs
+++ b/src/geometry/contact_generator/contact_generator_workspace.rs
@@ -2,7 +2,7 @@ use crate::data::MaybeSerializableData;
#[cfg(feature = "dim3")]
use crate::geometry::contact_generator::PfmPfmContactManifoldGeneratorWorkspace;
use crate::geometry::contact_generator::{
- HeightFieldShapeContactGeneratorWorkspace, TrimeshShapeContactGeneratorWorkspace,
+ HeightFieldShapeContactGeneratorWorkspace, TriMeshShapeContactGeneratorWorkspace,
WorkspaceSerializationTag,
};
@@ -81,8 +81,8 @@ impl<'de> serde::Deserialize<'de> for ContactGeneratorWorkspace {
Some(WorkspaceSerializationTag::HeightfieldShapeContactGeneratorWorkspace) => {
deser::<A, HeightFieldShapeContactGeneratorWorkspace>(&mut seq)?
}
- Some(WorkspaceSerializationTag::TrimeshShapeContactGeneratorWorkspace) => {
- deser::<A, TrimeshShapeContactGeneratorWorkspace>(&mut seq)?
+ Some(WorkspaceSerializationTag::TriMeshShapeContactGeneratorWorkspace) => {
+ deser::<A, TriMeshShapeContactGeneratorWorkspace>(&mut seq)?
}
#[cfg(feature = "dim3")]
Some(WorkspaceSerializationTag::PfmPfmContactGeneratorWorkspace) => {
diff --git a/src/geometry/contact_generator/heightfield_shape_contact_generator.rs b/src/geometry/contact_generator/heightfield_shape_contact_generator.rs
index 358ac84..125ac34 100644
--- a/src/geometry/contact_generator/heightfield_shape_contact_generator.rs
+++ b/src/geometry/contact_generator/heightfield_shape_contact_generator.rs
@@ -5,9 +5,10 @@ use crate::geometry::contact_generator::{
ContactGenerationContext, ContactGeneratorWorkspace, PrimitiveContactGenerationContext,
PrimitiveContactGenerator,
};
+use crate::geometry::{Collider, ContactManifold, ContactManifoldData};
#[cfg(feature = "dim2")]
-use crate::geometry::Capsule;
-use crate::geometry::{Collider, ContactManifold, ContactManifoldData, HeightField, Shape};
+use buckler::shape::Capsule;
+use buckler::shape::{HeightField, Shape};
#[cfg(feature = "serde-serialize")]
use erased_serde::Serialize;
@@ -95,7 +96,7 @@ fn do_generate_contacts(
#[cfg(feature = "dim3")]
let sub_shape1 = *part1;
- let sub_detector = match workspace.sub_detectors.entry(i) {
+ let sub_detector = match workspace.sub_detectors.entry(i as usize) {
Entry::Occupied(entry) => {
let sub_detector = entry.into_mut();
let manifold = workspace.old_manifolds[sub_detector.manifold_id].take();
@@ -119,7 +120,7 @@ fn do_generate_contacts(
collider2,
solver_flags,
);
- manifolds.push(ContactManifold::with_data((i, 0), manifold_data));
+ manifolds.push(ContactManifold::with_data((i as usize, 0), manifold_data));
entry.insert(sub_detector)
}
diff --git a/src/geometry/contact_generator/mod.rs b/src/geometry/contact_generator/mod.rs
index f539d7a..4c0716a 100644
--- a/src/geometry/contact_generator/mod.rs
+++ b/src/geometry/contact_generator/mod.rs
@@ -25,7 +25,7 @@ pub use self::pfm_pfm_contact_generator::{
// pub use self::polygon_polygon_contact_generator::generate_contacts_polygon_polygon;
pub use self::contact_generator_workspace::ContactGeneratorWorkspace;
pub use self::trimesh_shape_contact_generator::{
- generate_contacts_trimesh_shape, TrimeshShapeContactGeneratorWorkspace,
+ generate_contacts_trimesh_shape, TriMeshShapeContactGeneratorWorkspace,
};
pub(self) use self::serializable_workspace_tag::WorkspaceSerializationTag;
diff --git a/src/geometry/contact_generator/serializable_workspace_tag.rs b/src/geometry/contact_generator/serializable_workspace_tag.rs
index 2488c1e..4bdb902 100644
--- a/src/geometry/contact_generator/serializable_workspace_tag.rs
+++ b/src/geometry/contact_generator/serializable_workspace_tag.rs
@@ -2,7 +2,7 @@ use num_derive::FromPrimitive;
#[derive(Copy, Clone, Debug, FromPrimitive)]
pub(super) enum WorkspaceSerializationTag {
- TrimeshShapeContactGeneratorWorkspace = 0,
+ TriMeshShapeContactGeneratorWorkspace = 0,
#[cfg(feature = "dim3")]
PfmPfmContactGeneratorWorkspace,
HeightfieldShapeContactGeneratorWorkspace,
diff --git a/src/geometry/contact_generator/trimesh_shape_contact_generator.rs b/src/geometry/contact_generator/trimesh_shape_contact_generator.rs
index 172069d..209ac42 100644
--- a/src/geometry/contact_generator/trimesh_shape_contact_generator.rs
+++ b/src/geometry/contact_generator/trimesh_shape_contact_generator.rs
@@ -3,21 +3,21 @@ use crate::data::MaybeSerializableData;
use crate::geometry::contact_generator::{
ContactGenerationContext, PrimitiveContactGenerationContext,
};
-use crate::geometry::{Collider, ContactManifold, ContactManifoldData, ShapeType, Trimesh};
+use crate::geometry::{Collider, ContactManifold, ContactManifoldData, ShapeType, TriMesh};
#[cfg(feature = "serde-serialize")]
use erased_serde::Serialize;
#[cfg_attr(feature = "serde-serialize", derive(Serialize, Deserialize))]
#[derive(Clone)]
-pub struct TrimeshShapeContactGeneratorWorkspace {
- interferences: Vec<usize>,
+pub struct TriMeshShapeContactGeneratorWorkspace {
+ interferences: Vec<u32>,
local_aabb2: AABB,
- old_interferences: Vec<usize>,
+ old_interferences: Vec<u32>,
#[cfg_attr(feature = "serde-serialize", serde(skip))]
old_manifolds: Vec<ContactManifold>,
}
-impl TrimeshShapeContactGeneratorWorkspace {
+impl TriMeshShapeContactGeneratorWorkspace {
pub fn new() -> Self {
Self {
interferences: Vec::new(),
@@ -40,7 +40,7 @@ pub fn generate_contacts_trimesh_shape(ctxt: &mut ContactGenerationContext) {
}
fn do_generate_contacts(
- trimesh1: &Trimesh,
+ trimesh1: &TriMesh,
collider1: &Collider,
collider2: &Collider,
ctxt: &mut ContactGenerationContext,
@@ -52,14 +52,14 @@ fn do_generate_contacts(
ctxt.pair.pair
};
- let workspace: &mut TrimeshShapeContactGeneratorWorkspace = ctxt
+ let workspace: &mut TriMeshShapeContactGeneratorWorkspace = ctxt
.pair
.generator_workspace
.as_mut()
- .expect("The TrimeshShapeContactGeneratorWorkspace is missing.")
+ .expect("The TriMeshShapeContactGeneratorWorkspace is missing.")
.0
.downcast_mut()
- .expect("Invalid workspace type, expected a TrimeshShapeContactGeneratorWorkspace.");
+ .expect("Invalid workspace type, expected a TriMeshShapeContactGeneratorWorkspace.");
/*
* Compute interferences.
@@ -97,9 +97,9 @@ fn do_generate_contacts(
.iter()
.map(|manifold| {
if manifold.data.pair.collider1 == ctxt_collider1 {
- manifold.subshape_index_pair.0
+ manifold.subshape_index_pair.0 as u32
} else {
- manifold.subshape_index_pair.1
+ manifold.subshape_index_pair.1 as u32
}
})
.collect();
@@ -118,7 +118,7 @@ fn do_generate_contacts(
workspace.interferences.clear();
trimesh1
- .waabbs()
+ .quadtree()
.intersect_aabb(&local_aabb2, &mut workspace.interferences);
workspace.local_aabb2 = local_aabb2;
}
@@ -134,7 +134,7 @@ fn do_generate_contacts(
// TODO: don't redispatch at each frame (we should probably do the same as
// the heightfield).
for (i, triangle_id) in new_interferences.iter().enumerate() {
- if *triangle_id >= trimesh1.num_triangles() {
+ if *triangle_id >= trimesh1.num_triangles() as u32 {
// Because of SIMD padding, the broad-phase may return tiangle indices greater
// than the max.
continue;
@@ -160,7 +160,7 @@ fn do_generate_contacts(
ctxt.solver_flags,
);
- ContactManifold::with_data((*triangle_id, 0), data)
+ ContactManifold::with_data((*triangle_id as usize, 0), data)
} else {
// We already have a manifold for this triangle.
old_inter_it.next();
@@ -206,11 +206,11 @@ fn do_generate_contacts(
}
}
-impl MaybeSerializableData for TrimeshShapeContactGeneratorWorkspace {
+impl MaybeSerializableData for TriMeshShapeContactGeneratorWorkspace {
#[cfg(feature = "serde-serialize")]
fn as_serialize(&self) -> Option<(u32, &dyn Serialize)> {
Some((
- super::WorkspaceSerializationTag::TrimeshShapeContactGeneratorWorkspace as u32,
+ super::WorkspaceSerializationTag::TriMeshShapeContactGeneratorWorkspace as u32,
self,
))
}