@pibbl/core 0.0.1 → 0.0.3-alpha.109.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 +1 -1
- package/THIRD_PARTY_NOTICES.txt +81 -0
- package/dist/features/machines/animation.d.ts +64 -0
- package/dist/features/machines/animation.js +55 -0
- package/dist/features/machines/animation.js.map +7 -0
- package/dist/features/machines/animation.mjs +1 -0
- package/dist/features/machines/assign.d.ts +16 -0
- package/dist/features/machines/assign.js +15 -0
- package/dist/features/machines/assign.js.map +7 -0
- package/dist/features/machines/callback.d.ts +9 -0
- package/dist/features/machines/callback.js +7 -0
- package/dist/features/machines/callback.js.map +7 -0
- package/dist/features/machines/hook.d.ts +30 -0
- package/dist/features/machines/hook.js +37 -0
- package/dist/features/machines/hook.js.map +7 -0
- package/dist/features/machines/index.d.ts +6 -0
- package/dist/features/machines/index.js +12 -0
- package/dist/features/machines/index.js.map +7 -0
- package/dist/features/machines/index.mjs +1 -0
- package/dist/features/machines/runtime.d.ts +18 -0
- package/dist/features/machines/runtime.js +363 -0
- package/dist/features/machines/runtime.js.map +7 -0
- package/dist/features/machines/types.d.ts +164 -0
- package/dist/features/physics/2d-geometry.d.ts +3 -3
- package/dist/features/physics/2d-geometry.js.map +1 -1
- package/dist/features/physics/2d-testing.d.ts +1 -1
- package/dist/features/physics/2d-testing.js +2 -2
- package/dist/features/physics/2d-testing.js.map +2 -2
- package/dist/features/physics/2d.d.ts +115 -62
- package/dist/features/physics/2d.js +59 -28
- package/dist/features/physics/2d.js.map +2 -2
- package/dist/features/physics/lib/2d/canvas/components.js +25 -21
- package/dist/features/physics/lib/2d/canvas/components.js.map +2 -2
- package/dist/features/physics/lib/2d/canvas/presentation.js +1 -2
- package/dist/features/physics/lib/2d/canvas/presentation.js.map +2 -2
- package/dist/features/physics/lib/2d/collision/casts.js +4 -2
- package/dist/features/physics/lib/2d/collision/casts.js.map +2 -2
- package/dist/features/physics/lib/2d/query-types.d.ts +6 -0
- package/dist/features/physics/lib/2d/runtime/controller.d.ts +7 -6
- package/dist/features/physics/lib/2d/runtime/controller.js +1 -1
- package/dist/features/physics/lib/2d/runtime/controller.js.map +2 -2
- package/dist/features/physics/lib/2d/runtime/obstacles.js +9 -11
- package/dist/features/physics/lib/2d/runtime/obstacles.js.map +2 -2
- package/dist/features/physics/lib/2d/shapes.js +8 -9
- package/dist/features/physics/lib/2d/shapes.js.map +2 -2
- package/dist/features/physics/lib/2d/types.d.ts +8 -30
- package/dist/features/physics/lib/2d/world/queries.d.ts +7 -6
- package/dist/features/physics/lib/2d/world/queries.js.map +2 -2
- package/dist/features/physics/lib/2d/world/rapier.js +22 -26
- package/dist/features/physics/lib/2d/world/rapier.js.map +2 -2
- package/dist/features/sprites/formats/aseprite.d.ts +5 -0
- package/dist/features/sprites/formats/texture-packer.d.ts +5 -0
- package/dist/features/sprites/index.d.ts +6 -0
- package/dist/features/sprites/loader.d.ts +25 -0
- package/dist/features/sprites/loader.js +6 -3
- package/dist/features/sprites/loader.js.map +2 -2
- package/dist/features/sprites/model.d.ts +75 -0
- package/dist/features/sprites/sprite.d.ts +22 -0
- package/dist/features/textures/index.d.ts +12 -2
- package/dist/features/textures/index.js +33 -1
- package/dist/features/textures/index.js.map +2 -2
- package/dist/features/textures/lib/chemical-field.d.ts +56 -0
- package/dist/features/textures/lib/chemical-field.js +154 -0
- package/dist/features/textures/lib/chemical-field.js.map +7 -0
- package/dist/features/textures/lib/chemical-recipes.d.ts +119 -0
- package/dist/features/textures/lib/chemical-recipes.js +275 -0
- package/dist/features/textures/lib/chemical-recipes.js.map +7 -0
- package/dist/features/textures/lib/definitions.d.ts +3 -18
- package/dist/features/textures/lib/definitions.js +17 -24
- package/dist/features/textures/lib/definitions.js.map +2 -2
- package/dist/features/textures/lib/geometric-patterns.d.ts +149 -0
- package/dist/features/textures/lib/geometric-patterns.js +305 -0
- package/dist/features/textures/lib/geometric-patterns.js.map +7 -0
- package/dist/features/textures/lib/gray-scott.d.ts +55 -0
- package/dist/features/textures/lib/gray-scott.js +37 -0
- package/dist/features/textures/lib/gray-scott.js.map +7 -0
- package/dist/features/textures/lib/palette.js +1 -3
- package/dist/features/textures/lib/palette.js.map +2 -2
- package/dist/features/textures/lib/patterns.d.ts +123 -0
- package/dist/features/textures/lib/patterns.js +344 -0
- package/dist/features/textures/lib/patterns.js.map +7 -0
- package/dist/features/textures/lib/rain-drops.js +2 -1
- package/dist/features/textures/lib/rain-drops.js.map +2 -2
- package/dist/features/textures/lib/reaction-diffusion.d.ts +3 -2
- package/dist/features/textures/lib/reaction-diffusion.js +9 -20
- package/dist/features/textures/lib/reaction-diffusion.js.map +2 -2
- package/dist/features/textures/lib/simulation.d.ts +10 -4
- package/dist/features/textures/lib/simulation.js +23 -13
- package/dist/features/textures/lib/simulation.js.map +2 -2
- package/dist/features/textures/lib/wasm/electric.js +8 -1
- package/dist/features/textures/lib/wasm/electric.js.map +2 -2
- package/dist/features/textures/lib/water-surface.js +1 -3
- package/dist/features/textures/lib/water-surface.js.map +2 -2
- package/dist/features/viz/index.d.ts +92 -5
- package/dist/features/viz/index.js +202 -4
- package/dist/features/viz/index.js.map +2 -2
- package/dist/features/viz/inspection/bar.d.ts +79 -0
- package/dist/features/viz/inspection/bar.js +49 -0
- package/dist/features/viz/inspection/bar.js.map +7 -0
- package/dist/features/viz/inspection/candle.d.ts +156 -0
- package/dist/features/viz/inspection/candle.js +120 -0
- package/dist/features/viz/inspection/candle.js.map +7 -0
- package/dist/features/viz/inspection/capture-types.d.ts +65 -0
- package/dist/features/viz/inspection/capture.d.ts +16 -0
- package/dist/features/viz/inspection/capture.js +49 -0
- package/dist/features/viz/inspection/capture.js.map +7 -0
- package/dist/features/viz/inspection/handler.d.ts +36 -0
- package/dist/features/viz/inspection/handler.js +91 -0
- package/dist/features/viz/inspection/handler.js.map +7 -0
- package/dist/features/viz/inspection/ohlc-bar.d.ts +132 -0
- package/dist/features/viz/inspection/ohlc-bar.js +118 -0
- package/dist/features/viz/inspection/ohlc-bar.js.map +7 -0
- package/dist/features/viz/inspection/owned-ref.d.ts +16 -0
- package/dist/features/viz/inspection/owned-ref.js +99 -0
- package/dist/features/viz/inspection/owned-ref.js.map +7 -0
- package/dist/features/viz/inspection/painted-point.d.ts +22 -0
- package/dist/features/viz/inspection/painted-point.js +29 -0
- package/dist/features/viz/inspection/painted-point.js.map +7 -0
- package/dist/features/viz/inspection/queries.d.ts +100 -0
- package/dist/features/viz/inspection/queries.js +192 -0
- package/dist/features/viz/inspection/queries.js.map +7 -0
- package/dist/features/viz/inspection/query-types.d.ts +177 -0
- package/dist/features/viz/inspection/volume.d.ts +104 -0
- package/dist/features/viz/inspection/volume.js +95 -0
- package/dist/features/viz/inspection/volume.js.map +7 -0
- package/dist/features/viz/inspection.d.ts +19 -0
- package/dist/features/viz/inspection.js +54 -0
- package/dist/features/viz/inspection.js.map +7 -0
- package/dist/features/viz/inspection.mjs +1 -0
- package/dist/features/viz/lib/area-series.d.ts +62 -0
- package/dist/features/viz/lib/area-series.js +120 -0
- package/dist/features/viz/lib/area-series.js.map +7 -0
- package/dist/features/viz/lib/axis-labels.d.ts +2 -0
- package/dist/features/viz/lib/axis-labels.js +41 -0
- package/dist/features/viz/lib/axis-labels.js.map +7 -0
- package/dist/features/viz/lib/axis-title.d.ts +23 -0
- package/dist/features/viz/lib/axis-title.js +24 -0
- package/dist/features/viz/lib/axis-title.js.map +7 -0
- package/dist/features/viz/lib/axis.d.ts +1 -1
- package/dist/features/viz/lib/axis.js +50 -50
- package/dist/features/viz/lib/axis.js.map +2 -2
- package/dist/features/viz/lib/bar-scale.d.ts +7 -0
- package/dist/features/viz/lib/bar-scale.js +34 -0
- package/dist/features/viz/lib/bar-scale.js.map +7 -0
- package/dist/features/viz/lib/bar-series.d.ts +3 -1
- package/dist/features/viz/lib/bar-series.js +21 -5
- package/dist/features/viz/lib/bar-series.js.map +2 -2
- package/dist/features/viz/lib/baseline-series.d.ts +55 -0
- package/dist/features/viz/lib/baseline-series.js +136 -0
- package/dist/features/viz/lib/baseline-series.js.map +7 -0
- package/dist/features/viz/lib/candlestick-series.d.ts +62 -0
- package/dist/features/viz/lib/candlestick-series.js +150 -0
- package/dist/features/viz/lib/candlestick-series.js.map +7 -0
- package/dist/features/viz/lib/censored-point-series.d.ts +71 -0
- package/dist/features/viz/lib/censored-point-series.js +129 -0
- package/dist/features/viz/lib/censored-point-series.js.map +7 -0
- package/dist/features/viz/lib/chart-lines.d.ts +41 -0
- package/dist/features/viz/lib/chart-lines.js +32 -0
- package/dist/features/viz/lib/chart-lines.js.map +7 -0
- package/dist/features/viz/lib/color-context.d.ts +4 -0
- package/dist/features/viz/lib/color-context.js +41 -0
- package/dist/features/viz/lib/color-context.js.map +7 -0
- package/dist/features/viz/lib/color-math.d.ts +4 -0
- package/dist/features/viz/lib/color-math.js +31 -0
- package/dist/features/viz/lib/color-math.js.map +7 -0
- package/dist/features/viz/lib/color-types.d.ts +53 -0
- package/dist/features/viz/lib/curve-definition.d.ts +49 -0
- package/dist/features/viz/lib/curve-definition.js +142 -0
- package/dist/features/viz/lib/curve-definition.js.map +7 -0
- package/dist/features/viz/lib/diverging-color-scale.d.ts +11 -0
- package/dist/features/viz/lib/diverging-color-scale.js +51 -0
- package/dist/features/viz/lib/diverging-color-scale.js.map +7 -0
- package/dist/features/viz/lib/domain-navigation.d.ts +40 -0
- package/dist/features/viz/lib/domain-navigation.js +77 -0
- package/dist/features/viz/lib/domain-navigation.js.map +7 -0
- package/dist/features/viz/lib/editable-chart-elements.d.ts +178 -0
- package/dist/features/viz/lib/editable-chart-elements.js +733 -0
- package/dist/features/viz/lib/editable-chart-elements.js.map +7 -0
- package/dist/features/viz/lib/financial-aggregation.d.ts +127 -0
- package/dist/features/viz/lib/financial-aggregation.js +116 -0
- package/dist/features/viz/lib/financial-aggregation.js.map +7 -0
- package/dist/features/viz/lib/financial-autoscale.d.ts +64 -0
- package/dist/features/viz/lib/financial-autoscale.js +61 -0
- package/dist/features/viz/lib/financial-autoscale.js.map +7 -0
- package/dist/features/viz/lib/financial-comparison.d.ts +62 -0
- package/dist/features/viz/lib/financial-comparison.js +98 -0
- package/dist/features/viz/lib/financial-comparison.js.map +7 -0
- package/dist/features/viz/lib/financial-geometry.d.ts +77 -0
- package/dist/features/viz/lib/financial-geometry.js +67 -0
- package/dist/features/viz/lib/financial-geometry.js.map +7 -0
- package/dist/features/viz/lib/financial-indicators.d.ts +114 -0
- package/dist/features/viz/lib/financial-indicators.js +135 -0
- package/dist/features/viz/lib/financial-indicators.js.map +7 -0
- package/dist/features/viz/lib/financial-oscillators.d.ts +171 -0
- package/dist/features/viz/lib/financial-oscillators.js +265 -0
- package/dist/features/viz/lib/financial-oscillators.js.map +7 -0
- package/dist/features/viz/lib/graph/bipartite.d.ts +14 -0
- package/dist/features/viz/lib/graph/bipartite.js +250 -0
- package/dist/features/viz/lib/graph/bipartite.js.map +7 -0
- package/dist/features/viz/lib/graph/chord.d.ts +44 -0
- package/dist/features/viz/lib/graph/chord.js +348 -0
- package/dist/features/viz/lib/graph/chord.js.map +7 -0
- package/dist/features/viz/lib/graph/dependency.d.ts +26 -0
- package/dist/features/viz/lib/graph/dependency.js +140 -0
- package/dist/features/viz/lib/graph/dependency.js.map +7 -0
- package/dist/features/viz/lib/graph/force.d.ts +28 -0
- package/dist/features/viz/lib/graph/force.js +580 -0
- package/dist/features/viz/lib/graph/force.js.map +7 -0
- package/dist/features/viz/lib/graph/hierarchy.d.ts +21 -0
- package/dist/features/viz/lib/graph/hierarchy.js +112 -0
- package/dist/features/viz/lib/graph/hierarchy.js.map +7 -0
- package/dist/features/viz/lib/graph/icicle.d.ts +16 -0
- package/dist/features/viz/lib/graph/icicle.js +153 -0
- package/dist/features/viz/lib/graph/icicle.js.map +7 -0
- package/dist/features/viz/lib/graph/matrix.d.ts +30 -0
- package/dist/features/viz/lib/graph/matrix.js +243 -0
- package/dist/features/viz/lib/graph/matrix.js.map +7 -0
- package/dist/features/viz/lib/graph/neighborhood.d.ts +11 -0
- package/dist/features/viz/lib/graph/neighborhood.js +281 -0
- package/dist/features/viz/lib/graph/neighborhood.js.map +7 -0
- package/dist/features/viz/lib/graph/routes.d.ts +35 -0
- package/dist/features/viz/lib/graph/routes.js +101 -0
- package/dist/features/viz/lib/graph/routes.js.map +7 -0
- package/dist/features/viz/lib/graph/sankey.d.ts +44 -0
- package/dist/features/viz/lib/graph/sankey.js +341 -0
- package/dist/features/viz/lib/graph/sankey.js.map +7 -0
- package/dist/features/viz/lib/graph/shared.d.ts +59 -0
- package/dist/features/viz/lib/graph/shared.js +301 -0
- package/dist/features/viz/lib/graph/shared.js.map +7 -0
- package/dist/features/viz/lib/graph/tree.d.ts +11 -0
- package/dist/features/viz/lib/graph/tree.js +232 -0
- package/dist/features/viz/lib/graph/tree.js.map +7 -0
- package/dist/features/viz/lib/graph/treemap.d.ts +20 -0
- package/dist/features/viz/lib/graph/treemap.js +227 -0
- package/dist/features/viz/lib/graph/treemap.js.map +7 -0
- package/dist/features/viz/lib/graph/types.d.ts +1097 -0
- package/dist/features/viz/lib/hover-card.js +8 -9
- package/dist/features/viz/lib/hover-card.js.map +2 -2
- package/dist/features/viz/lib/hover-data.d.ts +1 -1
- package/dist/features/viz/lib/hover-data.js +6 -3
- package/dist/features/viz/lib/hover-data.js.map +2 -2
- package/dist/features/viz/lib/hover-types.d.ts +5 -5
- package/dist/features/viz/lib/interval-band-series.d.ts +49 -0
- package/dist/features/viz/lib/interval-band-series.js +136 -0
- package/dist/features/viz/lib/interval-band-series.js.map +7 -0
- package/dist/features/viz/lib/interval-diamond-series.d.ts +43 -0
- package/dist/features/viz/lib/interval-diamond-series.js +122 -0
- package/dist/features/viz/lib/interval-diamond-series.js.map +7 -0
- package/dist/features/viz/lib/interval-series.d.ts +79 -0
- package/dist/features/viz/lib/interval-series.js +158 -0
- package/dist/features/viz/lib/interval-series.js.map +7 -0
- package/dist/features/viz/lib/layout-pie.js +9 -13
- package/dist/features/viz/lib/layout-pie.js.map +2 -2
- package/dist/features/viz/lib/line-series.d.ts +1 -1
- package/dist/features/viz/lib/line-series.js +47 -28
- package/dist/features/viz/lib/line-series.js.map +2 -2
- package/dist/features/viz/lib/linear-scale-component.d.ts +7 -0
- package/dist/features/viz/lib/linear-scale-component.js +18 -0
- package/dist/features/viz/lib/linear-scale-component.js.map +7 -0
- package/dist/features/viz/lib/linear-scale.js +1 -1
- package/dist/features/viz/lib/linear-scale.js.map +2 -2
- package/dist/features/viz/lib/log-scale-component.d.ts +7 -0
- package/dist/features/viz/lib/log-scale-component.js +19 -0
- package/dist/features/viz/lib/log-scale-component.js.map +7 -0
- package/dist/features/viz/lib/log-scale.d.ts +2 -0
- package/dist/features/viz/lib/log-scale.js +53 -0
- package/dist/features/viz/lib/log-scale.js.map +7 -0
- package/dist/features/viz/lib/monotone-curve.d.ts +11 -0
- package/dist/features/viz/lib/monotone-curve.js +63 -0
- package/dist/features/viz/lib/monotone-curve.js.map +7 -0
- package/dist/features/viz/lib/nearest.d.ts +9 -9
- package/dist/features/viz/lib/nearest.js.map +1 -1
- package/dist/features/viz/lib/numeric-range-interpolation.d.ts +15 -0
- package/dist/features/viz/lib/numeric-range-interpolation.js +36 -0
- package/dist/features/viz/lib/numeric-range-interpolation.js.map +7 -0
- package/dist/features/viz/lib/numeric-ticks.d.ts +38 -0
- package/dist/features/viz/lib/numeric-ticks.js +54 -0
- package/dist/features/viz/lib/numeric-ticks.js.map +7 -0
- package/dist/features/viz/lib/ohlc-bar-series.d.ts +55 -0
- package/dist/features/viz/lib/ohlc-bar-series.js +168 -0
- package/dist/features/viz/lib/ohlc-bar-series.js.map +7 -0
- package/dist/features/viz/lib/paired-series.d.ts +44 -0
- package/dist/features/viz/lib/paired-series.js +93 -0
- package/dist/features/viz/lib/paired-series.js.map +7 -0
- package/dist/features/viz/lib/pie-layout.js +2 -1
- package/dist/features/viz/lib/pie-layout.js.map +2 -2
- package/dist/features/viz/lib/plot-series.js +11 -6
- package/dist/features/viz/lib/plot-series.js.map +2 -2
- package/dist/features/viz/lib/plot-types.d.ts +4 -3
- package/dist/features/viz/lib/point-scale-component.d.ts +7 -0
- package/dist/features/viz/lib/point-scale-component.js +19 -0
- package/dist/features/viz/lib/point-scale-component.js.map +7 -0
- package/dist/features/viz/lib/point-scale.d.ts +2 -0
- package/dist/features/viz/lib/point-scale.js +45 -0
- package/dist/features/viz/lib/point-scale.js.map +7 -0
- package/dist/features/viz/lib/point-series.d.ts +1 -1
- package/dist/features/viz/lib/point-series.js +36 -9
- package/dist/features/viz/lib/point-series.js.map +2 -2
- package/dist/features/viz/lib/point-types.d.ts +5 -2
- package/dist/features/viz/lib/reference-band.d.ts +16 -0
- package/dist/features/viz/lib/reference-band.js +30 -0
- package/dist/features/viz/lib/reference-band.js.map +7 -0
- package/dist/features/viz/lib/scale-adjust.js +9 -4
- package/dist/features/viz/lib/scale-adjust.js.map +2 -2
- package/dist/features/viz/lib/scale-context.d.ts +5 -4
- package/dist/features/viz/lib/scale-context.js +15 -11
- package/dist/features/viz/lib/scale-context.js.map +2 -2
- package/dist/features/viz/lib/scale-provider.d.ts +2 -0
- package/dist/features/viz/lib/scale-provider.js +13 -0
- package/dist/features/viz/lib/scale-provider.js.map +7 -0
- package/dist/features/viz/lib/scale-ticks.d.ts +5 -0
- package/dist/features/viz/lib/scale-ticks.js +64 -0
- package/dist/features/viz/lib/scale-ticks.js.map +7 -0
- package/dist/features/viz/lib/scale-view.d.ts +4 -0
- package/dist/features/viz/lib/scale-view.js +21 -0
- package/dist/features/viz/lib/scale-view.js.map +7 -0
- package/dist/features/viz/lib/sequential-color-scale.d.ts +11 -0
- package/dist/features/viz/lib/sequential-color-scale.js +49 -0
- package/dist/features/viz/lib/sequential-color-scale.js.map +7 -0
- package/dist/features/viz/lib/series-position.d.ts +12 -0
- package/dist/features/viz/lib/series-position.js +44 -0
- package/dist/features/viz/lib/series-position.js.map +7 -0
- package/dist/features/viz/lib/step-curves.d.ts +19 -0
- package/dist/features/viz/lib/step-curves.js +53 -0
- package/dist/features/viz/lib/step-curves.js.map +7 -0
- package/dist/features/viz/lib/symlog-scale-component.d.ts +7 -0
- package/dist/features/viz/lib/symlog-scale-component.js +19 -0
- package/dist/features/viz/lib/symlog-scale-component.js.map +7 -0
- package/dist/features/viz/lib/symlog-scale.d.ts +2 -0
- package/dist/features/viz/lib/symlog-scale.js +38 -0
- package/dist/features/viz/lib/symlog-scale.js.map +7 -0
- package/dist/features/viz/lib/threshold-color-scale.d.ts +43 -0
- package/dist/features/viz/lib/threshold-color-scale.js +59 -0
- package/dist/features/viz/lib/threshold-color-scale.js.map +7 -0
- package/dist/features/viz/lib/trading-time-mapping.d.ts +32 -0
- package/dist/features/viz/lib/trading-time-mapping.js +89 -0
- package/dist/features/viz/lib/trading-time-mapping.js.map +7 -0
- package/dist/features/viz/lib/trading-time-scale.d.ts +83 -0
- package/dist/features/viz/lib/trading-time-scale.js +96 -0
- package/dist/features/viz/lib/trading-time-scale.js.map +7 -0
- package/dist/features/viz/lib/trajectory-series.d.ts +71 -0
- package/dist/features/viz/lib/trajectory-series.js +111 -0
- package/dist/features/viz/lib/trajectory-series.js.map +7 -0
- package/dist/features/viz/lib/types.d.ts +114 -21
- package/dist/features/viz/lib/use-bar-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-bar-scale.js +9 -0
- package/dist/features/viz/lib/use-bar-scale.js.map +7 -0
- package/dist/features/viz/lib/use-continuous-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-continuous-scale.js +14 -0
- package/dist/features/viz/lib/use-continuous-scale.js.map +7 -0
- package/dist/features/viz/lib/use-linear-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-linear-scale.js +9 -0
- package/dist/features/viz/lib/use-linear-scale.js.map +7 -0
- package/dist/features/viz/lib/use-log-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-log-scale.js +9 -0
- package/dist/features/viz/lib/use-log-scale.js.map +7 -0
- package/dist/features/viz/lib/use-point-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-point-scale.js +9 -0
- package/dist/features/viz/lib/use-point-scale.js.map +7 -0
- package/dist/features/viz/lib/use-symlog-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-symlog-scale.js +9 -0
- package/dist/features/viz/lib/use-symlog-scale.js.map +7 -0
- package/dist/features/viz/lib/use-utc-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-utc-scale.js +9 -0
- package/dist/features/viz/lib/use-utc-scale.js.map +7 -0
- package/dist/features/viz/lib/utc-labels.d.ts +12 -0
- package/dist/features/viz/lib/utc-labels.js +27 -0
- package/dist/features/viz/lib/utc-labels.js.map +7 -0
- package/dist/features/viz/lib/utc-scale-component.d.ts +7 -0
- package/dist/features/viz/lib/utc-scale-component.js +18 -0
- package/dist/features/viz/lib/utc-scale-component.js.map +7 -0
- package/dist/features/viz/lib/utc-scale.d.ts +21 -0
- package/dist/features/viz/lib/utc-scale.js +124 -0
- package/dist/features/viz/lib/utc-scale.js.map +7 -0
- package/dist/features/viz/lib/volume-series.d.ts +59 -0
- package/dist/features/viz/lib/volume-series.js +117 -0
- package/dist/features/viz/lib/volume-series.js.map +7 -0
- package/dist/features/viz/lib/weighted-point-series.d.ts +71 -0
- package/dist/features/viz/lib/weighted-point-series.js +169 -0
- package/dist/features/viz/lib/weighted-point-series.js.map +7 -0
- package/dist/filters/backdrop-contrast-gpu.d.ts +5 -0
- package/dist/filters/backdrop-contrast-gpu.js +33 -0
- package/dist/filters/backdrop-contrast-gpu.js.map +7 -0
- package/dist/filters/backdrop-contrast.d.ts +21 -0
- package/dist/filters/backdrop-contrast.js +61 -0
- package/dist/filters/backdrop-contrast.js.map +7 -0
- package/dist/filters/displacement.js +1 -1
- package/dist/filters/displacement.js.map +2 -2
- package/dist/filters/emboss-gpu.d.ts +4 -0
- package/dist/filters/emboss-gpu.js +39 -0
- package/dist/filters/emboss-gpu.js.map +7 -0
- package/dist/filters/emboss.d.ts +32 -0
- package/dist/filters/emboss.js +104 -0
- package/dist/filters/emboss.js.map +7 -0
- package/dist/filters/filter-executor.d.ts +11 -4
- package/dist/filters/filter-executor.js +104 -49
- package/dist/filters/filter-executor.js.map +2 -2
- package/dist/filters/reflected-light.js +1 -1
- package/dist/filters/reflected-light.js.map +2 -2
- package/dist/filters/reflection-gpu.d.ts +3 -1
- package/dist/filters/reflection-gpu.js +5 -2
- package/dist/filters/reflection-gpu.js.map +2 -2
- package/dist/filters/render-backdrop-contrast-boundary.d.ts +31 -0
- package/dist/filters/render-backdrop-contrast-boundary.js +116 -0
- package/dist/filters/render-backdrop-contrast-boundary.js.map +7 -0
- package/dist/filters/render-emboss-boundary.d.ts +13 -0
- package/dist/filters/render-emboss-boundary.js +131 -0
- package/dist/filters/render-emboss-boundary.js.map +7 -0
- package/dist/filters.d.ts +9 -5
- package/dist/filters.js +4 -0
- package/dist/filters.js.map +2 -2
- package/dist/index.d.ts +10 -6
- package/dist/index.js +18 -2
- package/dist/index.js.map +2 -2
- package/dist/internal.d.ts +4 -0
- package/dist/internal.js +6 -0
- package/dist/internal.js.map +2 -2
- package/dist/layout-kernel.d.ts +12 -0
- package/dist/layout-kernel.js +11 -0
- package/dist/layout-kernel.js.map +7 -0
- package/dist/layout-kernel.mjs +1 -0
- package/dist/lib/animation/definition.d.ts +5 -3
- package/dist/lib/animation/definition.js +29 -4
- package/dist/lib/animation/definition.js.map +2 -2
- package/dist/lib/animation/playback.d.ts +8 -0
- package/dist/lib/animation/playback.js +33 -11
- package/dist/lib/animation/playback.js.map +2 -2
- package/dist/lib/animation/spring.d.ts +3 -1
- package/dist/lib/animation/spring.js.map +2 -2
- package/dist/lib/animation/types.d.ts +29 -73
- package/dist/lib/backend/types.d.ts +13 -1
- package/dist/lib/backend/types.js.map +2 -2
- package/dist/lib/components/arc-geometry.js +2 -1
- package/dist/lib/components/arc-geometry.js.map +2 -2
- package/dist/lib/components/g.js +2 -0
- package/dist/lib/components/g.js.map +2 -2
- package/dist/lib/components/html-box.js +2 -1
- package/dist/lib/components/html-box.js.map +2 -2
- package/dist/lib/components/img.js +3 -3
- package/dist/lib/components/img.js.map +2 -2
- package/dist/lib/components/layer.js +98 -16
- package/dist/lib/components/layer.js.map +3 -3
- package/dist/lib/components/text.d.ts +16 -0
- package/dist/lib/components/text.js +131 -24
- package/dist/lib/components/text.js.map +2 -2
- package/dist/lib/define-primitive.d.ts +4 -2
- package/dist/lib/define-primitive.js +3 -1
- package/dist/lib/define-primitive.js.map +2 -2
- package/dist/lib/element/metadata.d.ts +9 -0
- package/dist/lib/element/metadata.js +19 -0
- package/dist/lib/element/metadata.js.map +2 -2
- package/dist/lib/element/resolve-primitive-inputs.d.ts +2 -0
- package/dist/lib/element/resolve-primitive-inputs.js +17 -4
- package/dist/lib/element/resolve-primitive-inputs.js.map +2 -2
- package/dist/lib/events/event-facade.d.ts +18 -0
- package/dist/lib/events/event-facade.js +28 -2
- package/dist/lib/events/event-facade.js.map +2 -2
- package/dist/lib/events/hit-test.js +2 -1
- package/dist/lib/events/hit-test.js.map +2 -2
- package/dist/lib/events/propagation.d.ts +2 -1
- package/dist/lib/events/propagation.js +22 -16
- package/dist/lib/events/propagation.js.map +2 -2
- package/dist/lib/events/registrations.d.ts +10 -0
- package/dist/lib/events/registrations.js +160 -5
- package/dist/lib/events/registrations.js.map +2 -2
- package/dist/lib/execute-render.js +25 -1
- package/dist/lib/execute-render.js.map +2 -2
- package/dist/lib/filter/filter-region.js +3 -10
- package/dist/lib/filter/filter-region.js.map +2 -2
- package/dist/lib/focus/focus-manager.d.ts +8 -1
- package/dist/lib/focus/focus-manager.js +87 -43
- package/dist/lib/focus/focus-manager.js.map +2 -2
- package/dist/lib/focus/geometry.d.ts +2 -0
- package/dist/lib/focus/geometry.js +6 -0
- package/dist/lib/focus/geometry.js.map +2 -2
- package/dist/lib/geometry/path-bend-guide.js +1 -1
- package/dist/lib/geometry/path-bend-guide.js.map +2 -2
- package/dist/lib/geometry/path-geometry.js +12 -11
- package/dist/lib/geometry/path-geometry.js.map +2 -2
- package/dist/lib/geometry/path-transforms.js +17 -21
- package/dist/lib/geometry/path-transforms.js.map +2 -2
- package/dist/lib/geometry/path-warp-bezier.js +3 -1
- package/dist/lib/geometry/path-warp-bezier.js.map +2 -2
- package/dist/lib/geometry/path-warp.js +1 -1
- package/dist/lib/geometry/path-warp.js.map +2 -2
- package/dist/lib/global-state.js +2 -0
- package/dist/lib/global-state.js.map +2 -2
- package/dist/lib/hooks/use-animated-value.d.ts +11 -21
- package/dist/lib/hooks/use-animated-value.js +23 -70
- package/dist/lib/hooks/use-animated-value.js.map +3 -3
- package/dist/lib/hooks/use-playback.js +1 -0
- package/dist/lib/hooks/use-playback.js.map +2 -2
- package/dist/lib/html/html-events.d.ts +32 -0
- package/dist/lib/html/html-events.js +179 -0
- package/dist/lib/html/html-events.js.map +7 -0
- package/dist/lib/html/html-service.d.ts +8 -2
- package/dist/lib/html/html-service.js +198 -65
- package/dist/lib/html/html-service.js.map +2 -2
- package/dist/lib/html/overlay-config.js +7 -6
- package/dist/lib/html/overlay-config.js.map +2 -2
- package/dist/lib/html/types.d.ts +29 -2
- package/dist/lib/layout/absolute.d.ts +11 -5
- package/dist/lib/layout/absolute.js +329 -55
- package/dist/lib/layout/absolute.js.map +3 -3
- package/dist/lib/layout/allocation-checkpoint-owner.d.ts +11 -0
- package/dist/lib/layout/allocation-checkpoint-owner.js +86 -0
- package/dist/lib/layout/allocation-checkpoint-owner.js.map +7 -0
- package/dist/lib/layout/allocation-checkpoint.d.ts +53 -0
- package/dist/lib/layout/allocation-checkpoint.js +463 -0
- package/dist/lib/layout/allocation-checkpoint.js.map +7 -0
- package/dist/lib/layout/allocation-dependencies.d.ts +30 -0
- package/dist/lib/layout/allocation-dependencies.js +90 -0
- package/dist/lib/layout/allocation-dependencies.js.map +7 -0
- package/dist/lib/layout/allocation-revision.d.ts +13 -0
- package/dist/lib/layout/allocation-revision.js +67 -0
- package/dist/lib/layout/allocation-revision.js.map +7 -0
- package/dist/lib/layout/box-insets.d.ts +17 -0
- package/dist/lib/layout/box-insets.js +138 -0
- package/dist/lib/layout/box-insets.js.map +7 -0
- package/dist/lib/layout/box-sizing.d.ts +16 -0
- package/dist/lib/layout/box-sizing.js +77 -0
- package/dist/lib/layout/box-sizing.js.map +7 -0
- package/dist/lib/layout/box.js +42 -12
- package/dist/lib/layout/box.js.map +2 -2
- package/dist/lib/layout/canvas-measurement.d.ts +13 -0
- package/dist/lib/layout/canvas-measurement.js +57 -0
- package/dist/lib/layout/canvas-measurement.js.map +7 -0
- package/dist/lib/layout/context.d.ts +35 -6
- package/dist/lib/layout/context.js +72 -3
- package/dist/lib/layout/context.js.map +2 -2
- package/dist/lib/layout/define-layout-component.d.ts +23 -0
- package/dist/lib/layout/define-layout-component.js +84 -0
- package/dist/lib/layout/define-layout-component.js.map +7 -0
- package/dist/lib/layout/flex-allocation-cache.d.ts +42 -0
- package/dist/lib/layout/flex-baseline-mode.d.ts +2 -0
- package/dist/lib/layout/flex-baseline-mode.js +7 -0
- package/dist/lib/layout/flex-baseline-mode.js.map +7 -0
- package/dist/lib/layout/flex.d.ts +50 -15
- package/dist/lib/layout/flex.js +2124 -195
- package/dist/lib/layout/flex.js.map +3 -3
- package/dist/lib/layout/flow.js +225 -49
- package/dist/lib/layout/flow.js.map +2 -2
- package/dist/lib/layout/geometry-publication.d.ts +53 -0
- package/dist/lib/layout/geometry-publication.js +244 -0
- package/dist/lib/layout/geometry-publication.js.map +7 -0
- package/dist/lib/layout/grid-kernel.d.ts +63 -0
- package/dist/lib/layout/grid-kernel.js +168 -0
- package/dist/lib/layout/grid-kernel.js.map +7 -0
- package/dist/lib/layout/grid.d.ts +63 -4
- package/dist/lib/layout/grid.js +767 -171
- package/dist/lib/layout/grid.js.map +3 -3
- package/dist/lib/layout/measure.d.ts +55 -3
- package/dist/lib/layout/measure.js +448 -15
- package/dist/lib/layout/measure.js.map +2 -2
- package/dist/lib/layout/overlay.js +81 -23
- package/dist/lib/layout/overlay.js.map +2 -2
- package/dist/lib/layout/participation.d.ts +27 -0
- package/dist/lib/layout/participation.js +188 -0
- package/dist/lib/layout/participation.js.map +7 -0
- package/dist/lib/layout/place-child.js +1 -1
- package/dist/lib/layout/place-child.js.map +2 -2
- package/dist/lib/layout/positioning-diagnostics.d.ts +1 -1
- package/dist/lib/layout/positioning-diagnostics.js +13 -2
- package/dist/lib/layout/positioning-diagnostics.js.map +2 -2
- package/dist/lib/layout/prepared-root.d.ts +121 -0
- package/dist/lib/layout/prepared-root.js +360 -0
- package/dist/lib/layout/prepared-root.js.map +7 -0
- package/dist/lib/layout/standalone-kernel.d.ts +60 -0
- package/dist/lib/layout/standalone-kernel.js +722 -0
- package/dist/lib/layout/standalone-kernel.js.map +7 -0
- package/dist/lib/layout/topology.d.ts +21 -0
- package/dist/lib/layout/topology.js +113 -0
- package/dist/lib/layout/topology.js.map +7 -0
- package/dist/lib/layout/types.d.ts +5 -0
- package/dist/lib/layout/wasm/artifact.d.ts +1 -0
- package/dist/lib/layout/wasm/artifact.js +5 -0
- package/dist/lib/layout/wasm/artifact.js.map +7 -0
- package/dist/lib/layout/wasm/bytes.d.ts +1 -0
- package/dist/lib/layout/wasm/bytes.js +5 -0
- package/dist/lib/layout/wasm/bytes.js.map +7 -0
- package/dist/lib/layout/wasm/embedded.d.ts +2 -0
- package/dist/lib/layout/wasm/embedded.js +12 -0
- package/dist/lib/layout/wasm/embedded.js.map +7 -0
- package/dist/lib/layout/wasm/layout.wasm +0 -0
- package/dist/lib/layout/wasm/module.d.ts +8 -0
- package/dist/lib/layout/wasm/module.js +70 -0
- package/dist/lib/layout/wasm/module.js.map +7 -0
- package/dist/lib/layout/wasm/region.d.ts +267 -0
- package/dist/lib/layout/wasm/region.js +1018 -0
- package/dist/lib/layout/wasm/region.js.map +7 -0
- package/dist/lib/manipulation/controller.js +4 -7
- package/dist/lib/manipulation/controller.js.map +2 -2
- package/dist/lib/manipulation/frame.js +1 -1
- package/dist/lib/manipulation/frame.js.map +2 -2
- package/dist/lib/manipulation/handles.js +32 -33
- package/dist/lib/manipulation/handles.js.map +2 -2
- package/dist/lib/manipulation/solve.js +12 -10
- package/dist/lib/manipulation/solve.js.map +2 -2
- package/dist/lib/mount-pibbl.js +1 -0
- package/dist/lib/mount-pibbl.js.map +2 -2
- package/dist/lib/mount-prepared-pibbl.d.ts +5 -0
- package/dist/lib/mount-prepared-pibbl.js +29 -0
- package/dist/lib/mount-prepared-pibbl.js.map +7 -0
- package/dist/lib/mount-request.d.ts +8 -0
- package/dist/lib/mount-request.js +41 -0
- package/dist/lib/mount-request.js.map +7 -0
- package/dist/lib/pibbl.d.ts +21 -13
- package/dist/lib/pibbl.js +18 -16
- package/dist/lib/pibbl.js.map +2 -2
- package/dist/lib/recording/recording.d.ts +43 -0
- package/dist/lib/recording/recording.js +555 -0
- package/dist/lib/recording/recording.js.map +7 -0
- package/dist/lib/recording/types.d.ts +118 -0
- package/dist/lib/recording/wasm-bytes.d.ts +1 -0
- package/dist/lib/recording/wasm-bytes.js +5 -0
- package/dist/lib/recording/wasm-bytes.js.map +7 -0
- package/dist/lib/recording/worker-source.d.ts +1 -0
- package/dist/lib/recording/worker-source.js +5 -0
- package/dist/lib/recording/worker-source.js.map +7 -0
- package/dist/lib/render-layer/controller.d.ts +9 -3
- package/dist/lib/render-layer/controller.js +259 -110
- package/dist/lib/render-layer/controller.js.map +2 -2
- package/dist/lib/render-transaction.d.ts +12 -2
- package/dist/lib/render-transaction.js +69 -1
- package/dist/lib/render-transaction.js.map +2 -2
- package/dist/lib/render.js +32 -8
- package/dist/lib/render.js.map +2 -2
- package/dist/lib/scheduler/realm-scheduler.d.ts +2 -0
- package/dist/lib/scheduler/realm-scheduler.js +55 -26
- package/dist/lib/scheduler/realm-scheduler.js.map +2 -2
- package/dist/lib/scheduler/renderer-participant.js +1 -0
- package/dist/lib/scheduler/renderer-participant.js.map +2 -2
- package/dist/lib/series-inspection-frame.d.ts +18 -0
- package/dist/lib/series-inspection-frame.js +70 -0
- package/dist/lib/series-inspection-frame.js.map +7 -0
- package/dist/lib/signals/edge.d.ts +7 -4
- package/dist/lib/signals/edge.js +25 -3
- package/dist/lib/signals/edge.js.map +2 -2
- package/dist/lib/signals/graph.d.ts +16 -2
- package/dist/lib/signals/graph.js +54 -12
- package/dist/lib/signals/graph.js.map +2 -2
- package/dist/lib/signals/input-provision.d.ts +15 -0
- package/dist/lib/signals/input-provision.js +53 -3
- package/dist/lib/signals/input-provision.js.map +2 -2
- package/dist/lib/signals/render-consumer.d.ts +3 -0
- package/dist/lib/signals/render-consumer.js +22 -14
- package/dist/lib/signals/render-consumer.js.map +2 -2
- package/dist/lib/style/positioning.d.ts +50 -2
- package/dist/lib/style/positioning.js +28 -4
- package/dist/lib/style/positioning.js.map +2 -2
- package/dist/lib/style/resolve-built-in.d.ts +4 -3
- package/dist/lib/style/resolve-built-in.js +17 -3
- package/dist/lib/style/resolve-built-in.js.map +2 -2
- package/dist/lib/style/resolve-dispatch.d.ts +3 -0
- package/dist/lib/style/resolve-dispatch.js +77 -4
- package/dist/lib/style/resolve-dispatch.js.map +2 -2
- package/dist/lib/style/resolve-length.d.ts +2 -0
- package/dist/lib/style/resolve-length.js +13 -9
- package/dist/lib/style/resolve-length.js.map +2 -2
- package/dist/lib/style/sizing-length.d.ts +51 -0
- package/dist/lib/style/sizing-length.js +77 -0
- package/dist/lib/style/sizing-length.js.map +7 -0
- package/dist/lib/style/types.d.ts +63 -25
- package/dist/lib/surface/root-surface.js +10 -6
- package/dist/lib/surface/root-surface.js.map +2 -2
- package/dist/lib/textures/texture.js +10 -8
- package/dist/lib/textures/texture.js.map +2 -2
- package/dist/lib/transitions/capture.js +4 -1
- package/dist/lib/transitions/capture.js.map +2 -2
- package/dist/lib/transitions/embers-physics.js +17 -10
- package/dist/lib/transitions/embers-physics.js.map +2 -2
- package/dist/lib/types.d.ts +110 -1
- package/dist/sync.d.ts +16 -0
- package/dist/sync.js +13 -0
- package/dist/sync.js.map +7 -0
- package/dist/sync.mjs +1 -0
- package/package.json +43 -6
- package/dist/features/viz/lib/scale.d.ts +0 -11
- package/dist/features/viz/lib/scale.js +0 -80
- package/dist/features/viz/lib/scale.js.map +0 -7
- package/dist/features/viz/lib/use-scale.d.ts +0 -20
- package/dist/features/viz/lib/use-scale.js +0 -10
- package/dist/features/viz/lib/use-scale.js.map +0 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/features/physics/lib/2d/runtime/controller.ts"],
|
|
4
|
-
"sourcesContent": ["import { CommittedObstacles2D } from \"./obstacles.js\";\nimport { boundsOfShape2D } from \"../../../2d-geometry.js\";\nimport { createShape2D } from \"../shape-records.js\";\nimport type {\n PibblPhysicsBodyInspection2D,\n PibblPhysicsInspection2D,\n} from \"../inspection-types.js\";\nimport { RapierSimulation2D } from \"../world/rapier.js\";\nimport { signal, type WritableSignal } from \"@pibbl/core\";\nimport {\n pibblInternalOnSimulationRenderTransactionFinish,\n pibblInternalCreateSignalConsumer,\n pibblInternalCurrentRenderOwner,\n type PibblInternalSignalConsumer,\n pibblInternalQueueSimulationBegin,\n pibblInternalQueueSimulationCommitAcknowledgement,\n pibblInternalQueueSimulationComplete,\n pibblInternalRegisterSimulationAdvance,\n pibblInternalRequestSimulationRender,\n type PibblInternalSignalBatch,\n type PibblInternalSimulationOwner,\n} from \"@pibbl/core/internal\";\nimport type {\n PibblPhysicsAabb2D,\n PibblPhysicsPose2D,\n PibblPhysicsRay2D,\n PibblPhysicsShape2D,\n PibblPhysicsVector2,\n} from \"../../../2d-geometry.js\";\nimport type { ShapeRecord2D } from \"../shape-records.js\";\nimport type {\n PibblPhysicsBodyHandle2D,\n PibblPhysicsColliderHandle2D,\n PibblPhysicsQueryHit2D,\n PibblPhysicsQueryMatch2D,\n PibblPhysicsQueryMode,\n PibblPhysicsQueryOptions2D,\n PibblPhysicsQueryResult2D,\n PibblPhysicsWorldHandle2D,\n} from \"../types.js\";\nimport type { PibblResolvedPhysicsWorld2DProps } from \"./world-props.js\";\nimport { BODY_CCD_2D } from \"../world/ccd.js\";\nimport { COLLIDER_SENSOR_2D } from \"../world/contact-cache.js\";\nimport {\n BODY_FIXED_ROTATION_2D,\n BODY_TYPE_DYNAMIC_2D,\n BODY_TYPE_KINEMATIC_2D,\n} from \"../world/integrator.js\";\nimport { BODY_SLEEP_DISABLED_2D, BODY_SLEEPING_2D } from \"../world/solver.js\";\nimport type { BodyDefinition2D } from \"../world/storage.js\";\nimport {\n copyFiniteVector2,\n requireFiniteNumber,\n} from \"../../shared/validation.js\";\nimport {\n normalizePhysicsWorld2DConfiguration,\n PhysicsWorld2DKernel,\n type NormalizedPhysicsWorld2DConfiguration,\n type PhysicsBodyTopologyRecord2D,\n type PhysicsBodyCommand2D,\n type PhysicsColliderTopologyRecord2D,\n type PhysicsCommand2D,\n type PhysicsWorld2DConfiguration,\n type PhysicsTopologyRecord2D,\n type PhysicsWorld2DCandidate,\n} from \"../world/world.js\";\nimport { CommittedWorldQueries2D } from \"../world/queries.js\";\nimport {\n bindPhysicsBodyHandle2D,\n createPhysicsBodyHandle2D,\n physicsBodyHandleBinding2D,\n stagePhysicsBodyHandle2D,\n type PhysicsBodyHandleValues2D,\n unbindPhysicsBodyHandle2D,\n} from \"./body-handle.js\";\nimport {\n createPhysicsColliderHandle2D,\n isPhysicsBodyEventDelivery2D,\n materializePhysicsBodyEvent2D,\n materializePhysicsContactEvent2D,\n physicsColliderHandleIdentity2D,\n sortPhysicsEventDeliveries2D,\n type PhysicsBodyEventDelivery2D,\n type PhysicsContactEventDelivery2D,\n type PhysicsEventDelivery2D,\n} from \"./events.js\";\nimport {\n type MountedPhysicsAttachment2D,\n type NormalizedPhysicsColliderConfiguration2D,\n type PhysicsBodyAttachment2DDescriptor,\n} from \"./descriptors.js\";\n\nconst worldController2DSymbol = Symbol(\"PhysicsWorld2DController\");\n\ntype InternalWorldHandle2D = PibblPhysicsWorldHandle2D &\n Readonly<{\n readonly [worldController2DSymbol]: PhysicsWorld2DController;\n }>;\n\ninterface BodyDraft2D {\n readonly id: number;\n readonly attachment: MountedPhysicsAttachment2D;\n readonly descriptor: PhysicsBodyAttachment2DDescriptor;\n readonly initialPose: PibblPhysicsPose2D;\n}\n\ninterface ColliderDraft2D {\n readonly id: number;\n readonly bodyId: number;\n readonly attachment: MountedPhysicsAttachment2D;\n readonly options: NormalizedPhysicsColliderConfiguration2D;\n readonly shape: ShapeRecord2D;\n}\n\ninterface RenderDraft2D {\n readonly simulationToRoot: DOMMatrix;\n readonly configuration: NormalizedPhysicsWorld2DConfiguration;\n readonly props: PibblResolvedPhysicsWorld2DProps;\n readonly bodies: Map<number, BodyDraft2D>;\n readonly colliders: Map<number, ColliderDraft2D>;\n}\n\ninterface AcceptedBody2D {\n readonly id: number;\n readonly attachment: MountedPhysicsAttachment2D;\n readonly descriptor: PhysicsBodyAttachment2DDescriptor;\n readonly initialPose: PibblPhysicsPose2D;\n readonly handleBindingGeneration: number | undefined;\n}\n\ninterface AcceptedCollider2D {\n readonly id: number;\n readonly bodyId: number;\n readonly attachment: MountedPhysicsAttachment2D;\n readonly options: NormalizedPhysicsColliderConfiguration2D;\n}\n\ninterface AttachmentIds2D {\n bodyId?: number;\n colliderId?: number;\n}\n\ninterface BodyVelocity2D {\n readonly linearVelocityX: number;\n readonly linearVelocityY: number;\n readonly angularVelocity: number;\n}\n\nexport interface PhysicsWorld2DControllerSnapshot {\n readonly revision: number;\n readonly revisionMaterialized: boolean;\n readonly materializedBodyHandles: number;\n readonly materializedColliderHandles: number;\n readonly advanceRegistered: boolean;\n readonly bodyIds: readonly number[];\n readonly colliderIds: readonly number[];\n readonly kernel: ReturnType<PhysicsWorld2DKernel[\"snapshot\"]>;\n}\n\nexport class PhysicsWorld2DController {\n readonly handle: PibblPhysicsWorldHandle2D;\n private revision: WritableSignal<number> | undefined;\n private committedRevision = 0;\n private obstacles: CommittedObstacles2D | undefined;\n private obstacleSource: Readonly<{ read(): Readonly<{ revision: number; boxes: Float64Array; ellipses: Float64Array; polygons: Float64Array }> }> | undefined;\n\n getObstacleSource(): Readonly<{ read(): Readonly<{ revision: number; boxes: Float64Array; ellipses: Float64Array; polygons: Float64Array }> }> {\n this.assertActive();\n if (!this.obstacleSource) {\n if (this.liveCandidate) throw new Error(\"Create physics obstacles before simulation Advance.\");\n this.obstacles = new CommittedObstacles2D();\n this.obstacles.publish(this.kernel, this.acceptedColliders, this.committedRevision);\n this.obstacleSource = Object.freeze({ read: () => {\n this.assertActive();\n return this.obstacles!.read();\n } });\n }\n return this.obstacleSource;\n }\n private failedFrames = 0;\n private lastFailure: string | null = null;\n private readonly kernel: PhysicsWorld2DKernel;\n private readonly ids = new WeakMap<object, AttachmentIds2D>();\n private nextId = 0;\n private draft: RenderDraft2D | undefined;\n private acceptedTopology: readonly PhysicsTopologyRecord2D[] = Object.freeze(\n [],\n );\n private acceptedBodies: readonly AcceptedBody2D[] = Object.freeze([]);\n private acceptedColliders: readonly AcceptedCollider2D[] = Object.freeze([]);\n private acceptedConfiguration: NormalizedPhysicsWorld2DConfiguration;\n private acceptedProps: PibblResolvedPhysicsWorld2DProps = Object.freeze({});\n private readonly suspendedVelocities = new Map<number, BodyVelocity2D>();\n private readonly materializedBodyHandles = new Map<\n string,\n PibblPhysicsBodyHandle2D\n >();\n private readonly materializedColliderHandles = new Map<\n string,\n PibblPhysicsColliderHandle2D\n >();\n private materializedHandleTopologyPending = false;\n private readonly queries: CommittedWorldQueries2D;\n private queuedBegin: Readonly<{ cancel(): void }> | undefined;\n private releaseAdvance: (() => void) | undefined;\n private readonly releasePassiveAdvance: () => void;\n private liveCandidate: PhysicsWorld2DCandidate | undefined;\n private active = true;\n private readonly space: \"root\" | \"local\";\n private simulationToRoot = new DOMMatrix();\n private readonly targetConsumer: PibblInternalSignalConsumer;\n\n constructor(\n private readonly owner: PibblInternalSimulationOwner,\n initialProps: PibblResolvedPhysicsWorld2DProps,\n ) {\n this.space = initialProps.space ?? \"root\";\n if (this.space !== \"root\" && this.space !== \"local\")\n throw new TypeError('PhysicsWorld2D space must be \"root\" or \"local\".');\n this.targetConsumer = pibblInternalCreateSignalConsumer({\n owner: pibblInternalCurrentRenderOwner(),\n debugName: \"PhysicsWorld2D kinematic targets\",\n invalidate: () => {\n if (this.active) this.ensureAdvance();\n },\n });\n const configuration = normalizeWorldConfiguration(initialProps);\n this.kernel = new PhysicsWorld2DKernel(\n denormalizeWorldConfiguration(configuration),\n new RapierSimulation2D(),\n );\n // Idle worlds still observe animation's staged target in the same Advance\n // phase, without keeping the host clock alive themselves.\n this.releasePassiveAdvance = pibblInternalRegisterSimulationAdvance(\n this.owner,\n \"physics\",\n (frame, batch) => {\n if (this.releaseAdvance !== undefined) return;\n const targets = this.readKinematicTargets(batch);\n for (const [id, target] of targets) {\n if (this.kernel.bodyIdentity(id) === undefined) continue;\n const pose = this.kernel.authoritativePose(id);\n if (\n target.position[0] !== pose.position[0] ||\n target.position[1] !== pose.position[1] ||\n target.rotationDegrees !== pose.rotationDegrees\n ) {\n this.ensureAdvance();\n this.advance(frame.frameId, frame.logicalTime, batch);\n return;\n }\n }\n },\n false,\n );\n this.queries = new CommittedWorldQueries2D({\n generation: 1,\n bodies: this.kernel.bodies,\n colliders: this.kernel.colliders,\n broadPhase: this.kernel.broadPhase,\n materializeBody: (index, generation) =>\n this.materializeBodyHandle(index, generation),\n materializeCollider: (index, generation) =>\n this.materializeColliderHandle(index, generation),\n resolveBody: (handle) => this.resolveBodyHandle(handle),\n resolveCollider: (handle) => this.resolveColliderHandle(handle),\n });\n this.acceptedConfiguration = configuration;\n const target = {\n [worldController2DSymbol]: this,\n } as Record<PropertyKey, unknown>;\n Object.defineProperty(target, \"revision\", {\n enumerable: true,\n get: () => this.materializeRevision().asReadonly(),\n });\n this.handle = Object.freeze(target) as unknown as InternalWorldHandle2D;\n }\n\n beginRender(\n props: PibblResolvedPhysicsWorld2DProps,\n rootTransform = new DOMMatrix(),\n ): void {\n if ((props.space ?? \"root\") !== this.space)\n throw new Error(\n \"PhysicsWorld2D space is creation-only; remount the world with a new key to change it.\",\n );\n const simulationToRoot =\n this.space === \"local\" ? rootTransform : new DOMMatrix();\n const { a, b, c, d, e, f } = simulationToRoot;\n if (\n ![a, b, c, d, e, f].every(Number.isFinite) ||\n Math.abs(a * d - b * c) < 1e-10\n )\n throw new Error(\n \"PhysicsWorld2D viewport transform must be finite and invertible.\",\n );\n this.assertActive();\n if (this.draft !== undefined) {\n throw new Error(\n \"PhysicsWorld2D began a second render before finishing the first.\",\n );\n }\n this.draft = {\n simulationToRoot,\n configuration: normalizeWorldConfiguration(props),\n props,\n bodies: new Map(),\n colliders: new Map(),\n };\n pibblInternalOnSimulationRenderTransactionFinish(this.owner, (success) =>\n this.finishRender(success),\n );\n }\n\n simulationTransform(root: DOMMatrix): DOMMatrix {\n return (this.draft?.simulationToRoot ?? this.simulationToRoot)\n .inverse()\n .multiply(root);\n }\n\n rootTransform(local: DOMMatrix): DOMMatrix {\n return (this.draft?.simulationToRoot ?? this.simulationToRoot).multiply(\n local,\n );\n }\n\n convertPoint(point: PibblPhysicsVector2, toRoot: boolean): PibblPhysicsVector2 {\n this.assertActive();\n const value = copyFiniteVector2(point, \"point\");\n const matrix = toRoot\n ? this.simulationToRoot\n : this.simulationToRoot.inverse();\n return Object.freeze([\n matrix.a * value[0] + matrix.c * value[1] + matrix.e,\n matrix.b * value[0] + matrix.d * value[1] + matrix.f,\n ]);\n }\n\n bodyIdFor(attachment: MountedPhysicsAttachment2D): number {\n let ids = this.ids.get(attachment);\n if (!ids) {\n ids = {};\n this.ids.set(attachment, ids);\n }\n return (ids.bodyId ??= this.allocateId());\n }\n\n colliderIdFor(attachment: MountedPhysicsAttachment2D): number {\n let ids = this.ids.get(attachment);\n if (!ids) {\n ids = {};\n this.ids.set(attachment, ids);\n }\n return (ids.colliderId ??= this.allocateId());\n }\n\n collectBody(\n attachment: MountedPhysicsAttachment2D,\n bodyId: number,\n descriptor: PhysicsBodyAttachment2DDescriptor,\n initialPose: PibblPhysicsPose2D = ZERO_POSE_2D,\n ): void {\n const draft = this.requireDraft();\n draft.bodies.set(bodyId, {\n id: bodyId,\n attachment,\n descriptor,\n initialPose: copyPhysicsPose2D(initialPose),\n });\n const collider = descriptor.options.collider;\n if (\n collider !== false &&\n collider.shape !== \"self\" &&\n descriptor.options.enabled\n ) {\n const colliderId = this.colliderIdFor(attachment);\n draft.colliders.set(colliderId, {\n id: colliderId,\n bodyId,\n attachment,\n options: collider,\n shape: attachment.resolveShape(collider),\n });\n }\n }\n\n collectCollider(\n attachment: MountedPhysicsAttachment2D,\n bodyId: number,\n options: NormalizedPhysicsColliderConfiguration2D,\n ): void {\n if (options.shape === \"self\") return;\n const draft = this.requireDraft();\n if (draft.bodies.get(bodyId)?.descriptor.options.enabled === false) return;\n const colliderId = this.colliderIdFor(attachment);\n draft.colliders.set(colliderId, {\n id: colliderId,\n bodyId,\n attachment,\n options,\n shape: attachment.resolveShape(options),\n });\n }\n\n queueCommands(commands: readonly PhysicsCommand2D[]): void {\n this.assertActive();\n if (commands.length === 0) return;\n pibblInternalQueueSimulationBegin(this.owner, () => {\n this.kernel.applyBegin(commands);\n });\n this.ensureAdvance();\n }\n\n acceptBodyHandleCommand(\n handle: PibblPhysicsBodyHandle2D,\n bindingGeneration: number,\n command: PhysicsBodyCommand2D,\n ): boolean {\n if (!this.active) return false;\n const binding = physicsBodyHandleBinding2D(handle);\n const accepted = this.acceptedBodies.find(\n (body) =>\n body.id === command.bodyId &&\n body.descriptor.options.handle === handle &&\n body.handleBindingGeneration === bindingGeneration,\n );\n const identity = this.kernel.bodyIdentity(command.bodyId);\n const materialized =\n identity === undefined\n ? undefined\n : this.materializedBodyHandles.get(\n `${String(identity.index)}:${String(identity.generation)}`,\n );\n if (\n binding?.controller !== this ||\n binding.bindingGeneration !== bindingGeneration ||\n (accepted === undefined && materialized !== handle)\n ) {\n return false;\n }\n this.kernel.applyBegin([command]);\n this.ensureAdvance();\n return true;\n }\n\n presentationPose(bodyId: number): PibblPhysicsPose2D | undefined {\n return this.kernel.bodyIdentity(bodyId) !== undefined\n ? this.kernel.presentationPose(bodyId)\n : undefined;\n }\n\n raycast<Mode extends PibblPhysicsQueryMode = \"closest\">(\n ray: PibblPhysicsRay2D,\n options?: PibblPhysicsQueryOptions2D<Mode>,\n ): PibblPhysicsQueryResult2D<Mode, PibblPhysicsQueryHit2D> {\n this.assertActive();\n return this.queries.raycast(1, ray, options);\n }\n\n shapeCast<Mode extends PibblPhysicsQueryMode = \"closest\">(\n shape: PibblPhysicsShape2D,\n from: PibblPhysicsPose2D,\n translation: PibblPhysicsVector2,\n options?: PibblPhysicsQueryOptions2D<Mode>,\n ): PibblPhysicsQueryResult2D<Mode, PibblPhysicsQueryHit2D> {\n this.assertActive();\n return this.queries.shapeCast(1, shape, from, translation, options);\n }\n\n overlapShape<Mode extends PibblPhysicsQueryMode = \"closest\">(\n shape: PibblPhysicsShape2D,\n pose: PibblPhysicsPose2D,\n options?: PibblPhysicsQueryOptions2D<Mode>,\n ): PibblPhysicsQueryResult2D<Mode, PibblPhysicsQueryMatch2D> {\n this.assertActive();\n return this.queries.overlapShape(1, shape, pose, options);\n }\n\n queryAabb<Mode extends PibblPhysicsQueryMode = \"closest\">(\n bounds: PibblPhysicsAabb2D,\n options?: PibblPhysicsQueryOptions2D<Mode>,\n ): PibblPhysicsQueryResult2D<Mode, PibblPhysicsQueryMatch2D> {\n this.assertActive();\n return this.queries.queryAabb(1, bounds, options);\n }\n\n queryPoint<Mode extends PibblPhysicsQueryMode = \"closest\">(\n point: PibblPhysicsVector2,\n options?: PibblPhysicsQueryOptions2D<Mode>,\n ): PibblPhysicsQueryResult2D<Mode, PibblPhysicsQueryMatch2D> {\n this.assertActive();\n return this.queries.queryPoint(1, point, options);\n }\n\n bodyHandleValues(bodyId: number): PhysicsBodyHandleValues2D | undefined {\n if (!this.active) return undefined;\n const identity = this.kernel.bodyIdentity(bodyId);\n if (identity === undefined) return undefined;\n const index = identity.index;\n const bodies = this.kernel.bodies;\n const state = {\n linearVelocityX: bodies.linearVelocityX[index]!,\n linearVelocityY: bodies.linearVelocityY[index]!,\n angularVelocity: bodies.angularVelocity[index]!,\n flags: bodies.flags[index]!,\n generation: identity.generation,\n };\n const pose = this.kernel.authoritativePose(bodyId);\n return Object.freeze({\n position: pose.position,\n rotationDegrees: pose.rotationDegrees,\n linearVelocity: Object.freeze([\n state.linearVelocityX,\n state.linearVelocityY,\n ] as const),\n angularVelocityDegreesPerSecond: (state.angularVelocity * 180) / Math.PI,\n sleeping: (state.flags & BODY_SLEEPING_2D) !== 0,\n enabled: this.kernel.isBodyEnabled(bodyId),\n generation: state.generation,\n });\n }\n\n inspectBody(bodyId: number): PibblPhysicsBodyInspection2D | undefined {\n if (!this.active) return undefined;\n const identity = this.kernel.bodyIdentity(bodyId);\n const declared = this.acceptedBodies.find((body) => body.id === bodyId);\n if (identity === undefined || declared === undefined) return undefined;\n const index = identity.index;\n const bodies = this.kernel.bodies;\n const flags = bodies.flags[index]!;\n return Object.freeze({\n id: bodyId,\n generation: identity.generation,\n type: declared.descriptor.bodyType,\n enabled: this.kernel.isBodyEnabled(bodyId),\n sleeping: !!(flags & BODY_SLEEPING_2D),\n pose: this.kernel.authoritativePose(bodyId),\n presentationPose: this.kernel.presentationPose(bodyId),\n centerOfMass: Object.freeze([\n bodies.positionX[index]!,\n bodies.positionY[index]!,\n ] as const),\n linearVelocity: Object.freeze([\n bodies.linearVelocityX[index]!,\n bodies.linearVelocityY[index]!,\n ] as const),\n angularVelocityDegreesPerSecond:\n (bodies.angularVelocity[index]! * 180) / Math.PI,\n mass: bodies.inverseMass[index]! > 0 ? 1 / bodies.inverseMass[index]! : null,\n });\n }\n\n dispose(): void {\n if (!this.active) return;\n this.active = false;\n this.targetConsumer.dispose();\n this.releasePassiveAdvance();\n this.queuedBegin?.cancel();\n this.queuedBegin = undefined;\n this.releaseAdvance?.();\n this.releaseAdvance = undefined;\n if (this.liveCandidate !== undefined) {\n this.kernel.discard(this.liveCandidate);\n this.liveCandidate = undefined;\n }\n for (const body of this.acceptedBodies) this.unbindBodyHandle(body);\n for (const handle of this.materializedBodyHandles.values()) {\n const binding = physicsBodyHandleBinding2D(handle);\n if (binding?.controller === this) {\n unbindPhysicsBodyHandle2D(\n handle,\n this,\n binding.bodyId,\n binding.bindingGeneration,\n );\n }\n }\n this.materializedBodyHandles.clear();\n this.materializedColliderHandles.clear();\n this.materializedHandleTopologyPending = false;\n this.obstacles = undefined;\n this.obstacleSource = undefined;\n this.kernel.dispose();\n this.queries.invalidate();\n this.acceptedBodies = Object.freeze([]);\n this.acceptedColliders = Object.freeze([]);\n this.draft = undefined;\n this.suspendedVelocities.clear();\n }\n\n inspect(): PibblPhysicsInspection2D {\n this.assertActive();\n const snapshot = this.kernel.snapshot();\n const vector = (x: number, y: number): PibblPhysicsVector2 =>\n Object.freeze([x, y]);\n const contacts = this.kernel.contacts;\n const declaredTypes = new Map(\n this.acceptedBodies.map((body) => [body.id, body.descriptor.bodyType]),\n );\n return Object.freeze({\n engine: \"rapier-2d@0.21.0\",\n space: this.space,\n revision: this.committedRevision,\n tick: snapshot.tick,\n advancing: this.releaseAdvance !== undefined,\n failedFrames: this.failedFrames,\n lastFailure: this.lastFailure,\n bodies: Object.freeze(\n snapshot.bodies.map((body) =>\n Object.freeze({\n id: body.id,\n generation: body.generation,\n type: declaredTypes.get(body.id)!,\n enabled: this.kernel.isBodyEnabled(body.id),\n sleeping: !!(body.flags & BODY_SLEEPING_2D),\n pose: this.kernel.authoritativePose(body.id),\n presentationPose: this.kernel.presentationPose(body.id),\n centerOfMass: vector(body.positionX, body.positionY),\n linearVelocity: vector(body.linearVelocityX, body.linearVelocityY),\n angularVelocityDegreesPerSecond:\n (body.angularVelocity * 180) / Math.PI,\n mass: body.inverseMass > 0 ? 1 / body.inverseMass : null,\n }),\n ),\n ),\n colliders: Object.freeze(\n this.acceptedColliders.flatMap((collider) => {\n const identity = this.kernel.colliderIdentity(collider.id);\n if (!identity) return [];\n const shape = this.kernel.colliders.shapes[identity.index]!;\n return [\n Object.freeze({\n id: collider.id,\n generation: identity.generation,\n bodyId: collider.bodyId,\n sensor: !!(\n this.kernel.colliders.flags[identity.index]! &\n COLLIDER_SENSOR_2D\n ),\n label:\n typeof collider.options.tag === \"string\"\n ? collider.options.tag\n : null,\n shapeKinds: Object.freeze(shape.leaves.map((leaf) => leaf.kind)),\n bounds: boundsOfShape2D(\n createShape2D(shape),\n this.kernel.authoritativePose(collider.bodyId),\n ),\n }),\n ];\n }),\n ),\n contacts: Object.freeze(\n Array.from(\n { length: contacts.contactCount },\n (_, index) => index,\n ).flatMap((index) => {\n const firstColliderId = this.kernel.colliderIdForIdentity(\n contacts.firstColliderIndices[index]!,\n contacts.firstColliderGenerations[index]!,\n );\n const secondColliderId = this.kernel.colliderIdForIdentity(\n contacts.secondColliderIndices[index]!,\n contacts.secondColliderGenerations[index]!,\n );\n if (firstColliderId === undefined || secondColliderId === undefined)\n return [];\n return [\n Object.freeze({\n firstColliderId,\n secondColliderId,\n sensor: contacts.sensorFlags[index] !== 0,\n normal: vector(\n contacts.normalX[index]!,\n contacts.normalY[index]!,\n ),\n normalImpulse:\n contacts.pointNormalImpulses[index * 2]! +\n (contacts.pointCounts[index]! > 1\n ? contacts.pointNormalImpulses[index * 2 + 1]!\n : 0),\n points: Object.freeze(\n Array.from(\n { length: contacts.pointCounts[index]! },\n (_, point) => {\n const offset = index * 2 + point;\n return Object.freeze({\n pointOnFirst: vector(\n contacts.pointFirstX[offset]!,\n contacts.pointFirstY[offset]!,\n ),\n pointOnSecond: vector(\n contacts.pointSecondX[offset]!,\n contacts.pointSecondY[offset]!,\n ),\n separation: contacts.pointSeparations[offset]!,\n });\n },\n ),\n ),\n }),\n ];\n }),\n ),\n });\n }\n\n snapshot(): PhysicsWorld2DControllerSnapshot {\n return Object.freeze({\n revision: this.committedRevision,\n revisionMaterialized: this.revision !== undefined,\n materializedBodyHandles: this.materializedBodyHandles.size,\n materializedColliderHandles: this.materializedColliderHandles.size,\n advanceRegistered: this.releaseAdvance !== undefined,\n bodyIds: Object.freeze(\n this.acceptedTopology\n .filter(\n (record): record is PhysicsBodyTopologyRecord2D =>\n record.kind === \"body\",\n )\n .map((record) => record.id),\n ),\n colliderIds: Object.freeze(\n this.acceptedTopology\n .filter(\n (record): record is PhysicsColliderTopologyRecord2D =>\n record.kind === \"collider\",\n )\n .map((record) => record.id),\n ),\n kernel: this.kernel.snapshot(),\n });\n }\n\n private finishRender(success: boolean): void {\n const draft = this.draft;\n this.draft = undefined;\n if (!success || draft === undefined || !this.active) return;\n validateAutomaticMass(draft);\n const reenableVelocities = this.resolveReenableVelocities(draft);\n const previousBodyDefinitions = new Map(\n this.acceptedTopology\n .filter(\n (record): record is PhysicsBodyTopologyRecord2D =>\n record.kind === \"body\",\n )\n .map((record) => [record.id, record.definition] as const),\n );\n const topology = materializeTopology(\n draft,\n reenableVelocities,\n previousBodyDefinitions,\n );\n const topologyChanged = !sameTopology(this.acceptedTopology, topology);\n const configurationChanged = !sameConfiguration(\n this.acceptedConfiguration,\n draft.configuration,\n );\n const nextBodies = [...draft.bodies.values()].sort(\n (left, right) => left.id - right.id,\n );\n validateUniqueBodyHandles(nextBodies);\n const nextBodiesById = new Map(nextBodies.map((body) => [body.id, body]));\n for (const body of this.acceptedBodies) {\n const next = nextBodiesById.get(body.id);\n const retained =\n next !== undefined &&\n next.descriptor.options.handle === body.descriptor.options.handle;\n if (!retained) this.unbindBodyHandle(body);\n }\n this.simulationToRoot = draft.simulationToRoot;\n this.acceptedProps = draft.props;\n this.acceptedBodies = Object.freeze(\n nextBodies.map(({ id, attachment, descriptor, initialPose }) =>\n Object.freeze({\n id,\n attachment,\n descriptor,\n initialPose,\n handleBindingGeneration:\n descriptor.options.handle === undefined\n ? undefined\n : bindPhysicsBodyHandle2D(descriptor.options.handle, this, id),\n }),\n ),\n );\n this.acceptedColliders = Object.freeze(\n [...draft.colliders.values()]\n .sort((left, right) => left.id - right.id)\n .map(({ id, bodyId, attachment, options }) =>\n Object.freeze({ id, bodyId, attachment, options }),\n ),\n );\n this.targetConsumer.collect(() => {\n for (const body of this.acceptedBodies) {\n if (\n body.descriptor.bodyType !== \"kinematic\" ||\n !body.descriptor.options.enabled\n )\n continue;\n body.descriptor.options.target.position?.get();\n body.descriptor.options.target.rotationDegrees?.get();\n }\n });\n this.targetConsumer.markClean();\n this.acceptedTopology = topology;\n this.kernel.updateColliderMetadata(topology);\n if (topologyChanged) this.materializedHandleTopologyPending = true;\n if (!topologyChanged && !configurationChanged) return;\n this.acceptedConfiguration = draft.configuration;\n this.queuedBegin?.cancel();\n this.queuedBegin = pibblInternalQueueSimulationBegin(this.owner, () => {\n this.queuedBegin = undefined;\n if (topologyChanged) this.kernel.proposeTopology(this.acceptedTopology);\n if (configurationChanged) {\n this.kernel.applyBegin([\n {\n kind: \"configure\",\n configuration: denormalizeWorldConfiguration(draft.configuration),\n },\n ]);\n }\n });\n this.ensureAdvance();\n }\n\n private ensureAdvance(): void {\n if (this.releaseAdvance !== undefined) return;\n this.releaseAdvance = pibblInternalRegisterSimulationAdvance(\n this.owner,\n \"physics\",\n (frame, batch) => this.advance(frame.frameId, frame.logicalTime, batch),\n );\n }\n\n private resolveReenableVelocities(\n draft: RenderDraft2D,\n ): ReadonlyMap<number, BodyVelocity2D> {\n const previousById = new Map(\n this.acceptedBodies.map((body) => [body.id, body]),\n );\n const overrides = new Map<number, BodyVelocity2D>();\n for (const body of draft.bodies.values()) {\n const previous = previousById.get(body.id);\n const currentDynamic =\n body.descriptor.bodyType === \"dynamic\" ? body.descriptor : undefined;\n const previousDynamic =\n previous?.descriptor.bodyType === \"dynamic\"\n ? previous.descriptor\n : undefined;\n if (\n currentDynamic !== undefined &&\n !currentDynamic.options.enabled &&\n previousDynamic?.options.enabled\n ) {\n const identity = this.kernel.bodyIdentity(body.id);\n if (identity !== undefined) {\n const bodies = this.kernel.bodies;\n this.suspendedVelocities.set(\n body.id,\n Object.freeze({\n linearVelocityX: bodies.linearVelocityX[identity.index]!,\n linearVelocityY: bodies.linearVelocityY[identity.index]!,\n angularVelocity: bodies.angularVelocity[identity.index]!,\n }),\n );\n }\n }\n if (\n currentDynamic?.options.enabled &&\n previousDynamic !== undefined &&\n !previousDynamic.options.enabled\n ) {\n const preserved = this.suspendedVelocities.get(body.id);\n overrides.set(\n body.id,\n currentDynamic.options.reenableVelocity === \"preserve\" && preserved\n ? preserved\n : ZERO_VELOCITY_2D,\n );\n }\n }\n const retained = new Set(draft.bodies.keys());\n for (const id of this.suspendedVelocities.keys()) {\n if (!retained.has(id)) this.suspendedVelocities.delete(id);\n }\n return overrides;\n }\n\n private advance(\n frameId: number,\n logicalTime: number,\n batch: PibblInternalSignalBatch,\n ): void {\n let candidate: PhysicsWorld2DCandidate | undefined;\n try {\n candidate = this.kernel.advance({\n frameId,\n logicalTime,\n stagedKinematicTargets: this.readKinematicTargets(batch),\n });\n if (candidate === undefined) return;\n this.liveCandidate = candidate;\n const nextRevision = this.committedRevision + 1;\n this.stagePublicSignals(batch, nextRevision);\n const events = this.copyEventDeliveries(candidate);\n let adopted = false;\n if (events.length > 0) {\n pibblInternalQueueSimulationComplete(this.owner, () => {\n if (adopted) this.deliverEvents(events);\n });\n }\n pibblInternalQueueSimulationCommitAcknowledgement(\n this.owner,\n (_frame, outcome) => {\n if (this.liveCandidate !== candidate) return;\n this.liveCandidate = undefined;\n if (!outcome.applied) {\n this.kernel.discard(candidate!);\n return;\n }\n this.kernel.adopt(candidate!);\n if (this.materializedHandleTopologyPending) {\n this.evictRetiredMaterializedHandles();\n this.materializedHandleTopologyPending = false;\n }\n this.committedRevision = nextRevision;\n this.obstacles?.publish(this.kernel, this.acceptedColliders, nextRevision);\n adopted = true;\n pibblInternalRequestSimulationRender(this.owner);\n if (\n !this.hasAwakeBodies() &&\n (candidate!.stepCount > 0 ||\n !this.acceptedBodies.some(\n (body) => body.descriptor.bodyType === \"kinematic\",\n ))\n ) {\n this.releaseAdvance?.();\n this.releaseAdvance = undefined;\n }\n },\n );\n } catch (error) {\n this.failedFrames++;\n this.lastFailure = error instanceof Error ? error.message : String(error);\n if (candidate?.lifecycle === \"live\") this.kernel.discard(candidate);\n if (this.liveCandidate === candidate) this.liveCandidate = undefined;\n const onError = this.acceptedProps.onError;\n if (onError) {\n pibblInternalQueueSimulationComplete(this.owner, () => onError(error));\n }\n throw error;\n }\n }\n\n private readKinematicTargets(\n batch: PibblInternalSignalBatch,\n ): ReadonlyMap<number, PibblPhysicsPose2D> {\n const targets = new Map<number, PibblPhysicsPose2D>();\n for (const body of this.acceptedBodies) {\n if (\n body.descriptor.bodyType !== \"kinematic\" ||\n !body.descriptor.options.enabled\n )\n continue;\n const target = body.descriptor.options.target;\n if (\n target.position === undefined &&\n target.rotationDegrees === undefined\n ) {\n continue;\n }\n const position =\n target.position === undefined\n ? body.initialPose.position\n : batch.read(\n target.position as WritableSignal<readonly [number, number]>,\n );\n const rotationDegrees =\n target.rotationDegrees === undefined\n ? body.initialPose.rotationDegrees\n : batch.read(target.rotationDegrees as WritableSignal<number>);\n targets.set(\n body.id,\n Object.freeze({\n position: Object.freeze([position[0], position[1]] as const),\n rotationDegrees,\n }),\n );\n }\n return targets;\n }\n\n private stagePublicSignals(\n batch: PibblInternalSignalBatch,\n nextRevision: number,\n ): void {\n if (this.revision !== undefined) {\n batch.stage(this.revision, nextRevision, this);\n }\n const bodies = this.kernel.bodies;\n for (const body of this.acceptedBodies) {\n const identity = this.kernel.bodyIdentity(body.id);\n if (identity === undefined) continue;\n const explicit = body.descriptor.options.handle;\n const materialized = this.materializedBodyHandles.get(\n `${String(identity.index)}:${String(identity.generation)}`,\n );\n if (explicit === undefined && materialized === undefined) continue;\n const pose = this.kernel.authoritativePose(body.id);\n const values = {\n position: pose.position,\n rotationDegrees: pose.rotationDegrees,\n linearVelocity: Object.freeze([\n bodies.linearVelocityX[identity.index]!,\n bodies.linearVelocityY[identity.index]!,\n ] as const),\n angularVelocityDegreesPerSecond:\n (bodies.angularVelocity[identity.index]! * 180) / Math.PI,\n sleeping: (bodies.flags[identity.index]! & BODY_SLEEPING_2D) !== 0,\n enabled: this.kernel.isBodyEnabled(body.id),\n generation: identity.generation,\n } as const;\n if (explicit !== undefined) {\n stagePhysicsBodyHandle2D(batch, explicit, values, this);\n }\n if (materialized !== undefined && materialized !== explicit) {\n stagePhysicsBodyHandle2D(batch, materialized, values, this);\n }\n }\n }\n\n private copyEventDeliveries(\n candidate: PhysicsWorld2DCandidate,\n ): readonly PhysicsEventDelivery2D[] {\n const events: PhysicsEventDelivery2D[] = [];\n for (let offset = 0; offset < candidate.eventCount; offset += 1) {\n const eventIndex = candidate.eventOffset + offset;\n const kind = candidate.eventKinds[eventIndex];\n if (kind === 5 || kind === 6) {\n const handler =\n kind === 6 ? this.acceptedProps.onSleep : this.acceptedProps.onWake;\n if (handler === undefined) continue;\n const bodyIndex = candidate.eventFirstColliderIndices[eventIndex]!;\n const bodyGeneration = this.kernel.bodies.generations[bodyIndex]!;\n const bodyId = this.kernel.bodyIdForIdentity(bodyIndex, bodyGeneration);\n if (bodyId === undefined) continue;\n events.push(\n Object.freeze({\n kind,\n tick: candidate.eventTicks[eventIndex]!,\n bodyIndex,\n bodyGeneration,\n bodyId,\n handler,\n }) satisfies PhysicsBodyEventDelivery2D,\n );\n continue;\n }\n if (kind !== 1 && kind !== 2 && kind !== 3 && kind !== 4 && kind !== 7) {\n continue;\n }\n this.copyContactEventDeliveries(candidate, eventIndex, kind, events);\n }\n return sortPhysicsEventDeliveries2D(events);\n }\n\n private copyContactEventDeliveries(\n candidate: PhysicsWorld2DCandidate,\n eventIndex: number,\n kind: PhysicsContactEventDelivery2D[\"kind\"],\n events: PhysicsEventDelivery2D[],\n ): void {\n const firstColliderIndex = candidate.eventFirstColliderIndices[eventIndex]!;\n const firstColliderGeneration =\n candidate.eventFirstColliderGenerations[eventIndex]!;\n const secondColliderIndex =\n candidate.eventSecondColliderIndices[eventIndex]!;\n const secondColliderGeneration =\n candidate.eventSecondColliderGenerations[eventIndex]!;\n const first = this.acceptedColliderForIdentity(\n firstColliderIndex,\n firstColliderGeneration,\n );\n const second = this.acceptedColliderForIdentity(\n secondColliderIndex,\n secondColliderGeneration,\n );\n if (first === undefined || second === undefined) return;\n const handlerName = eventHandlerName(kind);\n const firstHandler = first.options.handlers[handlerName];\n const secondHandler = second.options.handlers[handlerName];\n if (firstHandler === undefined && secondHandler === undefined) return;\n const firstBodyIdentity = this.kernel.bodyIdentity(first.bodyId);\n const secondBodyIdentity = this.kernel.bodyIdentity(second.bodyId);\n if (firstBodyIdentity === undefined || secondBodyIdentity === undefined)\n return;\n const points: Array<PhysicsContactEventDelivery2D[\"points\"][number]> = [];\n const pointBase = eventIndex * 2;\n for (\n let point = 0;\n point < candidate.eventPointCounts[eventIndex]!;\n point += 1\n ) {\n points.push(\n Object.freeze({\n firstX: candidate.eventPointFirstX[pointBase + point]!,\n firstY: candidate.eventPointFirstY[pointBase + point]!,\n secondX: candidate.eventPointSecondX[pointBase + point]!,\n secondY: candidate.eventPointSecondY[pointBase + point]!,\n separation: candidate.eventPointSeparations[pointBase + point]!,\n }),\n );\n }\n const common = {\n kind,\n tick: candidate.eventTicks[eventIndex]!,\n firstColliderIndex,\n firstColliderGeneration,\n secondColliderIndex,\n secondColliderGeneration,\n firstBodyIndex: firstBodyIdentity.index,\n firstBodyGeneration: firstBodyIdentity.generation,\n secondBodyIndex: secondBodyIdentity.index,\n secondBodyGeneration: secondBodyIdentity.generation,\n normalX: candidate.eventNormalX[eventIndex]!,\n normalY: candidate.eventNormalY[eventIndex]!,\n points: Object.freeze(points),\n totalNormalImpulse: candidate.eventTotalNormalImpulses[eventIndex]!,\n } as const;\n if (firstHandler !== undefined) {\n events.push(\n Object.freeze({\n ...common,\n receiver: \"first\",\n receiverColliderId: first.id,\n receiverBodyId: first.bodyId,\n handler: firstHandler,\n selfTag: first.options.tag,\n otherTag: second.options.tag,\n }) as PhysicsContactEventDelivery2D,\n );\n }\n if (secondHandler !== undefined) {\n events.push(\n Object.freeze({\n ...common,\n receiver: \"second\",\n receiverColliderId: second.id,\n receiverBodyId: second.bodyId,\n handler: secondHandler,\n selfTag: second.options.tag,\n otherTag: first.options.tag,\n }) as PhysicsContactEventDelivery2D,\n );\n }\n }\n\n private deliverEvents(events: readonly PhysicsEventDelivery2D[]): void {\n if (!this.active) return;\n const errors: unknown[] = [];\n for (const fact of events) {\n try {\n if (isPhysicsBodyEventDelivery2D(fact)) {\n const handler = this.bodyEventHandler(fact);\n if (!handler) continue;\n handler(\n materializePhysicsBodyEvent2D(\n fact,\n this.materializeBodyHandle(fact.bodyIndex, fact.bodyGeneration),\n ),\n );\n continue;\n }\n const handler = this.contactEventHandler(fact);\n if (!handler) continue;\n handler(\n materializePhysicsContactEvent2D(fact, {\n body: (index, generation) =>\n this.materializeBodyHandle(index, generation),\n collider: (index, generation) =>\n this.materializeColliderHandle(index, generation),\n }) as never,\n );\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length === 1) throw errors[0];\n if (errors.length > 1) {\n throw new AggregateError(\n errors,\n \"Multiple physics 2D event callbacks failed.\",\n );\n }\n }\n\n private bodyEventHandler(\n fact: PhysicsBodyEventDelivery2D,\n ): PhysicsBodyEventDelivery2D[\"handler\"] | undefined {\n const handler =\n fact.kind === 6 ? this.acceptedProps.onSleep : this.acceptedProps.onWake;\n const identity = this.kernel.bodyIdentity(fact.bodyId);\n return identity?.index === fact.bodyIndex &&\n identity.generation === fact.bodyGeneration\n ? handler\n : undefined;\n }\n\n private contactEventHandler(\n fact: PhysicsContactEventDelivery2D,\n ): PhysicsContactEventDelivery2D[\"handler\"] | undefined {\n const receiver = this.acceptedColliders.find(\n (collider) => collider.id === fact.receiverColliderId,\n );\n if (receiver === undefined || receiver.bodyId !== fact.receiverBodyId)\n return undefined;\n const handler = receiver.options.handlers[eventHandlerName(fact.kind)];\n const colliderIdentity = this.kernel.colliderIdentity(receiver.id);\n const expectedIndex =\n fact.receiver === \"first\"\n ? fact.firstColliderIndex\n : fact.secondColliderIndex;\n const expectedGeneration =\n fact.receiver === \"first\"\n ? fact.firstColliderGeneration\n : fact.secondColliderGeneration;\n return colliderIdentity?.index === expectedIndex &&\n colliderIdentity.generation === expectedGeneration\n ? handler\n : undefined;\n }\n\n private acceptedColliderForIdentity(\n index: number,\n generation: number,\n ): AcceptedCollider2D | undefined {\n return this.acceptedColliders.find((collider) => {\n const identity = this.kernel.colliderIdentity(collider.id);\n return identity?.index === index && identity.generation === generation;\n });\n }\n\n private hasAwakeBodies(): boolean {\n for (const body of this.acceptedBodies) {\n if (\n body.descriptor.bodyType !== \"kinematic\" ||\n !body.descriptor.options.enabled ||\n this.kernel.bodyIdentity(body.id) === undefined\n )\n continue;\n const pose = this.kernel.authoritativePose(body.id);\n const target = body.descriptor.options.target;\n const position = target.position?.get() ?? body.initialPose.position;\n const rotation =\n target.rotationDegrees?.get() ?? body.initialPose.rotationDegrees;\n if (\n (position &&\n (position[0] !== pose.position[0] ||\n position[1] !== pose.position[1])) ||\n (rotation !== undefined && rotation !== pose.rotationDegrees)\n )\n return true;\n }\n const bodies = this.kernel.bodies;\n for (const body of this.acceptedBodies) {\n const identity = this.kernel.bodyIdentity(body.id);\n if (identity === undefined) continue;\n const index = identity.index;\n const flags = bodies.flags[index]!;\n if (\n (flags & BODY_TYPE_KINEMATIC_2D) !== 0 &&\n (bodies.linearVelocityX[index]! !== 0 ||\n bodies.linearVelocityY[index]! !== 0 ||\n bodies.angularVelocity[index]! !== 0)\n )\n return true;\n if (\n (flags & BODY_TYPE_DYNAMIC_2D) !== 0 &&\n (flags & BODY_SLEEPING_2D) === 0\n )\n return true;\n }\n return false;\n }\n\n private requireDraft(): RenderDraft2D {\n const draft = this.draft;\n if (draft === undefined) {\n throw new Error(\n \"A physics attachment requires an active PhysicsWorld2D render draft.\",\n );\n }\n return draft;\n }\n\n private allocateId(): number {\n if (this.nextId === Number.MAX_SAFE_INTEGER) {\n throw new Error(\"PhysicsWorld2D exhausted stable attachment identities.\");\n }\n return this.nextId++;\n }\n\n private assertActive(): void {\n if (!this.active) {\n throw new TypeError(\"Expected a live Pibbl physics 2D world handle.\");\n }\n }\n\n private materializeRevision(): WritableSignal<number> {\n return (this.revision ??= signal(this.committedRevision, {\n debugName: \"PhysicsWorld2D.revision\",\n }));\n }\n\n /** Query handles are cached only while their kernel identity remains live. */\n private evictRetiredMaterializedHandles(): void {\n for (const [key, handle] of this.materializedBodyHandles) {\n const separator = key.indexOf(\":\");\n const index = Number(key.slice(0, separator));\n const generation = Number(key.slice(separator + 1));\n if (this.kernel.bodyIdForIdentity(index, generation) !== undefined)\n continue;\n const binding = physicsBodyHandleBinding2D(handle);\n if (binding?.controller === this) {\n unbindPhysicsBodyHandle2D(\n handle,\n this,\n binding.bodyId,\n binding.bindingGeneration,\n );\n }\n this.materializedBodyHandles.delete(key);\n }\n for (const [key, handle] of this.materializedColliderHandles) {\n const identity = physicsColliderHandleIdentity2D(handle);\n if (\n identity?.controller === this &&\n this.kernel.colliderIdForIdentity(\n identity.index,\n identity.generation,\n ) !== undefined\n )\n continue;\n this.materializedColliderHandles.delete(key);\n }\n }\n\n private materializeBodyHandle(\n index: number,\n generation: number,\n ): PibblPhysicsBodyHandle2D {\n const bodyId = this.kernel.bodyIdForIdentity(index, generation);\n if (bodyId === undefined) {\n throw new Error(\n \"Cannot materialize a stale physics 2D body query result.\",\n );\n }\n const accepted = this.acceptedBodies.find((body) => body.id === bodyId);\n const explicit = accepted?.descriptor.options.handle;\n if (explicit !== undefined) return explicit;\n const key = `${String(index)}:${String(generation)}`;\n let handle = this.materializedBodyHandles.get(key);\n if (handle === undefined) {\n handle = createPhysicsBodyHandle2D(this.owner);\n bindPhysicsBodyHandle2D(handle, this, bodyId);\n this.materializedBodyHandles.set(key, handle);\n }\n return handle;\n }\n\n private materializeColliderHandle(\n index: number,\n generation: number,\n ): PibblPhysicsColliderHandle2D {\n if (this.kernel.colliderIdForIdentity(index, generation) === undefined) {\n throw new Error(\n \"Cannot materialize a stale physics 2D collider query result.\",\n );\n }\n const key = `${String(index)}:${String(generation)}`;\n let handle = this.materializedColliderHandles.get(key);\n if (handle === undefined) {\n handle = createPhysicsColliderHandle2D(this, index, generation);\n this.materializedColliderHandles.set(key, handle);\n }\n return handle;\n }\n\n private resolveBodyHandle(\n handle: PibblPhysicsBodyHandle2D,\n ): Readonly<{ index: number; generation: number }> | null {\n const binding = physicsBodyHandleBinding2D(handle);\n if (binding?.controller !== this) return null;\n return this.kernel.bodyIdentity(binding.bodyId) ?? null;\n }\n\n private resolveColliderHandle(\n handle: PibblPhysicsColliderHandle2D,\n ): Readonly<{ index: number; generation: number }> | null {\n const identity = physicsColliderHandleIdentity2D(handle);\n if (identity?.controller !== this) return null;\n return this.kernel.colliderIdForIdentity(\n identity.index,\n identity.generation,\n ) === undefined\n ? null\n : identity;\n }\n\n private unbindBodyHandle(body: AcceptedBody2D): void {\n const handle = body.descriptor.options.handle;\n const generation = body.handleBindingGeneration;\n if (handle !== undefined && generation !== undefined) {\n unbindPhysicsBodyHandle2D(handle, this, body.id, generation);\n }\n }\n}\n\nexport function requirePhysicsWorld2DController(\n handle: PibblPhysicsWorldHandle2D,\n): PhysicsWorld2DController {\n const controller = (handle as Partial<InternalWorldHandle2D>)[\n worldController2DSymbol\n ];\n if (!(controller instanceof PhysicsWorld2DController)) {\n throw new TypeError(\"Expected a live Pibbl physics 2D world handle.\");\n }\n return controller;\n}\n\nexport function snapshotPhysicsWorld2DControllerForTest(\n controller: PhysicsWorld2DController,\n): PhysicsWorld2DControllerSnapshot {\n return controller.snapshot();\n}\n\nfunction normalizeWorldConfiguration(\n props: PibblResolvedPhysicsWorld2DProps,\n): NormalizedPhysicsWorld2DConfiguration {\n return normalizePhysicsWorld2DConfiguration({\n gravity: props.gravity,\n fixedStepMilliseconds: props.fixedStepMilliseconds,\n maxCatchUpSteps: props.maxCatchUpSteps,\n interpolation: props.interpolation,\n sleeping: props.sleeping,\n solver: props.solver,\n });\n}\n\nfunction denormalizeWorldConfiguration(\n configuration: NormalizedPhysicsWorld2DConfiguration,\n): PhysicsWorld2DConfiguration {\n return Object.freeze({\n gravity: Object.freeze([\n configuration.gravityX,\n configuration.gravityY,\n ] as const),\n fixedStepMilliseconds: configuration.fixedStepMilliseconds,\n maxCatchUpSteps: configuration.maxCatchUpSteps,\n interpolation: configuration.interpolation,\n sleeping: configuration.sleeping,\n solver: Object.freeze({\n velocityIterations: configuration.velocityIterations,\n positionIterations: configuration.positionIterations,\n }),\n });\n}\n\nfunction materializeTopology(\n draft: RenderDraft2D,\n reenableVelocities: ReadonlyMap<number, BodyVelocity2D>,\n previousBodyDefinitions: ReadonlyMap<number, BodyDefinition2D>,\n): readonly PhysicsTopologyRecord2D[] {\n const collidersByBody = new Map<number, ColliderDraft2D[]>();\n for (const collider of draft.colliders.values()) {\n const entries = collidersByBody.get(collider.bodyId) ?? [];\n entries.push(collider);\n collidersByBody.set(collider.bodyId, entries);\n }\n const bodies = [...draft.bodies.values()]\n .sort((left, right) => left.id - right.id)\n .map((body): PhysicsBodyTopologyRecord2D =>\n Object.freeze({\n kind: \"body\",\n id: body.id,\n definition: bodyDefinition(\n body,\n collidersByBody.get(body.id) ?? [],\n reenableVelocities.get(body.id),\n previousBodyDefinitions.get(body.id),\n ),\n }),\n );\n const colliders = [...draft.colliders.values()]\n .sort((left, right) => left.id - right.id)\n .map((collider): PhysicsColliderTopologyRecord2D =>\n Object.freeze({\n kind: \"collider\",\n id: collider.id,\n bodyId: collider.bodyId,\n definition: Object.freeze({\n shape: collider.shape,\n material: Object.freeze({\n friction: collider.options.friction,\n restitution: collider.options.restitution,\n }),\n filter: collider.options.collisionFilter,\n tag: collider.options.tag,\n handlers: collider.options.handlers,\n owner: collider.attachment,\n flags: collider.options.sensor ? COLLIDER_SENSOR_2D : 0,\n }),\n }),\n );\n return Object.freeze([...bodies, ...colliders]);\n}\n\nfunction validateAutomaticMass(draft: RenderDraft2D): void {\n const massByBody = new Map<number, number>();\n for (const collider of draft.colliders.values()) {\n if (!collider.options.contributesToMass) continue;\n massByBody.set(\n collider.bodyId,\n (massByBody.get(collider.bodyId) ?? 0) +\n collider.shape.area * collider.options.density,\n );\n }\n for (const body of draft.bodies.values()) {\n if (\n body.descriptor.bodyType !== \"dynamic\" ||\n !body.descriptor.options.enabled ||\n body.descriptor.options.mass !== \"auto\"\n ) {\n continue;\n }\n if ((massByBody.get(body.id) ?? 0) <= 0) {\n throw new RangeError(\n \"A dynamic body with automatic mass requires positive derived area from at least one active mass-contributing collider.\",\n );\n }\n }\n}\n\nfunction bodyDefinition(\n body: BodyDraft2D,\n colliders: readonly ColliderDraft2D[],\n reenableVelocity?: BodyVelocity2D,\n previous?: BodyDefinition2D,\n): BodyDefinition2D {\n const descriptor = body.descriptor;\n const enabled = descriptor.options.enabled;\n const massData = compoundMassData(colliders);\n let flags = 0;\n let linearVelocityX = 0;\n let linearVelocityY = 0;\n let angularVelocity = 0;\n let linearDamping = 0;\n let angularDamping = 0;\n let gravityScale = 0;\n let inverseMass = 0;\n let inverseInertia = 0;\n let localCenterX = 0;\n let localCenterY = 0;\n if (enabled && descriptor.bodyType === \"dynamic\") {\n flags |= BODY_TYPE_DYNAMIC_2D;\n if (descriptor.options.fixedRotation) flags |= BODY_FIXED_ROTATION_2D;\n if (!descriptor.options.allowSleep) flags |= BODY_SLEEP_DISABLED_2D;\n if (descriptor.options.ccd) flags |= BODY_CCD_2D;\n linearVelocityX =\n reenableVelocity?.linearVelocityX ?? descriptor.options.linearVelocity[0];\n linearVelocityY =\n reenableVelocity?.linearVelocityY ?? descriptor.options.linearVelocity[1];\n angularVelocity =\n reenableVelocity?.angularVelocity ??\n (descriptor.options.angularVelocityDegreesPerSecond * Math.PI) / 180;\n linearDamping = descriptor.options.linearDamping;\n angularDamping = descriptor.options.angularDamping;\n gravityScale = descriptor.options.gravityScale;\n const mass =\n descriptor.options.mass === \"auto\"\n ? massData.mass\n : descriptor.options.mass;\n inverseMass = mass > 0 ? 1 / mass : 1;\n localCenterX = massData.centerX;\n localCenterY = massData.centerY;\n const inertia =\n massData.mass > 0 ? massData.inertia * (mass / massData.mass) : 0;\n inverseInertia = descriptor.options.fixedRotation\n ? 0\n : inertia > 0\n ? 1 / inertia\n : inverseMass;\n } else if (enabled && descriptor.bodyType === \"kinematic\") {\n flags |= BODY_TYPE_KINEMATIC_2D;\n if (!descriptor.options.allowSleep) flags |= BODY_SLEEP_DISABLED_2D;\n }\n const authoredRotationRadians =\n (body.initialPose.rotationDegrees * Math.PI) / 180;\n const previousKinematic =\n previous !== undefined && (previous.flags & BODY_TYPE_KINEMATIC_2D) !== 0\n ? previous\n : undefined;\n const preserveTargetBoundKinematicPose =\n descriptor.bodyType === \"kinematic\" &&\n (descriptor.options.target.position !== undefined ||\n descriptor.options.target.rotationDegrees !== undefined) &&\n previousKinematic !== undefined;\n const previousRotationRadians = previousKinematic?.rotationRadians ?? 0;\n const previousCosine = Math.cos(previousRotationRadians);\n const previousSine = Math.sin(previousRotationRadians);\n const previousOriginX =\n previousKinematic === undefined\n ? 0\n : previousKinematic.positionX -\n previousCosine * (previousKinematic.localCenterX ?? 0) +\n previousSine * (previousKinematic.localCenterY ?? 0);\n const previousOriginY =\n previousKinematic === undefined\n ? 0\n : previousKinematic.positionY -\n previousSine * (previousKinematic.localCenterX ?? 0) -\n previousCosine * (previousKinematic.localCenterY ?? 0);\n const positionX = preserveTargetBoundKinematicPose\n ? previousOriginX\n : body.initialPose.position[0];\n const positionY = preserveTargetBoundKinematicPose\n ? previousOriginY\n : body.initialPose.position[1];\n const effectiveRotationRadians = preserveTargetBoundKinematicPose\n ? previousKinematic!.rotationRadians\n : authoredRotationRadians;\n const cosine = Math.cos(effectiveRotationRadians);\n const sine = Math.sin(effectiveRotationRadians);\n return Object.freeze({\n positionX: positionX + cosine * localCenterX - sine * localCenterY,\n positionY: positionY + sine * localCenterX + cosine * localCenterY,\n rotationRadians: effectiveRotationRadians,\n localCenterX,\n localCenterY,\n linearVelocityX,\n linearVelocityY,\n angularVelocity,\n forceX: 0,\n forceY: 0,\n torque: 0,\n inverseMass,\n inverseInertia,\n linearDamping,\n angularDamping,\n gravityScale,\n sleepTime: 0,\n flags,\n owner: body.attachment,\n });\n}\n\nconst ZERO_VELOCITY_2D: BodyVelocity2D = Object.freeze({\n linearVelocityX: 0,\n linearVelocityY: 0,\n angularVelocity: 0,\n});\n\nfunction compoundMassData(colliders: readonly ColliderDraft2D[]): Readonly<{\n mass: number;\n centerX: number;\n centerY: number;\n inertia: number;\n}> {\n const entries = colliders\n .filter((collider) => collider.options.contributesToMass)\n .map((collider) => {\n const shape = collider.shape;\n const cosine = Math.cos(shape.localPose.rotationRadians);\n const sine = Math.sin(shape.localPose.rotationRadians);\n const centerX =\n shape.localPose.x + cosine * shape.centroidX - sine * shape.centroidY;\n const centerY =\n shape.localPose.y + sine * shape.centroidX + cosine * shape.centroidY;\n return {\n mass: shape.area * collider.options.density,\n centerX,\n centerY,\n centroidInertia: shape.unitInertia * collider.options.density,\n };\n });\n const mass = entries.reduce((sum, entry) => sum + entry.mass, 0);\n if (mass <= 0) {\n return { mass: 0, centerX: 0, centerY: 0, inertia: 0 };\n }\n const centerX =\n entries.reduce((sum, entry) => sum + entry.mass * entry.centerX, 0) / mass;\n const centerY =\n entries.reduce((sum, entry) => sum + entry.mass * entry.centerY, 0) / mass;\n const inertia = entries.reduce((sum, entry) => {\n const offsetX = entry.centerX - centerX;\n const offsetY = entry.centerY - centerY;\n return (\n sum +\n entry.centroidInertia +\n entry.mass * (offsetX * offsetX + offsetY * offsetY)\n );\n }, 0);\n return { mass, centerX, centerY, inertia };\n}\n\nfunction sameConfiguration(\n left: NormalizedPhysicsWorld2DConfiguration,\n right: NormalizedPhysicsWorld2DConfiguration,\n): boolean {\n return (\n left.gravityX === right.gravityX &&\n left.gravityY === right.gravityY &&\n left.fixedStepMilliseconds === right.fixedStepMilliseconds &&\n left.maxCatchUpSteps === right.maxCatchUpSteps &&\n left.interpolation === right.interpolation &&\n left.sleeping === right.sleeping &&\n left.velocityIterations === right.velocityIterations &&\n left.positionIterations === right.positionIterations\n );\n}\n\nfunction copyPhysicsPose2D(pose: PibblPhysicsPose2D): PibblPhysicsPose2D {\n return Object.freeze({\n position: copyFiniteVector2(pose.position, \"initial physics pose.position\"),\n rotationDegrees: requireFiniteNumber(\n pose.rotationDegrees,\n \"initial physics pose.rotationDegrees\",\n ),\n });\n}\n\nfunction sameTopology(\n left: readonly PhysicsTopologyRecord2D[],\n right: readonly PhysicsTopologyRecord2D[],\n): boolean {\n if (left.length !== right.length) return false;\n return left.every((first, index) => {\n const second = right[index];\n if (!second || first.kind !== second.kind || first.id !== second.id)\n return false;\n if (first.kind === \"body\" && second.kind === \"body\") {\n return sameRecord(first.definition, second.definition);\n }\n if (first.kind === \"collider\" && second.kind === \"collider\") {\n return (\n first.bodyId === second.bodyId &&\n first.definition.shape === second.definition.shape &&\n first.definition.flags === second.definition.flags &&\n sameRecord(first.definition.material, second.definition.material) &&\n sameRecord(first.definition.filter, second.definition.filter)\n );\n }\n return false;\n });\n}\n\nfunction sameRecord(left: unknown, right: unknown): boolean {\n if (left === right) return true;\n if (\n typeof left !== \"object\" ||\n left === null ||\n typeof right !== \"object\" ||\n right === null\n )\n return false;\n const leftEntries = Object.entries(left);\n const rightRecord = right as Record<string, unknown>;\n return (\n leftEntries.length === Object.keys(rightRecord).length &&\n leftEntries.every(([key, value]) => rightRecord[key] === value)\n );\n}\n\nfunction validateUniqueBodyHandles(bodies: readonly BodyDraft2D[]): void {\n const ids = new Map<PibblPhysicsBodyHandle2D, number>();\n for (const body of bodies) {\n const handle = body.descriptor.options.handle;\n if (handle === undefined) continue;\n const previous = ids.get(handle);\n if (previous !== undefined && previous !== body.id) {\n throw new Error(\n \"A Pibbl physics 2D body handle may bind to at most one live body.\",\n );\n }\n ids.set(handle, body.id);\n }\n}\n\nfunction eventHandlerName(\n kind: PhysicsContactEventDelivery2D[\"kind\"],\n): keyof NormalizedPhysicsColliderConfiguration2D[\"handlers\"] {\n switch (kind) {\n case 1:\n return \"onCollisionStart\";\n case 2:\n return \"onCollisionEnd\";\n case 3:\n return \"onOverlapStart\";\n case 4:\n return \"onOverlapEnd\";\n case 7:\n return \"onHit\";\n }\n}\n\nconst ZERO_POSE_2D: PibblPhysicsPose2D = Object.freeze({\n position: Object.freeze([0, 0] as const),\n rotationDegrees: 0,\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type { QueryMode, QueryOptions, QueryResult } from '../query-types.js';\nimport { CommittedObstacles2D } from \"./obstacles.js\";\nimport { boundsOfShape2D } from \"../../../2d-geometry.js\";\nimport { createShape2D } from \"../shape-records.js\";\nimport type {\n PibblPhysicsBodyInspection2D,\n PibblPhysicsInspection2D,\n} from \"../inspection-types.js\";\nimport { RapierSimulation2D } from \"../world/rapier.js\";\nimport { signal, type WritableSignal } from \"@pibbl/core\";\nimport {\n pibblInternalOnSimulationRenderTransactionFinish,\n pibblInternalCreateSignalConsumer,\n pibblInternalCurrentRenderOwner,\n type PibblInternalSignalConsumer,\n pibblInternalQueueSimulationBegin,\n pibblInternalQueueSimulationCommitAcknowledgement,\n pibblInternalQueueSimulationComplete,\n pibblInternalRegisterSimulationAdvance,\n pibblInternalRequestSimulationRender,\n type PibblInternalSignalBatch,\n type PibblInternalSimulationOwner,\n} from \"@pibbl/core/internal\";\nimport type {\n PibblPhysicsAabb2D,\n PibblPhysicsPose2D,\n PibblPhysicsRay2D,\n PibblPhysicsShape2D,\n PibblPhysicsVector2,\n} from \"../../../2d-geometry.js\";\nimport type { ShapeRecord2D } from \"../shape-records.js\";\nimport type {\n PibblPhysicsBodyHandle2D,\n PibblPhysicsColliderHandle2D,\n PibblPhysicsQueryHit2D,\n PibblPhysicsQueryMatch2D,\n PibblPhysicsWorldHandle2D,\n} from \"../types.js\";\nimport type { PibblResolvedPhysicsWorld2DProps } from \"./world-props.js\";\nimport { BODY_CCD_2D } from \"../world/ccd.js\";\nimport { COLLIDER_SENSOR_2D } from \"../world/contact-cache.js\";\nimport {\n BODY_FIXED_ROTATION_2D,\n BODY_TYPE_DYNAMIC_2D,\n BODY_TYPE_KINEMATIC_2D,\n} from \"../world/integrator.js\";\nimport { BODY_SLEEP_DISABLED_2D, BODY_SLEEPING_2D } from \"../world/solver.js\";\nimport type { BodyDefinition2D } from \"../world/storage.js\";\nimport {\n copyFiniteVector2,\n requireFiniteNumber,\n} from \"../../shared/validation.js\";\nimport {\n normalizePhysicsWorld2DConfiguration,\n PhysicsWorld2DKernel,\n type NormalizedPhysicsWorld2DConfiguration,\n type PhysicsBodyTopologyRecord2D,\n type PhysicsBodyCommand2D,\n type PhysicsColliderTopologyRecord2D,\n type PhysicsCommand2D,\n type PhysicsWorld2DConfiguration,\n type PhysicsTopologyRecord2D,\n type PhysicsWorld2DCandidate,\n} from \"../world/world.js\";\nimport { CommittedWorldQueries2D } from \"../world/queries.js\";\nimport {\n bindPhysicsBodyHandle2D,\n createPhysicsBodyHandle2D,\n physicsBodyHandleBinding2D,\n stagePhysicsBodyHandle2D,\n type PhysicsBodyHandleValues2D,\n unbindPhysicsBodyHandle2D,\n} from \"./body-handle.js\";\nimport {\n createPhysicsColliderHandle2D,\n isPhysicsBodyEventDelivery2D,\n materializePhysicsBodyEvent2D,\n materializePhysicsContactEvent2D,\n physicsColliderHandleIdentity2D,\n sortPhysicsEventDeliveries2D,\n type PhysicsBodyEventDelivery2D,\n type PhysicsContactEventDelivery2D,\n type PhysicsEventDelivery2D,\n} from \"./events.js\";\nimport {\n type MountedPhysicsAttachment2D,\n type NormalizedPhysicsColliderConfiguration2D,\n type PhysicsBodyAttachment2DDescriptor,\n} from \"./descriptors.js\";\n\nconst worldController2DSymbol = Symbol(\"PhysicsWorld2DController\");\n\ntype InternalWorldHandle2D = PibblPhysicsWorldHandle2D &\n Readonly<{\n readonly [worldController2DSymbol]: PhysicsWorld2DController;\n }>;\n\ninterface BodyDraft2D {\n readonly id: number;\n readonly attachment: MountedPhysicsAttachment2D;\n readonly descriptor: PhysicsBodyAttachment2DDescriptor;\n readonly initialPose: PibblPhysicsPose2D;\n}\n\ninterface ColliderDraft2D {\n readonly id: number;\n readonly bodyId: number;\n readonly attachment: MountedPhysicsAttachment2D;\n readonly options: NormalizedPhysicsColliderConfiguration2D;\n readonly shape: ShapeRecord2D;\n}\n\ninterface RenderDraft2D {\n readonly simulationToRoot: DOMMatrix;\n readonly configuration: NormalizedPhysicsWorld2DConfiguration;\n readonly props: PibblResolvedPhysicsWorld2DProps;\n readonly bodies: Map<number, BodyDraft2D>;\n readonly colliders: Map<number, ColliderDraft2D>;\n}\n\ninterface AcceptedBody2D {\n readonly id: number;\n readonly attachment: MountedPhysicsAttachment2D;\n readonly descriptor: PhysicsBodyAttachment2DDescriptor;\n readonly initialPose: PibblPhysicsPose2D;\n readonly handleBindingGeneration: number | undefined;\n}\n\ninterface AcceptedCollider2D {\n readonly id: number;\n readonly bodyId: number;\n readonly attachment: MountedPhysicsAttachment2D;\n readonly options: NormalizedPhysicsColliderConfiguration2D;\n}\n\ninterface AttachmentIds2D {\n bodyId?: number;\n colliderId?: number;\n}\n\ninterface BodyVelocity2D {\n readonly linearVelocityX: number;\n readonly linearVelocityY: number;\n readonly angularVelocity: number;\n}\n\nexport interface PhysicsWorld2DControllerSnapshot {\n readonly revision: number;\n readonly revisionMaterialized: boolean;\n readonly materializedBodyHandles: number;\n readonly materializedColliderHandles: number;\n readonly advanceRegistered: boolean;\n readonly bodyIds: readonly number[];\n readonly colliderIds: readonly number[];\n readonly kernel: ReturnType<PhysicsWorld2DKernel[\"snapshot\"]>;\n}\n\nexport class PhysicsWorld2DController {\n readonly handle: PibblPhysicsWorldHandle2D;\n private revision: WritableSignal<number> | undefined;\n private committedRevision = 0;\n private obstacles: CommittedObstacles2D | undefined;\n private obstacleSource: Readonly<{ read(): Readonly<{ revision: number; boxes: Float64Array; ellipses: Float64Array; polygons: Float64Array }> }> | undefined;\n\n getObstacleSource(): Readonly<{ read(): Readonly<{ revision: number; boxes: Float64Array; ellipses: Float64Array; polygons: Float64Array }> }> {\n this.assertActive();\n if (!this.obstacleSource) {\n if (this.liveCandidate) throw new Error(\"Create physics obstacles before simulation Advance.\");\n this.obstacles = new CommittedObstacles2D();\n this.obstacles.publish(this.kernel, this.acceptedColliders, this.committedRevision);\n this.obstacleSource = Object.freeze({ read: () => {\n this.assertActive();\n return this.obstacles!.read();\n } });\n }\n return this.obstacleSource;\n }\n private failedFrames = 0;\n private lastFailure: string | null = null;\n private readonly kernel: PhysicsWorld2DKernel;\n private readonly ids = new WeakMap<object, AttachmentIds2D>();\n private nextId = 0;\n private draft: RenderDraft2D | undefined;\n private acceptedTopology: readonly PhysicsTopologyRecord2D[] = Object.freeze(\n [],\n );\n private acceptedBodies: readonly AcceptedBody2D[] = Object.freeze([]);\n private acceptedColliders: readonly AcceptedCollider2D[] = Object.freeze([]);\n private acceptedConfiguration: NormalizedPhysicsWorld2DConfiguration;\n private acceptedProps: PibblResolvedPhysicsWorld2DProps = Object.freeze({});\n private readonly suspendedVelocities = new Map<number, BodyVelocity2D>();\n private readonly materializedBodyHandles = new Map<\n string,\n PibblPhysicsBodyHandle2D\n >();\n private readonly materializedColliderHandles = new Map<\n string,\n PibblPhysicsColliderHandle2D\n >();\n private materializedHandleTopologyPending = false;\n private readonly queries: CommittedWorldQueries2D;\n private queuedBegin: Readonly<{ cancel(): void }> | undefined;\n private releaseAdvance: (() => void) | undefined;\n private readonly releasePassiveAdvance: () => void;\n private liveCandidate: PhysicsWorld2DCandidate | undefined;\n private active = true;\n private readonly space: \"root\" | \"local\";\n private simulationToRoot = new DOMMatrix();\n private readonly targetConsumer: PibblInternalSignalConsumer;\n\n constructor(\n private readonly owner: PibblInternalSimulationOwner,\n initialProps: PibblResolvedPhysicsWorld2DProps,\n ) {\n this.space = initialProps.space ?? \"root\";\n if (this.space !== \"root\" && this.space !== \"local\")\n throw new TypeError('PhysicsWorld2D space must be \"root\" or \"local\".');\n this.targetConsumer = pibblInternalCreateSignalConsumer({\n owner: pibblInternalCurrentRenderOwner(),\n debugName: \"PhysicsWorld2D kinematic targets\",\n invalidate: () => {\n if (this.active) this.ensureAdvance();\n },\n });\n const configuration = normalizeWorldConfiguration(initialProps);\n this.kernel = new PhysicsWorld2DKernel(\n denormalizeWorldConfiguration(configuration),\n new RapierSimulation2D(),\n );\n // Idle worlds still observe animation's staged target in the same Advance\n // phase, without keeping the host clock alive themselves.\n this.releasePassiveAdvance = pibblInternalRegisterSimulationAdvance(\n this.owner,\n \"physics\",\n (frame, batch) => {\n if (this.releaseAdvance !== undefined) return;\n const targets = this.readKinematicTargets(batch);\n for (const [id, target] of targets) {\n if (this.kernel.bodyIdentity(id) === undefined) continue;\n const pose = this.kernel.authoritativePose(id);\n if (\n target.position[0] !== pose.position[0] ||\n target.position[1] !== pose.position[1] ||\n target.rotationDegrees !== pose.rotationDegrees\n ) {\n this.ensureAdvance();\n this.advance(frame.frameId, frame.logicalTime, batch);\n return;\n }\n }\n },\n false,\n );\n this.queries = new CommittedWorldQueries2D({\n generation: 1,\n bodies: this.kernel.bodies,\n colliders: this.kernel.colliders,\n broadPhase: this.kernel.broadPhase,\n materializeBody: (index, generation) =>\n this.materializeBodyHandle(index, generation),\n materializeCollider: (index, generation) =>\n this.materializeColliderHandle(index, generation),\n resolveBody: (handle) => this.resolveBodyHandle(handle),\n resolveCollider: (handle) => this.resolveColliderHandle(handle),\n });\n this.acceptedConfiguration = configuration;\n const target = {\n [worldController2DSymbol]: this,\n } as Record<PropertyKey, unknown>;\n Object.defineProperty(target, \"revision\", {\n enumerable: true,\n get: () => this.materializeRevision().asReadonly(),\n });\n this.handle = Object.freeze(target) as unknown as InternalWorldHandle2D;\n }\n\n beginRender(\n props: PibblResolvedPhysicsWorld2DProps,\n rootTransform = new DOMMatrix(),\n ): void {\n if ((props.space ?? \"root\") !== this.space)\n throw new Error(\n \"PhysicsWorld2D space is creation-only; remount the world with a new key to change it.\",\n );\n const simulationToRoot =\n this.space === \"local\" ? rootTransform : new DOMMatrix();\n const { a, b, c, d, e, f } = simulationToRoot;\n if (\n !(\n Number.isFinite(a) &&\n Number.isFinite(b) &&\n Number.isFinite(c) &&\n Number.isFinite(d) &&\n Number.isFinite(e) &&\n Number.isFinite(f)\n ) ||\n Math.abs(a * d - b * c) < 1e-10\n )\n throw new Error(\n \"PhysicsWorld2D viewport transform must be finite and invertible.\",\n );\n this.assertActive();\n if (this.draft !== undefined) {\n throw new Error(\n \"PhysicsWorld2D began a second render before finishing the first.\",\n );\n }\n this.draft = {\n simulationToRoot,\n configuration: normalizeWorldConfiguration(props),\n props,\n bodies: new Map(),\n colliders: new Map(),\n };\n pibblInternalOnSimulationRenderTransactionFinish(this.owner, (success) =>\n this.finishRender(success),\n );\n }\n\n simulationTransform(root: DOMMatrix): DOMMatrix {\n return (this.draft?.simulationToRoot ?? this.simulationToRoot)\n .inverse()\n .multiply(root);\n }\n\n rootTransform(local: DOMMatrix): DOMMatrix {\n return (this.draft?.simulationToRoot ?? this.simulationToRoot).multiply(\n local,\n );\n }\n\n convertPoint(point: PibblPhysicsVector2, toRoot: boolean): PibblPhysicsVector2 {\n this.assertActive();\n const value = copyFiniteVector2(point, \"point\");\n const matrix = toRoot\n ? this.simulationToRoot\n : this.simulationToRoot.inverse();\n return Object.freeze([\n matrix.a * value[0] + matrix.c * value[1] + matrix.e,\n matrix.b * value[0] + matrix.d * value[1] + matrix.f,\n ]);\n }\n\n bodyIdFor(attachment: MountedPhysicsAttachment2D): number {\n let ids = this.ids.get(attachment);\n if (!ids) {\n ids = {};\n this.ids.set(attachment, ids);\n }\n return (ids.bodyId ??= this.allocateId());\n }\n\n colliderIdFor(attachment: MountedPhysicsAttachment2D): number {\n let ids = this.ids.get(attachment);\n if (!ids) {\n ids = {};\n this.ids.set(attachment, ids);\n }\n return (ids.colliderId ??= this.allocateId());\n }\n\n collectBody(\n attachment: MountedPhysicsAttachment2D,\n bodyId: number,\n descriptor: PhysicsBodyAttachment2DDescriptor,\n initialPose: PibblPhysicsPose2D = ZERO_POSE_2D,\n ): void {\n const draft = this.requireDraft();\n draft.bodies.set(bodyId, {\n id: bodyId,\n attachment,\n descriptor,\n initialPose: copyPhysicsPose2D(initialPose),\n });\n const collider = descriptor.options.collider;\n if (\n collider !== false &&\n collider.shape !== \"self\" &&\n descriptor.options.enabled\n ) {\n const colliderId = this.colliderIdFor(attachment);\n draft.colliders.set(colliderId, {\n id: colliderId,\n bodyId,\n attachment,\n options: collider,\n shape: attachment.resolveShape(collider),\n });\n }\n }\n\n collectCollider(\n attachment: MountedPhysicsAttachment2D,\n bodyId: number,\n options: NormalizedPhysicsColliderConfiguration2D,\n ): void {\n if (options.shape === \"self\") return;\n const draft = this.requireDraft();\n if (draft.bodies.get(bodyId)?.descriptor.options.enabled === false) return;\n const colliderId = this.colliderIdFor(attachment);\n draft.colliders.set(colliderId, {\n id: colliderId,\n bodyId,\n attachment,\n options,\n shape: attachment.resolveShape(options),\n });\n }\n\n queueCommands(commands: readonly PhysicsCommand2D[]): void {\n this.assertActive();\n if (commands.length === 0) return;\n pibblInternalQueueSimulationBegin(this.owner, () => {\n this.kernel.applyBegin(commands);\n });\n this.ensureAdvance();\n }\n\n acceptBodyHandleCommand(\n handle: PibblPhysicsBodyHandle2D,\n bindingGeneration: number,\n command: PhysicsBodyCommand2D,\n ): boolean {\n if (!this.active) return false;\n const binding = physicsBodyHandleBinding2D(handle);\n const accepted = this.acceptedBodies.find(\n (body) =>\n body.id === command.bodyId &&\n body.descriptor.options.handle === handle &&\n body.handleBindingGeneration === bindingGeneration,\n );\n const identity = this.kernel.bodyIdentity(command.bodyId);\n const materialized =\n identity === undefined\n ? undefined\n : this.materializedBodyHandles.get(\n `${String(identity.index)}:${String(identity.generation)}`,\n );\n if (\n binding?.controller !== this ||\n binding.bindingGeneration !== bindingGeneration ||\n (accepted === undefined && materialized !== handle)\n ) {\n return false;\n }\n this.kernel.applyBegin([command]);\n this.ensureAdvance();\n return true;\n }\n\n presentationPose(bodyId: number): PibblPhysicsPose2D | undefined {\n return this.kernel.bodyIdentity(bodyId) !== undefined\n ? this.kernel.presentationPose(bodyId)\n : undefined;\n }\n\n raycast<Mode extends QueryMode = \"closest\">(\n ray: PibblPhysicsRay2D,\n options?: QueryOptions<Mode>,\n ): QueryResult<Mode, PibblPhysicsQueryHit2D> {\n this.assertActive();\n return this.queries.raycast(1, ray, options);\n }\n\n shapeCast<Mode extends QueryMode = \"closest\">(\n shape: PibblPhysicsShape2D,\n from: PibblPhysicsPose2D,\n translation: PibblPhysicsVector2,\n options?: QueryOptions<Mode>,\n ): QueryResult<Mode, PibblPhysicsQueryHit2D> {\n this.assertActive();\n return this.queries.shapeCast(1, shape, from, translation, options);\n }\n\n overlapShape<Mode extends QueryMode = \"closest\">(\n shape: PibblPhysicsShape2D,\n pose: PibblPhysicsPose2D,\n options?: QueryOptions<Mode>,\n ): QueryResult<Mode, PibblPhysicsQueryMatch2D> {\n this.assertActive();\n return this.queries.overlapShape(1, shape, pose, options);\n }\n\n queryAabb<Mode extends QueryMode = \"closest\">(\n bounds: PibblPhysicsAabb2D,\n options?: QueryOptions<Mode>,\n ): QueryResult<Mode, PibblPhysicsQueryMatch2D> {\n this.assertActive();\n return this.queries.queryAabb(1, bounds, options);\n }\n\n queryPoint<Mode extends QueryMode = \"closest\">(\n point: PibblPhysicsVector2,\n options?: QueryOptions<Mode>,\n ): QueryResult<Mode, PibblPhysicsQueryMatch2D> {\n this.assertActive();\n return this.queries.queryPoint(1, point, options);\n }\n\n bodyHandleValues(bodyId: number): PhysicsBodyHandleValues2D | undefined {\n if (!this.active) return undefined;\n const identity = this.kernel.bodyIdentity(bodyId);\n if (identity === undefined) return undefined;\n const index = identity.index;\n const bodies = this.kernel.bodies;\n const state = {\n linearVelocityX: bodies.linearVelocityX[index]!,\n linearVelocityY: bodies.linearVelocityY[index]!,\n angularVelocity: bodies.angularVelocity[index]!,\n flags: bodies.flags[index]!,\n generation: identity.generation,\n };\n const pose = this.kernel.authoritativePose(bodyId);\n return Object.freeze({\n position: pose.position,\n rotationDegrees: pose.rotationDegrees,\n linearVelocity: Object.freeze([\n state.linearVelocityX,\n state.linearVelocityY,\n ] as const),\n angularVelocityDegreesPerSecond: (state.angularVelocity * 180) / Math.PI,\n sleeping: (state.flags & BODY_SLEEPING_2D) !== 0,\n enabled: this.kernel.isBodyEnabled(bodyId),\n generation: state.generation,\n });\n }\n\n inspectBody(bodyId: number): PibblPhysicsBodyInspection2D | undefined {\n if (!this.active) return undefined;\n const identity = this.kernel.bodyIdentity(bodyId);\n const declared = this.acceptedBodies.find((body) => body.id === bodyId);\n if (identity === undefined || declared === undefined) return undefined;\n const index = identity.index;\n const bodies = this.kernel.bodies;\n const flags = bodies.flags[index]!;\n return Object.freeze({\n id: bodyId,\n generation: identity.generation,\n type: declared.descriptor.bodyType,\n enabled: this.kernel.isBodyEnabled(bodyId),\n sleeping: !!(flags & BODY_SLEEPING_2D),\n pose: this.kernel.authoritativePose(bodyId),\n presentationPose: this.kernel.presentationPose(bodyId),\n centerOfMass: Object.freeze([\n bodies.positionX[index]!,\n bodies.positionY[index]!,\n ] as const),\n linearVelocity: Object.freeze([\n bodies.linearVelocityX[index]!,\n bodies.linearVelocityY[index]!,\n ] as const),\n angularVelocityDegreesPerSecond:\n (bodies.angularVelocity[index]! * 180) / Math.PI,\n mass: bodies.inverseMass[index]! > 0 ? 1 / bodies.inverseMass[index]! : null,\n });\n }\n\n dispose(): void {\n if (!this.active) return;\n this.active = false;\n this.targetConsumer.dispose();\n this.releasePassiveAdvance();\n this.queuedBegin?.cancel();\n this.queuedBegin = undefined;\n this.releaseAdvance?.();\n this.releaseAdvance = undefined;\n if (this.liveCandidate !== undefined) {\n this.kernel.discard(this.liveCandidate);\n this.liveCandidate = undefined;\n }\n for (const body of this.acceptedBodies) this.unbindBodyHandle(body);\n for (const handle of this.materializedBodyHandles.values()) {\n const binding = physicsBodyHandleBinding2D(handle);\n if (binding?.controller === this) {\n unbindPhysicsBodyHandle2D(\n handle,\n this,\n binding.bodyId,\n binding.bindingGeneration,\n );\n }\n }\n this.materializedBodyHandles.clear();\n this.materializedColliderHandles.clear();\n this.materializedHandleTopologyPending = false;\n this.obstacles = undefined;\n this.obstacleSource = undefined;\n this.kernel.dispose();\n this.queries.invalidate();\n this.acceptedBodies = Object.freeze([]);\n this.acceptedColliders = Object.freeze([]);\n this.draft = undefined;\n this.suspendedVelocities.clear();\n }\n\n inspect(): PibblPhysicsInspection2D {\n this.assertActive();\n const snapshot = this.kernel.snapshot();\n const vector = (x: number, y: number): PibblPhysicsVector2 =>\n Object.freeze([x, y]);\n const contacts = this.kernel.contacts;\n const declaredTypes = new Map(\n this.acceptedBodies.map((body) => [body.id, body.descriptor.bodyType]),\n );\n return Object.freeze({\n engine: \"rapier-2d@0.21.0\",\n space: this.space,\n revision: this.committedRevision,\n tick: snapshot.tick,\n advancing: this.releaseAdvance !== undefined,\n failedFrames: this.failedFrames,\n lastFailure: this.lastFailure,\n bodies: Object.freeze(\n snapshot.bodies.map((body) =>\n Object.freeze({\n id: body.id,\n generation: body.generation,\n type: declaredTypes.get(body.id)!,\n enabled: this.kernel.isBodyEnabled(body.id),\n sleeping: !!(body.flags & BODY_SLEEPING_2D),\n pose: this.kernel.authoritativePose(body.id),\n presentationPose: this.kernel.presentationPose(body.id),\n centerOfMass: vector(body.positionX, body.positionY),\n linearVelocity: vector(body.linearVelocityX, body.linearVelocityY),\n angularVelocityDegreesPerSecond:\n (body.angularVelocity * 180) / Math.PI,\n mass: body.inverseMass > 0 ? 1 / body.inverseMass : null,\n }),\n ),\n ),\n colliders: Object.freeze(\n this.acceptedColliders.flatMap((collider) => {\n const identity = this.kernel.colliderIdentity(collider.id);\n if (!identity) return [];\n const shape = this.kernel.colliders.shapes[identity.index]!;\n return [\n Object.freeze({\n id: collider.id,\n generation: identity.generation,\n bodyId: collider.bodyId,\n sensor: !!(\n this.kernel.colliders.flags[identity.index]! &\n COLLIDER_SENSOR_2D\n ),\n label:\n typeof collider.options.tag === \"string\"\n ? collider.options.tag\n : null,\n shapeKinds: Object.freeze(shape.leaves.map((leaf) => leaf.kind)),\n bounds: boundsOfShape2D(\n createShape2D(shape),\n this.kernel.authoritativePose(collider.bodyId),\n ),\n }),\n ];\n }),\n ),\n contacts: Object.freeze(\n Array.from(\n { length: contacts.contactCount },\n (_, index) => index,\n ).flatMap((index) => {\n const firstColliderId = this.kernel.colliderIdForIdentity(\n contacts.firstColliderIndices[index]!,\n contacts.firstColliderGenerations[index]!,\n );\n const secondColliderId = this.kernel.colliderIdForIdentity(\n contacts.secondColliderIndices[index]!,\n contacts.secondColliderGenerations[index]!,\n );\n if (firstColliderId === undefined || secondColliderId === undefined)\n return [];\n return [\n Object.freeze({\n firstColliderId,\n secondColliderId,\n sensor: contacts.sensorFlags[index] !== 0,\n normal: vector(\n contacts.normalX[index]!,\n contacts.normalY[index]!,\n ),\n normalImpulse:\n contacts.pointNormalImpulses[index * 2]! +\n (contacts.pointCounts[index]! > 1\n ? contacts.pointNormalImpulses[index * 2 + 1]!\n : 0),\n points: Object.freeze(\n Array.from(\n { length: contacts.pointCounts[index]! },\n (_, point) => {\n const offset = index * 2 + point;\n return Object.freeze({\n pointOnFirst: vector(\n contacts.pointFirstX[offset]!,\n contacts.pointFirstY[offset]!,\n ),\n pointOnSecond: vector(\n contacts.pointSecondX[offset]!,\n contacts.pointSecondY[offset]!,\n ),\n separation: contacts.pointSeparations[offset]!,\n });\n },\n ),\n ),\n }),\n ];\n }),\n ),\n });\n }\n\n snapshot(): PhysicsWorld2DControllerSnapshot {\n return Object.freeze({\n revision: this.committedRevision,\n revisionMaterialized: this.revision !== undefined,\n materializedBodyHandles: this.materializedBodyHandles.size,\n materializedColliderHandles: this.materializedColliderHandles.size,\n advanceRegistered: this.releaseAdvance !== undefined,\n bodyIds: Object.freeze(\n this.acceptedTopology\n .filter(\n (record): record is PhysicsBodyTopologyRecord2D =>\n record.kind === \"body\",\n )\n .map((record) => record.id),\n ),\n colliderIds: Object.freeze(\n this.acceptedTopology\n .filter(\n (record): record is PhysicsColliderTopologyRecord2D =>\n record.kind === \"collider\",\n )\n .map((record) => record.id),\n ),\n kernel: this.kernel.snapshot(),\n });\n }\n\n private finishRender(success: boolean): void {\n const draft = this.draft;\n this.draft = undefined;\n if (!success || draft === undefined || !this.active) return;\n validateAutomaticMass(draft);\n const reenableVelocities = this.resolveReenableVelocities(draft);\n const previousBodyDefinitions = new Map(\n this.acceptedTopology\n .filter(\n (record): record is PhysicsBodyTopologyRecord2D =>\n record.kind === \"body\",\n )\n .map((record) => [record.id, record.definition] as const),\n );\n const topology = materializeTopology(\n draft,\n reenableVelocities,\n previousBodyDefinitions,\n );\n const topologyChanged = !sameTopology(this.acceptedTopology, topology);\n const configurationChanged = !sameConfiguration(\n this.acceptedConfiguration,\n draft.configuration,\n );\n const nextBodies = [...draft.bodies.values()].sort(\n (left, right) => left.id - right.id,\n );\n validateUniqueBodyHandles(nextBodies);\n const nextBodiesById = new Map(nextBodies.map((body) => [body.id, body]));\n for (const body of this.acceptedBodies) {\n const next = nextBodiesById.get(body.id);\n const retained =\n next !== undefined &&\n next.descriptor.options.handle === body.descriptor.options.handle;\n if (!retained) this.unbindBodyHandle(body);\n }\n this.simulationToRoot = draft.simulationToRoot;\n this.acceptedProps = draft.props;\n this.acceptedBodies = Object.freeze(\n nextBodies.map(({ id, attachment, descriptor, initialPose }) =>\n Object.freeze({\n id,\n attachment,\n descriptor,\n initialPose,\n handleBindingGeneration:\n descriptor.options.handle === undefined\n ? undefined\n : bindPhysicsBodyHandle2D(descriptor.options.handle, this, id),\n }),\n ),\n );\n this.acceptedColliders = Object.freeze(\n [...draft.colliders.values()]\n .sort((left, right) => left.id - right.id)\n .map(({ id, bodyId, attachment, options }) =>\n Object.freeze({ id, bodyId, attachment, options }),\n ),\n );\n this.targetConsumer.collect(() => {\n for (const body of this.acceptedBodies) {\n if (\n body.descriptor.bodyType !== \"kinematic\" ||\n !body.descriptor.options.enabled\n )\n continue;\n body.descriptor.options.target.position?.get();\n body.descriptor.options.target.rotationDegrees?.get();\n }\n });\n this.targetConsumer.markClean();\n this.acceptedTopology = topology;\n this.kernel.updateColliderMetadata(topology);\n if (topologyChanged) this.materializedHandleTopologyPending = true;\n if (!topologyChanged && !configurationChanged) return;\n this.acceptedConfiguration = draft.configuration;\n this.queuedBegin?.cancel();\n this.queuedBegin = pibblInternalQueueSimulationBegin(this.owner, () => {\n this.queuedBegin = undefined;\n if (topologyChanged) this.kernel.proposeTopology(this.acceptedTopology);\n if (configurationChanged) {\n this.kernel.applyBegin([\n {\n kind: \"configure\",\n configuration: denormalizeWorldConfiguration(draft.configuration),\n },\n ]);\n }\n });\n this.ensureAdvance();\n }\n\n private ensureAdvance(): void {\n if (this.releaseAdvance !== undefined) return;\n this.releaseAdvance = pibblInternalRegisterSimulationAdvance(\n this.owner,\n \"physics\",\n (frame, batch) => this.advance(frame.frameId, frame.logicalTime, batch),\n );\n }\n\n private resolveReenableVelocities(\n draft: RenderDraft2D,\n ): ReadonlyMap<number, BodyVelocity2D> {\n const previousById = new Map(\n this.acceptedBodies.map((body) => [body.id, body]),\n );\n const overrides = new Map<number, BodyVelocity2D>();\n for (const body of draft.bodies.values()) {\n const previous = previousById.get(body.id);\n const currentDynamic =\n body.descriptor.bodyType === \"dynamic\" ? body.descriptor : undefined;\n const previousDynamic =\n previous?.descriptor.bodyType === \"dynamic\"\n ? previous.descriptor\n : undefined;\n if (\n currentDynamic !== undefined &&\n !currentDynamic.options.enabled &&\n previousDynamic?.options.enabled\n ) {\n const identity = this.kernel.bodyIdentity(body.id);\n if (identity !== undefined) {\n const bodies = this.kernel.bodies;\n this.suspendedVelocities.set(\n body.id,\n Object.freeze({\n linearVelocityX: bodies.linearVelocityX[identity.index]!,\n linearVelocityY: bodies.linearVelocityY[identity.index]!,\n angularVelocity: bodies.angularVelocity[identity.index]!,\n }),\n );\n }\n }\n if (\n currentDynamic?.options.enabled &&\n previousDynamic !== undefined &&\n !previousDynamic.options.enabled\n ) {\n const preserved = this.suspendedVelocities.get(body.id);\n overrides.set(\n body.id,\n currentDynamic.options.reenableVelocity === \"preserve\" && preserved\n ? preserved\n : ZERO_VELOCITY_2D,\n );\n }\n }\n const retained = new Set(draft.bodies.keys());\n for (const id of this.suspendedVelocities.keys()) {\n if (!retained.has(id)) this.suspendedVelocities.delete(id);\n }\n return overrides;\n }\n\n private advance(\n frameId: number,\n logicalTime: number,\n batch: PibblInternalSignalBatch,\n ): void {\n let candidate: PhysicsWorld2DCandidate | undefined;\n try {\n candidate = this.kernel.advance({\n frameId,\n logicalTime,\n stagedKinematicTargets: this.readKinematicTargets(batch),\n });\n if (candidate === undefined) return;\n this.liveCandidate = candidate;\n const nextRevision = this.committedRevision + 1;\n this.stagePublicSignals(batch, nextRevision);\n const events = this.copyEventDeliveries(candidate);\n let adopted = false;\n if (events.length > 0) {\n pibblInternalQueueSimulationComplete(this.owner, () => {\n if (adopted) this.deliverEvents(events);\n });\n }\n pibblInternalQueueSimulationCommitAcknowledgement(\n this.owner,\n (_frame, outcome) => {\n if (this.liveCandidate !== candidate) return;\n this.liveCandidate = undefined;\n if (!outcome.applied) {\n this.kernel.discard(candidate!);\n return;\n }\n this.kernel.adopt(candidate!);\n if (this.materializedHandleTopologyPending) {\n this.evictRetiredMaterializedHandles();\n this.materializedHandleTopologyPending = false;\n }\n this.committedRevision = nextRevision;\n this.obstacles?.publish(this.kernel, this.acceptedColliders, nextRevision);\n adopted = true;\n pibblInternalRequestSimulationRender(this.owner);\n if (\n !this.hasAwakeBodies() &&\n (candidate!.stepCount > 0 ||\n !this.acceptedBodies.some(\n (body) => body.descriptor.bodyType === \"kinematic\",\n ))\n ) {\n this.releaseAdvance?.();\n this.releaseAdvance = undefined;\n }\n },\n );\n } catch (error) {\n this.failedFrames++;\n this.lastFailure = error instanceof Error ? error.message : String(error);\n if (candidate?.lifecycle === \"live\") this.kernel.discard(candidate);\n if (this.liveCandidate === candidate) this.liveCandidate = undefined;\n const onError = this.acceptedProps.onError;\n if (onError) {\n pibblInternalQueueSimulationComplete(this.owner, () => onError(error));\n }\n throw error;\n }\n }\n\n private readKinematicTargets(\n batch: PibblInternalSignalBatch,\n ): ReadonlyMap<number, PibblPhysicsPose2D> {\n const targets = new Map<number, PibblPhysicsPose2D>();\n for (const body of this.acceptedBodies) {\n if (\n body.descriptor.bodyType !== \"kinematic\" ||\n !body.descriptor.options.enabled\n )\n continue;\n const target = body.descriptor.options.target;\n if (\n target.position === undefined &&\n target.rotationDegrees === undefined\n ) {\n continue;\n }\n const position =\n target.position === undefined\n ? body.initialPose.position\n : batch.read(\n target.position as WritableSignal<readonly [number, number]>,\n );\n const rotationDegrees =\n target.rotationDegrees === undefined\n ? body.initialPose.rotationDegrees\n : batch.read(target.rotationDegrees as WritableSignal<number>);\n targets.set(\n body.id,\n Object.freeze({\n position: Object.freeze([position[0], position[1]] as const),\n rotationDegrees,\n }),\n );\n }\n return targets;\n }\n\n private stagePublicSignals(\n batch: PibblInternalSignalBatch,\n nextRevision: number,\n ): void {\n if (this.revision !== undefined) {\n batch.stage(this.revision, nextRevision, this);\n }\n const bodies = this.kernel.bodies;\n for (const body of this.acceptedBodies) {\n const identity = this.kernel.bodyIdentity(body.id);\n if (identity === undefined) continue;\n const explicit = body.descriptor.options.handle;\n const materialized = this.materializedBodyHandles.get(\n `${String(identity.index)}:${String(identity.generation)}`,\n );\n if (explicit === undefined && materialized === undefined) continue;\n const pose = this.kernel.authoritativePose(body.id);\n const values = {\n position: pose.position,\n rotationDegrees: pose.rotationDegrees,\n linearVelocity: Object.freeze([\n bodies.linearVelocityX[identity.index]!,\n bodies.linearVelocityY[identity.index]!,\n ] as const),\n angularVelocityDegreesPerSecond:\n (bodies.angularVelocity[identity.index]! * 180) / Math.PI,\n sleeping: (bodies.flags[identity.index]! & BODY_SLEEPING_2D) !== 0,\n enabled: this.kernel.isBodyEnabled(body.id),\n generation: identity.generation,\n } as const;\n if (explicit !== undefined) {\n stagePhysicsBodyHandle2D(batch, explicit, values, this);\n }\n if (materialized !== undefined && materialized !== explicit) {\n stagePhysicsBodyHandle2D(batch, materialized, values, this);\n }\n }\n }\n\n private copyEventDeliveries(\n candidate: PhysicsWorld2DCandidate,\n ): readonly PhysicsEventDelivery2D[] {\n const events: PhysicsEventDelivery2D[] = [];\n for (let offset = 0; offset < candidate.eventCount; offset += 1) {\n const eventIndex = candidate.eventOffset + offset;\n const kind = candidate.eventKinds[eventIndex];\n if (kind === 5 || kind === 6) {\n const handler =\n kind === 6 ? this.acceptedProps.onSleep : this.acceptedProps.onWake;\n if (handler === undefined) continue;\n const bodyIndex = candidate.eventFirstColliderIndices[eventIndex]!;\n const bodyGeneration = this.kernel.bodies.generations[bodyIndex]!;\n const bodyId = this.kernel.bodyIdForIdentity(bodyIndex, bodyGeneration);\n if (bodyId === undefined) continue;\n events.push(\n Object.freeze({\n kind,\n tick: candidate.eventTicks[eventIndex]!,\n bodyIndex,\n bodyGeneration,\n bodyId,\n handler,\n }) satisfies PhysicsBodyEventDelivery2D,\n );\n continue;\n }\n if (kind !== 1 && kind !== 2 && kind !== 3 && kind !== 4 && kind !== 7) {\n continue;\n }\n this.copyContactEventDeliveries(candidate, eventIndex, kind, events);\n }\n return sortPhysicsEventDeliveries2D(events);\n }\n\n private copyContactEventDeliveries(\n candidate: PhysicsWorld2DCandidate,\n eventIndex: number,\n kind: PhysicsContactEventDelivery2D[\"kind\"],\n events: PhysicsEventDelivery2D[],\n ): void {\n const firstColliderIndex = candidate.eventFirstColliderIndices[eventIndex]!;\n const firstColliderGeneration =\n candidate.eventFirstColliderGenerations[eventIndex]!;\n const secondColliderIndex =\n candidate.eventSecondColliderIndices[eventIndex]!;\n const secondColliderGeneration =\n candidate.eventSecondColliderGenerations[eventIndex]!;\n const first = this.acceptedColliderForIdentity(\n firstColliderIndex,\n firstColliderGeneration,\n );\n const second = this.acceptedColliderForIdentity(\n secondColliderIndex,\n secondColliderGeneration,\n );\n if (first === undefined || second === undefined) return;\n const handlerName = eventHandlerName(kind);\n const firstHandler = first.options.handlers[handlerName];\n const secondHandler = second.options.handlers[handlerName];\n if (firstHandler === undefined && secondHandler === undefined) return;\n const firstBodyIdentity = this.kernel.bodyIdentity(first.bodyId);\n const secondBodyIdentity = this.kernel.bodyIdentity(second.bodyId);\n if (firstBodyIdentity === undefined || secondBodyIdentity === undefined)\n return;\n const points: Array<PhysicsContactEventDelivery2D[\"points\"][number]> = [];\n const pointBase = eventIndex * 2;\n for (\n let point = 0;\n point < candidate.eventPointCounts[eventIndex]!;\n point += 1\n ) {\n points.push(\n Object.freeze({\n firstX: candidate.eventPointFirstX[pointBase + point]!,\n firstY: candidate.eventPointFirstY[pointBase + point]!,\n secondX: candidate.eventPointSecondX[pointBase + point]!,\n secondY: candidate.eventPointSecondY[pointBase + point]!,\n separation: candidate.eventPointSeparations[pointBase + point]!,\n }),\n );\n }\n const common = {\n kind,\n tick: candidate.eventTicks[eventIndex]!,\n firstColliderIndex,\n firstColliderGeneration,\n secondColliderIndex,\n secondColliderGeneration,\n firstBodyIndex: firstBodyIdentity.index,\n firstBodyGeneration: firstBodyIdentity.generation,\n secondBodyIndex: secondBodyIdentity.index,\n secondBodyGeneration: secondBodyIdentity.generation,\n normalX: candidate.eventNormalX[eventIndex]!,\n normalY: candidate.eventNormalY[eventIndex]!,\n points: Object.freeze(points),\n totalNormalImpulse: candidate.eventTotalNormalImpulses[eventIndex]!,\n } as const;\n if (firstHandler !== undefined) {\n events.push(\n Object.freeze({\n ...common,\n receiver: \"first\",\n receiverColliderId: first.id,\n receiverBodyId: first.bodyId,\n handler: firstHandler,\n selfTag: first.options.tag,\n otherTag: second.options.tag,\n }) as PhysicsContactEventDelivery2D,\n );\n }\n if (secondHandler !== undefined) {\n events.push(\n Object.freeze({\n ...common,\n receiver: \"second\",\n receiverColliderId: second.id,\n receiverBodyId: second.bodyId,\n handler: secondHandler,\n selfTag: second.options.tag,\n otherTag: first.options.tag,\n }) as PhysicsContactEventDelivery2D,\n );\n }\n }\n\n private deliverEvents(events: readonly PhysicsEventDelivery2D[]): void {\n if (!this.active) return;\n const errors: unknown[] = [];\n for (const fact of events) {\n try {\n if (isPhysicsBodyEventDelivery2D(fact)) {\n const handler = this.bodyEventHandler(fact);\n if (!handler) continue;\n handler(\n materializePhysicsBodyEvent2D(\n fact,\n this.materializeBodyHandle(fact.bodyIndex, fact.bodyGeneration),\n ),\n );\n continue;\n }\n const handler = this.contactEventHandler(fact);\n if (!handler) continue;\n handler(\n materializePhysicsContactEvent2D(fact, {\n body: (index, generation) =>\n this.materializeBodyHandle(index, generation),\n collider: (index, generation) =>\n this.materializeColliderHandle(index, generation),\n }) as never,\n );\n } catch (error) {\n errors.push(error);\n }\n }\n if (errors.length === 1) throw errors[0];\n if (errors.length > 1) {\n throw new AggregateError(\n errors,\n \"Multiple physics 2D event callbacks failed.\",\n );\n }\n }\n\n private bodyEventHandler(\n fact: PhysicsBodyEventDelivery2D,\n ): PhysicsBodyEventDelivery2D[\"handler\"] | undefined {\n const handler =\n fact.kind === 6 ? this.acceptedProps.onSleep : this.acceptedProps.onWake;\n const identity = this.kernel.bodyIdentity(fact.bodyId);\n return identity?.index === fact.bodyIndex &&\n identity.generation === fact.bodyGeneration\n ? handler\n : undefined;\n }\n\n private contactEventHandler(\n fact: PhysicsContactEventDelivery2D,\n ): PhysicsContactEventDelivery2D[\"handler\"] | undefined {\n const receiver = this.acceptedColliders.find(\n (collider) => collider.id === fact.receiverColliderId,\n );\n if (receiver === undefined || receiver.bodyId !== fact.receiverBodyId)\n return undefined;\n const handler = receiver.options.handlers[eventHandlerName(fact.kind)];\n const colliderIdentity = this.kernel.colliderIdentity(receiver.id);\n const expectedIndex =\n fact.receiver === \"first\"\n ? fact.firstColliderIndex\n : fact.secondColliderIndex;\n const expectedGeneration =\n fact.receiver === \"first\"\n ? fact.firstColliderGeneration\n : fact.secondColliderGeneration;\n return colliderIdentity?.index === expectedIndex &&\n colliderIdentity.generation === expectedGeneration\n ? handler\n : undefined;\n }\n\n private acceptedColliderForIdentity(\n index: number,\n generation: number,\n ): AcceptedCollider2D | undefined {\n return this.acceptedColliders.find((collider) => {\n const identity = this.kernel.colliderIdentity(collider.id);\n return identity?.index === index && identity.generation === generation;\n });\n }\n\n private hasAwakeBodies(): boolean {\n for (const body of this.acceptedBodies) {\n if (\n body.descriptor.bodyType !== \"kinematic\" ||\n !body.descriptor.options.enabled ||\n this.kernel.bodyIdentity(body.id) === undefined\n )\n continue;\n const pose = this.kernel.authoritativePose(body.id);\n const target = body.descriptor.options.target;\n const position = target.position?.get() ?? body.initialPose.position;\n const rotation =\n target.rotationDegrees?.get() ?? body.initialPose.rotationDegrees;\n if (\n (position &&\n (position[0] !== pose.position[0] ||\n position[1] !== pose.position[1])) ||\n (rotation !== undefined && rotation !== pose.rotationDegrees)\n )\n return true;\n }\n const bodies = this.kernel.bodies;\n for (const body of this.acceptedBodies) {\n const identity = this.kernel.bodyIdentity(body.id);\n if (identity === undefined) continue;\n const index = identity.index;\n const flags = bodies.flags[index]!;\n if (\n (flags & BODY_TYPE_KINEMATIC_2D) !== 0 &&\n (bodies.linearVelocityX[index]! !== 0 ||\n bodies.linearVelocityY[index]! !== 0 ||\n bodies.angularVelocity[index]! !== 0)\n )\n return true;\n if (\n (flags & BODY_TYPE_DYNAMIC_2D) !== 0 &&\n (flags & BODY_SLEEPING_2D) === 0\n )\n return true;\n }\n return false;\n }\n\n private requireDraft(): RenderDraft2D {\n const draft = this.draft;\n if (draft === undefined) {\n throw new Error(\n \"A physics attachment requires an active PhysicsWorld2D render draft.\",\n );\n }\n return draft;\n }\n\n private allocateId(): number {\n if (this.nextId === Number.MAX_SAFE_INTEGER) {\n throw new Error(\"PhysicsWorld2D exhausted stable attachment identities.\");\n }\n return this.nextId++;\n }\n\n private assertActive(): void {\n if (!this.active) {\n throw new TypeError(\"Expected a live Pibbl physics 2D world handle.\");\n }\n }\n\n private materializeRevision(): WritableSignal<number> {\n return (this.revision ??= signal(this.committedRevision, {\n debugName: \"PhysicsWorld2D.revision\",\n }));\n }\n\n /** Query handles are cached only while their kernel identity remains live. */\n private evictRetiredMaterializedHandles(): void {\n for (const [key, handle] of this.materializedBodyHandles) {\n const separator = key.indexOf(\":\");\n const index = Number(key.slice(0, separator));\n const generation = Number(key.slice(separator + 1));\n if (this.kernel.bodyIdForIdentity(index, generation) !== undefined)\n continue;\n const binding = physicsBodyHandleBinding2D(handle);\n if (binding?.controller === this) {\n unbindPhysicsBodyHandle2D(\n handle,\n this,\n binding.bodyId,\n binding.bindingGeneration,\n );\n }\n this.materializedBodyHandles.delete(key);\n }\n for (const [key, handle] of this.materializedColliderHandles) {\n const identity = physicsColliderHandleIdentity2D(handle);\n if (\n identity?.controller === this &&\n this.kernel.colliderIdForIdentity(\n identity.index,\n identity.generation,\n ) !== undefined\n )\n continue;\n this.materializedColliderHandles.delete(key);\n }\n }\n\n private materializeBodyHandle(\n index: number,\n generation: number,\n ): PibblPhysicsBodyHandle2D {\n const bodyId = this.kernel.bodyIdForIdentity(index, generation);\n if (bodyId === undefined) {\n throw new Error(\n \"Cannot materialize a stale physics 2D body query result.\",\n );\n }\n const accepted = this.acceptedBodies.find((body) => body.id === bodyId);\n const explicit = accepted?.descriptor.options.handle;\n if (explicit !== undefined) return explicit;\n const key = `${String(index)}:${String(generation)}`;\n let handle = this.materializedBodyHandles.get(key);\n if (handle === undefined) {\n handle = createPhysicsBodyHandle2D(this.owner);\n bindPhysicsBodyHandle2D(handle, this, bodyId);\n this.materializedBodyHandles.set(key, handle);\n }\n return handle;\n }\n\n private materializeColliderHandle(\n index: number,\n generation: number,\n ): PibblPhysicsColliderHandle2D {\n if (this.kernel.colliderIdForIdentity(index, generation) === undefined) {\n throw new Error(\n \"Cannot materialize a stale physics 2D collider query result.\",\n );\n }\n const key = `${String(index)}:${String(generation)}`;\n let handle = this.materializedColliderHandles.get(key);\n if (handle === undefined) {\n handle = createPhysicsColliderHandle2D(this, index, generation);\n this.materializedColliderHandles.set(key, handle);\n }\n return handle;\n }\n\n private resolveBodyHandle(\n handle: PibblPhysicsBodyHandle2D,\n ): Readonly<{ index: number; generation: number }> | null {\n const binding = physicsBodyHandleBinding2D(handle);\n if (binding?.controller !== this) return null;\n return this.kernel.bodyIdentity(binding.bodyId) ?? null;\n }\n\n private resolveColliderHandle(\n handle: PibblPhysicsColliderHandle2D,\n ): Readonly<{ index: number; generation: number }> | null {\n const identity = physicsColliderHandleIdentity2D(handle);\n if (identity?.controller !== this) return null;\n return this.kernel.colliderIdForIdentity(\n identity.index,\n identity.generation,\n ) === undefined\n ? null\n : identity;\n }\n\n private unbindBodyHandle(body: AcceptedBody2D): void {\n const handle = body.descriptor.options.handle;\n const generation = body.handleBindingGeneration;\n if (handle !== undefined && generation !== undefined) {\n unbindPhysicsBodyHandle2D(handle, this, body.id, generation);\n }\n }\n}\n\nexport function requirePhysicsWorld2DController(\n handle: PibblPhysicsWorldHandle2D,\n): PhysicsWorld2DController {\n const controller = (handle as Partial<InternalWorldHandle2D>)[\n worldController2DSymbol\n ];\n if (!(controller instanceof PhysicsWorld2DController)) {\n throw new TypeError(\"Expected a live Pibbl physics 2D world handle.\");\n }\n return controller;\n}\n\nexport function snapshotPhysicsWorld2DControllerForTest(\n controller: PhysicsWorld2DController,\n): PhysicsWorld2DControllerSnapshot {\n return controller.snapshot();\n}\n\nfunction normalizeWorldConfiguration(\n props: PibblResolvedPhysicsWorld2DProps,\n): NormalizedPhysicsWorld2DConfiguration {\n return normalizePhysicsWorld2DConfiguration({\n gravity: props.gravity,\n fixedStepMilliseconds: props.fixedStepMilliseconds,\n maxCatchUpSteps: props.maxCatchUpSteps,\n interpolation: props.interpolation,\n sleeping: props.sleeping,\n solver: props.solver,\n });\n}\n\nfunction denormalizeWorldConfiguration(\n configuration: NormalizedPhysicsWorld2DConfiguration,\n): PhysicsWorld2DConfiguration {\n return Object.freeze({\n gravity: Object.freeze([\n configuration.gravityX,\n configuration.gravityY,\n ] as const),\n fixedStepMilliseconds: configuration.fixedStepMilliseconds,\n maxCatchUpSteps: configuration.maxCatchUpSteps,\n interpolation: configuration.interpolation,\n sleeping: configuration.sleeping,\n solver: Object.freeze({\n velocityIterations: configuration.velocityIterations,\n positionIterations: configuration.positionIterations,\n }),\n });\n}\n\nfunction materializeTopology(\n draft: RenderDraft2D,\n reenableVelocities: ReadonlyMap<number, BodyVelocity2D>,\n previousBodyDefinitions: ReadonlyMap<number, BodyDefinition2D>,\n): readonly PhysicsTopologyRecord2D[] {\n const collidersByBody = new Map<number, ColliderDraft2D[]>();\n for (const collider of draft.colliders.values()) {\n const entries = collidersByBody.get(collider.bodyId) ?? [];\n entries.push(collider);\n collidersByBody.set(collider.bodyId, entries);\n }\n const bodies = [...draft.bodies.values()]\n .sort((left, right) => left.id - right.id)\n .map((body): PhysicsBodyTopologyRecord2D =>\n Object.freeze({\n kind: \"body\",\n id: body.id,\n definition: bodyDefinition(\n body,\n collidersByBody.get(body.id) ?? [],\n reenableVelocities.get(body.id),\n previousBodyDefinitions.get(body.id),\n ),\n }),\n );\n const colliders = [...draft.colliders.values()]\n .sort((left, right) => left.id - right.id)\n .map((collider): PhysicsColliderTopologyRecord2D =>\n Object.freeze({\n kind: \"collider\",\n id: collider.id,\n bodyId: collider.bodyId,\n definition: Object.freeze({\n shape: collider.shape,\n material: Object.freeze({\n friction: collider.options.friction,\n restitution: collider.options.restitution,\n }),\n filter: collider.options.collisionFilter,\n tag: collider.options.tag,\n handlers: collider.options.handlers,\n owner: collider.attachment,\n flags: collider.options.sensor ? COLLIDER_SENSOR_2D : 0,\n }),\n }),\n );\n return Object.freeze([...bodies, ...colliders]);\n}\n\nfunction validateAutomaticMass(draft: RenderDraft2D): void {\n const massByBody = new Map<number, number>();\n for (const collider of draft.colliders.values()) {\n if (!collider.options.contributesToMass) continue;\n massByBody.set(\n collider.bodyId,\n (massByBody.get(collider.bodyId) ?? 0) +\n collider.shape.area * collider.options.density,\n );\n }\n for (const body of draft.bodies.values()) {\n if (\n body.descriptor.bodyType !== \"dynamic\" ||\n !body.descriptor.options.enabled ||\n body.descriptor.options.mass !== \"auto\"\n ) {\n continue;\n }\n if ((massByBody.get(body.id) ?? 0) <= 0) {\n throw new RangeError(\n \"A dynamic body with automatic mass requires positive derived area from at least one active mass-contributing collider.\",\n );\n }\n }\n}\n\nfunction bodyDefinition(\n body: BodyDraft2D,\n colliders: readonly ColliderDraft2D[],\n reenableVelocity?: BodyVelocity2D,\n previous?: BodyDefinition2D,\n): BodyDefinition2D {\n const descriptor = body.descriptor;\n const enabled = descriptor.options.enabled;\n const massData = compoundMassData(colliders);\n let flags = 0;\n let linearVelocityX = 0;\n let linearVelocityY = 0;\n let angularVelocity = 0;\n let linearDamping = 0;\n let angularDamping = 0;\n let gravityScale = 0;\n let inverseMass = 0;\n let inverseInertia = 0;\n let localCenterX = 0;\n let localCenterY = 0;\n if (enabled && descriptor.bodyType === \"dynamic\") {\n flags |= BODY_TYPE_DYNAMIC_2D;\n if (descriptor.options.fixedRotation) flags |= BODY_FIXED_ROTATION_2D;\n if (!descriptor.options.allowSleep) flags |= BODY_SLEEP_DISABLED_2D;\n if (descriptor.options.ccd) flags |= BODY_CCD_2D;\n linearVelocityX =\n reenableVelocity?.linearVelocityX ?? descriptor.options.linearVelocity[0];\n linearVelocityY =\n reenableVelocity?.linearVelocityY ?? descriptor.options.linearVelocity[1];\n angularVelocity =\n reenableVelocity?.angularVelocity ??\n (descriptor.options.angularVelocityDegreesPerSecond * Math.PI) / 180;\n linearDamping = descriptor.options.linearDamping;\n angularDamping = descriptor.options.angularDamping;\n gravityScale = descriptor.options.gravityScale;\n const mass =\n descriptor.options.mass === \"auto\"\n ? massData.mass\n : descriptor.options.mass;\n inverseMass = mass > 0 ? 1 / mass : 1;\n localCenterX = massData.centerX;\n localCenterY = massData.centerY;\n const inertia =\n massData.mass > 0 ? massData.inertia * (mass / massData.mass) : 0;\n inverseInertia = descriptor.options.fixedRotation\n ? 0\n : inertia > 0\n ? 1 / inertia\n : inverseMass;\n } else if (enabled && descriptor.bodyType === \"kinematic\") {\n flags |= BODY_TYPE_KINEMATIC_2D;\n if (!descriptor.options.allowSleep) flags |= BODY_SLEEP_DISABLED_2D;\n }\n const authoredRotationRadians =\n (body.initialPose.rotationDegrees * Math.PI) / 180;\n const previousKinematic =\n previous !== undefined && (previous.flags & BODY_TYPE_KINEMATIC_2D) !== 0\n ? previous\n : undefined;\n const preserveTargetBoundKinematicPose =\n descriptor.bodyType === \"kinematic\" &&\n (descriptor.options.target.position !== undefined ||\n descriptor.options.target.rotationDegrees !== undefined) &&\n previousKinematic !== undefined;\n const previousRotationRadians = previousKinematic?.rotationRadians ?? 0;\n const previousCosine = Math.cos(previousRotationRadians);\n const previousSine = Math.sin(previousRotationRadians);\n const previousOriginX =\n previousKinematic === undefined\n ? 0\n : previousKinematic.positionX -\n previousCosine * (previousKinematic.localCenterX ?? 0) +\n previousSine * (previousKinematic.localCenterY ?? 0);\n const previousOriginY =\n previousKinematic === undefined\n ? 0\n : previousKinematic.positionY -\n previousSine * (previousKinematic.localCenterX ?? 0) -\n previousCosine * (previousKinematic.localCenterY ?? 0);\n const positionX = preserveTargetBoundKinematicPose\n ? previousOriginX\n : body.initialPose.position[0];\n const positionY = preserveTargetBoundKinematicPose\n ? previousOriginY\n : body.initialPose.position[1];\n const effectiveRotationRadians = preserveTargetBoundKinematicPose\n ? previousKinematic!.rotationRadians\n : authoredRotationRadians;\n const cosine = Math.cos(effectiveRotationRadians);\n const sine = Math.sin(effectiveRotationRadians);\n return Object.freeze({\n positionX: positionX + cosine * localCenterX - sine * localCenterY,\n positionY: positionY + sine * localCenterX + cosine * localCenterY,\n rotationRadians: effectiveRotationRadians,\n localCenterX,\n localCenterY,\n linearVelocityX,\n linearVelocityY,\n angularVelocity,\n forceX: 0,\n forceY: 0,\n torque: 0,\n inverseMass,\n inverseInertia,\n linearDamping,\n angularDamping,\n gravityScale,\n sleepTime: 0,\n flags,\n owner: body.attachment,\n });\n}\n\nconst ZERO_VELOCITY_2D: BodyVelocity2D = Object.freeze({\n linearVelocityX: 0,\n linearVelocityY: 0,\n angularVelocity: 0,\n});\n\nfunction compoundMassData(colliders: readonly ColliderDraft2D[]): Readonly<{\n mass: number;\n centerX: number;\n centerY: number;\n inertia: number;\n}> {\n const entries = colliders\n .filter((collider) => collider.options.contributesToMass)\n .map((collider) => {\n const shape = collider.shape;\n const cosine = Math.cos(shape.localPose.rotationRadians);\n const sine = Math.sin(shape.localPose.rotationRadians);\n const centerX =\n shape.localPose.x + cosine * shape.centroidX - sine * shape.centroidY;\n const centerY =\n shape.localPose.y + sine * shape.centroidX + cosine * shape.centroidY;\n return {\n mass: shape.area * collider.options.density,\n centerX,\n centerY,\n centroidInertia: shape.unitInertia * collider.options.density,\n };\n });\n const mass = entries.reduce((sum, entry) => sum + entry.mass, 0);\n if (mass <= 0) {\n return { mass: 0, centerX: 0, centerY: 0, inertia: 0 };\n }\n const centerX =\n entries.reduce((sum, entry) => sum + entry.mass * entry.centerX, 0) / mass;\n const centerY =\n entries.reduce((sum, entry) => sum + entry.mass * entry.centerY, 0) / mass;\n const inertia = entries.reduce((sum, entry) => {\n const offsetX = entry.centerX - centerX;\n const offsetY = entry.centerY - centerY;\n return (\n sum +\n entry.centroidInertia +\n entry.mass * (offsetX * offsetX + offsetY * offsetY)\n );\n }, 0);\n return { mass, centerX, centerY, inertia };\n}\n\nfunction sameConfiguration(\n left: NormalizedPhysicsWorld2DConfiguration,\n right: NormalizedPhysicsWorld2DConfiguration,\n): boolean {\n return (\n left.gravityX === right.gravityX &&\n left.gravityY === right.gravityY &&\n left.fixedStepMilliseconds === right.fixedStepMilliseconds &&\n left.maxCatchUpSteps === right.maxCatchUpSteps &&\n left.interpolation === right.interpolation &&\n left.sleeping === right.sleeping &&\n left.velocityIterations === right.velocityIterations &&\n left.positionIterations === right.positionIterations\n );\n}\n\nfunction copyPhysicsPose2D(pose: PibblPhysicsPose2D): PibblPhysicsPose2D {\n return Object.freeze({\n position: copyFiniteVector2(pose.position, \"initial physics pose.position\"),\n rotationDegrees: requireFiniteNumber(\n pose.rotationDegrees,\n \"initial physics pose.rotationDegrees\",\n ),\n });\n}\n\nfunction sameTopology(\n left: readonly PhysicsTopologyRecord2D[],\n right: readonly PhysicsTopologyRecord2D[],\n): boolean {\n if (left.length !== right.length) return false;\n return left.every((first, index) => {\n const second = right[index];\n if (!second || first.kind !== second.kind || first.id !== second.id)\n return false;\n if (first.kind === \"body\" && second.kind === \"body\") {\n return sameRecord(first.definition, second.definition);\n }\n if (first.kind === \"collider\" && second.kind === \"collider\") {\n return (\n first.bodyId === second.bodyId &&\n first.definition.shape === second.definition.shape &&\n first.definition.flags === second.definition.flags &&\n sameRecord(first.definition.material, second.definition.material) &&\n sameRecord(first.definition.filter, second.definition.filter)\n );\n }\n return false;\n });\n}\n\nfunction sameRecord(left: unknown, right: unknown): boolean {\n if (left === right) return true;\n if (\n typeof left !== \"object\" ||\n left === null ||\n typeof right !== \"object\" ||\n right === null\n )\n return false;\n const leftEntries = Object.entries(left);\n const rightRecord = right as Record<string, unknown>;\n return (\n leftEntries.length === Object.keys(rightRecord).length &&\n leftEntries.every(([key, value]) => rightRecord[key] === value)\n );\n}\n\nfunction validateUniqueBodyHandles(bodies: readonly BodyDraft2D[]): void {\n const ids = new Map<PibblPhysicsBodyHandle2D, number>();\n for (const body of bodies) {\n const handle = body.descriptor.options.handle;\n if (handle === undefined) continue;\n const previous = ids.get(handle);\n if (previous !== undefined && previous !== body.id) {\n throw new Error(\n \"A Pibbl physics 2D body handle may bind to at most one live body.\",\n );\n }\n ids.set(handle, body.id);\n }\n}\n\nfunction eventHandlerName(\n kind: PhysicsContactEventDelivery2D[\"kind\"],\n): keyof NormalizedPhysicsColliderConfiguration2D[\"handlers\"] {\n switch (kind) {\n case 1:\n return \"onCollisionStart\";\n case 2:\n return \"onCollisionEnd\";\n case 3:\n return \"onOverlapStart\";\n case 4:\n return \"onOverlapEnd\";\n case 7:\n return \"onHit\";\n }\n}\n\nconst ZERO_POSE_2D: PibblPhysicsPose2D = Object.freeze({\n position: Object.freeze([0, 0] as const),\n rotationDegrees: 0,\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["target", "handler", "centerX", "centerY"]
|
|
7
7
|
}
|
|
@@ -48,17 +48,15 @@ class CommittedObstacles2D {
|
|
|
48
48
|
canonicalLeafIndex
|
|
49
49
|
});
|
|
50
50
|
if (radius > 0)
|
|
51
|
-
for (
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
canonicalLeafIndex
|
|
61
|
-
});
|
|
51
|
+
for (let y = -1; y <= 1; y += 2) for (let x = -1; x <= 1; x += 2) parts.push({
|
|
52
|
+
kind: "circle",
|
|
53
|
+
center: new Float64Array([
|
|
54
|
+
center[0] + x * (hw - radius),
|
|
55
|
+
center[1] + y * (hh - radius)
|
|
56
|
+
]),
|
|
57
|
+
radius,
|
|
58
|
+
canonicalLeafIndex
|
|
59
|
+
});
|
|
62
60
|
expanded = parts;
|
|
63
61
|
this.expandedLeaves.set(leaf, expanded);
|
|
64
62
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/features/physics/lib/2d/runtime/obstacles.ts"],
|
|
4
|
-
"sourcesContent": ["import type { ConvexLeaf2D } from \"../shape-records.js\";\nimport type { PhysicsWorld2DKernel } from \"../world/world.js\";\nimport { COLLIDER_SENSOR_2D } from \"../world/contact-cache.js\";\nexport interface PhysicsObstacleBatch2D {\n readonly revision: number;\n readonly boxes: Float64Array;\n readonly ellipses: Float64Array;\n readonly polygons: Float64Array;\n}\n/** Published copies: no borrowed physics-engine memory or candidate state. */\nexport class CommittedObstacles2D {\n private batch = {\n revision: 0,\n boxes: new Float64Array(0),\n ellipses: new Float64Array(0),\n polygons: new Float64Array(0),\n };\n private readonly expandedShapes = new WeakMap<\n readonly ConvexLeaf2D[],\n readonly ConvexLeaf2D[]\n >();\n private readonly expandedLeaves = new WeakMap<\n ConvexLeaf2D,\n readonly ConvexLeaf2D[]\n >();\n private leaves(leaves: readonly ConvexLeaf2D[]): readonly ConvexLeaf2D[] {\n // A rounded rectangle with equal corner radii is exactly the union of two\n // central boxes and four disks. Cache the immutable geometry, not world poses.\n const cached = this.expandedShapes.get(leaves);\n if (cached) return cached;\n const result: ConvexLeaf2D[] = [];\n for (const leaf of leaves) {\n if (leaf.kind !== \"rounded-box\") {\n result.push(leaf);\n continue;\n }\n let expanded = this.expandedLeaves.get(leaf);\n if (!expanded) {\n const radius = leaf.radii[0]!;\n if (!leaf.radii.every((r) => r === radius)) {\n result.push(leaf);\n continue;\n }\n const {\n halfWidth: hw,\n halfHeight: hh,\n center,\n canonicalLeafIndex,\n } = leaf;\n const parts: ConvexLeaf2D[] = [];\n if (hw > radius)\n parts.push({\n kind: \"box\",\n center,\n halfWidth: hw - radius,\n halfHeight: hh,\n canonicalLeafIndex,\n });\n if (hh > radius)\n parts.push({\n kind: \"box\",\n center,\n halfWidth: hw,\n halfHeight: hh - radius,\n canonicalLeafIndex,\n });\n if (radius > 0)\n for (
|
|
5
|
-
"mappings": "AAEA,SAAS,0BAA0B;AAQ5B,MAAM,qBAAqB;AAAA,EACxB,QAAQ;AAAA,IACd,UAAU;AAAA,IACV,OAAO,IAAI,aAAa,CAAC;AAAA,IACzB,UAAU,IAAI,aAAa,CAAC;AAAA,IAC5B,UAAU,IAAI,aAAa,CAAC;AAAA,EAC9B;AAAA,EACiB,iBAAiB,oBAAI,QAGpC;AAAA,EACe,iBAAiB,oBAAI,QAGpC;AAAA,EACM,OAAO,QAA0D;AAGvE,UAAM,SAAS,KAAK,eAAe,IAAI,MAAM;AAC7C,QAAI,OAAQ,QAAO;AACnB,UAAM,SAAyB,CAAC;AAChC,eAAW,QAAQ,QAAQ;AACzB,UAAI,KAAK,SAAS,eAAe;AAC/B,eAAO,KAAK,IAAI;AAChB;AAAA,MACF;AACA,UAAI,WAAW,KAAK,eAAe,IAAI,IAAI;AAC3C,UAAI,CAAC,UAAU;AACb,cAAM,SAAS,KAAK,MAAM,CAAC;AAC3B,YAAI,CAAC,KAAK,MAAM,MAAM,CAAC,MAAM,MAAM,MAAM,GAAG;AAC1C,iBAAO,KAAK,IAAI;AAChB;AAAA,QACF;AACA,cAAM;AAAA,UACJ,WAAW;AAAA,UACX,YAAY;AAAA,UACZ;AAAA,UACA;AAAA,QACF,IAAI;AACJ,cAAM,QAAwB,CAAC;AAC/B,YAAI,KAAK;AACP,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN;AAAA,YACA,WAAW,KAAK;AAAA,YAChB,YAAY;AAAA,YACZ;AAAA,UACF,CAAC;AACH,YAAI,KAAK;AACP,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN;AAAA,YACA,WAAW;AAAA,YACX,YAAY,KAAK;AAAA,YACjB;AAAA,UACF,CAAC;AACH,YAAI,SAAS;AACX,
|
|
4
|
+
"sourcesContent": ["import type { ConvexLeaf2D } from \"../shape-records.js\";\nimport type { PhysicsWorld2DKernel } from \"../world/world.js\";\nimport { COLLIDER_SENSOR_2D } from \"../world/contact-cache.js\";\nexport interface PhysicsObstacleBatch2D {\n readonly revision: number;\n readonly boxes: Float64Array;\n readonly ellipses: Float64Array;\n readonly polygons: Float64Array;\n}\n/** Published copies: no borrowed physics-engine memory or candidate state. */\nexport class CommittedObstacles2D {\n private batch = {\n revision: 0,\n boxes: new Float64Array(0),\n ellipses: new Float64Array(0),\n polygons: new Float64Array(0),\n };\n private readonly expandedShapes = new WeakMap<\n readonly ConvexLeaf2D[],\n readonly ConvexLeaf2D[]\n >();\n private readonly expandedLeaves = new WeakMap<\n ConvexLeaf2D,\n readonly ConvexLeaf2D[]\n >();\n private leaves(leaves: readonly ConvexLeaf2D[]): readonly ConvexLeaf2D[] {\n // A rounded rectangle with equal corner radii is exactly the union of two\n // central boxes and four disks. Cache the immutable geometry, not world poses.\n const cached = this.expandedShapes.get(leaves);\n if (cached) return cached;\n const result: ConvexLeaf2D[] = [];\n for (const leaf of leaves) {\n if (leaf.kind !== \"rounded-box\") {\n result.push(leaf);\n continue;\n }\n let expanded = this.expandedLeaves.get(leaf);\n if (!expanded) {\n const radius = leaf.radii[0]!;\n if (!leaf.radii.every((r) => r === radius)) {\n result.push(leaf);\n continue;\n }\n const {\n halfWidth: hw,\n halfHeight: hh,\n center,\n canonicalLeafIndex,\n } = leaf;\n const parts: ConvexLeaf2D[] = [];\n if (hw > radius)\n parts.push({\n kind: \"box\",\n center,\n halfWidth: hw - radius,\n halfHeight: hh,\n canonicalLeafIndex,\n });\n if (hh > radius)\n parts.push({\n kind: \"box\",\n center,\n halfWidth: hw,\n halfHeight: hh - radius,\n canonicalLeafIndex,\n });\n if (radius > 0)\n for (let y = -1; y <= 1; y += 2) for (let x = -1; x <= 1; x += 2) parts.push({\n kind: \"circle\",\n center: new Float64Array([\n center[0]! + x * (hw - radius),\n center[1]! + y * (hh - radius),\n ]),\n radius,\n canonicalLeafIndex,\n });\n expanded = parts;\n this.expandedLeaves.set(leaf, expanded);\n }\n result.push(...expanded);\n }\n this.expandedShapes.set(leaves, result);\n return result;\n }\n private error: Error | undefined;\n private changed = false;\n private write(output: Float64Array, index: number, value: number): void {\n if (output[index] !== value) {\n output[index] = value;\n this.changed = true;\n }\n }\n read(): PhysicsObstacleBatch2D {\n if (this.error) throw this.error;\n return this.batch;\n }\n publish(\n world: PhysicsWorld2DKernel,\n entries: readonly Readonly<{ id: number; bodyId: number }>[],\n revision: number,\n ): void {\n let boxes = 0,\n ellipses = 0,\n polygons = 0;\n for (const entry of entries) {\n const collider = world.colliderIdentity(entry.id);\n if (\n !collider ||\n !world.isBodyEnabled(entry.bodyId) ||\n world.colliders.flags[collider.index]! & COLLIDER_SENSOR_2D\n )\n continue;\n for (const leaf of this.leaves(\n world.colliders.shapes[collider.index]!.leaves,\n )) {\n if (leaf.kind === \"box\") boxes += 10;\n else if (leaf.kind === \"ellipse\" || leaf.kind === \"circle\")\n ellipses += 10;\n else if (leaf.kind === \"polygon\") polygons += 6 + leaf.vertices.length;\n else {\n this.error = new TypeError(\n \"Unsupported flow obstacle collider: \" + leaf.kind,\n );\n return;\n }\n }\n }\n this.changed =\n this.error !== undefined ||\n this.batch.boxes.length !== boxes ||\n this.batch.ellipses.length !== ellipses ||\n this.batch.polygons.length !== polygons;\n this.error = undefined;\n if (this.batch.boxes.length !== boxes)\n this.batch.boxes = new Float64Array(boxes);\n if (this.batch.ellipses.length !== ellipses)\n this.batch.ellipses = new Float64Array(ellipses);\n if (this.batch.polygons.length !== polygons)\n this.batch.polygons = new Float64Array(polygons);\n let boxAt = 0,\n ellipseAt = 0,\n polygonAt = 0;\n const bodies = world.bodies;\n for (const entry of entries) {\n const collider = world.colliderIdentity(entry.id);\n if (\n !collider ||\n !world.isBodyEnabled(entry.bodyId) ||\n world.colliders.flags[collider.index]! & COLLIDER_SENSOR_2D\n )\n continue;\n const body = world.bodyIdentity(entry.bodyId)!.index;\n const shape = world.colliders.shapes[collider.index]!;\n const rotation = bodies.rotationRadians[body]!;\n const cosine = Math.cos(rotation),\n sine = Math.sin(rotation);\n const originX =\n bodies.positionX[body]! -\n cosine * bodies.localCenterX[body]! +\n sine * bodies.localCenterY[body]!;\n const originY =\n bodies.positionY[body]! -\n sine * bodies.localCenterX[body]! -\n cosine * bodies.localCenterY[body]!;\n const local = shape.localPose;\n const x = originX + cosine * local.x - sine * local.y;\n const y = originY + sine * local.x + cosine * local.y;\n const angle = rotation + local.rotationRadians,\n c = Math.cos(angle),\n s = Math.sin(angle);\n for (const leaf of this.leaves(shape.leaves)) {\n if (leaf.kind === \"polygon\") {\n const output = this.batch.polygons;\n this.write(output, polygonAt++, leaf.vertices.length / 2);\n this.write(output, polygonAt++, bodies.linearVelocityX[body]!);\n this.write(output, polygonAt++, bodies.linearVelocityY[body]!);\n this.write(output, polygonAt++, bodies.angularVelocity[body]!);\n this.write(output, polygonAt++, bodies.positionX[body]!);\n this.write(output, polygonAt++, bodies.positionY[body]!);\n for (let v = 0; v < leaf.vertices.length; v += 2) {\n this.write(\n output,\n polygonAt++,\n x + c * leaf.vertices[v]! - s * leaf.vertices[v + 1]!,\n );\n this.write(\n output,\n polygonAt++,\n y + s * leaf.vertices[v]! + c * leaf.vertices[v + 1]!,\n );\n }\n } else if (\n leaf.kind === \"box\" ||\n leaf.kind === \"ellipse\" ||\n leaf.kind === \"circle\"\n ) {\n const output =\n leaf.kind === \"box\" ? this.batch.boxes : this.batch.ellipses;\n let at = leaf.kind === \"box\" ? boxAt : ellipseAt;\n this.write(\n output,\n at++,\n x + c * leaf.center[0]! - s * leaf.center[1]!,\n );\n this.write(\n output,\n at++,\n y + s * leaf.center[0]! + c * leaf.center[1]!,\n );\n this.write(\n output,\n at++,\n leaf.kind === \"box\"\n ? leaf.halfWidth\n : leaf.kind === \"circle\"\n ? leaf.radius\n : leaf.radiusX,\n );\n this.write(\n output,\n at++,\n leaf.kind === \"box\"\n ? leaf.halfHeight\n : leaf.kind === \"circle\"\n ? leaf.radius\n : leaf.radiusY,\n );\n this.write(\n output,\n at++,\n angle + (leaf.kind === \"ellipse\" ? leaf.rotationRadians : 0),\n );\n this.write(output, at++, bodies.linearVelocityX[body]!);\n this.write(output, at++, bodies.linearVelocityY[body]!);\n this.write(output, at++, bodies.angularVelocity[body]!);\n this.write(output, at++, bodies.positionX[body]!);\n this.write(output, at++, bodies.positionY[body]!);\n if (leaf.kind === \"box\") boxAt = at;\n else ellipseAt = at;\n }\n }\n }\n if (this.changed) this.batch.revision = revision;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -353,8 +353,8 @@ function mutableBoundsForLeaves(leaves, pose) {
|
|
|
353
353
|
return result;
|
|
354
354
|
}
|
|
355
355
|
function includeBoxCorners(center, halfWidth, halfHeight, pose, bounds, point) {
|
|
356
|
-
for (
|
|
357
|
-
for (
|
|
356
|
+
for (let xSign = -1; xSign <= 1; xSign += 2) {
|
|
357
|
+
for (let ySign = -1; ySign <= 1; ySign += 2) {
|
|
358
358
|
transformPointInto(
|
|
359
359
|
point,
|
|
360
360
|
0,
|
|
@@ -466,13 +466,12 @@ function lineCentroid(points, closed) {
|
|
|
466
466
|
}
|
|
467
467
|
function roundedBoxContour(halfWidth, halfHeight, radii, center) {
|
|
468
468
|
const points = [];
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
for (const [x, y, start, end, radius] of cornerData) {
|
|
469
|
+
for (let corner = 0; corner < 4; corner++) {
|
|
470
|
+
const radius = radii[(corner + 1) % 4];
|
|
471
|
+
const x = corner < 2 ? halfWidth - radius : -halfWidth + radius;
|
|
472
|
+
const y = corner === 0 || corner === 3 ? -halfHeight + radius : halfHeight - radius;
|
|
473
|
+
const start = (corner - 1) * Math.PI / 2;
|
|
474
|
+
const end = corner * Math.PI / 2;
|
|
476
475
|
const cornerPoints = radius === 0 ? [new Float64Array([center[0] + x, center[1] + y])] : flattenCircularSweep(center[0] + x, center[1] + y, radius, start, end, false);
|
|
477
476
|
points.push(...cornerPoints);
|
|
478
477
|
}
|