@absolutejs/rapier3d 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -375,3 +375,37 @@ This calculation runs when mass properties are recomputed. It is not a render
375
375
  optimization: recompute after geometry/mass changes, not unnecessarily every
376
376
  frame. Qualification records, measured cost and limits are retained under
377
377
  `absolutejs/research/inertia-reconstruction/`.
378
+
379
+
380
+ ## Matched isolated-body rotation and observations (0.14)
381
+
382
+ An isolated, awake dynamic body with gyroscopic forces enabled now uses a
383
+ bounded implicit midpoint angular update with its matching Cayley attitude.
384
+ This substantially reduces free-flight angular energy and world-momentum drift.
385
+ The path requires physical stored inertia, unlocked angular axes, zero external
386
+ torque and angular damping, and ordinary rotation limits. Contact-connected,
387
+ jointed, articulated, soft/FEM and fast-rotation bodies retain their existing
388
+ solver path. This does not correct coupled angular/contact integration or the
389
+ remaining articulated COM-transport defect.
390
+
391
+ A rejected update does not partially mutate state. Nonphysical stored moments,
392
+ rotation limits and failed/invalid solves are observed explicitly; the existing
393
+ correction/cap ordering applies for the rest of that island solve. The next solve
394
+ re-evaluates eligibility. No energy or momentum clamp is introduced.
395
+
396
+ With `world.profilerEnabled = true`, `world.freeRotationStats()` returns owned
397
+ counts (`acceptedSteps`, `nonphysicalInertiaRejections`, `rotationLimitRejections`,
398
+ `invalidOrFailedSolves`), maximum Newton updates, and maximum accepted residual
399
+ in radians/second. It returns null before a completed profiled step, after
400
+ restoration, while profiling is disabled or after toggling it. Counts include
401
+ solver substeps and CCD passes; zero acceptance does not establish conservation.
402
+ The bounded `createPhysicsStepProfiler` includes these observations as each
403
+ sample's `native.freeRotation`, with the same sample and ownership limits.
404
+
405
+ The 96-case native matrix reduces worst relative angular-energy drift from
406
+ 3.2% to 0.00026%; 542 excluded/rejected control states match the previous release
407
+ exactly. On a synthetic 32-body CPU/WASM workload the median paired additional
408
+ cost is approximately 0.7 microseconds per body/substep (2.9x batch ratio).
409
+ These are fixture measurements, not game-wide guarantees or hardware FPS.
410
+ Admission, numerical/storage limits, actual-engine tests, failed assumptions and
411
+ cost records are preserved in `absolutejs/research/rigid-midpoint-engine`.
@@ -375,3 +375,37 @@ This calculation runs when mass properties are recomputed. It is not a render
375
375
  optimization: recompute after geometry/mass changes, not unnecessarily every
376
376
  frame. Qualification records, measured cost and limits are retained under
377
377
  `absolutejs/research/inertia-reconstruction/`.
