diff --git a/CHANGELOG.md b/CHANGELOG.md index f05a17f0..6db3ea33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## Unreleased + +### Fix + +- The region key has been replaced by an i64 in the f64 version of rapier, increasing the range before panics occur. + ## v0.22.0 (20 July 2024) ### Fix diff --git a/Cargo.toml b/Cargo.toml index 1c60f458..3592aa1f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,21 @@ [workspace] -members = ["crates/rapier2d", "crates/rapier2d-f64", "crates/rapier_testbed2d", "crates/rapier_testbed2d-f64", "examples2d", "benchmarks2d", - "crates/rapier3d", "crates/rapier3d-f64", "crates/rapier_testbed3d", "crates/rapier_testbed3d-f64", "examples3d", "examples3d-f64", "benchmarks3d", "crates/rapier3d-urdf", "crates/rapier3d-stl"] +members = [ + "crates/rapier2d", + "crates/rapier2d-f64", + "crates/rapier_testbed2d", + "crates/rapier_testbed2d-f64", + "examples2d", + "benchmarks2d", + "crates/rapier3d", + "crates/rapier3d-f64", + "crates/rapier_testbed3d", + "crates/rapier_testbed3d-f64", + "examples3d", + "examples3d-f64", + "benchmarks3d", + "crates/rapier3d-urdf", + "crates/rapier3d-stl", +] resolver = "2" [workspace.lints] @@ -44,4 +59,4 @@ opt-level = 1 #opt-level = 3 # #[profile.dev.package.kiss3d] -#opt-level = 3 \ No newline at end of file +#opt-level = 3 diff --git a/crates/rapier_testbed3d/Cargo.toml b/crates/rapier_testbed3d/Cargo.toml index 5a2d8201..8a0ed9cd 100644 --- a/crates/rapier_testbed3d/Cargo.toml +++ b/crates/rapier_testbed3d/Cargo.toml @@ -42,7 +42,7 @@ rand = "0.8" rand_pcg = "0.3" instant = { version = "0.1", features = ["web-sys", "now"] } bitflags = "2" -glam = { version = "0.24", optional = true } # For Physx +glam = { version = "0.24", optional = true } # For Physx num_cpus = { version = "1", optional = true } physx = { version = "0.19", features = ["glam"], optional = true } physx-sys = { version = "0.11", optional = true } diff --git a/src/geometry/broad_phase_multi_sap/sap_layer.rs b/src/geometry/broad_phase_multi_sap/sap_layer.rs index f1a3a310..80d920aa 100644 --- a/src/geometry/broad_phase_multi_sap/sap_layer.rs +++ b/src/geometry/broad_phase_multi_sap/sap_layer.rs @@ -1,4 +1,4 @@ -use super::{SAPProxies, SAPProxy, SAPRegion, SAPRegionPool}; +use super::{RegionKey, SAPProxies, SAPProxy, SAPRegion, SAPRegionPool}; use crate::geometry::broad_phase_multi_sap::DELETED_AABB_VALUE; use crate::geometry::{Aabb, BroadPhaseProxyIndex}; use crate::math::{Point, Real}; @@ -13,9 +13,9 @@ pub(crate) struct SAPLayer { pub smaller_layer: Option, pub larger_layer: Option, region_width: Real, - pub regions: HashMap, BroadPhaseProxyIndex>, + pub regions: HashMap, BroadPhaseProxyIndex>, #[cfg_attr(feature = "serde-serialize", serde(skip))] - regions_to_potentially_remove: Vec>, // Workspace + regions_to_potentially_remove: Vec>, // Workspace #[cfg_attr(feature = "serde-serialize", serde(skip))] pub created_regions: Vec, } @@ -188,7 +188,7 @@ impl SAPLayer { /// of the new region if it did not exist and has been created by this method. pub fn ensure_region_exists( &mut self, - region_key: Point, + region_key: Point, proxies: &mut SAPProxies, pool: &mut SAPRegionPool, ) -> BroadPhaseProxyIndex { diff --git a/src/geometry/broad_phase_multi_sap/sap_utils.rs b/src/geometry/broad_phase_multi_sap/sap_utils.rs index a8356ad4..77edcc0d 100644 --- a/src/geometry/broad_phase_multi_sap/sap_utils.rs +++ b/src/geometry/broad_phase_multi_sap/sap_utils.rs @@ -1,6 +1,11 @@ use crate::math::{Point, Real, Vector}; use parry::bounding_volume::Aabb; +#[cfg(feature = "f32")] +pub type RegionKey = i32; +#[cfg(feature = "f64")] +pub type RegionKey = i64; + pub(crate) const NUM_SENTINELS: usize = 1; pub(crate) const NEXT_FREE_SENTINEL: u32 = u32::MAX; pub(crate) const SENTINEL_VALUE: Real = Real::MAX; @@ -23,14 +28,19 @@ pub(crate) fn clamp_point(point: Point) -> Point { point.map(|e| na::clamp(e, -MAX_AABB_EXTENT, MAX_AABB_EXTENT)) } -pub(crate) fn point_key(point: Point, region_width: Real) -> Point { +pub(crate) fn point_key(point: Point, region_width: Real) -> Point { (point / region_width) .coords - .map(|e| e.floor() as i32) + .map(|e| { + // If the region is outside this range, the region keys will overlap + assert!(e.floor() < RegionKey::MAX as Real); + assert!(e.floor() > RegionKey::MIN as Real); + e.floor() as RegionKey + }) .into() } -pub(crate) fn region_aabb(index: Point, region_width: Real) -> Aabb { +pub(crate) fn region_aabb(index: Point, region_width: Real) -> Aabb { let mins = index.coords.map(|i| i as Real * region_width).into(); let maxs = mins + Vector::repeat(region_width); Aabb::new(mins, maxs) diff --git a/src_testbed/lib.rs b/src_testbed/lib.rs index 87026738..9ececee1 100644 --- a/src_testbed/lib.rs +++ b/src_testbed/lib.rs @@ -1,5 +1,4 @@ #![allow(clippy::too_many_arguments)] - extern crate nalgebra as na; pub use crate::graphics::{BevyMaterial, GraphicsManager};