@absolutejs/rapier3d 0.18.0 → 0.21.1

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
@@ -637,3 +637,119 @@ checks, no-std, and independent builds matching all shipped files. Three
637
637
  ordinary CPU controls are within roughly 1% of 0.17.0 in this run. See
638
638
  `absolutejs/research/contact-softness-controls/` for measured fixture costs,
639
639
  source hashes, intermediate failures and scope limitations.
640
+
641
+ ### Queued 0.19.0: explicit quadratic resistance
642
+
643
+ `solveQuadraticDragImpulse` analytically integrates one quadratic relative-flow
644
+ resistance channel with positive supplied effective inverse mass. It returns the
645
+ signed impulse, implicit relative speed, dissipated energy and separate body /
646
+ reservoir work. It is pure and does not infer shape, exposure or coefficients.
647
+ Use consistent units and the complete effective mass response; verify native
648
+ application precision. See `absolutejs/research/quadratic-drag-2026-10-31/README.md`
649
+ for the derivation, scope and evidence. Native engine qualification stays 0.18.0.
650
+
651
+ Default inertia-matrix getter results now own their six coefficients. Later
652
+ native getters cannot overwrite a matrix already returned to the caller. Passing
653
+ an explicit matrix target still reuses that target as documented.
654
+
655
+ `solveQuadraticDragPatches` evaluates up to 4,096 explicit resistance patches in
656
+ double precision at a fixed pose and returns combined linear/angular impulses.
657
+ It reports body/reservoir work and dissipation, owns its outputs and preserves
658
+ inputs. Free-body inverse mass/inertia and patch exposure are caller supplied;
659
+ this is not an articulated-fluid or full CFD model. Patch order and timestep
660
+ convergence remain measurable approximation limits.
661
+
662
+ ## Prepared solver schedules (0.20.0)
663
+
664
+ The opt-in `world.solverSchedule()` query returns owned observations from the last
665
+ completed profiled step. Like `ccdSubsteps()`, it returns `null` before such a
666
+ step, when profiling is disabled or toggled, and after snapshot restoration.
667
+ `createPhysicsStepProfiler` retains distinct owned records in `solverSchedules`, referenced by each
668
+ sample's `native.solverScheduleIndex` (omitted means entry 0). The table is always
669
+ present and cannot exceed the retained sample
670
+ count; repeated observations do not repeat the full record.
671
+
672
+ `groupVisits` counts prepared nonempty rigid-body solve groups across CCD passes.
673
+ `rigidBodyVisits` sums their rigid-body slots, while `rigidBodySubsteps` weights
674
+ those slots by each group's prepared substep count. These are visits, not unique
675
+ body identities. `minSubsteps`/`maxSubsteps` report the group range;
676
+ `minSubstepDt`/`maxSubstepDt` are durations in seconds. All four range fields are
677
+ `null` when no nonempty rigid group was prepared. Soft-particle-only work and
678
+ internal PGS sweeps are outside these counts.
679
+
680
+ This reads the actual group layout, including additional iterations propagated
681
+ through constraint-connected bodies. It does not change that layout, force
682
+ sampling, native timestep or contact policy. It is not a per-body mapping, elapsed
683
+ CPU timing, proof of force/energy accuracy, or forecast of the next step. In
684
+ particular, a previous group's substep count must not silently select gameplay
685
+ fluid-force timing when contact connectivity or CCD can change.
686
+
687
+ The native observer is qualified by independent native builds and exact full-state
688
+ comparisons across 18 fixtures / 9,240 steps against 0.19.0. Sampled local CPU
689
+ costs and limits are recorded in `absolutejs/research/solver-schedule/`.
690
+ The previous private artifacts remain archived; release availability is separate
691
+ from source qualification.
692
+
693
+ ### Bounded diagnostic profile transport
694
+
695
+ `encodePhysicsStepProfile(profile)` converts a readable report into an owned,
696
+ versioned numeric packet. `decodePhysicsStepProfile(value)` validates an unknown
697
+ packet and reconstructs owned readable observations. For example:
698
+
699
+ ```ts
700
+ const packet = encodePhysicsStepProfile(profiler.snapshot());
701
+ const restored = decodePhysicsStepProfile(JSON.parse(JSON.stringify(packet)));
702
+ ```
703
+
704
+ The codec preserves every defined observation without rounding, including null
705
+ measurements, failed samples, signed zero and explicit versus omitted default
706
+ schedule references. It excludes arbitrary application metadata and user strings.
707
+ The format tag is `absolutejs-physics-step-profile/1`; one fixed `'-0'` cell tag
708
+ preserves signed zero through JSON. Arrays are bounded to 256 entries, tuple
709
+ lengths and enums are fixed, and indices/scalars are validated. Malformed packets
710
+ throw `TypeError`. This is transport validation, not a claim of native provenance
711
+ or physical correctness. Apply normal metadata redaction outside the codec.
712
+
713
+ Readable `PhysicsStepProfile` remains the simulation-facing API. In 0.20 its
714
+ always-present `solverSchedules` table and optional sample index are part of that
715
+ schema; older readable profiles without this table are not silently upgraded.
716
+ Keep the format tag with stored packets and decode before displaying their fields.
717
+
718
+ ## Convex boundary export (0.21)
719
+
720
+ `collider.convexMeshData()` returns an owned `{vertices: Float32Array,
721
+ indices: Uint32Array}` pair from one native hull reconstruction. Use it when both
722
+ buffers are needed; separate `vertices()` and `indices()` calls each reconstruct
723
+ the hull. The query observes the current shape, so replacing a collider's shape
724
+ requires no cache invalidation. Mutating returned arrays does not change the
725
+ collider.
726
+
727
+ ```ts
728
+ const mesh = collider.convexMeshData();
729
+ if (mesh) {
730
+ // Positions are in collider-local coordinates; indices describe triangles.
731
+ uploadBoundary(mesh.vertices, mesh.indices);
732
+ }
733
+ ```
734
+
735
+ Nonconvex shapes return `undefined`. Rounded convex shapes return the inner
736
+ polyhedron, excluding the round radius. The mesh is a reconstructed boundary of
737
+ the stored Float32 points, not a copy of internal contact faces. Reconstruction
738
+ uses double precision and exact-sign dimension checks for thin point clouds;
739
+ returned positions remain original Float32 coordinates. It does not upgrade the
740
+ physics engine's storage or solver to double precision. Boundary measurements
741
+ and native mass measurements remain distinct; applications must continue to
742
+ validate both.
743
+
744
+ `buildInfo.convexExportPrecision` identifies this reconstruction as `float64`.
745
+ The f32 and f64 collision-library dependencies use the same recorded source pin.
746
+ Captured export, browser-worker, simulation-parity and CPU timing evidence lives
747
+ in `absolutejs/research/convex-export/`. Release availability is separate from source qualification; publication may be
748
+ deferred. The unchanged physical engine retains its existing settling limits.
749
+
750
+ Version 0.21.1 reduces continuous-collision preparation work. Convex sweeps defer
751
+ preparation until a candidate passes the existing filters and compute the same
752
+ geometric centroid without an unused inertia calculation. CCD settings, shape
753
+ geometry, collision filtering and solver arithmetic are unchanged. Qualification
754
+ records include exact recorded-motion comparisons; this is not a frame-rate or
755
+ universal latency guarantee.
@@ -637,3 +637,119 @@ checks, no-std, and independent builds matching all shipped files. Three
637
637
  ordinary CPU controls are within roughly 1% of 0.17.0 in this run. See
