Changelog
Jitter 2.13.0 (2026-10-22)
- Breaking Change: Removed the previous speculative contact system and replaced it with continuous collision detection (CCD), supporting both translation and rotation with iterative contact discovery. Use
RigidBody.EnableCcdand theCcd*settings; the old speculative contact API has been removed. - Fixed angular
NarrowPhase.Sweepmissing collisions between separated start and end poses. Added a time-limited overload that distinguishes hits, misses, and searches that could not finish. - Added a
DynamicTree.SweepCastoverload for shapes that translate and rotate. - Improved
ToStringoutput for bodies, constraints, limits, and math types. Added numeric format and culture options for bodies, limits, and math types. - Revised XML API documentation for clearer descriptions and usage guidance.
Jitter 2.12.2 (2026-10-22)
- Fixed a stack overflow that could occur during dynamic tree balancing, particularly in double precision.
Jitter 2.12.1 (2026-10-21)
- Improved contact point accuracy against flat surfaces, fixing artificial acceleration of rolling spheres.
- Fixed outdated contact normals and friction directions when contacting surfaces change orientation.
- Avoided unnecessary dynamic tree rearrangements during optimization of stationary scenes.
Jitter 2.12.0 (2026-10-19)
- Added
AngularServo,TwistServo,LinearServo, andLinearAxisServofor driving target orientations, angles, and positions with torque or force limits. - Added
JointDriveto select a motor or servo when constructing hinge, prismatic, and universal joints. The existinghasMotorconstructors remain available but are obsolete. - Added
DebugDrawSettings.PointRadiusto control point marker size independently of constraint guides. - Improved rolling stability by preserving the original contact in auxiliary manifolds with fewer than four points.
Jitter 2.11.0 (2026-10-18)
- Breaking Change:
IDebugDrawer.DrawSegmentandDrawTrianglenow require auintcolor packed as0xRRGGBBAA. Custom drawers must implement both colored methods. - Improved contact and constraint solver performance, especially in multithreaded scenes and for constraints attached to
World.NullBody. - Improved rolling stability with substeps by fixing contact impulses that could artificially accelerate rolling objects.
- Fixed angular velocity incorrectly influencing speculative contacts. Collision prediction and speculative response now consistently use linear motion.
- Added
EllipticalConeLimitfor different swing limits in two perpendicular directions, with optional inner limits and unrestricted twist. - Expanded debug drawing for shapes, bodies, constraints, and joints, with clearer anchors, limits, axes, and motor directions.
Jitter 2.10.1 (2026-10-15)
- Added
Constraint.Tagfor attaching custom user data to constraints, matchingRigidBody.Tag.
Jitter 2.10.0 (2026-10-11)
- Breaking Change: Added
TimeStepwith full-step and substep timing information. World step and substep callbacks andSoftBody.WorldOnPostStepnow receiveTimeStep; custom constraint solver callbacks and contact preparation now takein TimeStepinstead of an inverse timestep. - Breaking Change: Renamed the three
BoxShapeconstructor parameters tosizeX,sizeY, andsizeZ. Update calls using named arguments. - Breaking Change:
ConvexPolytopenow contains reusable managed storage, and itsInitTetrahedronmethods return a success flag. AddedAddVertexDetailedfor reporting expansion outcomes. - Fixed substep scaling of motor force and torque limits and constraint softness, including soft-body springs. This changes simulation behavior when
SubstepCount > 1. - Added
AngularMotor.MaximumTorqueand deprecated itsMaximumForcealias. - Improved EPA robustness with filtered exact predicates and double-precision contact calculations, and improved GJK closest-point precision for small separations.
- Fixed
TriangleShaperay casts reporting intersections behind the ray origin. - Breaking Change: Body motion type changes no longer remove constraints or raise
World.ConstraintRemoved. Constraints retain their enabled state, are suspended while neither connected body is dynamic, and resume when a dynamic body wakes. UseWorld.Remove(constraint)for permanent removal. - Fixed moving kinematic bodies incorrectly falling asleep, including at very low speeds and with a zero deactivation time.
- Added
DynamicTree.Update(proxy, dt)and fixed speculative broadphase bounds after velocity, impulse, and speculative contact setting changes, including before the first simulation step. - Rebuilt dynamic tree collision pairs immediately when its filter changes, preserving the previous filter and pairs if the new filter throws.
- Fixed contact and island state when
BeginCollidehandlers remove bodies, shapes, or arbiters, including cancellation of pending contacts. - Made
RigidBody.AddShaperoll back on registration or mass calculation failures, and tree proxy registration roll back when filtering throws. - Fixed
World.Clearleaving shapes attached toWorld.NullBody. - Made
SoftBody.Destroysafe after repeated calls, world clearing, or disposal. Added validation and bounding box updates forSoftBodyTriangle.Thickness. - Fixed neighbor index overflow in large convex hulls and bounding box initialization for detached convex hull and point cloud shapes.
- Fixed inertia calculation for nested
TransformedShapeinstances. - Improved validation for removed bodies and constraints, invalid bodies passed to
World.CreateConstraint, and unregistered dynamic tree proxies. - Added debug assertions for invalid rigid body and constraint data access and invalid arbiter creation arguments.
PartitionedSetenumeration now throws when the set is modified instead of silently skipping elements.
Jitter 2.9.0 (2026-10-03)
- Added world-space translation and rotation locks via
RigidBody.AllowedMotionandMotionAxes, including planar motion presets. - Breaking Change: Inertia APIs now use
JSymmetricMatrix;RigidBodyData.InverseMassis replaced byInverseMassVector. Update custom shapes and constraints accordingly. - Fixed constraint mass solves, angular singularities, and fixed and boundary limits.
- Fixed speculative contact bias and CCD impulse preservation.
- Fixed possible overflow in rotation quaternion calculation.
- Added
TriangleEdgeCollisionFilter.FilterDynamicBodiesto control edge filtering for dynamic triangle bodies (disabled by default).
Jitter 2.8.13 (2026-09-19)
- Improved recovery from invalid internal state when user-provided code throws exceptions.
Jitter 2.8.12 (2026-09-15)
- Added
World.Trimto release excess internal storage after large scene changes. - Fixed a multithreaded contact creation race that could create duplicate collision pairs.
- Fixed managed memory growth from arbiter pooling across worker threads.
- Improved validation and exception behavior for disposed worlds, removal calls, dynamic tree optimization, worker pools, and unmanaged memory helpers.
- Improved XML documentation for contact registration threading rules, arbiter lifetime, and public exception behavior.
Jitter 2.8.11 (2026-09-09)
- Added
World.ConstraintRemovedfor reacting to explicit and automatic constraint removal. - Improved
DynamicTreequality during regular updates with automatic incremental optimization and non-cost-increasing rotations.
Jitter 2.8.10 (2026-08-31)
- Added
World.IsDisposedandIsValidproperties for rigid bodies and constraints, allowing unavailable native state—including automatically removed constraints—to be detected safely. - Ensured arbiters remain valid while
EndCollidecallbacks are running. - Improved contact allocation and removal performance by eliminating unnecessary data movement between buffer partitions.
Jitter 2.8.9 (2026-07-24)
- Improved multithreading performance by reducing contention and cache-line ping-pong in reader-writer locks.
Jitter 2.8.8 (2026-05-24)
- Fixed triangle edge contact filtering by re-evaluating contacts after EPA.
- Rejected degenerate
PointCloudShapevolumes and zero-massConvexHullShapeinputs during construction. - Improved exception reporting for validation failures. Also added XML documentation for public exception behavior.
Jitter 2.8.7 (2026-05-17)
- Added
World.ForceSleepIslandfor immediately deactivating an island. - Added argument validation for invalid shape dimensions, masses, constraint axes, and limits.
- Added debug-only checks for runtime state changes.
- Improved cleanup when simulation fails or gets interrupted.
- Fixed empty
DynamicTreecost calculation.
Jitter 2.8.6 (2026-05-15)
- Added support for using multiple
Worldinstances from different host threads. - Added
World.IslandActivatedandWorld.IslandDeactivatedevents for observing simulation island wake/sleep transitions. - Fixed deterministic solver iteration handling in
SolveMode.Deterministic. - Fixed nested dynamic tree queries so callbacks may safely perform additional
RayCast,SweepCast, andFindNearestqueries. - Fixed stale queued forces and torques when changing a body's
MotionType. - Breaking Change: Previously obsolete compatibility APIs now produce compile-time errors. Use the replacement APIs named in the obsolete messages.
Jitter 2.8.5 (2026-04-25)
- Improved
CollisionManifold.
Jitter 2.8.4 (2026-04-19)
- Improved
CollisionManifoldgeneration by performing full clipping, producing better contact sets. - Fixed indexed
TriangleMeshadjacency generation for meshes with duplicated seam vertices. - Added generic methods in
ShapeHelper. - Improved XML documentation throughout the codebase.
Jitter 2.8.3 (2026-04-13)
- Added
SolveMode.Deterministic- an optional cross-platform deterministic solver mode. - Fixed bugs in sleeping logic.
- Added
PersistentContactManifoldproperty.
Jitter 2.8.2 (2026-03-30)
- Added
DynamicTree.SweepCastandDynamicTree.FindNearest- new tree queries combining broadphase pruning with exact narrowphase tests.SweepCastsweeps a shape through the tree;FindNearestfinds the closest proxy by distance. Both include bounded variants and convenience overloads for common shapes. - Added
World.Stabilize- solves existing contacts and constraints at the velocity level without advancing body transforms. Useful for warm-starting a restored scene before resuming normal simulation.
Jitter 2.8.1 (2026-03-21)
- Fixed velocity setter bug in
RigidBody- introduced in 2.8.0. - Minor API improvements.
Jitter 2.8.0 (2026-03-19)
- Added
RigidBody.AddImpulsemethods for applying instantaneous impulses (linear and at a world-space position). - Fixed corner case in wake-up logic: setting velocity to zero no longer unnecessarily activates sleeping bodies.
- Introduced
ISink<T>interface andCollectionSink<T>adapter as a struct-friendly alternative toICollection<T>on hot paths. - Added
ref TSinkoverloads forShapeHelper.TessellateandDynamicTree.Query. - Extracted default constraint tuning values into named constants on the
Constraintbase class (DefaultLinearBias,DefaultLinearSoftness,DefaultAngularBias, etc.). - Breaking Change:
DynamicTree.Nodeschanged fromNode[]toReadOnlySpan<Node>, exposing only the occupied portion of the internal array. - Breaking Change:
World.DebugTimingsis nowReadOnlySpan<double>instead ofdouble[]. - Renamed generic type parameters in
NarrowPhaseandCollisionManifoldfromTA/TBtoTa/Tb.
Jitter 2.7.9 (2026-02-14)
- Fixed distance calculation in
SpringConstraint. - Fixed register bug in
UniversalJoint. - Fixed
ConeLimit.Limitproperty and added upper bound validation. - Fixed inconsistent friction clamping between scalar and SIMD contact solver paths. Both paths now use the pre-update normal impulse for the friction cone.
- Fixed unnecessary wake-ups for sleeping bodies in contact with static bodies.
- Added basic debug draw methods to constraints.
- Added world ownership validation in
World.RemoveandWorld.CreateConstraint. Passing bodies, constraints, or arbiters from a different world now throwsArgumentException. - Improved XML documentation throughout the codebase.
Jitter 2.7.8 (2026-01-18)
- Fixed degraded tree quality for large proxies in
DynamicTree. - Added
JQuaternion.Lerp,JQuaternion.Slerp,JQuaternion.Dot, andJQuaternion.Inversemethods for quaternion interpolation and math. - Added
JTriangle.GetCenter,JTriangle.GetNormal,JTriangle.GetArea,JTriangle.GetBoundingBox, andJTriangle.ClosestPointhelper methods. - Added
JBoundingBox.DisjointandJBoundingBox.Containsmethods (also inTreeBox). - Added
World.GetArbiter(id0, id1)to retrieve existing arbiters without creating new ones. - Improved XML documentation throughout the codebase.
- Fixed
CalculateMassInertiainTransformedShapereturning incorrect values. - Fixed normalization bug in
TriangleEdgeCollisionFilter. - Fixed validation in
SphereShaperadius setter. - Fixed a bug in speculative contact implementation.
- Improved
TriangleMesh. Added option to build directly from vertices and indices. - Added overloads for
Spanthroughout the engine (inTriangleMesh,ShapeHelper,PointCloudShape,ConvexHullShape).
Jitter 2.7.7 (2026-01-08)
- Added
vector.UnsafeAs<T>andJVector.UnsafeFrom<T>. Same forJQuaternion. - Added
world.PreSubStepandworld.PostSubStepevents.
Jitter 2.7.6 (2025-12-18)
- Removed
World.Capacity. Number of entities inWorldno longer has to be specified in advance. - Fixed a bug in
TwistAngle. - Added
WeldJoint. - Exposed more properties in
ConeLimit.
Jitter 2.7.5 (2025-11-16)
- Improved cost heuristic for
DynamicTree.
Jitter 2.7.4 (2025-10-29)
- Add
MotionTypeproperty toRigidBodyinstances. Bodies might meDynamic,StaticorKinematic. Static bodies with non-zero velocity are no longer supported, kinematic bodies must be used instead. - The contact graph information is used to optimize the memory layout for contacts (
ReorderContactsstep). This makes the solver more cache friendly. - Reduced overhead of
CheckDeactivationstep in the engine.
Jitter 2.7.3 (2025-10-19)
- Improved multi-threading performance.
Jitter 2.7.2 (2025-09-21)
- Reduced GC in
DynamicTree.Optimize. - Default to LocalRayCast if body is not set for
RigidBodyShape. - Added wakeup parameter to
AddForceoverloads for finer activation state control. - Added generic
ICloneableShape<T>interface for type-safe shape cloning.
Jitter 2.7.1 (2025-06-28)
- Added
RigidBody.EnableGyroscopicForcesto include gyroscopic forces.
Jitter 2.7.0 (2025-06-14)
- Dropped .NET7 support
- Added
JQuaternion.ToAxisAnglemethod - Renamed
JBBoxtoJBoundingBoxandTreeBBoxtoTreeBox. - Various smaller API changes.
Jitter 2.6.7 (2025-06-09)
- Introduced SIMD accelerated
TreeBBoxforDynamicTree.
Jitter 2.6.6 (2025-05-31)
- Implicit conversion for
JVectorandJQuaternionfrom tuples, e.g.cube.Position = (1, 2, 3);. - Added
PreStepandPostSteptoWorld.Timings. - Added
NarrowPhase.Sweepoverload which calculates time of impact (TOI) for rotating shapes. RegisterContactno longer requires apenetrationand aspeculativeparameter.- Bugfix:
MathHelper.RotationQuaternion, fixed wrong/not normalized quaternion generation for largedt. - Added an additional
normalout-parameter toNarrowPhase.Distance. - Renamed
JVector.TransposedTransform(in JVector vector, in JQuaternion quat)toConjugatedTransform. - Added
Anchor1andAnchor2properties toBallSocket. - Bugfix: Skipping degenerate triangles in
TriangleMeshnow works correctly.
Jitter 2.6.5 (2025-05-21)
- Rigid bodies now activate on velocity or force changes.
- Removed FatTriangleShape.
- Renamed 'Active' to 'ActiveCount' and add span-based accessors in ReadOnlyPartitionedSet.
- Fixed bug in TriangleEdgeCollisionFilter.
Jitter 2.6.4 (2025-05-19)
- Breaking Change: Triangle winding order in
TriangleMeshis now counter-clockwise (CCW) for front-facing triangles. If you're usingTriangleMesh, swap the vertex order to maintain correct normal orientation. - Added
JTriangle.RayIntersectmethod. - Renamed
ConvexHullIntersectiontoCollisionManifold. - Modified support function for
BoxShape.
Jitter 2.6.3 (2025-05-17)
- Aligned rigid bodies (
RigidBodyData) to a 64-byte boundary (reduce false sharing). - Bugfix in speculative contacts.
Jitter 2.6.2 (2025-05-06)
- Use Generics in
NarrowPhase.cs(avoid boxing for structs implementing theISupportMappableinterface). - Added special code paths in
Contact.csfor static bodies (avoid unnecessary cache line invalidation). - Added
PredictPosition,PredictOrientationandPredictPosetoRigidBody. - Added
CreateFromAxisAngleandNormalizemethods inJQuaternion.
Jitter 2.6.1 (2025-04-24)
- Bugfix in
TriangleEdgeCollisionFilterfor speculative contacts.
Jitter 2.6.0 (2025-04-24)
- Added
SampleHullandMakeHulltoShapeHelper. - Fixed hill climbing getting stuck for
ConvexHullShapes. - Added SIMD support for
PointCloudShapes. - Added option to ignore degenerated triangles in
TriangleMesh. - Made thickness parameter mandatory in
FatTriangleShape. - Added Fisher-Yates shuffle to
DynamicTree.Optimize. - Optimized
TriangleEdgeCollisionFilter.
Jitter 2.5.9 (2025-04-17)
- Use
CollideEpsilon1e-5 in MPREPA. - Fixed a bug in
ShardedDictionary.
Jitter 2.5.8 (2025-04-16)
- Fixed
DynamicTree.Optimizemessing up collision pairs. - Refactored
SoftBody.cs - Improved
TriangleEdgeCollisionFilter. - Further reduced GC.
Jitter 2.5.7 (2025-04-06)
- Fixed possible crash when dynamically making bodies static.
- Improved memory footprint and reduced GC.
- Added
Loggeras a replacement forTrace.
Jitter 2.5.6 (2025-03-08)
- Fixed concurrency bug in
world.GetArbiter.
Jitter 2.5.5 (2025-03-02)
- Added implicit conversion operators for System.Numerics Vector3 and Quaternion.
- Replaced Trace.WriteLine with Trace.Information, Warning, Error.
Jitter 2.5.4 (2025-02-08)
- Renamed
JAngle.RadianttoJAngle.Radian. - Renamed namespace
Jitter2.UnmanagedMemorytoJitter2.Unmanaged. - Fixed
body.AddShape(IEnumerable<RigidBodyShape> shapes)for one-time-use iterators. - Smaller improvements in XML-documentation.
Jitter 2.5.3 (2025-01-12)
- DynamicTree,
Optimizetakes a delegate now. - Fixed
TriangleShaperay cast not returning a normalized normal. - Removed the
CollisionHelperclass. - Renamed
ActiveListandUnmanagedActiveListtoPartitionedSetandPartitionedBuffer, respectively. - Various smaller improvements (ToString() overloads, IEquality<T> implementations, XML-documentation)
Jitter 2.5.2 (2025-01-08)
- Added enumeration method to
DynamicTreeand madePairHashSetinternal. - Breaking Change: Removed
UseFullEPASolveroption. - Further improved simulation performance under high lock contention scenarios.
Jitter 2.5.1 (2024-12-31)
- Bugfix in
PairHashSet.
Jitter 2.5.0 (2024-12-23)
- Better utilization of multi core systems.
- Bugfix in collision detection (possible NaN values).
Jitter 2.4.9 (2024-12-18)
- Huge improvements for the
DynamicTreeimplementation.
Jitter 2.4.8 (2024-11-27)
- Add option to build in double precision mode.
- Made
Constraintconstructor public to allow for custom constraints.
Jitter 2.4.7 (2024-11-18)
- Breaking Change: Dropped .NET6 support, added .NET9.
- SIMD for contacts.
- Contact manifold overflow fix.
- Changed default damping.
- Improved auxiliary contact points.
- Minor API changes.
Jitter 2.4.6 (2024-10-28)
- Breaking Change: Jitter world is now constructed using World.Capacity.
- Breaking Change: World.RayCast moved to World.DynamicTree.RayCast.
- Breaking Change: Renamed NumberSubsteps to SubstepCount.
- Added split impulses. Breaking Change: SolverIterations property is now a tuple.
- Several smaller improvements in the API.
Jitter 2.4.5 (2024-10-07)
- Added new methods to NarrowPhase: Distance and Overlap.
- Breaking Change: Renamed NarrowPhase.SweepTest to NarrowPhase.Sweep.
- Breaking Change: Renamed NarrowPhase.GJKEPA to NarrowPhase.Collision.
- Made PointTest, Raycast and SweepTest to use new SimplexSolver and SimplexSolverAB implementations.
- Fixed normal in GJKEPA for separating case.
Jitter 2.4.4 (2024-09-14)
- Implemented fixes and workarounds for using Jitter with a debugger attached.
Jitter 2.4.3 (2024-08-31)
- Correct corner case beeing wrong in MPR collision detection due to typo (bug fix).
- FatTriangleShape level did not properly take transformations into account (bug fix).
Jitter 2.4.2 (2024-08-26)
- Added FatTriangleShape to give triangles thickness which can be useful for static triangle meshes.
- Removal from potential pairs in DynamicTree ignores filters from now on (bug fix).
- Use sweep tests for speculative contacts, vastly improving simulation quality in this scenario.
- Breaking Change: Redefinition of NarrowPhase.SweepTest results.
- Improved TriangleEdgeCollisionFilter.
Jitter 2.4.1 (2024-08-21)
- Improved TriangleEdgeCollisionFilter.
- Implemented analytical box and sphere ray casting.
- Made Restitution and Friction public in Contact.
- Improved DynamicTree interface.
- Added Debug.Asserts in ActiveList.
- Marked ArbiterKey as readonly.
- Added enumerator to PairHashSet.
- Changed ShapeHelper.MakeHull to take a generic of type ICollection.
Jitter 2.4.0 (2024-08-10)
- Improved TrimPotentialPairs logic.
- Optimized quaternion vector transformation.
- Extended functionality of ContactData.UsageMask.
- Breaking Change: Overhauled the shape system. Regular shapes (box, sphere, capsule, ...) now derive from RigidBodyShape. Some method signatures changed slightly, e.g. ray casting.
- Improved exceptions.
- Added ReferenceFrameAttribute.
Jitter 2.3.1 (2024-06-02)
- ReadOnly wrappers (ReadOnlyList, ReadOnlyHashset) are now structs.
- Shapes with very small dimensions might have close to zero or zero mass/inertia. Creating rigid bodies from them now throws an exception (use body.AddShape(shape, setMassInertia: false) to not use the shape's mass properties).
- Added BeginCollide and EndCollide events per body.
Jitter 2.3.0 (2024-05-20)
- Added RigidBody.RemoveShape overload to remove multiple shapes at once.
- Marked Rigid.ClearShapes deprecated.
- Breaking Change: Use JQuaternion for orientations. Sorry for the API break.
Jitter 2.2.1 (2024-04-29)
- Add optional activate parameter to world.AddShape.
- Add NarrowPhase.SweepTest.
- EPA collision detection: various improvements.
- Improve exit condition for RayCast and PointTest.
- Remove redundant ArgumentException for zero mass shapes.
- Handle zero time steps. Throw ArgumentException for negative time steps.
- Add joint base class to joint classes.
Jitter 2.2.0 (2024-01-02)
- Breaking Change: Renamed
RaycasttoRayCast. world.Remove(world.NullBody)does now remove all shapes, constraints and contacts associated with NullBody.world.AddShape(shape)respects the activation state of the associated rigid body. Most notable: performance improvement when directly addingTriangleShapes to world.NullBody for static geometry.- Performance improvements for ConvexHullShape.
- Improved termination condition in GJKEPA collision detection.
Jitter 2.1.1 (2023-12-17)
- Fixed O(n^2) problem in
TriangleMeshdue to hash collisions. WorldBoundingBoxofShapeis now updated even if noRigidBodyis attached.
Jitter 2.1.0 (2023-12-10)
- Added debug drawing for rigid bodies (
RigidBody.DebugDraw). - Fixed a bug in
CalculateMassInertiawithinTransformedShape.cs. - Improved ray casting performance and introduced
NarrowPhase.PointTest. - Breaking Change: Inverted behavior of
BroadPhaseCollisionFilter. - Breaking Change: Inverted definition of damping factors in
RigidBody.Damping(0 = no damping, 1 = immediate halt). - Added
RigidBody.SetMassInertiaoverload to enable setting the inverse inertia to zero. - An exception is now thrown when a body's mass is set to zero.
- Fixed a bug in the friction handling in
Contact.cs.
Jitter 2.0.1 (2023-10-28)
- Fixed a bug in contact initialization which affected soft body physics.
Jitter 2.0.0 (2023-10-22)
Initial stable Release.