diff --git a/CHANGELOG.md b/CHANGELOG.md index c2b91d119..73b071446 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## Unreleased +## v0.35.0 (08 August 2026) ### Added @@ -41,6 +41,34 @@ including movements exactly orthogonal to the up vector, instead of requiring a downward motion larger than an arbitrary epsilon. Purely lateral movement along the ground no longer flickers the `grounded` flag when snap-to-ground is enabled (PR #481 by @ChrisJanssens). +- Restitution is now applied as an end-of-step pass instead of during the velocity solve, so + contacts detected speculatively (within the prediction distance) bounce with the requested + coefficient instead of being damped away by the prediction distance (issue #974). +- SIMD joint constraints now build their local frames relative to the body's center of mass, + fixing joints on bodies whose center of mass isn't at their origin (PR #953 by @Kyzzsa). +- The broad phase now filters candidate pairs by collision groups, so colliders that can never + interact don't reach the narrow phase at all (issue #288). +- `ContactForceEvent` sums the pair's *solver* manifolds, so contact clustering no longer + makes the reported force and contact point disagree with what the solver applied. +- Generic (multibody) contact constraints now rebuild their anchors in the same frames the + substep update uses, fixing multibodies welded to rigid-bodies never settling (issue #968). +- `RigidBodyBuilder::additional_mass` on a body whose colliders are all massless (zero density) + now derives the angular inertia from the collider shapes instead of leaving it null, so such + bodies rotate (issue #666). +- Joints specified through a subset of their axes now complete the missing frame axes with a + twist-consistent minimal rotation, so a prismatic joint whose axis isn't `x` no longer picks + an arbitrarily rolled frame (issue #746). +- `RigidBody::sleep()` is now honored immediately, even when the body was repositioned during + the same frame (issue #448). +- `ImpulseJointSet::joints_between` now yields every joint between the two bodies instead of + only the first (issue #866). +- `CollisionPipeline::step` now clears the rigid-bodies' modified flags, so a collision-only + pipeline no longer accumulates stale change tracking (issue #662). +- Contact impulses are stored with canonicalized signed zeros, removing a source of + cross-platform divergence with `enhanced-determinism`. +- The debug-renderer now draws the border radius of 2D round triangles (issue #634). +- Testbed: objects no longer flash visible for one frame when the surface rendering is + disabled (issue #843). ### Modified diff --git a/Cargo.toml b/Cargo.toml index eeb490245..6f84f55f9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,7 +45,7 @@ exclude = ["typescript"] resolver = "2" [workspace.package] -version = "0.35.0-beta.0" +version = "0.35.0" authors = ["Sébastien Crozet "] homepage = "https://rapier.rs" repository = "https://github.com/dimforge/rapier" @@ -124,18 +124,18 @@ getrandom = { version = "0.2", features = ["js"] } wasm-bindgen = "0.2" # Internal crates (paths are relative to the workspace root) -rapier2d = { version = "0.35.0-beta.0", path = "crates/rapier2d" } -rapier2d-f64 = { version = "0.35.0-beta.0", path = "crates/rapier2d-f64" } -rapier3d = { version = "0.35.0-beta.0", path = "crates/rapier3d" } -rapier3d-f64 = { version = "0.35.0-beta.0", path = "crates/rapier3d-f64" } -rapier_testbed2d = { version = "0.35.0-beta.0", path = "crates/rapier_testbed2d" } -rapier_testbed2d-f64 = { version = "0.35.0-beta.0", path = "crates/rapier_testbed2d-f64" } -rapier_testbed3d = { version = "0.35.0-beta.0", path = "crates/rapier_testbed3d" } -rapier_testbed3d-f64 = { version = "0.35.0-beta.0", path = "crates/rapier_testbed3d-f64" } -rapier3d-urdf = { version = "0.35.0-beta.0", path = "crates/rapier3d-urdf" } -rapier3d-meshloader = { version = "0.35.0-beta.0", path = "crates/rapier3d-meshloader", default-features = false } -mjcf-rs = { version = "0.35.0-beta.0", path = "crates/mjcf-rs" } -rapier3d-mjcf = { version = "0.35.0-beta.0", path = "crates/rapier3d-mjcf" } +rapier2d = { version = "0.35.0", path = "crates/rapier2d" } +rapier2d-f64 = { version = "0.35.0", path = "crates/rapier2d-f64" } +rapier3d = { version = "0.35.0", path = "crates/rapier3d" } +rapier3d-f64 = { version = "0.35.0", path = "crates/rapier3d-f64" } +rapier_testbed2d = { version = "0.35.0", path = "crates/rapier_testbed2d" } +rapier_testbed2d-f64 = { version = "0.35.0", path = "crates/rapier_testbed2d-f64" } +rapier_testbed3d = { version = "0.35.0", path = "crates/rapier_testbed3d" } +rapier_testbed3d-f64 = { version = "0.35.0", path = "crates/rapier_testbed3d-f64" } +rapier3d-urdf = { version = "0.35.0", path = "crates/rapier3d-urdf" } +rapier3d-meshloader = { version = "0.35.0", path = "crates/rapier3d-meshloader", default-features = false } +mjcf-rs = { version = "0.35.0", path = "crates/mjcf-rs" } +rapier3d-mjcf = { version = "0.35.0", path = "crates/rapier3d-mjcf" } # Dev bincode = "1" diff --git a/crates/rapier_testbed2d-f64/Cargo.toml b/crates/rapier_testbed2d-f64/Cargo.toml index c21952b5d..06a992803 100644 --- a/crates/rapier_testbed2d-f64/Cargo.toml +++ b/crates/rapier_testbed2d-f64/Cargo.toml @@ -60,5 +60,5 @@ env_logger.workspace = true [dependencies.rapier] package = "rapier2d-f64" path = "../rapier2d-f64" -version = "0.35.0-beta.0" +version = "0.35.0" features = ["serde-serialize", "debug-render", "profiler"] diff --git a/crates/rapier_testbed2d/Cargo.toml b/crates/rapier_testbed2d/Cargo.toml index ec9a694e1..3e58c9735 100644 --- a/crates/rapier_testbed2d/Cargo.toml +++ b/crates/rapier_testbed2d/Cargo.toml @@ -60,5 +60,5 @@ env_logger.workspace = true [dependencies.rapier] package = "rapier2d" path = "../rapier2d" -version = "0.35.0-beta.0" +version = "0.35.0" features = ["serde-serialize", "debug-render", "profiler"] diff --git a/crates/rapier_testbed3d-f64/Cargo.toml b/crates/rapier_testbed3d-f64/Cargo.toml index 210c0dc6c..23dc5bab3 100644 --- a/crates/rapier_testbed3d-f64/Cargo.toml +++ b/crates/rapier_testbed3d-f64/Cargo.toml @@ -60,5 +60,5 @@ env_logger.workspace = true [dependencies.rapier] package = "rapier3d-f64" path = "../rapier3d-f64" -version = "0.35.0-beta.0" +version = "0.35.0" features = ["serde-serialize", "debug-render", "profiler"] diff --git a/crates/rapier_testbed3d/Cargo.toml b/crates/rapier_testbed3d/Cargo.toml index ca6b722f2..ef2d11c01 100644 --- a/crates/rapier_testbed3d/Cargo.toml +++ b/crates/rapier_testbed3d/Cargo.toml @@ -60,5 +60,5 @@ env_logger.workspace = true [dependencies.rapier] package = "rapier3d" path = "../rapier3d" -version = "0.35.0-beta.0" +version = "0.35.0" features = ["serde-serialize", "debug-render", "profiler"] diff --git a/python/rapier-testbed/pyproject.toml b/python/rapier-testbed/pyproject.toml index 1b1d8ad4e..1db7934ff 100644 --- a/python/rapier-testbed/pyproject.toml +++ b/python/rapier-testbed/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "rapier-testbed" -version = "0.35.0b0" +version = "0.35.0" description = "Panda3D-based visual testbed and example gallery for the Rapier Python bindings." readme = "README.md" license = { text = "Apache-2.0" } diff --git a/typescript/CHANGELOG.md b/typescript/CHANGELOG.md index 9b4668f69..51bf56c6f 100644 --- a/typescript/CHANGELOG.md +++ b/typescript/CHANGELOG.md @@ -1,4 +1,4 @@ -## Unreleased +## 0.20.0 (08 August 2026) ### Breaking changes @@ -19,6 +19,28 @@ `friction()` and `restitution()`, without a contact index: friction and restitution are now combined once per manifold, so every solver contact of a manifold shares them. +### Added + +- `SphericalImpulseJoint` motors are now exposed (they were commented out as "unsupported"): + `configureMotorModel`, `setMotorMaxForce`, `configureMotorVelocity`, `configureMotorPosition` + and `configureMotor`. They are all per-axis and take a new `JointAxis` enum as their first + argument (issue #791). + +### Fixed + +- The `-compat` packages now pass the embedded wasm module to `init()` as an object, fixing + initialization with recent `wasm-bindgen` output (issues #977, #811). +- The `-compat` `raw.d.ts` now points at the wasm module matching the built feature variant + (deterministic/simd), instead of always the default one (PR #964). + +### Modified + +- Update to Rapier 0.35.0: rewritten sleeping (persistent islands), a sweep-based CCD that is + now enabled by default against fixed colliders, a reworked narrow-phase/solver and a broad + phase tuned for large mostly-static worlds. Several contact and sleeping defaults changed — + see [rapier's changelog](https://github.com/dimforge/rapier/blob/master/CHANGELOG.md#v0350-08-august-2026) + for the full list. + ## 0.19.3 (05 Nov. 2025) - Significantly improve performances of `combineVoxelStates`. diff --git a/typescript/builds/prepare_builds/templates/Cargo.toml.tera b/typescript/builds/prepare_builds/templates/Cargo.toml.tera index f067195e7..ad6a86e41 100644 --- a/typescript/builds/prepare_builds/templates/Cargo.toml.tera +++ b/typescript/builds/prepare_builds/templates/Cargo.toml.tera @@ -1,6 +1,6 @@ [package] name = "dimforge_{{ js_package_name }}" # Can't be named rapier{{ dimension }}d which conflicts with the dependency. -version = "0.19.3" +version = "0.20.0" authors = ["Sébastien Crozet "] description = "{{ dimension }}-dimensional physics engine in Rust - official JS bindings." documentation = "https://rapier.rs/rustdoc/rapier{{ dimension }}d/index.html" @@ -30,7 +30,7 @@ rust.unexpected_cfgs = { level = "warn", check-cfg = [ # `rapier{2,3}d` is patched to the in-repo crate (see the workspace # `[patch.crates-io]` in ../../Cargo.toml); this version requirement must stay # semver-compatible with that crate's version for the patch to take effect. -rapier{{ dimension }}d = { version = "0.35.0-beta.0", features = [ +rapier{{ dimension }}d = { version = "0.35.0", features = [ "serde-serialize", "debug-render", "profiler",