Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 29 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
## Unreleased
## v0.35.0 (08 August 2026)

### Added

Expand Down Expand Up @@ -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

Expand Down
26 changes: 13 additions & 13 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ exclude = ["typescript"]
resolver = "2"

[workspace.package]
version = "0.35.0-beta.0"
version = "0.35.0"
authors = ["Sébastien Crozet <sebcrozet@dimforge.com>"]
homepage = "https://rapier.rs"
repository = "https://github.com/dimforge/rapier"
Expand Down Expand Up @@ -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"
Expand Down
2 changes: 1 addition & 1 deletion crates/rapier_testbed2d-f64/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"]
2 changes: 1 addition & 1 deletion crates/rapier_testbed2d/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"]
2 changes: 1 addition & 1 deletion crates/rapier_testbed3d-f64/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"]
2 changes: 1 addition & 1 deletion crates/rapier_testbed3d/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"]
2 changes: 1 addition & 1 deletion python/rapier-testbed/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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" }
Expand Down
24 changes: 23 additions & 1 deletion typescript/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
## Unreleased
## 0.20.0 (08 August 2026)

### Breaking changes

Expand All @@ -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`.
Expand Down
4 changes: 2 additions & 2 deletions typescript/builds/prepare_builds/templates/Cargo.toml.tera
Original file line number Diff line number Diff line change
@@ -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 <developer@crozet.re>"]
description = "{{ dimension }}-dimensional physics engine in Rust - official JS bindings."
documentation = "https://rapier.rs/rustdoc/rapier{{ dimension }}d/index.html"
Expand Down Expand Up @@ -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",
Expand Down
Loading