NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #4191 most downloaded on crates.io
3 dimensional collision detection library in Rust. 64-bits precision version.
Last release 19 days ago
18 Sep 2026
Release timing varies
gaps range from 2 weeks to 4 months
Nearly every release is documented
notes for 57 of the last 60 stable releases
5 versions withdrawn
withdrawn after publishing
6 years old
71 releases · first in 2021
One column per quarter.
The CompositeShapeRef queries (cast_local_ray_and_get_normal, project_local_point, project_local_point_and_get_feature, project_local_point_and_get_lo
CompositeShapeRef queries (cast_local_ray_and_get_normal, project_local_point,
project_local_point_and_get_feature, project_local_point_and_get_location, cast_shape,
cast_shape_nonlinear, intersects_shape, contact_with_shape, distance_to_shape) no longer
overwrite the result's sub-shape with the index of the part of the composite that answered:
they return that index alongside the result, which stays as the part reported it. The caller
stores it where it wants, so a composite of composites (a scene of trimeshes) can keep both
levels. intersects_shape returns None instead of a non-intersecting result. The Shape
impls of TriMesh, Polyline and Compound, and the *_composite_shape_shape free functions,
still report the part in the result's subshape/subshape1.Release v0.31.0
Release v0.31.0 (#448)
SubShapeId type alias:
RayIntersection and PointProjection gained a subshape field, and Contact and ShapeCastHit
gained subshape1/subshape2. A shape with no sub-shapes reports 0
(#443).QueryDispatcher::distance and QueryDispatcher::intersection_test, and the distance and
intersection_test free functions, now return ShapeDistance and ShapeIntersection instead
of a bare Real and bool, so they can report the sub-shapes too. Read .distance or
.intersecting to recover the previous value (#443).TriMesh ray-cast reports the triangle's own face, and the triangle itself
is the result's subshape. TriMesh::triangle_normal and HeightField::convert_triangle_feature_id
take that sub-shape index directly, and TriMesh::is_backface tests the triangle's own face
(#443).Shape::as_composite_shape now returns Option<&(dyn CompositeShape + Sync)>, so composite-vs-shape
contact manifolds can be computed across threads under the parallel feature
(#447).Capsule now use an analytic intersection test instead of GJK: faster, and
accurate for rays starting far from the capsule (#446).num-derive to 0.5, and ptree to 0.5 and kiss3d (visual examples) to 0.46 for the
dev-dependencies.CompoundFlags::FIX_INTERNAL_EDGES makes a Compound treat the edges (2D) or faces (3D) its parts share as
interior to the union, so a body sliding across the cut between two parts of a convex
decomposition no longer catches on it. Compound::PartNormalConstraints is now
CompoundPseudoNormals, matching what TriMesh and Polyline already provide
(#442).TriMeshFlags::DEFORMABLE and PolylineFlags::DEFORMABLE mark a shape whose
vertices move while its pose stays fixed. Move them with the new TriMesh::set_vertices /
Polyline::set_vertices (or update_vertices for in-place edits), which refit the BVH and
recompute the pseudo-normals; the contact-manifold queries then recompute contacts instead of
reusing the cached ones. Also adds CompositeShape::is_deformable and
ContactManifold::mark_shapes_deformed (#447).transformation::volume_mesh fills a closed boundary with a simplex mesh for FEM simulation:
a refined constrained Delaunay triangulation in 2D, a lattice cover (optionally smoothed and
subdivided, or restricted to the surface's crust) in 3D. See VolumeMesh,
VolumeMeshParameters and MeshEnclosure (#447).TriMeshFlags::FIX_INTERNAL_EDGES_TWO_SIDED fixes internal edges on a mesh used as a two-sided
surface, keeping back-facing contact normals in the mirrored pseudo-normal cone instead of
discarding them (#447).Polyline::pseudo_normals exposes the per-vertex outward pseudo-normals (2D)
(#447).Debug for TriMesh now prints a summary instead of just the type name (#177).
Debug for TriMesh now prints a summary instead of just the type name
(#177).query::contact now supports heightfields, instead of returning Err(Unsupported)
(#274).ShapeCastStatus::PenetratingOrWithinTargetDist being reported for merely touching support-map
casts (#106).contact between exactly-touching shapes returning witness points at the shapes' centers
(#315).Triangle::area returning wildly wrong values for degenerate triangles
(#111).segments_intersection2d classifying exact segment endpoints as OnEdge instead of OnVertex
(#109).HeightField::project_local_point iterating on every element, making it O(rows * cols)
(rapier#332).Voxels shape and a shape within the prediction
distance (#404).Voxels shape-cast witness1 not being expressed in the voxels shape's local frame
(#373).to_outline for round shapes with a zero border radius
(rapier#969).hertel_mehlhorn
(#408).spade 2.15, the minimum version providing try_bulk_load_cdt
(#428).ShapeCastHit fields
(rapier#933).Voxels iterators only yield non-empty voxels
(#382).BoundingVolume::merge/merged don't guarantee strict containment of their inputs
(#260).Nothing published for this version
Nothing published for this version
Fix incorrect closest_points_cuboid_cuboid closest points (affecting query::distance too) in degenerate configurations where the separating axis is am
closest_points_cuboid_cuboid closest points (affecting query::distance too) in degenerate
configurations where the separating axis is ambiguous, e.g., axis-aligned cuboids closest at a
vertex or along parallel edges.Release v0.30.0
Release v0.30.0 (#435)
simd-stable and simd-nightly features were removed. 4-lane SIMD is now always enabled
(it falls back to scalar code on targets without SIMD support). The new opt-in simd8 feature
widens SIMD to 8 lanes for f32 builds; it requires an AVX-enabled target to actually emit
256-bit instructions, and is incompatible with enhanced-determinism.ContactManifold::subshape_pos1/subshape_pos2 are no longer public fields. They are replaced by
a single boxed subshape_poses: Option<Box<SubshapePoses>> field (to shrink ContactManifold),
accessed through the new subshape_pos1()/subshape_pos2() getters and
set_subshape_pos1/set_subshape_pos2 setters.query::sweep_toi: sweep-based time-of-impact queries. A timestep is modeled as a Sweep between
two endpoint poses (linear translation + rotation nlerp), and sweep_time_of_impact (plus
sweep_time_of_impact_composite for composite shapes) computes the earliest time the swept shapes
reach a slop-based target separation, using conservative advancement. Also exports ToiProxy,
SimplexCache, SweepToiOutput, SweepToiStatus, and SweepCompositeFastShape.Bvh gains incremental and parallel update APIs: refit_partial, flag-preserving
refit_without_resolve variants, refit_parallel, parallel BVTT traversal, and batched
parallel leaf updates (insert_or_update_batch_partially_parallel,
reinsert_or_update_with_change_detection, reinsert_or_update_if_present,
update_partially_if_present, and the BvhLeafUpdateStatus enum).Release v0.29.0
Release v0.29.0 (#427)
<Polyline as TypedCompositeShape>::PartNormalConstraints is now SegmentPseudoNormals instead of ().enhanced-determinism not producing cross-platform deterministic results for parry3d/parry3d-f64.
The feature now enables glamx/scalar-math to disable architecture-specific SIMD (NEON on arm64,
SSE2 on x86_64) which caused floating-point non-associativity in Vec3/Vec4/Quat dot products.Polyline with
PolylineFlags::ORIENTED via Polyline::with_flags, or toggle it with Polyline::set_flags, to clamp contact normals
to the outward side. This removes the spurious sideways push a body gets at a convex corner of a thin double-sided
polyline. A single 2D flag covers what TriMesh splits across TriMeshFlags::ORIENTED (assume an outward orientation
and compute pseudo-normals) and TriMeshFlags::FIX_INTERNAL_EDGES (use them to clamp contact normals). Also adds
Polyline::flags, Polyline::segment_normal_constraints, and the PolylineFlags / SegmentPseudoNormals types.
(#425)feat: improve publish-script + fix building parry3d-f64 standalone
feat: improve publish-script + fix building parry3d-f64 standalone
chore: add publish dry-run to CI
CompositeShapeRef::project_local_point and project_local_point_and_get_feature now return
Option<...> instead of unwrapping internally, and take an additional max_dist parameter that
bounds the search distance.glamx to 0.3 (built on glam 0.33), simba to 0.10, rstar to 0.13, hashbrown to 0.17,
rand to 0.10, and kiss3d (visual examples) to 0.42.glam vectors,
which is not supported on SPIR-V targets. A new VectorExt::vget/vset API and a for_each_dim!
macro are now used in place of v[i]. parry3d's alloc feature also now gates smallvec,
downcast-rs, rstar, and glamx/approx, so the no-alloc build can target SPIR-V.Bvh::scale/BvhNode::scale producing an inverted AABB on negative scale components, which
silently broke queries on shapes scaled with reflections (e.g. TriMesh::scaled). Scale components
must now be non-zero (previously: positive) (#406).Voxels::scaled not scaling the internal chunk BVH, causing queries on scaled voxels to miss
geometry (#419).Bvh::optimize_incremental panicking after multiple removes without an intervening refit
when the root collapses to a partial root, leaving orphaned wide nodes
(#409).Aabb/BoundingSphere's loosen/tighten (and their *_ed
variants) to "must be non-negative" (#394).1e-5 to 1e-4.Aabb::cast_local_ray_and_get_normal panicking with a subtraction overflow when casting a
zero-direction ray starting inside the AABB (#383).TriMesh::intersection_with_local_plane on degenerate adjacency graphs
that don't loop cleanly back to the starting index
(#398).mesh_intersection when constraint edges overlap (e.g. for co-planar triangles).
Overlapping constraints are now skipped instead of crashing the CDT
(#389).try_convex_hull
and returning an empty hull on failure (#347).WSign::copy_sign_to on non-CUDA targets by using the native copysign (the bit-twiddling
workaround is now scoped to nvptx64, where cuda_std's copysign does not compile).Switched to glamx 0.2 (glam 0.32).
glamx 0.2 (glam 0.32).Release v0.26.1
Release v0.26.1 (#417)
Bvh::traverse_indexed to traverse only a part of the subtree, and to retrieve the node’s indices (#416).Bvh::optimize_incremental being non-deterministic when restored from a serialized snapshot. The
incremental optimization state is now stored on the Bvh itself (instead of the non-serializable
BvhWorkspace) so it survives serialization/deserialization (#403).Migrate codebase to glam + release v0.26.0
Migrate codebase to glam + release v0.26.0 (#401)
This release migrates parry from nalgebra to glam (via the glamx crate) for future compatibility with
rust-gpu. This is a major breaking change affecting almost all public APIs.
Isometry → Pose (using glamx::Pose2/Pose3)Rotation → Rot2/Rot3 (using glamx::Rot2/Rot3)IsometryOps → PoseOpsIsometryOpt → PoseOptPoint<Real> - use Vector instead. Points and vectors are now unified.UnitVector<Real> - use Vector instead. Normalization is no longer encoded in the type.Translation<Real> - use Vector for translations.Vector is now glam::Vec2/Vec3/DVec2/DVec3 depending on dimension and precision featuresMatrix is now glam::Mat2/Mat3/DMat2/DMat3math module now re-exports glam types and provides dimension-agnostic aliases&Point<Real> or &Vector<Real> now take Vector by value&Isometry<Real> now take &Pose or Pose by valueHalfSpace::new now takes Vector instead of Unit<Vector<Real>>Segment::new, Triangle::new, Capsule::new now take Vector instead of PointAabb::mins and Aabb::maxs are now Vector instead of Point<Real>If your codebase currently relies on nalgebra, note that nalgebra and glamx provide type conversion. Enable the
corresponding features:
nalgebra = { version = "0.34", features = [ "convert-glam030" ] }glamx = { version = "0.1", features = ["nalgebra"] }
then you can convert between glam and nalgebra types using .into().// Before (nalgebra)
use parry3d::na::{Point3, Vector3, Isometry3, Unit};
let point = Point3::new(1.0, 2.0, 3.0);
let vector = Vector3::new(1.0, 0.0, 0.0);
let normal = Unit::new_normalize(vector);
let pos = Isometry3::translation(1.0, 2.0, 3.0);
// After (glam)
use parry3d::math::{Vector, Pose};
let point = Vector::new(1.0, 2.0, 3.0); // Points are now Vector
let vector = Vector::X;
let normal = vector.normalize(); // No Unit wrapper
let pos = Pose::translation(1.0, 2.0, 3.0);
Common patterns:
Point3::origin() → Vector::ZEROVector3::x() → Vector::Xpoint.coords → just use the vector directlyUnit::new_normalize(v) → v.normalize()Isometry3::identity() → Pose::IDENTITYisometry.translation.vector → pose.translationglamx instead of nalgebra as the public linear algebra dependencymacroquad to kiss3drkyv-serialize feature to just rkyvRelease v0.25.3
Release v0.25.3 (#393)
Release v0.25.2
Release v0.25.2 (#391)
encase feature to enable implementation of encase::ShaderType for primitive shapes.Fix point-projection of a ball on a voxels shape containing empty chunks (e.g. after voxels removal).
The Voxels shape now uses a sparse storage internally.
Voxels shape now uses a sparse storage internally.Voxels::try_set_voxel. Use ::set_voxel instead.Voxels::domain function returns values instead of references now.Voxels::extents and Voxels::domain_center. They can be obtained
from Voxels::local_aabb.Fixed same-machine determinism of the re-exported hashmap when building without the enhanced-determinism feature.
enhanced-determinism feature.MassProperties::world_inv_inertia_sqrt has been renamed to world_inv_inertia,
MassProperties::inv_principal_inertia_sqrt renamed to inv_principal_inertia.simd module when neither the simd-stable nor simd-nightly are enabled.
Without these simd features all type aliases are single-lane non-simd types (f32, f64, bool) instead of 4-lanes auto-simd
types.SimdAabb type behind the simd-stable or simd-nightly cargo feature.- Update to nalgebra 0.34.
Add Bvh::insert_with_change_detection which runs an insertion unless the inserted aabb is enclosed in the existing one. This differs from insert_or_up
Bvh::insert_with_change_detection which runs an insertion unless the inserted aabb is enclosed in the
existing one. This differs from insert_or_update_partially because the former will update parent AABBs so
they enclose their descendants.Fix bug in BVH tree node removal.
Fix invalid BVH state that could be reached after a removal resulting in a partial root.
Add a new Bvh acceleration data-structure. It replaces Qbvh entirely. It supports:
Bvh acceleration data-structure. It replaces Qbvh entirely. It supports:
clip_aabb_line crashing when given incorrect inputs (zero length direction or NAN).Segment::intersects_ray returning false-positive when the segment is zero-length. (#31).utils::sort3 and utils::sort2.local_point_cloud_aabb, point_cloud_aabb, and Aabb::from_points now takes an iterator over point values instead
of an iterator to point references. Variants taking point references still exist and are named local_point_cloud_aabb_ref,
point_cloud_aabb_ref and Aabb::from_points_ref.SimdCompositeShape and TypedSimdCompositeShape to CompositeShape and TypedCompositeShape`.TypedCompositeShape trait now derives from CompositeShape.*Visitor structures. Instead, either call Bvh::traverse (or Bvh::search_best, or Bvh::leaves, or
bvh::leaf_pairs), or wrap your composite shape into CompositeShapeRef to access some generic implementation of
various geometric queries for any composite shape.Bvh acceleration structure instead of Qbvh.Qbvh has been removed. Use Bvh instead.Add Voxels::combine_voxel_states to merge the voxel state of two Voxels shapes, updating their internal voxels state as if both shapes were part of a
Voxels::combine_voxel_states to merge the voxel state of two Voxels shapes, updating their internal voxels
state as if both shapes were part of a single one. In particular, this will prevent any internal edge that would
arise at the boundaries of both shapes if they were adjacent.Voxels::propagate_voxel_change to propagate a single-voxel modification from one Voxels shape to another,
in order to update their internal neighborhood information as if both were part of the same Voxels shape.Add TriMesh::cast_ray_with_culling and TriMesh::cast_local_ray_with_culling for casting rays on a triangle mesh but with the possibility to prevents h
TriMesh::cast_ray_with_culling and TriMesh::cast_local_ray_with_culling for casting rays on a triangle mesh
but with the possibility to prevents hits on front-faces or back-faces.MassProperties::from_voxels to compute the mass and angular inertia tensor from a voxels shape.TypedWorkspaceData for voxels-voxels and voxels-compound collision detection workspace
data.Voxels shape now only support cuboids as their leaf geometries (pseudo-balls were removed).Fix infinite loop in Voxels::set_voxel.
Voxels::set_voxel.Rework the Voxels shape API to use better method names.
Voxels shape API to use better method names.Voxels shapes.Added the Voxels type: a dedicated shape for voxel models. This is currently experimental because some features are still missing (in particular: shap
Voxels type: a dedicated shape for voxel models. This is currently experimental because some features are
still missing (in particular: shape-casting, mass properties, and collision-detection against non-convex shapes).SharedShape::voxels, SharedShape::voxels_from_points, and ::voxelized_mesh for creating a voxels shape
from grid coordinates, points, or automatic voxelization of a triangle mesh.Derive Copy for VHACDParameters.
Copy for VHACDParameters.spade default feature for algorithms using Delaunay triangulation from spade.SharedShape::from_convex_polyline_unmodified and ConvexPolygon::from_convex_polyline_unmodified
to initialize a polyline from a set of points assumed to be convex, and without modifying this set even
if some points are collinear.TriMesh::pseudo_normals_if_oriented that returns Some only if the mesh has the TriMeshFlags::ORIENTED
flag enabled.TriMeshFlags::FIX_INTERNAL_EDGES flag no longer automatically enable the TriMeshFlags::ORIENTED
flag (but the mesh pseudo-normals will still be computed).no_std compatibility.
mesh_intersections, split_trimesh,
convex hull validation, and computation of connected components for TriMesh.alloc_instead_of_core, std_instead_of_alloc, and std_instead_of_core Clippy lints to the workspace.core and alloc directly rather than using an std alias.hashbrown instead of rustc-hash when enhanced-determinism is not enabled.spade optional.Removed IntersectionCompositeShapeShapeBestFirstVisitor (which had been deprecated for a while): use IntersectionCompositeShapeShapeVisitor instead.
::to_trimesh in 2d for Cuboid and Aabb.point_in_poly2d for self-intersecting polygons.TriMesh::newTriMesh::intersection_with_aabbSharedShape::trimeshSharedShape::trimesh_with_flagspoint_cloud_bounding_sphere and point_cloud_bounding_sphere_with_center now returns a BoundingSphere.IntersectionCompositeShapeShapeBestFirstVisitor (which had been deprecated for a while):
use IntersectionCompositeShapeShapeVisitor instead.Nothing published for this version
Always compute connected-components from union-find instead of topology. It is faster and the function based on topology could result in a crash for n
Add TriMeshConnectedComponents::to_meshes and ::to_mesh_buffers to easily extract individual meshes from the set of connected components.
TriMeshConnectedComponents::to_meshes and ::to_mesh_buffers to easily extract individual meshes from the set
of connected components.TriMesh::connected_component_meshes to get the connected components as meshes directly.Fix compiling with enhanced-determinism feature enabled.
enhanced-determinism feature enabled.
Implement Shape::feature_normal_at_point for TriMesh to retrieve the normal of a face, when passing a FeatureId::Face.
Shape::feature_normal_at_point for TriMesh to retrieve the normal of a face, when passing a
FeatureId::Face.convex_polygons_intersection_points_with_tolerances, convex_polygons_intersection_with_tolerances, and
intersect_meshes_with_tolerances that let the user specify tolerances value for the collinearity check.Improve convergence of epa algorithm in degenerate configurations.
Rename Shape::clone_box to Shape::clone_dyn (the clone_box method still exists but has been deprecated).
Triangle::robust_scaled_normal and Triangle::robust_normal as a more robust way to compute the triangles
normal for thin triangles that generally cause numerical instabilities.Triangle::angle_closest_to_90 to find the triangle’s vertex with an angle closest to 90 degree.wavefront feature that enables TriMesh::to_obj_file for exporting a mesh as an obj file.Shape::scale_dyn for scaling a shape as a trait-object.TypedShape::Custom(u32) is now TypedShape::Custom(&dyn Shape).AabbSetsInterferencesCollector::tolerence is now spelled correctly as tolerance.Real is now exposed through a use statement,
so that an indirection is removed in documentation:
previous occurrences of Real now show f32 or f64.Shape::clone_box to Shape::clone_dyn (the clone_box method still exists but has been
deprecated).try_convex_hull return an error instead of panicking if less than 3 input points are given.Triangle::normal and Triangle::scaled_normal only available in 3D instead of panicking in 2D.Fix occasional crash in mesh/mesh intersection if some of the vertex coordinates are very small.
Fix edge case where some of the principal angular inertia are clamped to zero for decimeter-sized objects.
stop_on_penetration flags.polygons_intersection_points, polygon_intersection.bitflags to version ^2.3nalgebra to 0.33.indexmap to 2.Fix a regression in ball vs. convex shape contact manifold calculation.
Add ShapeCastOptions that includes two new options for (linear) shape-casting. ShapeCastOptions::target_distance which will return a hit as soon as th
ShapeCastOptions that includes two new options for (linear) shape-casting.
ShapeCastOptions::target_distance which will return a hit as soon as the moving
shapes are closer than this distance; and compute_impact_geometry_on_penetration
which forces the calculation of proper witness points and normals even if the shapes
are initially intersecting (time_of_impact == 0.0).This version modifies many names related to shape-casting:
TOI to ShapeCastHit.TOIStatus to ShapeCastStatus.RayIntersection::toi to RayIntersection::time_of_impact.toi have been replaced by time_of_impact
for better clarity.query::time_of_impact to query::cast_shapes. More generally, all the
functions prefixed with time_of_impact_ (e.g. time_of_impact_ball_ball) are
now prefixed with cast_shapes_ (e.g. cast_shapes_ball_ball).QueryDispatcher::time_of_impact to QueryDispatcher::cast_shapes.query::cast_shapes (previously named
query::time_of_impact) now take a ShapeCastOptions instead of the max_toi and
stop_at_penetration arguments.query::nonlinear_time_of_impact to query::cast_shapes_nonlinear.QueryDispatcher::nonlinear_time_of_impact to QueryDispatcher::cast_shapes_nonlinear.NonlinearTOIMode to NonlinearShapeCastMode, and NonlinearTOIMode::DirectionalTOI to
NonlinearShapeCastMode::Directional.TimeOfImpactStatus::Penetrating to ShapeCastStatus::PenetratingOrWithinTargetDist.Remove CUDA support to break free from the toolchain restriction required by cust.
SimdCompositeShape::map_part_at, TypedSimdCompositeShape::map_typed_part, and
TypedSimdCompositeShape::map_untyped_part trait functions so that the closure argument takes
an extra argument for the (optional) normal constraints. This argument can be safely ignored
by user code unless applying the normal collection is relevant to your use-case.prediction
distance) whenever any contact is actually closer than this prediction distance.TopologyError::BadAdjascentTrianglesOrientation to BadAdjacentTrianglesOrientation.SdpMatrix2::inverse_and_get_determinant_unchecked. This is useful for computing the
inverse in a AoSoA SIMD setting.Aabb::intersects_moving_aabb to perform a swept test between two moving aabbs.Add Qbvh::traverse_depth_first_with_context, Qbvh::traverse_depth_first_node_with_stack_and_context, and the related SimdVisitorWithContext trait to a
Qbvh::traverse_depth_first_with_context, Qbvh::traverse_depth_first_node_with_stack_and_context, and the
related SimdVisitorWithContext trait to allow parent nodes to pass a custom context to its children during
recursion.The point_in_poly2d now handles arbitrary (convex and non-convex) polygons. The previous implementation that only supported convex polygons has been r
point_in_poly2d now handles arbitrary (convex and non-convex) polygons. The previous implementation
that only supported convex polygons has been renamed point_in_convex_poly2d.Qbvh::refit that results from the QBVH tree becoming increasingly imbalanced.Aabb::scaled_wrt_center to scale an AABB while keeping its center unchanged.Fix ball-convex manifolds missing contacts in some corner cases.
TriMesh::intersection_with_plane.When using rkyv, fix CheckBytes implementation for types archived as themselves.
rkyv, fix CheckBytes implementation for types archived as themselves.QBVH incremental update.Fix Polyline::flat_indices that returned an incorrectly sized slice.
Polyline::flat_indices that returned an incorrectly sized slice.SimdAabb into map-like formats like JSON, YAML, RON.rkyv safe API whenever applicable to parry types.Improved performance of intersection checks involving composite shapes (compound shapes, trimeshes, polylines, etc.)
This version was yanked. See the release notes for 0.13.3 instead.
This version was yanked. See the release notes for 0.13.3 instead.
Add workaround to address jitter issue due to incorrectly empty contact manifolds generated sometimes for convex polyhedron.
About rkyv support: most POD structs (Aabb, Ball, Cuboid, etc.) are now archived as themselves instead of being archived as different types (for examp
rkyv support: most POD structs (Aabb, Ball, Cuboid, etc.) are now archived as themselves instead of
being archived as different types (for example Aabb is archived as Aabb itself instead of ArchivedAabb).transformation::try_convex_hull for a convex hull calculation that will return an error instead of
panicking on unsupported inputs.TriMesh::connected_components.Add TriMesh::canonical_intersection_with_plane for intersecting with planes aligned with one of the coordinate axes.
TriMesh::canonical_intersection_with_plane for intersecting with planes aligned with one of the coordinate axes.TriMesh::intersection_with_plane for intersecting with arbitrary planes.TriMesh::intersection_with_local_plane for intersecting with arbitrary planes in the same space as the meshIntersectResult as the output type for the above functions.Polyline::extract_connected_components which splits a compound polyline into its connected components.bytemuck::Pod and bytemuck::Zeroable for all the simple shapes that allow it
(Cuboid, Ball, Cone, etc.), and for bounding volumes (BoundingSphere and Aabb).Qbvh::leaf_data now requires &self instead of &mut self.
Qbvh::leaf_data now requires &self instead of &mut self.Qbvh::leaf boolean by a bitflags.Qbvh::remove, Qbvh::pre_update_or_insert, Qbvh::refit, Qbvh::rebalance to allow modifying a Qbvh
without having to rebuild it completely.QbvhNode::is_leaf to get if a node is a leaf or not.SharedShape::trimesh_with_flags for building a trimesh with specific pre-processing flags.Triangle::contains_point.Add SharedShape::trimesh_with_flags for constructing a triangle mesh with flags specified by the user.
SharedShape::trimesh_with_flags for constructing a triangle mesh with flags
specified by the user.Rename AABB to Aabb to comply with Rust’s style guide.
AABB to Aabb to comply with Rust’s style guide.QBVH to Qbvh to comply with Rust’s style guide.ConvexPolygon::offsetted to dilate a polygon.CudaTriMesh and CudaTriMeshPtr for triangle-meshes usable with CUDA.Aabb::bounding_sphere which returned a bounding sphere that was too big.Add to query::time_of_impact a boolean argument stop_at_penetration. If set to false the linear shape-cast won’t immediately stop if the shape is pene
query::time_of_impact a boolean argument stop_at_penetration. If set to false
the linear shape-cast won’t immediately stop if the shape is penetrating another shape at its
starting point and its trajectory is such that it’s existing that penetration configuration.Heightfield::to_polyline to get the explicit vertices/indices of a 2D heightfield
seen as a polyline.query::time_of_impact) for heightfields.cust crate.rkyv-serialize feature that enables the implementation of rkyv serialization/deserialization
for most shapes.parallel feature that enables methods for the parallel traversal of Qbvh
trees: Qbvh::traverse_bvtt_parallel,
Qbvh::traverse_bvtt_node_parallel, Qbvh::traverse_depth_first_parallel,
Qbvh::traverse_depth_first_node_parallel.Remove &self argument from Compound::decompose_trimesh.
&self argument from Compound::decompose_trimesh.cust 0.3 (for partial CUDA support).RoundShape::base_shape to RoundShape::inner_shape.MassProperties for a TriMesh..to_outline methods to compute the outline of a 3D shape (useful for debug-rendering).Until now, the orientation of the polygon computed by 2D convex hull computation parry2d::convex_hull and parry2d::convex_hull_idx wasn't specified (a
parry2d::transformation::convex_hull and
parry2d::transformation::convex_hull_idx wasn't specified (and was generally in clockwise order). Now, this
orientation is explicitly specified in the documentation and is set to counter-clockwise order (which is coherent
with orientation expected by, e.g., the ConvexPolygon type).parry::utils::obb which computes a (possibly sub-optimal) OBB for a set of points.Polyline::project_local_point_assuming_solid_interior_ccw which projects a point on the polyline contour, and
is able to detect if that points is located inside of the polyline, assuming that the polyline is closed and oriented
counter-clock-wise.TriMesh::compute_pseudo_normals. If this is called, and if the trimesh respects some constraints (
oriented
with outward normals, manifold almost everywhere, etc.) any subsequent point queries with the solid argument
set to true will properly set the PointProjection::is_inside to true when the point lies in the interior of
the trimesh.no-std context. If the new cuda cargo feature of Parry is
enabled, all features compatible with no-std can be used inside of a CUDA kernel written in Rust thanks to
the rust-cuda ecosystem.ConvexPolygon type).Add the method Aabb::volume to compute the volume of an Aabb.
Aabb::volume to compute the volume of an Aabb.Update the codebase to use nalgebra v0.29.
nalgebra v0.29.Implement Debug, Clone, PartialEq for VHACDParameters.
Debug, Clone, PartialEq for VHACDParameters.TriMesh (and adjusting the index buffer accordingly).quadtree to qbvh. Using the term quadtree was not representative of the actual
acceleration structure being used (which is a BVH).Your coding agent can read these notes before it upgrades. Set up the MCP server →