@pibbl/core 0.0.2 → 0.0.3-alpha.109.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD_PARTY_NOTICES.txt +81 -0
- package/dist/features/physics/2d-testing.d.ts +1 -1
- package/dist/features/physics/2d-testing.js +2 -2
- package/dist/features/physics/2d-testing.js.map +2 -2
- package/dist/features/physics/lib/2d/canvas/components.js +25 -21
- package/dist/features/physics/lib/2d/canvas/components.js.map +2 -2
- package/dist/features/physics/lib/2d/canvas/presentation.js +1 -2
- package/dist/features/physics/lib/2d/canvas/presentation.js.map +2 -2
- package/dist/features/physics/lib/2d/collision/casts.js +4 -2
- package/dist/features/physics/lib/2d/collision/casts.js.map +2 -2
- package/dist/features/physics/lib/2d/runtime/controller.js +1 -1
- package/dist/features/physics/lib/2d/runtime/controller.js.map +2 -2
- package/dist/features/physics/lib/2d/runtime/obstacles.js +9 -11
- package/dist/features/physics/lib/2d/runtime/obstacles.js.map +2 -2
- package/dist/features/physics/lib/2d/shapes.js +8 -9
- package/dist/features/physics/lib/2d/shapes.js.map +2 -2
- package/dist/features/physics/lib/2d/world/rapier.js +22 -26
- package/dist/features/physics/lib/2d/world/rapier.js.map +2 -2
- package/dist/features/sprites/loader.js +6 -3
- package/dist/features/sprites/loader.js.map +2 -2
- package/dist/features/textures/index.d.ts +12 -2
- package/dist/features/textures/index.js +33 -1
- package/dist/features/textures/index.js.map +2 -2
- package/dist/features/textures/lib/chemical-field.d.ts +56 -0
- package/dist/features/textures/lib/chemical-field.js +154 -0
- package/dist/features/textures/lib/chemical-field.js.map +7 -0
- package/dist/features/textures/lib/chemical-recipes.d.ts +119 -0
- package/dist/features/textures/lib/chemical-recipes.js +275 -0
- package/dist/features/textures/lib/chemical-recipes.js.map +7 -0
- package/dist/features/textures/lib/definitions.d.ts +3 -18
- package/dist/features/textures/lib/definitions.js +17 -24
- package/dist/features/textures/lib/definitions.js.map +2 -2
- package/dist/features/textures/lib/geometric-patterns.d.ts +149 -0
- package/dist/features/textures/lib/geometric-patterns.js +305 -0
- package/dist/features/textures/lib/geometric-patterns.js.map +7 -0
- package/dist/features/textures/lib/gray-scott.d.ts +55 -0
- package/dist/features/textures/lib/gray-scott.js +37 -0
- package/dist/features/textures/lib/gray-scott.js.map +7 -0
- package/dist/features/textures/lib/palette.js +1 -3
- package/dist/features/textures/lib/palette.js.map +2 -2
- package/dist/features/textures/lib/patterns.d.ts +123 -0
- package/dist/features/textures/lib/patterns.js +344 -0
- package/dist/features/textures/lib/patterns.js.map +7 -0
- package/dist/features/textures/lib/rain-drops.js +2 -1
- package/dist/features/textures/lib/rain-drops.js.map +2 -2
- package/dist/features/textures/lib/reaction-diffusion.d.ts +3 -2
- package/dist/features/textures/lib/reaction-diffusion.js +9 -20
- package/dist/features/textures/lib/reaction-diffusion.js.map +2 -2
- package/dist/features/textures/lib/simulation.d.ts +10 -4
- package/dist/features/textures/lib/simulation.js +23 -13
- package/dist/features/textures/lib/simulation.js.map +2 -2
- package/dist/features/textures/lib/wasm/electric.js +8 -1
- package/dist/features/textures/lib/wasm/electric.js.map +2 -2
- package/dist/features/textures/lib/water-surface.js +1 -3
- package/dist/features/textures/lib/water-surface.js.map +2 -2
- package/dist/features/viz/index.d.ts +68 -6
- package/dist/features/viz/index.js +164 -2
- package/dist/features/viz/index.js.map +2 -2
- package/dist/features/viz/inspection/bar.d.ts +79 -0
- package/dist/features/viz/inspection/bar.js +49 -0
- package/dist/features/viz/inspection/bar.js.map +7 -0
- package/dist/features/viz/inspection/candle.d.ts +156 -0
- package/dist/features/viz/inspection/candle.js +120 -0
- package/dist/features/viz/inspection/candle.js.map +7 -0
- package/dist/features/viz/inspection/capture-types.d.ts +65 -0
- package/dist/features/viz/inspection/capture.d.ts +16 -0
- package/dist/features/viz/inspection/capture.js +49 -0
- package/dist/features/viz/inspection/capture.js.map +7 -0
- package/dist/features/viz/inspection/handler.d.ts +36 -0
- package/dist/features/viz/inspection/handler.js +91 -0
- package/dist/features/viz/inspection/handler.js.map +7 -0
- package/dist/features/viz/inspection/ohlc-bar.d.ts +132 -0
- package/dist/features/viz/inspection/ohlc-bar.js +118 -0
- package/dist/features/viz/inspection/ohlc-bar.js.map +7 -0
- package/dist/features/viz/inspection/owned-ref.d.ts +16 -0
- package/dist/features/viz/inspection/owned-ref.js +99 -0
- package/dist/features/viz/inspection/owned-ref.js.map +7 -0
- package/dist/features/viz/inspection/painted-point.d.ts +22 -0
- package/dist/features/viz/inspection/painted-point.js +29 -0
- package/dist/features/viz/inspection/painted-point.js.map +7 -0
- package/dist/features/viz/inspection/queries.d.ts +100 -0
- package/dist/features/viz/inspection/queries.js +192 -0
- package/dist/features/viz/inspection/queries.js.map +7 -0
- package/dist/features/viz/inspection/query-types.d.ts +177 -0
- package/dist/features/viz/inspection/volume.d.ts +104 -0
- package/dist/features/viz/inspection/volume.js +95 -0
- package/dist/features/viz/inspection/volume.js.map +7 -0
- package/dist/features/viz/inspection.d.ts +19 -0
- package/dist/features/viz/inspection.js +54 -0
- package/dist/features/viz/inspection.js.map +7 -0
- package/dist/features/viz/inspection.mjs +1 -0
- package/dist/features/viz/lib/area-series.d.ts +62 -0
- package/dist/features/viz/lib/area-series.js +120 -0
- package/dist/features/viz/lib/area-series.js.map +7 -0
- package/dist/features/viz/lib/axis-title.js +2 -1
- package/dist/features/viz/lib/axis-title.js.map +2 -2
- package/dist/features/viz/lib/axis.js +1 -1
- package/dist/features/viz/lib/axis.js.map +2 -2
- package/dist/features/viz/lib/bar-series.d.ts +3 -1
- package/dist/features/viz/lib/bar-series.js +16 -1
- package/dist/features/viz/lib/bar-series.js.map +2 -2
- package/dist/features/viz/lib/baseline-series.d.ts +55 -0
- package/dist/features/viz/lib/baseline-series.js +136 -0
- package/dist/features/viz/lib/baseline-series.js.map +7 -0
- package/dist/features/viz/lib/candlestick-series.d.ts +62 -0
- package/dist/features/viz/lib/candlestick-series.js +150 -0
- package/dist/features/viz/lib/candlestick-series.js.map +7 -0
- package/dist/features/viz/lib/censored-point-series.d.ts +71 -0
- package/dist/features/viz/lib/censored-point-series.js +129 -0
- package/dist/features/viz/lib/censored-point-series.js.map +7 -0
- package/dist/features/viz/lib/color-context.d.ts +4 -0
- package/dist/features/viz/lib/color-context.js +41 -0
- package/dist/features/viz/lib/color-context.js.map +7 -0
- package/dist/features/viz/lib/color-math.d.ts +4 -0
- package/dist/features/viz/lib/color-math.js +31 -0
- package/dist/features/viz/lib/color-math.js.map +7 -0
- package/dist/features/viz/lib/color-types.d.ts +53 -0
- package/dist/features/viz/lib/curve-definition.d.ts +49 -0
- package/dist/features/viz/lib/curve-definition.js +142 -0
- package/dist/features/viz/lib/curve-definition.js.map +7 -0
- package/dist/features/viz/lib/diverging-color-scale.d.ts +11 -0
- package/dist/features/viz/lib/diverging-color-scale.js +51 -0
- package/dist/features/viz/lib/diverging-color-scale.js.map +7 -0
- package/dist/features/viz/lib/domain-navigation.d.ts +40 -0
- package/dist/features/viz/lib/domain-navigation.js +77 -0
- package/dist/features/viz/lib/domain-navigation.js.map +7 -0
- package/dist/features/viz/lib/editable-chart-elements.d.ts +178 -0
- package/dist/features/viz/lib/editable-chart-elements.js +733 -0
- package/dist/features/viz/lib/editable-chart-elements.js.map +7 -0
- package/dist/features/viz/lib/financial-aggregation.d.ts +127 -0
- package/dist/features/viz/lib/financial-aggregation.js +116 -0
- package/dist/features/viz/lib/financial-aggregation.js.map +7 -0
- package/dist/features/viz/lib/financial-autoscale.d.ts +64 -0
- package/dist/features/viz/lib/financial-autoscale.js +61 -0
- package/dist/features/viz/lib/financial-autoscale.js.map +7 -0
- package/dist/features/viz/lib/financial-comparison.d.ts +62 -0
- package/dist/features/viz/lib/financial-comparison.js +98 -0
- package/dist/features/viz/lib/financial-comparison.js.map +7 -0
- package/dist/features/viz/lib/financial-geometry.d.ts +77 -0
- package/dist/features/viz/lib/financial-geometry.js +67 -0
- package/dist/features/viz/lib/financial-geometry.js.map +7 -0
- package/dist/features/viz/lib/financial-indicators.d.ts +114 -0
- package/dist/features/viz/lib/financial-indicators.js +135 -0
- package/dist/features/viz/lib/financial-indicators.js.map +7 -0
- package/dist/features/viz/lib/financial-oscillators.d.ts +171 -0
- package/dist/features/viz/lib/financial-oscillators.js +265 -0
- package/dist/features/viz/lib/financial-oscillators.js.map +7 -0
- package/dist/features/viz/lib/graph/bipartite.d.ts +14 -0
- package/dist/features/viz/lib/graph/bipartite.js +250 -0
- package/dist/features/viz/lib/graph/bipartite.js.map +7 -0
- package/dist/features/viz/lib/graph/chord.d.ts +44 -0
- package/dist/features/viz/lib/graph/chord.js +348 -0
- package/dist/features/viz/lib/graph/chord.js.map +7 -0
- package/dist/features/viz/lib/graph/dependency.d.ts +26 -0
- package/dist/features/viz/lib/graph/dependency.js +140 -0
- package/dist/features/viz/lib/graph/dependency.js.map +7 -0
- package/dist/features/viz/lib/graph/force.d.ts +28 -0
- package/dist/features/viz/lib/graph/force.js +580 -0
- package/dist/features/viz/lib/graph/force.js.map +7 -0
- package/dist/features/viz/lib/graph/hierarchy.d.ts +21 -0
- package/dist/features/viz/lib/graph/hierarchy.js +112 -0
- package/dist/features/viz/lib/graph/hierarchy.js.map +7 -0
- package/dist/features/viz/lib/graph/icicle.d.ts +16 -0
- package/dist/features/viz/lib/graph/icicle.js +153 -0
- package/dist/features/viz/lib/graph/icicle.js.map +7 -0
- package/dist/features/viz/lib/graph/matrix.d.ts +30 -0
- package/dist/features/viz/lib/graph/matrix.js +243 -0
- package/dist/features/viz/lib/graph/matrix.js.map +7 -0
- package/dist/features/viz/lib/graph/neighborhood.d.ts +11 -0
- package/dist/features/viz/lib/graph/neighborhood.js +281 -0
- package/dist/features/viz/lib/graph/neighborhood.js.map +7 -0
- package/dist/features/viz/lib/graph/routes.d.ts +35 -0
- package/dist/features/viz/lib/graph/routes.js +101 -0
- package/dist/features/viz/lib/graph/routes.js.map +7 -0
- package/dist/features/viz/lib/graph/sankey.d.ts +44 -0
- package/dist/features/viz/lib/graph/sankey.js +341 -0
- package/dist/features/viz/lib/graph/sankey.js.map +7 -0
- package/dist/features/viz/lib/graph/shared.d.ts +59 -0
- package/dist/features/viz/lib/graph/shared.js +301 -0
- package/dist/features/viz/lib/graph/shared.js.map +7 -0
- package/dist/features/viz/lib/graph/tree.d.ts +11 -0
- package/dist/features/viz/lib/graph/tree.js +232 -0
- package/dist/features/viz/lib/graph/tree.js.map +7 -0
- package/dist/features/viz/lib/graph/treemap.d.ts +20 -0
- package/dist/features/viz/lib/graph/treemap.js +227 -0
- package/dist/features/viz/lib/graph/treemap.js.map +7 -0
- package/dist/features/viz/lib/graph/types.d.ts +1097 -0
- package/dist/features/viz/lib/hover-card.js +8 -9
- package/dist/features/viz/lib/hover-card.js.map +2 -2
- package/dist/features/viz/lib/hover-data.d.ts +1 -1
- package/dist/features/viz/lib/hover-data.js +5 -2
- package/dist/features/viz/lib/hover-data.js.map +2 -2
- package/dist/features/viz/lib/interval-band-series.d.ts +49 -0
- package/dist/features/viz/lib/interval-band-series.js +136 -0
- package/dist/features/viz/lib/interval-band-series.js.map +7 -0
- package/dist/features/viz/lib/interval-diamond-series.d.ts +43 -0
- package/dist/features/viz/lib/interval-diamond-series.js +122 -0
- package/dist/features/viz/lib/interval-diamond-series.js.map +7 -0
- package/dist/features/viz/lib/interval-series.d.ts +79 -0
- package/dist/features/viz/lib/interval-series.js +158 -0
- package/dist/features/viz/lib/interval-series.js.map +7 -0
- package/dist/features/viz/lib/layout-pie.js +9 -13
- package/dist/features/viz/lib/layout-pie.js.map +2 -2
- package/dist/features/viz/lib/line-series.d.ts +1 -1
- package/dist/features/viz/lib/line-series.js +47 -28
- package/dist/features/viz/lib/line-series.js.map +2 -2
- package/dist/features/viz/lib/linear-scale.js +1 -1
- package/dist/features/viz/lib/linear-scale.js.map +2 -2
- package/dist/features/viz/lib/monotone-curve.d.ts +11 -0
- package/dist/features/viz/lib/monotone-curve.js +63 -0
- package/dist/features/viz/lib/monotone-curve.js.map +7 -0
- package/dist/features/viz/lib/numeric-range-interpolation.d.ts +15 -0
- package/dist/features/viz/lib/numeric-range-interpolation.js +36 -0
- package/dist/features/viz/lib/numeric-range-interpolation.js.map +7 -0
- package/dist/features/viz/lib/ohlc-bar-series.d.ts +55 -0
- package/dist/features/viz/lib/ohlc-bar-series.js +168 -0
- package/dist/features/viz/lib/ohlc-bar-series.js.map +7 -0
- package/dist/features/viz/lib/paired-series.d.ts +44 -0
- package/dist/features/viz/lib/paired-series.js +93 -0
- package/dist/features/viz/lib/paired-series.js.map +7 -0
- package/dist/features/viz/lib/pie-layout.js +2 -1
- package/dist/features/viz/lib/pie-layout.js.map +2 -2
- package/dist/features/viz/lib/plot-series.js +11 -6
- package/dist/features/viz/lib/plot-series.js.map +2 -2
- package/dist/features/viz/lib/plot-types.d.ts +4 -3
- package/dist/features/viz/lib/point-series.d.ts +1 -1
- package/dist/features/viz/lib/point-series.js +36 -9
- package/dist/features/viz/lib/point-series.js.map +2 -2
- package/dist/features/viz/lib/point-types.d.ts +5 -2
- package/dist/features/viz/lib/reference-band.js +4 -1
- package/dist/features/viz/lib/reference-band.js.map +2 -2
- package/dist/features/viz/lib/scale-context.d.ts +1 -1
- package/dist/features/viz/lib/scale-ticks.js +21 -6
- package/dist/features/viz/lib/scale-ticks.js.map +2 -2
- package/dist/features/viz/lib/sequential-color-scale.d.ts +11 -0
- package/dist/features/viz/lib/sequential-color-scale.js +49 -0
- package/dist/features/viz/lib/sequential-color-scale.js.map +7 -0
- package/dist/features/viz/lib/series-position.d.ts +12 -0
- package/dist/features/viz/lib/series-position.js +44 -0
- package/dist/features/viz/lib/series-position.js.map +7 -0
- package/dist/features/viz/lib/step-curves.d.ts +19 -0
- package/dist/features/viz/lib/step-curves.js +53 -0
- package/dist/features/viz/lib/step-curves.js.map +7 -0
- package/dist/features/viz/lib/threshold-color-scale.d.ts +43 -0
- package/dist/features/viz/lib/threshold-color-scale.js +59 -0
- package/dist/features/viz/lib/threshold-color-scale.js.map +7 -0
- package/dist/features/viz/lib/trading-time-mapping.d.ts +32 -0
- package/dist/features/viz/lib/trading-time-mapping.js +89 -0
- package/dist/features/viz/lib/trading-time-mapping.js.map +7 -0
- package/dist/features/viz/lib/trading-time-scale.d.ts +83 -0
- package/dist/features/viz/lib/trading-time-scale.js +96 -0
- package/dist/features/viz/lib/trading-time-scale.js.map +7 -0
- package/dist/features/viz/lib/trajectory-series.d.ts +71 -0
- package/dist/features/viz/lib/trajectory-series.js +111 -0
- package/dist/features/viz/lib/trajectory-series.js.map +7 -0
- package/dist/features/viz/lib/types.d.ts +20 -4
- package/dist/features/viz/lib/use-continuous-scale.js +6 -1
- package/dist/features/viz/lib/use-continuous-scale.js.map +2 -2
- package/dist/features/viz/lib/utc-scale.js +11 -10
- package/dist/features/viz/lib/utc-scale.js.map +2 -2
- package/dist/features/viz/lib/volume-series.d.ts +59 -0
- package/dist/features/viz/lib/volume-series.js +117 -0
- package/dist/features/viz/lib/volume-series.js.map +7 -0
- package/dist/features/viz/lib/weighted-point-series.d.ts +71 -0
- package/dist/features/viz/lib/weighted-point-series.js +169 -0
- package/dist/features/viz/lib/weighted-point-series.js.map +7 -0
- package/dist/filters/backdrop-contrast-gpu.d.ts +5 -0
- package/dist/filters/backdrop-contrast-gpu.js +33 -0
- package/dist/filters/backdrop-contrast-gpu.js.map +7 -0
- package/dist/filters/backdrop-contrast.d.ts +21 -0
- package/dist/filters/backdrop-contrast.js +61 -0
- package/dist/filters/backdrop-contrast.js.map +7 -0
- package/dist/filters/displacement.js +1 -1
- package/dist/filters/displacement.js.map +2 -2
- package/dist/filters/emboss-gpu.d.ts +4 -0
- package/dist/filters/emboss-gpu.js +39 -0
- package/dist/filters/emboss-gpu.js.map +7 -0
- package/dist/filters/emboss.d.ts +32 -0
- package/dist/filters/emboss.js +104 -0
- package/dist/filters/emboss.js.map +7 -0
- package/dist/filters/filter-executor.d.ts +11 -4
- package/dist/filters/filter-executor.js +104 -49
- package/dist/filters/filter-executor.js.map +2 -2
- package/dist/filters/reflected-light.js +1 -1
- package/dist/filters/reflected-light.js.map +2 -2
- package/dist/filters/reflection-gpu.d.ts +3 -1
- package/dist/filters/reflection-gpu.js +5 -2
- package/dist/filters/reflection-gpu.js.map +2 -2
- package/dist/filters/render-backdrop-contrast-boundary.d.ts +31 -0
- package/dist/filters/render-backdrop-contrast-boundary.js +116 -0
- package/dist/filters/render-backdrop-contrast-boundary.js.map +7 -0
- package/dist/filters/render-emboss-boundary.d.ts +13 -0
- package/dist/filters/render-emboss-boundary.js +131 -0
- package/dist/filters/render-emboss-boundary.js.map +7 -0
- package/dist/filters.d.ts +9 -5
- package/dist/filters.js +4 -0
- package/dist/filters.js.map +2 -2
- package/dist/index.d.ts +9 -5
- package/dist/index.js +18 -2
- package/dist/index.js.map +2 -2
- package/dist/internal.d.ts +4 -0
- package/dist/internal.js +6 -0
- package/dist/internal.js.map +2 -2
- package/dist/layout-kernel.d.ts +12 -0
- package/dist/layout-kernel.js +11 -0
- package/dist/layout-kernel.js.map +7 -0
- package/dist/layout-kernel.mjs +1 -0
- package/dist/lib/backend/types.d.ts +13 -1
- package/dist/lib/backend/types.js.map +2 -2
- package/dist/lib/components/arc-geometry.js +2 -1
- package/dist/lib/components/arc-geometry.js.map +2 -2
- package/dist/lib/components/g.js +2 -0
- package/dist/lib/components/g.js.map +2 -2
- package/dist/lib/components/html-box.js +2 -1
- package/dist/lib/components/html-box.js.map +2 -2
- package/dist/lib/components/img.js +3 -3
- package/dist/lib/components/img.js.map +2 -2
- package/dist/lib/components/layer.js +98 -16
- package/dist/lib/components/layer.js.map +3 -3
- package/dist/lib/components/text.d.ts +16 -0
- package/dist/lib/components/text.js +131 -24
- package/dist/lib/components/text.js.map +2 -2
- package/dist/lib/define-primitive.d.ts +4 -2
- package/dist/lib/define-primitive.js +3 -1
- package/dist/lib/define-primitive.js.map +2 -2
- package/dist/lib/element/metadata.d.ts +9 -0
- package/dist/lib/element/metadata.js +19 -0
- package/dist/lib/element/metadata.js.map +2 -2
- package/dist/lib/element/resolve-primitive-inputs.d.ts +2 -0
- package/dist/lib/element/resolve-primitive-inputs.js +17 -4
- package/dist/lib/element/resolve-primitive-inputs.js.map +2 -2
- package/dist/lib/events/event-facade.d.ts +18 -0
- package/dist/lib/events/event-facade.js +28 -2
- package/dist/lib/events/event-facade.js.map +2 -2
- package/dist/lib/events/hit-test.js +2 -1
- package/dist/lib/events/hit-test.js.map +2 -2
- package/dist/lib/events/propagation.d.ts +2 -1
- package/dist/lib/events/propagation.js +22 -16
- package/dist/lib/events/propagation.js.map +2 -2
- package/dist/lib/events/registrations.d.ts +10 -0
- package/dist/lib/events/registrations.js +160 -5
- package/dist/lib/events/registrations.js.map +2 -2
- package/dist/lib/execute-render.js +25 -1
- package/dist/lib/execute-render.js.map +2 -2
- package/dist/lib/filter/filter-region.js +3 -10
- package/dist/lib/filter/filter-region.js.map +2 -2
- package/dist/lib/focus/focus-manager.d.ts +8 -1
- package/dist/lib/focus/focus-manager.js +87 -43
- package/dist/lib/focus/focus-manager.js.map +2 -2
- package/dist/lib/focus/geometry.d.ts +2 -0
- package/dist/lib/focus/geometry.js +6 -0
- package/dist/lib/focus/geometry.js.map +2 -2
- package/dist/lib/geometry/path-bend-guide.js +1 -1
- package/dist/lib/geometry/path-bend-guide.js.map +2 -2
- package/dist/lib/geometry/path-geometry.js +12 -11
- package/dist/lib/geometry/path-geometry.js.map +2 -2
- package/dist/lib/geometry/path-transforms.js +17 -21
- package/dist/lib/geometry/path-transforms.js.map +2 -2
- package/dist/lib/geometry/path-warp-bezier.js +3 -1
- package/dist/lib/geometry/path-warp-bezier.js.map +2 -2
- package/dist/lib/geometry/path-warp.js +1 -1
- package/dist/lib/geometry/path-warp.js.map +2 -2
- package/dist/lib/global-state.js +2 -0
- package/dist/lib/global-state.js.map +2 -2
- package/dist/lib/html/html-events.d.ts +32 -0
- package/dist/lib/html/html-events.js +179 -0
- package/dist/lib/html/html-events.js.map +7 -0
- package/dist/lib/html/html-service.d.ts +8 -2
- package/dist/lib/html/html-service.js +198 -65
- package/dist/lib/html/html-service.js.map +2 -2
- package/dist/lib/html/overlay-config.js +7 -6
- package/dist/lib/html/overlay-config.js.map +2 -2
- package/dist/lib/html/types.d.ts +29 -2
- package/dist/lib/layout/absolute.d.ts +11 -5
- package/dist/lib/layout/absolute.js +329 -55
- package/dist/lib/layout/absolute.js.map +3 -3
- package/dist/lib/layout/allocation-checkpoint-owner.d.ts +11 -0
- package/dist/lib/layout/allocation-checkpoint-owner.js +86 -0
- package/dist/lib/layout/allocation-checkpoint-owner.js.map +7 -0
- package/dist/lib/layout/allocation-checkpoint.d.ts +53 -0
- package/dist/lib/layout/allocation-checkpoint.js +463 -0
- package/dist/lib/layout/allocation-checkpoint.js.map +7 -0
- package/dist/lib/layout/allocation-dependencies.d.ts +30 -0
- package/dist/lib/layout/allocation-dependencies.js +90 -0
- package/dist/lib/layout/allocation-dependencies.js.map +7 -0
- package/dist/lib/layout/allocation-revision.d.ts +13 -0
- package/dist/lib/layout/allocation-revision.js +67 -0
- package/dist/lib/layout/allocation-revision.js.map +7 -0
- package/dist/lib/layout/box-insets.d.ts +17 -0
- package/dist/lib/layout/box-insets.js +138 -0
- package/dist/lib/layout/box-insets.js.map +7 -0
- package/dist/lib/layout/box-sizing.d.ts +16 -0
- package/dist/lib/layout/box-sizing.js +77 -0
- package/dist/lib/layout/box-sizing.js.map +7 -0
- package/dist/lib/layout/box.js +42 -12
- package/dist/lib/layout/box.js.map +2 -2
- package/dist/lib/layout/canvas-measurement.d.ts +13 -0
- package/dist/lib/layout/canvas-measurement.js +57 -0
- package/dist/lib/layout/canvas-measurement.js.map +7 -0
- package/dist/lib/layout/context.d.ts +35 -6
- package/dist/lib/layout/context.js +72 -3
- package/dist/lib/layout/context.js.map +2 -2
- package/dist/lib/layout/define-layout-component.d.ts +23 -0
- package/dist/lib/layout/define-layout-component.js +84 -0
- package/dist/lib/layout/define-layout-component.js.map +7 -0
- package/dist/lib/layout/flex-allocation-cache.d.ts +42 -0
- package/dist/lib/layout/flex-baseline-mode.d.ts +2 -0
- package/dist/lib/layout/flex-baseline-mode.js +7 -0
- package/dist/lib/layout/flex-baseline-mode.js.map +7 -0
- package/dist/lib/layout/flex.d.ts +50 -15
- package/dist/lib/layout/flex.js +2124 -195
- package/dist/lib/layout/flex.js.map +3 -3
- package/dist/lib/layout/flow.js +225 -49
- package/dist/lib/layout/flow.js.map +2 -2
- package/dist/lib/layout/geometry-publication.d.ts +53 -0
- package/dist/lib/layout/geometry-publication.js +244 -0
- package/dist/lib/layout/geometry-publication.js.map +7 -0
- package/dist/lib/layout/grid-kernel.d.ts +63 -0
- package/dist/lib/layout/grid-kernel.js +168 -0
- package/dist/lib/layout/grid-kernel.js.map +7 -0
- package/dist/lib/layout/grid.d.ts +63 -4
- package/dist/lib/layout/grid.js +767 -171
- package/dist/lib/layout/grid.js.map +3 -3
- package/dist/lib/layout/measure.d.ts +55 -3
- package/dist/lib/layout/measure.js +448 -15
- package/dist/lib/layout/measure.js.map +2 -2
- package/dist/lib/layout/overlay.js +81 -23
- package/dist/lib/layout/overlay.js.map +2 -2
- package/dist/lib/layout/participation.d.ts +27 -0
- package/dist/lib/layout/participation.js +188 -0
- package/dist/lib/layout/participation.js.map +7 -0
- package/dist/lib/layout/place-child.js +1 -1
- package/dist/lib/layout/place-child.js.map +2 -2
- package/dist/lib/layout/positioning-diagnostics.d.ts +1 -1
- package/dist/lib/layout/positioning-diagnostics.js +13 -2
- package/dist/lib/layout/positioning-diagnostics.js.map +2 -2
- package/dist/lib/layout/prepared-root.d.ts +121 -0
- package/dist/lib/layout/prepared-root.js +360 -0
- package/dist/lib/layout/prepared-root.js.map +7 -0
- package/dist/lib/layout/standalone-kernel.d.ts +60 -0
- package/dist/lib/layout/standalone-kernel.js +722 -0
- package/dist/lib/layout/standalone-kernel.js.map +7 -0
- package/dist/lib/layout/topology.d.ts +21 -0
- package/dist/lib/layout/topology.js +113 -0
- package/dist/lib/layout/topology.js.map +7 -0
- package/dist/lib/layout/types.d.ts +5 -0
- package/dist/lib/layout/wasm/artifact.d.ts +1 -0
- package/dist/lib/layout/wasm/artifact.js +5 -0
- package/dist/lib/layout/wasm/artifact.js.map +7 -0
- package/dist/lib/layout/wasm/bytes.d.ts +1 -0
- package/dist/lib/layout/wasm/bytes.js +5 -0
- package/dist/lib/layout/wasm/bytes.js.map +7 -0
- package/dist/lib/layout/wasm/embedded.d.ts +2 -0
- package/dist/lib/layout/wasm/embedded.js +12 -0
- package/dist/lib/layout/wasm/embedded.js.map +7 -0
- package/dist/lib/layout/wasm/layout.wasm +0 -0
- package/dist/lib/layout/wasm/module.d.ts +8 -0
- package/dist/lib/layout/wasm/module.js +70 -0
- package/dist/lib/layout/wasm/module.js.map +7 -0
- package/dist/lib/layout/wasm/region.d.ts +267 -0
- package/dist/lib/layout/wasm/region.js +1018 -0
- package/dist/lib/layout/wasm/region.js.map +7 -0
- package/dist/lib/manipulation/controller.js +4 -7
- package/dist/lib/manipulation/controller.js.map +2 -2
- package/dist/lib/manipulation/frame.js +1 -1
- package/dist/lib/manipulation/frame.js.map +2 -2
- package/dist/lib/manipulation/handles.js +32 -33
- package/dist/lib/manipulation/handles.js.map +2 -2
- package/dist/lib/manipulation/solve.js +12 -10
- package/dist/lib/manipulation/solve.js.map +2 -2
- package/dist/lib/mount-pibbl.js +1 -0
- package/dist/lib/mount-pibbl.js.map +2 -2
- package/dist/lib/mount-prepared-pibbl.d.ts +5 -0
- package/dist/lib/mount-prepared-pibbl.js +29 -0
- package/dist/lib/mount-prepared-pibbl.js.map +7 -0
- package/dist/lib/mount-request.d.ts +8 -0
- package/dist/lib/mount-request.js +41 -0
- package/dist/lib/mount-request.js.map +7 -0
- package/dist/lib/pibbl.d.ts +21 -13
- package/dist/lib/pibbl.js +18 -16
- package/dist/lib/pibbl.js.map +2 -2
- package/dist/lib/recording/recording.d.ts +43 -0
- package/dist/lib/recording/recording.js +555 -0
- package/dist/lib/recording/recording.js.map +7 -0
- package/dist/lib/recording/types.d.ts +118 -0
- package/dist/lib/recording/wasm-bytes.d.ts +1 -0
- package/dist/lib/recording/wasm-bytes.js +5 -0
- package/dist/lib/recording/wasm-bytes.js.map +7 -0
- package/dist/lib/recording/worker-source.d.ts +1 -0
- package/dist/lib/recording/worker-source.js +5 -0
- package/dist/lib/recording/worker-source.js.map +7 -0
- package/dist/lib/render-layer/controller.d.ts +9 -3
- package/dist/lib/render-layer/controller.js +259 -110
- package/dist/lib/render-layer/controller.js.map +2 -2
- package/dist/lib/render-transaction.d.ts +12 -2
- package/dist/lib/render-transaction.js +69 -1
- package/dist/lib/render-transaction.js.map +2 -2
- package/dist/lib/render.js +32 -8
- package/dist/lib/render.js.map +2 -2
- package/dist/lib/scheduler/realm-scheduler.d.ts +2 -0
- package/dist/lib/scheduler/realm-scheduler.js +55 -26
- package/dist/lib/scheduler/realm-scheduler.js.map +2 -2
- package/dist/lib/scheduler/renderer-participant.js +1 -0
- package/dist/lib/scheduler/renderer-participant.js.map +2 -2
- package/dist/lib/series-inspection-frame.d.ts +18 -0
- package/dist/lib/series-inspection-frame.js +70 -0
- package/dist/lib/series-inspection-frame.js.map +7 -0
- package/dist/lib/signals/edge.d.ts +7 -4
- package/dist/lib/signals/edge.js +25 -3
- package/dist/lib/signals/edge.js.map +2 -2
- package/dist/lib/signals/graph.d.ts +16 -2
- package/dist/lib/signals/graph.js +54 -12
- package/dist/lib/signals/graph.js.map +2 -2
- package/dist/lib/signals/input-provision.d.ts +15 -0
- package/dist/lib/signals/input-provision.js +53 -3
- package/dist/lib/signals/input-provision.js.map +2 -2
- package/dist/lib/signals/render-consumer.d.ts +3 -0
- package/dist/lib/signals/render-consumer.js +22 -14
- package/dist/lib/signals/render-consumer.js.map +2 -2
- package/dist/lib/style/positioning.d.ts +50 -2
- package/dist/lib/style/positioning.js +28 -4
- package/dist/lib/style/positioning.js.map +2 -2
- package/dist/lib/style/resolve-built-in.d.ts +4 -3
- package/dist/lib/style/resolve-built-in.js +17 -3
- package/dist/lib/style/resolve-built-in.js.map +2 -2
- package/dist/lib/style/resolve-dispatch.d.ts +3 -0
- package/dist/lib/style/resolve-dispatch.js +77 -4
- package/dist/lib/style/resolve-dispatch.js.map +2 -2
- package/dist/lib/style/resolve-length.d.ts +2 -0
- package/dist/lib/style/resolve-length.js +13 -9
- package/dist/lib/style/resolve-length.js.map +2 -2
- package/dist/lib/style/sizing-length.d.ts +51 -0
- package/dist/lib/style/sizing-length.js +77 -0
- package/dist/lib/style/sizing-length.js.map +7 -0
- package/dist/lib/style/types.d.ts +63 -25
- package/dist/lib/surface/root-surface.js +10 -6
- package/dist/lib/surface/root-surface.js.map +2 -2
- package/dist/lib/textures/texture.js +10 -8
- package/dist/lib/textures/texture.js.map +2 -2
- package/dist/lib/transitions/capture.js +4 -1
- package/dist/lib/transitions/capture.js.map +2 -2
- package/dist/lib/transitions/embers-physics.js +17 -10
- package/dist/lib/transitions/embers-physics.js.map +2 -2
- package/dist/lib/types.d.ts +110 -1
- package/dist/sync.d.ts +16 -0
- package/dist/sync.js +13 -0
- package/dist/sync.js.map +7 -0
- package/dist/sync.mjs +1 -0
- package/package.json +26 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/features/physics/lib/2d/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
|
}
|
|
@@ -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
|
);
|