From cc6d1b973002b4d366bc81ec6bf9e8240ad7b404 Mon Sep 17 00:00:00 2001 From: Crozet Sébastien Date: Mon, 14 Dec 2020 15:51:43 +0100 Subject: Outsource the Shape trait, wquadtree, and shape types. --- .../ball_ball_contact_generator.rs | 8 +++--- .../contact_generator/contact_dispatcher.rs | 8 +++--- .../contact_generator/contact_generator.rs | 8 +++--- .../contact_generator_workspace.rs | 6 ++-- .../heightfield_shape_contact_generator.rs | 9 +++--- src/geometry/contact_generator/mod.rs | 2 +- .../serializable_workspace_tag.rs | 2 +- .../trimesh_shape_contact_generator.rs | 32 +++++++++++----------- 8 files changed, 38 insertions(+), 37 deletions(-) (limited to 'src/geometry/contact_generator') 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) -> WContact { +fn generate_contacts_simd(ball1: &WBall, ball2: &WBall, pos21: &Isometry) -> 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 (ContactPhase, Option) { 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, - pub positions2: &'a Isometry, + pub positions1: &'a Isometry, + pub positions2: &'a Isometry, 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::(&mut seq)? } - Some(WorkspaceSerializationTag::TrimeshShapeContactGeneratorWorkspace) => { - deser::(&mut seq)? + Some(WorkspaceSerializationTag::TriMeshShapeContactGeneratorWorkspace) => { + deser::(&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, +pub struct TriMeshShapeContactGeneratorWorkspace { + interferences: Vec, local_aabb2: AABB, - old_interferences: Vec, + old_interferences: Vec, #[cfg_attr(feature = "serde-serialize", serde(skip))] old_manifolds: Vec, } -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, )) } -- cgit