Release v0.35.0 - #982
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
v0.35.0 (08 August 2026)
Added
ContactForceEvent::first_tick:trueon the step a pair's total contact force firstexceeds its
contact_force_event_threshold(coming from below it, or from separation),falsewhile it stays above on consecutive steps — the analogue of PhysX's"threshold force found" vs "persists" report. The status resets when the force drops
back below the threshold or the colliders separate.
CoefficientCombineRule::GeometricMean: combines friction/restitution assqrt(c1 * c2), the convention used by several other engines. It has the highestrule priority, and clamps negative coefficients to zero before the square root.
DebugRenderStyle::sleep_eligible_color_multiplier: the debug-renderer now draws bodies thatare eligible for sleep but still awake in a distinct color, making it easy to spot what is
keeping a pile awake.
Fixed
Wheel::rotationnow accumulates from the wheel's own rolling direction on thecontact plane (
contact normal × axle, the same forward direction used by thefriction update) instead of the chassis'
index_forward_axis, so wheels visuallyspin whenever the vehicle actually rolls (adapted from PR Fix issue 925 v2 #950 by @tomo0613).
DynamicRayCastVehicleControllerno longer has unlimited braking friction when awheel's side impulse is exactly zero (e.g. braking in a straight line): the skid
clamp now applies to the forward impulse as well, so braking strength is bounded by
friction_slip(adapted from PR fix wheel impulse scaling #947 by @tomo0613).(-π, π): the limit rows now measure thewrapped joint angle from the middle of the allowed range (with the joint axis as the row's
jacobian, like the angular motor rows), so a range may sit anywhere on the circle
(
[0, 3π/2]stops the joint at 3π/2 instead of π/2, and ranges crossing the ±π seam like[3π/4, 5π/4]work at all). A range wider than a full turn is indistinguishable from "nolimit" for an angle read off a relative rotation, so it now leaves the axis free instead of
clamping it at some folded-back angle.
IntegrationParameters::max_corrective_velocity, like contacts always did: a deep limitviolation recovers over a few steps instead of catapulting the bodies.
DynamicRayCastVehicleController.update_vehiclenow excludes the chassis body fromthe suspension raycasts by default (their origins sit on its own collider).
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
groundedflag when snap-to-ground is enabled (PR should allow grounding with no movement counter to the up direction #481 by @ChrisJanssens).contacts detected speculatively (within the prediction distance) bounce with the requested
coefficient instead of being damped away by the prediction distance (issue Restitution has almost no effect in 0.35.0-beta.0 (regression from 0.34.0) #974).
fixing joints on bodies whose center of mass isn't at their origin (PR Fix SIMD joint constraints #953 by @Kyzzsa).
interact don't reach the narrow phase at all (issue Performance Problem when using a lot of intersecting colliders #288).
ContactForceEventsums the pair's solver manifolds, so contact clustering no longermakes the reported force and contact point disagree with what the solver applied.
substep update uses, fixing multibodies welded to rigid-bodies never settling (issue MultibodyJoints dont handle collisions correctly #968).
RigidBodyBuilder::additional_masson 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 Friction impulse not applied at contact point with additional_mass #666).
twist-consistent minimal rotation, so a prismatic joint whose axis isn't
xno longer picksan arbitrarily rolled frame (issue Very simple PrismaticJoint numerically explodes for certain angles #746).
RigidBody::sleep()is now honored immediately, even when the body was repositioned duringthe same frame (issue Stop a rigid body #448).
ImpulseJointSet::joints_betweennow yields every joint between the two bodies instead ofonly the first (issue contacts_enabled behaves incorrectly when there's more than 1 joint between 2 rigid bodies #866).
CollisionPipeline::stepnow clears the rigid-bodies' modified flags, so a collision-onlypipeline no longer accumulates stale change tracking (issue CollisionPipeline ergonomics feedback and a bug #662).
cross-platform divergence with
enhanced-determinism.disabled (issue surface render disabled has 1 visible frame #843).
Modified
rigid-body (they can never collide). A single awake body carrying thousands of
mutually-overlapping colliders previously flooded the pair map and contact graph with
pairs the narrow phase re-discarded every step; the issue Multiple colliders attached to a single body cause significant performance degradation #970 scene (2,210 convex
colliders on one always-awake body) steps ~90x faster while stationary and ~18x
faster while moving. Note that
NarrowPhase::contact_pairnow returnsNoneforsame-parent colliders instead of a manifold-less pair.
body’s farthest point) instead of the velocities: a body held in place by contacts can sleep
even with residual solver velocities, while a body creeping through solver position
corrections cannot.
block-solverfeature, manifolds whose 2x2 constraint matrix is almost singular(e.g. redundant contact points) are now solved with the sequential solver instead of a
degraded one-point solve, removing residual jiggle in piles. The block solver also uses the
same lexicographic manifold point ordering as the sequential solver.
recomputing them at each solver iteration.