@pibbl/core 0.0.2 → 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/THIRD_PARTY_NOTICES.txt +81 -0
- 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/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/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/world/rapier.js +22 -26
- package/dist/features/physics/lib/2d/world/rapier.js.map +2 -2
- package/dist/features/sprites/loader.js +6 -3
- package/dist/features/sprites/loader.js.map +2 -2
- 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 +68 -6
- package/dist/features/viz/index.js +164 -2
- 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-title.js +2 -1
- package/dist/features/viz/lib/axis-title.js.map +2 -2
- package/dist/features/viz/lib/axis.js +1 -1
- package/dist/features/viz/lib/axis.js.map +2 -2
- package/dist/features/viz/lib/bar-series.d.ts +3 -1
- package/dist/features/viz/lib/bar-series.js +16 -1
- 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/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 +5 -2
- package/dist/features/viz/lib/hover-data.js.map +2 -2
- 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.js +1 -1
- package/dist/features/viz/lib/linear-scale.js.map +2 -2
- 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/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/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-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.js +4 -1
- package/dist/features/viz/lib/reference-band.js.map +2 -2
- package/dist/features/viz/lib/scale-context.d.ts +1 -1
- package/dist/features/viz/lib/scale-ticks.js +21 -6
- package/dist/features/viz/lib/scale-ticks.js.map +2 -2
- 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/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 +20 -4
- package/dist/features/viz/lib/use-continuous-scale.js +6 -1
- package/dist/features/viz/lib/use-continuous-scale.js.map +2 -2
- package/dist/features/viz/lib/utc-scale.js +11 -10
- package/dist/features/viz/lib/utc-scale.js.map +2 -2
- 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 +9 -5
- 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/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/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 +26 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/features/physics/lib/2d/shapes.ts"],
|
|
4
|
-
"sourcesContent": ["import type {\n PibblPhysicsAabb2D,\n PibblPhysicsMassProperties2D,\n PibblPhysicsPose2D,\n PibblPhysicsShape2D,\n PibblPhysicsTransform2D,\n PibblPhysicsVector2,\n} from '../../2d-geometry.js';\nimport {\n copyFiniteVector2,\n requireFiniteNumber,\n requireNonnegativeNumber,\n requirePositiveNumber,\n} from '../shared/validation.js';\nimport {\n CURVE_FLATTENING_MAX_DEPTH,\n CURVE_FLATTENING_TOLERANCE,\n IDENTITY_POSE_2D,\n canonicalizeContour2D,\n cleanZero,\n composePose2D,\n copyPose2D,\n freezeBounds2D,\n polygonMassData2D,\n transformPointInto,\n triangulateContour2D,\n type InternalPose2D,\n} from './math.js';\nimport { DEGREES_TO_RADIANS, GEOMETRY_EPSILON } from './numeric-policy.js';\nimport {\n createShape2D,\n requireShapeRecord2D,\n type CapsuleLeaf2D,\n type ConvexLeaf2D,\n type PolygonLeaf2D,\n} from './shape-records.js';\n\nconst FULL_TURN_RADIANS = Math.PI * 2;\n\n/**\n * Creates an immutable circle collision shape without initializing a physics world.\n *\n * @param input - Circle radius and optional center. See {@link PibblPhysicsVector2}.\n * @returns An immutable circle collision shape. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShape2D}\n */\nexport function circleShape2D(\n input: Readonly<{ radius: number; center?: PibblPhysicsVector2 }>,\n): PibblPhysicsShape2D {\n const radius = requirePositiveNumber(input.radius, 'circle.radius');\n const center = ownedVector(input.center ?? [0, 0], 'circle.center');\n const area = Math.PI * radius * radius;\n return createShapeFromLeaves(\n [Object.freeze({ kind: 'circle', center, radius, canonicalLeafIndex: 0 })],\n area,\n center[0]!,\n center[1]!,\n area * radius * radius / 2,\n );\n}\n\n/**\n * Creates an immutable ellipse collision shape without initializing a physics world.\n *\n * @param input - Ellipse radii, optional center, and rotation in degrees. See\n * {@link PibblPhysicsVector2} .\n * @returns An immutable ellipse collision shape. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShape2D}\n */\nexport function ellipseShape2D(\n input: Readonly<{\n radiusX: number;\n radiusY: number;\n center?: PibblPhysicsVector2;\n rotationDegrees?: number;\n }>,\n): PibblPhysicsShape2D {\n const radiusX = requirePositiveNumber(input.radiusX, 'ellipse.radiusX');\n const radiusY = requirePositiveNumber(input.radiusY, 'ellipse.radiusY');\n const center = ownedVector(input.center ?? [0, 0], 'ellipse.center');\n const rotationRadians =\n requireFiniteNumber(input.rotationDegrees ?? 0, 'ellipse.rotationDegrees') *\n DEGREES_TO_RADIANS;\n const area = Math.PI * radiusX * radiusY;\n return createShapeFromLeaves(\n [Object.freeze({ kind: 'ellipse', center, radiusX, radiusY, rotationRadians, canonicalLeafIndex: 0 })],\n area,\n center[0]!,\n center[1]!,\n area * (radiusX * radiusX + radiusY * radiusY) / 4,\n );\n}\n\n/**\n * Creates an immutable box collision shape without initializing a physics world.\n *\n * @param input - Box width, height, and optional center. See {@link PibblPhysicsVector2}.\n * @returns An immutable box collision shape. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShape2D}\n */\nexport function boxShape2D(\n input: Readonly<{\n width: number;\n height: number;\n center?: PibblPhysicsVector2;\n }>,\n): PibblPhysicsShape2D {\n const width = requirePositiveNumber(input.width, 'box.width');\n const height = requirePositiveNumber(input.height, 'box.height');\n const center = ownedVector(input.center ?? [0, 0], 'box.center');\n const area = width * height;\n return createShapeFromLeaves(\n [Object.freeze({ kind: 'box', center, halfWidth: width / 2, halfHeight: height / 2, canonicalLeafIndex: 0 })],\n area,\n center[0]!,\n center[1]!,\n area * (width * width + height * height) / 12,\n );\n}\n\n/**\n * Creates an immutable rounded box collision shape without initializing a physics world.\n *\n * @param input - Box dimensions, center, and uniform or per-corner radii. See\n * {@link PibblPhysicsVector2} .\n * @returns An immutable rounded-box collision shape. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShape2D}\n */\nexport function roundedBoxShape2D(\n input: Readonly<{\n width: number;\n height: number;\n radius:\n | number\n | readonly [\n topLeft: number,\n topRight: number,\n bottomRight: number,\n bottomLeft: number,\n ];\n center?: PibblPhysicsVector2;\n }>,\n): PibblPhysicsShape2D {\n const width = requirePositiveNumber(input.width, 'roundedBox.width');\n const height = requirePositiveNumber(input.height, 'roundedBox.height');\n const center = ownedVector(input.center ?? [0, 0], 'roundedBox.center');\n const sourceRadii = typeof input.radius === 'number'\n ? [input.radius, input.radius, input.radius, input.radius] as const\n : input.radius;\n const radii = new Float64Array(4);\n const maximum = Math.min(width, height) / 2;\n for (let index = 0; index < radii.length; index += 1) {\n const radius = requireNonnegativeNumber(\n sourceRadii[index]!,\n `roundedBox.radius[${index}]`,\n );\n if (radius > maximum) {\n throw new RangeError(\n `roundedBox.radius[${index}] must not exceed ${String(maximum)}; received ${String(radius)}.`,\n );\n }\n radii[index] = radius;\n }\n const contour = roundedBoxContour(width / 2, height / 2, radii, center);\n const mass = polygonMassData2D(contour);\n return createShapeFromLeaves(\n [Object.freeze({\n kind: 'rounded-box',\n center,\n halfWidth: width / 2,\n halfHeight: height / 2,\n radii,\n canonicalLeafIndex: 0,\n })],\n mass.area,\n mass.centroidX,\n mass.centroidY,\n mass.unitInertia,\n );\n}\n\n/**\n * Creates an immutable capsule collision shape without initializing a physics world.\n *\n * @param input - Capsule centerline endpoints and radius. See {@link PibblPhysicsVector2}.\n * @returns An immutable capsule collision shape. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShape2D}\n */\nexport function capsuleShape2D(\n input: Readonly<{\n start: PibblPhysicsVector2;\n end: PibblPhysicsVector2;\n radius: number;\n }>,\n): PibblPhysicsShape2D {\n const start = ownedVector(input.start, 'capsule.start');\n const end = ownedVector(input.end, 'capsule.end');\n const radius = requirePositiveNumber(input.radius, 'capsule.radius');\n const leaf: CapsuleLeaf2D = Object.freeze({\n kind: 'capsule', start, end, radius, canonicalLeafIndex: 0,\n });\n const mass = capsuleMassData(start, end, radius);\n return createShapeFromLeaves(\n [leaf],\n mass.area,\n mass.centroidX,\n mass.centroidY,\n mass.unitInertia,\n );\n}\n\n/**\n * Creates an immutable arc collision shape without initializing a physics world.\n *\n * @param input - Arc center, radius, angular endpoints in radians, sweep direction, and thickness.\n * See {@link PibblPhysicsVector2} .\n * @returns An immutable thick-arc collision shape. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShape2D}\n */\nexport function arcShape2D(\n input: Readonly<{\n center?: PibblPhysicsVector2;\n radius: number;\n startAngleRadians: number;\n endAngleRadians: number;\n counterclockwise?: boolean;\n thickness: number;\n }>,\n): PibblPhysicsShape2D {\n const center = ownedVector(input.center ?? [0, 0], 'arc.center');\n const radius = requirePositiveNumber(input.radius, 'arc.radius');\n const startAngle = requireFiniteNumber(input.startAngleRadians, 'arc.startAngleRadians');\n const endAngle = requireFiniteNumber(input.endAngleRadians, 'arc.endAngleRadians');\n const thickness = requirePositiveNumber(input.thickness, 'arc.thickness');\n const points = flattenCircularSweep(\n center[0]!, center[1]!, radius, startAngle, endAngle, input.counterclockwise === true,\n );\n return chainFromOwnedPoints(points, false, thickness / 2);\n}\n\n/**\n * Creates an immutable wedge collision shape without initializing a physics world.\n *\n * @param input - Wedge center, radius, angular endpoints in radians, and sweep direction. See\n * {@link PibblPhysicsVector2} .\n * @returns An immutable wedge collision shape. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShape2D}\n */\nexport function wedgeShape2D(\n input: Readonly<{\n center?: PibblPhysicsVector2;\n radius: number;\n startAngleRadians: number;\n endAngleRadians: number;\n counterclockwise?: boolean;\n }>,\n): PibblPhysicsShape2D {\n const center = ownedVector(input.center ?? [0, 0], 'wedge.center');\n const radius = requirePositiveNumber(input.radius, 'wedge.radius');\n const startAngle = requireFiniteNumber(input.startAngleRadians, 'wedge.startAngleRadians');\n const endAngle = requireFiniteNumber(input.endAngleRadians, 'wedge.endAngleRadians');\n const points = flattenCircularSweep(\n center[0]!, center[1]!, radius, startAngle, endAngle, input.counterclockwise === true,\n );\n const sweep = directedSweep(startAngle, endAngle, input.counterclockwise === true);\n if (Math.abs(sweep) <= GEOMETRY_EPSILON) {\n throw new RangeError('wedge angles must describe a nonzero sweep.');\n }\n const contourSource: PibblPhysicsVector2[] = Math.abs(sweep) >= FULL_TURN_RADIANS\n ? points.slice(0, -1).map(asReadonlyVector)\n : [asReadonlyVector(center), ...points.map(asReadonlyVector)];\n const contour = canonicalizeContour2D(contourSource, {\n strictlyConvex: false,\n path: 'wedge.contour',\n });\n const triangles = triangulateContour2D(contour);\n const leaves = triangles.map<PolygonLeaf2D>((vertices, canonicalLeafIndex) =>\n Object.freeze({ kind: 'polygon', vertices, canonicalLeafIndex }),\n );\n const mass = aggregateLeafMass(leaves);\n return createShapeFromLeaves(\n leaves,\n mass.area,\n mass.centroidX,\n mass.centroidY,\n mass.unitInertia,\n );\n}\n\n/**\n * Creates an immutable segment collision shape without initializing a physics world.\n *\n * @param input - Segment endpoints. See {@link PibblPhysicsVector2}.\n * @returns An immutable line-segment collision shape. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShape2D}\n */\nexport function segmentShape2D(\n input: Readonly<{ start: PibblPhysicsVector2; end: PibblPhysicsVector2 }>,\n): PibblPhysicsShape2D {\n const start = ownedVector(input.start, 'segment.start');\n const end = ownedVector(input.end, 'segment.end');\n return createShapeFromLeaves(\n [Object.freeze({ kind: 'segment', start, end, canonicalLeafIndex: 0 })],\n 0,\n (start[0]! + end[0]!) / 2,\n (start[1]! + end[1]!) / 2,\n 0,\n );\n}\n\n/**\n * Creates an immutable chain collision shape without initializing a physics world.\n *\n * @param input - Ordered chain points, closure policy, and optional radius. See\n * {@link PibblPhysicsVector2} .\n * @returns An immutable chain collision shape. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShape2D}\n */\nexport function chainShape2D(\n input: Readonly<{\n points: readonly PibblPhysicsVector2[];\n closed?: boolean;\n radius?: number;\n }>,\n): PibblPhysicsShape2D {\n if (input.points.length < 2) {\n throw new RangeError('chain.points must contain at least two points.');\n }\n const points = input.points.map((point, index) =>\n ownedVector(point, `chain.points[${index}]`),\n );\n const radius = requireNonnegativeNumber(input.radius ?? 0, 'chain.radius');\n return chainFromOwnedPoints(points, input.closed === true, radius);\n}\n\n/**\n * Creates an immutable polygon collision shape without initializing a physics world.\n *\n * @param input - Ordered polygon vertices. See {@link PibblPhysicsVector2}.\n * @returns An immutable polygon collision shape. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShape2D}\n */\nexport function polygonShape2D(\n input: Readonly<{ points: readonly PibblPhysicsVector2[] }>,\n): PibblPhysicsShape2D {\n const vertices = canonicalizeContour2D(input.points, {\n strictlyConvex: true,\n path: 'polygon.points',\n });\n const mass = polygonMassData2D(vertices);\n return createShapeFromLeaves(\n [Object.freeze({ kind: 'polygon', vertices, canonicalLeafIndex: 0 })],\n mass.area,\n mass.centroidX,\n mass.centroidY,\n mass.unitInertia,\n );\n}\n\n/**\n * Computes axis-aligned bounds for an immutable shape at an optional pose.\n *\n * @param shape - Shape whose bounds are needed. See {@link PibblPhysicsShape2D}.\n * @param pose - Optional pose at which to evaluate the shape. See {@link PibblPhysicsPose2D}.\n * @returns Axis-aligned bounds of the posed shape. See {@link PibblPhysicsAabb2D}.\n *\n * @see {@link PibblPhysicsShape2D}\n * @see {@link PibblPhysicsPose2D}\n * @see {@link PibblPhysicsAabb2D}\n */\nexport function boundsOfShape2D(\n shape: PibblPhysicsShape2D,\n pose?: PibblPhysicsPose2D,\n): PibblPhysicsAabb2D {\n const record = requireShapeRecord2D(shape);\n const outerPose = copyPose2D(pose, 'pose');\n return boundsForLeaves(record.leaves, composePose2D(outerPose, record.localPose));\n}\n\n/**\n * Computes shape area, centroid, mass, and rotational inertia at the requested density.\n *\n * @param shape - Shape whose mass properties are needed. See {@link PibblPhysicsShape2D}.\n * @param options - Optional material density.\n * @returns Mass, center of mass, and inertia for the shape. See {@link PibblPhysicsMassProperties2D}\n * .\n *\n * @see {@link PibblPhysicsShape2D}\n * @see {@link PibblPhysicsMassProperties2D}\n */\nexport function massProperties2D(\n shape: PibblPhysicsShape2D,\n options?: Readonly<{ density?: number }>,\n): PibblPhysicsMassProperties2D {\n const record = requireShapeRecord2D(shape);\n const density = requirePositiveNumber(options?.density ?? 1, 'options.density');\n const transformedCentroid = new Float64Array(2);\n transformPointInto(\n transformedCentroid,\n 0,\n record.centroidX,\n record.centroidY,\n record.localPose,\n );\n return Object.freeze({\n area: cleanZero(record.area),\n centroid: Object.freeze([\n cleanZero(transformedCentroid[0]!),\n cleanZero(transformedCentroid[1]!),\n ] as const),\n mass: cleanZero(record.area * density),\n rotationalInertia: cleanZero(record.unitInertia * density),\n });\n}\n\n/**\n * Returns independent shape geometry transformed by a rigid 2D pose.\n *\n * @param shape - Source shape; it is not modified. See {@link PibblPhysicsShape2D}.\n * @param transform - Transform to apply to the shape. See {@link PibblPhysicsTransform2D}.\n * @returns A shape containing the transformed geometry. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsShape2D}\n * @see {@link PibblPhysicsTransform2D}\n */\nexport function transformShape2D(\n shape: PibblPhysicsShape2D,\n transform: PibblPhysicsTransform2D,\n): PibblPhysicsShape2D {\n const source = requireShapeRecord2D(shape);\n const localPose = composePose2D(copyPose2D(transform, 'transform'), source.localPose);\n const localBounds = mutableBoundsForLeaves(source.leaves, localPose);\n return createShape2D({\n leaves: source.leaves,\n localPose,\n localBounds,\n area: source.area,\n centroidX: source.centroidX,\n centroidY: source.centroidY,\n unitInertia: source.unitInertia,\n });\n}\n\nfunction createShapeFromLeaves(\n leaves: readonly ConvexLeaf2D[],\n area: number,\n centroidX: number,\n centroidY: number,\n unitInertia: number,\n): PibblPhysicsShape2D {\n return createShape2D({\n leaves,\n localBounds: mutableBoundsForLeaves(leaves, IDENTITY_POSE_2D),\n area,\n centroidX,\n centroidY,\n unitInertia: Math.max(0, unitInertia),\n });\n}\n\nfunction chainFromOwnedPoints(\n points: readonly Float64Array[],\n closed: boolean,\n radius: number,\n): PibblPhysicsShape2D {\n const segmentCount = points.length === 1 ? 0 : points.length - 1 + (closed ? 1 : 0);\n const leaves: ConvexLeaf2D[] = [];\n for (let index = 0; index < segmentCount; index += 1) {\n const start = points[index]!;\n const end = points[(index + 1) % points.length]!;\n leaves.push(Object.freeze(radius === 0\n ? { kind: 'segment', start, end, canonicalLeafIndex: index }\n : { kind: 'capsule', start, end, radius, canonicalLeafIndex: index }));\n }\n if (leaves.length === 0) {\n const point = points[0]!;\n const area = Math.PI * radius * radius;\n leaves.push(Object.freeze({\n kind: 'circle', center: point, radius, canonicalLeafIndex: 0,\n }));\n return createShapeFromLeaves(\n leaves,\n area,\n point[0]!,\n point[1]!,\n area * radius * radius / 2,\n );\n }\n if (radius > 0) {\n const mass = aggregateLeafMass(leaves);\n return createShapeFromLeaves(\n leaves,\n mass.area,\n mass.centroidX,\n mass.centroidY,\n mass.unitInertia,\n );\n }\n const centroid = lineCentroid(points, closed);\n return createShapeFromLeaves(leaves, 0, centroid[0], centroid[1], 0);\n}\n\nfunction boundsForLeaves(\n leaves: readonly ConvexLeaf2D[],\n pose: InternalPose2D,\n): PibblPhysicsAabb2D {\n const bounds = mutableBoundsForLeaves(leaves, pose);\n return freezeBounds2D(bounds[0]!, bounds[1]!, bounds[2]!, bounds[3]!);\n}\n\nfunction mutableBoundsForLeaves(\n leaves: readonly ConvexLeaf2D[],\n pose: InternalPose2D,\n): Float64Array {\n const result = new Float64Array([\n Number.POSITIVE_INFINITY,\n Number.POSITIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n ]);\n const point = new Float64Array(2);\n const include = (x: number, y: number, radius = 0): void => {\n transformPointInto(point, 0, x, y, pose);\n result[0] = Math.min(result[0]!, point[0]! - radius);\n result[1] = Math.min(result[1]!, point[1]! - radius);\n result[2] = Math.max(result[2]!, point[0]! + radius);\n result[3] = Math.max(result[3]!, point[1]! + radius);\n };\n for (const leaf of leaves) {\n switch (leaf.kind) {\n case 'circle':\n include(leaf.center[0]!, leaf.center[1]!, leaf.radius);\n break;\n case 'ellipse': {\n transformPointInto(point, 0, leaf.center[0]!, leaf.center[1]!, pose);\n const angle = pose.rotationRadians + leaf.rotationRadians;\n const cosine = Math.cos(angle);\n const sine = Math.sin(angle);\n const extentX = Math.hypot(leaf.radiusX * cosine, leaf.radiusY * sine);\n const extentY = Math.hypot(leaf.radiusX * sine, leaf.radiusY * cosine);\n result[0] = Math.min(result[0]!, point[0]! - extentX);\n result[1] = Math.min(result[1]!, point[1]! - extentY);\n result[2] = Math.max(result[2]!, point[0]! + extentX);\n result[3] = Math.max(result[3]!, point[1]! + extentY);\n break;\n }\n case 'box':\n includeBoxCorners(leaf.center, leaf.halfWidth, leaf.halfHeight, pose, result, point);\n break;\n case 'rounded-box':\n includeRoundedBoxBounds(leaf, pose, result, point);\n break;\n case 'capsule':\n include(leaf.start[0]!, leaf.start[1]!, leaf.radius);\n include(leaf.end[0]!, leaf.end[1]!, leaf.radius);\n break;\n case 'segment':\n include(leaf.start[0]!, leaf.start[1]!);\n include(leaf.end[0]!, leaf.end[1]!);\n break;\n case 'polygon':\n for (let offset = 0; offset < leaf.vertices.length; offset += 2) {\n include(leaf.vertices[offset]!, leaf.vertices[offset + 1]!);\n }\n break;\n }\n }\n return result;\n}\n\nfunction includeBoxCorners(\n center: Float64Array,\n halfWidth: number,\n halfHeight: number,\n pose: InternalPose2D,\n bounds: Float64Array,\n point: Float64Array,\n): void {\n for (const xSign of [-1, 1]) {\n for (const ySign of [-1, 1]) {\n transformPointInto(\n point,\n 0,\n center[0]! + xSign * halfWidth,\n center[1]! + ySign * halfHeight,\n pose,\n );\n bounds[0] = Math.min(bounds[0]!, point[0]!);\n bounds[1] = Math.min(bounds[1]!, point[1]!);\n bounds[2] = Math.max(bounds[2]!, point[0]!);\n bounds[3] = Math.max(bounds[3]!, point[1]!);\n }\n }\n}\n\nfunction includeRoundedBoxBounds(\n leaf: Extract<ConvexLeaf2D, { kind: 'rounded-box' }>,\n pose: InternalPose2D,\n bounds: Float64Array,\n point: Float64Array,\n): void {\n const xSigns = [-1, 1, 1, -1] as const;\n const ySigns = [-1, -1, 1, 1] as const;\n for (let index = 0; index < 4; index += 1) {\n const radius = leaf.radii[index]!;\n transformPointInto(\n point,\n 0,\n leaf.center[0]! + xSigns[index]! * (leaf.halfWidth - radius),\n leaf.center[1]! + ySigns[index]! * (leaf.halfHeight - radius),\n pose,\n );\n bounds[0] = Math.min(bounds[0]!, point[0]! - radius);\n bounds[1] = Math.min(bounds[1]!, point[1]! - radius);\n bounds[2] = Math.max(bounds[2]!, point[0]! + radius);\n bounds[3] = Math.max(bounds[3]!, point[1]! + radius);\n }\n}\n\nfunction aggregateLeafMass(leaves: readonly ConvexLeaf2D[]): Readonly<{\n area: number;\n centroidX: number;\n centroidY: number;\n unitInertia: number;\n}> {\n const entries = leaves.map(leafMassData);\n const area = entries.reduce((sum, entry) => sum + entry.area, 0);\n if (area === 0) {\n return Object.freeze({ area: 0, centroidX: 0, centroidY: 0, unitInertia: 0 });\n }\n const centroidX = entries.reduce((sum, entry) => sum + entry.area * entry.centroidX, 0) / area;\n const centroidY = entries.reduce((sum, entry) => sum + entry.area * entry.centroidY, 0) / area;\n const unitInertia = entries.reduce((sum, entry) => {\n const dx = entry.centroidX - centroidX;\n const dy = entry.centroidY - centroidY;\n return sum + entry.unitInertia + entry.area * (dx * dx + dy * dy);\n }, 0);\n return Object.freeze({ area, centroidX, centroidY, unitInertia });\n}\n\nfunction leafMassData(leaf: ConvexLeaf2D): Readonly<{\n area: number;\n centroidX: number;\n centroidY: number;\n unitInertia: number;\n}> {\n switch (leaf.kind) {\n case 'circle': {\n const area = Math.PI * leaf.radius * leaf.radius;\n return { area, centroidX: leaf.center[0]!, centroidY: leaf.center[1]!, unitInertia: area * leaf.radius * leaf.radius / 2 };\n }\n case 'ellipse': {\n const area = Math.PI * leaf.radiusX * leaf.radiusY;\n return { area, centroidX: leaf.center[0]!, centroidY: leaf.center[1]!, unitInertia: area * (leaf.radiusX * leaf.radiusX + leaf.radiusY * leaf.radiusY) / 4 };\n }\n case 'box': {\n const width = leaf.halfWidth * 2;\n const height = leaf.halfHeight * 2;\n const area = width * height;\n return { area, centroidX: leaf.center[0]!, centroidY: leaf.center[1]!, unitInertia: area * (width * width + height * height) / 12 };\n }\n case 'capsule':\n return capsuleMassData(leaf.start, leaf.end, leaf.radius);\n case 'polygon':\n return polygonMassData2D(leaf.vertices);\n case 'segment':\n return { area: 0, centroidX: (leaf.start[0]! + leaf.end[0]!) / 2, centroidY: (leaf.start[1]! + leaf.end[1]!) / 2, unitInertia: 0 };\n case 'rounded-box': {\n const contour = roundedBoxContour(leaf.halfWidth, leaf.halfHeight, leaf.radii, leaf.center);\n return polygonMassData2D(contour);\n }\n }\n}\n\nfunction capsuleMassData(\n start: Float64Array,\n end: Float64Array,\n radius: number,\n): Readonly<{ area: number; centroidX: number; centroidY: number; unitInertia: number }> {\n const dx = end[0]! - start[0]!;\n const dy = end[1]! - start[1]!;\n const length = Math.hypot(dx, dy);\n const rectangleArea = 2 * radius * length;\n const circleArea = Math.PI * radius * radius;\n const area = rectangleArea + circleArea;\n const rectangleInertia = rectangleArea * (length * length + 4 * radius * radius) / 12;\n const capsInertia =\n Math.PI * radius ** 4 / 2 +\n circleArea * length * length / 4 +\n 4 * length * radius ** 3 / 3;\n return Object.freeze({\n area,\n centroidX: (start[0]! + end[0]!) / 2,\n centroidY: (start[1]! + end[1]!) / 2,\n unitInertia: rectangleInertia + capsInertia,\n });\n}\n\nfunction lineCentroid(\n points: readonly Float64Array[],\n closed: boolean,\n): readonly [number, number] {\n const segmentCount = points.length - 1 + (closed ? 1 : 0);\n let totalLength = 0;\n let weightedX = 0;\n let weightedY = 0;\n for (let index = 0; index < segmentCount; index += 1) {\n const start = points[index]!;\n const end = points[(index + 1) % points.length]!;\n const length = Math.hypot(end[0]! - start[0]!, end[1]! - start[1]!);\n totalLength += length;\n weightedX += length * (start[0]! + end[0]!) / 2;\n weightedY += length * (start[1]! + end[1]!) / 2;\n }\n if (totalLength > 0) {\n return [weightedX / totalLength, weightedY / totalLength];\n }\n return [points.reduce((sum, point) => sum + point[0]!, 0) / points.length, points.reduce((sum, point) => sum + point[1]!, 0) / points.length];\n}\n\nfunction roundedBoxContour(\n halfWidth: number,\n halfHeight: number,\n radii: Float64Array,\n center: Float64Array,\n): Float64Array {\n const points: Float64Array[] = [];\n const cornerData = [\n [halfWidth - radii[1]!, -halfHeight + radii[1]!, -Math.PI / 2, 0, radii[1]!],\n [halfWidth - radii[2]!, halfHeight - radii[2]!, 0, Math.PI / 2, radii[2]!],\n [-halfWidth + radii[3]!, halfHeight - radii[3]!, Math.PI / 2, Math.PI, radii[3]!],\n [-halfWidth + radii[0]!, -halfHeight + radii[0]!, Math.PI, 3 * Math.PI / 2, radii[0]!],\n ] as const;\n for (const [x, y, start, end, radius] of cornerData) {\n const cornerPoints = radius === 0\n ? [new Float64Array([center[0]! + x, center[1]! + y])]\n : flattenCircularSweep(center[0]! + x, center[1]! + y, radius, start, end, false);\n points.push(...cornerPoints);\n }\n return canonicalizeContour2D(points.map(asReadonlyVector), {\n strictlyConvex: false,\n path: 'roundedBox.contour',\n });\n}\n\nfunction flattenCircularSweep(\n centerX: number,\n centerY: number,\n radius: number,\n startAngle: number,\n endAngle: number,\n counterclockwise: boolean,\n): Float64Array[] {\n const sweep = directedSweep(startAngle, endAngle, counterclockwise);\n const points = [pointOnCircle(centerX, centerY, radius, startAngle)];\n appendFlattenedArc(points, centerX, centerY, radius, startAngle, startAngle + sweep, 0);\n if (Math.abs(sweep) >= FULL_TURN_RADIANS) {\n points[points.length - 1] = new Float64Array(points[0]!);\n }\n return points;\n}\n\nfunction appendFlattenedArc(\n output: Float64Array[],\n centerX: number,\n centerY: number,\n radius: number,\n startAngle: number,\n endAngle: number,\n depth: number,\n): void {\n const middleAngle = (startAngle + endAngle) / 2;\n const halfSweep = Math.abs(endAngle - startAngle) / 2;\n const chordError = radius * (1 - Math.cos(halfSweep));\n if (\n chordError <= CURVE_FLATTENING_TOLERANCE ||\n depth >= CURVE_FLATTENING_MAX_DEPTH\n ) {\n output.push(pointOnCircle(centerX, centerY, radius, endAngle));\n return;\n }\n appendFlattenedArc(output, centerX, centerY, radius, startAngle, middleAngle, depth + 1);\n appendFlattenedArc(output, centerX, centerY, radius, middleAngle, endAngle, depth + 1);\n}\n\nfunction directedSweep(\n startAngle: number,\n endAngle: number,\n counterclockwise: boolean,\n): number {\n const raw = endAngle - startAngle;\n if (Math.abs(raw) >= FULL_TURN_RADIANS) {\n return counterclockwise ? -FULL_TURN_RADIANS : FULL_TURN_RADIANS;\n }\n if (counterclockwise) {\n const magnitude = ((-raw % FULL_TURN_RADIANS) + FULL_TURN_RADIANS) % FULL_TURN_RADIANS;\n return -magnitude;\n }\n return ((raw % FULL_TURN_RADIANS) + FULL_TURN_RADIANS) % FULL_TURN_RADIANS;\n}\n\nfunction pointOnCircle(\n centerX: number,\n centerY: number,\n radius: number,\n angle: number,\n): Float64Array {\n return new Float64Array([\n centerX + radius * Math.cos(angle),\n centerY + radius * Math.sin(angle),\n ]);\n}\n\nfunction ownedVector(value: PibblPhysicsVector2, path: string): Float64Array {\n const copied = copyFiniteVector2(value, path);\n return new Float64Array(copied);\n}\n\nfunction asReadonlyVector(value: Float64Array): PibblPhysicsVector2 {\n return [value[0]!, value[1]!] as const;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type {\n PibblPhysicsAabb2D,\n PibblPhysicsMassProperties2D,\n PibblPhysicsPose2D,\n PibblPhysicsShape2D,\n PibblPhysicsTransform2D,\n PibblPhysicsVector2,\n} from '../../2d-geometry.js';\nimport {\n copyFiniteVector2,\n requireFiniteNumber,\n requireNonnegativeNumber,\n requirePositiveNumber,\n} from '../shared/validation.js';\nimport {\n CURVE_FLATTENING_MAX_DEPTH,\n CURVE_FLATTENING_TOLERANCE,\n IDENTITY_POSE_2D,\n canonicalizeContour2D,\n cleanZero,\n composePose2D,\n copyPose2D,\n freezeBounds2D,\n polygonMassData2D,\n transformPointInto,\n triangulateContour2D,\n type InternalPose2D,\n} from './math.js';\nimport { DEGREES_TO_RADIANS, GEOMETRY_EPSILON } from './numeric-policy.js';\nimport {\n createShape2D,\n requireShapeRecord2D,\n type CapsuleLeaf2D,\n type ConvexLeaf2D,\n type PolygonLeaf2D,\n} from './shape-records.js';\n\nconst FULL_TURN_RADIANS = Math.PI * 2;\n\n/**\n * Creates an immutable circle collision shape without initializing a physics world.\n *\n * @param input - Circle radius and optional center. See {@link PibblPhysicsVector2}.\n * @returns An immutable circle collision shape. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShape2D}\n */\nexport function circleShape2D(\n input: Readonly<{ radius: number; center?: PibblPhysicsVector2 }>,\n): PibblPhysicsShape2D {\n const radius = requirePositiveNumber(input.radius, 'circle.radius');\n const center = ownedVector(input.center ?? [0, 0], 'circle.center');\n const area = Math.PI * radius * radius;\n return createShapeFromLeaves(\n [Object.freeze({ kind: 'circle', center, radius, canonicalLeafIndex: 0 })],\n area,\n center[0]!,\n center[1]!,\n area * radius * radius / 2,\n );\n}\n\n/**\n * Creates an immutable ellipse collision shape without initializing a physics world.\n *\n * @param input - Ellipse radii, optional center, and rotation in degrees. See\n * {@link PibblPhysicsVector2} .\n * @returns An immutable ellipse collision shape. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShape2D}\n */\nexport function ellipseShape2D(\n input: Readonly<{\n radiusX: number;\n radiusY: number;\n center?: PibblPhysicsVector2;\n rotationDegrees?: number;\n }>,\n): PibblPhysicsShape2D {\n const radiusX = requirePositiveNumber(input.radiusX, 'ellipse.radiusX');\n const radiusY = requirePositiveNumber(input.radiusY, 'ellipse.radiusY');\n const center = ownedVector(input.center ?? [0, 0], 'ellipse.center');\n const rotationRadians =\n requireFiniteNumber(input.rotationDegrees ?? 0, 'ellipse.rotationDegrees') *\n DEGREES_TO_RADIANS;\n const area = Math.PI * radiusX * radiusY;\n return createShapeFromLeaves(\n [Object.freeze({ kind: 'ellipse', center, radiusX, radiusY, rotationRadians, canonicalLeafIndex: 0 })],\n area,\n center[0]!,\n center[1]!,\n area * (radiusX * radiusX + radiusY * radiusY) / 4,\n );\n}\n\n/**\n * Creates an immutable box collision shape without initializing a physics world.\n *\n * @param input - Box width, height, and optional center. See {@link PibblPhysicsVector2}.\n * @returns An immutable box collision shape. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShape2D}\n */\nexport function boxShape2D(\n input: Readonly<{\n width: number;\n height: number;\n center?: PibblPhysicsVector2;\n }>,\n): PibblPhysicsShape2D {\n const width = requirePositiveNumber(input.width, 'box.width');\n const height = requirePositiveNumber(input.height, 'box.height');\n const center = ownedVector(input.center ?? [0, 0], 'box.center');\n const area = width * height;\n return createShapeFromLeaves(\n [Object.freeze({ kind: 'box', center, halfWidth: width / 2, halfHeight: height / 2, canonicalLeafIndex: 0 })],\n area,\n center[0]!,\n center[1]!,\n area * (width * width + height * height) / 12,\n );\n}\n\n/**\n * Creates an immutable rounded box collision shape without initializing a physics world.\n *\n * @param input - Box dimensions, center, and uniform or per-corner radii. See\n * {@link PibblPhysicsVector2} .\n * @returns An immutable rounded-box collision shape. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShape2D}\n */\nexport function roundedBoxShape2D(\n input: Readonly<{\n width: number;\n height: number;\n radius:\n | number\n | readonly [\n topLeft: number,\n topRight: number,\n bottomRight: number,\n bottomLeft: number,\n ];\n center?: PibblPhysicsVector2;\n }>,\n): PibblPhysicsShape2D {\n const width = requirePositiveNumber(input.width, 'roundedBox.width');\n const height = requirePositiveNumber(input.height, 'roundedBox.height');\n const center = ownedVector(input.center ?? [0, 0], 'roundedBox.center');\n const sourceRadii = typeof input.radius === 'number'\n ? [input.radius, input.radius, input.radius, input.radius] as const\n : input.radius;\n const radii = new Float64Array(4);\n const maximum = Math.min(width, height) / 2;\n for (let index = 0; index < radii.length; index += 1) {\n const radius = requireNonnegativeNumber(\n sourceRadii[index]!,\n `roundedBox.radius[${index}]`,\n );\n if (radius > maximum) {\n throw new RangeError(\n `roundedBox.radius[${index}] must not exceed ${String(maximum)}; received ${String(radius)}.`,\n );\n }\n radii[index] = radius;\n }\n const contour = roundedBoxContour(width / 2, height / 2, radii, center);\n const mass = polygonMassData2D(contour);\n return createShapeFromLeaves(\n [Object.freeze({\n kind: 'rounded-box',\n center,\n halfWidth: width / 2,\n halfHeight: height / 2,\n radii,\n canonicalLeafIndex: 0,\n })],\n mass.area,\n mass.centroidX,\n mass.centroidY,\n mass.unitInertia,\n );\n}\n\n/**\n * Creates an immutable capsule collision shape without initializing a physics world.\n *\n * @param input - Capsule centerline endpoints and radius. See {@link PibblPhysicsVector2}.\n * @returns An immutable capsule collision shape. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShape2D}\n */\nexport function capsuleShape2D(\n input: Readonly<{\n start: PibblPhysicsVector2;\n end: PibblPhysicsVector2;\n radius: number;\n }>,\n): PibblPhysicsShape2D {\n const start = ownedVector(input.start, 'capsule.start');\n const end = ownedVector(input.end, 'capsule.end');\n const radius = requirePositiveNumber(input.radius, 'capsule.radius');\n const leaf: CapsuleLeaf2D = Object.freeze({\n kind: 'capsule', start, end, radius, canonicalLeafIndex: 0,\n });\n const mass = capsuleMassData(start, end, radius);\n return createShapeFromLeaves(\n [leaf],\n mass.area,\n mass.centroidX,\n mass.centroidY,\n mass.unitInertia,\n );\n}\n\n/**\n * Creates an immutable arc collision shape without initializing a physics world.\n *\n * @param input - Arc center, radius, angular endpoints in radians, sweep direction, and thickness.\n * See {@link PibblPhysicsVector2} .\n * @returns An immutable thick-arc collision shape. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShape2D}\n */\nexport function arcShape2D(\n input: Readonly<{\n center?: PibblPhysicsVector2;\n radius: number;\n startAngleRadians: number;\n endAngleRadians: number;\n counterclockwise?: boolean;\n thickness: number;\n }>,\n): PibblPhysicsShape2D {\n const center = ownedVector(input.center ?? [0, 0], 'arc.center');\n const radius = requirePositiveNumber(input.radius, 'arc.radius');\n const startAngle = requireFiniteNumber(input.startAngleRadians, 'arc.startAngleRadians');\n const endAngle = requireFiniteNumber(input.endAngleRadians, 'arc.endAngleRadians');\n const thickness = requirePositiveNumber(input.thickness, 'arc.thickness');\n const points = flattenCircularSweep(\n center[0]!, center[1]!, radius, startAngle, endAngle, input.counterclockwise === true,\n );\n return chainFromOwnedPoints(points, false, thickness / 2);\n}\n\n/**\n * Creates an immutable wedge collision shape without initializing a physics world.\n *\n * @param input - Wedge center, radius, angular endpoints in radians, and sweep direction. See\n * {@link PibblPhysicsVector2} .\n * @returns An immutable wedge collision shape. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShape2D}\n */\nexport function wedgeShape2D(\n input: Readonly<{\n center?: PibblPhysicsVector2;\n radius: number;\n startAngleRadians: number;\n endAngleRadians: number;\n counterclockwise?: boolean;\n }>,\n): PibblPhysicsShape2D {\n const center = ownedVector(input.center ?? [0, 0], 'wedge.center');\n const radius = requirePositiveNumber(input.radius, 'wedge.radius');\n const startAngle = requireFiniteNumber(input.startAngleRadians, 'wedge.startAngleRadians');\n const endAngle = requireFiniteNumber(input.endAngleRadians, 'wedge.endAngleRadians');\n const points = flattenCircularSweep(\n center[0]!, center[1]!, radius, startAngle, endAngle, input.counterclockwise === true,\n );\n const sweep = directedSweep(startAngle, endAngle, input.counterclockwise === true);\n if (Math.abs(sweep) <= GEOMETRY_EPSILON) {\n throw new RangeError('wedge angles must describe a nonzero sweep.');\n }\n const contourSource: PibblPhysicsVector2[] = Math.abs(sweep) >= FULL_TURN_RADIANS\n ? points.slice(0, -1).map(asReadonlyVector)\n : [asReadonlyVector(center), ...points.map(asReadonlyVector)];\n const contour = canonicalizeContour2D(contourSource, {\n strictlyConvex: false,\n path: 'wedge.contour',\n });\n const triangles = triangulateContour2D(contour);\n const leaves = triangles.map<PolygonLeaf2D>((vertices, canonicalLeafIndex) =>\n Object.freeze({ kind: 'polygon', vertices, canonicalLeafIndex }),\n );\n const mass = aggregateLeafMass(leaves);\n return createShapeFromLeaves(\n leaves,\n mass.area,\n mass.centroidX,\n mass.centroidY,\n mass.unitInertia,\n );\n}\n\n/**\n * Creates an immutable segment collision shape without initializing a physics world.\n *\n * @param input - Segment endpoints. See {@link PibblPhysicsVector2}.\n * @returns An immutable line-segment collision shape. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShape2D}\n */\nexport function segmentShape2D(\n input: Readonly<{ start: PibblPhysicsVector2; end: PibblPhysicsVector2 }>,\n): PibblPhysicsShape2D {\n const start = ownedVector(input.start, 'segment.start');\n const end = ownedVector(input.end, 'segment.end');\n return createShapeFromLeaves(\n [Object.freeze({ kind: 'segment', start, end, canonicalLeafIndex: 0 })],\n 0,\n (start[0]! + end[0]!) / 2,\n (start[1]! + end[1]!) / 2,\n 0,\n );\n}\n\n/**\n * Creates an immutable chain collision shape without initializing a physics world.\n *\n * @param input - Ordered chain points, closure policy, and optional radius. See\n * {@link PibblPhysicsVector2} .\n * @returns An immutable chain collision shape. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShape2D}\n */\nexport function chainShape2D(\n input: Readonly<{\n points: readonly PibblPhysicsVector2[];\n closed?: boolean;\n radius?: number;\n }>,\n): PibblPhysicsShape2D {\n if (input.points.length < 2) {\n throw new RangeError('chain.points must contain at least two points.');\n }\n const points = input.points.map((point, index) =>\n ownedVector(point, `chain.points[${index}]`),\n );\n const radius = requireNonnegativeNumber(input.radius ?? 0, 'chain.radius');\n return chainFromOwnedPoints(points, input.closed === true, radius);\n}\n\n/**\n * Creates an immutable polygon collision shape without initializing a physics world.\n *\n * @param input - Ordered polygon vertices. See {@link PibblPhysicsVector2}.\n * @returns An immutable polygon collision shape. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShape2D}\n */\nexport function polygonShape2D(\n input: Readonly<{ points: readonly PibblPhysicsVector2[] }>,\n): PibblPhysicsShape2D {\n const vertices = canonicalizeContour2D(input.points, {\n strictlyConvex: true,\n path: 'polygon.points',\n });\n const mass = polygonMassData2D(vertices);\n return createShapeFromLeaves(\n [Object.freeze({ kind: 'polygon', vertices, canonicalLeafIndex: 0 })],\n mass.area,\n mass.centroidX,\n mass.centroidY,\n mass.unitInertia,\n );\n}\n\n/**\n * Computes axis-aligned bounds for an immutable shape at an optional pose.\n *\n * @param shape - Shape whose bounds are needed. See {@link PibblPhysicsShape2D}.\n * @param pose - Optional pose at which to evaluate the shape. See {@link PibblPhysicsPose2D}.\n * @returns Axis-aligned bounds of the posed shape. See {@link PibblPhysicsAabb2D}.\n *\n * @see {@link PibblPhysicsShape2D}\n * @see {@link PibblPhysicsPose2D}\n * @see {@link PibblPhysicsAabb2D}\n */\nexport function boundsOfShape2D(\n shape: PibblPhysicsShape2D,\n pose?: PibblPhysicsPose2D,\n): PibblPhysicsAabb2D {\n const record = requireShapeRecord2D(shape);\n const outerPose = copyPose2D(pose, 'pose');\n return boundsForLeaves(record.leaves, composePose2D(outerPose, record.localPose));\n}\n\n/**\n * Computes shape area, centroid, mass, and rotational inertia at the requested density.\n *\n * @param shape - Shape whose mass properties are needed. See {@link PibblPhysicsShape2D}.\n * @param options - Optional material density.\n * @returns Mass, center of mass, and inertia for the shape. See {@link PibblPhysicsMassProperties2D}\n * .\n *\n * @see {@link PibblPhysicsShape2D}\n * @see {@link PibblPhysicsMassProperties2D}\n */\nexport function massProperties2D(\n shape: PibblPhysicsShape2D,\n options?: Readonly<{ density?: number }>,\n): PibblPhysicsMassProperties2D {\n const record = requireShapeRecord2D(shape);\n const density = requirePositiveNumber(options?.density ?? 1, 'options.density');\n const transformedCentroid = new Float64Array(2);\n transformPointInto(\n transformedCentroid,\n 0,\n record.centroidX,\n record.centroidY,\n record.localPose,\n );\n return Object.freeze({\n area: cleanZero(record.area),\n centroid: Object.freeze([\n cleanZero(transformedCentroid[0]!),\n cleanZero(transformedCentroid[1]!),\n ] as const),\n mass: cleanZero(record.area * density),\n rotationalInertia: cleanZero(record.unitInertia * density),\n });\n}\n\n/**\n * Returns independent shape geometry transformed by a rigid 2D pose.\n *\n * @param shape - Source shape; it is not modified. See {@link PibblPhysicsShape2D}.\n * @param transform - Transform to apply to the shape. See {@link PibblPhysicsTransform2D}.\n * @returns A shape containing the transformed geometry. See {@link PibblPhysicsShape2D}.\n *\n * @see {@link PibblPhysicsShape2D}\n * @see {@link PibblPhysicsTransform2D}\n */\nexport function transformShape2D(\n shape: PibblPhysicsShape2D,\n transform: PibblPhysicsTransform2D,\n): PibblPhysicsShape2D {\n const source = requireShapeRecord2D(shape);\n const localPose = composePose2D(copyPose2D(transform, 'transform'), source.localPose);\n const localBounds = mutableBoundsForLeaves(source.leaves, localPose);\n return createShape2D({\n leaves: source.leaves,\n localPose,\n localBounds,\n area: source.area,\n centroidX: source.centroidX,\n centroidY: source.centroidY,\n unitInertia: source.unitInertia,\n });\n}\n\nfunction createShapeFromLeaves(\n leaves: readonly ConvexLeaf2D[],\n area: number,\n centroidX: number,\n centroidY: number,\n unitInertia: number,\n): PibblPhysicsShape2D {\n return createShape2D({\n leaves,\n localBounds: mutableBoundsForLeaves(leaves, IDENTITY_POSE_2D),\n area,\n centroidX,\n centroidY,\n unitInertia: Math.max(0, unitInertia),\n });\n}\n\nfunction chainFromOwnedPoints(\n points: readonly Float64Array[],\n closed: boolean,\n radius: number,\n): PibblPhysicsShape2D {\n const segmentCount = points.length === 1 ? 0 : points.length - 1 + (closed ? 1 : 0);\n const leaves: ConvexLeaf2D[] = [];\n for (let index = 0; index < segmentCount; index += 1) {\n const start = points[index]!;\n const end = points[(index + 1) % points.length]!;\n leaves.push(Object.freeze(radius === 0\n ? { kind: 'segment', start, end, canonicalLeafIndex: index }\n : { kind: 'capsule', start, end, radius, canonicalLeafIndex: index }));\n }\n if (leaves.length === 0) {\n const point = points[0]!;\n const area = Math.PI * radius * radius;\n leaves.push(Object.freeze({\n kind: 'circle', center: point, radius, canonicalLeafIndex: 0,\n }));\n return createShapeFromLeaves(\n leaves,\n area,\n point[0]!,\n point[1]!,\n area * radius * radius / 2,\n );\n }\n if (radius > 0) {\n const mass = aggregateLeafMass(leaves);\n return createShapeFromLeaves(\n leaves,\n mass.area,\n mass.centroidX,\n mass.centroidY,\n mass.unitInertia,\n );\n }\n const centroid = lineCentroid(points, closed);\n return createShapeFromLeaves(leaves, 0, centroid[0], centroid[1], 0);\n}\n\nfunction boundsForLeaves(\n leaves: readonly ConvexLeaf2D[],\n pose: InternalPose2D,\n): PibblPhysicsAabb2D {\n const bounds = mutableBoundsForLeaves(leaves, pose);\n return freezeBounds2D(bounds[0]!, bounds[1]!, bounds[2]!, bounds[3]!);\n}\n\nfunction mutableBoundsForLeaves(\n leaves: readonly ConvexLeaf2D[],\n pose: InternalPose2D,\n): Float64Array {\n const result = new Float64Array([\n Number.POSITIVE_INFINITY,\n Number.POSITIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n Number.NEGATIVE_INFINITY,\n ]);\n const point = new Float64Array(2);\n const include = (x: number, y: number, radius = 0): void => {\n transformPointInto(point, 0, x, y, pose);\n result[0] = Math.min(result[0]!, point[0]! - radius);\n result[1] = Math.min(result[1]!, point[1]! - radius);\n result[2] = Math.max(result[2]!, point[0]! + radius);\n result[3] = Math.max(result[3]!, point[1]! + radius);\n };\n for (const leaf of leaves) {\n switch (leaf.kind) {\n case 'circle':\n include(leaf.center[0]!, leaf.center[1]!, leaf.radius);\n break;\n case 'ellipse': {\n transformPointInto(point, 0, leaf.center[0]!, leaf.center[1]!, pose);\n const angle = pose.rotationRadians + leaf.rotationRadians;\n const cosine = Math.cos(angle);\n const sine = Math.sin(angle);\n const extentX = Math.hypot(leaf.radiusX * cosine, leaf.radiusY * sine);\n const extentY = Math.hypot(leaf.radiusX * sine, leaf.radiusY * cosine);\n result[0] = Math.min(result[0]!, point[0]! - extentX);\n result[1] = Math.min(result[1]!, point[1]! - extentY);\n result[2] = Math.max(result[2]!, point[0]! + extentX);\n result[3] = Math.max(result[3]!, point[1]! + extentY);\n break;\n }\n case 'box':\n includeBoxCorners(leaf.center, leaf.halfWidth, leaf.halfHeight, pose, result, point);\n break;\n case 'rounded-box':\n includeRoundedBoxBounds(leaf, pose, result, point);\n break;\n case 'capsule':\n include(leaf.start[0]!, leaf.start[1]!, leaf.radius);\n include(leaf.end[0]!, leaf.end[1]!, leaf.radius);\n break;\n case 'segment':\n include(leaf.start[0]!, leaf.start[1]!);\n include(leaf.end[0]!, leaf.end[1]!);\n break;\n case 'polygon':\n for (let offset = 0; offset < leaf.vertices.length; offset += 2) {\n include(leaf.vertices[offset]!, leaf.vertices[offset + 1]!);\n }\n break;\n }\n }\n return result;\n}\n\nfunction includeBoxCorners(\n center: Float64Array,\n halfWidth: number,\n halfHeight: number,\n pose: InternalPose2D,\n bounds: Float64Array,\n point: Float64Array,\n): void {\n for (let xSign = -1; xSign <= 1; xSign += 2) {\n for (let ySign = -1; ySign <= 1; ySign += 2) {\n transformPointInto(\n point,\n 0,\n center[0]! + xSign * halfWidth,\n center[1]! + ySign * halfHeight,\n pose,\n );\n bounds[0] = Math.min(bounds[0]!, point[0]!);\n bounds[1] = Math.min(bounds[1]!, point[1]!);\n bounds[2] = Math.max(bounds[2]!, point[0]!);\n bounds[3] = Math.max(bounds[3]!, point[1]!);\n }\n }\n}\n\nfunction includeRoundedBoxBounds(\n leaf: Extract<ConvexLeaf2D, { kind: 'rounded-box' }>,\n pose: InternalPose2D,\n bounds: Float64Array,\n point: Float64Array,\n): void {\n const xSigns = [-1, 1, 1, -1] as const;\n const ySigns = [-1, -1, 1, 1] as const;\n for (let index = 0; index < 4; index += 1) {\n const radius = leaf.radii[index]!;\n transformPointInto(\n point,\n 0,\n leaf.center[0]! + xSigns[index]! * (leaf.halfWidth - radius),\n leaf.center[1]! + ySigns[index]! * (leaf.halfHeight - radius),\n pose,\n );\n bounds[0] = Math.min(bounds[0]!, point[0]! - radius);\n bounds[1] = Math.min(bounds[1]!, point[1]! - radius);\n bounds[2] = Math.max(bounds[2]!, point[0]! + radius);\n bounds[3] = Math.max(bounds[3]!, point[1]! + radius);\n }\n}\n\nfunction aggregateLeafMass(leaves: readonly ConvexLeaf2D[]): Readonly<{\n area: number;\n centroidX: number;\n centroidY: number;\n unitInertia: number;\n}> {\n const entries = leaves.map(leafMassData);\n const area = entries.reduce((sum, entry) => sum + entry.area, 0);\n if (area === 0) {\n return Object.freeze({ area: 0, centroidX: 0, centroidY: 0, unitInertia: 0 });\n }\n const centroidX = entries.reduce((sum, entry) => sum + entry.area * entry.centroidX, 0) / area;\n const centroidY = entries.reduce((sum, entry) => sum + entry.area * entry.centroidY, 0) / area;\n const unitInertia = entries.reduce((sum, entry) => {\n const dx = entry.centroidX - centroidX;\n const dy = entry.centroidY - centroidY;\n return sum + entry.unitInertia + entry.area * (dx * dx + dy * dy);\n }, 0);\n return Object.freeze({ area, centroidX, centroidY, unitInertia });\n}\n\nfunction leafMassData(leaf: ConvexLeaf2D): Readonly<{\n area: number;\n centroidX: number;\n centroidY: number;\n unitInertia: number;\n}> {\n switch (leaf.kind) {\n case 'circle': {\n const area = Math.PI * leaf.radius * leaf.radius;\n return { area, centroidX: leaf.center[0]!, centroidY: leaf.center[1]!, unitInertia: area * leaf.radius * leaf.radius / 2 };\n }\n case 'ellipse': {\n const area = Math.PI * leaf.radiusX * leaf.radiusY;\n return { area, centroidX: leaf.center[0]!, centroidY: leaf.center[1]!, unitInertia: area * (leaf.radiusX * leaf.radiusX + leaf.radiusY * leaf.radiusY) / 4 };\n }\n case 'box': {\n const width = leaf.halfWidth * 2;\n const height = leaf.halfHeight * 2;\n const area = width * height;\n return { area, centroidX: leaf.center[0]!, centroidY: leaf.center[1]!, unitInertia: area * (width * width + height * height) / 12 };\n }\n case 'capsule':\n return capsuleMassData(leaf.start, leaf.end, leaf.radius);\n case 'polygon':\n return polygonMassData2D(leaf.vertices);\n case 'segment':\n return { area: 0, centroidX: (leaf.start[0]! + leaf.end[0]!) / 2, centroidY: (leaf.start[1]! + leaf.end[1]!) / 2, unitInertia: 0 };\n case 'rounded-box': {\n const contour = roundedBoxContour(leaf.halfWidth, leaf.halfHeight, leaf.radii, leaf.center);\n return polygonMassData2D(contour);\n }\n }\n}\n\nfunction capsuleMassData(\n start: Float64Array,\n end: Float64Array,\n radius: number,\n): Readonly<{ area: number; centroidX: number; centroidY: number; unitInertia: number }> {\n const dx = end[0]! - start[0]!;\n const dy = end[1]! - start[1]!;\n const length = Math.hypot(dx, dy);\n const rectangleArea = 2 * radius * length;\n const circleArea = Math.PI * radius * radius;\n const area = rectangleArea + circleArea;\n const rectangleInertia = rectangleArea * (length * length + 4 * radius * radius) / 12;\n const capsInertia =\n Math.PI * radius ** 4 / 2 +\n circleArea * length * length / 4 +\n 4 * length * radius ** 3 / 3;\n return Object.freeze({\n area,\n centroidX: (start[0]! + end[0]!) / 2,\n centroidY: (start[1]! + end[1]!) / 2,\n unitInertia: rectangleInertia + capsInertia,\n });\n}\n\nfunction lineCentroid(\n points: readonly Float64Array[],\n closed: boolean,\n): readonly [number, number] {\n const segmentCount = points.length - 1 + (closed ? 1 : 0);\n let totalLength = 0;\n let weightedX = 0;\n let weightedY = 0;\n for (let index = 0; index < segmentCount; index += 1) {\n const start = points[index]!;\n const end = points[(index + 1) % points.length]!;\n const length = Math.hypot(end[0]! - start[0]!, end[1]! - start[1]!);\n totalLength += length;\n weightedX += length * (start[0]! + end[0]!) / 2;\n weightedY += length * (start[1]! + end[1]!) / 2;\n }\n if (totalLength > 0) {\n return [weightedX / totalLength, weightedY / totalLength];\n }\n return [points.reduce((sum, point) => sum + point[0]!, 0) / points.length, points.reduce((sum, point) => sum + point[1]!, 0) / points.length];\n}\n\nfunction roundedBoxContour(\n halfWidth: number,\n halfHeight: number,\n radii: Float64Array,\n center: Float64Array,\n): Float64Array {\n const points: Float64Array[] = [];\n for (let corner = 0; corner < 4; corner++) {\n const radius = radii[(corner + 1) % 4]!;\n const x = corner < 2 ? halfWidth - radius : -halfWidth + radius;\n const y = corner === 0 || corner === 3 ? -halfHeight + radius : halfHeight - radius;\n const start = (corner - 1) * Math.PI / 2;\n const end = corner * Math.PI / 2;\n const cornerPoints = radius === 0\n ? [new Float64Array([center[0]! + x, center[1]! + y])]\n : flattenCircularSweep(center[0]! + x, center[1]! + y, radius, start, end, false);\n points.push(...cornerPoints);\n }\n return canonicalizeContour2D(points.map(asReadonlyVector), {\n strictlyConvex: false,\n path: 'roundedBox.contour',\n });\n}\n\nfunction flattenCircularSweep(\n centerX: number,\n centerY: number,\n radius: number,\n startAngle: number,\n endAngle: number,\n counterclockwise: boolean,\n): Float64Array[] {\n const sweep = directedSweep(startAngle, endAngle, counterclockwise);\n const points = [pointOnCircle(centerX, centerY, radius, startAngle)];\n appendFlattenedArc(points, centerX, centerY, radius, startAngle, startAngle + sweep, 0);\n if (Math.abs(sweep) >= FULL_TURN_RADIANS) {\n points[points.length - 1] = new Float64Array(points[0]!);\n }\n return points;\n}\n\nfunction appendFlattenedArc(\n output: Float64Array[],\n centerX: number,\n centerY: number,\n radius: number,\n startAngle: number,\n endAngle: number,\n depth: number,\n): void {\n const middleAngle = (startAngle + endAngle) / 2;\n const halfSweep = Math.abs(endAngle - startAngle) / 2;\n const chordError = radius * (1 - Math.cos(halfSweep));\n if (\n chordError <= CURVE_FLATTENING_TOLERANCE ||\n depth >= CURVE_FLATTENING_MAX_DEPTH\n ) {\n output.push(pointOnCircle(centerX, centerY, radius, endAngle));\n return;\n }\n appendFlattenedArc(output, centerX, centerY, radius, startAngle, middleAngle, depth + 1);\n appendFlattenedArc(output, centerX, centerY, radius, middleAngle, endAngle, depth + 1);\n}\n\nfunction directedSweep(\n startAngle: number,\n endAngle: number,\n counterclockwise: boolean,\n): number {\n const raw = endAngle - startAngle;\n if (Math.abs(raw) >= FULL_TURN_RADIANS) {\n return counterclockwise ? -FULL_TURN_RADIANS : FULL_TURN_RADIANS;\n }\n if (counterclockwise) {\n const magnitude = ((-raw % FULL_TURN_RADIANS) + FULL_TURN_RADIANS) % FULL_TURN_RADIANS;\n return -magnitude;\n }\n return ((raw % FULL_TURN_RADIANS) + FULL_TURN_RADIANS) % FULL_TURN_RADIANS;\n}\n\nfunction pointOnCircle(\n centerX: number,\n centerY: number,\n radius: number,\n angle: number,\n): Float64Array {\n return new Float64Array([\n centerX + radius * Math.cos(angle),\n centerY + radius * Math.sin(angle),\n ]);\n}\n\nfunction ownedVector(value: PibblPhysicsVector2, path: string): Float64Array {\n const copied = copyFiniteVector2(value, path);\n return new Float64Array(copied);\n}\n\nfunction asReadonlyVector(value: Float64Array): PibblPhysicsVector2 {\n return [value[0]!, value[1]!] as const;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -137,15 +137,12 @@ class RapierSimulation2D {
|
|
|
137
137
|
const body = this.world.getRigidBody(binding.handle);
|
|
138
138
|
const position = body.translation();
|
|
139
139
|
const velocity = body.linvel();
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
body.angvel()
|
|
147
|
-
])
|
|
148
|
-
validateEngineNumber(value);
|
|
140
|
+
validateEngineNumber(position.x);
|
|
141
|
+
validateEngineNumber(position.y);
|
|
142
|
+
validateEngineNumber(velocity.x);
|
|
143
|
+
validateEngineNumber(velocity.y);
|
|
144
|
+
validateEngineNumber(body.rotation());
|
|
145
|
+
validateEngineNumber(body.angvel());
|
|
149
146
|
const target = kinematicTargets.get(index);
|
|
150
147
|
bodies.positionX[index] = target?.x ?? logicalValue(position.x, bodies.positionX[index]);
|
|
151
148
|
bodies.positionY[index] = target?.y ?? logicalValue(position.y, bodies.positionY[index]);
|
|
@@ -326,21 +323,18 @@ class RapierSimulation2D {
|
|
|
326
323
|
const generation = bodies.generations[index];
|
|
327
324
|
if (!bodies.has(index, generation)) continue;
|
|
328
325
|
const flags = bodies.flags[index];
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
bodies.angularDamping[index]
|
|
342
|
-
])
|
|
343
|
-
validateEngineNumber(value);
|
|
326
|
+
validateEngineNumber(bodies.positionX[index] / SCALE);
|
|
327
|
+
validateEngineNumber(bodies.positionY[index] / SCALE);
|
|
328
|
+
validateEngineNumber(bodies.linearVelocityX[index] / SCALE);
|
|
329
|
+
validateEngineNumber(bodies.linearVelocityY[index] / SCALE);
|
|
330
|
+
validateEngineNumber(bodies.rotationRadians[index]);
|
|
331
|
+
validateEngineNumber(bodies.angularVelocity[index]);
|
|
332
|
+
validateEngineNumber(bodies.forceX[index] / SCALE);
|
|
333
|
+
validateEngineNumber(bodies.forceY[index] / SCALE);
|
|
334
|
+
validateEngineNumber(bodies.torque[index] / (SCALE * SCALE));
|
|
335
|
+
validateEngineNumber(bodies.gravityScale[index]);
|
|
336
|
+
validateEngineNumber(bodies.linearDamping[index]);
|
|
337
|
+
validateEngineNumber(bodies.angularDamping[index]);
|
|
344
338
|
if (bodies.inverseMass[index] > 0)
|
|
345
339
|
validateEngineNumber(1 / bodies.inverseMass[index]);
|
|
346
340
|
if (bodies.inverseInertia[index] > 0)
|
|
@@ -533,8 +527,10 @@ function leafDescriptor(leaf, shape, centerX, centerY) {
|
|
|
533
527
|
else if (typeof value === "number")
|
|
534
528
|
validateEngineNumber(key === "rotationRadians" ? value : value / SCALE);
|
|
535
529
|
}
|
|
536
|
-
|
|
537
|
-
|
|
530
|
+
validateEngineNumber(shape.localPose.x / SCALE);
|
|
531
|
+
validateEngineNumber(shape.localPose.y / SCALE);
|
|
532
|
+
validateEngineNumber(centerX / SCALE);
|
|
533
|
+
validateEngineNumber(centerY / SCALE);
|
|
538
534
|
let desc;
|
|
539
535
|
let x = 0, y = 0, angle = 0;
|
|
540
536
|
if (leaf.kind === "circle") {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/features/physics/lib/2d/world/rapier.ts"],
|
|
4
|
-
"sourcesContent": ["import RAPIER from \"./rapier-engine.js\";\nimport type { BodyStore2D, ColliderStore2D } from \"./storage.js\";\nimport type { ShapeRecord2D, ConvexLeaf2D } from \"../shape-records.js\";\nimport type { PrivateManifold2D } from \"../collision/manifold.js\";\nimport { BODY_CCD_2D, collisionFiltersAllow2D } from \"./ccd.js\";\nimport {\n BODY_TYPE_DYNAMIC_2D,\n BODY_TYPE_KINEMATIC_2D,\n BODY_FIXED_ROTATION_2D,\n} from \"./integrator.js\";\nimport { BODY_SLEEPING_2D, BODY_SLEEP_DISABLED_2D } from \"./solver.js\";\nimport {\n COLLIDER_SENSOR_2D,\n type SortedColliderPairs2D,\n} from \"./contact-cache.js\";\n\n// The compat build embeds WASM; initialization neither starts a clock nor fetches\n// an external URL. Importers finish loading before any world can be mounted.\nawait RAPIER.init();\nconst SCALE = 100;\nlet ownedWorlds = 0;\nexport function liveRapierWorldsForTest(): number {\n return ownedWorlds;\n}\n\ninterface BodyBinding {\n handle: number;\n generation: number;\n configuration?: string;\n staticPose?: readonly [number, number, number];\n}\ninterface ColliderBinding {\n handles: number[];\n generation: number;\n shape: ShapeRecord2D;\n body: number;\n centerX: number;\n centerY: number;\n feature: number;\n}\nexport interface RapierCheckpoint2D {\n bytes: Uint8Array;\n bodies: Map<number, BodyBinding>;\n colliders: Map<number, ColliderBinding>;\n}\n\n/** Private engine bridge. Pibbl retains identity, transactions, commands and time. */\nexport class RapierSimulation2D {\n private world = new RAPIER.World({ x: 0, y: 0 });\n private disposed = false;\n private bodyBindings = new Map<number, BodyBinding>();\n private colliderBindings = new Map<number, ColliderBinding>();\n private colliderIndices = new Map<number, number>();\n private impulses = new Map<string, number[]>();\n private impacts = new Map<\n string,\n {\n first: number;\n second: number;\n manifold: PrivateManifold2D;\n impulses: number[];\n }\n >();\n\n constructor() {\n this.world.lengthUnit = 1;\n ownedWorlds++;\n }\n\n checkpoint(): RapierCheckpoint2D {\n return {\n bytes: this.world.takeSnapshot(),\n bodies: new Map(this.bodyBindings),\n colliders: new Map(this.colliderBindings),\n };\n }\n\n restore(checkpoint: RapierCheckpoint2D): void {\n const restored = RAPIER.World.restoreSnapshot(checkpoint.bytes);\n this.world.free();\n this.world = restored;\n this.bodyBindings = new Map(checkpoint.bodies);\n this.colliderBindings = new Map(checkpoint.colliders);\n this.rebuildColliderIndices();\n this.impulses.clear();\n this.impacts.clear();\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.world.free();\n ownedWorlds--;\n this.bodyBindings.clear();\n this.colliderBindings.clear();\n this.colliderIndices.clear();\n this.impulses.clear();\n this.impacts.clear();\n }\n\n step(\n bodies: BodyStore2D,\n colliders: ColliderStore2D,\n dt: number,\n gravityX: number,\n gravityY: number,\n sleeping: boolean,\n velocityIterations = 4,\n positionIterations = 1,\n ): void {\n validateEngineNumber(gravityX / SCALE);\n validateEngineNumber(gravityY / SCALE);\n this.synchronize(bodies, colliders, sleeping);\n const kinematicTargets = new Map<\n number,\n { x: number; y: number; angle: number }\n >();\n for (const [index, binding] of this.bodyBindings) {\n const body = this.world.getRigidBody(binding.handle);\n if (bodies.flags[index]! & BODY_TYPE_KINEMATIC_2D) {\n const target = {\n x: bodies.positionX[index]! + bodies.linearVelocityX[index]! * dt,\n y: bodies.positionY[index]! + bodies.linearVelocityY[index]! * dt,\n angle:\n bodies.rotationRadians[index]! +\n bodies.angularVelocity[index]! * dt,\n };\n body.setNextKinematicTranslation({\n x: target.x / SCALE,\n y: target.y / SCALE,\n });\n body.setNextKinematicRotation(target.angle);\n kinematicTargets.set(index, target);\n } else if (\n !(bodies.flags[index]! & BODY_SLEEPING_2D) &&\n (gravityX !== 0 || gravityY !== 0) &&\n bodies.gravityScale[index] !== 0 &&\n !this.hasSolidContact(body)\n )\n body.wakeUp();\n }\n this.world.gravity = { x: gravityX / SCALE, y: gravityY / SCALE };\n this.world.numSolverIterations = velocityIterations;\n this.world.numInternalPgsIterations = positionIterations;\n const substeps = this.ccdSubsteps(\n bodies,\n colliders,\n dt,\n gravityX,\n gravityY,\n );\n this.world.timestep = dt / substeps;\n this.world.integrationParameters.maxCcdSubsteps = 4;\n const allowed = (a: number, b: number) => {\n const first = this.colliderIndices.get(a);\n const second = this.colliderIndices.get(b);\n return (\n first !== undefined &&\n second !== undefined &&\n collisionFiltersAllow2D(\n colliders.filters[first],\n colliders.filters[second],\n )\n );\n };\n const hooks: RAPIER.PhysicsHooks = {\n filterContactPair: (a, b) =>\n allowed(a, b) ? RAPIER.SolverFlags.COMPUTE_IMPULSE : null,\n filterIntersectionPair: allowed,\n };\n const starts = new Map(\n [...kinematicTargets.keys()].map((index) => [\n index,\n {\n x: bodies.positionX[index]!,\n y: bodies.positionY[index]!,\n angle: bodies.rotationRadians[index]!,\n },\n ]),\n );\n this.impulses.clear();\n this.impacts.clear();\n for (let substep = 1; substep <= substeps; substep++) {\n const fraction = substep / substeps;\n for (const [index, target] of kinematicTargets) {\n const start = starts.get(index)!;\n const body = this.world.getRigidBody(\n this.bodyBindings.get(index)!.handle,\n );\n body.setNextKinematicTranslation({\n x: (start.x + (target.x - start.x) * fraction) / SCALE,\n y: (start.y + (target.y - start.y) * fraction) / SCALE,\n });\n body.setNextKinematicRotation(\n start.angle + (target.angle - start.angle) * fraction,\n );\n }\n this.world.step(undefined, hooks);\n if (substeps > 1) this.captureImpacts(bodies);\n }\n for (const [index, binding] of this.bodyBindings) {\n if (\n !(\n bodies.flags[index]! &\n (BODY_TYPE_DYNAMIC_2D | BODY_TYPE_KINEMATIC_2D)\n )\n )\n continue;\n const body = this.world.getRigidBody(binding.handle);\n const position = body.translation();\n const velocity = body.linvel();\n for (const value of [\n position.x,\n position.y,\n velocity.x,\n velocity.y,\n body.rotation(),\n body.angvel(),\n ])\n validateEngineNumber(value);\n const target = kinematicTargets.get(index);\n bodies.positionX[index] =\n target?.x ?? logicalValue(position.x, bodies.positionX[index]!);\n bodies.positionY[index] =\n target?.y ?? logicalValue(position.y, bodies.positionY[index]!);\n bodies.rotationRadians[index] = target?.angle ?? body.rotation();\n bodies.linearVelocityX[index] = logicalValue(\n velocity.x,\n bodies.linearVelocityX[index]!,\n );\n bodies.linearVelocityY[index] = logicalValue(\n velocity.y,\n bodies.linearVelocityY[index]!,\n );\n bodies.angularVelocity[index] = body.angvel();\n bodies.forceX[index] = 0;\n bodies.forceY[index] = 0;\n bodies.torque[index] = 0;\n if (body.isSleeping()) bodies.flags[index]! |= BODY_SLEEPING_2D;\n else bodies.flags[index]! &= ~BODY_SLEEPING_2D;\n }\n }\n\n manifold(first: number, second: number): PrivateManifold2D | null {\n const impact = this.impacts.get(`${first}:${second}`);\n if (impact) {\n this.impulses.set(`${first}:${second}`, impact.impulses);\n return impact.manifold;\n }\n return this.currentManifold(first, second);\n }\n\n contactPairs(\n pairs: SortedColliderPairs2D,\n colliders: ColliderStore2D,\n ): SortedColliderPairs2D {\n if (this.impacts.size === 0) return pairs;\n const merged = new Map<string, readonly [number, number]>();\n for (let i = 0; i < pairs.pairCount; i++) {\n const a = pairs.pairFirstColliderIndices[i]!,\n b = pairs.pairSecondColliderIndices[i]!;\n merged.set(`${a}:${b}`, [a, b]);\n }\n for (const [key, impact] of this.impacts)\n merged.set(key, [impact.first, impact.second]);\n const sorted = [...merged.values()].sort(\n (a, b) => a[0] - b[0] || a[1] - b[1],\n );\n return {\n pairCount: sorted.length,\n pairFirstColliderIndices: Int32Array.from(sorted, (pair) => pair[0]),\n pairSecondColliderIndices: Int32Array.from(sorted, (pair) => pair[1]),\n pairFirstColliderGenerations: Uint32Array.from(\n sorted,\n (pair) => colliders.generations[pair[0]]!,\n ),\n pairSecondColliderGenerations: Uint32Array.from(\n sorted,\n (pair) => colliders.generations[pair[1]]!,\n ),\n };\n }\n\n private captureImpacts(bodies: BodyStore2D): void {\n const seen = new Set<string>();\n for (const [index, binding] of this.colliderBindings) {\n if (!(bodies.flags[binding.body]! & BODY_CCD_2D)) continue;\n for (const handle of binding.handles) {\n const collider = this.world.getCollider(handle);\n if (collider.isSensor()) continue;\n this.world.contactPairsWith(collider, (other) => {\n if (other.isSensor()) return;\n const otherIndex = this.colliderIndices.get(other.handle);\n if (otherIndex === undefined || otherIndex === index) return;\n const first = Math.min(index, otherIndex),\n second = Math.max(index, otherIndex),\n key = `${first}:${second}`;\n if (seen.has(key)) return;\n seen.add(key);\n const manifold = this.currentManifold(first, second, true);\n const impulses = this.impulses.get(key);\n if (!manifold || !impulses?.some((value) => value > 0)) return;\n const previous = this.impacts.get(key);\n this.impacts.set(key, {\n first,\n second,\n manifold,\n impulses: impulses.map(\n (value, i) => value + (previous?.impulses[i] ?? 0),\n ),\n });\n });\n }\n }\n }\n\n private currentManifold(\n first: number,\n second: number,\n includePredictiveImpact = false,\n ): PrivateManifold2D | null {\n const a = this.colliderBindings.get(first);\n const b = this.colliderBindings.get(second);\n if (!a || !b) return null;\n let result: PrivateManifold2D | null = null;\n let depth = Infinity;\n for (let ai = 0; ai < a.handles.length; ai++)\n for (let bi = 0; bi < b.handles.length; bi++) {\n const ca = this.world.getCollider(a.handles[ai]!);\n const cb = this.world.getCollider(b.handles[bi]!);\n if (ca.isSensor() || cb.isSensor()) {\n if (this.world.intersectionPair(ca, cb))\n return {\n normalX: 1,\n normalY: 0,\n firstLeaf: ai,\n secondLeaf: bi,\n points: [\n {\n firstX: ca.translation().x,\n firstY: ca.translation().y,\n secondX: cb.translation().x,\n secondY: cb.translation().y,\n separation: 0,\n firstFeature: 0,\n secondFeature: 0,\n },\n ],\n };\n continue;\n }\n this.world.contactPair(ca, cb, (contact, flipped) => {\n if (contact.numContacts() === 0) return;\n const separation =\n SCALE *\n Math.min(\n ...Array.from({ length: contact.numContacts() }, (_, i) =>\n contact.contactDist(i),\n ),\n );\n if (\n (!includePredictiveImpact && separation > 0.5) ||\n separation >= depth\n )\n return;\n const normal = contact.normal();\n const nx = normal.x * (flipped ? 1 : -1),\n ny = normal.y * (flipped ? 1 : -1);\n const points = [];\n const impulses = [];\n for (let i = 0; i < Math.min(2, contact.numContacts()); i++) {\n const pa = contact.localContactPoint1(i)!;\n const pb = contact.localContactPoint2(i)!;\n const wa = worldPoint(flipped ? cb : ca, pa);\n const wb = worldPoint(flipped ? ca : cb, pb);\n points.push({\n firstX: flipped ? wb.x : wa.x,\n firstY: flipped ? wb.y : wa.y,\n secondX: flipped ? wa.x : wb.x,\n secondY: flipped ? wa.y : wb.y,\n separation: contact.contactDist(i) * SCALE,\n firstFeature: contact.contactFid1(i),\n secondFeature: contact.contactFid2(i),\n });\n impulses.push(contact.contactImpulse(i) * SCALE);\n }\n result = {\n normalX: nx,\n normalY: ny,\n firstLeaf: ai,\n secondLeaf: bi,\n points,\n };\n depth = separation;\n this.impulses.set(`${first}:${second}`, impulses);\n });\n }\n return result;\n }\n\n normalImpulses(first: number, second: number): readonly number[] {\n return this.impulses.get(`${first}:${second}`) ?? [];\n }\n\n private synchronize(\n bodies: BodyStore2D,\n colliders: ColliderStore2D,\n sleeping: boolean,\n ): void {\n for (const [index, binding] of this.colliderBindings) {\n if (\n colliders.has(index, binding.generation) &&\n colliders.shapes[index] === binding.shape &&\n colliders.bodyIndices[index] === binding.body &&\n bodies.localCenterX[binding.body] === binding.centerX &&\n bodies.localCenterY[binding.body] === binding.centerY\n )\n continue;\n for (const handle of binding.handles) {\n const collider = this.world.getCollider(handle);\n if (collider) this.world.removeCollider(collider, false);\n }\n this.colliderBindings.delete(index);\n }\n for (const [index, binding] of this.bodyBindings) {\n if (bodies.has(index, binding.generation)) continue;\n this.world.removeRigidBody(this.world.getRigidBody(binding.handle));\n this.bodyBindings.delete(index);\n }\n for (let index = 0; index < bodies.capacity; index++) {\n const generation = bodies.generations[index]!;\n if (!bodies.has(index, generation)) continue;\n const flags = bodies.flags[index]!;\n for (const value of [\n bodies.positionX[index]! / SCALE,\n bodies.positionY[index]! / SCALE,\n bodies.linearVelocityX[index]! / SCALE,\n bodies.linearVelocityY[index]! / SCALE,\n bodies.rotationRadians[index]!,\n bodies.angularVelocity[index]!,\n bodies.forceX[index]! / SCALE,\n bodies.forceY[index]! / SCALE,\n bodies.torque[index]! / (SCALE * SCALE),\n bodies.gravityScale[index]!,\n bodies.linearDamping[index]!,\n bodies.angularDamping[index]!,\n ])\n validateEngineNumber(value);\n if (bodies.inverseMass[index]! > 0)\n validateEngineNumber(1 / bodies.inverseMass[index]!);\n if (bodies.inverseInertia[index]! > 0)\n validateEngineNumber(\n 1 / bodies.inverseInertia[index]! / (SCALE * SCALE),\n );\n const type =\n flags & BODY_TYPE_DYNAMIC_2D\n ? RAPIER.RigidBodyType.Dynamic\n : flags & BODY_TYPE_KINEMATIC_2D\n ? RAPIER.RigidBodyType.KinematicPositionBased\n : RAPIER.RigidBodyType.Fixed;\n let binding = this.bodyBindings.get(index);\n if (!binding) {\n const created = this.world.createRigidBody(\n new RAPIER.RigidBodyDesc(type).setCanSleep(true),\n );\n binding = { handle: created.handle, generation };\n this.bodyBindings.set(index, binding);\n }\n const configuration = [\n type,\n bodies.gravityScale[index],\n bodies.linearDamping[index],\n bodies.angularDamping[index],\n flags & (BODY_CCD_2D | BODY_FIXED_ROTATION_2D),\n bodies.inverseMass[index],\n bodies.inverseInertia[index],\n ].join(\":\");\n if (\n type === RAPIER.RigidBodyType.Fixed &&\n binding.configuration === configuration &&\n binding.staticPose?.[0] === bodies.positionX[index] &&\n binding.staticPose[1] === bodies.positionY[index] &&\n binding.staticPose[2] === bodies.rotationRadians[index]\n )\n continue;\n const body = this.world.getRigidBody(binding.handle);\n if (body.bodyType() !== type) body.setBodyType(type, false);\n const position = body.translation();\n if (\n position.x !== Math.fround(bodies.positionX[index]! / SCALE) ||\n position.y !== Math.fround(bodies.positionY[index]! / SCALE)\n )\n body.setTranslation(\n {\n x: bodies.positionX[index]! / SCALE,\n y: bodies.positionY[index]! / SCALE,\n },\n false,\n );\n if (body.rotation() !== bodies.rotationRadians[index])\n body.setRotation(bodies.rotationRadians[index]!, false);\n const velocity = body.linvel();\n if (\n velocity.x !== Math.fround(bodies.linearVelocityX[index]! / SCALE) ||\n velocity.y !== Math.fround(bodies.linearVelocityY[index]! / SCALE)\n )\n body.setLinvel(\n {\n x: bodies.linearVelocityX[index]! / SCALE,\n y: bodies.linearVelocityY[index]! / SCALE,\n },\n false,\n );\n if (body.angvel() !== bodies.angularVelocity[index])\n body.setAngvel(bodies.angularVelocity[index]!, false);\n\n if (binding.configuration !== configuration) {\n this.bodyBindings.set(index, { ...binding, configuration });\n body.setGravityScale(bodies.gravityScale[index]!, false);\n body.setLinearDamping(bodies.linearDamping[index]!);\n body.setAngularDamping(bodies.angularDamping[index]!);\n body.enableCcd(!!(flags & BODY_CCD_2D));\n body.lockRotations(!!(flags & BODY_FIXED_ROTATION_2D), false);\n const inverseMass = bodies.inverseMass[index]!,\n inverseInertia = bodies.inverseInertia[index]!;\n body.setAdditionalMassProperties(\n inverseMass > 0 ? 1 / inverseMass : 0,\n { x: 0, y: 0 },\n inverseInertia > 0 ? 1 / inverseInertia / (SCALE * SCALE) : 0,\n false,\n );\n }\n if (type === RAPIER.RigidBodyType.Fixed) {\n this.bodyBindings.set(index, {\n ...this.bodyBindings.get(index)!,\n staticPose: [\n bodies.positionX[index]!,\n bodies.positionY[index]!,\n bodies.rotationRadians[index]!,\n ],\n });\n continue;\n }\n body.resetForces(false);\n body.resetTorques(false);\n body.addForce(\n { x: bodies.forceX[index]! / SCALE, y: bodies.forceY[index]! / SCALE },\n false,\n );\n body.addTorque(bodies.torque[index]! / (SCALE * SCALE), false);\n if (flags & BODY_SLEEPING_2D) {\n if (!body.isSleeping()) body.sleep();\n } else if (\n body.isSleeping() ||\n !sleeping ||\n flags & BODY_SLEEP_DISABLED_2D\n )\n body.wakeUp();\n }\n for (let index = 0; index < colliders.capacity; index++) {\n const generation = colliders.generations[index]!;\n if (!colliders.has(index, generation) || this.colliderBindings.has(index))\n continue;\n const shape = colliders.shapes[index]!;\n const bodyIndex = colliders.bodyIndices[index]!;\n const body = this.world.getRigidBody(\n this.bodyBindings.get(bodyIndex)!.handle,\n );\n const material = colliders.materials[index] as {\n friction?: number;\n restitution?: number;\n } | null;\n const handles = shape.leaves.map((leaf) => {\n const desc = leafDescriptor(\n leaf,\n shape,\n bodies.localCenterX[bodyIndex]!,\n bodies.localCenterY[bodyIndex]!,\n );\n desc\n .setDensity(0)\n .setFriction(Math.sqrt(material?.friction ?? 0.5))\n .setRestitution(material?.restitution ?? 0)\n .setFrictionCombineRule(RAPIER.CoefficientCombineRule.Multiply)\n .setRestitutionCombineRule(RAPIER.CoefficientCombineRule.Max)\n .setSensor(!!(colliders.flags[index]! & COLLIDER_SENSOR_2D))\n .setActiveCollisionTypes(RAPIER.ActiveCollisionTypes.ALL)\n .setActiveHooks(\n RAPIER.ActiveHooks.FILTER_CONTACT_PAIRS |\n RAPIER.ActiveHooks.FILTER_INTERSECTION_PAIRS,\n );\n return this.world.createCollider(desc, body).handle;\n });\n this.colliderBindings.set(index, {\n handles,\n generation,\n shape,\n body: bodyIndex,\n centerX: bodies.localCenterX[bodyIndex]!,\n centerY: bodies.localCenterY[bodyIndex]!,\n feature: Math.max(0.01, Math.min(...shape.leaves.map(minimumFeature))),\n });\n }\n this.rebuildColliderIndices();\n }\n\n private ccdSubsteps(\n bodies: BodyStore2D,\n colliders: ColliderStore2D,\n dt: number,\n gravityX: number,\n gravityY: number,\n ): number {\n let required = 1;\n for (const [index, binding] of this.colliderBindings) {\n const body = binding.body;\n if (\n !(bodies.flags[body]! & BODY_CCD_2D) ||\n !(bodies.flags[body]! & BODY_TYPE_DYNAMIC_2D) ||\n colliders.flags[index]! & COLLIDER_SENSOR_2D\n )\n continue;\n const bounds = binding.shape.localBounds;\n const width = bounds[2]! - bounds[0]!,\n height = bounds[3]! - bounds[1]!;\n const feature = Math.max(0.01, Math.min(width, height, binding.feature));\n // Bound every shape corner about the body's center of mass. Bounds can\n // occupy opposite quadrants, and collider descriptors are COM-relative.\n let radius = 0;\n for (let corner = 0; corner < 4; corner++) {\n const x =\n (corner % 2 === 0 ? bounds[0]! : bounds[2]!) -\n bodies.localCenterX[body]!;\n const y =\n (corner < 2 ? bounds[1]! : bounds[3]!) -\n bodies.localCenterY[body]!;\n radius = Math.max(radius, Math.hypot(x, y));\n }\n const acceleration = Math.hypot(\n gravityX * bodies.gravityScale[body]! +\n bodies.forceX[body]! * bodies.inverseMass[body]!,\n gravityY * bodies.gravityScale[body]! +\n bodies.forceY[body]! * bodies.inverseMass[body]!,\n );\n const angularAcceleration = Math.abs(\n bodies.torque[body]! * bodies.inverseInertia[body]!,\n );\n const speed =\n Math.hypot(\n bodies.linearVelocityX[body]!,\n bodies.linearVelocityY[body]!,\n ) +\n acceleration * dt +\n (Math.abs(bodies.angularVelocity[body]!) + angularAcceleration * dt) *\n radius;\n required = Math.max(required, Math.ceil((speed * dt) / (feature * 0.25)));\n }\n if (required > 64)\n throw new RangeError(\n `Physics CCD requires ${required} substeps (maximum 64). Reduce velocity or fixedStepMilliseconds, or enlarge the collider.`,\n );\n return required;\n }\n\n private hasSolidContact(body: RAPIER.RigidBody): boolean {\n let touching = false;\n for (let i = 0; i < body.numColliders(); i++) {\n const collider = body.collider(i);\n if (collider.isSensor()) continue;\n this.world.contactPairsWith(collider, (other) => {\n if (other.isSensor()) return;\n this.world.contactPair(collider, other, (contact) => {\n for (let point = 0; point < contact.numContacts(); point++)\n if (contact.contactDist(point) <= 0.5 / SCALE) touching = true;\n });\n });\n }\n return touching;\n }\n\n private rebuildColliderIndices(): void {\n this.colliderIndices.clear();\n for (const [index, binding] of this.colliderBindings)\n for (const handle of binding.handles)\n this.colliderIndices.set(handle, index);\n }\n}\n\nfunction worldPoint(\n collider: RAPIER.Collider,\n p: RAPIER.Vector,\n): RAPIER.Vector {\n const position = collider.translation(),\n angle = collider.rotation();\n return {\n x: (position.x + Math.cos(angle) * p.x - Math.sin(angle) * p.y) * SCALE,\n y: (position.y + Math.sin(angle) * p.x + Math.cos(angle) * p.y) * SCALE,\n };\n}\n\nfunction leafDescriptor(\n leaf: ConvexLeaf2D,\n shape: ShapeRecord2D,\n centerX: number,\n centerY: number,\n): RAPIER.ColliderDesc {\n // Reject overflow/underflow before crossing the f32 WASM boundary.\n for (const [key, value] of Object.entries(leaf)) {\n if (value instanceof Float64Array)\n for (const number of value) validateEngineNumber(number / SCALE);\n else if (typeof value === \"number\")\n validateEngineNumber(key === \"rotationRadians\" ? value : value / SCALE);\n }\n for (const value of [shape.localPose.x, shape.localPose.y, centerX, centerY])\n validateEngineNumber(value / SCALE);\n let desc: RAPIER.ColliderDesc;\n let x = 0,\n y = 0,\n angle = 0;\n if (leaf.kind === \"circle\") {\n desc = RAPIER.ColliderDesc.ball(leaf.radius / SCALE);\n [x, y] = [leaf.center[0]!, leaf.center[1]!];\n } else if (leaf.kind === \"box\") {\n desc = RAPIER.ColliderDesc.cuboid(\n leaf.halfWidth / SCALE,\n leaf.halfHeight / SCALE,\n );\n [x, y] = [leaf.center[0]!, leaf.center[1]!];\n } else if (leaf.kind === \"capsule\") {\n const dx = leaf.end[0]! - leaf.start[0]!,\n dy = leaf.end[1]! - leaf.start[1]!;\n desc = RAPIER.ColliderDesc.capsule(\n Math.hypot(dx, dy) / 2 / SCALE,\n leaf.radius / SCALE,\n );\n x = (leaf.start[0]! + leaf.end[0]!) / 2;\n y = (leaf.start[1]! + leaf.end[1]!) / 2;\n angle = Math.atan2(dy, dx) - Math.PI / 2;\n } else if (leaf.kind === \"segment\")\n desc = RAPIER.ColliderDesc.segment(\n { x: leaf.start[0]! / SCALE, y: leaf.start[1]! / SCALE },\n { x: leaf.end[0]! / SCALE, y: leaf.end[1]! / SCALE },\n );\n else {\n let vertices: Float32Array;\n if (leaf.kind === \"polygon\")\n vertices = Float32Array.from(leaf.vertices, (value) => value / SCALE);\n else {\n const radius =\n leaf.kind === \"ellipse\"\n ? Math.max(leaf.radiusX, leaf.radiusY)\n : Math.max(...leaf.radii);\n const count =\n 4 *\n Math.max(\n 8,\n Math.ceil(\n Math.PI /\n Math.acos(Math.max(-1, 1 - 0.01 / Math.max(radius, 0.01))) /\n 4,\n ),\n );\n if (!Number.isFinite(count) || count > 4096)\n throw new RangeError(\n \"Curved physics collider requires more than 4096 vertices at 0.01-unit accuracy. Reduce its size or provide explicit collision geometry.\",\n );\n const points: number[] = [];\n if (leaf.kind === \"ellipse\") {\n const cosine = Math.cos(leaf.rotationRadians),\n sine = Math.sin(leaf.rotationRadians);\n for (let i = 0; i < count; i++) {\n const x = leaf.radiusX * Math.cos((i * Math.PI * 2) / count),\n y = leaf.radiusY * Math.sin((i * Math.PI * 2) / count);\n points.push(\n leaf.center[0]! + cosine * x - sine * y,\n leaf.center[1]! + sine * x + cosine * y,\n );\n }\n } else {\n // Parametric corner arcs bound chord error by r*(1-cos(angle/2)).\n for (let corner = 0; corner < 4; corner++) {\n const r = leaf.radii[corner]!,\n right = corner === 1 || corner === 2,\n bottom = corner >= 2;\n const cx =\n leaf.center[0]! +\n (right ? leaf.halfWidth - r : -leaf.halfWidth + r);\n const cy =\n leaf.center[1]! +\n (bottom ? leaf.halfHeight - r : -leaf.halfHeight + r);\n for (let i = 0; i <= count / 4; i++) {\n const a =\n Math.PI + (corner * Math.PI) / 2 + (i * Math.PI * 2) / count;\n points.push(cx + r * Math.cos(a), cy + r * Math.sin(a));\n }\n }\n }\n vertices = Float32Array.from(points, (value) => value / SCALE);\n }\n const hull = RAPIER.ColliderDesc.convexHull(vertices);\n if (!hull)\n throw new Error(\n \"Physics shape cannot form a finite convex Rapier collider.\",\n );\n desc = hull;\n }\n const cosine = Math.cos(shape.localPose.rotationRadians),\n sine = Math.sin(shape.localPose.rotationRadians);\n const translationX =\n (shape.localPose.x + cosine * x - sine * y - centerX) / SCALE;\n const translationY =\n (shape.localPose.y + sine * x + cosine * y - centerY) / SCALE;\n const rotation = shape.localPose.rotationRadians + angle;\n validateEngineNumber(translationX);\n validateEngineNumber(translationY);\n validateEngineNumber(rotation);\n return desc.setTranslation(translationX, translationY).setRotation(rotation);\n}\n\n// A round trip through f32 must not move an axis the engine did not change.\nfunction logicalValue(engineValue: number, previous: number): number {\n return engineValue === Math.fround(previous / SCALE)\n ? previous\n : engineValue * SCALE;\n}\n\n// Bound each convex leaf separately: a distant large leaf must not hide a thin one.\nfunction minimumFeature(leaf: ConvexLeaf2D): number {\n if (leaf.kind === \"circle\" || leaf.kind === \"capsule\") return 2 * leaf.radius;\n if (leaf.kind === \"ellipse\") return 2 * Math.min(leaf.radiusX, leaf.radiusY);\n if (leaf.kind === \"box\" || leaf.kind === \"rounded-box\")\n return 2 * Math.min(leaf.halfWidth, leaf.halfHeight);\n if (leaf.kind === \"segment\") return 0;\n // Exhaustive edge-projection width: O(vertices\u00B2), without temporary arrays.\n // Cached on the collider binding; this is geometry setup, not per-tick work.\n let width = Infinity;\n const v = leaf.vertices;\n for (let i = 0; i < v.length; i += 2) {\n const j = (i + 2) % v.length;\n const dx = v[j]! - v[i]!,\n dy = v[j + 1]! - v[i + 1]!;\n const length = Math.hypot(dx, dy);\n if (length === 0) continue;\n let min = Infinity,\n max = -Infinity;\n for (let k = 0; k < v.length; k += 2) {\n const projection = (v[k]! * -dy + v[k + 1]! * dx) / length;\n min = Math.min(min, projection);\n max = Math.max(max, projection);\n }\n width = Math.min(width, max - min);\n }\n return width;\n}\n\nfunction validateEngineNumber(value: number): void {\n const rounded = Math.fround(value);\n if (!Number.isFinite(rounded) || (value !== 0 && rounded === 0))\n throw new RangeError(\n \"Physics value cannot be represented at 100 logical units per engine meter. Reduce extreme coordinates, speeds, forces, or shape dimensions.\",\n );\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import RAPIER from \"./rapier-engine.js\";\nimport type { BodyStore2D, ColliderStore2D } from \"./storage.js\";\nimport type { ShapeRecord2D, ConvexLeaf2D } from \"../shape-records.js\";\nimport type { PrivateManifold2D } from \"../collision/manifold.js\";\nimport { BODY_CCD_2D, collisionFiltersAllow2D } from \"./ccd.js\";\nimport {\n BODY_TYPE_DYNAMIC_2D,\n BODY_TYPE_KINEMATIC_2D,\n BODY_FIXED_ROTATION_2D,\n} from \"./integrator.js\";\nimport { BODY_SLEEPING_2D, BODY_SLEEP_DISABLED_2D } from \"./solver.js\";\nimport {\n COLLIDER_SENSOR_2D,\n type SortedColliderPairs2D,\n} from \"./contact-cache.js\";\n\n// The compat build embeds WASM; initialization neither starts a clock nor fetches\n// an external URL. Importers finish loading before any world can be mounted.\nawait RAPIER.init();\nconst SCALE = 100;\nlet ownedWorlds = 0;\nexport function liveRapierWorldsForTest(): number {\n return ownedWorlds;\n}\n\ninterface BodyBinding {\n handle: number;\n generation: number;\n configuration?: string;\n staticPose?: readonly [number, number, number];\n}\ninterface ColliderBinding {\n handles: number[];\n generation: number;\n shape: ShapeRecord2D;\n body: number;\n centerX: number;\n centerY: number;\n feature: number;\n}\nexport interface RapierCheckpoint2D {\n bytes: Uint8Array;\n bodies: Map<number, BodyBinding>;\n colliders: Map<number, ColliderBinding>;\n}\n\n/** Private engine bridge. Pibbl retains identity, transactions, commands and time. */\nexport class RapierSimulation2D {\n private world = new RAPIER.World({ x: 0, y: 0 });\n private disposed = false;\n private bodyBindings = new Map<number, BodyBinding>();\n private colliderBindings = new Map<number, ColliderBinding>();\n private colliderIndices = new Map<number, number>();\n private impulses = new Map<string, number[]>();\n private impacts = new Map<\n string,\n {\n first: number;\n second: number;\n manifold: PrivateManifold2D;\n impulses: number[];\n }\n >();\n\n constructor() {\n this.world.lengthUnit = 1;\n ownedWorlds++;\n }\n\n checkpoint(): RapierCheckpoint2D {\n return {\n bytes: this.world.takeSnapshot(),\n bodies: new Map(this.bodyBindings),\n colliders: new Map(this.colliderBindings),\n };\n }\n\n restore(checkpoint: RapierCheckpoint2D): void {\n const restored = RAPIER.World.restoreSnapshot(checkpoint.bytes);\n this.world.free();\n this.world = restored;\n this.bodyBindings = new Map(checkpoint.bodies);\n this.colliderBindings = new Map(checkpoint.colliders);\n this.rebuildColliderIndices();\n this.impulses.clear();\n this.impacts.clear();\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.world.free();\n ownedWorlds--;\n this.bodyBindings.clear();\n this.colliderBindings.clear();\n this.colliderIndices.clear();\n this.impulses.clear();\n this.impacts.clear();\n }\n\n step(\n bodies: BodyStore2D,\n colliders: ColliderStore2D,\n dt: number,\n gravityX: number,\n gravityY: number,\n sleeping: boolean,\n velocityIterations = 4,\n positionIterations = 1,\n ): void {\n validateEngineNumber(gravityX / SCALE);\n validateEngineNumber(gravityY / SCALE);\n this.synchronize(bodies, colliders, sleeping);\n const kinematicTargets = new Map<\n number,\n { x: number; y: number; angle: number }\n >();\n for (const [index, binding] of this.bodyBindings) {\n const body = this.world.getRigidBody(binding.handle);\n if (bodies.flags[index]! & BODY_TYPE_KINEMATIC_2D) {\n const target = {\n x: bodies.positionX[index]! + bodies.linearVelocityX[index]! * dt,\n y: bodies.positionY[index]! + bodies.linearVelocityY[index]! * dt,\n angle:\n bodies.rotationRadians[index]! +\n bodies.angularVelocity[index]! * dt,\n };\n body.setNextKinematicTranslation({\n x: target.x / SCALE,\n y: target.y / SCALE,\n });\n body.setNextKinematicRotation(target.angle);\n kinematicTargets.set(index, target);\n } else if (\n !(bodies.flags[index]! & BODY_SLEEPING_2D) &&\n (gravityX !== 0 || gravityY !== 0) &&\n bodies.gravityScale[index] !== 0 &&\n !this.hasSolidContact(body)\n )\n body.wakeUp();\n }\n this.world.gravity = { x: gravityX / SCALE, y: gravityY / SCALE };\n this.world.numSolverIterations = velocityIterations;\n this.world.numInternalPgsIterations = positionIterations;\n const substeps = this.ccdSubsteps(\n bodies,\n colliders,\n dt,\n gravityX,\n gravityY,\n );\n this.world.timestep = dt / substeps;\n this.world.integrationParameters.maxCcdSubsteps = 4;\n const allowed = (a: number, b: number) => {\n const first = this.colliderIndices.get(a);\n const second = this.colliderIndices.get(b);\n return (\n first !== undefined &&\n second !== undefined &&\n collisionFiltersAllow2D(\n colliders.filters[first],\n colliders.filters[second],\n )\n );\n };\n const hooks: RAPIER.PhysicsHooks = {\n filterContactPair: (a, b) =>\n allowed(a, b) ? RAPIER.SolverFlags.COMPUTE_IMPULSE : null,\n filterIntersectionPair: allowed,\n };\n const starts = new Map(\n [...kinematicTargets.keys()].map((index) => [\n index,\n {\n x: bodies.positionX[index]!,\n y: bodies.positionY[index]!,\n angle: bodies.rotationRadians[index]!,\n },\n ]),\n );\n this.impulses.clear();\n this.impacts.clear();\n for (let substep = 1; substep <= substeps; substep++) {\n const fraction = substep / substeps;\n for (const [index, target] of kinematicTargets) {\n const start = starts.get(index)!;\n const body = this.world.getRigidBody(\n this.bodyBindings.get(index)!.handle,\n );\n body.setNextKinematicTranslation({\n x: (start.x + (target.x - start.x) * fraction) / SCALE,\n y: (start.y + (target.y - start.y) * fraction) / SCALE,\n });\n body.setNextKinematicRotation(\n start.angle + (target.angle - start.angle) * fraction,\n );\n }\n this.world.step(undefined, hooks);\n if (substeps > 1) this.captureImpacts(bodies);\n }\n for (const [index, binding] of this.bodyBindings) {\n if (\n !(\n bodies.flags[index]! &\n (BODY_TYPE_DYNAMIC_2D | BODY_TYPE_KINEMATIC_2D)\n )\n )\n continue;\n const body = this.world.getRigidBody(binding.handle);\n const position = body.translation();\n const velocity = body.linvel();\n validateEngineNumber(position.x);\n validateEngineNumber(position.y);\n validateEngineNumber(velocity.x);\n validateEngineNumber(velocity.y);\n validateEngineNumber(body.rotation());\n validateEngineNumber(body.angvel());\n const target = kinematicTargets.get(index);\n bodies.positionX[index] =\n target?.x ?? logicalValue(position.x, bodies.positionX[index]!);\n bodies.positionY[index] =\n target?.y ?? logicalValue(position.y, bodies.positionY[index]!);\n bodies.rotationRadians[index] = target?.angle ?? body.rotation();\n bodies.linearVelocityX[index] = logicalValue(\n velocity.x,\n bodies.linearVelocityX[index]!,\n );\n bodies.linearVelocityY[index] = logicalValue(\n velocity.y,\n bodies.linearVelocityY[index]!,\n );\n bodies.angularVelocity[index] = body.angvel();\n bodies.forceX[index] = 0;\n bodies.forceY[index] = 0;\n bodies.torque[index] = 0;\n if (body.isSleeping()) bodies.flags[index]! |= BODY_SLEEPING_2D;\n else bodies.flags[index]! &= ~BODY_SLEEPING_2D;\n }\n }\n\n manifold(first: number, second: number): PrivateManifold2D | null {\n const impact = this.impacts.get(`${first}:${second}`);\n if (impact) {\n this.impulses.set(`${first}:${second}`, impact.impulses);\n return impact.manifold;\n }\n return this.currentManifold(first, second);\n }\n\n contactPairs(\n pairs: SortedColliderPairs2D,\n colliders: ColliderStore2D,\n ): SortedColliderPairs2D {\n if (this.impacts.size === 0) return pairs;\n const merged = new Map<string, readonly [number, number]>();\n for (let i = 0; i < pairs.pairCount; i++) {\n const a = pairs.pairFirstColliderIndices[i]!,\n b = pairs.pairSecondColliderIndices[i]!;\n merged.set(`${a}:${b}`, [a, b]);\n }\n for (const [key, impact] of this.impacts)\n merged.set(key, [impact.first, impact.second]);\n const sorted = [...merged.values()].sort(\n (a, b) => a[0] - b[0] || a[1] - b[1],\n );\n return {\n pairCount: sorted.length,\n pairFirstColliderIndices: Int32Array.from(sorted, (pair) => pair[0]),\n pairSecondColliderIndices: Int32Array.from(sorted, (pair) => pair[1]),\n pairFirstColliderGenerations: Uint32Array.from(\n sorted,\n (pair) => colliders.generations[pair[0]]!,\n ),\n pairSecondColliderGenerations: Uint32Array.from(\n sorted,\n (pair) => colliders.generations[pair[1]]!,\n ),\n };\n }\n\n private captureImpacts(bodies: BodyStore2D): void {\n const seen = new Set<string>();\n for (const [index, binding] of this.colliderBindings) {\n if (!(bodies.flags[binding.body]! & BODY_CCD_2D)) continue;\n for (const handle of binding.handles) {\n const collider = this.world.getCollider(handle);\n if (collider.isSensor()) continue;\n this.world.contactPairsWith(collider, (other) => {\n if (other.isSensor()) return;\n const otherIndex = this.colliderIndices.get(other.handle);\n if (otherIndex === undefined || otherIndex === index) return;\n const first = Math.min(index, otherIndex),\n second = Math.max(index, otherIndex),\n key = `${first}:${second}`;\n if (seen.has(key)) return;\n seen.add(key);\n const manifold = this.currentManifold(first, second, true);\n const impulses = this.impulses.get(key);\n if (!manifold || !impulses?.some((value) => value > 0)) return;\n const previous = this.impacts.get(key);\n this.impacts.set(key, {\n first,\n second,\n manifold,\n impulses: impulses.map(\n (value, i) => value + (previous?.impulses[i] ?? 0),\n ),\n });\n });\n }\n }\n }\n\n private currentManifold(\n first: number,\n second: number,\n includePredictiveImpact = false,\n ): PrivateManifold2D | null {\n const a = this.colliderBindings.get(first);\n const b = this.colliderBindings.get(second);\n if (!a || !b) return null;\n let result: PrivateManifold2D | null = null;\n let depth = Infinity;\n for (let ai = 0; ai < a.handles.length; ai++)\n for (let bi = 0; bi < b.handles.length; bi++) {\n const ca = this.world.getCollider(a.handles[ai]!);\n const cb = this.world.getCollider(b.handles[bi]!);\n if (ca.isSensor() || cb.isSensor()) {\n if (this.world.intersectionPair(ca, cb))\n return {\n normalX: 1,\n normalY: 0,\n firstLeaf: ai,\n secondLeaf: bi,\n points: [\n {\n firstX: ca.translation().x,\n firstY: ca.translation().y,\n secondX: cb.translation().x,\n secondY: cb.translation().y,\n separation: 0,\n firstFeature: 0,\n secondFeature: 0,\n },\n ],\n };\n continue;\n }\n this.world.contactPair(ca, cb, (contact, flipped) => {\n if (contact.numContacts() === 0) return;\n const separation =\n SCALE *\n Math.min(\n ...Array.from({ length: contact.numContacts() }, (_, i) =>\n contact.contactDist(i),\n ),\n );\n if (\n (!includePredictiveImpact && separation > 0.5) ||\n separation >= depth\n )\n return;\n const normal = contact.normal();\n const nx = normal.x * (flipped ? 1 : -1),\n ny = normal.y * (flipped ? 1 : -1);\n const points = [];\n const impulses = [];\n for (let i = 0; i < Math.min(2, contact.numContacts()); i++) {\n const pa = contact.localContactPoint1(i)!;\n const pb = contact.localContactPoint2(i)!;\n const wa = worldPoint(flipped ? cb : ca, pa);\n const wb = worldPoint(flipped ? ca : cb, pb);\n points.push({\n firstX: flipped ? wb.x : wa.x,\n firstY: flipped ? wb.y : wa.y,\n secondX: flipped ? wa.x : wb.x,\n secondY: flipped ? wa.y : wb.y,\n separation: contact.contactDist(i) * SCALE,\n firstFeature: contact.contactFid1(i),\n secondFeature: contact.contactFid2(i),\n });\n impulses.push(contact.contactImpulse(i) * SCALE);\n }\n result = {\n normalX: nx,\n normalY: ny,\n firstLeaf: ai,\n secondLeaf: bi,\n points,\n };\n depth = separation;\n this.impulses.set(`${first}:${second}`, impulses);\n });\n }\n return result;\n }\n\n normalImpulses(first: number, second: number): readonly number[] {\n return this.impulses.get(`${first}:${second}`) ?? [];\n }\n\n private synchronize(\n bodies: BodyStore2D,\n colliders: ColliderStore2D,\n sleeping: boolean,\n ): void {\n for (const [index, binding] of this.colliderBindings) {\n if (\n colliders.has(index, binding.generation) &&\n colliders.shapes[index] === binding.shape &&\n colliders.bodyIndices[index] === binding.body &&\n bodies.localCenterX[binding.body] === binding.centerX &&\n bodies.localCenterY[binding.body] === binding.centerY\n )\n continue;\n for (const handle of binding.handles) {\n const collider = this.world.getCollider(handle);\n if (collider) this.world.removeCollider(collider, false);\n }\n this.colliderBindings.delete(index);\n }\n for (const [index, binding] of this.bodyBindings) {\n if (bodies.has(index, binding.generation)) continue;\n this.world.removeRigidBody(this.world.getRigidBody(binding.handle));\n this.bodyBindings.delete(index);\n }\n for (let index = 0; index < bodies.capacity; index++) {\n const generation = bodies.generations[index]!;\n if (!bodies.has(index, generation)) continue;\n const flags = bodies.flags[index]!;\n validateEngineNumber(bodies.positionX[index]! / SCALE);\n validateEngineNumber(bodies.positionY[index]! / SCALE);\n validateEngineNumber(bodies.linearVelocityX[index]! / SCALE);\n validateEngineNumber(bodies.linearVelocityY[index]! / SCALE);\n validateEngineNumber(bodies.rotationRadians[index]!);\n validateEngineNumber(bodies.angularVelocity[index]!);\n validateEngineNumber(bodies.forceX[index]! / SCALE);\n validateEngineNumber(bodies.forceY[index]! / SCALE);\n validateEngineNumber(bodies.torque[index]! / (SCALE * SCALE));\n validateEngineNumber(bodies.gravityScale[index]!);\n validateEngineNumber(bodies.linearDamping[index]!);\n validateEngineNumber(bodies.angularDamping[index]!);\n if (bodies.inverseMass[index]! > 0)\n validateEngineNumber(1 / bodies.inverseMass[index]!);\n if (bodies.inverseInertia[index]! > 0)\n validateEngineNumber(\n 1 / bodies.inverseInertia[index]! / (SCALE * SCALE),\n );\n const type =\n flags & BODY_TYPE_DYNAMIC_2D\n ? RAPIER.RigidBodyType.Dynamic\n : flags & BODY_TYPE_KINEMATIC_2D\n ? RAPIER.RigidBodyType.KinematicPositionBased\n : RAPIER.RigidBodyType.Fixed;\n let binding = this.bodyBindings.get(index);\n if (!binding) {\n const created = this.world.createRigidBody(\n new RAPIER.RigidBodyDesc(type).setCanSleep(true),\n );\n binding = { handle: created.handle, generation };\n this.bodyBindings.set(index, binding);\n }\n const configuration = [\n type,\n bodies.gravityScale[index],\n bodies.linearDamping[index],\n bodies.angularDamping[index],\n flags & (BODY_CCD_2D | BODY_FIXED_ROTATION_2D),\n bodies.inverseMass[index],\n bodies.inverseInertia[index],\n ].join(\":\");\n if (\n type === RAPIER.RigidBodyType.Fixed &&\n binding.configuration === configuration &&\n binding.staticPose?.[0] === bodies.positionX[index] &&\n binding.staticPose[1] === bodies.positionY[index] &&\n binding.staticPose[2] === bodies.rotationRadians[index]\n )\n continue;\n const body = this.world.getRigidBody(binding.handle);\n if (body.bodyType() !== type) body.setBodyType(type, false);\n const position = body.translation();\n if (\n position.x !== Math.fround(bodies.positionX[index]! / SCALE) ||\n position.y !== Math.fround(bodies.positionY[index]! / SCALE)\n )\n body.setTranslation(\n {\n x: bodies.positionX[index]! / SCALE,\n y: bodies.positionY[index]! / SCALE,\n },\n false,\n );\n if (body.rotation() !== bodies.rotationRadians[index])\n body.setRotation(bodies.rotationRadians[index]!, false);\n const velocity = body.linvel();\n if (\n velocity.x !== Math.fround(bodies.linearVelocityX[index]! / SCALE) ||\n velocity.y !== Math.fround(bodies.linearVelocityY[index]! / SCALE)\n )\n body.setLinvel(\n {\n x: bodies.linearVelocityX[index]! / SCALE,\n y: bodies.linearVelocityY[index]! / SCALE,\n },\n false,\n );\n if (body.angvel() !== bodies.angularVelocity[index])\n body.setAngvel(bodies.angularVelocity[index]!, false);\n\n if (binding.configuration !== configuration) {\n this.bodyBindings.set(index, { ...binding, configuration });\n body.setGravityScale(bodies.gravityScale[index]!, false);\n body.setLinearDamping(bodies.linearDamping[index]!);\n body.setAngularDamping(bodies.angularDamping[index]!);\n body.enableCcd(!!(flags & BODY_CCD_2D));\n body.lockRotations(!!(flags & BODY_FIXED_ROTATION_2D), false);\n const inverseMass = bodies.inverseMass[index]!,\n inverseInertia = bodies.inverseInertia[index]!;\n body.setAdditionalMassProperties(\n inverseMass > 0 ? 1 / inverseMass : 0,\n { x: 0, y: 0 },\n inverseInertia > 0 ? 1 / inverseInertia / (SCALE * SCALE) : 0,\n false,\n );\n }\n if (type === RAPIER.RigidBodyType.Fixed) {\n this.bodyBindings.set(index, {\n ...this.bodyBindings.get(index)!,\n staticPose: [\n bodies.positionX[index]!,\n bodies.positionY[index]!,\n bodies.rotationRadians[index]!,\n ],\n });\n continue;\n }\n body.resetForces(false);\n body.resetTorques(false);\n body.addForce(\n { x: bodies.forceX[index]! / SCALE, y: bodies.forceY[index]! / SCALE },\n false,\n );\n body.addTorque(bodies.torque[index]! / (SCALE * SCALE), false);\n if (flags & BODY_SLEEPING_2D) {\n if (!body.isSleeping()) body.sleep();\n } else if (\n body.isSleeping() ||\n !sleeping ||\n flags & BODY_SLEEP_DISABLED_2D\n )\n body.wakeUp();\n }\n for (let index = 0; index < colliders.capacity; index++) {\n const generation = colliders.generations[index]!;\n if (!colliders.has(index, generation) || this.colliderBindings.has(index))\n continue;\n const shape = colliders.shapes[index]!;\n const bodyIndex = colliders.bodyIndices[index]!;\n const body = this.world.getRigidBody(\n this.bodyBindings.get(bodyIndex)!.handle,\n );\n const material = colliders.materials[index] as {\n friction?: number;\n restitution?: number;\n } | null;\n const handles = shape.leaves.map((leaf) => {\n const desc = leafDescriptor(\n leaf,\n shape,\n bodies.localCenterX[bodyIndex]!,\n bodies.localCenterY[bodyIndex]!,\n );\n desc\n .setDensity(0)\n .setFriction(Math.sqrt(material?.friction ?? 0.5))\n .setRestitution(material?.restitution ?? 0)\n .setFrictionCombineRule(RAPIER.CoefficientCombineRule.Multiply)\n .setRestitutionCombineRule(RAPIER.CoefficientCombineRule.Max)\n .setSensor(!!(colliders.flags[index]! & COLLIDER_SENSOR_2D))\n .setActiveCollisionTypes(RAPIER.ActiveCollisionTypes.ALL)\n .setActiveHooks(\n RAPIER.ActiveHooks.FILTER_CONTACT_PAIRS |\n RAPIER.ActiveHooks.FILTER_INTERSECTION_PAIRS,\n );\n return this.world.createCollider(desc, body).handle;\n });\n this.colliderBindings.set(index, {\n handles,\n generation,\n shape,\n body: bodyIndex,\n centerX: bodies.localCenterX[bodyIndex]!,\n centerY: bodies.localCenterY[bodyIndex]!,\n feature: Math.max(0.01, Math.min(...shape.leaves.map(minimumFeature))),\n });\n }\n this.rebuildColliderIndices();\n }\n\n private ccdSubsteps(\n bodies: BodyStore2D,\n colliders: ColliderStore2D,\n dt: number,\n gravityX: number,\n gravityY: number,\n ): number {\n let required = 1;\n for (const [index, binding] of this.colliderBindings) {\n const body = binding.body;\n if (\n !(bodies.flags[body]! & BODY_CCD_2D) ||\n !(bodies.flags[body]! & BODY_TYPE_DYNAMIC_2D) ||\n colliders.flags[index]! & COLLIDER_SENSOR_2D\n )\n continue;\n const bounds = binding.shape.localBounds;\n const width = bounds[2]! - bounds[0]!,\n height = bounds[3]! - bounds[1]!;\n const feature = Math.max(0.01, Math.min(width, height, binding.feature));\n // Bound every shape corner about the body's center of mass. Bounds can\n // occupy opposite quadrants, and collider descriptors are COM-relative.\n let radius = 0;\n for (let corner = 0; corner < 4; corner++) {\n const x =\n (corner % 2 === 0 ? bounds[0]! : bounds[2]!) -\n bodies.localCenterX[body]!;\n const y =\n (corner < 2 ? bounds[1]! : bounds[3]!) -\n bodies.localCenterY[body]!;\n radius = Math.max(radius, Math.hypot(x, y));\n }\n const acceleration = Math.hypot(\n gravityX * bodies.gravityScale[body]! +\n bodies.forceX[body]! * bodies.inverseMass[body]!,\n gravityY * bodies.gravityScale[body]! +\n bodies.forceY[body]! * bodies.inverseMass[body]!,\n );\n const angularAcceleration = Math.abs(\n bodies.torque[body]! * bodies.inverseInertia[body]!,\n );\n const speed =\n Math.hypot(\n bodies.linearVelocityX[body]!,\n bodies.linearVelocityY[body]!,\n ) +\n acceleration * dt +\n (Math.abs(bodies.angularVelocity[body]!) + angularAcceleration * dt) *\n radius;\n required = Math.max(required, Math.ceil((speed * dt) / (feature * 0.25)));\n }\n if (required > 64)\n throw new RangeError(\n `Physics CCD requires ${required} substeps (maximum 64). Reduce velocity or fixedStepMilliseconds, or enlarge the collider.`,\n );\n return required;\n }\n\n private hasSolidContact(body: RAPIER.RigidBody): boolean {\n let touching = false;\n for (let i = 0; i < body.numColliders(); i++) {\n const collider = body.collider(i);\n if (collider.isSensor()) continue;\n this.world.contactPairsWith(collider, (other) => {\n if (other.isSensor()) return;\n this.world.contactPair(collider, other, (contact) => {\n for (let point = 0; point < contact.numContacts(); point++)\n if (contact.contactDist(point) <= 0.5 / SCALE) touching = true;\n });\n });\n }\n return touching;\n }\n\n private rebuildColliderIndices(): void {\n this.colliderIndices.clear();\n for (const [index, binding] of this.colliderBindings)\n for (const handle of binding.handles)\n this.colliderIndices.set(handle, index);\n }\n}\n\nfunction worldPoint(\n collider: RAPIER.Collider,\n p: RAPIER.Vector,\n): RAPIER.Vector {\n const position = collider.translation(),\n angle = collider.rotation();\n return {\n x: (position.x + Math.cos(angle) * p.x - Math.sin(angle) * p.y) * SCALE,\n y: (position.y + Math.sin(angle) * p.x + Math.cos(angle) * p.y) * SCALE,\n };\n}\n\nfunction leafDescriptor(\n leaf: ConvexLeaf2D,\n shape: ShapeRecord2D,\n centerX: number,\n centerY: number,\n): RAPIER.ColliderDesc {\n // Reject overflow/underflow before crossing the f32 WASM boundary.\n for (const [key, value] of Object.entries(leaf)) {\n if (value instanceof Float64Array)\n for (const number of value) validateEngineNumber(number / SCALE);\n else if (typeof value === \"number\")\n validateEngineNumber(key === \"rotationRadians\" ? value : value / SCALE);\n }\n validateEngineNumber(shape.localPose.x / SCALE);\n validateEngineNumber(shape.localPose.y / SCALE);\n validateEngineNumber(centerX / SCALE);\n validateEngineNumber(centerY / SCALE);\n let desc: RAPIER.ColliderDesc;\n let x = 0,\n y = 0,\n angle = 0;\n if (leaf.kind === \"circle\") {\n desc = RAPIER.ColliderDesc.ball(leaf.radius / SCALE);\n [x, y] = [leaf.center[0]!, leaf.center[1]!];\n } else if (leaf.kind === \"box\") {\n desc = RAPIER.ColliderDesc.cuboid(\n leaf.halfWidth / SCALE,\n leaf.halfHeight / SCALE,\n );\n [x, y] = [leaf.center[0]!, leaf.center[1]!];\n } else if (leaf.kind === \"capsule\") {\n const dx = leaf.end[0]! - leaf.start[0]!,\n dy = leaf.end[1]! - leaf.start[1]!;\n desc = RAPIER.ColliderDesc.capsule(\n Math.hypot(dx, dy) / 2 / SCALE,\n leaf.radius / SCALE,\n );\n x = (leaf.start[0]! + leaf.end[0]!) / 2;\n y = (leaf.start[1]! + leaf.end[1]!) / 2;\n angle = Math.atan2(dy, dx) - Math.PI / 2;\n } else if (leaf.kind === \"segment\")\n desc = RAPIER.ColliderDesc.segment(\n { x: leaf.start[0]! / SCALE, y: leaf.start[1]! / SCALE },\n { x: leaf.end[0]! / SCALE, y: leaf.end[1]! / SCALE },\n );\n else {\n let vertices: Float32Array;\n if (leaf.kind === \"polygon\")\n vertices = Float32Array.from(leaf.vertices, (value) => value / SCALE);\n else {\n const radius =\n leaf.kind === \"ellipse\"\n ? Math.max(leaf.radiusX, leaf.radiusY)\n : Math.max(...leaf.radii);\n const count =\n 4 *\n Math.max(\n 8,\n Math.ceil(\n Math.PI /\n Math.acos(Math.max(-1, 1 - 0.01 / Math.max(radius, 0.01))) /\n 4,\n ),\n );\n if (!Number.isFinite(count) || count > 4096)\n throw new RangeError(\n \"Curved physics collider requires more than 4096 vertices at 0.01-unit accuracy. Reduce its size or provide explicit collision geometry.\",\n );\n const points: number[] = [];\n if (leaf.kind === \"ellipse\") {\n const cosine = Math.cos(leaf.rotationRadians),\n sine = Math.sin(leaf.rotationRadians);\n for (let i = 0; i < count; i++) {\n const x = leaf.radiusX * Math.cos((i * Math.PI * 2) / count),\n y = leaf.radiusY * Math.sin((i * Math.PI * 2) / count);\n points.push(\n leaf.center[0]! + cosine * x - sine * y,\n leaf.center[1]! + sine * x + cosine * y,\n );\n }\n } else {\n // Parametric corner arcs bound chord error by r*(1-cos(angle/2)).\n for (let corner = 0; corner < 4; corner++) {\n const r = leaf.radii[corner]!,\n right = corner === 1 || corner === 2,\n bottom = corner >= 2;\n const cx =\n leaf.center[0]! +\n (right ? leaf.halfWidth - r : -leaf.halfWidth + r);\n const cy =\n leaf.center[1]! +\n (bottom ? leaf.halfHeight - r : -leaf.halfHeight + r);\n for (let i = 0; i <= count / 4; i++) {\n const a =\n Math.PI + (corner * Math.PI) / 2 + (i * Math.PI * 2) / count;\n points.push(cx + r * Math.cos(a), cy + r * Math.sin(a));\n }\n }\n }\n vertices = Float32Array.from(points, (value) => value / SCALE);\n }\n const hull = RAPIER.ColliderDesc.convexHull(vertices);\n if (!hull)\n throw new Error(\n \"Physics shape cannot form a finite convex Rapier collider.\",\n );\n desc = hull;\n }\n const cosine = Math.cos(shape.localPose.rotationRadians),\n sine = Math.sin(shape.localPose.rotationRadians);\n const translationX =\n (shape.localPose.x + cosine * x - sine * y - centerX) / SCALE;\n const translationY =\n (shape.localPose.y + sine * x + cosine * y - centerY) / SCALE;\n const rotation = shape.localPose.rotationRadians + angle;\n validateEngineNumber(translationX);\n validateEngineNumber(translationY);\n validateEngineNumber(rotation);\n return desc.setTranslation(translationX, translationY).setRotation(rotation);\n}\n\n// A round trip through f32 must not move an axis the engine did not change.\nfunction logicalValue(engineValue: number, previous: number): number {\n return engineValue === Math.fround(previous / SCALE)\n ? previous\n : engineValue * SCALE;\n}\n\n// Bound each convex leaf separately: a distant large leaf must not hide a thin one.\nfunction minimumFeature(leaf: ConvexLeaf2D): number {\n if (leaf.kind === \"circle\" || leaf.kind === \"capsule\") return 2 * leaf.radius;\n if (leaf.kind === \"ellipse\") return 2 * Math.min(leaf.radiusX, leaf.radiusY);\n if (leaf.kind === \"box\" || leaf.kind === \"rounded-box\")\n return 2 * Math.min(leaf.halfWidth, leaf.halfHeight);\n if (leaf.kind === \"segment\") return 0;\n // Exhaustive edge-projection width: O(vertices\u00B2), without temporary arrays.\n // Cached on the collider binding; this is geometry setup, not per-tick work.\n let width = Infinity;\n const v = leaf.vertices;\n for (let i = 0; i < v.length; i += 2) {\n const j = (i + 2) % v.length;\n const dx = v[j]! - v[i]!,\n dy = v[j + 1]! - v[i + 1]!;\n const length = Math.hypot(dx, dy);\n if (length === 0) continue;\n let min = Infinity,\n max = -Infinity;\n for (let k = 0; k < v.length; k += 2) {\n const projection = (v[k]! * -dy + v[k + 1]! * dx) / length;\n min = Math.min(min, projection);\n max = Math.max(max, projection);\n }\n width = Math.min(width, max - min);\n }\n return width;\n}\n\nfunction validateEngineNumber(value: number): void {\n const rounded = Math.fround(value);\n if (!Number.isFinite(rounded) || (value !== 0 && rounded === 0))\n throw new RangeError(\n \"Physics value cannot be represented at 100 logical units per engine meter. Reduce extreme coordinates, speeds, forces, or shape dimensions.\",\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["cosine", "sine", "x", "y"]
|
|
7
7
|
}
|
|
@@ -19,7 +19,8 @@ async function loadSpriteSheet(url, options) {
|
|
|
19
19
|
let clips = {};
|
|
20
20
|
if ("grid" in options) {
|
|
21
21
|
const { frameWidth: w, frameHeight: h, margin = 0, spacing = 0 } = options.grid;
|
|
22
|
-
if (!
|
|
22
|
+
if (!(Number.isInteger(w) && Number.isInteger(h) && Number.isInteger(margin) && Number.isInteger(spacing)) || w <= 0 || h <= 0 || margin < 0 || spacing < 0)
|
|
23
|
+
throw new RangeError("Invalid sprite grid dimensions.");
|
|
23
24
|
const image = await load(url);
|
|
24
25
|
const frames2 = [];
|
|
25
26
|
for (let y = margin; y + h <= image.naturalHeight - margin; y += h + spacing)
|
|
@@ -38,12 +39,14 @@ async function loadSpriteSheet(url, options) {
|
|
|
38
39
|
const frames = /* @__PURE__ */ Object.create(null);
|
|
39
40
|
for (const spec of specs) {
|
|
40
41
|
const image = images[spec.page ?? 0], r = spec.rect;
|
|
41
|
-
if (!image || !
|
|
42
|
+
if (!image || !(Number.isFinite(r.x) && Number.isFinite(r.y) && Number.isFinite(r.width) && Number.isFinite(r.height)) || r.x < 0 || r.y < 0 || r.width <= 0 || r.height <= 0 || r.x + r.width > image.naturalWidth || r.y + r.height > image.naturalHeight)
|
|
43
|
+
throw new RangeError(`Invalid sprite rectangle: ${spec.name}`);
|
|
42
44
|
if (frames[spec.name]) throw new Error(`Duplicate sprite frame: ${spec.name}`);
|
|
43
45
|
const width = spec.sourceSize?.width ?? (spec.rotated ? r.height : r.width);
|
|
44
46
|
const height = spec.sourceSize?.height ?? (spec.rotated ? r.width : r.height);
|
|
45
47
|
const trim = { x: spec.trim?.x ?? 0, y: spec.trim?.y ?? 0 };
|
|
46
|
-
if (!
|
|
48
|
+
if (!(Number.isFinite(width) && Number.isFinite(height) && Number.isFinite(trim.x) && Number.isFinite(trim.y)) || width <= 0 || height <= 0 || trim.x < 0 || trim.y < 0 || trim.x + (spec.rotated ? r.height : r.width) > width || trim.y + (spec.rotated ? r.width : r.height) > height)
|
|
49
|
+
throw new RangeError(`Invalid sprite logical bounds: ${spec.name}`);
|
|
47
50
|
frames[spec.name] = makeFrame({ ...spec, rect: Object.freeze({ ...r }), sourceSize: Object.freeze({ width, height }), trim: Object.freeze(trim), image, owner });
|
|
48
51
|
}
|
|
49
52
|
const animations = /* @__PURE__ */ Object.create(null);
|