@pibbl/core 0.0.1 → 0.0.3-alpha.109.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/THIRD_PARTY_NOTICES.txt +81 -0
- package/dist/features/machines/animation.d.ts +64 -0
- package/dist/features/machines/animation.js +55 -0
- package/dist/features/machines/animation.js.map +7 -0
- package/dist/features/machines/animation.mjs +1 -0
- package/dist/features/machines/assign.d.ts +16 -0
- package/dist/features/machines/assign.js +15 -0
- package/dist/features/machines/assign.js.map +7 -0
- package/dist/features/machines/callback.d.ts +9 -0
- package/dist/features/machines/callback.js +7 -0
- package/dist/features/machines/callback.js.map +7 -0
- package/dist/features/machines/hook.d.ts +30 -0
- package/dist/features/machines/hook.js +37 -0
- package/dist/features/machines/hook.js.map +7 -0
- package/dist/features/machines/index.d.ts +6 -0
- package/dist/features/machines/index.js +12 -0
- package/dist/features/machines/index.js.map +7 -0
- package/dist/features/machines/index.mjs +1 -0
- package/dist/features/machines/runtime.d.ts +18 -0
- package/dist/features/machines/runtime.js +363 -0
- package/dist/features/machines/runtime.js.map +7 -0
- package/dist/features/machines/types.d.ts +164 -0
- package/dist/features/physics/2d-geometry.d.ts +3 -3
- package/dist/features/physics/2d-geometry.js.map +1 -1
- package/dist/features/physics/2d-testing.d.ts +1 -1
- package/dist/features/physics/2d-testing.js +2 -2
- package/dist/features/physics/2d-testing.js.map +2 -2
- package/dist/features/physics/2d.d.ts +115 -62
- package/dist/features/physics/2d.js +59 -28
- package/dist/features/physics/2d.js.map +2 -2
- package/dist/features/physics/lib/2d/canvas/components.js +25 -21
- package/dist/features/physics/lib/2d/canvas/components.js.map +2 -2
- package/dist/features/physics/lib/2d/canvas/presentation.js +1 -2
- package/dist/features/physics/lib/2d/canvas/presentation.js.map +2 -2
- package/dist/features/physics/lib/2d/collision/casts.js +4 -2
- package/dist/features/physics/lib/2d/collision/casts.js.map +2 -2
- package/dist/features/physics/lib/2d/query-types.d.ts +6 -0
- package/dist/features/physics/lib/2d/runtime/controller.d.ts +7 -6
- package/dist/features/physics/lib/2d/runtime/controller.js +1 -1
- package/dist/features/physics/lib/2d/runtime/controller.js.map +2 -2
- package/dist/features/physics/lib/2d/runtime/obstacles.js +9 -11
- package/dist/features/physics/lib/2d/runtime/obstacles.js.map +2 -2
- package/dist/features/physics/lib/2d/shapes.js +8 -9
- package/dist/features/physics/lib/2d/shapes.js.map +2 -2
- package/dist/features/physics/lib/2d/types.d.ts +8 -30
- package/dist/features/physics/lib/2d/world/queries.d.ts +7 -6
- package/dist/features/physics/lib/2d/world/queries.js.map +2 -2
- package/dist/features/physics/lib/2d/world/rapier.js +22 -26
- package/dist/features/physics/lib/2d/world/rapier.js.map +2 -2
- package/dist/features/sprites/formats/aseprite.d.ts +5 -0
- package/dist/features/sprites/formats/texture-packer.d.ts +5 -0
- package/dist/features/sprites/index.d.ts +6 -0
- package/dist/features/sprites/loader.d.ts +25 -0
- package/dist/features/sprites/loader.js +6 -3
- package/dist/features/sprites/loader.js.map +2 -2
- package/dist/features/sprites/model.d.ts +75 -0
- package/dist/features/sprites/sprite.d.ts +22 -0
- package/dist/features/textures/index.d.ts +12 -2
- package/dist/features/textures/index.js +33 -1
- package/dist/features/textures/index.js.map +2 -2
- package/dist/features/textures/lib/chemical-field.d.ts +56 -0
- package/dist/features/textures/lib/chemical-field.js +154 -0
- package/dist/features/textures/lib/chemical-field.js.map +7 -0
- package/dist/features/textures/lib/chemical-recipes.d.ts +119 -0
- package/dist/features/textures/lib/chemical-recipes.js +275 -0
- package/dist/features/textures/lib/chemical-recipes.js.map +7 -0
- package/dist/features/textures/lib/definitions.d.ts +3 -18
- package/dist/features/textures/lib/definitions.js +17 -24
- package/dist/features/textures/lib/definitions.js.map +2 -2
- package/dist/features/textures/lib/geometric-patterns.d.ts +149 -0
- package/dist/features/textures/lib/geometric-patterns.js +305 -0
- package/dist/features/textures/lib/geometric-patterns.js.map +7 -0
- package/dist/features/textures/lib/gray-scott.d.ts +55 -0
- package/dist/features/textures/lib/gray-scott.js +37 -0
- package/dist/features/textures/lib/gray-scott.js.map +7 -0
- package/dist/features/textures/lib/palette.js +1 -3
- package/dist/features/textures/lib/palette.js.map +2 -2
- package/dist/features/textures/lib/patterns.d.ts +123 -0
- package/dist/features/textures/lib/patterns.js +344 -0
- package/dist/features/textures/lib/patterns.js.map +7 -0
- package/dist/features/textures/lib/rain-drops.js +2 -1
- package/dist/features/textures/lib/rain-drops.js.map +2 -2
- package/dist/features/textures/lib/reaction-diffusion.d.ts +3 -2
- package/dist/features/textures/lib/reaction-diffusion.js +9 -20
- package/dist/features/textures/lib/reaction-diffusion.js.map +2 -2
- package/dist/features/textures/lib/simulation.d.ts +10 -4
- package/dist/features/textures/lib/simulation.js +23 -13
- package/dist/features/textures/lib/simulation.js.map +2 -2
- package/dist/features/textures/lib/wasm/electric.js +8 -1
- package/dist/features/textures/lib/wasm/electric.js.map +2 -2
- package/dist/features/textures/lib/water-surface.js +1 -3
- package/dist/features/textures/lib/water-surface.js.map +2 -2
- package/dist/features/viz/index.d.ts +92 -5
- package/dist/features/viz/index.js +202 -4
- package/dist/features/viz/index.js.map +2 -2
- package/dist/features/viz/inspection/bar.d.ts +79 -0
- package/dist/features/viz/inspection/bar.js +49 -0
- package/dist/features/viz/inspection/bar.js.map +7 -0
- package/dist/features/viz/inspection/candle.d.ts +156 -0
- package/dist/features/viz/inspection/candle.js +120 -0
- package/dist/features/viz/inspection/candle.js.map +7 -0
- package/dist/features/viz/inspection/capture-types.d.ts +65 -0
- package/dist/features/viz/inspection/capture.d.ts +16 -0
- package/dist/features/viz/inspection/capture.js +49 -0
- package/dist/features/viz/inspection/capture.js.map +7 -0
- package/dist/features/viz/inspection/handler.d.ts +36 -0
- package/dist/features/viz/inspection/handler.js +91 -0
- package/dist/features/viz/inspection/handler.js.map +7 -0
- package/dist/features/viz/inspection/ohlc-bar.d.ts +132 -0
- package/dist/features/viz/inspection/ohlc-bar.js +118 -0
- package/dist/features/viz/inspection/ohlc-bar.js.map +7 -0
- package/dist/features/viz/inspection/owned-ref.d.ts +16 -0
- package/dist/features/viz/inspection/owned-ref.js +99 -0
- package/dist/features/viz/inspection/owned-ref.js.map +7 -0
- package/dist/features/viz/inspection/painted-point.d.ts +22 -0
- package/dist/features/viz/inspection/painted-point.js +29 -0
- package/dist/features/viz/inspection/painted-point.js.map +7 -0
- package/dist/features/viz/inspection/queries.d.ts +100 -0
- package/dist/features/viz/inspection/queries.js +192 -0
- package/dist/features/viz/inspection/queries.js.map +7 -0
- package/dist/features/viz/inspection/query-types.d.ts +177 -0
- package/dist/features/viz/inspection/volume.d.ts +104 -0
- package/dist/features/viz/inspection/volume.js +95 -0
- package/dist/features/viz/inspection/volume.js.map +7 -0
- package/dist/features/viz/inspection.d.ts +19 -0
- package/dist/features/viz/inspection.js +54 -0
- package/dist/features/viz/inspection.js.map +7 -0
- package/dist/features/viz/inspection.mjs +1 -0
- package/dist/features/viz/lib/area-series.d.ts +62 -0
- package/dist/features/viz/lib/area-series.js +120 -0
- package/dist/features/viz/lib/area-series.js.map +7 -0
- package/dist/features/viz/lib/axis-labels.d.ts +2 -0
- package/dist/features/viz/lib/axis-labels.js +41 -0
- package/dist/features/viz/lib/axis-labels.js.map +7 -0
- package/dist/features/viz/lib/axis-title.d.ts +23 -0
- package/dist/features/viz/lib/axis-title.js +24 -0
- package/dist/features/viz/lib/axis-title.js.map +7 -0
- package/dist/features/viz/lib/axis.d.ts +1 -1
- package/dist/features/viz/lib/axis.js +50 -50
- package/dist/features/viz/lib/axis.js.map +2 -2
- package/dist/features/viz/lib/bar-scale.d.ts +7 -0
- package/dist/features/viz/lib/bar-scale.js +34 -0
- package/dist/features/viz/lib/bar-scale.js.map +7 -0
- package/dist/features/viz/lib/bar-series.d.ts +3 -1
- package/dist/features/viz/lib/bar-series.js +21 -5
- package/dist/features/viz/lib/bar-series.js.map +2 -2
- package/dist/features/viz/lib/baseline-series.d.ts +55 -0
- package/dist/features/viz/lib/baseline-series.js +136 -0
- package/dist/features/viz/lib/baseline-series.js.map +7 -0
- package/dist/features/viz/lib/candlestick-series.d.ts +62 -0
- package/dist/features/viz/lib/candlestick-series.js +150 -0
- package/dist/features/viz/lib/candlestick-series.js.map +7 -0
- package/dist/features/viz/lib/censored-point-series.d.ts +71 -0
- package/dist/features/viz/lib/censored-point-series.js +129 -0
- package/dist/features/viz/lib/censored-point-series.js.map +7 -0
- package/dist/features/viz/lib/chart-lines.d.ts +41 -0
- package/dist/features/viz/lib/chart-lines.js +32 -0
- package/dist/features/viz/lib/chart-lines.js.map +7 -0
- package/dist/features/viz/lib/color-context.d.ts +4 -0
- package/dist/features/viz/lib/color-context.js +41 -0
- package/dist/features/viz/lib/color-context.js.map +7 -0
- package/dist/features/viz/lib/color-math.d.ts +4 -0
- package/dist/features/viz/lib/color-math.js +31 -0
- package/dist/features/viz/lib/color-math.js.map +7 -0
- package/dist/features/viz/lib/color-types.d.ts +53 -0
- package/dist/features/viz/lib/curve-definition.d.ts +49 -0
- package/dist/features/viz/lib/curve-definition.js +142 -0
- package/dist/features/viz/lib/curve-definition.js.map +7 -0
- package/dist/features/viz/lib/diverging-color-scale.d.ts +11 -0
- package/dist/features/viz/lib/diverging-color-scale.js +51 -0
- package/dist/features/viz/lib/diverging-color-scale.js.map +7 -0
- package/dist/features/viz/lib/domain-navigation.d.ts +40 -0
- package/dist/features/viz/lib/domain-navigation.js +77 -0
- package/dist/features/viz/lib/domain-navigation.js.map +7 -0
- package/dist/features/viz/lib/editable-chart-elements.d.ts +178 -0
- package/dist/features/viz/lib/editable-chart-elements.js +733 -0
- package/dist/features/viz/lib/editable-chart-elements.js.map +7 -0
- package/dist/features/viz/lib/financial-aggregation.d.ts +127 -0
- package/dist/features/viz/lib/financial-aggregation.js +116 -0
- package/dist/features/viz/lib/financial-aggregation.js.map +7 -0
- package/dist/features/viz/lib/financial-autoscale.d.ts +64 -0
- package/dist/features/viz/lib/financial-autoscale.js +61 -0
- package/dist/features/viz/lib/financial-autoscale.js.map +7 -0
- package/dist/features/viz/lib/financial-comparison.d.ts +62 -0
- package/dist/features/viz/lib/financial-comparison.js +98 -0
- package/dist/features/viz/lib/financial-comparison.js.map +7 -0
- package/dist/features/viz/lib/financial-geometry.d.ts +77 -0
- package/dist/features/viz/lib/financial-geometry.js +67 -0
- package/dist/features/viz/lib/financial-geometry.js.map +7 -0
- package/dist/features/viz/lib/financial-indicators.d.ts +114 -0
- package/dist/features/viz/lib/financial-indicators.js +135 -0
- package/dist/features/viz/lib/financial-indicators.js.map +7 -0
- package/dist/features/viz/lib/financial-oscillators.d.ts +171 -0
- package/dist/features/viz/lib/financial-oscillators.js +265 -0
- package/dist/features/viz/lib/financial-oscillators.js.map +7 -0
- package/dist/features/viz/lib/graph/bipartite.d.ts +14 -0
- package/dist/features/viz/lib/graph/bipartite.js +250 -0
- package/dist/features/viz/lib/graph/bipartite.js.map +7 -0
- package/dist/features/viz/lib/graph/chord.d.ts +44 -0
- package/dist/features/viz/lib/graph/chord.js +348 -0
- package/dist/features/viz/lib/graph/chord.js.map +7 -0
- package/dist/features/viz/lib/graph/dependency.d.ts +26 -0
- package/dist/features/viz/lib/graph/dependency.js +140 -0
- package/dist/features/viz/lib/graph/dependency.js.map +7 -0
- package/dist/features/viz/lib/graph/force.d.ts +28 -0
- package/dist/features/viz/lib/graph/force.js +580 -0
- package/dist/features/viz/lib/graph/force.js.map +7 -0
- package/dist/features/viz/lib/graph/hierarchy.d.ts +21 -0
- package/dist/features/viz/lib/graph/hierarchy.js +112 -0
- package/dist/features/viz/lib/graph/hierarchy.js.map +7 -0
- package/dist/features/viz/lib/graph/icicle.d.ts +16 -0
- package/dist/features/viz/lib/graph/icicle.js +153 -0
- package/dist/features/viz/lib/graph/icicle.js.map +7 -0
- package/dist/features/viz/lib/graph/matrix.d.ts +30 -0
- package/dist/features/viz/lib/graph/matrix.js +243 -0
- package/dist/features/viz/lib/graph/matrix.js.map +7 -0
- package/dist/features/viz/lib/graph/neighborhood.d.ts +11 -0
- package/dist/features/viz/lib/graph/neighborhood.js +281 -0
- package/dist/features/viz/lib/graph/neighborhood.js.map +7 -0
- package/dist/features/viz/lib/graph/routes.d.ts +35 -0
- package/dist/features/viz/lib/graph/routes.js +101 -0
- package/dist/features/viz/lib/graph/routes.js.map +7 -0
- package/dist/features/viz/lib/graph/sankey.d.ts +44 -0
- package/dist/features/viz/lib/graph/sankey.js +341 -0
- package/dist/features/viz/lib/graph/sankey.js.map +7 -0
- package/dist/features/viz/lib/graph/shared.d.ts +59 -0
- package/dist/features/viz/lib/graph/shared.js +301 -0
- package/dist/features/viz/lib/graph/shared.js.map +7 -0
- package/dist/features/viz/lib/graph/tree.d.ts +11 -0
- package/dist/features/viz/lib/graph/tree.js +232 -0
- package/dist/features/viz/lib/graph/tree.js.map +7 -0
- package/dist/features/viz/lib/graph/treemap.d.ts +20 -0
- package/dist/features/viz/lib/graph/treemap.js +227 -0
- package/dist/features/viz/lib/graph/treemap.js.map +7 -0
- package/dist/features/viz/lib/graph/types.d.ts +1097 -0
- package/dist/features/viz/lib/hover-card.js +8 -9
- package/dist/features/viz/lib/hover-card.js.map +2 -2
- package/dist/features/viz/lib/hover-data.d.ts +1 -1
- package/dist/features/viz/lib/hover-data.js +6 -3
- package/dist/features/viz/lib/hover-data.js.map +2 -2
- package/dist/features/viz/lib/hover-types.d.ts +5 -5
- package/dist/features/viz/lib/interval-band-series.d.ts +49 -0
- package/dist/features/viz/lib/interval-band-series.js +136 -0
- package/dist/features/viz/lib/interval-band-series.js.map +7 -0
- package/dist/features/viz/lib/interval-diamond-series.d.ts +43 -0
- package/dist/features/viz/lib/interval-diamond-series.js +122 -0
- package/dist/features/viz/lib/interval-diamond-series.js.map +7 -0
- package/dist/features/viz/lib/interval-series.d.ts +79 -0
- package/dist/features/viz/lib/interval-series.js +158 -0
- package/dist/features/viz/lib/interval-series.js.map +7 -0
- package/dist/features/viz/lib/layout-pie.js +9 -13
- package/dist/features/viz/lib/layout-pie.js.map +2 -2
- package/dist/features/viz/lib/line-series.d.ts +1 -1
- package/dist/features/viz/lib/line-series.js +47 -28
- package/dist/features/viz/lib/line-series.js.map +2 -2
- package/dist/features/viz/lib/linear-scale-component.d.ts +7 -0
- package/dist/features/viz/lib/linear-scale-component.js +18 -0
- package/dist/features/viz/lib/linear-scale-component.js.map +7 -0
- package/dist/features/viz/lib/linear-scale.js +1 -1
- package/dist/features/viz/lib/linear-scale.js.map +2 -2
- package/dist/features/viz/lib/log-scale-component.d.ts +7 -0
- package/dist/features/viz/lib/log-scale-component.js +19 -0
- package/dist/features/viz/lib/log-scale-component.js.map +7 -0
- package/dist/features/viz/lib/log-scale.d.ts +2 -0
- package/dist/features/viz/lib/log-scale.js +53 -0
- package/dist/features/viz/lib/log-scale.js.map +7 -0
- package/dist/features/viz/lib/monotone-curve.d.ts +11 -0
- package/dist/features/viz/lib/monotone-curve.js +63 -0
- package/dist/features/viz/lib/monotone-curve.js.map +7 -0
- package/dist/features/viz/lib/nearest.d.ts +9 -9
- package/dist/features/viz/lib/nearest.js.map +1 -1
- package/dist/features/viz/lib/numeric-range-interpolation.d.ts +15 -0
- package/dist/features/viz/lib/numeric-range-interpolation.js +36 -0
- package/dist/features/viz/lib/numeric-range-interpolation.js.map +7 -0
- package/dist/features/viz/lib/numeric-ticks.d.ts +38 -0
- package/dist/features/viz/lib/numeric-ticks.js +54 -0
- package/dist/features/viz/lib/numeric-ticks.js.map +7 -0
- package/dist/features/viz/lib/ohlc-bar-series.d.ts +55 -0
- package/dist/features/viz/lib/ohlc-bar-series.js +168 -0
- package/dist/features/viz/lib/ohlc-bar-series.js.map +7 -0
- package/dist/features/viz/lib/paired-series.d.ts +44 -0
- package/dist/features/viz/lib/paired-series.js +93 -0
- package/dist/features/viz/lib/paired-series.js.map +7 -0
- package/dist/features/viz/lib/pie-layout.js +2 -1
- package/dist/features/viz/lib/pie-layout.js.map +2 -2
- package/dist/features/viz/lib/plot-series.js +11 -6
- package/dist/features/viz/lib/plot-series.js.map +2 -2
- package/dist/features/viz/lib/plot-types.d.ts +4 -3
- package/dist/features/viz/lib/point-scale-component.d.ts +7 -0
- package/dist/features/viz/lib/point-scale-component.js +19 -0
- package/dist/features/viz/lib/point-scale-component.js.map +7 -0
- package/dist/features/viz/lib/point-scale.d.ts +2 -0
- package/dist/features/viz/lib/point-scale.js +45 -0
- package/dist/features/viz/lib/point-scale.js.map +7 -0
- package/dist/features/viz/lib/point-series.d.ts +1 -1
- package/dist/features/viz/lib/point-series.js +36 -9
- package/dist/features/viz/lib/point-series.js.map +2 -2
- package/dist/features/viz/lib/point-types.d.ts +5 -2
- package/dist/features/viz/lib/reference-band.d.ts +16 -0
- package/dist/features/viz/lib/reference-band.js +30 -0
- package/dist/features/viz/lib/reference-band.js.map +7 -0
- package/dist/features/viz/lib/scale-adjust.js +9 -4
- package/dist/features/viz/lib/scale-adjust.js.map +2 -2
- package/dist/features/viz/lib/scale-context.d.ts +5 -4
- package/dist/features/viz/lib/scale-context.js +15 -11
- package/dist/features/viz/lib/scale-context.js.map +2 -2
- package/dist/features/viz/lib/scale-provider.d.ts +2 -0
- package/dist/features/viz/lib/scale-provider.js +13 -0
- package/dist/features/viz/lib/scale-provider.js.map +7 -0
- package/dist/features/viz/lib/scale-ticks.d.ts +5 -0
- package/dist/features/viz/lib/scale-ticks.js +64 -0
- package/dist/features/viz/lib/scale-ticks.js.map +7 -0
- package/dist/features/viz/lib/scale-view.d.ts +4 -0
- package/dist/features/viz/lib/scale-view.js +21 -0
- package/dist/features/viz/lib/scale-view.js.map +7 -0
- package/dist/features/viz/lib/sequential-color-scale.d.ts +11 -0
- package/dist/features/viz/lib/sequential-color-scale.js +49 -0
- package/dist/features/viz/lib/sequential-color-scale.js.map +7 -0
- package/dist/features/viz/lib/series-position.d.ts +12 -0
- package/dist/features/viz/lib/series-position.js +44 -0
- package/dist/features/viz/lib/series-position.js.map +7 -0
- package/dist/features/viz/lib/step-curves.d.ts +19 -0
- package/dist/features/viz/lib/step-curves.js +53 -0
- package/dist/features/viz/lib/step-curves.js.map +7 -0
- package/dist/features/viz/lib/symlog-scale-component.d.ts +7 -0
- package/dist/features/viz/lib/symlog-scale-component.js +19 -0
- package/dist/features/viz/lib/symlog-scale-component.js.map +7 -0
- package/dist/features/viz/lib/symlog-scale.d.ts +2 -0
- package/dist/features/viz/lib/symlog-scale.js +38 -0
- package/dist/features/viz/lib/symlog-scale.js.map +7 -0
- package/dist/features/viz/lib/threshold-color-scale.d.ts +43 -0
- package/dist/features/viz/lib/threshold-color-scale.js +59 -0
- package/dist/features/viz/lib/threshold-color-scale.js.map +7 -0
- package/dist/features/viz/lib/trading-time-mapping.d.ts +32 -0
- package/dist/features/viz/lib/trading-time-mapping.js +89 -0
- package/dist/features/viz/lib/trading-time-mapping.js.map +7 -0
- package/dist/features/viz/lib/trading-time-scale.d.ts +83 -0
- package/dist/features/viz/lib/trading-time-scale.js +96 -0
- package/dist/features/viz/lib/trading-time-scale.js.map +7 -0
- package/dist/features/viz/lib/trajectory-series.d.ts +71 -0
- package/dist/features/viz/lib/trajectory-series.js +111 -0
- package/dist/features/viz/lib/trajectory-series.js.map +7 -0
- package/dist/features/viz/lib/types.d.ts +114 -21
- package/dist/features/viz/lib/use-bar-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-bar-scale.js +9 -0
- package/dist/features/viz/lib/use-bar-scale.js.map +7 -0
- package/dist/features/viz/lib/use-continuous-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-continuous-scale.js +14 -0
- package/dist/features/viz/lib/use-continuous-scale.js.map +7 -0
- package/dist/features/viz/lib/use-linear-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-linear-scale.js +9 -0
- package/dist/features/viz/lib/use-linear-scale.js.map +7 -0
- package/dist/features/viz/lib/use-log-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-log-scale.js +9 -0
- package/dist/features/viz/lib/use-log-scale.js.map +7 -0
- package/dist/features/viz/lib/use-point-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-point-scale.js +9 -0
- package/dist/features/viz/lib/use-point-scale.js.map +7 -0
- package/dist/features/viz/lib/use-symlog-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-symlog-scale.js +9 -0
- package/dist/features/viz/lib/use-symlog-scale.js.map +7 -0
- package/dist/features/viz/lib/use-utc-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-utc-scale.js +9 -0
- package/dist/features/viz/lib/use-utc-scale.js.map +7 -0
- package/dist/features/viz/lib/utc-labels.d.ts +12 -0
- package/dist/features/viz/lib/utc-labels.js +27 -0
- package/dist/features/viz/lib/utc-labels.js.map +7 -0
- package/dist/features/viz/lib/utc-scale-component.d.ts +7 -0
- package/dist/features/viz/lib/utc-scale-component.js +18 -0
- package/dist/features/viz/lib/utc-scale-component.js.map +7 -0
- package/dist/features/viz/lib/utc-scale.d.ts +21 -0
- package/dist/features/viz/lib/utc-scale.js +124 -0
- package/dist/features/viz/lib/utc-scale.js.map +7 -0
- package/dist/features/viz/lib/volume-series.d.ts +59 -0
- package/dist/features/viz/lib/volume-series.js +117 -0
- package/dist/features/viz/lib/volume-series.js.map +7 -0
- package/dist/features/viz/lib/weighted-point-series.d.ts +71 -0
- package/dist/features/viz/lib/weighted-point-series.js +169 -0
- package/dist/features/viz/lib/weighted-point-series.js.map +7 -0
- package/dist/filters/backdrop-contrast-gpu.d.ts +5 -0
- package/dist/filters/backdrop-contrast-gpu.js +33 -0
- package/dist/filters/backdrop-contrast-gpu.js.map +7 -0
- package/dist/filters/backdrop-contrast.d.ts +21 -0
- package/dist/filters/backdrop-contrast.js +61 -0
- package/dist/filters/backdrop-contrast.js.map +7 -0
- package/dist/filters/displacement.js +1 -1
- package/dist/filters/displacement.js.map +2 -2
- package/dist/filters/emboss-gpu.d.ts +4 -0
- package/dist/filters/emboss-gpu.js +39 -0
- package/dist/filters/emboss-gpu.js.map +7 -0
- package/dist/filters/emboss.d.ts +32 -0
- package/dist/filters/emboss.js +104 -0
- package/dist/filters/emboss.js.map +7 -0
- package/dist/filters/filter-executor.d.ts +11 -4
- package/dist/filters/filter-executor.js +104 -49
- package/dist/filters/filter-executor.js.map +2 -2
- package/dist/filters/reflected-light.js +1 -1
- package/dist/filters/reflected-light.js.map +2 -2
- package/dist/filters/reflection-gpu.d.ts +3 -1
- package/dist/filters/reflection-gpu.js +5 -2
- package/dist/filters/reflection-gpu.js.map +2 -2
- package/dist/filters/render-backdrop-contrast-boundary.d.ts +31 -0
- package/dist/filters/render-backdrop-contrast-boundary.js +116 -0
- package/dist/filters/render-backdrop-contrast-boundary.js.map +7 -0
- package/dist/filters/render-emboss-boundary.d.ts +13 -0
- package/dist/filters/render-emboss-boundary.js +131 -0
- package/dist/filters/render-emboss-boundary.js.map +7 -0
- package/dist/filters.d.ts +9 -5
- package/dist/filters.js +4 -0
- package/dist/filters.js.map +2 -2
- package/dist/index.d.ts +10 -6
- package/dist/index.js +18 -2
- package/dist/index.js.map +2 -2
- package/dist/internal.d.ts +4 -0
- package/dist/internal.js +6 -0
- package/dist/internal.js.map +2 -2
- package/dist/layout-kernel.d.ts +12 -0
- package/dist/layout-kernel.js +11 -0
- package/dist/layout-kernel.js.map +7 -0
- package/dist/layout-kernel.mjs +1 -0
- package/dist/lib/animation/definition.d.ts +5 -3
- package/dist/lib/animation/definition.js +29 -4
- package/dist/lib/animation/definition.js.map +2 -2
- package/dist/lib/animation/playback.d.ts +8 -0
- package/dist/lib/animation/playback.js +33 -11
- package/dist/lib/animation/playback.js.map +2 -2
- package/dist/lib/animation/spring.d.ts +3 -1
- package/dist/lib/animation/spring.js.map +2 -2
- package/dist/lib/animation/types.d.ts +29 -73
- package/dist/lib/backend/types.d.ts +13 -1
- package/dist/lib/backend/types.js.map +2 -2
- package/dist/lib/components/arc-geometry.js +2 -1
- package/dist/lib/components/arc-geometry.js.map +2 -2
- package/dist/lib/components/g.js +2 -0
- package/dist/lib/components/g.js.map +2 -2
- package/dist/lib/components/html-box.js +2 -1
- package/dist/lib/components/html-box.js.map +2 -2
- package/dist/lib/components/img.js +3 -3
- package/dist/lib/components/img.js.map +2 -2
- package/dist/lib/components/layer.js +98 -16
- package/dist/lib/components/layer.js.map +3 -3
- package/dist/lib/components/text.d.ts +16 -0
- package/dist/lib/components/text.js +131 -24
- package/dist/lib/components/text.js.map +2 -2
- package/dist/lib/define-primitive.d.ts +4 -2
- package/dist/lib/define-primitive.js +3 -1
- package/dist/lib/define-primitive.js.map +2 -2
- package/dist/lib/element/metadata.d.ts +9 -0
- package/dist/lib/element/metadata.js +19 -0
- package/dist/lib/element/metadata.js.map +2 -2
- package/dist/lib/element/resolve-primitive-inputs.d.ts +2 -0
- package/dist/lib/element/resolve-primitive-inputs.js +17 -4
- package/dist/lib/element/resolve-primitive-inputs.js.map +2 -2
- package/dist/lib/events/event-facade.d.ts +18 -0
- package/dist/lib/events/event-facade.js +28 -2
- package/dist/lib/events/event-facade.js.map +2 -2
- package/dist/lib/events/hit-test.js +2 -1
- package/dist/lib/events/hit-test.js.map +2 -2
- package/dist/lib/events/propagation.d.ts +2 -1
- package/dist/lib/events/propagation.js +22 -16
- package/dist/lib/events/propagation.js.map +2 -2
- package/dist/lib/events/registrations.d.ts +10 -0
- package/dist/lib/events/registrations.js +160 -5
- package/dist/lib/events/registrations.js.map +2 -2
- package/dist/lib/execute-render.js +25 -1
- package/dist/lib/execute-render.js.map +2 -2
- package/dist/lib/filter/filter-region.js +3 -10
- package/dist/lib/filter/filter-region.js.map +2 -2
- package/dist/lib/focus/focus-manager.d.ts +8 -1
- package/dist/lib/focus/focus-manager.js +87 -43
- package/dist/lib/focus/focus-manager.js.map +2 -2
- package/dist/lib/focus/geometry.d.ts +2 -0
- package/dist/lib/focus/geometry.js +6 -0
- package/dist/lib/focus/geometry.js.map +2 -2
- package/dist/lib/geometry/path-bend-guide.js +1 -1
- package/dist/lib/geometry/path-bend-guide.js.map +2 -2
- package/dist/lib/geometry/path-geometry.js +12 -11
- package/dist/lib/geometry/path-geometry.js.map +2 -2
- package/dist/lib/geometry/path-transforms.js +17 -21
- package/dist/lib/geometry/path-transforms.js.map +2 -2
- package/dist/lib/geometry/path-warp-bezier.js +3 -1
- package/dist/lib/geometry/path-warp-bezier.js.map +2 -2
- package/dist/lib/geometry/path-warp.js +1 -1
- package/dist/lib/geometry/path-warp.js.map +2 -2
- package/dist/lib/global-state.js +2 -0
- package/dist/lib/global-state.js.map +2 -2
- package/dist/lib/hooks/use-animated-value.d.ts +11 -21
- package/dist/lib/hooks/use-animated-value.js +23 -70
- package/dist/lib/hooks/use-animated-value.js.map +3 -3
- package/dist/lib/hooks/use-playback.js +1 -0
- package/dist/lib/hooks/use-playback.js.map +2 -2
- package/dist/lib/html/html-events.d.ts +32 -0
- package/dist/lib/html/html-events.js +179 -0
- package/dist/lib/html/html-events.js.map +7 -0
- package/dist/lib/html/html-service.d.ts +8 -2
- package/dist/lib/html/html-service.js +198 -65
- package/dist/lib/html/html-service.js.map +2 -2
- package/dist/lib/html/overlay-config.js +7 -6
- package/dist/lib/html/overlay-config.js.map +2 -2
- package/dist/lib/html/types.d.ts +29 -2
- package/dist/lib/layout/absolute.d.ts +11 -5
- package/dist/lib/layout/absolute.js +329 -55
- package/dist/lib/layout/absolute.js.map +3 -3
- package/dist/lib/layout/allocation-checkpoint-owner.d.ts +11 -0
- package/dist/lib/layout/allocation-checkpoint-owner.js +86 -0
- package/dist/lib/layout/allocation-checkpoint-owner.js.map +7 -0
- package/dist/lib/layout/allocation-checkpoint.d.ts +53 -0
- package/dist/lib/layout/allocation-checkpoint.js +463 -0
- package/dist/lib/layout/allocation-checkpoint.js.map +7 -0
- package/dist/lib/layout/allocation-dependencies.d.ts +30 -0
- package/dist/lib/layout/allocation-dependencies.js +90 -0
- package/dist/lib/layout/allocation-dependencies.js.map +7 -0
- package/dist/lib/layout/allocation-revision.d.ts +13 -0
- package/dist/lib/layout/allocation-revision.js +67 -0
- package/dist/lib/layout/allocation-revision.js.map +7 -0
- package/dist/lib/layout/box-insets.d.ts +17 -0
- package/dist/lib/layout/box-insets.js +138 -0
- package/dist/lib/layout/box-insets.js.map +7 -0
- package/dist/lib/layout/box-sizing.d.ts +16 -0
- package/dist/lib/layout/box-sizing.js +77 -0
- package/dist/lib/layout/box-sizing.js.map +7 -0
- package/dist/lib/layout/box.js +42 -12
- package/dist/lib/layout/box.js.map +2 -2
- package/dist/lib/layout/canvas-measurement.d.ts +13 -0
- package/dist/lib/layout/canvas-measurement.js +57 -0
- package/dist/lib/layout/canvas-measurement.js.map +7 -0
- package/dist/lib/layout/context.d.ts +35 -6
- package/dist/lib/layout/context.js +72 -3
- package/dist/lib/layout/context.js.map +2 -2
- package/dist/lib/layout/define-layout-component.d.ts +23 -0
- package/dist/lib/layout/define-layout-component.js +84 -0
- package/dist/lib/layout/define-layout-component.js.map +7 -0
- package/dist/lib/layout/flex-allocation-cache.d.ts +42 -0
- package/dist/lib/layout/flex-baseline-mode.d.ts +2 -0
- package/dist/lib/layout/flex-baseline-mode.js +7 -0
- package/dist/lib/layout/flex-baseline-mode.js.map +7 -0
- package/dist/lib/layout/flex.d.ts +50 -15
- package/dist/lib/layout/flex.js +2124 -195
- package/dist/lib/layout/flex.js.map +3 -3
- package/dist/lib/layout/flow.js +225 -49
- package/dist/lib/layout/flow.js.map +2 -2
- package/dist/lib/layout/geometry-publication.d.ts +53 -0
- package/dist/lib/layout/geometry-publication.js +244 -0
- package/dist/lib/layout/geometry-publication.js.map +7 -0
- package/dist/lib/layout/grid-kernel.d.ts +63 -0
- package/dist/lib/layout/grid-kernel.js +168 -0
- package/dist/lib/layout/grid-kernel.js.map +7 -0
- package/dist/lib/layout/grid.d.ts +63 -4
- package/dist/lib/layout/grid.js +767 -171
- package/dist/lib/layout/grid.js.map +3 -3
- package/dist/lib/layout/measure.d.ts +55 -3
- package/dist/lib/layout/measure.js +448 -15
- package/dist/lib/layout/measure.js.map +2 -2
- package/dist/lib/layout/overlay.js +81 -23
- package/dist/lib/layout/overlay.js.map +2 -2
- package/dist/lib/layout/participation.d.ts +27 -0
- package/dist/lib/layout/participation.js +188 -0
- package/dist/lib/layout/participation.js.map +7 -0
- package/dist/lib/layout/place-child.js +1 -1
- package/dist/lib/layout/place-child.js.map +2 -2
- package/dist/lib/layout/positioning-diagnostics.d.ts +1 -1
- package/dist/lib/layout/positioning-diagnostics.js +13 -2
- package/dist/lib/layout/positioning-diagnostics.js.map +2 -2
- package/dist/lib/layout/prepared-root.d.ts +121 -0
- package/dist/lib/layout/prepared-root.js +360 -0
- package/dist/lib/layout/prepared-root.js.map +7 -0
- package/dist/lib/layout/standalone-kernel.d.ts +60 -0
- package/dist/lib/layout/standalone-kernel.js +722 -0
- package/dist/lib/layout/standalone-kernel.js.map +7 -0
- package/dist/lib/layout/topology.d.ts +21 -0
- package/dist/lib/layout/topology.js +113 -0
- package/dist/lib/layout/topology.js.map +7 -0
- package/dist/lib/layout/types.d.ts +5 -0
- package/dist/lib/layout/wasm/artifact.d.ts +1 -0
- package/dist/lib/layout/wasm/artifact.js +5 -0
- package/dist/lib/layout/wasm/artifact.js.map +7 -0
- package/dist/lib/layout/wasm/bytes.d.ts +1 -0
- package/dist/lib/layout/wasm/bytes.js +5 -0
- package/dist/lib/layout/wasm/bytes.js.map +7 -0
- package/dist/lib/layout/wasm/embedded.d.ts +2 -0
- package/dist/lib/layout/wasm/embedded.js +12 -0
- package/dist/lib/layout/wasm/embedded.js.map +7 -0
- package/dist/lib/layout/wasm/layout.wasm +0 -0
- package/dist/lib/layout/wasm/module.d.ts +8 -0
- package/dist/lib/layout/wasm/module.js +70 -0
- package/dist/lib/layout/wasm/module.js.map +7 -0
- package/dist/lib/layout/wasm/region.d.ts +267 -0
- package/dist/lib/layout/wasm/region.js +1018 -0
- package/dist/lib/layout/wasm/region.js.map +7 -0
- package/dist/lib/manipulation/controller.js +4 -7
- package/dist/lib/manipulation/controller.js.map +2 -2
- package/dist/lib/manipulation/frame.js +1 -1
- package/dist/lib/manipulation/frame.js.map +2 -2
- package/dist/lib/manipulation/handles.js +32 -33
- package/dist/lib/manipulation/handles.js.map +2 -2
- package/dist/lib/manipulation/solve.js +12 -10
- package/dist/lib/manipulation/solve.js.map +2 -2
- package/dist/lib/mount-pibbl.js +1 -0
- package/dist/lib/mount-pibbl.js.map +2 -2
- package/dist/lib/mount-prepared-pibbl.d.ts +5 -0
- package/dist/lib/mount-prepared-pibbl.js +29 -0
- package/dist/lib/mount-prepared-pibbl.js.map +7 -0
- package/dist/lib/mount-request.d.ts +8 -0
- package/dist/lib/mount-request.js +41 -0
- package/dist/lib/mount-request.js.map +7 -0
- package/dist/lib/pibbl.d.ts +21 -13
- package/dist/lib/pibbl.js +18 -16
- package/dist/lib/pibbl.js.map +2 -2
- package/dist/lib/recording/recording.d.ts +43 -0
- package/dist/lib/recording/recording.js +555 -0
- package/dist/lib/recording/recording.js.map +7 -0
- package/dist/lib/recording/types.d.ts +118 -0
- package/dist/lib/recording/wasm-bytes.d.ts +1 -0
- package/dist/lib/recording/wasm-bytes.js +5 -0
- package/dist/lib/recording/wasm-bytes.js.map +7 -0
- package/dist/lib/recording/worker-source.d.ts +1 -0
- package/dist/lib/recording/worker-source.js +5 -0
- package/dist/lib/recording/worker-source.js.map +7 -0
- package/dist/lib/render-layer/controller.d.ts +9 -3
- package/dist/lib/render-layer/controller.js +259 -110
- package/dist/lib/render-layer/controller.js.map +2 -2
- package/dist/lib/render-transaction.d.ts +12 -2
- package/dist/lib/render-transaction.js +69 -1
- package/dist/lib/render-transaction.js.map +2 -2
- package/dist/lib/render.js +32 -8
- package/dist/lib/render.js.map +2 -2
- package/dist/lib/scheduler/realm-scheduler.d.ts +2 -0
- package/dist/lib/scheduler/realm-scheduler.js +55 -26
- package/dist/lib/scheduler/realm-scheduler.js.map +2 -2
- package/dist/lib/scheduler/renderer-participant.js +1 -0
- package/dist/lib/scheduler/renderer-participant.js.map +2 -2
- package/dist/lib/series-inspection-frame.d.ts +18 -0
- package/dist/lib/series-inspection-frame.js +70 -0
- package/dist/lib/series-inspection-frame.js.map +7 -0
- package/dist/lib/signals/edge.d.ts +7 -4
- package/dist/lib/signals/edge.js +25 -3
- package/dist/lib/signals/edge.js.map +2 -2
- package/dist/lib/signals/graph.d.ts +16 -2
- package/dist/lib/signals/graph.js +54 -12
- package/dist/lib/signals/graph.js.map +2 -2
- package/dist/lib/signals/input-provision.d.ts +15 -0
- package/dist/lib/signals/input-provision.js +53 -3
- package/dist/lib/signals/input-provision.js.map +2 -2
- package/dist/lib/signals/render-consumer.d.ts +3 -0
- package/dist/lib/signals/render-consumer.js +22 -14
- package/dist/lib/signals/render-consumer.js.map +2 -2
- package/dist/lib/style/positioning.d.ts +50 -2
- package/dist/lib/style/positioning.js +28 -4
- package/dist/lib/style/positioning.js.map +2 -2
- package/dist/lib/style/resolve-built-in.d.ts +4 -3
- package/dist/lib/style/resolve-built-in.js +17 -3
- package/dist/lib/style/resolve-built-in.js.map +2 -2
- package/dist/lib/style/resolve-dispatch.d.ts +3 -0
- package/dist/lib/style/resolve-dispatch.js +77 -4
- package/dist/lib/style/resolve-dispatch.js.map +2 -2
- package/dist/lib/style/resolve-length.d.ts +2 -0
- package/dist/lib/style/resolve-length.js +13 -9
- package/dist/lib/style/resolve-length.js.map +2 -2
- package/dist/lib/style/sizing-length.d.ts +51 -0
- package/dist/lib/style/sizing-length.js +77 -0
- package/dist/lib/style/sizing-length.js.map +7 -0
- package/dist/lib/style/types.d.ts +63 -25
- package/dist/lib/surface/root-surface.js +10 -6
- package/dist/lib/surface/root-surface.js.map +2 -2
- package/dist/lib/textures/texture.js +10 -8
- package/dist/lib/textures/texture.js.map +2 -2
- package/dist/lib/transitions/capture.js +4 -1
- package/dist/lib/transitions/capture.js.map +2 -2
- package/dist/lib/transitions/embers-physics.js +17 -10
- package/dist/lib/transitions/embers-physics.js.map +2 -2
- package/dist/lib/types.d.ts +110 -1
- package/dist/sync.d.ts +16 -0
- package/dist/sync.js +13 -0
- package/dist/sync.js.map +7 -0
- package/dist/sync.mjs +1 -0
- package/package.json +43 -6
- package/dist/features/viz/lib/scale.d.ts +0 -11
- package/dist/features/viz/lib/scale.js +0 -80
- package/dist/features/viz/lib/scale.js.map +0 -7
- package/dist/features/viz/lib/use-scale.d.ts +0 -20
- package/dist/features/viz/lib/use-scale.js +0 -10
- package/dist/features/viz/lib/use-scale.js.map +0 -7
|
@@ -6,6 +6,27 @@ import {
|
|
|
6
6
|
import { boundsOfShape2D, capsuleShape2D, chainShape2D, segmentShape2D } from "../shapes.js";
|
|
7
7
|
import { requireShapeRecord2D } from "../shape-records.js";
|
|
8
8
|
import { installCustomShapeResolver2D } from "./inference.js";
|
|
9
|
+
const layoutPropertyKeys = [
|
|
10
|
+
"width",
|
|
11
|
+
"height",
|
|
12
|
+
"minWidth",
|
|
13
|
+
"maxWidth",
|
|
14
|
+
"minHeight",
|
|
15
|
+
"maxHeight",
|
|
16
|
+
"padding",
|
|
17
|
+
"overflow",
|
|
18
|
+
"left",
|
|
19
|
+
"top",
|
|
20
|
+
"alignSelf",
|
|
21
|
+
"justifySelf",
|
|
22
|
+
"flexBasis",
|
|
23
|
+
"flexGrow",
|
|
24
|
+
"flexShrink",
|
|
25
|
+
"gridColumnStart",
|
|
26
|
+
"gridColumnSpan",
|
|
27
|
+
"gridRowStart",
|
|
28
|
+
"gridRowSpan"
|
|
29
|
+
];
|
|
9
30
|
function renderPhysicsShape2D(props, style, context) {
|
|
10
31
|
renderShape(props, style, style.shape, context);
|
|
11
32
|
}
|
|
@@ -154,27 +175,10 @@ function appendCapsule(path, start, end, radius) {
|
|
|
154
175
|
}
|
|
155
176
|
function stripLayout(style) {
|
|
156
177
|
const result = { ...style };
|
|
157
|
-
for (
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
"maxWidth",
|
|
162
|
-
"minHeight",
|
|
163
|
-
"maxHeight",
|
|
164
|
-
"padding",
|
|
165
|
-
"overflow",
|
|
166
|
-
"left",
|
|
167
|
-
"top",
|
|
168
|
-
"alignSelf",
|
|
169
|
-
"justifySelf",
|
|
170
|
-
"flexBasis",
|
|
171
|
-
"flexGrow",
|
|
172
|
-
"flexShrink",
|
|
173
|
-
"gridColumnStart",
|
|
174
|
-
"gridColumnSpan",
|
|
175
|
-
"gridRowStart",
|
|
176
|
-
"gridRowSpan"
|
|
177
|
-
]) delete result[key];
|
|
178
|
+
for (let keyIndex = 0; keyIndex < layoutPropertyKeys.length; keyIndex++) {
|
|
179
|
+
const key = layoutPropertyKeys[keyIndex];
|
|
180
|
+
delete result[key];
|
|
181
|
+
}
|
|
178
182
|
return result;
|
|
179
183
|
}
|
|
180
184
|
function copyPoints(value, path) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/features/physics/lib/2d/canvas/components.ts"],
|
|
4
|
-
"sourcesContent": ["import { resolveTexturePaint } from '@pibbl/core/internal';\nimport type { FillStyle, StrokeStyle } from '@pibbl/core';\nimport {\n useEventTarget,\n definePrimitive,\n type RenderingContext2D,\n} from '@pibbl/core';\nimport type {\n Capsule2DProps,\n Capsule2DStyle,\n Chain2DProps,\n Chain2DStyle,\n PhysicsShape2DProps,\n PhysicsShape2DStyle,\n Segment2DProps,\n Segment2DStyle,\n} from '../types.js';\nimport type { PibblPhysicsShape2D, PibblPhysicsVector2 } from '../../../2d-geometry.js';\nimport { boundsOfShape2D, capsuleShape2D, chainShape2D, segmentShape2D } from '../shapes.js';\nimport { requireShapeRecord2D, type ConvexLeaf2D } from '../shape-records.js';\nimport { installCustomShapeResolver2D } from './inference.js';\n\ntype ResolvedPhysicsShapeStyle2D = Readonly<PhysicsShape2DStyle>;\ntype ResolvedCapsuleStyle2D = Omit<Readonly<Capsule2DStyle>, 'start' | 'end'> & {\n readonly start: PibblPhysicsVector2;\n readonly end: PibblPhysicsVector2;\n};\ntype ResolvedSegmentStyle2D = Omit<Readonly<Segment2DStyle>, 'start' | 'end'> & {\n readonly start: PibblPhysicsVector2;\n readonly end: PibblPhysicsVector2;\n};\ntype ResolvedChainStyle2D = Omit<Readonly<Chain2DStyle>, 'points'> & {\n readonly points: readonly PibblPhysicsVector2[];\n};\n\nfunction renderPhysicsShape2D(\n props: PhysicsShape2DProps,\n style: ResolvedPhysicsShapeStyle2D,\n context: RenderingContext2D,\n): void {\n renderShape(props, style, style.shape, context);\n}\n\nfunction renderCapsule2D(\n props: Capsule2DProps,\n style: Readonly<ResolvedCapsuleStyle2D>,\n context: RenderingContext2D,\n): void {\n renderShape(props, style, capsuleShape2D(style), context);\n}\n\nfunction renderSegment2D(\n props: Segment2DProps,\n style: Readonly<ResolvedSegmentStyle2D>,\n context: RenderingContext2D,\n): void {\n renderShape(props, style, segmentShape2D(style), context);\n}\n\nfunction renderChain2D(\n props: Chain2DProps,\n style: Readonly<ResolvedChainStyle2D>,\n context: RenderingContext2D,\n): void {\n renderShape(props, style, chainShape2D(style), context);\n}\n\n/**\n * Draws an immutable physics shape as a Canvas primitive with optional body or collider\n * attachment.\n *\n * @param props - Authored component inputs, supplied through JSX or createElement. See the linked\n * props and style types.\n * @throws When called directly; Pibbl mounts this component through JSX or createElement.\n *\n * @see {@link PhysicsShape2DProps}\n * @see {@link PhysicsShape2DStyle}\n */\nexport const PhysicsShape2D = definePrimitive<\n PhysicsShape2DProps,\n PhysicsShape2DStyle,\n PhysicsShape2DStyle,\n PhysicsShape2DStyle\n>(renderPhysicsShape2D, { resolveStyle: resolvePhysicsShapeStyle });\n\n/**\n * Draws a capsule between two endpoints with optional physics attachment.\n *\n * @param props - Authored component inputs, supplied through JSX or createElement. See the linked\n * props and style types.\n * @throws When called directly; Pibbl mounts this component through JSX or createElement.\n *\n * @see {@link Capsule2DProps}\n * @see {@link Capsule2DStyle}\n */\nexport const Capsule2D = definePrimitive<\n Capsule2DProps,\n Capsule2DStyle,\n Capsule2DStyle,\n ResolvedCapsuleStyle2D\n>(renderCapsule2D, { resolveStyle: style => ({\n ...stripLayout(style),\n start: copyPoint(style.start, 'Capsule2D.start'),\n end: copyPoint(style.end, 'Capsule2D.end'),\n radius: positive(style.radius, 'Capsule2D.radius'),\n}) });\n\n/**\n * Draws a line segment with optional physics attachment.\n *\n * @param props - Authored component inputs, supplied through JSX or createElement. See the linked\n * props and style types.\n * @throws When called directly; Pibbl mounts this component through JSX or createElement.\n *\n * @see {@link Segment2DProps}\n * @see {@link Segment2DStyle}\n */\nexport const Segment2D = definePrimitive<\n Segment2DProps,\n Segment2DStyle,\n Segment2DStyle,\n ResolvedSegmentStyle2D\n>(renderSegment2D, { resolveStyle: style => ({\n ...stripLayout(style),\n start: copyPoint(style.start, 'Segment2D.start'),\n end: copyPoint(style.end, 'Segment2D.end'),\n}) });\n\n/**\n * Draws an open or closed point chain with optional physics attachment.\n *\n * @param props - Authored component inputs, supplied through JSX or createElement. See the linked\n * props and style types.\n * @throws When called directly; Pibbl mounts this component through JSX or createElement.\n *\n * @see {@link Chain2DProps}\n * @see {@link Chain2DStyle}\n */\nexport const Chain2D = definePrimitive<\n Chain2DProps,\n Chain2DStyle,\n Chain2DStyle,\n ResolvedChainStyle2D\n>(renderChain2D, { resolveStyle: style => ({\n ...stripLayout(style),\n points: Object.freeze(style.points.map((point, index) => copyPoint(point, `Chain2D.points[${index}]`))),\n closed: style.closed ?? false,\n radius: nonnegative(style.radius ?? 0, 'Chain2D.radius'),\n}) });\n\ninstallCustomShapeResolver2D(PhysicsShape2D, style => requireShape(style.shape, 'PhysicsShape2D.shape'));\ninstallCustomShapeResolver2D(Capsule2D, style => capsuleShape2D({\n start: copyPoint(style.start, 'Capsule2D.start'),\n end: copyPoint(style.end, 'Capsule2D.end'),\n radius: positive(style.radius, 'Capsule2D.radius'),\n}));\ninstallCustomShapeResolver2D(Segment2D, style => segmentShape2D({\n start: copyPoint(style.start, 'Segment2D.start'),\n end: copyPoint(style.end, 'Segment2D.end'),\n}));\ninstallCustomShapeResolver2D(Chain2D, style => chainShape2D({\n points: copyPoints(style.points, 'Chain2D.points'),\n closed: style.closed === true,\n radius: nonnegative(style.radius ?? 0, 'Chain2D.radius'),\n}));\n\nfunction resolvePhysicsShapeStyle(style: Readonly<PhysicsShape2DStyle>): ResolvedPhysicsShapeStyle2D {\n requireShape(style.shape, 'PhysicsShape2D.shape');\n return stripLayout(style) as ResolvedPhysicsShapeStyle2D;\n}\n\nfunction renderShape(\n props: PhysicsShape2DProps,\n style: Readonly<{\n readonly fill?: FillStyle;\n readonly stroke?: StrokeStyle;\n readonly strokeWidth?: number;\n readonly opacity?: number;\n readonly cursor?: string;\n readonly lineInteractionWidth?: number;\n }>,\n shape: PibblPhysicsShape2D,\n context: RenderingContext2D,\n): void {\n const record = requireShapeRecord2D(shape);\n const path = pathForShape(shape);\n const opacity = style.opacity ?? 1;\n if (!Number.isFinite(opacity) || opacity < 0 || opacity > 1) {\n throw new RangeError('Physics shape opacity must be finite from zero through one.');\n }\n const bounds = boundsOfShape2D(shape);\n const paintBounds = {x: bounds.min[0], y: bounds.min[1], width: bounds.max[0]-bounds.min[0], height: bounds.max[1]-bounds.min[1]};\n context.globalAlpha *= opacity;\n if (style.fill !== undefined) {\n context.fillStyle = resolveTexturePaint(style.fill, context, paintBounds);\n context.fill(path);\n }\n const strokeWidth = nonnegative(style.strokeWidth ?? 0, 'Physics shape strokeWidth');\n if (style.stroke !== undefined && strokeWidth > 0) {\n context.strokeStyle = resolveTexturePaint(style.stroke, context, paintBounds);\n context.lineWidth = strokeWidth;\n context.stroke(path);\n }\n const interactivePath = props.pointerEvents === 'none' ? new Path2D() : path;\n useEventTarget(props, {\n path: interactivePath,\n fill: style.fill !== undefined && record.area > 0,\n lineInteractionWidth: style.lineInteractionWidth ?? strokeWidth,\n cursor: style.cursor,\n keyboardFocusable: props.keyboardFocusable,\n keyboardNavigationBounds: props.keyboardNavigationBounds ?? {\n x: bounds.min[0], y: bounds.min[1],\n width: bounds.max[0] - bounds.min[0], height: bounds.max[1] - bounds.min[1],\n },\n });\n}\n\nfunction pathForShape(shape: PibblPhysicsShape2D): Path2D {\n const record = requireShapeRecord2D(shape);\n const local = new Path2D();\n for (const leaf of record.leaves) appendLeaf(local, leaf);\n if (record.localPose.x === 0 && record.localPose.y === 0 && record.localPose.rotationRadians === 0) return local;\n const result = new Path2D();\n result.addPath(local, new DOMMatrix()\n .translate(record.localPose.x, record.localPose.y)\n .rotate(record.localPose.rotationRadians * 180 / Math.PI));\n return result;\n}\n\nfunction appendLeaf(path: Path2D, leaf: ConvexLeaf2D): void {\n switch (leaf.kind) {\n case 'circle':\n path.moveTo(leaf.center[0]! + leaf.radius, leaf.center[1]!);\n path.arc(leaf.center[0]!, leaf.center[1]!, leaf.radius, 0, Math.PI * 2);\n path.closePath();\n return;\n case 'ellipse':\n path.moveTo(leaf.center[0]! + leaf.radiusX, leaf.center[1]!);\n path.ellipse(leaf.center[0]!, leaf.center[1]!, leaf.radiusX, leaf.radiusY, leaf.rotationRadians, 0, Math.PI * 2);\n path.closePath();\n return;\n case 'box':\n path.rect(leaf.center[0]! - leaf.halfWidth, leaf.center[1]! - leaf.halfHeight, leaf.halfWidth * 2, leaf.halfHeight * 2);\n return;\n case 'rounded-box':\n path.roundRect(\n leaf.center[0]! - leaf.halfWidth,\n leaf.center[1]! - leaf.halfHeight,\n leaf.halfWidth * 2,\n leaf.halfHeight * 2,\n Array.from(leaf.radii),\n );\n return;\n case 'capsule':\n appendCapsule(path, leaf.start, leaf.end, leaf.radius);\n return;\n case 'segment':\n path.moveTo(leaf.start[0]!, leaf.start[1]!);\n path.lineTo(leaf.end[0]!, leaf.end[1]!);\n return;\n case 'polygon':\n path.moveTo(leaf.vertices[0]!, leaf.vertices[1]!);\n for (let index = 2; index < leaf.vertices.length; index += 2) path.lineTo(leaf.vertices[index]!, leaf.vertices[index + 1]!);\n path.closePath();\n }\n}\n\nfunction appendCapsule(path: Path2D, start: Float64Array, end: Float64Array, radius: number): void {\n const dx = end[0]! - start[0]!, dy = end[1]! - start[1]!, length = Math.hypot(dx, dy);\n if (length === 0) {\n path.moveTo(start[0]! + radius, start[1]!);\n path.arc(start[0]!, start[1]!, radius, 0, Math.PI * 2);\n path.closePath();\n return;\n }\n const normal = Math.atan2(dy, dx) - Math.PI / 2;\n path.moveTo(start[0]! + Math.cos(normal) * radius, start[1]! + Math.sin(normal) * radius);\n path.lineTo(end[0]! + Math.cos(normal) * radius, end[1]! + Math.sin(normal) * radius);\n path.arc(end[0]!, end[1]!, radius, normal, normal + Math.PI);\n path.lineTo(start[0]! - Math.cos(normal) * radius, start[1]! - Math.sin(normal) * radius);\n path.arc(start[0]!, start[1]!, radius, normal + Math.PI, normal + Math.PI * 2);\n path.closePath();\n}\n\nfunction stripLayout<T extends Readonly<Record<PropertyKey, unknown>>>(style: T): T {\n const result = { ...style } as Record<PropertyKey, unknown>;\n for (const key of [\n 'width', 'height', 'minWidth', 'maxWidth', 'minHeight', 'maxHeight', 'padding', 'overflow',\n 'left', 'top', 'alignSelf', 'justifySelf', 'flexBasis', 'flexGrow', 'flexShrink',\n 'gridColumnStart', 'gridColumnSpan', 'gridRowStart', 'gridRowSpan',\n ]) delete result[key];\n return result as T;\n}\n\nfunction copyPoints(value: unknown, path: string): readonly PibblPhysicsVector2[] {\n if (!Array.isArray(value)) throw new TypeError(`${path} must be an array.`);\n return Object.freeze(value.map((point, index) => copyPoint(point, `${path}[${index}]`)));\n}\n\nfunction copyPoint(value: unknown, path: string): PibblPhysicsVector2 {\n if (!Array.isArray(value) || value.length !== 2 || value.some(entry => typeof entry !== 'number' || !Number.isFinite(entry))) {\n throw new TypeError(`${path} must be a finite two-dimensional point.`);\n }\n return Object.freeze([value[0] as number, value[1] as number] as const);\n}\n\nfunction positive(value: unknown, path: string): number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) throw new RangeError(`${path} must be finite and greater than zero.`);\n return value;\n}\n\nfunction nonnegative(value: unknown, path: string): number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) throw new RangeError(`${path} must be finite and nonnegative.`);\n return value;\n}\n\nfunction requireShape(value: unknown, path: string): PibblPhysicsShape2D {\n try {\n requireShapeRecord2D(value as PibblPhysicsShape2D);\n return value as PibblPhysicsShape2D;\n } catch {\n throw new TypeError(`${path} must be a Pibbl physics 2D shape.`);\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,2BAA2B;AAEpC;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AAYP,SAAS,iBAAiB,gBAAgB,cAAc,sBAAsB;AAC9E,SAAS,4BAA+C;AACxD,SAAS,oCAAoC;
|
|
4
|
+
"sourcesContent": ["import { resolveTexturePaint } from '@pibbl/core/internal';\nimport type { FillStyle, StrokeStyle } from '@pibbl/core';\nimport {\n useEventTarget,\n definePrimitive,\n type RenderingContext2D,\n} from '@pibbl/core';\nimport type {\n Capsule2DProps,\n Capsule2DStyle,\n Chain2DProps,\n Chain2DStyle,\n PhysicsShape2DProps,\n PhysicsShape2DStyle,\n Segment2DProps,\n Segment2DStyle,\n} from '../types.js';\nimport type { PibblPhysicsShape2D, PibblPhysicsVector2 } from '../../../2d-geometry.js';\nimport { boundsOfShape2D, capsuleShape2D, chainShape2D, segmentShape2D } from '../shapes.js';\nimport { requireShapeRecord2D, type ConvexLeaf2D } from '../shape-records.js';\nimport { installCustomShapeResolver2D } from './inference.js';\nconst layoutPropertyKeys = [\n 'width', 'height', 'minWidth', 'maxWidth', 'minHeight', 'maxHeight', 'padding', 'overflow',\n 'left', 'top', 'alignSelf', 'justifySelf', 'flexBasis', 'flexGrow', 'flexShrink',\n 'gridColumnStart', 'gridColumnSpan', 'gridRowStart', 'gridRowSpan',\n ] as const;\n\ntype LayoutProperty = typeof layoutPropertyKeys[number];\ntype ResolvedPhysicsShapeStyle2D = Omit<Readonly<PhysicsShape2DStyle>, LayoutProperty>;\ntype ResolvedCapsuleStyle2D = Omit<Readonly<Capsule2DStyle>, 'start' | 'end' | LayoutProperty> & {\n readonly start: PibblPhysicsVector2;\n readonly end: PibblPhysicsVector2;\n};\ntype ResolvedSegmentStyle2D = Omit<Readonly<Segment2DStyle>, 'start' | 'end' | LayoutProperty> & {\n readonly start: PibblPhysicsVector2;\n readonly end: PibblPhysicsVector2;\n};\ntype ResolvedChainStyle2D = Omit<Readonly<Chain2DStyle>, 'points' | LayoutProperty> & {\n readonly points: readonly PibblPhysicsVector2[];\n};\n\nfunction renderPhysicsShape2D(\n props: PhysicsShape2DProps,\n style: ResolvedPhysicsShapeStyle2D,\n context: RenderingContext2D,\n): void {\n renderShape(props, style, style.shape, context);\n}\n\nfunction renderCapsule2D(\n props: Capsule2DProps,\n style: Readonly<ResolvedCapsuleStyle2D>,\n context: RenderingContext2D,\n): void {\n renderShape(props, style, capsuleShape2D(style), context);\n}\n\nfunction renderSegment2D(\n props: Segment2DProps,\n style: Readonly<ResolvedSegmentStyle2D>,\n context: RenderingContext2D,\n): void {\n renderShape(props, style, segmentShape2D(style), context);\n}\n\nfunction renderChain2D(\n props: Chain2DProps,\n style: Readonly<ResolvedChainStyle2D>,\n context: RenderingContext2D,\n): void {\n renderShape(props, style, chainShape2D(style), context);\n}\n\n/**\n * Draws an immutable physics shape as a Canvas primitive with optional body or collider\n * attachment.\n *\n * @param props - Authored component inputs, supplied through JSX or createElement. See the linked\n * props and style types.\n * @throws When called directly; Pibbl mounts this component through JSX or createElement.\n *\n * @see {@link PhysicsShape2DProps}\n * @see {@link PhysicsShape2DStyle}\n */\nexport const PhysicsShape2D = definePrimitive<\n PhysicsShape2DProps,\n PhysicsShape2DStyle,\n PhysicsShape2DStyle,\n ResolvedPhysicsShapeStyle2D\n>(renderPhysicsShape2D, { resolveStyle: resolvePhysicsShapeStyle });\n\n/**\n * Draws a capsule between two endpoints with optional physics attachment.\n *\n * @param props - Authored component inputs, supplied through JSX or createElement. See the linked\n * props and style types.\n * @throws When called directly; Pibbl mounts this component through JSX or createElement.\n *\n * @see {@link Capsule2DProps}\n * @see {@link Capsule2DStyle}\n */\nexport const Capsule2D = definePrimitive<\n Capsule2DProps,\n Capsule2DStyle,\n Capsule2DStyle,\n ResolvedCapsuleStyle2D\n>(renderCapsule2D, { resolveStyle: style => ({\n ...stripLayout(style),\n start: copyPoint(style.start, 'Capsule2D.start'),\n end: copyPoint(style.end, 'Capsule2D.end'),\n radius: positive(style.radius, 'Capsule2D.radius'),\n}) });\n\n/**\n * Draws a line segment with optional physics attachment.\n *\n * @param props - Authored component inputs, supplied through JSX or createElement. See the linked\n * props and style types.\n * @throws When called directly; Pibbl mounts this component through JSX or createElement.\n *\n * @see {@link Segment2DProps}\n * @see {@link Segment2DStyle}\n */\nexport const Segment2D = definePrimitive<\n Segment2DProps,\n Segment2DStyle,\n Segment2DStyle,\n ResolvedSegmentStyle2D\n>(renderSegment2D, { resolveStyle: style => ({\n ...stripLayout(style),\n start: copyPoint(style.start, 'Segment2D.start'),\n end: copyPoint(style.end, 'Segment2D.end'),\n}) });\n\n/**\n * Draws an open or closed point chain with optional physics attachment.\n *\n * @param props - Authored component inputs, supplied through JSX or createElement. See the linked\n * props and style types.\n * @throws When called directly; Pibbl mounts this component through JSX or createElement.\n *\n * @see {@link Chain2DProps}\n * @see {@link Chain2DStyle}\n */\nexport const Chain2D = definePrimitive<\n Chain2DProps,\n Chain2DStyle,\n Chain2DStyle,\n ResolvedChainStyle2D\n>(renderChain2D, { resolveStyle: style => ({\n ...stripLayout(style),\n points: Object.freeze(style.points.map((point, index) => copyPoint(point, `Chain2D.points[${index}]`))),\n closed: style.closed ?? false,\n radius: nonnegative(style.radius ?? 0, 'Chain2D.radius'),\n}) });\n\ninstallCustomShapeResolver2D(PhysicsShape2D, style => requireShape(style.shape, 'PhysicsShape2D.shape'));\ninstallCustomShapeResolver2D(Capsule2D, style => capsuleShape2D({\n start: copyPoint(style.start, 'Capsule2D.start'),\n end: copyPoint(style.end, 'Capsule2D.end'),\n radius: positive(style.radius, 'Capsule2D.radius'),\n}));\ninstallCustomShapeResolver2D(Segment2D, style => segmentShape2D({\n start: copyPoint(style.start, 'Segment2D.start'),\n end: copyPoint(style.end, 'Segment2D.end'),\n}));\ninstallCustomShapeResolver2D(Chain2D, style => chainShape2D({\n points: copyPoints(style.points, 'Chain2D.points'),\n closed: style.closed === true,\n radius: nonnegative(style.radius ?? 0, 'Chain2D.radius'),\n}));\n\nfunction resolvePhysicsShapeStyle(style: Readonly<PhysicsShape2DStyle>): ResolvedPhysicsShapeStyle2D {\n requireShape(style.shape, 'PhysicsShape2D.shape');\n return stripLayout(style) as ResolvedPhysicsShapeStyle2D;\n}\n\nfunction renderShape(\n props: PhysicsShape2DProps,\n style: Readonly<{\n readonly fill?: FillStyle;\n readonly stroke?: StrokeStyle;\n readonly strokeWidth?: number;\n readonly opacity?: number;\n readonly cursor?: string;\n readonly lineInteractionWidth?: number;\n }>,\n shape: PibblPhysicsShape2D,\n context: RenderingContext2D,\n): void {\n const record = requireShapeRecord2D(shape);\n const path = pathForShape(shape);\n const opacity = style.opacity ?? 1;\n if (!Number.isFinite(opacity) || opacity < 0 || opacity > 1) {\n throw new RangeError('Physics shape opacity must be finite from zero through one.');\n }\n const bounds = boundsOfShape2D(shape);\n const paintBounds = {x: bounds.min[0], y: bounds.min[1], width: bounds.max[0]-bounds.min[0], height: bounds.max[1]-bounds.min[1]};\n context.globalAlpha *= opacity;\n if (style.fill !== undefined) {\n context.fillStyle = resolveTexturePaint(style.fill, context, paintBounds);\n context.fill(path);\n }\n const strokeWidth = nonnegative(style.strokeWidth ?? 0, 'Physics shape strokeWidth');\n if (style.stroke !== undefined && strokeWidth > 0) {\n context.strokeStyle = resolveTexturePaint(style.stroke, context, paintBounds);\n context.lineWidth = strokeWidth;\n context.stroke(path);\n }\n const interactivePath = props.pointerEvents === 'none' ? new Path2D() : path;\n useEventTarget(props, {\n path: interactivePath,\n fill: style.fill !== undefined && record.area > 0,\n lineInteractionWidth: style.lineInteractionWidth ?? strokeWidth,\n cursor: style.cursor,\n keyboardFocusable: props.keyboardFocusable,\n keyboardNavigationBounds: props.keyboardNavigationBounds ?? {\n x: bounds.min[0], y: bounds.min[1],\n width: bounds.max[0] - bounds.min[0], height: bounds.max[1] - bounds.min[1],\n },\n });\n}\n\nfunction pathForShape(shape: PibblPhysicsShape2D): Path2D {\n const record = requireShapeRecord2D(shape);\n const local = new Path2D();\n for (const leaf of record.leaves) appendLeaf(local, leaf);\n if (record.localPose.x === 0 && record.localPose.y === 0 && record.localPose.rotationRadians === 0) return local;\n const result = new Path2D();\n result.addPath(local, new DOMMatrix()\n .translate(record.localPose.x, record.localPose.y)\n .rotate(record.localPose.rotationRadians * 180 / Math.PI));\n return result;\n}\n\nfunction appendLeaf(path: Path2D, leaf: ConvexLeaf2D): void {\n switch (leaf.kind) {\n case 'circle':\n path.moveTo(leaf.center[0]! + leaf.radius, leaf.center[1]!);\n path.arc(leaf.center[0]!, leaf.center[1]!, leaf.radius, 0, Math.PI * 2);\n path.closePath();\n return;\n case 'ellipse':\n path.moveTo(leaf.center[0]! + leaf.radiusX, leaf.center[1]!);\n path.ellipse(leaf.center[0]!, leaf.center[1]!, leaf.radiusX, leaf.radiusY, leaf.rotationRadians, 0, Math.PI * 2);\n path.closePath();\n return;\n case 'box':\n path.rect(leaf.center[0]! - leaf.halfWidth, leaf.center[1]! - leaf.halfHeight, leaf.halfWidth * 2, leaf.halfHeight * 2);\n return;\n case 'rounded-box':\n path.roundRect(\n leaf.center[0]! - leaf.halfWidth,\n leaf.center[1]! - leaf.halfHeight,\n leaf.halfWidth * 2,\n leaf.halfHeight * 2,\n Array.from(leaf.radii),\n );\n return;\n case 'capsule':\n appendCapsule(path, leaf.start, leaf.end, leaf.radius);\n return;\n case 'segment':\n path.moveTo(leaf.start[0]!, leaf.start[1]!);\n path.lineTo(leaf.end[0]!, leaf.end[1]!);\n return;\n case 'polygon':\n path.moveTo(leaf.vertices[0]!, leaf.vertices[1]!);\n for (let index = 2; index < leaf.vertices.length; index += 2) path.lineTo(leaf.vertices[index]!, leaf.vertices[index + 1]!);\n path.closePath();\n }\n}\n\nfunction appendCapsule(path: Path2D, start: Float64Array, end: Float64Array, radius: number): void {\n const dx = end[0]! - start[0]!, dy = end[1]! - start[1]!, length = Math.hypot(dx, dy);\n if (length === 0) {\n path.moveTo(start[0]! + radius, start[1]!);\n path.arc(start[0]!, start[1]!, radius, 0, Math.PI * 2);\n path.closePath();\n return;\n }\n const normal = Math.atan2(dy, dx) - Math.PI / 2;\n path.moveTo(start[0]! + Math.cos(normal) * radius, start[1]! + Math.sin(normal) * radius);\n path.lineTo(end[0]! + Math.cos(normal) * radius, end[1]! + Math.sin(normal) * radius);\n path.arc(end[0]!, end[1]!, radius, normal, normal + Math.PI);\n path.lineTo(start[0]! - Math.cos(normal) * radius, start[1]! - Math.sin(normal) * radius);\n path.arc(start[0]!, start[1]!, radius, normal + Math.PI, normal + Math.PI * 2);\n path.closePath();\n}\n\nfunction stripLayout<T extends Readonly<Record<PropertyKey, unknown>>>(style: T): T {\n const result = { ...style } as Record<PropertyKey, unknown>;\n for (let keyIndex = 0; keyIndex < layoutPropertyKeys.length; keyIndex++) {\n const key = layoutPropertyKeys[keyIndex];\n delete result[key];\n }\n return result as T;\n}\n\nfunction copyPoints(value: unknown, path: string): readonly PibblPhysicsVector2[] {\n if (!Array.isArray(value)) throw new TypeError(`${path} must be an array.`);\n return Object.freeze(value.map((point, index) => copyPoint(point, `${path}[${index}]`)));\n}\n\nfunction copyPoint(value: unknown, path: string): PibblPhysicsVector2 {\n if (!Array.isArray(value) || value.length !== 2 || value.some(entry => typeof entry !== 'number' || !Number.isFinite(entry))) {\n throw new TypeError(`${path} must be a finite two-dimensional point.`);\n }\n return Object.freeze([value[0] as number, value[1] as number] as const);\n}\n\nfunction positive(value: unknown, path: string): number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) throw new RangeError(`${path} must be finite and greater than zero.`);\n return value;\n}\n\nfunction nonnegative(value: unknown, path: string): number {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) throw new RangeError(`${path} must be finite and nonnegative.`);\n return value;\n}\n\nfunction requireShape(value: unknown, path: string): PibblPhysicsShape2D {\n try {\n requireShapeRecord2D(value as PibblPhysicsShape2D);\n return value as PibblPhysicsShape2D;\n } catch {\n throw new TypeError(`${path} must be a Pibbl physics 2D shape.`);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -106,8 +106,7 @@ function validateRigidAncestor(matrix, componentName) {
|
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
108
|
function validateFiniteInvertible(matrix, label) {
|
|
109
|
-
|
|
110
|
-
if (values.some((value) => !Number.isFinite(value))) {
|
|
109
|
+
if (!Number.isFinite(matrix.a) || !Number.isFinite(matrix.b) || !Number.isFinite(matrix.c) || !Number.isFinite(matrix.d) || !Number.isFinite(matrix.e) || !Number.isFinite(matrix.f)) {
|
|
111
110
|
throw new TypeError(`${label} must contain only finite values.`);
|
|
112
111
|
}
|
|
113
112
|
if (Math.abs(matrix.a * matrix.d - matrix.b * matrix.c) <= 1e-10) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/features/physics/lib/2d/canvas/presentation.ts"],
|
|
4
|
-
"sourcesContent": ["import type { PibblPhysicsPose2D } from \"../../../2d-geometry.js\";\nimport { Group } from \"@pibbl/core\";\n\nconst MATRIX_EPSILON = 1e-6;\n\nexport interface CanvasBodyPresentationCapture2D {\n readonly initialPose: PibblPhysicsPose2D;\n readonly parentWorld: DOMMatrix;\n readonly initialBodyLocal: DOMMatrix;\n readonly poseResidual: DOMMatrix;\n}\n\nexport function captureBodyPresentation2D(\n parentWorld: DOMMatrixReadOnly,\n initialBodyLocal: DOMMatrixReadOnly,\n componentName: string,\n requireRigidAncestor = true,\n): CanvasBodyPresentationCapture2D {\n if (requireRigidAncestor) validateRigidAncestor(parentWorld, componentName);\n else\n validateFiniteInvertible(\n parentWorld,\n `${componentName} ancestor transform`,\n );\n validateFiniteInvertible(\n initialBodyLocal,\n `${componentName} authored transform`,\n );\n if (requireRigidAncestor) {\n validateUnskewed(initialBodyLocal, `${componentName} authored transform`);\n }\n const world = copyMatrix(parentWorld).multiply(initialBodyLocal);\n const scaleX = Math.hypot(world.a, world.b);\n const initialPose = Object.freeze({\n position: Object.freeze([clean(world.e), clean(world.f)] as const),\n rotationDegrees: clean(\n (Math.atan2(world.b / scaleX, world.a / scaleX) * 180) / Math.PI,\n ),\n });\n const poseMatrix = matrixFromPose(initialPose);\n return Object.freeze({\n initialPose,\n parentWorld: copyMatrix(parentWorld),\n initialBodyLocal: copyMatrix(initialBodyLocal),\n poseResidual: poseMatrix.inverse().multiply(world),\n });\n}\n\nexport function resolveDynamicPresentationTransform2D(\n capture: CanvasBodyPresentationCapture2D,\n presentedPose: PibblPhysicsPose2D,\n parentWorld: DOMMatrixReadOnly,\n currentBodyLocal: DOMMatrixReadOnly,\n componentName: string,\n): DOMMatrix {\n validateRigidAncestor(parentWorld, componentName);\n if (!sameMatrix(parentWorld, capture.parentWorld)) {\n throw new Error(\n `${componentName} ancestor transform changed while an enabled dynamic body owns pose. ` +\n \"Use teleportBody2D(), a kinematic body, or disable physics before authored motion.\",\n );\n }\n if (!sameMatrix(currentBodyLocal, capture.initialBodyLocal)) {\n throw new Error(\n `${componentName} authored pose changed while an enabled dynamic body owns pose. ` +\n \"Use teleportBody2D(), a kinematic body, or disable physics before authored motion.\",\n );\n }\n validatePose(presentedPose, componentName);\n const presentedWorld = matrixFromPose(presentedPose).multiply(\n capture.poseResidual,\n );\n const result = copyMatrix(parentWorld)\n .inverse()\n .multiply(presentedWorld)\n .multiply(copyMatrix(capture.initialBodyLocal).inverse());\n return cleanMatrix(result);\n}\n\nexport function bodyLocalTransformFromPrimitive2D(\n componentType: Function,\n style: Readonly<Record<PropertyKey, unknown>>,\n): DOMMatrix {\n let transform = new DOMMatrix().translate(\n finiteStyleNumber(style.left, 0, \"left\"),\n finiteStyleNumber(style.top, 0, \"top\"),\n );\n if (componentType !== Group) return transform;\n const scaleX = finiteStyleNumber(style.scaleX, 1, \"scaleX\");\n const scaleY = finiteStyleNumber(style.scaleY, 1, \"scaleY\");\n if (scaleX !== 1 || scaleY !== 1) transform = transform.scale(scaleX, scaleY);\n const rotation = finiteStyleNumber(\n style.rotationDegrees,\n 0,\n \"rotationDegrees\",\n );\n if (rotation !== 0) {\n const origin = style.rotationOrigin ?? [0, 0];\n if (\n !Array.isArray(origin) ||\n origin.length !== 2 ||\n origin.some(\n (value) => typeof value !== \"number\" || !Number.isFinite(value),\n )\n ) {\n throw new TypeError(\n \"Group rotationOrigin must be a finite two-dimensional point.\",\n );\n }\n transform = transform\n .translate(origin[0], origin[1])\n .rotate(rotation)\n .translate(-origin[0], -origin[1]);\n }\n const translateX = finiteStyleNumber(style.translateX, 0, \"translateX\");\n const translateY = finiteStyleNumber(style.translateY, 0, \"translateY\");\n if (translateX !== 0 || translateY !== 0)\n transform = transform.translate(translateX, translateY);\n const skewX = finiteStyleNumber(style.skewX, 0, \"skewX\");\n const skewY = finiteStyleNumber(style.skewY, 0, \"skewY\");\n if (skewX !== 0) transform = transform.skewX(skewX);\n if (skewY !== 0) transform = transform.skewY(skewY);\n return transform;\n}\n\nfunction validatePose(pose: PibblPhysicsPose2D, componentName: string): void {\n if (\n !Number.isFinite(pose.position[0]) ||\n !Number.isFinite(pose.position[1]) ||\n !Number.isFinite(pose.rotationDegrees)\n ) {\n throw new TypeError(\n `${componentName} physics presentation pose must be finite.`,\n );\n }\n}\n\nfunction validateRigidAncestor(\n matrix: DOMMatrixReadOnly,\n componentName: string,\n): void {\n validateFiniteInvertible(\n matrix,\n `${componentName} dynamic ancestor transform`,\n );\n validateUnskewed(matrix, `${componentName} dynamic ancestor transform`);\n const scaleX = Math.hypot(matrix.a, matrix.b);\n const scaleY = Math.hypot(matrix.c, matrix.d);\n if (!close(scaleX, 1) || !close(scaleY, 1)) {\n throw new Error(\n `${componentName} has a non-rigid dynamic ancestor scale. Bake scale into collider geometry or move the body outside that ancestor.`,\n );\n }\n}\n\nfunction validateFiniteInvertible(\n matrix: DOMMatrixReadOnly,\n label: string,\n): void {\n
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import type { PibblPhysicsPose2D } from \"../../../2d-geometry.js\";\nimport { Group } from \"@pibbl/core\";\n\nconst MATRIX_EPSILON = 1e-6;\n\nexport interface CanvasBodyPresentationCapture2D {\n readonly initialPose: PibblPhysicsPose2D;\n readonly parentWorld: DOMMatrix;\n readonly initialBodyLocal: DOMMatrix;\n readonly poseResidual: DOMMatrix;\n}\n\nexport function captureBodyPresentation2D(\n parentWorld: DOMMatrixReadOnly,\n initialBodyLocal: DOMMatrixReadOnly,\n componentName: string,\n requireRigidAncestor = true,\n): CanvasBodyPresentationCapture2D {\n if (requireRigidAncestor) validateRigidAncestor(parentWorld, componentName);\n else\n validateFiniteInvertible(\n parentWorld,\n `${componentName} ancestor transform`,\n );\n validateFiniteInvertible(\n initialBodyLocal,\n `${componentName} authored transform`,\n );\n if (requireRigidAncestor) {\n validateUnskewed(initialBodyLocal, `${componentName} authored transform`);\n }\n const world = copyMatrix(parentWorld).multiply(initialBodyLocal);\n const scaleX = Math.hypot(world.a, world.b);\n const initialPose = Object.freeze({\n position: Object.freeze([clean(world.e), clean(world.f)] as const),\n rotationDegrees: clean(\n (Math.atan2(world.b / scaleX, world.a / scaleX) * 180) / Math.PI,\n ),\n });\n const poseMatrix = matrixFromPose(initialPose);\n return Object.freeze({\n initialPose,\n parentWorld: copyMatrix(parentWorld),\n initialBodyLocal: copyMatrix(initialBodyLocal),\n poseResidual: poseMatrix.inverse().multiply(world),\n });\n}\n\nexport function resolveDynamicPresentationTransform2D(\n capture: CanvasBodyPresentationCapture2D,\n presentedPose: PibblPhysicsPose2D,\n parentWorld: DOMMatrixReadOnly,\n currentBodyLocal: DOMMatrixReadOnly,\n componentName: string,\n): DOMMatrix {\n validateRigidAncestor(parentWorld, componentName);\n if (!sameMatrix(parentWorld, capture.parentWorld)) {\n throw new Error(\n `${componentName} ancestor transform changed while an enabled dynamic body owns pose. ` +\n \"Use teleportBody2D(), a kinematic body, or disable physics before authored motion.\",\n );\n }\n if (!sameMatrix(currentBodyLocal, capture.initialBodyLocal)) {\n throw new Error(\n `${componentName} authored pose changed while an enabled dynamic body owns pose. ` +\n \"Use teleportBody2D(), a kinematic body, or disable physics before authored motion.\",\n );\n }\n validatePose(presentedPose, componentName);\n const presentedWorld = matrixFromPose(presentedPose).multiply(\n capture.poseResidual,\n );\n const result = copyMatrix(parentWorld)\n .inverse()\n .multiply(presentedWorld)\n .multiply(copyMatrix(capture.initialBodyLocal).inverse());\n return cleanMatrix(result);\n}\n\nexport function bodyLocalTransformFromPrimitive2D(\n componentType: Function,\n style: Readonly<Record<PropertyKey, unknown>>,\n): DOMMatrix {\n let transform = new DOMMatrix().translate(\n finiteStyleNumber(style.left, 0, \"left\"),\n finiteStyleNumber(style.top, 0, \"top\"),\n );\n if (componentType !== Group) return transform;\n const scaleX = finiteStyleNumber(style.scaleX, 1, \"scaleX\");\n const scaleY = finiteStyleNumber(style.scaleY, 1, \"scaleY\");\n if (scaleX !== 1 || scaleY !== 1) transform = transform.scale(scaleX, scaleY);\n const rotation = finiteStyleNumber(\n style.rotationDegrees,\n 0,\n \"rotationDegrees\",\n );\n if (rotation !== 0) {\n const origin = style.rotationOrigin ?? [0, 0];\n if (\n !Array.isArray(origin) ||\n origin.length !== 2 ||\n origin.some(\n (value) => typeof value !== \"number\" || !Number.isFinite(value),\n )\n ) {\n throw new TypeError(\n \"Group rotationOrigin must be a finite two-dimensional point.\",\n );\n }\n transform = transform\n .translate(origin[0], origin[1])\n .rotate(rotation)\n .translate(-origin[0], -origin[1]);\n }\n const translateX = finiteStyleNumber(style.translateX, 0, \"translateX\");\n const translateY = finiteStyleNumber(style.translateY, 0, \"translateY\");\n if (translateX !== 0 || translateY !== 0)\n transform = transform.translate(translateX, translateY);\n const skewX = finiteStyleNumber(style.skewX, 0, \"skewX\");\n const skewY = finiteStyleNumber(style.skewY, 0, \"skewY\");\n if (skewX !== 0) transform = transform.skewX(skewX);\n if (skewY !== 0) transform = transform.skewY(skewY);\n return transform;\n}\n\nfunction validatePose(pose: PibblPhysicsPose2D, componentName: string): void {\n if (\n !Number.isFinite(pose.position[0]) ||\n !Number.isFinite(pose.position[1]) ||\n !Number.isFinite(pose.rotationDegrees)\n ) {\n throw new TypeError(\n `${componentName} physics presentation pose must be finite.`,\n );\n }\n}\n\nfunction validateRigidAncestor(\n matrix: DOMMatrixReadOnly,\n componentName: string,\n): void {\n validateFiniteInvertible(\n matrix,\n `${componentName} dynamic ancestor transform`,\n );\n validateUnskewed(matrix, `${componentName} dynamic ancestor transform`);\n const scaleX = Math.hypot(matrix.a, matrix.b);\n const scaleY = Math.hypot(matrix.c, matrix.d);\n if (!close(scaleX, 1) || !close(scaleY, 1)) {\n throw new Error(\n `${componentName} has a non-rigid dynamic ancestor scale. Bake scale into collider geometry or move the body outside that ancestor.`,\n );\n }\n}\n\nfunction validateFiniteInvertible(\n matrix: DOMMatrixReadOnly,\n label: string,\n): void {\n if (\n !Number.isFinite(matrix.a) || !Number.isFinite(matrix.b) ||\n !Number.isFinite(matrix.c) || !Number.isFinite(matrix.d) ||\n !Number.isFinite(matrix.e) || !Number.isFinite(matrix.f)\n ) {\n throw new TypeError(`${label} must contain only finite values.`);\n }\n if (Math.abs(matrix.a * matrix.d - matrix.b * matrix.c) <= 1e-10) {\n throw new Error(`${label} is noninvertible.`);\n }\n}\n\nfunction validateUnskewed(matrix: DOMMatrixReadOnly, label: string): void {\n const scaleX = Math.hypot(matrix.a, matrix.b);\n const scaleY = Math.hypot(matrix.c, matrix.d);\n const dot = (matrix.a * matrix.c + matrix.b * matrix.d) / (scaleX * scaleY);\n if (Math.abs(dot) > 1e-8)\n throw new Error(`${label} is skewed and cannot define a rigid body pose.`);\n}\n\nfunction sameMatrix(\n left: DOMMatrixReadOnly,\n right: DOMMatrixReadOnly,\n): boolean {\n return (\n close(left.a, right.a) &&\n close(left.b, right.b) &&\n close(left.c, right.c) &&\n close(left.d, right.d) &&\n close(left.e, right.e) &&\n close(left.f, right.f)\n );\n}\n\nfunction close(left: number, right: number): boolean {\n return Math.abs(left - right) <= MATRIX_EPSILON;\n}\n\nfunction clean(value: number): number {\n return Math.abs(value) <= MATRIX_EPSILON ? 0 : value;\n}\n\nfunction cleanMatrix(source: DOMMatrixReadOnly): DOMMatrix {\n return new DOMMatrix([\n clean(source.a),\n clean(source.b),\n clean(source.c),\n clean(source.d),\n clean(source.e),\n clean(source.f),\n ]);\n}\n\nfunction copyMatrix(source: DOMMatrixReadOnly): DOMMatrix {\n return new DOMMatrix([\n source.a,\n source.b,\n source.c,\n source.d,\n source.e,\n source.f,\n ]);\n}\n\nexport function matrixFromPose(pose: PibblPhysicsPose2D): DOMMatrix {\n return new DOMMatrix()\n .translate(pose.position[0], pose.position[1])\n .rotate(pose.rotationDegrees);\n}\n\nfunction finiteStyleNumber(\n value: unknown,\n fallback: number,\n property: string,\n): number {\n const resolved = value ?? fallback;\n if (typeof resolved !== \"number\" || !Number.isFinite(resolved)) {\n throw new TypeError(`Resolved Group ${property} must be finite.`);\n }\n return resolved;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -234,7 +234,7 @@ function raycastCapsule(leaf, pose, originX, originY, directionX, directionY, ma
|
|
|
234
234
|
const acrossDirection = directionX * sideNormalX + directionY * sideNormalY;
|
|
235
235
|
const distances = [];
|
|
236
236
|
if (Math.abs(acrossDirection) > GEOMETRY_EPSILON) {
|
|
237
|
-
for (
|
|
237
|
+
for (let side = -1; side <= 1; side += 2) {
|
|
238
238
|
const distance = (side * leaf.radius - acrossOrigin) / acrossDirection;
|
|
239
239
|
const along = alongOrigin + distance * alongDirection;
|
|
240
240
|
if (distance >= -CAST_TIME_TOLERANCE && distance <= maxDistance + CAST_TIME_TOLERANCE && along >= -CAST_HIT_TOLERANCE && along <= segmentLength + CAST_HIT_TOLERANCE) {
|
|
@@ -242,7 +242,9 @@ function raycastCapsule(leaf, pose, originX, originY, directionX, directionY, ma
|
|
|
242
242
|
}
|
|
243
243
|
}
|
|
244
244
|
}
|
|
245
|
-
for (
|
|
245
|
+
for (let endpoint = 0; endpoint < 2; endpoint++) {
|
|
246
|
+
const centerX = endpoint === 0 ? startX : endX;
|
|
247
|
+
const centerY = endpoint === 0 ? startY : endY;
|
|
246
248
|
const distance = rayCircleDistance(
|
|
247
249
|
originX,
|
|
248
250
|
originY,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/features/physics/lib/2d/collision/casts.ts"],
|
|
4
|
-
"sourcesContent": ["import type {\n PibblPhysicsDistance2D,\n PibblPhysicsPose2D,\n PibblPhysicsRay2D,\n PibblPhysicsShape2D,\n PibblPhysicsShapeHit2D,\n PibblPhysicsVector2,\n} from '../../../2d-geometry.js';\nimport {\n copyFiniteVector2,\n requireNonnegativeNumber,\n} from '../../shared/validation.js';\nimport {\n IDENTITY_POSE_2D,\n composePose2D,\n copyPose2D,\n transformPointInto,\n type InternalPose2D,\n} from '../math.js';\nimport { GEOMETRY_EPSILON } from '../numeric-policy.js';\nimport {\n createShape2D,\n requireShapeRecord2D,\n type CircleLeaf2D,\n type ConvexLeaf2D,\n type ShapeRecord2D,\n} from '../shape-records.js';\nimport { distancePointToSegment2D } from './analytic.js';\nimport {\n containsPointInShape2D,\n distanceBetweenPreparedShapes2D,\n} from './pairs.js';\n\nconst CAST_MAX_ITERATIONS = 32;\nconst CAST_REFINEMENT_ITERATIONS = 64;\nconst CAST_HIT_TOLERANCE = 1e-7;\nconst CAST_TIME_TOLERANCE = 1e-12;\n\ninterface CastCandidate2D {\n readonly leafKey: readonly [number, number];\n readonly pointX: number;\n readonly pointY: number;\n readonly normalX: number;\n readonly normalY: number;\n readonly distance: number;\n readonly timeOfImpact: number;\n}\n\ninterface PreparedCastShape2D {\n readonly record: ShapeRecord2D;\n readonly pose: InternalPose2D;\n}\n\n/**\n * Casts a ray against one posed shape and returns its first hit or null.\n *\n * @param shape - Shape to intersect. See {@link PibblPhysicsShape2D}.\n * @param publicPose - Target shape pose. See {@link PibblPhysicsPose2D}.\n * @param ray - Ray origin, direction, and travel limit. See {@link PibblPhysicsRay2D}.\n * @param options - Whether initial overlap counts as a hit.\n * @returns The first shape hit, or null when there is no hit. See {@link PibblPhysicsShapeHit2D}.\n *\n * @see {@link PibblPhysicsShape2D}\n * @see {@link PibblPhysicsPose2D}\n * @see {@link PibblPhysicsRay2D}\n * @see {@link PibblPhysicsShapeHit2D}\n */\nexport function raycastShape2D(\n shape: PibblPhysicsShape2D,\n publicPose: PibblPhysicsPose2D,\n ray: PibblPhysicsRay2D,\n options?: Readonly<{ includeInitialOverlap?: boolean }>,\n): PibblPhysicsShapeHit2D | null {\n const prepared = prepareShape(shape, publicPose, 'pose');\n const origin = copyFiniteVector2(ray.origin, 'ray.origin');\n const sourceDirection = copyFiniteVector2(ray.direction, 'ray.direction');\n const directionScale = Math.max(\n Math.abs(sourceDirection[0]),\n Math.abs(sourceDirection[1]),\n );\n if (directionScale === 0) {\n throw new RangeError('ray.direction must be non-zero.');\n }\n const maxDistance = requireNonnegativeNumber(ray.maxDistance, 'ray.maxDistance');\n const scaledDirectionX = sourceDirection[0] / directionScale;\n const scaledDirectionY = sourceDirection[1] / directionScale;\n const scaledDirectionLength = Math.hypot(scaledDirectionX, scaledDirectionY);\n const directionX = scaledDirectionX / scaledDirectionLength;\n const directionY = scaledDirectionY / scaledDirectionLength;\n let selected: CastCandidate2D | null = null;\n\n for (const leaf of prepared.record.leaves) {\n const leafShape = shapeForLeaf(leaf);\n const initiallyOverlapping = containsPointInShape2D(\n leafShape,\n internalPoseAsPublic(prepared.pose),\n origin,\n );\n let candidate: CastCandidate2D | null;\n if (initiallyOverlapping) {\n candidate = options?.includeInitialOverlap === true\n ? {\n leafKey: [0, leaf.canonicalLeafIndex],\n pointX: origin[0],\n pointY: origin[1],\n normalX: -directionX,\n normalY: -directionY,\n distance: 0,\n timeOfImpact: 0,\n }\n : null;\n } else if (maxDistance === 0) {\n candidate = null;\n } else {\n candidate = raycastLeaf(\n leaf,\n leafShape,\n prepared.pose,\n origin[0],\n origin[1],\n directionX,\n directionY,\n maxDistance,\n );\n }\n if (candidate !== null && isEarlierCandidate(candidate, selected)) {\n selected = candidate;\n }\n }\n\n return selected === null ? null : publicHit(selected);\n}\n\n/**\n * Sweeps a posed shape along a translation against another posed shape and returns a hit or null.\n *\n * @param moving - Shape to sweep. See {@link PibblPhysicsShape2D}.\n * @param publicFrom - Initial pose of the moving shape. See {@link PibblPhysicsPose2D}.\n * @param publicTranslation - Translation vector for the sweep. See {@link PibblPhysicsVector2}.\n * @param target - Stationary shape to test against. See {@link PibblPhysicsShape2D}.\n * @param publicTargetPose - Pose of the stationary shape. See {@link PibblPhysicsPose2D}.\n * @param options - Whether initial overlap counts as a hit.\n * @returns The first sweep hit, or null when there is no hit. See {@link PibblPhysicsShapeHit2D}.\n *\n * @see {@link PibblPhysicsShape2D}\n * @see {@link PibblPhysicsPose2D}\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShapeHit2D}\n */\nexport function shapeCastAgainstShape2D(\n moving: PibblPhysicsShape2D,\n publicFrom: PibblPhysicsPose2D,\n publicTranslation: PibblPhysicsVector2,\n target: PibblPhysicsShape2D,\n publicTargetPose: PibblPhysicsPose2D,\n options?: Readonly<{ includeInitialOverlap?: boolean }>,\n): PibblPhysicsShapeHit2D | null {\n const preparedMoving = prepareShape(moving, publicFrom, 'from');\n const translation = copyFiniteVector2(publicTranslation, 'translation');\n const preparedTarget = prepareShape(target, publicTargetPose, 'targetPose');\n const translationLength = Math.hypot(translation[0], translation[1]);\n if (!Number.isFinite(translationLength)) {\n throw new RangeError('translation magnitude must be finite.');\n }\n let selected: CastCandidate2D | null = null;\n\n for (const movingLeaf of preparedMoving.record.leaves) {\n const movingLeafShape = shapeForLeaf(movingLeaf);\n for (const targetLeaf of preparedTarget.record.leaves) {\n const targetLeafShape = shapeForLeaf(targetLeaf);\n const leafKey = pairLeafKey(movingLeaf, targetLeaf);\n const candidate = movingLeaf.kind === 'circle' && targetLeaf.kind === 'circle'\n ? castCircleAgainstCircle(\n movingLeaf,\n preparedMoving.pose,\n translation[0],\n translation[1],\n translationLength,\n targetLeaf,\n preparedTarget.pose,\n leafKey,\n options?.includeInitialOverlap === true,\n )\n : conservativelyCastLeafPair(\n movingLeafShape,\n preparedMoving.pose,\n translation[0],\n translation[1],\n translationLength,\n targetLeafShape,\n preparedTarget.pose,\n leafKey,\n options?.includeInitialOverlap === true,\n );\n if (candidate !== null && isEarlierCandidate(candidate, selected)) {\n selected = candidate;\n }\n }\n }\n\n return selected === null ? null : publicHit(selected);\n}\n\nfunction raycastLeaf(\n leaf: ConvexLeaf2D,\n leafShape: PibblPhysicsShape2D,\n pose: InternalPose2D,\n originX: number,\n originY: number,\n directionX: number,\n directionY: number,\n maxDistance: number,\n): CastCandidate2D | null {\n switch (leaf.kind) {\n case 'circle':\n return raycastCircle(\n leaf,\n pose,\n originX,\n originY,\n directionX,\n directionY,\n maxDistance,\n );\n case 'capsule':\n return raycastCapsule(\n leaf,\n pose,\n originX,\n originY,\n directionX,\n directionY,\n maxDistance,\n );\n case 'segment':\n return raycastSegment(\n leaf,\n pose,\n originX,\n originY,\n directionX,\n directionY,\n maxDistance,\n );\n default: {\n const pointShape = shapeForPoint();\n return conservativelyCastLeafPair(\n pointShape,\n { x: originX, y: originY, rotationRadians: 0 },\n directionX * maxDistance,\n directionY * maxDistance,\n maxDistance,\n leafShape,\n pose,\n [0, leaf.canonicalLeafIndex],\n false,\n );\n }\n }\n}\n\nfunction raycastCircle(\n leaf: CircleLeaf2D,\n pose: InternalPose2D,\n originX: number,\n originY: number,\n directionX: number,\n directionY: number,\n maxDistance: number,\n): CastCandidate2D | null {\n const center = new Float64Array(2);\n transformPointInto(center, 0, leaf.center[0]!, leaf.center[1]!, pose);\n const hit = rayCircleDistance(\n originX,\n originY,\n directionX,\n directionY,\n center[0]!,\n center[1]!,\n leaf.radius,\n maxDistance,\n );\n if (hit === null) return null;\n const pointX = originX + directionX * hit;\n const pointY = originY + directionY * hit;\n const normal = unitAgainstMotion(\n pointX - center[0]!,\n pointY - center[1]!,\n directionX,\n directionY,\n );\n return {\n leafKey: [0, leaf.canonicalLeafIndex],\n pointX,\n pointY,\n normalX: normal[0],\n normalY: normal[1],\n distance: hit,\n timeOfImpact: hit / maxDistance,\n };\n}\n\nfunction raycastCapsule(\n leaf: Extract<ConvexLeaf2D, { kind: 'capsule' }>,\n pose: InternalPose2D,\n originX: number,\n originY: number,\n directionX: number,\n directionY: number,\n maxDistance: number,\n): CastCandidate2D | null {\n const endpoints = new Float64Array(4);\n transformPointInto(endpoints, 0, leaf.start[0]!, leaf.start[1]!, pose);\n transformPointInto(endpoints, 2, leaf.end[0]!, leaf.end[1]!, pose);\n const startX = endpoints[0]!;\n const startY = endpoints[1]!;\n const endX = endpoints[2]!;\n const endY = endpoints[3]!;\n const segmentX = endX - startX;\n const segmentY = endY - startY;\n const segmentLength = Math.hypot(segmentX, segmentY);\n if (segmentLength <= GEOMETRY_EPSILON) {\n return raycastCircle(\n { ...leaf, kind: 'circle', center: new Float64Array([leaf.start[0]!, leaf.start[1]!]) },\n pose,\n originX,\n originY,\n directionX,\n directionY,\n maxDistance,\n );\n }\n\n const tangentX = segmentX / segmentLength;\n const tangentY = segmentY / segmentLength;\n const sideNormalX = -tangentY;\n const sideNormalY = tangentX;\n const relativeX = originX - startX;\n const relativeY = originY - startY;\n const alongOrigin = relativeX * tangentX + relativeY * tangentY;\n const acrossOrigin = relativeX * sideNormalX + relativeY * sideNormalY;\n const alongDirection = directionX * tangentX + directionY * tangentY;\n const acrossDirection = directionX * sideNormalX + directionY * sideNormalY;\n const distances: number[] = [];\n if (Math.abs(acrossDirection) > GEOMETRY_EPSILON) {\n for (const side of [-1, 1] as const) {\n const distance = (side * leaf.radius - acrossOrigin) / acrossDirection;\n const along = alongOrigin + distance * alongDirection;\n if (\n distance >= -CAST_TIME_TOLERANCE &&\n distance <= maxDistance + CAST_TIME_TOLERANCE &&\n along >= -CAST_HIT_TOLERANCE &&\n along <= segmentLength + CAST_HIT_TOLERANCE\n ) {\n distances.push(Math.max(0, distance));\n }\n }\n }\n for (const [centerX, centerY] of [[startX, startY], [endX, endY]] as const) {\n const distance = rayCircleDistance(\n originX,\n originY,\n directionX,\n directionY,\n centerX,\n centerY,\n leaf.radius,\n maxDistance,\n );\n if (distance !== null) distances.push(distance);\n }\n distances.sort((first, second) => first - second);\n for (const distance of distances) {\n const pointX = originX + directionX * distance;\n const pointY = originY + directionY * distance;\n const closest = distancePointToSegment2D(\n pointX,\n pointY,\n startX,\n startY,\n endX,\n endY,\n );\n if (Math.abs(closest.separation - leaf.radius) > CAST_HIT_TOLERANCE * 8) continue;\n const normal = unitAgainstMotion(\n pointX - closest.secondX,\n pointY - closest.secondY,\n directionX,\n directionY,\n );\n if (normal[0] * directionX + normal[1] * directionY > CAST_HIT_TOLERANCE) continue;\n return {\n leafKey: [0, leaf.canonicalLeafIndex],\n pointX,\n pointY,\n normalX: normal[0],\n normalY: normal[1],\n distance,\n timeOfImpact: distance / maxDistance,\n };\n }\n return null;\n}\n\nfunction raycastSegment(\n leaf: Extract<ConvexLeaf2D, { kind: 'segment' }>,\n pose: InternalPose2D,\n originX: number,\n originY: number,\n directionX: number,\n directionY: number,\n maxDistance: number,\n): CastCandidate2D | null {\n const endpoints = new Float64Array(4);\n transformPointInto(endpoints, 0, leaf.start[0]!, leaf.start[1]!, pose);\n transformPointInto(endpoints, 2, leaf.end[0]!, leaf.end[1]!, pose);\n const startX = endpoints[0]!;\n const startY = endpoints[1]!;\n const segmentX = endpoints[2]! - startX;\n const segmentY = endpoints[3]! - startY;\n const relativeX = startX - originX;\n const relativeY = startY - originY;\n const denominator = cross(directionX, directionY, segmentX, segmentY);\n let distance: number;\n if (Math.abs(denominator) > GEOMETRY_EPSILON) {\n distance = cross(relativeX, relativeY, segmentX, segmentY) / denominator;\n const segmentTime = cross(relativeX, relativeY, directionX, directionY) / denominator;\n if (\n distance < -CAST_TIME_TOLERANCE ||\n distance > maxDistance + CAST_TIME_TOLERANCE ||\n segmentTime < -CAST_TIME_TOLERANCE ||\n segmentTime > 1 + CAST_TIME_TOLERANCE\n ) {\n return null;\n }\n } else {\n if (Math.abs(cross(relativeX, relativeY, directionX, directionY)) > GEOMETRY_EPSILON) {\n return null;\n }\n const first = relativeX * directionX + relativeY * directionY;\n const second = first + segmentX * directionX + segmentY * directionY;\n distance = Math.min(first, second);\n if (distance < -CAST_TIME_TOLERANCE) distance = Math.max(first, second);\n if (distance < -CAST_TIME_TOLERANCE || distance > maxDistance + CAST_TIME_TOLERANCE) {\n return null;\n }\n }\n distance = Math.max(0, Math.min(maxDistance, distance));\n const pointX = originX + directionX * distance;\n const pointY = originY + directionY * distance;\n const normal = segmentNormalAgainstMotion(segmentX, segmentY, directionX, directionY);\n return {\n leafKey: [0, leaf.canonicalLeafIndex],\n pointX,\n pointY,\n normalX: normal[0],\n normalY: normal[1],\n distance,\n timeOfImpact: distance / maxDistance,\n };\n}\n\nfunction castCircleAgainstCircle(\n moving: CircleLeaf2D,\n movingPose: InternalPose2D,\n translationX: number,\n translationY: number,\n translationLength: number,\n target: CircleLeaf2D,\n targetPose: InternalPose2D,\n leafKey: readonly [number, number],\n includeInitialOverlap: boolean,\n): CastCandidate2D | null {\n const centers = new Float64Array(4);\n transformPointInto(centers, 0, moving.center[0]!, moving.center[1]!, movingPose);\n transformPointInto(centers, 2, target.center[0]!, target.center[1]!, targetPose);\n const relativeX = centers[0]! - centers[2]!;\n const relativeY = centers[1]! - centers[3]!;\n const radius = moving.radius + target.radius;\n if (relativeX * relativeX + relativeY * relativeY <= radius * radius) {\n if (!includeInitialOverlap) return null;\n const normal = unitAgainstMotion(relativeX, relativeY, translationX, translationY);\n return {\n leafKey,\n pointX: centers[2]! + normal[0] * target.radius,\n pointY: centers[3]! + normal[1] * target.radius,\n normalX: normal[0],\n normalY: normal[1],\n distance: 0,\n timeOfImpact: 0,\n };\n }\n if (translationLength === 0) return null;\n const a = translationX * translationX + translationY * translationY;\n const b = 2 * (relativeX * translationX + relativeY * translationY);\n const c = relativeX * relativeX + relativeY * relativeY - radius * radius;\n const discriminant = b * b - 4 * a * c;\n if (discriminant < -GEOMETRY_EPSILON) return null;\n const time = (-b - Math.sqrt(Math.max(0, discriminant))) / (2 * a);\n if (time < -CAST_TIME_TOLERANCE || time > 1 + CAST_TIME_TOLERANCE) return null;\n const timeOfImpact = Math.max(0, Math.min(1, time));\n const movingX = centers[0]! + translationX * timeOfImpact;\n const movingY = centers[1]! + translationY * timeOfImpact;\n const normal = unitAgainstMotion(\n movingX - centers[2]!,\n movingY - centers[3]!,\n translationX,\n translationY,\n );\n return {\n leafKey,\n pointX: centers[2]! + normal[0] * target.radius,\n pointY: centers[3]! + normal[1] * target.radius,\n normalX: normal[0],\n normalY: normal[1],\n distance: translationLength * timeOfImpact,\n timeOfImpact,\n };\n}\n\nfunction conservativelyCastLeafPair(\n moving: PibblPhysicsShape2D,\n from: InternalPose2D,\n translationX: number,\n translationY: number,\n translationLength: number,\n target: PibblPhysicsShape2D,\n targetPose: InternalPose2D,\n leafKey: readonly [number, number],\n includeInitialOverlap: boolean,\n): CastCandidate2D | null {\n let time = 0;\n for (let iteration = 0; iteration < CAST_MAX_ITERATIONS; iteration += 1) {\n const movingPose = {\n x: from.x + translationX * time,\n y: from.y + translationY * time,\n rotationRadians: from.rotationRadians,\n };\n const distance = samplePairDistance(moving, movingPose, target, targetPose);\n if (distance === null) return null;\n if (distance.separation <= (time === 0 ? 0 : CAST_HIT_TOLERANCE)) {\n if (time === 0 && !includeInitialOverlap) return null;\n const normal = unitAgainstMotion(\n distance.normal[0],\n distance.normal[1],\n translationX,\n translationY,\n );\n return {\n leafKey,\n pointX: distance.pointOnSecond[0],\n pointY: distance.pointOnSecond[1],\n normalX: normal[0],\n normalY: normal[1],\n distance: translationLength * time,\n timeOfImpact: time,\n };\n }\n if (translationLength === 0) return null;\n const closingSpeed = -(\n distance.normal[0] * translationX +\n distance.normal[1] * translationY\n );\n if (!Number.isFinite(closingSpeed) || closingSpeed <= 0) break;\n const step = distance.separation / closingSpeed;\n if (!Number.isFinite(step) || step <= CAST_TIME_TOLERANCE) break;\n const nextTime = time + step;\n if (!Number.isFinite(nextTime)) return null;\n if (nextTime <= time) break;\n if (nextTime > 1 + CAST_TIME_TOLERANCE) break;\n time = Math.min(1, nextTime);\n }\n return refineBoundedTangent(\n moving,\n from,\n translationX,\n translationY,\n translationLength,\n target,\n targetPose,\n leafKey,\n );\n}\n\nfunction refineBoundedTangent(\n moving: PibblPhysicsShape2D,\n from: InternalPose2D,\n translationX: number,\n translationY: number,\n translationLength: number,\n target: PibblPhysicsShape2D,\n targetPose: InternalPose2D,\n leafKey: readonly [number, number],\n): CastCandidate2D | null {\n let minimumTime = 0;\n let maximumTime = 1;\n let tangentTime = 0;\n let tangent = sampleTranslatedDistance(\n moving,\n from,\n translationX,\n translationY,\n tangentTime,\n target,\n targetPose,\n );\n if (tangent === null) return null;\n for (let iteration = 0; iteration < CAST_REFINEMENT_ITERATIONS; iteration += 1) {\n const middleTime = (minimumTime + maximumTime) / 2;\n const middle = sampleTranslatedDistance(\n moving,\n from,\n translationX,\n translationY,\n middleTime,\n target,\n targetPose,\n );\n if (middle === null) return null;\n if (middle.separation < tangent.separation) {\n tangentTime = middleTime;\n tangent = middle;\n }\n const derivative =\n middle.normal[0] * translationX + middle.normal[1] * translationY;\n if (!Number.isFinite(derivative)) return null;\n if (derivative < 0) {\n minimumTime = middleTime;\n } else {\n maximumTime = middleTime;\n }\n }\n if (tangent.separation > CAST_HIT_TOLERANCE) return null;\n\n let impactTime = tangentTime;\n if (tangent.separation < 0) {\n let separatedTime = 0;\n for (let iteration = 0; iteration < CAST_REFINEMENT_ITERATIONS; iteration += 1) {\n const middleTime = (separatedTime + impactTime) / 2;\n const middle = sampleTranslatedDistance(\n moving,\n from,\n translationX,\n translationY,\n middleTime,\n target,\n targetPose,\n );\n if (middle === null) return null;\n if (middle.separation <= CAST_HIT_TOLERANCE) {\n impactTime = middleTime;\n tangent = middle;\n } else {\n separatedTime = middleTime;\n }\n }\n }\n const normal = unitAgainstMotion(\n tangent.normal[0],\n tangent.normal[1],\n translationX,\n translationY,\n );\n return {\n leafKey,\n pointX: tangent.pointOnSecond[0],\n pointY: tangent.pointOnSecond[1],\n normalX: normal[0],\n normalY: normal[1],\n distance: translationLength * impactTime,\n timeOfImpact: impactTime,\n };\n}\n\nfunction sampleTranslatedDistance(\n moving: PibblPhysicsShape2D,\n from: InternalPose2D,\n translationX: number,\n translationY: number,\n time: number,\n target: PibblPhysicsShape2D,\n targetPose: InternalPose2D,\n): PibblPhysicsDistance2D | null {\n return samplePairDistance(\n moving,\n {\n x: from.x + translationX * time,\n y: from.y + translationY * time,\n rotationRadians: from.rotationRadians,\n },\n target,\n targetPose,\n );\n}\n\nfunction samplePairDistance(\n moving: PibblPhysicsShape2D,\n movingPose: InternalPose2D,\n target: PibblPhysicsShape2D,\n targetPose: InternalPose2D,\n): PibblPhysicsDistance2D | null {\n try {\n const distance = distanceBetweenPreparedShapes2D(\n moving,\n internalPoseAsPublic(movingPose),\n target,\n internalPoseAsPublic(targetPose),\n );\n return isFiniteDistance(distance) ? distance : null;\n } catch {\n return null;\n }\n}\n\nfunction prepareShape(\n shape: PibblPhysicsShape2D,\n publicPose: PibblPhysicsPose2D,\n posePath: string,\n): PreparedCastShape2D {\n const record = requireShapeRecord2D(shape);\n const pose = composePose2D(copyPose2D(publicPose, posePath), record.localPose);\n return { record, pose };\n}\n\nfunction shapeForLeaf(leaf: ConvexLeaf2D): PibblPhysicsShape2D {\n return createShape2D({\n leaves: Object.freeze([leaf]),\n localPose: IDENTITY_POSE_2D,\n localBounds: new Float64Array(4),\n area: 0,\n centroidX: 0,\n centroidY: 0,\n unitInertia: 0,\n });\n}\n\nfunction shapeForPoint(): PibblPhysicsShape2D {\n return shapeForLeaf(Object.freeze({\n kind: 'segment',\n start: new Float64Array(2),\n end: new Float64Array(2),\n canonicalLeafIndex: 0,\n }));\n}\n\nfunction rayCircleDistance(\n originX: number,\n originY: number,\n directionX: number,\n directionY: number,\n centerX: number,\n centerY: number,\n radius: number,\n maxDistance: number,\n): number | null {\n const relativeX = originX - centerX;\n const relativeY = originY - centerY;\n const projection = relativeX * directionX + relativeY * directionY;\n const discriminant = projection * projection -\n (relativeX * relativeX + relativeY * relativeY - radius * radius);\n if (discriminant < -GEOMETRY_EPSILON) return null;\n const distance = -projection - Math.sqrt(Math.max(0, discriminant));\n if (distance < -CAST_TIME_TOLERANCE || distance > maxDistance + CAST_TIME_TOLERANCE) {\n return null;\n }\n return Math.max(0, Math.min(maxDistance, distance));\n}\n\nfunction unitAgainstMotion(\n x: number,\n y: number,\n motionX: number,\n motionY: number,\n): readonly [number, number] {\n const length = Math.hypot(x, y);\n if (length > GEOMETRY_EPSILON) {\n const unitX = x / length;\n const unitY = y / length;\n return unitX * motionX + unitY * motionY > 0\n ? [-unitX, -unitY]\n : [unitX, unitY];\n }\n const motionLength = Math.hypot(motionX, motionY);\n return motionLength > 0\n ? [-motionX / motionLength, -motionY / motionLength]\n : [1, 0];\n}\n\nfunction segmentNormalAgainstMotion(\n segmentX: number,\n segmentY: number,\n motionX: number,\n motionY: number,\n): readonly [number, number] {\n const length = Math.hypot(segmentX, segmentY);\n if (length <= GEOMETRY_EPSILON) {\n return unitAgainstMotion(0, 0, motionX, motionY);\n }\n let normalX = -segmentY / length;\n let normalY = segmentX / length;\n if (normalX * motionX + normalY * motionY > 0) {\n normalX = -normalX;\n normalY = -normalY;\n }\n return [normalX, normalY];\n}\n\nfunction internalPoseAsPublic(pose: InternalPose2D): PibblPhysicsPose2D {\n return {\n position: [pose.x, pose.y],\n rotationDegrees: pose.rotationRadians * 180 / Math.PI,\n };\n}\n\nfunction pairLeafKey(\n first: ConvexLeaf2D,\n second: ConvexLeaf2D,\n): readonly [number, number] {\n return [first.canonicalLeafIndex, second.canonicalLeafIndex];\n}\n\nfunction isEarlierCandidate(\n candidate: CastCandidate2D,\n selected: CastCandidate2D | null,\n): boolean {\n if (selected === null) return true;\n const timeDifference = candidate.timeOfImpact - selected.timeOfImpact;\n return Math.abs(timeDifference) > CAST_TIME_TOLERANCE\n ? timeDifference < 0\n : candidate.leafKey[0] < selected.leafKey[0] ||\n (candidate.leafKey[0] === selected.leafKey[0] &&\n candidate.leafKey[1] < selected.leafKey[1]);\n}\n\nfunction isFiniteDistance(distance: Readonly<{\n separation: number;\n pointOnFirst: PibblPhysicsVector2;\n pointOnSecond: PibblPhysicsVector2;\n normal: PibblPhysicsVector2;\n}>): boolean {\n return Number.isFinite(distance.separation) &&\n Number.isFinite(distance.pointOnFirst[0]) &&\n Number.isFinite(distance.pointOnFirst[1]) &&\n Number.isFinite(distance.pointOnSecond[0]) &&\n Number.isFinite(distance.pointOnSecond[1]) &&\n Number.isFinite(distance.normal[0]) &&\n Number.isFinite(distance.normal[1]);\n}\n\nfunction publicHit(candidate: CastCandidate2D): PibblPhysicsShapeHit2D {\n return Object.freeze({\n point: freezeVector(candidate.pointX, candidate.pointY),\n normal: freezeVector(candidate.normalX, candidate.normalY),\n distance: cleanZero(candidate.distance),\n timeOfImpact: cleanZero(candidate.timeOfImpact),\n });\n}\n\nfunction freezeVector(x: number, y: number): PibblPhysicsVector2 {\n return Object.freeze([cleanZero(x), cleanZero(y)] as const);\n}\n\nfunction cleanZero(value: number): number {\n return Object.is(value, -0) || Math.abs(value) <= Number.EPSILON ? 0 : value;\n}\n\nfunction cross(ax: number, ay: number, bx: number, by: number): number {\n return ax * by - ay * bx;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type {\n PibblPhysicsDistance2D,\n PibblPhysicsPose2D,\n PibblPhysicsRay2D,\n PibblPhysicsShape2D,\n PibblPhysicsShapeHit2D,\n PibblPhysicsVector2,\n} from '../../../2d-geometry.js';\nimport {\n copyFiniteVector2,\n requireNonnegativeNumber,\n} from '../../shared/validation.js';\nimport {\n IDENTITY_POSE_2D,\n composePose2D,\n copyPose2D,\n transformPointInto,\n type InternalPose2D,\n} from '../math.js';\nimport { GEOMETRY_EPSILON } from '../numeric-policy.js';\nimport {\n createShape2D,\n requireShapeRecord2D,\n type CircleLeaf2D,\n type ConvexLeaf2D,\n type ShapeRecord2D,\n} from '../shape-records.js';\nimport { distancePointToSegment2D } from './analytic.js';\nimport {\n containsPointInShape2D,\n distanceBetweenPreparedShapes2D,\n} from './pairs.js';\n\nconst CAST_MAX_ITERATIONS = 32;\nconst CAST_REFINEMENT_ITERATIONS = 64;\nconst CAST_HIT_TOLERANCE = 1e-7;\nconst CAST_TIME_TOLERANCE = 1e-12;\n\ninterface CastCandidate2D {\n readonly leafKey: readonly [number, number];\n readonly pointX: number;\n readonly pointY: number;\n readonly normalX: number;\n readonly normalY: number;\n readonly distance: number;\n readonly timeOfImpact: number;\n}\n\ninterface PreparedCastShape2D {\n readonly record: ShapeRecord2D;\n readonly pose: InternalPose2D;\n}\n\n/**\n * Casts a ray against one posed shape and returns its first hit or null.\n *\n * @param shape - Shape to intersect. See {@link PibblPhysicsShape2D}.\n * @param publicPose - Target shape pose. See {@link PibblPhysicsPose2D}.\n * @param ray - Ray origin, direction, and travel limit. See {@link PibblPhysicsRay2D}.\n * @param options - Whether initial overlap counts as a hit.\n * @returns The first shape hit, or null when there is no hit. See {@link PibblPhysicsShapeHit2D}.\n *\n * @see {@link PibblPhysicsShape2D}\n * @see {@link PibblPhysicsPose2D}\n * @see {@link PibblPhysicsRay2D}\n * @see {@link PibblPhysicsShapeHit2D}\n */\nexport function raycastShape2D(\n shape: PibblPhysicsShape2D,\n publicPose: PibblPhysicsPose2D,\n ray: PibblPhysicsRay2D,\n options?: Readonly<{ includeInitialOverlap?: boolean }>,\n): PibblPhysicsShapeHit2D | null {\n const prepared = prepareShape(shape, publicPose, 'pose');\n const origin = copyFiniteVector2(ray.origin, 'ray.origin');\n const sourceDirection = copyFiniteVector2(ray.direction, 'ray.direction');\n const directionScale = Math.max(\n Math.abs(sourceDirection[0]),\n Math.abs(sourceDirection[1]),\n );\n if (directionScale === 0) {\n throw new RangeError('ray.direction must be non-zero.');\n }\n const maxDistance = requireNonnegativeNumber(ray.maxDistance, 'ray.maxDistance');\n const scaledDirectionX = sourceDirection[0] / directionScale;\n const scaledDirectionY = sourceDirection[1] / directionScale;\n const scaledDirectionLength = Math.hypot(scaledDirectionX, scaledDirectionY);\n const directionX = scaledDirectionX / scaledDirectionLength;\n const directionY = scaledDirectionY / scaledDirectionLength;\n let selected: CastCandidate2D | null = null;\n\n for (const leaf of prepared.record.leaves) {\n const leafShape = shapeForLeaf(leaf);\n const initiallyOverlapping = containsPointInShape2D(\n leafShape,\n internalPoseAsPublic(prepared.pose),\n origin,\n );\n let candidate: CastCandidate2D | null;\n if (initiallyOverlapping) {\n candidate = options?.includeInitialOverlap === true\n ? {\n leafKey: [0, leaf.canonicalLeafIndex],\n pointX: origin[0],\n pointY: origin[1],\n normalX: -directionX,\n normalY: -directionY,\n distance: 0,\n timeOfImpact: 0,\n }\n : null;\n } else if (maxDistance === 0) {\n candidate = null;\n } else {\n candidate = raycastLeaf(\n leaf,\n leafShape,\n prepared.pose,\n origin[0],\n origin[1],\n directionX,\n directionY,\n maxDistance,\n );\n }\n if (candidate !== null && isEarlierCandidate(candidate, selected)) {\n selected = candidate;\n }\n }\n\n return selected === null ? null : publicHit(selected);\n}\n\n/**\n * Sweeps a posed shape along a translation against another posed shape and returns a hit or null.\n *\n * @param moving - Shape to sweep. See {@link PibblPhysicsShape2D}.\n * @param publicFrom - Initial pose of the moving shape. See {@link PibblPhysicsPose2D}.\n * @param publicTranslation - Translation vector for the sweep. See {@link PibblPhysicsVector2}.\n * @param target - Stationary shape to test against. See {@link PibblPhysicsShape2D}.\n * @param publicTargetPose - Pose of the stationary shape. See {@link PibblPhysicsPose2D}.\n * @param options - Whether initial overlap counts as a hit.\n * @returns The first sweep hit, or null when there is no hit. See {@link PibblPhysicsShapeHit2D}.\n *\n * @see {@link PibblPhysicsShape2D}\n * @see {@link PibblPhysicsPose2D}\n * @see {@link PibblPhysicsVector2}\n * @see {@link PibblPhysicsShapeHit2D}\n */\nexport function shapeCastAgainstShape2D(\n moving: PibblPhysicsShape2D,\n publicFrom: PibblPhysicsPose2D,\n publicTranslation: PibblPhysicsVector2,\n target: PibblPhysicsShape2D,\n publicTargetPose: PibblPhysicsPose2D,\n options?: Readonly<{ includeInitialOverlap?: boolean }>,\n): PibblPhysicsShapeHit2D | null {\n const preparedMoving = prepareShape(moving, publicFrom, 'from');\n const translation = copyFiniteVector2(publicTranslation, 'translation');\n const preparedTarget = prepareShape(target, publicTargetPose, 'targetPose');\n const translationLength = Math.hypot(translation[0], translation[1]);\n if (!Number.isFinite(translationLength)) {\n throw new RangeError('translation magnitude must be finite.');\n }\n let selected: CastCandidate2D | null = null;\n\n for (const movingLeaf of preparedMoving.record.leaves) {\n const movingLeafShape = shapeForLeaf(movingLeaf);\n for (const targetLeaf of preparedTarget.record.leaves) {\n const targetLeafShape = shapeForLeaf(targetLeaf);\n const leafKey = pairLeafKey(movingLeaf, targetLeaf);\n const candidate = movingLeaf.kind === 'circle' && targetLeaf.kind === 'circle'\n ? castCircleAgainstCircle(\n movingLeaf,\n preparedMoving.pose,\n translation[0],\n translation[1],\n translationLength,\n targetLeaf,\n preparedTarget.pose,\n leafKey,\n options?.includeInitialOverlap === true,\n )\n : conservativelyCastLeafPair(\n movingLeafShape,\n preparedMoving.pose,\n translation[0],\n translation[1],\n translationLength,\n targetLeafShape,\n preparedTarget.pose,\n leafKey,\n options?.includeInitialOverlap === true,\n );\n if (candidate !== null && isEarlierCandidate(candidate, selected)) {\n selected = candidate;\n }\n }\n }\n\n return selected === null ? null : publicHit(selected);\n}\n\nfunction raycastLeaf(\n leaf: ConvexLeaf2D,\n leafShape: PibblPhysicsShape2D,\n pose: InternalPose2D,\n originX: number,\n originY: number,\n directionX: number,\n directionY: number,\n maxDistance: number,\n): CastCandidate2D | null {\n switch (leaf.kind) {\n case 'circle':\n return raycastCircle(\n leaf,\n pose,\n originX,\n originY,\n directionX,\n directionY,\n maxDistance,\n );\n case 'capsule':\n return raycastCapsule(\n leaf,\n pose,\n originX,\n originY,\n directionX,\n directionY,\n maxDistance,\n );\n case 'segment':\n return raycastSegment(\n leaf,\n pose,\n originX,\n originY,\n directionX,\n directionY,\n maxDistance,\n );\n default: {\n const pointShape = shapeForPoint();\n return conservativelyCastLeafPair(\n pointShape,\n { x: originX, y: originY, rotationRadians: 0 },\n directionX * maxDistance,\n directionY * maxDistance,\n maxDistance,\n leafShape,\n pose,\n [0, leaf.canonicalLeafIndex],\n false,\n );\n }\n }\n}\n\nfunction raycastCircle(\n leaf: CircleLeaf2D,\n pose: InternalPose2D,\n originX: number,\n originY: number,\n directionX: number,\n directionY: number,\n maxDistance: number,\n): CastCandidate2D | null {\n const center = new Float64Array(2);\n transformPointInto(center, 0, leaf.center[0]!, leaf.center[1]!, pose);\n const hit = rayCircleDistance(\n originX,\n originY,\n directionX,\n directionY,\n center[0]!,\n center[1]!,\n leaf.radius,\n maxDistance,\n );\n if (hit === null) return null;\n const pointX = originX + directionX * hit;\n const pointY = originY + directionY * hit;\n const normal = unitAgainstMotion(\n pointX - center[0]!,\n pointY - center[1]!,\n directionX,\n directionY,\n );\n return {\n leafKey: [0, leaf.canonicalLeafIndex],\n pointX,\n pointY,\n normalX: normal[0],\n normalY: normal[1],\n distance: hit,\n timeOfImpact: hit / maxDistance,\n };\n}\n\nfunction raycastCapsule(\n leaf: Extract<ConvexLeaf2D, { kind: 'capsule' }>,\n pose: InternalPose2D,\n originX: number,\n originY: number,\n directionX: number,\n directionY: number,\n maxDistance: number,\n): CastCandidate2D | null {\n const endpoints = new Float64Array(4);\n transformPointInto(endpoints, 0, leaf.start[0]!, leaf.start[1]!, pose);\n transformPointInto(endpoints, 2, leaf.end[0]!, leaf.end[1]!, pose);\n const startX = endpoints[0]!;\n const startY = endpoints[1]!;\n const endX = endpoints[2]!;\n const endY = endpoints[3]!;\n const segmentX = endX - startX;\n const segmentY = endY - startY;\n const segmentLength = Math.hypot(segmentX, segmentY);\n if (segmentLength <= GEOMETRY_EPSILON) {\n return raycastCircle(\n { ...leaf, kind: 'circle', center: new Float64Array([leaf.start[0]!, leaf.start[1]!]) },\n pose,\n originX,\n originY,\n directionX,\n directionY,\n maxDistance,\n );\n }\n\n const tangentX = segmentX / segmentLength;\n const tangentY = segmentY / segmentLength;\n const sideNormalX = -tangentY;\n const sideNormalY = tangentX;\n const relativeX = originX - startX;\n const relativeY = originY - startY;\n const alongOrigin = relativeX * tangentX + relativeY * tangentY;\n const acrossOrigin = relativeX * sideNormalX + relativeY * sideNormalY;\n const alongDirection = directionX * tangentX + directionY * tangentY;\n const acrossDirection = directionX * sideNormalX + directionY * sideNormalY;\n const distances: number[] = [];\n if (Math.abs(acrossDirection) > GEOMETRY_EPSILON) {\n for (let side = -1; side <= 1; side += 2) {\n const distance = (side * leaf.radius - acrossOrigin) / acrossDirection;\n const along = alongOrigin + distance * alongDirection;\n if (\n distance >= -CAST_TIME_TOLERANCE &&\n distance <= maxDistance + CAST_TIME_TOLERANCE &&\n along >= -CAST_HIT_TOLERANCE &&\n along <= segmentLength + CAST_HIT_TOLERANCE\n ) {\n distances.push(Math.max(0, distance));\n }\n }\n }\n for (let endpoint = 0; endpoint < 2; endpoint++) {\n const centerX = endpoint === 0 ? startX : endX;\n const centerY = endpoint === 0 ? startY : endY;\n const distance = rayCircleDistance(\n originX,\n originY,\n directionX,\n directionY,\n centerX,\n centerY,\n leaf.radius,\n maxDistance,\n );\n if (distance !== null) distances.push(distance);\n }\n distances.sort((first, second) => first - second);\n for (const distance of distances) {\n const pointX = originX + directionX * distance;\n const pointY = originY + directionY * distance;\n const closest = distancePointToSegment2D(\n pointX,\n pointY,\n startX,\n startY,\n endX,\n endY,\n );\n if (Math.abs(closest.separation - leaf.radius) > CAST_HIT_TOLERANCE * 8) continue;\n const normal = unitAgainstMotion(\n pointX - closest.secondX,\n pointY - closest.secondY,\n directionX,\n directionY,\n );\n if (normal[0] * directionX + normal[1] * directionY > CAST_HIT_TOLERANCE) continue;\n return {\n leafKey: [0, leaf.canonicalLeafIndex],\n pointX,\n pointY,\n normalX: normal[0],\n normalY: normal[1],\n distance,\n timeOfImpact: distance / maxDistance,\n };\n }\n return null;\n}\n\nfunction raycastSegment(\n leaf: Extract<ConvexLeaf2D, { kind: 'segment' }>,\n pose: InternalPose2D,\n originX: number,\n originY: number,\n directionX: number,\n directionY: number,\n maxDistance: number,\n): CastCandidate2D | null {\n const endpoints = new Float64Array(4);\n transformPointInto(endpoints, 0, leaf.start[0]!, leaf.start[1]!, pose);\n transformPointInto(endpoints, 2, leaf.end[0]!, leaf.end[1]!, pose);\n const startX = endpoints[0]!;\n const startY = endpoints[1]!;\n const segmentX = endpoints[2]! - startX;\n const segmentY = endpoints[3]! - startY;\n const relativeX = startX - originX;\n const relativeY = startY - originY;\n const denominator = cross(directionX, directionY, segmentX, segmentY);\n let distance: number;\n if (Math.abs(denominator) > GEOMETRY_EPSILON) {\n distance = cross(relativeX, relativeY, segmentX, segmentY) / denominator;\n const segmentTime = cross(relativeX, relativeY, directionX, directionY) / denominator;\n if (\n distance < -CAST_TIME_TOLERANCE ||\n distance > maxDistance + CAST_TIME_TOLERANCE ||\n segmentTime < -CAST_TIME_TOLERANCE ||\n segmentTime > 1 + CAST_TIME_TOLERANCE\n ) {\n return null;\n }\n } else {\n if (Math.abs(cross(relativeX, relativeY, directionX, directionY)) > GEOMETRY_EPSILON) {\n return null;\n }\n const first = relativeX * directionX + relativeY * directionY;\n const second = first + segmentX * directionX + segmentY * directionY;\n distance = Math.min(first, second);\n if (distance < -CAST_TIME_TOLERANCE) distance = Math.max(first, second);\n if (distance < -CAST_TIME_TOLERANCE || distance > maxDistance + CAST_TIME_TOLERANCE) {\n return null;\n }\n }\n distance = Math.max(0, Math.min(maxDistance, distance));\n const pointX = originX + directionX * distance;\n const pointY = originY + directionY * distance;\n const normal = segmentNormalAgainstMotion(segmentX, segmentY, directionX, directionY);\n return {\n leafKey: [0, leaf.canonicalLeafIndex],\n pointX,\n pointY,\n normalX: normal[0],\n normalY: normal[1],\n distance,\n timeOfImpact: distance / maxDistance,\n };\n}\n\nfunction castCircleAgainstCircle(\n moving: CircleLeaf2D,\n movingPose: InternalPose2D,\n translationX: number,\n translationY: number,\n translationLength: number,\n target: CircleLeaf2D,\n targetPose: InternalPose2D,\n leafKey: readonly [number, number],\n includeInitialOverlap: boolean,\n): CastCandidate2D | null {\n const centers = new Float64Array(4);\n transformPointInto(centers, 0, moving.center[0]!, moving.center[1]!, movingPose);\n transformPointInto(centers, 2, target.center[0]!, target.center[1]!, targetPose);\n const relativeX = centers[0]! - centers[2]!;\n const relativeY = centers[1]! - centers[3]!;\n const radius = moving.radius + target.radius;\n if (relativeX * relativeX + relativeY * relativeY <= radius * radius) {\n if (!includeInitialOverlap) return null;\n const normal = unitAgainstMotion(relativeX, relativeY, translationX, translationY);\n return {\n leafKey,\n pointX: centers[2]! + normal[0] * target.radius,\n pointY: centers[3]! + normal[1] * target.radius,\n normalX: normal[0],\n normalY: normal[1],\n distance: 0,\n timeOfImpact: 0,\n };\n }\n if (translationLength === 0) return null;\n const a = translationX * translationX + translationY * translationY;\n const b = 2 * (relativeX * translationX + relativeY * translationY);\n const c = relativeX * relativeX + relativeY * relativeY - radius * radius;\n const discriminant = b * b - 4 * a * c;\n if (discriminant < -GEOMETRY_EPSILON) return null;\n const time = (-b - Math.sqrt(Math.max(0, discriminant))) / (2 * a);\n if (time < -CAST_TIME_TOLERANCE || time > 1 + CAST_TIME_TOLERANCE) return null;\n const timeOfImpact = Math.max(0, Math.min(1, time));\n const movingX = centers[0]! + translationX * timeOfImpact;\n const movingY = centers[1]! + translationY * timeOfImpact;\n const normal = unitAgainstMotion(\n movingX - centers[2]!,\n movingY - centers[3]!,\n translationX,\n translationY,\n );\n return {\n leafKey,\n pointX: centers[2]! + normal[0] * target.radius,\n pointY: centers[3]! + normal[1] * target.radius,\n normalX: normal[0],\n normalY: normal[1],\n distance: translationLength * timeOfImpact,\n timeOfImpact,\n };\n}\n\nfunction conservativelyCastLeafPair(\n moving: PibblPhysicsShape2D,\n from: InternalPose2D,\n translationX: number,\n translationY: number,\n translationLength: number,\n target: PibblPhysicsShape2D,\n targetPose: InternalPose2D,\n leafKey: readonly [number, number],\n includeInitialOverlap: boolean,\n): CastCandidate2D | null {\n let time = 0;\n for (let iteration = 0; iteration < CAST_MAX_ITERATIONS; iteration += 1) {\n const movingPose = {\n x: from.x + translationX * time,\n y: from.y + translationY * time,\n rotationRadians: from.rotationRadians,\n };\n const distance = samplePairDistance(moving, movingPose, target, targetPose);\n if (distance === null) return null;\n if (distance.separation <= (time === 0 ? 0 : CAST_HIT_TOLERANCE)) {\n if (time === 0 && !includeInitialOverlap) return null;\n const normal = unitAgainstMotion(\n distance.normal[0],\n distance.normal[1],\n translationX,\n translationY,\n );\n return {\n leafKey,\n pointX: distance.pointOnSecond[0],\n pointY: distance.pointOnSecond[1],\n normalX: normal[0],\n normalY: normal[1],\n distance: translationLength * time,\n timeOfImpact: time,\n };\n }\n if (translationLength === 0) return null;\n const closingSpeed = -(\n distance.normal[0] * translationX +\n distance.normal[1] * translationY\n );\n if (!Number.isFinite(closingSpeed) || closingSpeed <= 0) break;\n const step = distance.separation / closingSpeed;\n if (!Number.isFinite(step) || step <= CAST_TIME_TOLERANCE) break;\n const nextTime = time + step;\n if (!Number.isFinite(nextTime)) return null;\n if (nextTime <= time) break;\n if (nextTime > 1 + CAST_TIME_TOLERANCE) break;\n time = Math.min(1, nextTime);\n }\n return refineBoundedTangent(\n moving,\n from,\n translationX,\n translationY,\n translationLength,\n target,\n targetPose,\n leafKey,\n );\n}\n\nfunction refineBoundedTangent(\n moving: PibblPhysicsShape2D,\n from: InternalPose2D,\n translationX: number,\n translationY: number,\n translationLength: number,\n target: PibblPhysicsShape2D,\n targetPose: InternalPose2D,\n leafKey: readonly [number, number],\n): CastCandidate2D | null {\n let minimumTime = 0;\n let maximumTime = 1;\n let tangentTime = 0;\n let tangent = sampleTranslatedDistance(\n moving,\n from,\n translationX,\n translationY,\n tangentTime,\n target,\n targetPose,\n );\n if (tangent === null) return null;\n for (let iteration = 0; iteration < CAST_REFINEMENT_ITERATIONS; iteration += 1) {\n const middleTime = (minimumTime + maximumTime) / 2;\n const middle = sampleTranslatedDistance(\n moving,\n from,\n translationX,\n translationY,\n middleTime,\n target,\n targetPose,\n );\n if (middle === null) return null;\n if (middle.separation < tangent.separation) {\n tangentTime = middleTime;\n tangent = middle;\n }\n const derivative =\n middle.normal[0] * translationX + middle.normal[1] * translationY;\n if (!Number.isFinite(derivative)) return null;\n if (derivative < 0) {\n minimumTime = middleTime;\n } else {\n maximumTime = middleTime;\n }\n }\n if (tangent.separation > CAST_HIT_TOLERANCE) return null;\n\n let impactTime = tangentTime;\n if (tangent.separation < 0) {\n let separatedTime = 0;\n for (let iteration = 0; iteration < CAST_REFINEMENT_ITERATIONS; iteration += 1) {\n const middleTime = (separatedTime + impactTime) / 2;\n const middle = sampleTranslatedDistance(\n moving,\n from,\n translationX,\n translationY,\n middleTime,\n target,\n targetPose,\n );\n if (middle === null) return null;\n if (middle.separation <= CAST_HIT_TOLERANCE) {\n impactTime = middleTime;\n tangent = middle;\n } else {\n separatedTime = middleTime;\n }\n }\n }\n const normal = unitAgainstMotion(\n tangent.normal[0],\n tangent.normal[1],\n translationX,\n translationY,\n );\n return {\n leafKey,\n pointX: tangent.pointOnSecond[0],\n pointY: tangent.pointOnSecond[1],\n normalX: normal[0],\n normalY: normal[1],\n distance: translationLength * impactTime,\n timeOfImpact: impactTime,\n };\n}\n\nfunction sampleTranslatedDistance(\n moving: PibblPhysicsShape2D,\n from: InternalPose2D,\n translationX: number,\n translationY: number,\n time: number,\n target: PibblPhysicsShape2D,\n targetPose: InternalPose2D,\n): PibblPhysicsDistance2D | null {\n return samplePairDistance(\n moving,\n {\n x: from.x + translationX * time,\n y: from.y + translationY * time,\n rotationRadians: from.rotationRadians,\n },\n target,\n targetPose,\n );\n}\n\nfunction samplePairDistance(\n moving: PibblPhysicsShape2D,\n movingPose: InternalPose2D,\n target: PibblPhysicsShape2D,\n targetPose: InternalPose2D,\n): PibblPhysicsDistance2D | null {\n try {\n const distance = distanceBetweenPreparedShapes2D(\n moving,\n internalPoseAsPublic(movingPose),\n target,\n internalPoseAsPublic(targetPose),\n );\n return isFiniteDistance(distance) ? distance : null;\n } catch {\n return null;\n }\n}\n\nfunction prepareShape(\n shape: PibblPhysicsShape2D,\n publicPose: PibblPhysicsPose2D,\n posePath: string,\n): PreparedCastShape2D {\n const record = requireShapeRecord2D(shape);\n const pose = composePose2D(copyPose2D(publicPose, posePath), record.localPose);\n return { record, pose };\n}\n\nfunction shapeForLeaf(leaf: ConvexLeaf2D): PibblPhysicsShape2D {\n return createShape2D({\n leaves: Object.freeze([leaf]),\n localPose: IDENTITY_POSE_2D,\n localBounds: new Float64Array(4),\n area: 0,\n centroidX: 0,\n centroidY: 0,\n unitInertia: 0,\n });\n}\n\nfunction shapeForPoint(): PibblPhysicsShape2D {\n return shapeForLeaf(Object.freeze({\n kind: 'segment',\n start: new Float64Array(2),\n end: new Float64Array(2),\n canonicalLeafIndex: 0,\n }));\n}\n\nfunction rayCircleDistance(\n originX: number,\n originY: number,\n directionX: number,\n directionY: number,\n centerX: number,\n centerY: number,\n radius: number,\n maxDistance: number,\n): number | null {\n const relativeX = originX - centerX;\n const relativeY = originY - centerY;\n const projection = relativeX * directionX + relativeY * directionY;\n const discriminant = projection * projection -\n (relativeX * relativeX + relativeY * relativeY - radius * radius);\n if (discriminant < -GEOMETRY_EPSILON) return null;\n const distance = -projection - Math.sqrt(Math.max(0, discriminant));\n if (distance < -CAST_TIME_TOLERANCE || distance > maxDistance + CAST_TIME_TOLERANCE) {\n return null;\n }\n return Math.max(0, Math.min(maxDistance, distance));\n}\n\nfunction unitAgainstMotion(\n x: number,\n y: number,\n motionX: number,\n motionY: number,\n): readonly [number, number] {\n const length = Math.hypot(x, y);\n if (length > GEOMETRY_EPSILON) {\n const unitX = x / length;\n const unitY = y / length;\n return unitX * motionX + unitY * motionY > 0\n ? [-unitX, -unitY]\n : [unitX, unitY];\n }\n const motionLength = Math.hypot(motionX, motionY);\n return motionLength > 0\n ? [-motionX / motionLength, -motionY / motionLength]\n : [1, 0];\n}\n\nfunction segmentNormalAgainstMotion(\n segmentX: number,\n segmentY: number,\n motionX: number,\n motionY: number,\n): readonly [number, number] {\n const length = Math.hypot(segmentX, segmentY);\n if (length <= GEOMETRY_EPSILON) {\n return unitAgainstMotion(0, 0, motionX, motionY);\n }\n let normalX = -segmentY / length;\n let normalY = segmentX / length;\n if (normalX * motionX + normalY * motionY > 0) {\n normalX = -normalX;\n normalY = -normalY;\n }\n return [normalX, normalY];\n}\n\nfunction internalPoseAsPublic(pose: InternalPose2D): PibblPhysicsPose2D {\n return {\n position: [pose.x, pose.y],\n rotationDegrees: pose.rotationRadians * 180 / Math.PI,\n };\n}\n\nfunction pairLeafKey(\n first: ConvexLeaf2D,\n second: ConvexLeaf2D,\n): readonly [number, number] {\n return [first.canonicalLeafIndex, second.canonicalLeafIndex];\n}\n\nfunction isEarlierCandidate(\n candidate: CastCandidate2D,\n selected: CastCandidate2D | null,\n): boolean {\n if (selected === null) return true;\n const timeDifference = candidate.timeOfImpact - selected.timeOfImpact;\n return Math.abs(timeDifference) > CAST_TIME_TOLERANCE\n ? timeDifference < 0\n : candidate.leafKey[0] < selected.leafKey[0] ||\n (candidate.leafKey[0] === selected.leafKey[0] &&\n candidate.leafKey[1] < selected.leafKey[1]);\n}\n\nfunction isFiniteDistance(distance: Readonly<{\n separation: number;\n pointOnFirst: PibblPhysicsVector2;\n pointOnSecond: PibblPhysicsVector2;\n normal: PibblPhysicsVector2;\n}>): boolean {\n return Number.isFinite(distance.separation) &&\n Number.isFinite(distance.pointOnFirst[0]) &&\n Number.isFinite(distance.pointOnFirst[1]) &&\n Number.isFinite(distance.pointOnSecond[0]) &&\n Number.isFinite(distance.pointOnSecond[1]) &&\n Number.isFinite(distance.normal[0]) &&\n Number.isFinite(distance.normal[1]);\n}\n\nfunction publicHit(candidate: CastCandidate2D): PibblPhysicsShapeHit2D {\n return Object.freeze({\n point: freezeVector(candidate.pointX, candidate.pointY),\n normal: freezeVector(candidate.normalX, candidate.normalY),\n distance: cleanZero(candidate.distance),\n timeOfImpact: cleanZero(candidate.timeOfImpact),\n });\n}\n\nfunction freezeVector(x: number, y: number): PibblPhysicsVector2 {\n return Object.freeze([cleanZero(x), cleanZero(y)] as const);\n}\n\nfunction cleanZero(value: number): number {\n return Object.is(value, -0) || Math.abs(value) <= Number.EPSILON ? 0 : value;\n}\n\nfunction cross(ax: number, ay: number, bx: number, by: number): number {\n return ax * by - ay * bx;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["normal"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PibblPhysicsQueryOptions2D } from './types.js';
|
|
2
|
+
export type QueryMode = 'closest' | 'any' | 'all';
|
|
3
|
+
export interface QueryOptions<Mode extends QueryMode = 'closest'> extends PibblPhysicsQueryOptions2D {
|
|
4
|
+
readonly mode?: Mode;
|
|
5
|
+
}
|
|
6
|
+
export type QueryResult<Mode extends QueryMode, Result> = Mode extends 'any' ? boolean : Mode extends 'all' ? readonly Result[] : Result | null;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import type { QueryMode, QueryOptions, QueryResult } from '../query-types.js';
|
|
1
2
|
import type { PibblPhysicsBodyInspection2D, PibblPhysicsInspection2D } from "../inspection-types.js";
|
|
2
3
|
import { type PibblInternalSimulationOwner } from "@pibbl/core/internal";
|
|
3
4
|
import type { PibblPhysicsAabb2D, PibblPhysicsPose2D, PibblPhysicsRay2D, PibblPhysicsShape2D, PibblPhysicsVector2 } from "../../../2d-geometry.js";
|
|
4
|
-
import type { PibblPhysicsBodyHandle2D, PibblPhysicsQueryHit2D, PibblPhysicsQueryMatch2D,
|
|
5
|
+
import type { PibblPhysicsBodyHandle2D, PibblPhysicsQueryHit2D, PibblPhysicsQueryMatch2D, PibblPhysicsWorldHandle2D } from "../types.js";
|
|
5
6
|
import type { PibblResolvedPhysicsWorld2DProps } from "./world-props.js";
|
|
6
7
|
import { PhysicsWorld2DKernel, type PhysicsBodyCommand2D, type PhysicsCommand2D } from "../world/world.js";
|
|
7
8
|
import { type PhysicsBodyHandleValues2D } from "./body-handle.js";
|
|
@@ -67,11 +68,11 @@ export declare class PhysicsWorld2DController {
|
|
|
67
68
|
queueCommands(commands: readonly PhysicsCommand2D[]): void;
|
|
68
69
|
acceptBodyHandleCommand(handle: PibblPhysicsBodyHandle2D, bindingGeneration: number, command: PhysicsBodyCommand2D): boolean;
|
|
69
70
|
presentationPose(bodyId: number): PibblPhysicsPose2D | undefined;
|
|
70
|
-
raycast<Mode extends
|
|
71
|
-
shapeCast<Mode extends
|
|
72
|
-
overlapShape<Mode extends
|
|
73
|
-
queryAabb<Mode extends
|
|
74
|
-
queryPoint<Mode extends
|
|
71
|
+
raycast<Mode extends QueryMode = "closest">(ray: PibblPhysicsRay2D, options?: QueryOptions<Mode>): QueryResult<Mode, PibblPhysicsQueryHit2D>;
|
|
72
|
+
shapeCast<Mode extends QueryMode = "closest">(shape: PibblPhysicsShape2D, from: PibblPhysicsPose2D, translation: PibblPhysicsVector2, options?: QueryOptions<Mode>): QueryResult<Mode, PibblPhysicsQueryHit2D>;
|
|
73
|
+
overlapShape<Mode extends QueryMode = "closest">(shape: PibblPhysicsShape2D, pose: PibblPhysicsPose2D, options?: QueryOptions<Mode>): QueryResult<Mode, PibblPhysicsQueryMatch2D>;
|
|
74
|
+
queryAabb<Mode extends QueryMode = "closest">(bounds: PibblPhysicsAabb2D, options?: QueryOptions<Mode>): QueryResult<Mode, PibblPhysicsQueryMatch2D>;
|
|
75
|
+
queryPoint<Mode extends QueryMode = "closest">(point: PibblPhysicsVector2, options?: QueryOptions<Mode>): QueryResult<Mode, PibblPhysicsQueryMatch2D>;
|
|
75
76
|
bodyHandleValues(bodyId: number): PhysicsBodyHandleValues2D | undefined;
|
|
76
77
|
inspectBody(bodyId: number): PibblPhysicsBodyInspection2D | undefined;
|
|
77
78
|
dispose(): void;
|
|
@@ -154,7 +154,7 @@ class PhysicsWorld2DController {
|
|
|
154
154
|
);
|
|
155
155
|
const simulationToRoot = this.space === "local" ? rootTransform : new DOMMatrix();
|
|
156
156
|
const { a, b, c, d, e, f } = simulationToRoot;
|
|
157
|
-
if (!
|
|
157
|
+
if (!(Number.isFinite(a) && Number.isFinite(b) && Number.isFinite(c) && Number.isFinite(d) && Number.isFinite(e) && Number.isFinite(f)) || Math.abs(a * d - b * c) < 1e-10)
|
|
158
158
|
throw new Error(
|
|
159
159
|
"PhysicsWorld2D viewport transform must be finite and invertible."
|
|
160
160
|
);
|