## 0.19.3 (05 Nov. 2025) - Significantly improve performances of `combineVoxelStates`. ### 0.19.2 (17 Oct. 2025) - Fix bug where kinematic bodies would not wake up when setting its velocity. - Fix bug where slow-moving kinematic bodies would fall asleep. - Fix point-projection on voxels shapes. ### 0.19.1 (03 Oct. 2025) ### Modified - Update to Rapier 0.30.0. The only change is a [switch to a sparse storage](https://github.com/dimforge/parry/pull/380) for the Voxels shapes. This allows support for orders of magnitudes larger maps without reaching the 4GB WASM memory limit. ### 0.19.0 (05 Sept. 2025) ### Modified - Update to Rapier 0.29.0 which includes performance improvements for scenes involving a lot of contact constraints. See https://github.com/dimforge/rapier/pull/876 for details. - Renamed the `RigidBody.invPrincipalInertiaSqrt` and `.effectiveWorldInvInertiaSqrt` methods to `RigidBody.invPrincipalInertia` and `.effectiveWorldInvInertia` (removed the `Sqrt` suffix). These methods will now return the actual inverse angular inertia matrix rather than its square root. - Removed methods related to the legacy PGS solver: `World.numAdditionalFrictionIterations`, `switchToStandardPgsSolver`, `switchToSmallStepsPgsSolver`, `switchToSmallStepsPgsSolverWithoutWarmstart`. ### 0.18.2 (13 August 2025) ### Fixed - Fix rollup configuration adding `types: "./rapier.d.ts"` to the export config. ### 0.18.1 (8 August 2025) ### Modified - Update to Rapier 0.28.0 which includes performance improvements when CCD is active and when the user applies modification to a collider or rigid-body. ### Fix - Another attempt to fix bundlerless module import with rapier-compat. ### 0.18.0 (24 July 2025) ### Added - Add `World.timing*` functions to access the internal performances measurements if the internal profiler is enabled with `World.profilerEnabled = true`. - Add `World.maxCcdSubsteps` to get/set the max number of CCD substeps run by the engine. ### Fix - Fixed crash that would happen when removing colliders in a particular order (e.g. in the same order as their insertion). ### 0.18.0-beta.0 (12 July 2025) #### Modified - Update to Rapier 0.27.0-beta.1 which includes a fully reworked broad-phase tha supports scene queries. This implies a performance gain on large scenes by avoiding the need to re-build the underlying acceleration structure at each frame. - Un-deprecate methods for reading shape properties (for example `collider.radius()`). It turned out that these methods are more convenient as they are guaranteed to always be in sync with rapier’s state on wasm. - Add `collider.translationWrtParent()` and `collider.rotationWrtParent()` to get the collider’s translation/rotation relative to its parent rigid-body. #### Fix - rapier-compat top level javascript files extensions have been changed from `.cjs.js` and `.es.js` to `.cjs` and `mjs` respectively. This results in better compatibility with NPM. ### 0.17.3 (30 May 2025) #### Fix - The published package for 0.17.2 had a broken package.json. It is fixed on this release. ### 0.17.2 (30 May 2025) #### Added - Added the function `RAPIER.reserveMemory` to instruct the internal allocator to pre-allocate more memory in preparation for future operations. This typically called only once after initializing the WASM module. ### 0.17.1 (23 May 2025) #### Added - Added optional arguments to `World.debugRender(filterFlags, filterPredicate)` to prevent some colliders from being rendered. - Added `Collider.combineVoxelStates` to ensure two adjacent voxels colliders don’t suffer from the internal edges problem, and `Collider.propagateVoxelChange` to maintain that coupling after modifications with `.setVoxel`. ### 0.17.0 (16 May 2025) #### Fixed - Fix sensor events not triggering when hitting a voxels collider. #### Added - Added support for voxels colliders attached to dynamic rigid-bodies. - Added force calculation between colliding voxels/voxels and voxels/compound shapes. ### 0.16.2 (5 May 2025) #### Fixed - Fixed infinite loop in `collider.setVoxel`. ### 0.16.1 (2 May 2025) #### Added - Added `Collider.clearShapeCache` to release the reference to the JS shape stored in the collider, oor too force its recomputation the next time the collider shape is accessed. - Added support for shape-casting involving Voxels colliders. - Added support for CCD involving Voxels colliders. ### 0.16.0 (24 April 2025) #### Added - Added `ColliderDesc.voxels` to create a collider with a shape optimized for voxels. - Added `Collider.setVoxel` for adding or removing a voxel from a collider with a voxel shape. - Added the `Voxels` shape class. The support or voxels is still experimental. In particular the following features will currently **not** work on colliders with voxel shapes: - Voxels colliders attached to dynamic rigid-bodies will not run the automatic mass/angular inertia calculation. - Shape-casting on voxel shapes/colliders. - Collision-detection between two-voxels colliders, or a voxels collider and a mesh, polyline, or heightfield. See [parry#336](https://github.com/dimforge/parry/pull/336) for additional information. ### 0.15.1 (10 April 2025) #### Added - Added `RigidBody.velocityAtPoint` function to retrieve the velocity of a given world-space point on a rigid-body. #### Modified - Update to Rapier 0.25. The main notable change is that the `TriMeshFlags.FIX_INTERNAL_EDGES` flag will no longer imply that the `TriMeshFlags.ORIENTED` flag is set, avoiding edge-cases where enabling `FIX_INTERNAL_EDGES` results in unexpected collisions between open meshes and balls. #### Fixed - Fixed `*-simd-compat` builds not actually emitting SIMD instructions. ### 0.15.0 (06 March 2025) #### Added - Added `PidController`, `World.createPidController`, `World.removePidController` to create a Position-Integral-Derivative controller; a building block for building velocity-based dynamic character controllers. #### Modified - Update to Rapier 0.24. - Package tree shaking has been disabled to avoid a crash on certain build configuration (#289). - Multiple packages with different feature sets are now released, and their build process has been automated (#309) - Released packages are: - rapier2d - rapier2d-compat - rapier2d-simd - rapier2d-simd-compat - rapier2d-deterministic - rapier2d-deterministic-compat - rapier3d - rapier3d-compat - rapier2d - rapier2d-compat - rapier3d-simd - rapier3d-simd-compat - rapier3d-deterministic - rapier3d-deterministic-compat - :warning: To this occasion, existing packages `rapier2d` and `rapier3d` are now built without `enhanced-determinism` feature enabled, so if you rely on that feature, you should migrate to the new `-deterministic` flavor. ### 0.14.0 (20 July 2024) #### Modified - Update from the rust library of rapier 0.19 to 0.22, see [rapier's changelog](https://github.com/dimforge/rapier/blob/master/CHANGELOG.md#v0210-23-june-2024) for more context. #### Added - Added `RigidBody.userForce` function to retrieve the constant force(s) the user added to a rigid-body - Added `RigidBody.userTorque` function to retrieve the constant torque(s) the user added to a rigid-body ### 0.13.1 (2024-05-08) #### Fixed - Fix regression that could cause missed contact between a ball and another shape type. ### 0.13.0 (2024-05-05) Several stability improvements are added as part of this release. See [rapier#625](https://github.com/dimforge/rapier/pull/625) for overviews of the most important improvements. #### Modified - The `castShape` and `castCollider` functions have been modified to add a `targetDistance` parameter. This parameter indicates the distance below which a hit is detected. - Rename `RayIntersection.toi` to `.timeOfImpact` for better clarity. - Rename `RayColliderIntersection.toi` to `.timeOfImpact` for better clarity. - Rename `RayColliderToi` to `RayColliderHit`. - Rename `RayColliderHit.toi` to `.timeOfImpact` for better clarity. - Rename `ShapeTOI` to `ShapeCastHit`. - Rename `ShapeColliderTOI` to `ColliderShapeCastHit`. - Rename `ShapeCastHit.toi` to `.timeOfImpact`. #### Added - Fix the kinematic character controller getting stuck against vertical walls. - Add `KinematicCharacterController.normalNudgeFactor` and `.setNormalNudgeFactor` so set a coefficient used for avoiding having the character controller get stuck on penetrations. - Add `RigidBody.softCcdPrediction`, `.setSoftCcdPrediction`, and `RigidBodyDesc.setSoftCcdPrediction` for configuring soft-ccd on the rigid-body. See [rapier#625](https://github.com/dimforge/rapier/pull/625) for additional details on soft-ccd. - 3D version only: add `TriMeshFlags::FIX_INTERNAL_EDGES` and `HeightFieldFlags::FIX_INTERNAL_EDGES` for enabling internal edges correction (which is no longer enabled by default). The flags have been added as an optional parameter when building the shapes. - Add `Collider.contactSkin`, `.setContactSkin`, and `ColliderDesc.setContactSkin` for configuring the collider’s contact skin. See [rapier#625](https://github.com/dimforge/rapier/pull/625) for additional details on contact skins. - Add `World.lengthUnit` which can be used to indicate the typical size of dynamic objects (e.g. 100 pixels instead of 1 meter). This helps the physics engine adjust internal thresholds for better results. #### Fixed - Fix an issue where the reported contact force are lower than their actual value. ### 0.12.0 (2024-01-28) The main highlight of this release is the implementation of a new non-linear constraints solver for better stability and increased convergence rates. See [#579](https://github.com/dimforge/rapier/pull/579) for additional information. In order to adjust the number of iterations of the new solver, simply adjust `World.numSolverIterations`. If recovering the old solver behavior is useful to you, call `World.switchToStandardPgsSolver()`. It is now possible to specify some additional solver iteration for specific rigid-bodies (and everything interacting with it directly or indirectly through contacts and joints): `RigidBodyDesc.additionalSolverIterations` and `RigidBody::setAdditionalSolverIterations`. This allows for higher-accuracy on subsets of the physics scene without affecting performance of the other parts of the simulation. #### Modified - Renamed `CharacterController.translationApplied`, `.translationRemaining` and the `desiredTranslation` method argument to `CharacterController.translationDeltaApplied`, `.translationDeltaRemaining` and the `desiredTranslationDelta` to avoid confusion with the usage of the `translation` world in `RigidBody.translation()`. #### Added - Added `DynamicRayCastVehicleController` to simulate vehicles based on ray-casting. - Added `JointData.generic` (3D only) to create a generic 6-dof joint and manually specify the locked axes. ### 0.11.2 #### Fixed - Fix bug that made dynamic rigid-bodies behave like kinematic bodies after being disabled and then re-enabled. - Fix issue with convex polyhedron jitter due to missing contacts. - Fix character controller getting stuck against vertical walls. - Fix character controller’s snapping to ground not triggering sometimes. - Fix character controller’s horizontal offset being mostly ignored and some instances of vertical offset being ignored. #### Added - Add `JointData.spring` and `JointData.rope` joints. - Add access to the mass-properties of a rigid-body: `RigidBody.effectiveInvMass`, `.invMass()`, `.localCom()`, `.worldCom()`, `.invPrincipalInertiaSqrt()`, `.principalInertia()`, `.principalInertiaLocalFrame()`, `.effectiveWorldInvInertiaSqrt()`, `.effectiveAngularInertia()`. - Add `DynamicRayCastVehicleController.siteFrictionStiffness` to customize the side friction applied to the vehicle controller’s wheel. #### Modified - Rename `World.contactsWith` to `World.contactPairsWith`. - Rename `World.intersectionsWith` to `World.intersectionPairsWith`. ### 0.11.1 (2023-01-16) #### Fixed - Fix bug that disabled all colliders at construction time. ### 0.11.0 (2023-01-15) #### Added - Add `World.propagateModifiedBodyPositionsToColliders` to propagate rigid-bodies position changes to their attached colliders. - Add `World.updateSceneQueries` to update the scene queries data structures without stepping the whole simulation. - Add `RigidBody.isEnabled, RigidBody.setEnabled, RigidBodyDesc.setEnabled` to disable a rigid-body (and all its attached colliders) without removing it from the physics world. - Add `Collider.isEnabled, Collider.setEnabled, ColliderDesc.setEnabled` to disable a collider without removing it from the physics world. - Add shape-specific methods to modify a collider’s size: `Collider.setRadius, setHalfExtents, setRoundRadius, setHalfHeight`. #### Modified - Add a boolean argument to `RigidBody.setBodyType` to indicate if the rigid-body should awaken after changing its type. #### Fixed - Fix rigid-bodies automatically waking up at creation even if they were explicitly created sleeping. ### 0.10.0 (2022-11-06) #### Added - Add `World.createCharacterController`, `World.removeCharacterController` to create/remove a kinematic character controller. - Add a character-controller implementation with the `KinematicCharacterController` class and its method `KinematicCharacterController.computeColliderMovement`. The character controller features currently supported are: - Slide on uneven terrains - Interaction with dynamic bodies. - Climb stairs automatically. - Automatically snap the body to the floor when going downstairs. - Prevent sliding up slopes that are too steep - Prevent sliding down slopes that are not steep enough - Interactions with moving platforms. - Report information on the obstacles it hit on its path. - Add the `HalfSpace` (infinite plane) shape. Colliders with this shape can be built using `ColliderDesc.halfspace`. #### Modified - Change the signature of `Collider.castShape` and World.castShape by adding a boolean argument `stop_at_penetration` before the filter-related arguments. Set this argument to `true` to get the same result as before. If this is set to `false` and the shape being cast starts it path already intersecting another shape, then a hit won’t be returned with that intersecting shape unless the casting movement would result in more penetrations. - Reduce rounding errors in 3D when setting the rotation of a rigid-body or collider. #### Fixed - Fix incorrect application of torque if the torque is applies right after setting the rigid-body’s position, but before calling `World.step`. ### 0.9.0 (2022-10-07) #### Fixed - Fix unpredictable broad-phase panic when using small colliders in the simulation. - Fix collision events being incorrectly generated for any shape that produces multiple contact manifolds (like triangle meshes). #### Modified - The `RigidBodyDesc.setAdditionalMass` method will now result in the additional angular inertia being automatically computed based on the shapes of the colliders attached to the rigid-body. - Removed the method `RigidBodyDesc.setAdditionalPrincipalAngularInertia`. Use `RigidBodyDesc.setAdditionalMassProperties` instead. - The methods of `RigidBodyDesc` and `ColliderDesc` will now always copy the object provided by the user instead of storing the object itself. - The following method will now copy the user’s objects instead of storing it: `ColliderDesc.setRotation`, `ColliderDesc.setMassProperties`, `RigidBodyDesc.setRotation`, `RigidBodyDesc.setAdditionalMassProperties`, `RigidBodyDesc.setAngvel`. - Rename `RigidBody.restrictRotations` and `RigidBody.restrictTranslations` to `RigidBody.setEnabledRotations` and `RigidBody.setEnabledTranslations`. - Rename `RigidBodyDesc.restrictRotations` and `RigidBodyDesc.restrictTranslations` to `RigidBodyDesc.enabledRotations` and `RigidBodyDesc.enabledTranslations`. #### Added - Add `ImpulseJoint.setContactsEnabled`, and `MultibodyJoint.setContactsEnabled` to set whether contacts are enabled between colliders attached to rigid-bodies linked by this joint. - Add `UnitImpulseJoint.setLimits` to set the limits of a unit joint. - Add `RigidBody.recomputeMassPropertiesFromColliders` to force the immediate computation of a rigid-body’s mass properties (instead of waiting for them to be recomputed during the next timestep). This is useful to be able to read immediately the result of a change of a rigid-body additional mass-properties or a change of one of its collider’s mass-properties. - Add `RigidBody::setAdditionalMass` to set the additional mass for the rigid-body. The additional angular inertia is automatically computed based on the attached colliders shapes. If this automatic angular inertia computation isn’t desired, use `RigidBody::setAdditionalMassProperties` instead. - Add `Collider.setDensity`, `.setMass`, `.setMassProperties`, to alter a collider’s mass properties. Note that `.setMass` will result in the collider’s angular inertia being automatically computed based on this mass and on its shape. - Add `ColliderDesc.setMass` to set the mass of the collider instead of its density. Its angular inertia tensor will be automatically computed based on this mass and its shape. - Add more filtering options for scene-queries. All the scene query methods now take additional optional arguments to indicate if one particular collider, rigid-body, or type of colliders/rigid-bodies have to be ignored by the query. - Add force reporting based on contact force events. The `EventHandler` trait has been modified to include the method `EventQueue.drainContactForceEvents`. Contact force events are generated whenever the sum of the magnitudes of all the forces between two colliders is greater than any of their `Collider.contactForceEventThreshold` values (only the colliders with the `ActiveEvents.CONTACT_FORCE_EVENT` flag set are taken into account for this threshold). ### 0.8.1 (2022-04-06) Starting with this release, all the examples in `testbed2d` and `testbed3d` have been updated to `webpack 5`, and are written in Typescript. In addition, canary `0.0.0` releases will be generated automatically after each merge to the `master` branch. #### Fixed - Fix bug causing `World.intersectionPair` to always return `false`. ### 0.8.0 (2022-03-31) #### Breaking changes - Most APIs that relied on rigid-body handles or collider handles have been modified to rely on `RigidBody` or `Collider` objects instead. Handles are now only needed for events and hooks. - Rename STATIC to FIXED in the `ActiveCollisionTypes` flags. - The `RigidBody.applyForce` and `.applyTorque` methods have been replaced by `.addForce` and `.addTorque`. These force/torques are no longer automatically zeroed after a timestep. To zero them manually, call `.resetForce` or `.resetTorque`. - The `EventQueue.drainContactEvents` and `EventQueue.drainIntersectionEvents` have been merged into a single method: `EventQueue:drainCollisionEvents`. #### Added - Add a lines-based debug-renderer. See [#119](https://github.com/dimforge/rapier.js/pull/119) for examples of integration of the debug-renderer with `THREE.js` and `PIXI.js`. - Each rigid-body, collider, impulse joint, and multibody joint now have a unique object instance. This instance in only valid as long as the corresponding objects is inserted to the `World`. - Add a `wakeUp: bool` argument to the `World.createImpulseJoint` and `MultibodyJointSet::createMultibodyJoint` to automatically wake-up the rigid-bodies attached to the inserted joint. - Add a `filter` callback to all the scene queries. Use this for filtering more fine-grained than collision groups. - Add `collider.shape` that represents the shape of a collider. This is a more convenient way of reading the collider’s shape properties. Modifying this shape will have no effect unless `collider.setShape` is called with the modified shape. - Add `Collider.containsPoint`, `.projectPoint`, `.intersectsRay`, `.castShape`, `.castCollider`, `.intersectsShape`, `.contactShape`, `.contactCollider`, `.castRay`, `.castRayAndGetNormal`. - Add `Shape.containsPoint`, `.projectPoint`, `.intersectsRay`, `.castShape`, `.intersectsShape`, `.contactShape`, `.castRay`, `.castRayAndGetNormal`. - Add `World.projectPointAndGetFeature` which includes the feature Id the projected point lies on. - Add `RigidBodyDesc.sleeping` to initialize the rigid-body in a sleeping state. ### 0.8.0-alpha.2 (2022-03-20) The changelog hasn’t been updated yet. For an overview of the changes, refer to the changelog for the unreleased Rust version: https://github.com/dimforge/rapier/blob/master/CHANGELOG.md#unreleased ### 0.8.0-alpha.1 (2022-01-28) #### Fixed - Fix a crash when calling `collider.setShape`. - Fix a crash when calling `world.collidersWithAabbIntersectingAabb`. - Fix damping not being applied properly to some rigid-bodies. ### 0.8.0-alpha.0 (2022-01-16) This release updates to Rapier 0.12.0-alpha.0 which contains: - A **complete rewrite** of the joint and contact constraint solver. - The support for locking individual translation axes. - The support for multibody joint. This is an **alpha** release because the new solver still needs some tuning, and the spherical joint motors/limits is currently not working. #### Breaking changes - In 3D: renamed `BallJoint` to `SphericalJoint`. - In 2D: renamed `BallJoint` to `RevoluteJoint`. - Remove the joint motors and limits for the spherical joint (this is a temporary removal until with leave alpha). - All the joint-related structures and methods (`RevoluteJoint`, `PrismaticJoint`, `createJoint`, etc.) have renamed to include `impulse` in the names: `RevoluteImpulseJoint`, `PrismaticImpulseJoint`, `createImpulseJoint`, etc. This is to differentiate them from the new multibody joints. - Remove from the integration parameters all the parameters that are no longer meaningful (`maxPositionIterations`, `jointErp`, `warmstartCoeff`, `allowedAngularError`, `maxLinearCorrection`, `maxAngularCorrection`). #### Added - Add multibody joints. They are created the same way as impulse joints, except that they are created by `world.createMultibodyJoint` instead of `world.createImpulseJoint`. - Add the ability to lock individual translation axes. Use `rigidBody.restrictTranslation`. #### Fixed - Fixed an issue with velocity-based kinematic bodies applying kinematic rotation improperly. - Fixed the second witness points and normals returned by shape-casts. - Fixed the second local contact normal and points returned by contact manifolds. ### 0.7.6 This release updates to Rapier 0.11.1 which contains several bug fixes. #### Fixed - Fix a bug causing large moving colliders to miss some collisions after some time. - Fix invalid forces generated by contacts with position-based kinematic bodies. - Fix a bug where two colliders without parent would not have their collision computed even if the appropriate flags were set. ### 0.7.5 #### Fixed - Fixed an issue where a collider with no parent attached would not be created under some conditions. ### 0.7.4 This release was broken and has been unpublished. ### 0.7.3 #### Fixed - The `collider.halfExtents()` methods now returns a valid value for round cuboids. ### 0.7.2 (rapier-compat only) #### Modified - The `rapier-compat` packages don’t need the `Buffer` polyfill anymore. ### 0.7.1 #### Modified - Update to use Rapier 0.11.0. - The `rapier-compat` packages are now generated by rollup. ### v0.7.0 The typescripts bindings for Rapier have a [brand new user-guide](https://rapier.rs/docs/user_guides/javascript/getting_started_js) covering all the features of the physics engine! ### Breaking change - The `World.castRay` and `World.castRayAndGetNormal` methods have a different signature now, making them more flexible. - Rename `ActiveHooks::FILTER_CONTACT_PAIR` to `ActiveHooks.FILTER_CONTACT_PAIRS`. - Rename `ActiveHooks::FILTER_INTERSECTION_PAIR` to `ActiveHooks.FILTER_INTERSECTION_PAIRS`. - Rename `BodyStatus` to `RigidBodyType`. - Rename `RigidBody.bodyStatus()` to `RigidBody.bodyType()`. - Rename `RigidBodyDesc.setMassProperties` to `RigidBodyDesc.setAdditionalMassProperties`. - Rename `RigidBodyDesc.setPrincipalAngularInertia` to `RigidBodyDesc.setAdditionalPrincipalAngularInertia`. - Rename `ColliderDesc.setIsSensor` to `ColliderDesc.setSensor. #### Added - Add `Ray.pointAt(t)` that conveniently computes `ray.origin + ray.dir * t`. - Add access to joint motors by defining each joint with its own class deriving from `Joint`. Each joint now have its relevant motor configuration methods: `configurMotorModel, configureMotorVelocity, configureMotorPosition, configureMotor`. - Add `World.collidersWithAabbIntersectingAabb` for retrieving the handles of all the colliders intersecting the given AABB. - Add many missing methods for reading/modifying a rigid-body state after its creation: - `RigidBody.lockTranslations` - `RigidBody.lockRotations` - `RigidBody.restrictRotations` - `RigidBody.dominanceGroup` - `RigidBody.setDominanceGroup` - `RigidBody.enableCcd` - Add `RigidBodyDesc.setDominanceGroup` for setting the dominance group of the rigid-body being built. - Add many missing methods for reading/modifying a collider state after its creation: - `Collider.setSendor` - `Collider.setShape` - `Collider.setRestitution` - `Collider.setFriction` - `Collider.frictionCombineRule` - `Collider.setFrictionCombineRule` - `Collider.restitutionCombineRule` - `Collider.setRestitutionCombineRule` - `Collider.setCollisionGroups` - `Collider.setSolverGroups` - `Collider.activeHooks` - `Collider.setActiveHooks` - `Collider.activeEvents` - `Collider.setActiveEvents` - `Collider.activeCollisionTypes` - `Collider.setTranslation` - `Collider.setTranslationWrtParent` - `Collider.setRotation` - `Collider.setRotationWrtParent` - Add `ColliderDesc.setMassProperties` for setting explicitly the mass properties of the collider being built (instead of relying on density). #### Modified - Colliders are no longer required to be attached to a rigid-body. Therefore, the second argument of `World.createCollider` is now optional. ### v0.6.0 #### Breaking changes - The `BodyStatus::Kinematic` variant has been replaced by `BodyStatus::KinematicPositionBased` and `BodyStatus::KinematicVelocityBased`. Position-based kinematic bodies are controlled by setting (at each frame) the next kinematic position of the rigid-body (just like before), and the velocity-based kinematic bodies are controlled by setting (at each frame) the velocity of the rigid-body. - The `RigidBodyDesc.newKinematic` has been replaced by `RigidBodyDesc.newKinematicPositionBased` and `RigidBodyDesc.newKinematicVelocityBased` in order to build a position-based or velocity-based kinematic body. - All contact and intersection events are now disabled by default. The can be enabled for each collider individually by setting its `ActiveEvents`: `ColliderDesc.setActiveEvents(ActiveEvents.PROXIMITY_EVENTS | ActiveEvents.ContactEvents)`. #### Added - It is now possible to read contact information from the narrow-phase using: - `world.narrowPhase.contactsWith(collider1, callback)` - `world.narrowPhase.intersectionsWith(collider1, callback)` - `world.narrowPhase.contactPair(collider1, collider2, callback)` - `world.narrowPhase.intersectionPair(collider1, collider2, callback)` - It is now possible to apply custom collision-detection filtering rules (more flexible than collision groups) based on a JS object by doing the following: - Enable physics hooks for the colliders you want the custom rules to apply to: `ColliderDesc.setActiveHooks(ActiveHooks.FILTER_CONTACT_PAIR | ActiveHooks.FILTER_CONTACT_PAIR)` - Define an object that implements the `PhysicsHooks` interface. - Pass and instance of your physics hooks object as the second argument of the `World.step` method. - It is now possible to enable collision-detection between two non-dynamic bodies (e.g. between a kinematic body and a fixed body) by setting the active collision types of a collider: `ColliderDesc.setActiveCollisionTypes(ActiveCollisionTypes.ALL)` ### v0.5.3 - Fix a crash when loading the WASM file on iOS safari. ### v0.5.2 - Fix a crash that could happen after adding and then removing a collider right away, before stepping the simulation. ### v0.5.1 - Fix a determinism issue after snapshot restoration. ### v0.5.0 - Significantly improve the broad-phase performances when very large colliders are used. - Add `RigidBodyDesc::setCcdEnabled` to enable Continuous Collision Detection (CCD) for this rigid-body. CCD ensures that a fast-moving rigid-body doesn't miss a collision (the tunneling problem). #### Breaking changes: - Removed multiple fields from `IntegrationParameters`. These were unused parameters. ### v0.4.0 - Fix a bug in ball/convex shape collision detection causing the ball to ignore penetrations with depths greater than its radius. Breaking changes: - Removed `IntegrationParameters.restitutionVelocityThreshold` and `IntegrationParameters.set_restitutionVelocityThreshold`. ### v0.3.1 - Fix crash happening when creating a collider with a `ColliderDesc.convexHull` shape. - Actually remove the second argument of `RigidBodyDesc.setMass` as mentioned in the 0.3.0 changelog. - Improve snapshotting performances. ### v0.3.0 #### Added - Added a `RAPIER.version()` function at the root of the package to retrieve the version of Rapier as a string. Several geometric queries have been added (the same methods have been added to the `QueryPipeline` too): - `World.intersectionsWithRay`: get all colliders intersecting a ray. - `World.intersectionWithShape`: get one collider intersecting a shape. - `World.projectPoint`: get the projection of a point on the closest collider. - `World.intersectionsWithPoint`: get all the colliders containing a point. - `World.castShape`: get the first collider intersecting a shape moving linearly (aka. sweep test). - `World.intersectionsWithShape`: get all the colliders intersecting a shape. Several new shape types are now supported: - `RoundCuboid`, `Segment`, `Triangle`, `RoundTriangle`, `Polyline`, `ConvexPolygon` (2D only), `RoundConvexPolygon` (2D only), `ConvexPolyhedron` (3D only), `RoundConvexPolyhedron` (3D only), `RoundCone` (3D only). It is possible to build `ColliderDesc` using these new shapes: - `ColliderDesc.roundCuboid`, `ColliderDesc.segment`, `ColliderDesc.triangle`, `ColliderDesc.roundTriangle`, `ColliderDesc.convexHull`, `ColliderDesc.roundConvexHull`, `ColliderDesc.Polyline`, `ColliderDesc.convexPolyline` (2D only), `ColliderDesc.roundConvexPolyline` (2D only), `ColliderDesc.convexMesh` (3D only),`ColliderDesc.roundConvexMesh` (3D only), `ColliderDesc.roundCone` (3D only). It is possible to specify different rules for combining friction and restitution coefficients of the two colliders involved in a contact with: - `ColliderDesc.frictionCombineRule`, and `ColliderDesc.restitutionCombineRule`. Various RigidBody-related getter and setters have been added: - `RigidBodyDesc.newStatic`, `RigidBodyDesc.newDynamic`, and `RigidBodyDesc.newKinematic` are new static method, short equivalent to `new RigidBodyDesc(BodyStatus.Static)`, etc. - `RigidBodyDesc.setGravityScale`, `RigidBody.gravityScale`, `RigidBody.setGravityScale` to get/set the scale factor applied to the gravity affecting a rigid-body. Setting this to 0.0 will make the rigid-body ignore gravity. - `RigidBody.setLinearDamping` and `RigidBody.setAngularDamping` to set the linear and angular damping of the rigid-body. - `RigidBodyDesc.restrictRotations` to prevent rotations along specific coordinate axes. This replaces the three boolean arguments previously passed to `.setPrincipalAngularInertia`. #### Breaking changes Breaking changes related to rigid-bodies: - The `RigidBodyDesc.setTranslation` and `RigidBodyDesc.setLinvel` methods now take the components of the translation directly as arguments instead of a single `Vector`. - The `RigidBodyDesc.setMass` takes only one argument now. Use `RigidBodyDesc.lockTranslations` to lock the translational motion of the rigid-body. - The `RigidBodyDesc.setPrincipalAngularInertia` no longer have boolean parameters to lock rotations. Use `RigidBodyDesc.lockRotations` or `RigidBodyDesc.restrictRotations` to lock the rotational motion of the rigid-body. Breaking changes related to colliders: - The `ColliderDesc.setTranslation` method now take the components of the translation directly as arguments instead of a single `Vector`. - The `roundRadius` fields have been renamed `borderRadius`. - The `RawShapeType.Polygon` no longer exists. For a 2D convex polygon, use `RawShapeType.ConvexPolygon` instead. - All occurrences of `Trimesh` have been replaced by `TriMesh` (note the change in case). Breaking changes related to events: - Rename all occurrences of `Proximity` to `Intersection`. - The `Proximity` enum has been removed. - The `drainIntersectionEvents` (previously called `drainProximityEvent`) will now call a callback with arguments `(number, number, boolean)`: two collider handles, and a boolean indicating if they are intersecting. Breaking changes related to scene queries: - The `QueryPipeline.castRay` method now takes two additional parameters: a boolean indicating if the ray should not propagate if it starts inside of a shape, and a bit mask indicating the group the ray is part of and these it interacts with. - The `World.castRay` and `QueryPipeline.castRay` now return a struct of type `RayColliderHit` which no longer contains the normal at the hit point. Use the new methods `World.castRayAndGetNormal` or `QueryPipeline.castRayAndGetNormal` in order to retrieve the normal too. ### v0.2.13 - Fix a bug where `RigidBodyDesc.setMass(m)` with `m != 0.0` would cause the rotations of the created rigid-body to be locked. ### v0.2.12 - Add a boolean argument to `RigidBodyDesc.setMass` to indicate if the mass contribution of colliders should be enabled for this rigid-body or not. - Add a `RigidBody.lockRotations` method to lock all the rigid-body rotations resulting from forces. - Add a `RigidBody.lockTranslations` method to lock all the rigid-body translations resulting from forces. - Add a `RigidBody.setPrincipalAngularInertia` method to set the principal inertia of the rigid-body. This gives the ability to lock individual rotation axes of one rigid-body. ### v0.2.11 - Fix a bug where removing when immediately adding a collider would cause collisions to fail with the new collider. - Fix a regression causing some colliders added after a few timesteps not to be properly taken into account. ### v0.2.10 - Fix a bug where removing a collider would result in a rigid-body being removed instead. - Fix a determinism issue when running simulation on the Apple M1 processor. - Add `JointData.prismatic` and `JointData.fixed` for creating prismatic joint or fixed joints. ### v0.2.9 - Add `RigidBody.setLinvel` to set the linear velocity of a rigid-body. - Add `RigidBody.setAngvel` to set the angular velocity of a rigid-body. ### v0.2.8 - Add `RigidBodySet.remove` to remove a rigid-body from the set. - Add `ColliderSet.remove` to remove a collider from the set. - Add `JointSet.remove` to remove a joint from the set. - Add `RigidBodyDesc.setLinearDamping` and `RigidBodyDesc.setAngularDamping` for setting the linear and angular damping coefficient of the rigid-body to create. - Add `RigidBodyDesc.setMass`, and `RigidBodyDesc.setMassProperties` for setting the initial mass properties of a rigid-body. - Add `ColliderDesc.setCollisionGroups` to use bit-masks for collision filtering between some pairs of colliders. - Add `ColliderDesc.setSolverGroups` to use bit-masks for making the constraints solver ignore contacts between some pairs of colliders. - Add `ColliderDesc.heightfield` to build a collider with an heightfield shape. - Add `ColliderDesc.trimesh` to build a collider with a triangle mesh shape. ### v0.2.7 - Reduce snapshot size and computation times. ### v0.2.6 - Fix bug causing an unbounded memory usage when an objects falls indefinitely. ### v0.2.5 - Fix wrong result given by `RigidBody.isKinematic()` and `RigidBody.isDynamic()`. ### v0.2.4 - Add the support for round cylinder colliders (i.e. cylinders with round edges). ### v0.2.3 - Add the support for cone, cylinder, and capsule colliders. ### v0.2.2 - Fix regression causing the density and `isSensor` properties of `ColliderDesc` to not be taken into account. - Throw an exception when the parent handle passed to `world.createCollider` is not a number. ### v0.2.1 This is a significant rewrite of the JavaScript bindings for rapier. The objective of this rewrite is to make the API closer to Rapier's and remove most need for manual memory management. - Calling `.free()` is now required only for objects that live for the whole duration of the simulation. This means that it is no longer necessary to `.free()` vectors, rays, ray intersections, colliders, rigid-bodies, etc. Object that continue to require an explicit `.free()` are: - `World` and `EventQueue`. - Or, if you are not using the `World` directly: `RigidBodySet`, `ColliderSet`, `JointSet`, `IntegrationParameters`, `PhysicsPipeline`, `QueryPipeline` , `SerializationPipeline`, and `EventQueue`. - Collider.parent() now returns the `RigidBodyHandle` of its parent (instead of the `RigidBody` directly). - Colliders are now built with `world.createCollider`, i.e., `body.createCollider(colliderDesc)` becomes `world.createCollider(colliderDesc, bodyHandle)`. - Shape types are not an enumeration instead of strings: `ShapeType.Ball` and `ShapeType.Cuboid` instead of `"ball"` and `"cuboid"`. - `collider.handle` is now a field instead of a function. - `body.handle` is now a field instead of a function. - The world's gravity is now a `Vector` instead of individual components, i.e., `let world = new RAPIER.World(x, y, z);` becomes `let world = new RAPIER.World(new RAPIER.Vector3(x, y, z))`. - Most methods that took individual components as argument (`setPosition`, `setKinematicPosition`, `setRotation`, etc.) now take a `Vector` or `Rotation` structure instead. For example `rigid_body.setKinematicPosition(x, y, z)` becomes `rigid_body.setKinematicPosition(new RAPIER.Vector3(x, y, z))`. - `world.stepWithEvents` becomes `world.step` (the event queue is the last optional argument). - `RigidBodyDesc` and `ColliderDesc` now use the builder pattern. For example `let bodyDesc = new RAPIER.RigidBodyDesc("dynamic"); bodyDesc.setTranslation(x, y, z)` becomes `new RigidBodyDesc(BodyStatus.Dynamic).setTranslation(new Vector(x, y, z))`. - `ray.dir` and `ray.origin` are now fields instead of methods. - 2D rotations are now just a `number` instead of a `Rotation` struct. So instead of doing `rotation.angle`, single use the number as the rotation angle. - 3D rotations are now represented by the interface `Rotation` (with fields `{x,y,z,w}`) or the class `Quaternion`. Any object with these `{x, y, z, w}` fields can be used wherever a `Rotation` is required. - 2D vectors are now represented by the interface `Vector` (with fields `{x,y}`) or the class `Vector2`). Any object with these `{x,y}` fields can be used wherever a `Vector` is required. - 3D vectors are now represented by the interface `Vector` (with fields `{x,y,z}`) or the class `Vector3`). Any object with these `{x,y,z}` fields can be used wherever a `Vector` is required. ### v0.2.0 See changelogs for v0.2.1 instead. The NPM package for v0.2.0 were missing some files. ### v0.1.17 - Fix bug when ghost forces and/or crashes could be observed when a kinematic body touches a fixed body. ### v0.1.16 - Fix kinematic rigid-body not waking up dynamic bodies it touches. - Added `new Ray(origin, direction)` constructor instead of `Ray.new(origin, direction)`. ### v0.1.15 - Fix crash when removing a kinematic rigid-body from the World. ### v0.1.14 - Fix issues where force application functions took ownership of the JS vector, preventing the user from freeing with `Vector.free()` afterwards. ### v0.1.13 - Added `rigidBody.setNextKinematicTranslation` to set the translation of a kinematic rigid-body at the next timestep. - Added `rigidBody.setNextKinematicRotation` to set the rotation of a kinematic rigid-body at the next timestep. - Added `rigidBody.predictedTranslation` to get the translation of a kinematic rigid-body at the next timestep. - Added `rigidBody.predictedRotation` to set the rotation of a kinematic rigid-body at the next timestep. - Added `Ray` and `RayIntersection` structures for ray-casting. - Added `world.castRay` to compute the first hit of a ray with the physics scene. - Fix a bug causing a kinematic rigid-body not to teleport as expected after a `rigidBody.setPosition`. ### v0.1.12 - Added `world.removeCollider(collider)` to remove a collider from the physics world. - Added `colliderDesc.setTranslation(...)` to set the relative translation of the collider to build wrt. the rigid-body it is attached to. - Added `colliderDesc.setRotation(...)` to set the relative rotation of the collider to build wrt. the rigid-body it is attached to. ### v0.1.11 - Fix a bug causing a crash when the broad-phase proxy handles were recycled. ### v0.1.10 - Fix a determinism problem that could cause rigid-body handle allocation to be non-deterministic after a snapshot restoration. ### v0.1.9 - Added `world.getCollider(handle)` that retrieves a collider from its integer handle. - Added `joint.handle()` that returns the integer handle of the joint. ### v0.1.8 - Added `world.forEachRigidBodyHandle(f)` to apply a closure on the integer handle of each rigid-body on the world. - Added `world.forEachActiveRigidBody(f)` to apply a closure on each rigid-body on the world. - Added `world.forEachActiveRigidBodyHandle(f)` to apply a closure on the integer handle of each rigid-body on the world. - Added `rigidBody.applyForce`, `.applyTorque`, `.applyImpulse`, `.applyTorqueImpulse`, `.applyForceAtPoint`, and `.applyImpulseAtPoint` to apply a manual force or torque to a rigid-body. - Added the `EventQueue` structure that can be used to collect and iterate through physics events. - Added the `Proximity` enum that represents the proximity state of a sensor collider and another collider. - Added the `world.stepWithEvents(eventQueue)` which executes a physics timestep and collects the physics events into the given event queue. ### v0.1.7 - Added `world.getRigidBody(handle)` to retrieve a rigid-body from its handle. - Added `world.getJoint(handle)` to retrieve a joint from its handle. - Added `rigidBody.rotation()` to retrieve its world-space orientation as a quaternion. - Added `rigidBody.setTranslation(...)` to set the translation of a rigid-body. - Added `rigidBody.setRotation(...)` to set the orientation of a rigid-body. - Added `rigidBody.wakeUp()` to manually wake up a rigid-body. - Added `rigidBody_desc.setRotation(...)` to set tho orientation of the rigid-body to be created. ### v0.1.6 - Added `world.removeRigidBody(...)` to remove a rigid-body from the world.