638
638
  `absolutejs/research/contact-softness-controls/` for measured fixture costs,
639
639
  source hashes, intermediate failures and scope limitations.
640
+
641
+ ### Queued 0.19.0: explicit quadratic resistance
642
+
643
+ `solveQuadraticDragImpulse` analytically integrates one quadratic relative-flow
644
+ resistance channel with positive supplied effective inverse mass. It returns the
645
+ signed impulse, implicit relative speed, dissipated energy and separate body /
646
+ reservoir work. It is pure and does not infer shape, exposure or coefficients.
647
+ Use consistent units and the complete effective mass response; verify native
648
+ application precision. See `absolutejs/research/quadratic-drag-2026-10-31/README.md`
649
+ for the derivation, scope and evidence. Native engine qualification stays 0.18.0.
650
+
651
+ Default inertia-matrix getter results now own their six coefficients. Later
652
+ native getters cannot overwrite a matrix already returned to the caller. Passing
653
+ an explicit matrix target still reuses that target as documented.
654
+
655
+ `solveQuadraticDragPatches` evaluates up to 4,096 explicit resistance patches in
656
+ double precision at a fixed pose and returns combined linear/angular impulses.
657
+ It reports body/reservoir work and dissipation, owns its outputs and preserves
658
+ inputs. Free-body inverse mass/inertia and patch exposure are caller supplied;
659
+ this is not an articulated-fluid or full CFD model. Patch order and timestep
660
+ convergence remain measurable approximation limits.
661
+
662
+ ## Prepared solver schedules (0.20.0)
663
+
664
+ The opt-in `world.solverSchedule()` query returns owned observations from the last
665
+ completed profiled step. Like `ccdSubsteps()`, it returns `null` before such a
666
+ step, when profiling is disabled or toggled, and after snapshot restoration.
667
+ `createPhysicsStepProfiler` retains distinct owned records in `solverSchedules`, referenced by each
668
+ sample's `native.solverScheduleIndex` (omitted means entry 0). The table is always
669
+ present and cannot exceed the retained sample
670
+ count; repeated observations do not repeat the full record.
671
+
672
+ `groupVisits` counts prepared nonempty rigid-body solve groups across CCD passes.
673
+ `rigidBodyVisits` sums their rigid-body slots, while `rigidBodySubsteps` weights
674
+ those slots by each group's prepared substep count. These are visits, not unique
675
+ body identities. `minSubsteps`/`maxSubsteps` report the group range;
676
+ `minSubstepDt`/`maxSubstepDt` are durations in seconds. All four range fields are
677
+ `null` when no nonempty rigid group was prepared. Soft-particle-only work and
678
+ internal PGS sweeps are outside these counts.
679
+
680
+ This reads the actual group layout, including additional iterations propagated
681
+ through constraint-connected bodies. It does not change that layout, force
682
+ sampling, native timestep or contact policy. It is not a per-body mapping, elapsed
683
+ CPU timing, proof of force/energy accuracy, or forecast of the next step. In
684
+ particular, a previous group's substep count must not silently select gameplay
685
+ fluid-force timing when contact connectivity or CCD can change.
686
+
687
+ The native observer is qualified by independent native builds and exact full-state
688
+ comparisons across 18 fixtures / 9,240 steps against 0.19.0. Sampled local CPU
689
+ costs and limits are recorded in `absolutejs/research/solver-schedule/`.
690
+ The previous private artifacts remain archived; release availability is separate
691
+ from source qualification.
692
+
693
+ ### Bounded diagnostic profile transport
694
+
695
+ `encodePhysicsStepProfile(profile)` converts a readable report into an owned,
696
+ versioned numeric packet. `decodePhysicsStepProfile(value)` validates an unknown
697
+ packet and reconstructs owned readable observations. For example:
698
+
699
+ ```ts
700
+ const packet = encodePhysicsStepProfile(profiler.snapshot());
701
+ const restored = decodePhysicsStepProfile(JSON.parse(JSON.stringify(packet)));
702
+ ```
703
+
704
+ The codec preserves every defined observation without rounding, including null
705
+ measurements, failed samples, signed zero and explicit versus omitted default
706
+ schedule references. It excludes arbitrary application metadata and user strings.
707
+ The format tag is `absolutejs-physics-step-profile/1`; one fixed `'-0'` cell tag
708
+ preserves signed zero through JSON. Arrays are bounded to 256 entries, tuple
709
+ lengths and enums are fixed, and indices/scalars are validated. Malformed packets
710
+ throw `TypeError`. This is transport validation, not a claim of native provenance
711
+ or physical correctness. Apply normal metadata redaction outside the codec.
712
+
713
+ Readable `PhysicsStepProfile` remains the simulation-facing API. In 0.20 its
714
+ always-present `solverSchedules` table and optional sample index are part of that
715
+ schema; older readable profiles without this table are not silently upgraded.
716
+ Keep the format tag with stored packets and decode before displaying their fields.
717
+
718
+ ## Convex boundary export (0.21)
719
+
720
+ `collider.convexMeshData()` returns an owned `{vertices: Float32Array,
721
+ indices: Uint32Array}` pair from one native hull reconstruction. Use it when both
722
+ buffers are needed; separate `vertices()` and `indices()` calls each reconstruct
723
+ the hull. The query observes the current shape, so replacing a collider's shape
724
+ requires no cache invalidation. Mutating returned arrays does not change the
725
+ collider.
726
+
727
+ ```ts
728
+ const mesh = collider.convexMeshData();
729
+ if (mesh) {
730
+ // Positions are in collider-local coordinates; indices describe triangles.
731
+ uploadBoundary(mesh.vertices, mesh.indices);
732
+ }
733
+ ```
734
+
735
+ Nonconvex shapes return `undefined`. Rounded convex shapes return the inner
736
+ polyhedron, excluding the round radius. The mesh is a reconstructed boundary of
737
+ the stored Float32 points, not a copy of internal contact faces. Reconstruction
738
+ uses double precision and exact-sign dimension checks for thin point clouds;
739
+ returned positions remain original Float32 coordinates. It does not upgrade the
740
+ physics engine's storage or solver to double precision. Boundary measurements
741
+ and native mass measurements remain distinct; applications must continue to
742
+ validate both.
743
+
744
+ `buildInfo.convexExportPrecision` identifies this reconstruction as `float64`.
745
+ The f32 and f64 collision-library dependencies use the same recorded source pin.
746
+ Captured export, browser-worker, simulation-parity and CPU timing evidence lives
747
+ in `absolutejs/research/convex-export/`. Release availability is separate from source qualification; publication may be
748
+ deferred. The unchanged physical engine retains its existing settling limits.
749
+
750
+ Version 0.21.1 reduces continuous-collision preparation work. Convex sweeps defer
751
+ preparation until a candidate passes the existing filters and compute the same
752
+ geometric centroid without an unused inertia calculation. CCD settings, shape
753
+ geometry, collision filtering and solver arithmetic are unchanged. Qualification
754
+ records include exact recorded-motion comparisons; this is not a frame-rate or
755
+ universal latency guarantee.
@@ -1 +1 @@
1
- var e=Object.freeze({schemaVersion:1,scope:"package",packageName:"@absolutejs/rapier3d",packageVersion:"0.18.0",qualifiedKernelRelease:"0.18.0",upstream:"b716d375efc0201003f0cd9ef7168eee0b62c177",engine:"0.36.0",collisionLibraryVersion:"0.31.1",collisionSource:"git+https://github.com/absolutejs/parry?rev=53ac0b0b02767300da09d092d97cef53a975c947#53ac0b0b02767300da09d092d97cef53a975c947",bindings:"0.21.0",bindgen:"0.2.129",wasmSha256:"67e366a5151fd865f6e6fb154a8cb27a7c4073c19e51e0e594633cf07f6e956e",wasmBytes:3363613,solverChanges:!0});export{e as buildInfo};
1
+ var e=Object.freeze({schemaVersion:1,scope:"package",packageName:"@absolutejs/rapier3d",packageVersion:"0.21.1",qualifiedKernelRelease:"0.21.1",upstream:"b716d375efc0201003f0cd9ef7168eee0b62c177",engine:"0.36.0",collisionLibraryVersion:"0.31.1",collisionSource:"git+https://github.com/absolutejs/parry?rev=6afbe26a23a4d89903c6a33d0a0c0d98d9af7b72#6afbe26a23a4d89903c6a33d0a0c0d98d9af7b72",convexExportPrecision:"float64",bindings:"0.21.0",bindgen:"0.2.129",wasmSha256:"1d35b69d746eee6383401a68ec37d051391e0fa321096675b46c86072616e9d5",wasmBytes:3411729,solverChanges:!1});export{e as buildInfo};
@@ -2,15 +2,16 @@
2
2
  "schemaVersion": 1,