378
+
379
+
380
+ ## Matched isolated-body rotation and observations (0.14)
381
+
382
+ An isolated, awake dynamic body with gyroscopic forces enabled now uses a
383
+ bounded implicit midpoint angular update with its matching Cayley attitude.
384
+ This substantially reduces free-flight angular energy and world-momentum drift.
385
+ The path requires physical stored inertia, unlocked angular axes, zero external
386
+ torque and angular damping, and ordinary rotation limits. Contact-connected,
387
+ jointed, articulated, soft/FEM and fast-rotation bodies retain their existing
388
+ solver path. This does not correct coupled angular/contact integration or the
389
+ remaining articulated COM-transport defect.
390
+
391
+ A rejected update does not partially mutate state. Nonphysical stored moments,
392
+ rotation limits and failed/invalid solves are observed explicitly; the existing
393
+ correction/cap ordering applies for the rest of that island solve. The next solve
394
+ re-evaluates eligibility. No energy or momentum clamp is introduced.
395
+
396
+ With `world.profilerEnabled = true`, `world.freeRotationStats()` returns owned
397
+ counts (`acceptedSteps`, `nonphysicalInertiaRejections`, `rotationLimitRejections`,
398
+ `invalidOrFailedSolves`), maximum Newton updates, and maximum accepted residual
399
+ in radians/second. It returns null before a completed profiled step, after
400
+ restoration, while profiling is disabled or after toggling it. Counts include
401
+ solver substeps and CCD passes; zero acceptance does not establish conservation.
402
+ The bounded `createPhysicsStepProfiler` includes these observations as each
403
+ sample's `native.freeRotation`, with the same sample and ownership limits.
404
+
405
+ The 96-case native matrix reduces worst relative angular-energy drift from
406
+ 3.2% to 0.00026%; 542 excluded/rejected control states match the previous release
407
+ exactly. On a synthetic 32-body CPU/WASM workload the median paired additional
408
+ cost is approximately 0.7 microseconds per body/substep (2.9x batch ratio).
409
+ These are fixture measurements, not game-wide guarantees or hardware FPS.
410
+ Admission, numerical/storage limits, actual-engine tests, failed assumptions and
411
+ cost records are preserved in `absolutejs/research/rigid-midpoint-engine`.
@@ -1 +1 @@
1
- var e=Object.freeze({schemaVersion:1,scope:"package",packageName:"@absolutejs/rapier3d",packageVersion:"0.13.0",qualifiedKernelRelease:"0.13.0",upstream:"b716d375efc0201003f0cd9ef7168eee0b62c177",engine:"0.36.0",collisionLibraryVersion:"0.31.1",collisionSource:"git+https://github.com/absolutejs/parry?rev=c566aabd77be8ac7a427c2b704860c47e34657b9#c566aabd77be8ac7a427c2b704860c47e34657b9",bindings:"0.21.0",bindgen:"0.2.129",wasmSha256:"a6f06627b5b95ff15b87fbe45bf8dfd19eeb78b4f949a912e3fed5805fbcc62b",wasmBytes:3298974,solverChanges:!0});export{e as buildInfo};
1
+ var e=Object.freeze({schemaVersion:1,scope:"package",packageName:"@absolutejs/rapier3d",packageVersion:"0.14.0",qualifiedKernelRelease:"0.14.0",upstream:"b716d375efc0201003f0cd9ef7168eee0b62c177",engine:"0.36.0",collisionLibraryVersion:"0.31.1",collisionSource:"git+https://github.com/absolutejs/parry?rev=c566aabd77be8ac7a427c2b704860c47e34657b9#c566aabd77be8ac7a427c2b704860c47e34657b9",bindings:"0.21.0",bindgen:"0.2.129",wasmSha256:"0923de1a2b4be66faf2a17e602c566b227457cd511ef4ea6bab799c9d227af6c",wasmBytes:3307201,solverChanges:!0});export{e as buildInfo};
@@ -2,15 +2,15 @@
2
2
  "schemaVersion": 1,
3
3
  "scope": "package",
4
4
  "packageName": "@absolutejs/rapier3d",
5
- "packageVersion": "0.13.0",
6
- "qualifiedKernelRelease": "0.13.0",
5
+ "packageVersion": "0.14.0",
6
+ "qualifiedKernelRelease": "0.14.0",
7
7
  "upstream": "b716d375efc0201003f0cd9ef7168eee0b62c177",
8
8
  "engine": "0.36.0",
9
9
  "collisionLibraryVersion": "0.31.1",
10
10
  "collisionSource": "git+https://github.com/absolutejs/parry?rev=c566aabd77be8ac7a427c2b704860c47e34657b9#c566aabd77be8ac7a427c2b704860c47e34657b9",
11
11
  "bindings": "0.21.0",
12
12
  "bindgen": "0.2.129",
13
- "wasmSha256": "a6f06627b5b95ff15b87fbe45bf8dfd19eeb78b4f949a912e3fed5805fbcc62b",
14
- "wasmBytes": 3298974,
13
+ "wasmSha256": "0923de1a2b4be66faf2a17e602c566b227457cd511ef4ea6bab799c9d227af6c",
14
+ "wasmBytes": 3307201,
15
15
  "solverChanges": true
16
16
  }