3
3
  "scope": "package",
4
4
  "packageName": "@absolutejs/rapier3d",
5
- "packageVersion": "0.18.0",
6
- "qualifiedKernelRelease": "0.18.0",
5
+ "packageVersion": "0.21.1",
6
+ "qualifiedKernelRelease": "0.21.1",
7
7
  "upstream": "b716d375efc0201003f0cd9ef7168eee0b62c177",
8
8
  "engine": "0.36.0",
9
9
  "collisionLibraryVersion": "0.31.1",
10
- "collisionSource": "git+https://github.com/absolutejs/parry?rev=53ac0b0b02767300da09d092d97cef53a975c947#53ac0b0b02767300da09d092d97cef53a975c947",
10
+ "collisionSource": "git+https://github.com/absolutejs/parry?rev=6afbe26a23a4d89903c6a33d0a0c0d98d9af7b72#6afbe26a23a4d89903c6a33d0a0c0d98d9af7b72",
11
+ "convexExportPrecision": "float64",
11
12
  "bindings": "0.21.0",
12
13
  "bindgen": "0.2.129",
13
- "wasmSha256": "67e366a5151fd865f6e6fb154a8cb27a7c4073c19e51e0e594633cf07f6e956e",
14
- "wasmBytes": 3363613,
15
- "solverChanges": true
14
+ "wasmSha256": "1d35b69d746eee6383401a68ec37d051391e0fa321096675b46c86072616e9d5",
15
+ "wasmBytes": 3411729,
16
+ "solverChanges": false
16
17
  }