@pibbl/core 0.0.1 → 0.0.3-alpha.109.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/THIRD_PARTY_NOTICES.txt +81 -0
- package/dist/features/machines/animation.d.ts +64 -0
- package/dist/features/machines/animation.js +55 -0
- package/dist/features/machines/animation.js.map +7 -0
- package/dist/features/machines/animation.mjs +1 -0
- package/dist/features/machines/assign.d.ts +16 -0
- package/dist/features/machines/assign.js +15 -0
- package/dist/features/machines/assign.js.map +7 -0
- package/dist/features/machines/callback.d.ts +9 -0
- package/dist/features/machines/callback.js +7 -0
- package/dist/features/machines/callback.js.map +7 -0
- package/dist/features/machines/hook.d.ts +30 -0
- package/dist/features/machines/hook.js +37 -0
- package/dist/features/machines/hook.js.map +7 -0
- package/dist/features/machines/index.d.ts +6 -0
- package/dist/features/machines/index.js +12 -0
- package/dist/features/machines/index.js.map +7 -0
- package/dist/features/machines/index.mjs +1 -0
- package/dist/features/machines/runtime.d.ts +18 -0
- package/dist/features/machines/runtime.js +363 -0
- package/dist/features/machines/runtime.js.map +7 -0
- package/dist/features/machines/types.d.ts +164 -0
- package/dist/features/physics/2d-geometry.d.ts +3 -3
- package/dist/features/physics/2d-geometry.js.map +1 -1
- package/dist/features/physics/2d-testing.d.ts +1 -1
- package/dist/features/physics/2d-testing.js +2 -2
- package/dist/features/physics/2d-testing.js.map +2 -2
- package/dist/features/physics/2d.d.ts +115 -62
- package/dist/features/physics/2d.js +59 -28
- package/dist/features/physics/2d.js.map +2 -2
- package/dist/features/physics/lib/2d/canvas/components.js +25 -21
- package/dist/features/physics/lib/2d/canvas/components.js.map +2 -2
- package/dist/features/physics/lib/2d/canvas/presentation.js +1 -2
- package/dist/features/physics/lib/2d/canvas/presentation.js.map +2 -2
- package/dist/features/physics/lib/2d/collision/casts.js +4 -2
- package/dist/features/physics/lib/2d/collision/casts.js.map +2 -2
- package/dist/features/physics/lib/2d/query-types.d.ts +6 -0
- package/dist/features/physics/lib/2d/runtime/controller.d.ts +7 -6
- package/dist/features/physics/lib/2d/runtime/controller.js +1 -1
- package/dist/features/physics/lib/2d/runtime/controller.js.map +2 -2
- package/dist/features/physics/lib/2d/runtime/obstacles.js +9 -11
- package/dist/features/physics/lib/2d/runtime/obstacles.js.map +2 -2
- package/dist/features/physics/lib/2d/shapes.js +8 -9
- package/dist/features/physics/lib/2d/shapes.js.map +2 -2
- package/dist/features/physics/lib/2d/types.d.ts +8 -30
- package/dist/features/physics/lib/2d/world/queries.d.ts +7 -6
- package/dist/features/physics/lib/2d/world/queries.js.map +2 -2
- package/dist/features/physics/lib/2d/world/rapier.js +22 -26
- package/dist/features/physics/lib/2d/world/rapier.js.map +2 -2
- package/dist/features/sprites/formats/aseprite.d.ts +5 -0
- package/dist/features/sprites/formats/texture-packer.d.ts +5 -0
- package/dist/features/sprites/index.d.ts +6 -0
- package/dist/features/sprites/loader.d.ts +25 -0
- package/dist/features/sprites/loader.js +6 -3
- package/dist/features/sprites/loader.js.map +2 -2
- package/dist/features/sprites/model.d.ts +75 -0
- package/dist/features/sprites/sprite.d.ts +22 -0
- package/dist/features/textures/index.d.ts +12 -2
- package/dist/features/textures/index.js +33 -1
- package/dist/features/textures/index.js.map +2 -2
- package/dist/features/textures/lib/chemical-field.d.ts +56 -0
- package/dist/features/textures/lib/chemical-field.js +154 -0
- package/dist/features/textures/lib/chemical-field.js.map +7 -0
- package/dist/features/textures/lib/chemical-recipes.d.ts +119 -0
- package/dist/features/textures/lib/chemical-recipes.js +275 -0
- package/dist/features/textures/lib/chemical-recipes.js.map +7 -0
- package/dist/features/textures/lib/definitions.d.ts +3 -18
- package/dist/features/textures/lib/definitions.js +17 -24
- package/dist/features/textures/lib/definitions.js.map +2 -2
- package/dist/features/textures/lib/geometric-patterns.d.ts +149 -0
- package/dist/features/textures/lib/geometric-patterns.js +305 -0
- package/dist/features/textures/lib/geometric-patterns.js.map +7 -0
- package/dist/features/textures/lib/gray-scott.d.ts +55 -0
- package/dist/features/textures/lib/gray-scott.js +37 -0
- package/dist/features/textures/lib/gray-scott.js.map +7 -0
- package/dist/features/textures/lib/palette.js +1 -3
- package/dist/features/textures/lib/palette.js.map +2 -2
- package/dist/features/textures/lib/patterns.d.ts +123 -0
- package/dist/features/textures/lib/patterns.js +344 -0
- package/dist/features/textures/lib/patterns.js.map +7 -0
- package/dist/features/textures/lib/rain-drops.js +2 -1
- package/dist/features/textures/lib/rain-drops.js.map +2 -2
- package/dist/features/textures/lib/reaction-diffusion.d.ts +3 -2
- package/dist/features/textures/lib/reaction-diffusion.js +9 -20
- package/dist/features/textures/lib/reaction-diffusion.js.map +2 -2
- package/dist/features/textures/lib/simulation.d.ts +10 -4
- package/dist/features/textures/lib/simulation.js +23 -13
- package/dist/features/textures/lib/simulation.js.map +2 -2
- package/dist/features/textures/lib/wasm/electric.js +8 -1
- package/dist/features/textures/lib/wasm/electric.js.map +2 -2
- package/dist/features/textures/lib/water-surface.js +1 -3
- package/dist/features/textures/lib/water-surface.js.map +2 -2
- package/dist/features/viz/index.d.ts +92 -5
- package/dist/features/viz/index.js +202 -4
- package/dist/features/viz/index.js.map +2 -2
- package/dist/features/viz/inspection/bar.d.ts +79 -0
- package/dist/features/viz/inspection/bar.js +49 -0
- package/dist/features/viz/inspection/bar.js.map +7 -0
- package/dist/features/viz/inspection/candle.d.ts +156 -0
- package/dist/features/viz/inspection/candle.js +120 -0
- package/dist/features/viz/inspection/candle.js.map +7 -0
- package/dist/features/viz/inspection/capture-types.d.ts +65 -0
- package/dist/features/viz/inspection/capture.d.ts +16 -0
- package/dist/features/viz/inspection/capture.js +49 -0
- package/dist/features/viz/inspection/capture.js.map +7 -0
- package/dist/features/viz/inspection/handler.d.ts +36 -0
- package/dist/features/viz/inspection/handler.js +91 -0
- package/dist/features/viz/inspection/handler.js.map +7 -0
- package/dist/features/viz/inspection/ohlc-bar.d.ts +132 -0
- package/dist/features/viz/inspection/ohlc-bar.js +118 -0
- package/dist/features/viz/inspection/ohlc-bar.js.map +7 -0
- package/dist/features/viz/inspection/owned-ref.d.ts +16 -0
- package/dist/features/viz/inspection/owned-ref.js +99 -0
- package/dist/features/viz/inspection/owned-ref.js.map +7 -0
- package/dist/features/viz/inspection/painted-point.d.ts +22 -0
- package/dist/features/viz/inspection/painted-point.js +29 -0
- package/dist/features/viz/inspection/painted-point.js.map +7 -0
- package/dist/features/viz/inspection/queries.d.ts +100 -0
- package/dist/features/viz/inspection/queries.js +192 -0
- package/dist/features/viz/inspection/queries.js.map +7 -0
- package/dist/features/viz/inspection/query-types.d.ts +177 -0
- package/dist/features/viz/inspection/volume.d.ts +104 -0
- package/dist/features/viz/inspection/volume.js +95 -0
- package/dist/features/viz/inspection/volume.js.map +7 -0
- package/dist/features/viz/inspection.d.ts +19 -0
- package/dist/features/viz/inspection.js +54 -0
- package/dist/features/viz/inspection.js.map +7 -0
- package/dist/features/viz/inspection.mjs +1 -0
- package/dist/features/viz/lib/area-series.d.ts +62 -0
- package/dist/features/viz/lib/area-series.js +120 -0
- package/dist/features/viz/lib/area-series.js.map +7 -0
- package/dist/features/viz/lib/axis-labels.d.ts +2 -0
- package/dist/features/viz/lib/axis-labels.js +41 -0
- package/dist/features/viz/lib/axis-labels.js.map +7 -0
- package/dist/features/viz/lib/axis-title.d.ts +23 -0
- package/dist/features/viz/lib/axis-title.js +24 -0
- package/dist/features/viz/lib/axis-title.js.map +7 -0
- package/dist/features/viz/lib/axis.d.ts +1 -1
- package/dist/features/viz/lib/axis.js +50 -50
- package/dist/features/viz/lib/axis.js.map +2 -2
- package/dist/features/viz/lib/bar-scale.d.ts +7 -0
- package/dist/features/viz/lib/bar-scale.js +34 -0
- package/dist/features/viz/lib/bar-scale.js.map +7 -0
- package/dist/features/viz/lib/bar-series.d.ts +3 -1
- package/dist/features/viz/lib/bar-series.js +21 -5
- package/dist/features/viz/lib/bar-series.js.map +2 -2
- package/dist/features/viz/lib/baseline-series.d.ts +55 -0
- package/dist/features/viz/lib/baseline-series.js +136 -0
- package/dist/features/viz/lib/baseline-series.js.map +7 -0
- package/dist/features/viz/lib/candlestick-series.d.ts +62 -0
- package/dist/features/viz/lib/candlestick-series.js +150 -0
- package/dist/features/viz/lib/candlestick-series.js.map +7 -0
- package/dist/features/viz/lib/censored-point-series.d.ts +71 -0
- package/dist/features/viz/lib/censored-point-series.js +129 -0
- package/dist/features/viz/lib/censored-point-series.js.map +7 -0
- package/dist/features/viz/lib/chart-lines.d.ts +41 -0
- package/dist/features/viz/lib/chart-lines.js +32 -0
- package/dist/features/viz/lib/chart-lines.js.map +7 -0
- package/dist/features/viz/lib/color-context.d.ts +4 -0
- package/dist/features/viz/lib/color-context.js +41 -0
- package/dist/features/viz/lib/color-context.js.map +7 -0
- package/dist/features/viz/lib/color-math.d.ts +4 -0
- package/dist/features/viz/lib/color-math.js +31 -0
- package/dist/features/viz/lib/color-math.js.map +7 -0
- package/dist/features/viz/lib/color-types.d.ts +53 -0
- package/dist/features/viz/lib/curve-definition.d.ts +49 -0
- package/dist/features/viz/lib/curve-definition.js +142 -0
- package/dist/features/viz/lib/curve-definition.js.map +7 -0
- package/dist/features/viz/lib/diverging-color-scale.d.ts +11 -0
- package/dist/features/viz/lib/diverging-color-scale.js +51 -0
- package/dist/features/viz/lib/diverging-color-scale.js.map +7 -0
- package/dist/features/viz/lib/domain-navigation.d.ts +40 -0
- package/dist/features/viz/lib/domain-navigation.js +77 -0
- package/dist/features/viz/lib/domain-navigation.js.map +7 -0
- package/dist/features/viz/lib/editable-chart-elements.d.ts +178 -0
- package/dist/features/viz/lib/editable-chart-elements.js +733 -0
- package/dist/features/viz/lib/editable-chart-elements.js.map +7 -0
- package/dist/features/viz/lib/financial-aggregation.d.ts +127 -0
- package/dist/features/viz/lib/financial-aggregation.js +116 -0
- package/dist/features/viz/lib/financial-aggregation.js.map +7 -0
- package/dist/features/viz/lib/financial-autoscale.d.ts +64 -0
- package/dist/features/viz/lib/financial-autoscale.js +61 -0
- package/dist/features/viz/lib/financial-autoscale.js.map +7 -0
- package/dist/features/viz/lib/financial-comparison.d.ts +62 -0
- package/dist/features/viz/lib/financial-comparison.js +98 -0
- package/dist/features/viz/lib/financial-comparison.js.map +7 -0
- package/dist/features/viz/lib/financial-geometry.d.ts +77 -0
- package/dist/features/viz/lib/financial-geometry.js +67 -0
- package/dist/features/viz/lib/financial-geometry.js.map +7 -0
- package/dist/features/viz/lib/financial-indicators.d.ts +114 -0
- package/dist/features/viz/lib/financial-indicators.js +135 -0
- package/dist/features/viz/lib/financial-indicators.js.map +7 -0
- package/dist/features/viz/lib/financial-oscillators.d.ts +171 -0
- package/dist/features/viz/lib/financial-oscillators.js +265 -0
- package/dist/features/viz/lib/financial-oscillators.js.map +7 -0
- package/dist/features/viz/lib/graph/bipartite.d.ts +14 -0
- package/dist/features/viz/lib/graph/bipartite.js +250 -0
- package/dist/features/viz/lib/graph/bipartite.js.map +7 -0
- package/dist/features/viz/lib/graph/chord.d.ts +44 -0
- package/dist/features/viz/lib/graph/chord.js +348 -0
- package/dist/features/viz/lib/graph/chord.js.map +7 -0
- package/dist/features/viz/lib/graph/dependency.d.ts +26 -0
- package/dist/features/viz/lib/graph/dependency.js +140 -0
- package/dist/features/viz/lib/graph/dependency.js.map +7 -0
- package/dist/features/viz/lib/graph/force.d.ts +28 -0
- package/dist/features/viz/lib/graph/force.js +580 -0
- package/dist/features/viz/lib/graph/force.js.map +7 -0
- package/dist/features/viz/lib/graph/hierarchy.d.ts +21 -0
- package/dist/features/viz/lib/graph/hierarchy.js +112 -0
- package/dist/features/viz/lib/graph/hierarchy.js.map +7 -0
- package/dist/features/viz/lib/graph/icicle.d.ts +16 -0
- package/dist/features/viz/lib/graph/icicle.js +153 -0
- package/dist/features/viz/lib/graph/icicle.js.map +7 -0
- package/dist/features/viz/lib/graph/matrix.d.ts +30 -0
- package/dist/features/viz/lib/graph/matrix.js +243 -0
- package/dist/features/viz/lib/graph/matrix.js.map +7 -0
- package/dist/features/viz/lib/graph/neighborhood.d.ts +11 -0
- package/dist/features/viz/lib/graph/neighborhood.js +281 -0
- package/dist/features/viz/lib/graph/neighborhood.js.map +7 -0
- package/dist/features/viz/lib/graph/routes.d.ts +35 -0
- package/dist/features/viz/lib/graph/routes.js +101 -0
- package/dist/features/viz/lib/graph/routes.js.map +7 -0
- package/dist/features/viz/lib/graph/sankey.d.ts +44 -0
- package/dist/features/viz/lib/graph/sankey.js +341 -0
- package/dist/features/viz/lib/graph/sankey.js.map +7 -0
- package/dist/features/viz/lib/graph/shared.d.ts +59 -0
- package/dist/features/viz/lib/graph/shared.js +301 -0
- package/dist/features/viz/lib/graph/shared.js.map +7 -0
- package/dist/features/viz/lib/graph/tree.d.ts +11 -0
- package/dist/features/viz/lib/graph/tree.js +232 -0
- package/dist/features/viz/lib/graph/tree.js.map +7 -0
- package/dist/features/viz/lib/graph/treemap.d.ts +20 -0
- package/dist/features/viz/lib/graph/treemap.js +227 -0
- package/dist/features/viz/lib/graph/treemap.js.map +7 -0
- package/dist/features/viz/lib/graph/types.d.ts +1097 -0
- package/dist/features/viz/lib/hover-card.js +8 -9
- package/dist/features/viz/lib/hover-card.js.map +2 -2
- package/dist/features/viz/lib/hover-data.d.ts +1 -1
- package/dist/features/viz/lib/hover-data.js +6 -3
- package/dist/features/viz/lib/hover-data.js.map +2 -2
- package/dist/features/viz/lib/hover-types.d.ts +5 -5
- package/dist/features/viz/lib/interval-band-series.d.ts +49 -0
- package/dist/features/viz/lib/interval-band-series.js +136 -0
- package/dist/features/viz/lib/interval-band-series.js.map +7 -0
- package/dist/features/viz/lib/interval-diamond-series.d.ts +43 -0
- package/dist/features/viz/lib/interval-diamond-series.js +122 -0
- package/dist/features/viz/lib/interval-diamond-series.js.map +7 -0
- package/dist/features/viz/lib/interval-series.d.ts +79 -0
- package/dist/features/viz/lib/interval-series.js +158 -0
- package/dist/features/viz/lib/interval-series.js.map +7 -0
- package/dist/features/viz/lib/layout-pie.js +9 -13
- package/dist/features/viz/lib/layout-pie.js.map +2 -2
- package/dist/features/viz/lib/line-series.d.ts +1 -1
- package/dist/features/viz/lib/line-series.js +47 -28
- package/dist/features/viz/lib/line-series.js.map +2 -2
- package/dist/features/viz/lib/linear-scale-component.d.ts +7 -0
- package/dist/features/viz/lib/linear-scale-component.js +18 -0
- package/dist/features/viz/lib/linear-scale-component.js.map +7 -0
- package/dist/features/viz/lib/linear-scale.js +1 -1
- package/dist/features/viz/lib/linear-scale.js.map +2 -2
- package/dist/features/viz/lib/log-scale-component.d.ts +7 -0
- package/dist/features/viz/lib/log-scale-component.js +19 -0
- package/dist/features/viz/lib/log-scale-component.js.map +7 -0
- package/dist/features/viz/lib/log-scale.d.ts +2 -0
- package/dist/features/viz/lib/log-scale.js +53 -0
- package/dist/features/viz/lib/log-scale.js.map +7 -0
- package/dist/features/viz/lib/monotone-curve.d.ts +11 -0
- package/dist/features/viz/lib/monotone-curve.js +63 -0
- package/dist/features/viz/lib/monotone-curve.js.map +7 -0
- package/dist/features/viz/lib/nearest.d.ts +9 -9
- package/dist/features/viz/lib/nearest.js.map +1 -1
- package/dist/features/viz/lib/numeric-range-interpolation.d.ts +15 -0
- package/dist/features/viz/lib/numeric-range-interpolation.js +36 -0
- package/dist/features/viz/lib/numeric-range-interpolation.js.map +7 -0
- package/dist/features/viz/lib/numeric-ticks.d.ts +38 -0
- package/dist/features/viz/lib/numeric-ticks.js +54 -0
- package/dist/features/viz/lib/numeric-ticks.js.map +7 -0
- package/dist/features/viz/lib/ohlc-bar-series.d.ts +55 -0
- package/dist/features/viz/lib/ohlc-bar-series.js +168 -0
- package/dist/features/viz/lib/ohlc-bar-series.js.map +7 -0
- package/dist/features/viz/lib/paired-series.d.ts +44 -0
- package/dist/features/viz/lib/paired-series.js +93 -0
- package/dist/features/viz/lib/paired-series.js.map +7 -0
- package/dist/features/viz/lib/pie-layout.js +2 -1
- package/dist/features/viz/lib/pie-layout.js.map +2 -2
- package/dist/features/viz/lib/plot-series.js +11 -6
- package/dist/features/viz/lib/plot-series.js.map +2 -2
- package/dist/features/viz/lib/plot-types.d.ts +4 -3
- package/dist/features/viz/lib/point-scale-component.d.ts +7 -0
- package/dist/features/viz/lib/point-scale-component.js +19 -0
- package/dist/features/viz/lib/point-scale-component.js.map +7 -0
- package/dist/features/viz/lib/point-scale.d.ts +2 -0
- package/dist/features/viz/lib/point-scale.js +45 -0
- package/dist/features/viz/lib/point-scale.js.map +7 -0
- package/dist/features/viz/lib/point-series.d.ts +1 -1
- package/dist/features/viz/lib/point-series.js +36 -9
- package/dist/features/viz/lib/point-series.js.map +2 -2
- package/dist/features/viz/lib/point-types.d.ts +5 -2
- package/dist/features/viz/lib/reference-band.d.ts +16 -0
- package/dist/features/viz/lib/reference-band.js +30 -0
- package/dist/features/viz/lib/reference-band.js.map +7 -0
- package/dist/features/viz/lib/scale-adjust.js +9 -4
- package/dist/features/viz/lib/scale-adjust.js.map +2 -2
- package/dist/features/viz/lib/scale-context.d.ts +5 -4
- package/dist/features/viz/lib/scale-context.js +15 -11
- package/dist/features/viz/lib/scale-context.js.map +2 -2
- package/dist/features/viz/lib/scale-provider.d.ts +2 -0
- package/dist/features/viz/lib/scale-provider.js +13 -0
- package/dist/features/viz/lib/scale-provider.js.map +7 -0
- package/dist/features/viz/lib/scale-ticks.d.ts +5 -0
- package/dist/features/viz/lib/scale-ticks.js +64 -0
- package/dist/features/viz/lib/scale-ticks.js.map +7 -0
- package/dist/features/viz/lib/scale-view.d.ts +4 -0
- package/dist/features/viz/lib/scale-view.js +21 -0
- package/dist/features/viz/lib/scale-view.js.map +7 -0
- package/dist/features/viz/lib/sequential-color-scale.d.ts +11 -0
- package/dist/features/viz/lib/sequential-color-scale.js +49 -0
- package/dist/features/viz/lib/sequential-color-scale.js.map +7 -0
- package/dist/features/viz/lib/series-position.d.ts +12 -0
- package/dist/features/viz/lib/series-position.js +44 -0
- package/dist/features/viz/lib/series-position.js.map +7 -0
- package/dist/features/viz/lib/step-curves.d.ts +19 -0
- package/dist/features/viz/lib/step-curves.js +53 -0
- package/dist/features/viz/lib/step-curves.js.map +7 -0
- package/dist/features/viz/lib/symlog-scale-component.d.ts +7 -0
- package/dist/features/viz/lib/symlog-scale-component.js +19 -0
- package/dist/features/viz/lib/symlog-scale-component.js.map +7 -0
- package/dist/features/viz/lib/symlog-scale.d.ts +2 -0
- package/dist/features/viz/lib/symlog-scale.js +38 -0
- package/dist/features/viz/lib/symlog-scale.js.map +7 -0
- package/dist/features/viz/lib/threshold-color-scale.d.ts +43 -0
- package/dist/features/viz/lib/threshold-color-scale.js +59 -0
- package/dist/features/viz/lib/threshold-color-scale.js.map +7 -0
- package/dist/features/viz/lib/trading-time-mapping.d.ts +32 -0
- package/dist/features/viz/lib/trading-time-mapping.js +89 -0
- package/dist/features/viz/lib/trading-time-mapping.js.map +7 -0
- package/dist/features/viz/lib/trading-time-scale.d.ts +83 -0
- package/dist/features/viz/lib/trading-time-scale.js +96 -0
- package/dist/features/viz/lib/trading-time-scale.js.map +7 -0
- package/dist/features/viz/lib/trajectory-series.d.ts +71 -0
- package/dist/features/viz/lib/trajectory-series.js +111 -0
- package/dist/features/viz/lib/trajectory-series.js.map +7 -0
- package/dist/features/viz/lib/types.d.ts +114 -21
- package/dist/features/viz/lib/use-bar-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-bar-scale.js +9 -0
- package/dist/features/viz/lib/use-bar-scale.js.map +7 -0
- package/dist/features/viz/lib/use-continuous-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-continuous-scale.js +14 -0
- package/dist/features/viz/lib/use-continuous-scale.js.map +7 -0
- package/dist/features/viz/lib/use-linear-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-linear-scale.js +9 -0
- package/dist/features/viz/lib/use-linear-scale.js.map +7 -0
- package/dist/features/viz/lib/use-log-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-log-scale.js +9 -0
- package/dist/features/viz/lib/use-log-scale.js.map +7 -0
- package/dist/features/viz/lib/use-point-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-point-scale.js +9 -0
- package/dist/features/viz/lib/use-point-scale.js.map +7 -0
- package/dist/features/viz/lib/use-symlog-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-symlog-scale.js +9 -0
- package/dist/features/viz/lib/use-symlog-scale.js.map +7 -0
- package/dist/features/viz/lib/use-utc-scale.d.ts +8 -0
- package/dist/features/viz/lib/use-utc-scale.js +9 -0
- package/dist/features/viz/lib/use-utc-scale.js.map +7 -0
- package/dist/features/viz/lib/utc-labels.d.ts +12 -0
- package/dist/features/viz/lib/utc-labels.js +27 -0
- package/dist/features/viz/lib/utc-labels.js.map +7 -0
- package/dist/features/viz/lib/utc-scale-component.d.ts +7 -0
- package/dist/features/viz/lib/utc-scale-component.js +18 -0
- package/dist/features/viz/lib/utc-scale-component.js.map +7 -0
- package/dist/features/viz/lib/utc-scale.d.ts +21 -0
- package/dist/features/viz/lib/utc-scale.js +124 -0
- package/dist/features/viz/lib/utc-scale.js.map +7 -0
- package/dist/features/viz/lib/volume-series.d.ts +59 -0
- package/dist/features/viz/lib/volume-series.js +117 -0
- package/dist/features/viz/lib/volume-series.js.map +7 -0
- package/dist/features/viz/lib/weighted-point-series.d.ts +71 -0
- package/dist/features/viz/lib/weighted-point-series.js +169 -0
- package/dist/features/viz/lib/weighted-point-series.js.map +7 -0
- package/dist/filters/backdrop-contrast-gpu.d.ts +5 -0
- package/dist/filters/backdrop-contrast-gpu.js +33 -0
- package/dist/filters/backdrop-contrast-gpu.js.map +7 -0
- package/dist/filters/backdrop-contrast.d.ts +21 -0
- package/dist/filters/backdrop-contrast.js +61 -0
- package/dist/filters/backdrop-contrast.js.map +7 -0
- package/dist/filters/displacement.js +1 -1
- package/dist/filters/displacement.js.map +2 -2
- package/dist/filters/emboss-gpu.d.ts +4 -0
- package/dist/filters/emboss-gpu.js +39 -0
- package/dist/filters/emboss-gpu.js.map +7 -0
- package/dist/filters/emboss.d.ts +32 -0
- package/dist/filters/emboss.js +104 -0
- package/dist/filters/emboss.js.map +7 -0
- package/dist/filters/filter-executor.d.ts +11 -4
- package/dist/filters/filter-executor.js +104 -49
- package/dist/filters/filter-executor.js.map +2 -2
- package/dist/filters/reflected-light.js +1 -1
- package/dist/filters/reflected-light.js.map +2 -2
- package/dist/filters/reflection-gpu.d.ts +3 -1
- package/dist/filters/reflection-gpu.js +5 -2
- package/dist/filters/reflection-gpu.js.map +2 -2
- package/dist/filters/render-backdrop-contrast-boundary.d.ts +31 -0
- package/dist/filters/render-backdrop-contrast-boundary.js +116 -0
- package/dist/filters/render-backdrop-contrast-boundary.js.map +7 -0
- package/dist/filters/render-emboss-boundary.d.ts +13 -0
- package/dist/filters/render-emboss-boundary.js +131 -0
- package/dist/filters/render-emboss-boundary.js.map +7 -0
- package/dist/filters.d.ts +9 -5
- package/dist/filters.js +4 -0
- package/dist/filters.js.map +2 -2
- package/dist/index.d.ts +10 -6
- package/dist/index.js +18 -2
- package/dist/index.js.map +2 -2
- package/dist/internal.d.ts +4 -0
- package/dist/internal.js +6 -0
- package/dist/internal.js.map +2 -2
- package/dist/layout-kernel.d.ts +12 -0
- package/dist/layout-kernel.js +11 -0
- package/dist/layout-kernel.js.map +7 -0
- package/dist/layout-kernel.mjs +1 -0
- package/dist/lib/animation/definition.d.ts +5 -3
- package/dist/lib/animation/definition.js +29 -4
- package/dist/lib/animation/definition.js.map +2 -2
- package/dist/lib/animation/playback.d.ts +8 -0
- package/dist/lib/animation/playback.js +33 -11
- package/dist/lib/animation/playback.js.map +2 -2
- package/dist/lib/animation/spring.d.ts +3 -1
- package/dist/lib/animation/spring.js.map +2 -2
- package/dist/lib/animation/types.d.ts +29 -73
- package/dist/lib/backend/types.d.ts +13 -1
- package/dist/lib/backend/types.js.map +2 -2
- package/dist/lib/components/arc-geometry.js +2 -1
- package/dist/lib/components/arc-geometry.js.map +2 -2
- package/dist/lib/components/g.js +2 -0
- package/dist/lib/components/g.js.map +2 -2
- package/dist/lib/components/html-box.js +2 -1
- package/dist/lib/components/html-box.js.map +2 -2
- package/dist/lib/components/img.js +3 -3
- package/dist/lib/components/img.js.map +2 -2
- package/dist/lib/components/layer.js +98 -16
- package/dist/lib/components/layer.js.map +3 -3
- package/dist/lib/components/text.d.ts +16 -0
- package/dist/lib/components/text.js +131 -24
- package/dist/lib/components/text.js.map +2 -2
- package/dist/lib/define-primitive.d.ts +4 -2
- package/dist/lib/define-primitive.js +3 -1
- package/dist/lib/define-primitive.js.map +2 -2
- package/dist/lib/element/metadata.d.ts +9 -0
- package/dist/lib/element/metadata.js +19 -0
- package/dist/lib/element/metadata.js.map +2 -2
- package/dist/lib/element/resolve-primitive-inputs.d.ts +2 -0
- package/dist/lib/element/resolve-primitive-inputs.js +17 -4
- package/dist/lib/element/resolve-primitive-inputs.js.map +2 -2
- package/dist/lib/events/event-facade.d.ts +18 -0
- package/dist/lib/events/event-facade.js +28 -2
- package/dist/lib/events/event-facade.js.map +2 -2
- package/dist/lib/events/hit-test.js +2 -1
- package/dist/lib/events/hit-test.js.map +2 -2
- package/dist/lib/events/propagation.d.ts +2 -1
- package/dist/lib/events/propagation.js +22 -16
- package/dist/lib/events/propagation.js.map +2 -2
- package/dist/lib/events/registrations.d.ts +10 -0
- package/dist/lib/events/registrations.js +160 -5
- package/dist/lib/events/registrations.js.map +2 -2
- package/dist/lib/execute-render.js +25 -1
- package/dist/lib/execute-render.js.map +2 -2
- package/dist/lib/filter/filter-region.js +3 -10
- package/dist/lib/filter/filter-region.js.map +2 -2
- package/dist/lib/focus/focus-manager.d.ts +8 -1
- package/dist/lib/focus/focus-manager.js +87 -43
- package/dist/lib/focus/focus-manager.js.map +2 -2
- package/dist/lib/focus/geometry.d.ts +2 -0
- package/dist/lib/focus/geometry.js +6 -0
- package/dist/lib/focus/geometry.js.map +2 -2
- package/dist/lib/geometry/path-bend-guide.js +1 -1
- package/dist/lib/geometry/path-bend-guide.js.map +2 -2
- package/dist/lib/geometry/path-geometry.js +12 -11
- package/dist/lib/geometry/path-geometry.js.map +2 -2
- package/dist/lib/geometry/path-transforms.js +17 -21
- package/dist/lib/geometry/path-transforms.js.map +2 -2
- package/dist/lib/geometry/path-warp-bezier.js +3 -1
- package/dist/lib/geometry/path-warp-bezier.js.map +2 -2
- package/dist/lib/geometry/path-warp.js +1 -1
- package/dist/lib/geometry/path-warp.js.map +2 -2
- package/dist/lib/global-state.js +2 -0
- package/dist/lib/global-state.js.map +2 -2
- package/dist/lib/hooks/use-animated-value.d.ts +11 -21
- package/dist/lib/hooks/use-animated-value.js +23 -70
- package/dist/lib/hooks/use-animated-value.js.map +3 -3
- package/dist/lib/hooks/use-playback.js +1 -0
- package/dist/lib/hooks/use-playback.js.map +2 -2
- package/dist/lib/html/html-events.d.ts +32 -0
- package/dist/lib/html/html-events.js +179 -0
- package/dist/lib/html/html-events.js.map +7 -0
- package/dist/lib/html/html-service.d.ts +8 -2
- package/dist/lib/html/html-service.js +198 -65
- package/dist/lib/html/html-service.js.map +2 -2
- package/dist/lib/html/overlay-config.js +7 -6
- package/dist/lib/html/overlay-config.js.map +2 -2
- package/dist/lib/html/types.d.ts +29 -2
- package/dist/lib/layout/absolute.d.ts +11 -5
- package/dist/lib/layout/absolute.js +329 -55
- package/dist/lib/layout/absolute.js.map +3 -3
- package/dist/lib/layout/allocation-checkpoint-owner.d.ts +11 -0
- package/dist/lib/layout/allocation-checkpoint-owner.js +86 -0
- package/dist/lib/layout/allocation-checkpoint-owner.js.map +7 -0
- package/dist/lib/layout/allocation-checkpoint.d.ts +53 -0
- package/dist/lib/layout/allocation-checkpoint.js +463 -0
- package/dist/lib/layout/allocation-checkpoint.js.map +7 -0
- package/dist/lib/layout/allocation-dependencies.d.ts +30 -0
- package/dist/lib/layout/allocation-dependencies.js +90 -0
- package/dist/lib/layout/allocation-dependencies.js.map +7 -0
- package/dist/lib/layout/allocation-revision.d.ts +13 -0
- package/dist/lib/layout/allocation-revision.js +67 -0
- package/dist/lib/layout/allocation-revision.js.map +7 -0
- package/dist/lib/layout/box-insets.d.ts +17 -0
- package/dist/lib/layout/box-insets.js +138 -0
- package/dist/lib/layout/box-insets.js.map +7 -0
- package/dist/lib/layout/box-sizing.d.ts +16 -0
- package/dist/lib/layout/box-sizing.js +77 -0
- package/dist/lib/layout/box-sizing.js.map +7 -0
- package/dist/lib/layout/box.js +42 -12
- package/dist/lib/layout/box.js.map +2 -2
- package/dist/lib/layout/canvas-measurement.d.ts +13 -0
- package/dist/lib/layout/canvas-measurement.js +57 -0
- package/dist/lib/layout/canvas-measurement.js.map +7 -0
- package/dist/lib/layout/context.d.ts +35 -6
- package/dist/lib/layout/context.js +72 -3
- package/dist/lib/layout/context.js.map +2 -2
- package/dist/lib/layout/define-layout-component.d.ts +23 -0
- package/dist/lib/layout/define-layout-component.js +84 -0
- package/dist/lib/layout/define-layout-component.js.map +7 -0
- package/dist/lib/layout/flex-allocation-cache.d.ts +42 -0
- package/dist/lib/layout/flex-baseline-mode.d.ts +2 -0
- package/dist/lib/layout/flex-baseline-mode.js +7 -0
- package/dist/lib/layout/flex-baseline-mode.js.map +7 -0
- package/dist/lib/layout/flex.d.ts +50 -15
- package/dist/lib/layout/flex.js +2124 -195
- package/dist/lib/layout/flex.js.map +3 -3
- package/dist/lib/layout/flow.js +225 -49
- package/dist/lib/layout/flow.js.map +2 -2
- package/dist/lib/layout/geometry-publication.d.ts +53 -0
- package/dist/lib/layout/geometry-publication.js +244 -0
- package/dist/lib/layout/geometry-publication.js.map +7 -0
- package/dist/lib/layout/grid-kernel.d.ts +63 -0
- package/dist/lib/layout/grid-kernel.js +168 -0
- package/dist/lib/layout/grid-kernel.js.map +7 -0
- package/dist/lib/layout/grid.d.ts +63 -4
- package/dist/lib/layout/grid.js +767 -171
- package/dist/lib/layout/grid.js.map +3 -3
- package/dist/lib/layout/measure.d.ts +55 -3
- package/dist/lib/layout/measure.js +448 -15
- package/dist/lib/layout/measure.js.map +2 -2
- package/dist/lib/layout/overlay.js +81 -23
- package/dist/lib/layout/overlay.js.map +2 -2
- package/dist/lib/layout/participation.d.ts +27 -0
- package/dist/lib/layout/participation.js +188 -0
- package/dist/lib/layout/participation.js.map +7 -0
- package/dist/lib/layout/place-child.js +1 -1
- package/dist/lib/layout/place-child.js.map +2 -2
- package/dist/lib/layout/positioning-diagnostics.d.ts +1 -1
- package/dist/lib/layout/positioning-diagnostics.js +13 -2
- package/dist/lib/layout/positioning-diagnostics.js.map +2 -2
- package/dist/lib/layout/prepared-root.d.ts +121 -0
- package/dist/lib/layout/prepared-root.js +360 -0
- package/dist/lib/layout/prepared-root.js.map +7 -0
- package/dist/lib/layout/standalone-kernel.d.ts +60 -0
- package/dist/lib/layout/standalone-kernel.js +722 -0
- package/dist/lib/layout/standalone-kernel.js.map +7 -0
- package/dist/lib/layout/topology.d.ts +21 -0
- package/dist/lib/layout/topology.js +113 -0
- package/dist/lib/layout/topology.js.map +7 -0
- package/dist/lib/layout/types.d.ts +5 -0
- package/dist/lib/layout/wasm/artifact.d.ts +1 -0
- package/dist/lib/layout/wasm/artifact.js +5 -0
- package/dist/lib/layout/wasm/artifact.js.map +7 -0
- package/dist/lib/layout/wasm/bytes.d.ts +1 -0
- package/dist/lib/layout/wasm/bytes.js +5 -0
- package/dist/lib/layout/wasm/bytes.js.map +7 -0
- package/dist/lib/layout/wasm/embedded.d.ts +2 -0
- package/dist/lib/layout/wasm/embedded.js +12 -0
- package/dist/lib/layout/wasm/embedded.js.map +7 -0
- package/dist/lib/layout/wasm/layout.wasm +0 -0
- package/dist/lib/layout/wasm/module.d.ts +8 -0
- package/dist/lib/layout/wasm/module.js +70 -0
- package/dist/lib/layout/wasm/module.js.map +7 -0
- package/dist/lib/layout/wasm/region.d.ts +267 -0
- package/dist/lib/layout/wasm/region.js +1018 -0
- package/dist/lib/layout/wasm/region.js.map +7 -0
- package/dist/lib/manipulation/controller.js +4 -7
- package/dist/lib/manipulation/controller.js.map +2 -2
- package/dist/lib/manipulation/frame.js +1 -1
- package/dist/lib/manipulation/frame.js.map +2 -2
- package/dist/lib/manipulation/handles.js +32 -33
- package/dist/lib/manipulation/handles.js.map +2 -2
- package/dist/lib/manipulation/solve.js +12 -10
- package/dist/lib/manipulation/solve.js.map +2 -2
- package/dist/lib/mount-pibbl.js +1 -0
- package/dist/lib/mount-pibbl.js.map +2 -2
- package/dist/lib/mount-prepared-pibbl.d.ts +5 -0
- package/dist/lib/mount-prepared-pibbl.js +29 -0
- package/dist/lib/mount-prepared-pibbl.js.map +7 -0
- package/dist/lib/mount-request.d.ts +8 -0
- package/dist/lib/mount-request.js +41 -0
- package/dist/lib/mount-request.js.map +7 -0
- package/dist/lib/pibbl.d.ts +21 -13
- package/dist/lib/pibbl.js +18 -16
- package/dist/lib/pibbl.js.map +2 -2
- package/dist/lib/recording/recording.d.ts +43 -0
- package/dist/lib/recording/recording.js +555 -0
- package/dist/lib/recording/recording.js.map +7 -0
- package/dist/lib/recording/types.d.ts +118 -0
- package/dist/lib/recording/wasm-bytes.d.ts +1 -0
- package/dist/lib/recording/wasm-bytes.js +5 -0
- package/dist/lib/recording/wasm-bytes.js.map +7 -0
- package/dist/lib/recording/worker-source.d.ts +1 -0
- package/dist/lib/recording/worker-source.js +5 -0
- package/dist/lib/recording/worker-source.js.map +7 -0
- package/dist/lib/render-layer/controller.d.ts +9 -3
- package/dist/lib/render-layer/controller.js +259 -110
- package/dist/lib/render-layer/controller.js.map +2 -2
- package/dist/lib/render-transaction.d.ts +12 -2
- package/dist/lib/render-transaction.js +69 -1
- package/dist/lib/render-transaction.js.map +2 -2
- package/dist/lib/render.js +32 -8
- package/dist/lib/render.js.map +2 -2
- package/dist/lib/scheduler/realm-scheduler.d.ts +2 -0
- package/dist/lib/scheduler/realm-scheduler.js +55 -26
- package/dist/lib/scheduler/realm-scheduler.js.map +2 -2
- package/dist/lib/scheduler/renderer-participant.js +1 -0
- package/dist/lib/scheduler/renderer-participant.js.map +2 -2
- package/dist/lib/series-inspection-frame.d.ts +18 -0
- package/dist/lib/series-inspection-frame.js +70 -0
- package/dist/lib/series-inspection-frame.js.map +7 -0
- package/dist/lib/signals/edge.d.ts +7 -4
- package/dist/lib/signals/edge.js +25 -3
- package/dist/lib/signals/edge.js.map +2 -2
- package/dist/lib/signals/graph.d.ts +16 -2
- package/dist/lib/signals/graph.js +54 -12
- package/dist/lib/signals/graph.js.map +2 -2
- package/dist/lib/signals/input-provision.d.ts +15 -0
- package/dist/lib/signals/input-provision.js +53 -3
- package/dist/lib/signals/input-provision.js.map +2 -2
- package/dist/lib/signals/render-consumer.d.ts +3 -0
- package/dist/lib/signals/render-consumer.js +22 -14
- package/dist/lib/signals/render-consumer.js.map +2 -2
- package/dist/lib/style/positioning.d.ts +50 -2
- package/dist/lib/style/positioning.js +28 -4
- package/dist/lib/style/positioning.js.map +2 -2
- package/dist/lib/style/resolve-built-in.d.ts +4 -3
- package/dist/lib/style/resolve-built-in.js +17 -3
- package/dist/lib/style/resolve-built-in.js.map +2 -2
- package/dist/lib/style/resolve-dispatch.d.ts +3 -0
- package/dist/lib/style/resolve-dispatch.js +77 -4
- package/dist/lib/style/resolve-dispatch.js.map +2 -2
- package/dist/lib/style/resolve-length.d.ts +2 -0
- package/dist/lib/style/resolve-length.js +13 -9
- package/dist/lib/style/resolve-length.js.map +2 -2
- package/dist/lib/style/sizing-length.d.ts +51 -0
- package/dist/lib/style/sizing-length.js +77 -0
- package/dist/lib/style/sizing-length.js.map +7 -0
- package/dist/lib/style/types.d.ts +63 -25
- package/dist/lib/surface/root-surface.js +10 -6
- package/dist/lib/surface/root-surface.js.map +2 -2
- package/dist/lib/textures/texture.js +10 -8
- package/dist/lib/textures/texture.js.map +2 -2
- package/dist/lib/transitions/capture.js +4 -1
- package/dist/lib/transitions/capture.js.map +2 -2
- package/dist/lib/transitions/embers-physics.js +17 -10
- package/dist/lib/transitions/embers-physics.js.map +2 -2
- package/dist/lib/types.d.ts +110 -1
- package/dist/sync.d.ts +16 -0
- package/dist/sync.js +13 -0
- package/dist/sync.js.map +7 -0
- package/dist/sync.mjs +1 -0
- package/package.json +43 -6
- package/dist/features/viz/lib/scale.d.ts +0 -11
- package/dist/features/viz/lib/scale.js +0 -80
- package/dist/features/viz/lib/scale.js.map +0 -7
- package/dist/features/viz/lib/use-scale.d.ts +0 -20
- package/dist/features/viz/lib/use-scale.js +0 -10
- package/dist/features/viz/lib/use-scale.js.map +0 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/features/physics/lib/2d/world/rapier.ts"],
|
|
4
|
-
"sourcesContent": ["import RAPIER from \"./rapier-engine.js\";\nimport type { BodyStore2D, ColliderStore2D } from \"./storage.js\";\nimport type { ShapeRecord2D, ConvexLeaf2D } from \"../shape-records.js\";\nimport type { PrivateManifold2D } from \"../collision/manifold.js\";\nimport { BODY_CCD_2D, collisionFiltersAllow2D } from \"./ccd.js\";\nimport {\n BODY_TYPE_DYNAMIC_2D,\n BODY_TYPE_KINEMATIC_2D,\n BODY_FIXED_ROTATION_2D,\n} from \"./integrator.js\";\nimport { BODY_SLEEPING_2D, BODY_SLEEP_DISABLED_2D } from \"./solver.js\";\nimport {\n COLLIDER_SENSOR_2D,\n type SortedColliderPairs2D,\n} from \"./contact-cache.js\";\n\n// The compat build embeds WASM; initialization neither starts a clock nor fetches\n// an external URL. Importers finish loading before any world can be mounted.\nawait RAPIER.init();\nconst SCALE = 100;\nlet ownedWorlds = 0;\nexport function liveRapierWorldsForTest(): number {\n return ownedWorlds;\n}\n\ninterface BodyBinding {\n handle: number;\n generation: number;\n configuration?: string;\n staticPose?: readonly [number, number, number];\n}\ninterface ColliderBinding {\n handles: number[];\n generation: number;\n shape: ShapeRecord2D;\n body: number;\n centerX: number;\n centerY: number;\n feature: number;\n}\nexport interface RapierCheckpoint2D {\n bytes: Uint8Array;\n bodies: Map<number, BodyBinding>;\n colliders: Map<number, ColliderBinding>;\n}\n\n/** Private engine bridge. Pibbl retains identity, transactions, commands and time. */\nexport class RapierSimulation2D {\n private world = new RAPIER.World({ x: 0, y: 0 });\n private disposed = false;\n private bodyBindings = new Map<number, BodyBinding>();\n private colliderBindings = new Map<number, ColliderBinding>();\n private colliderIndices = new Map<number, number>();\n private impulses = new Map<string, number[]>();\n private impacts = new Map<\n string,\n {\n first: number;\n second: number;\n manifold: PrivateManifold2D;\n impulses: number[];\n }\n >();\n\n constructor() {\n this.world.lengthUnit = 1;\n ownedWorlds++;\n }\n\n checkpoint(): RapierCheckpoint2D {\n return {\n bytes: this.world.takeSnapshot(),\n bodies: new Map(this.bodyBindings),\n colliders: new Map(this.colliderBindings),\n };\n }\n\n restore(checkpoint: RapierCheckpoint2D): void {\n const restored = RAPIER.World.restoreSnapshot(checkpoint.bytes);\n this.world.free();\n this.world = restored;\n this.bodyBindings = new Map(checkpoint.bodies);\n this.colliderBindings = new Map(checkpoint.colliders);\n this.rebuildColliderIndices();\n this.impulses.clear();\n this.impacts.clear();\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.world.free();\n ownedWorlds--;\n this.bodyBindings.clear();\n this.colliderBindings.clear();\n this.colliderIndices.clear();\n this.impulses.clear();\n this.impacts.clear();\n }\n\n step(\n bodies: BodyStore2D,\n colliders: ColliderStore2D,\n dt: number,\n gravityX: number,\n gravityY: number,\n sleeping: boolean,\n velocityIterations = 4,\n positionIterations = 1,\n ): void {\n validateEngineNumber(gravityX / SCALE);\n validateEngineNumber(gravityY / SCALE);\n this.synchronize(bodies, colliders, sleeping);\n const kinematicTargets = new Map<\n number,\n { x: number; y: number; angle: number }\n >();\n for (const [index, binding] of this.bodyBindings) {\n const body = this.world.getRigidBody(binding.handle);\n if (bodies.flags[index]! & BODY_TYPE_KINEMATIC_2D) {\n const target = {\n x: bodies.positionX[index]! + bodies.linearVelocityX[index]! * dt,\n y: bodies.positionY[index]! + bodies.linearVelocityY[index]! * dt,\n angle:\n bodies.rotationRadians[index]! +\n bodies.angularVelocity[index]! * dt,\n };\n body.setNextKinematicTranslation({\n x: target.x / SCALE,\n y: target.y / SCALE,\n });\n body.setNextKinematicRotation(target.angle);\n kinematicTargets.set(index, target);\n } else if (\n !(bodies.flags[index]! & BODY_SLEEPING_2D) &&\n (gravityX !== 0 || gravityY !== 0) &&\n bodies.gravityScale[index] !== 0 &&\n !this.hasSolidContact(body)\n )\n body.wakeUp();\n }\n this.world.gravity = { x: gravityX / SCALE, y: gravityY / SCALE };\n this.world.numSolverIterations = velocityIterations;\n this.world.numInternalPgsIterations = positionIterations;\n const substeps = this.ccdSubsteps(\n bodies,\n colliders,\n dt,\n gravityX,\n gravityY,\n );\n this.world.timestep = dt / substeps;\n this.world.integrationParameters.maxCcdSubsteps = 4;\n const allowed = (a: number, b: number) => {\n const first = this.colliderIndices.get(a);\n const second = this.colliderIndices.get(b);\n return (\n first !== undefined &&\n second !== undefined &&\n collisionFiltersAllow2D(\n colliders.filters[first],\n colliders.filters[second],\n )\n );\n };\n const hooks: RAPIER.PhysicsHooks = {\n filterContactPair: (a, b) =>\n allowed(a, b) ? RAPIER.SolverFlags.COMPUTE_IMPULSE : null,\n filterIntersectionPair: allowed,\n };\n const starts = new Map(\n [...kinematicTargets.keys()].map((index) => [\n index,\n {\n x: bodies.positionX[index]!,\n y: bodies.positionY[index]!,\n angle: bodies.rotationRadians[index]!,\n },\n ]),\n );\n this.impulses.clear();\n this.impacts.clear();\n for (let substep = 1; substep <= substeps; substep++) {\n const fraction = substep / substeps;\n for (const [index, target] of kinematicTargets) {\n const start = starts.get(index)!;\n const body = this.world.getRigidBody(\n this.bodyBindings.get(index)!.handle,\n );\n body.setNextKinematicTranslation({\n x: (start.x + (target.x - start.x) * fraction) / SCALE,\n y: (start.y + (target.y - start.y) * fraction) / SCALE,\n });\n body.setNextKinematicRotation(\n start.angle + (target.angle - start.angle) * fraction,\n );\n }\n this.world.step(undefined, hooks);\n if (substeps > 1) this.captureImpacts(bodies);\n }\n for (const [index, binding] of this.bodyBindings) {\n if (\n !(\n bodies.flags[index]! &\n (BODY_TYPE_DYNAMIC_2D | BODY_TYPE_KINEMATIC_2D)\n )\n )\n continue;\n const body = this.world.getRigidBody(binding.handle);\n const position = body.translation();\n const velocity = body.linvel();\n for (const value of [\n position.x,\n position.y,\n velocity.x,\n velocity.y,\n body.rotation(),\n body.angvel(),\n ])\n validateEngineNumber(value);\n const target = kinematicTargets.get(index);\n bodies.positionX[index] =\n target?.x ?? logicalValue(position.x, bodies.positionX[index]!);\n bodies.positionY[index] =\n target?.y ?? logicalValue(position.y, bodies.positionY[index]!);\n bodies.rotationRadians[index] = target?.angle ?? body.rotation();\n bodies.linearVelocityX[index] = logicalValue(\n velocity.x,\n bodies.linearVelocityX[index]!,\n );\n bodies.linearVelocityY[index] = logicalValue(\n velocity.y,\n bodies.linearVelocityY[index]!,\n );\n bodies.angularVelocity[index] = body.angvel();\n bodies.forceX[index] = 0;\n bodies.forceY[index] = 0;\n bodies.torque[index] = 0;\n if (body.isSleeping()) bodies.flags[index]! |= BODY_SLEEPING_2D;\n else bodies.flags[index]! &= ~BODY_SLEEPING_2D;\n }\n }\n\n manifold(first: number, second: number): PrivateManifold2D | null {\n const impact = this.impacts.get(`${first}:${second}`);\n if (impact) {\n this.impulses.set(`${first}:${second}`, impact.impulses);\n return impact.manifold;\n }\n return this.currentManifold(first, second);\n }\n\n contactPairs(\n pairs: SortedColliderPairs2D,\n colliders: ColliderStore2D,\n ): SortedColliderPairs2D {\n if (this.impacts.size === 0) return pairs;\n const merged = new Map<string, readonly [number, number]>();\n for (let i = 0; i < pairs.pairCount; i++) {\n const a = pairs.pairFirstColliderIndices[i]!,\n b = pairs.pairSecondColliderIndices[i]!;\n merged.set(`${a}:${b}`, [a, b]);\n }\n for (const [key, impact] of this.impacts)\n merged.set(key, [impact.first, impact.second]);\n const sorted = [...merged.values()].sort(\n (a, b) => a[0] - b[0] || a[1] - b[1],\n );\n return {\n pairCount: sorted.length,\n pairFirstColliderIndices: Int32Array.from(sorted, (pair) => pair[0]),\n pairSecondColliderIndices: Int32Array.from(sorted, (pair) => pair[1]),\n pairFirstColliderGenerations: Uint32Array.from(\n sorted,\n (pair) => colliders.generations[pair[0]]!,\n ),\n pairSecondColliderGenerations: Uint32Array.from(\n sorted,\n (pair) => colliders.generations[pair[1]]!,\n ),\n };\n }\n\n private captureImpacts(bodies: BodyStore2D): void {\n const seen = new Set<string>();\n for (const [index, binding] of this.colliderBindings) {\n if (!(bodies.flags[binding.body]! & BODY_CCD_2D)) continue;\n for (const handle of binding.handles) {\n const collider = this.world.getCollider(handle);\n if (collider.isSensor()) continue;\n this.world.contactPairsWith(collider, (other) => {\n if (other.isSensor()) return;\n const otherIndex = this.colliderIndices.get(other.handle);\n if (otherIndex === undefined || otherIndex === index) return;\n const first = Math.min(index, otherIndex),\n second = Math.max(index, otherIndex),\n key = `${first}:${second}`;\n if (seen.has(key)) return;\n seen.add(key);\n const manifold = this.currentManifold(first, second, true);\n const impulses = this.impulses.get(key);\n if (!manifold || !impulses?.some((value) => value > 0)) return;\n const previous = this.impacts.get(key);\n this.impacts.set(key, {\n first,\n second,\n manifold,\n impulses: impulses.map(\n (value, i) => value + (previous?.impulses[i] ?? 0),\n ),\n });\n });\n }\n }\n }\n\n private currentManifold(\n first: number,\n second: number,\n includePredictiveImpact = false,\n ): PrivateManifold2D | null {\n const a = this.colliderBindings.get(first);\n const b = this.colliderBindings.get(second);\n if (!a || !b) return null;\n let result: PrivateManifold2D | null = null;\n let depth = Infinity;\n for (let ai = 0; ai < a.handles.length; ai++)\n for (let bi = 0; bi < b.handles.length; bi++) {\n const ca = this.world.getCollider(a.handles[ai]!);\n const cb = this.world.getCollider(b.handles[bi]!);\n if (ca.isSensor() || cb.isSensor()) {\n if (this.world.intersectionPair(ca, cb))\n return {\n normalX: 1,\n normalY: 0,\n firstLeaf: ai,\n secondLeaf: bi,\n points: [\n {\n firstX: ca.translation().x,\n firstY: ca.translation().y,\n secondX: cb.translation().x,\n secondY: cb.translation().y,\n separation: 0,\n firstFeature: 0,\n secondFeature: 0,\n },\n ],\n };\n continue;\n }\n this.world.contactPair(ca, cb, (contact, flipped) => {\n if (contact.numContacts() === 0) return;\n const separation =\n SCALE *\n Math.min(\n ...Array.from({ length: contact.numContacts() }, (_, i) =>\n contact.contactDist(i),\n ),\n );\n if (\n (!includePredictiveImpact && separation > 0.5) ||\n separation >= depth\n )\n return;\n const normal = contact.normal();\n const nx = normal.x * (flipped ? 1 : -1),\n ny = normal.y * (flipped ? 1 : -1);\n const points = [];\n const impulses = [];\n for (let i = 0; i < Math.min(2, contact.numContacts()); i++) {\n const pa = contact.localContactPoint1(i)!;\n const pb = contact.localContactPoint2(i)!;\n const wa = worldPoint(flipped ? cb : ca, pa);\n const wb = worldPoint(flipped ? ca : cb, pb);\n points.push({\n firstX: flipped ? wb.x : wa.x,\n firstY: flipped ? wb.y : wa.y,\n secondX: flipped ? wa.x : wb.x,\n secondY: flipped ? wa.y : wb.y,\n separation: contact.contactDist(i) * SCALE,\n firstFeature: contact.contactFid1(i),\n secondFeature: contact.contactFid2(i),\n });\n impulses.push(contact.contactImpulse(i) * SCALE);\n }\n result = {\n normalX: nx,\n normalY: ny,\n firstLeaf: ai,\n secondLeaf: bi,\n points,\n };\n depth = separation;\n this.impulses.set(`${first}:${second}`, impulses);\n });\n }\n return result;\n }\n\n normalImpulses(first: number, second: number): readonly number[] {\n return this.impulses.get(`${first}:${second}`) ?? [];\n }\n\n private synchronize(\n bodies: BodyStore2D,\n colliders: ColliderStore2D,\n sleeping: boolean,\n ): void {\n for (const [index, binding] of this.colliderBindings) {\n if (\n colliders.has(index, binding.generation) &&\n colliders.shapes[index] === binding.shape &&\n colliders.bodyIndices[index] === binding.body &&\n bodies.localCenterX[binding.body] === binding.centerX &&\n bodies.localCenterY[binding.body] === binding.centerY\n )\n continue;\n for (const handle of binding.handles) {\n const collider = this.world.getCollider(handle);\n if (collider) this.world.removeCollider(collider, false);\n }\n this.colliderBindings.delete(index);\n }\n for (const [index, binding] of this.bodyBindings) {\n if (bodies.has(index, binding.generation)) continue;\n this.world.removeRigidBody(this.world.getRigidBody(binding.handle));\n this.bodyBindings.delete(index);\n }\n for (let index = 0; index < bodies.capacity; index++) {\n const generation = bodies.generations[index]!;\n if (!bodies.has(index, generation)) continue;\n const flags = bodies.flags[index]!;\n for (const value of [\n bodies.positionX[index]! / SCALE,\n bodies.positionY[index]! / SCALE,\n bodies.linearVelocityX[index]! / SCALE,\n bodies.linearVelocityY[index]! / SCALE,\n bodies.rotationRadians[index]!,\n bodies.angularVelocity[index]!,\n bodies.forceX[index]! / SCALE,\n bodies.forceY[index]! / SCALE,\n bodies.torque[index]! / (SCALE * SCALE),\n bodies.gravityScale[index]!,\n bodies.linearDamping[index]!,\n bodies.angularDamping[index]!,\n ])\n validateEngineNumber(value);\n if (bodies.inverseMass[index]! > 0)\n validateEngineNumber(1 / bodies.inverseMass[index]!);\n if (bodies.inverseInertia[index]! > 0)\n validateEngineNumber(\n 1 / bodies.inverseInertia[index]! / (SCALE * SCALE),\n );\n const type =\n flags & BODY_TYPE_DYNAMIC_2D\n ? RAPIER.RigidBodyType.Dynamic\n : flags & BODY_TYPE_KINEMATIC_2D\n ? RAPIER.RigidBodyType.KinematicPositionBased\n : RAPIER.RigidBodyType.Fixed;\n let binding = this.bodyBindings.get(index);\n if (!binding) {\n const created = this.world.createRigidBody(\n new RAPIER.RigidBodyDesc(type).setCanSleep(true),\n );\n binding = { handle: created.handle, generation };\n this.bodyBindings.set(index, binding);\n }\n const configuration = [\n type,\n bodies.gravityScale[index],\n bodies.linearDamping[index],\n bodies.angularDamping[index],\n flags & (BODY_CCD_2D | BODY_FIXED_ROTATION_2D),\n bodies.inverseMass[index],\n bodies.inverseInertia[index],\n ].join(\":\");\n if (\n type === RAPIER.RigidBodyType.Fixed &&\n binding.configuration === configuration &&\n binding.staticPose?.[0] === bodies.positionX[index] &&\n binding.staticPose[1] === bodies.positionY[index] &&\n binding.staticPose[2] === bodies.rotationRadians[index]\n )\n continue;\n const body = this.world.getRigidBody(binding.handle);\n if (body.bodyType() !== type) body.setBodyType(type, false);\n const position = body.translation();\n if (\n position.x !== Math.fround(bodies.positionX[index]! / SCALE) ||\n position.y !== Math.fround(bodies.positionY[index]! / SCALE)\n )\n body.setTranslation(\n {\n x: bodies.positionX[index]! / SCALE,\n y: bodies.positionY[index]! / SCALE,\n },\n false,\n );\n if (body.rotation() !== bodies.rotationRadians[index])\n body.setRotation(bodies.rotationRadians[index]!, false);\n const velocity = body.linvel();\n if (\n velocity.x !== Math.fround(bodies.linearVelocityX[index]! / SCALE) ||\n velocity.y !== Math.fround(bodies.linearVelocityY[index]! / SCALE)\n )\n body.setLinvel(\n {\n x: bodies.linearVelocityX[index]! / SCALE,\n y: bodies.linearVelocityY[index]! / SCALE,\n },\n false,\n );\n if (body.angvel() !== bodies.angularVelocity[index])\n body.setAngvel(bodies.angularVelocity[index]!, false);\n\n if (binding.configuration !== configuration) {\n this.bodyBindings.set(index, { ...binding, configuration });\n body.setGravityScale(bodies.gravityScale[index]!, false);\n body.setLinearDamping(bodies.linearDamping[index]!);\n body.setAngularDamping(bodies.angularDamping[index]!);\n body.enableCcd(!!(flags & BODY_CCD_2D));\n body.lockRotations(!!(flags & BODY_FIXED_ROTATION_2D), false);\n const inverseMass = bodies.inverseMass[index]!,\n inverseInertia = bodies.inverseInertia[index]!;\n body.setAdditionalMassProperties(\n inverseMass > 0 ? 1 / inverseMass : 0,\n { x: 0, y: 0 },\n inverseInertia > 0 ? 1 / inverseInertia / (SCALE * SCALE) : 0,\n false,\n );\n }\n if (type === RAPIER.RigidBodyType.Fixed) {\n this.bodyBindings.set(index, {\n ...this.bodyBindings.get(index)!,\n staticPose: [\n bodies.positionX[index]!,\n bodies.positionY[index]!,\n bodies.rotationRadians[index]!,\n ],\n });\n continue;\n }\n body.resetForces(false);\n body.resetTorques(false);\n body.addForce(\n { x: bodies.forceX[index]! / SCALE, y: bodies.forceY[index]! / SCALE },\n false,\n );\n body.addTorque(bodies.torque[index]! / (SCALE * SCALE), false);\n if (flags & BODY_SLEEPING_2D) {\n if (!body.isSleeping()) body.sleep();\n } else if (\n body.isSleeping() ||\n !sleeping ||\n flags & BODY_SLEEP_DISABLED_2D\n )\n body.wakeUp();\n }\n for (let index = 0; index < colliders.capacity; index++) {\n const generation = colliders.generations[index]!;\n if (!colliders.has(index, generation) || this.colliderBindings.has(index))\n continue;\n const shape = colliders.shapes[index]!;\n const bodyIndex = colliders.bodyIndices[index]!;\n const body = this.world.getRigidBody(\n this.bodyBindings.get(bodyIndex)!.handle,\n );\n const material = colliders.materials[index] as {\n friction?: number;\n restitution?: number;\n } | null;\n const handles = shape.leaves.map((leaf) => {\n const desc = leafDescriptor(\n leaf,\n shape,\n bodies.localCenterX[bodyIndex]!,\n bodies.localCenterY[bodyIndex]!,\n );\n desc\n .setDensity(0)\n .setFriction(Math.sqrt(material?.friction ?? 0.5))\n .setRestitution(material?.restitution ?? 0)\n .setFrictionCombineRule(RAPIER.CoefficientCombineRule.Multiply)\n .setRestitutionCombineRule(RAPIER.CoefficientCombineRule.Max)\n .setSensor(!!(colliders.flags[index]! & COLLIDER_SENSOR_2D))\n .setActiveCollisionTypes(RAPIER.ActiveCollisionTypes.ALL)\n .setActiveHooks(\n RAPIER.ActiveHooks.FILTER_CONTACT_PAIRS |\n RAPIER.ActiveHooks.FILTER_INTERSECTION_PAIRS,\n );\n return this.world.createCollider(desc, body).handle;\n });\n this.colliderBindings.set(index, {\n handles,\n generation,\n shape,\n body: bodyIndex,\n centerX: bodies.localCenterX[bodyIndex]!,\n centerY: bodies.localCenterY[bodyIndex]!,\n feature: Math.max(0.01, Math.min(...shape.leaves.map(minimumFeature))),\n });\n }\n this.rebuildColliderIndices();\n }\n\n private ccdSubsteps(\n bodies: BodyStore2D,\n colliders: ColliderStore2D,\n dt: number,\n gravityX: number,\n gravityY: number,\n ): number {\n let required = 1;\n for (const [index, binding] of this.colliderBindings) {\n const body = binding.body;\n if (\n !(bodies.flags[body]! & BODY_CCD_2D) ||\n !(bodies.flags[body]! & BODY_TYPE_DYNAMIC_2D) ||\n colliders.flags[index]! & COLLIDER_SENSOR_2D\n )\n continue;\n const bounds = binding.shape.localBounds;\n const width = bounds[2]! - bounds[0]!,\n height = bounds[3]! - bounds[1]!;\n const feature = Math.max(0.01, Math.min(width, height, binding.feature));\n // Bound every shape corner about the body's center of mass. Bounds can\n // occupy opposite quadrants, and collider descriptors are COM-relative.\n let radius = 0;\n for (let corner = 0; corner < 4; corner++) {\n const x =\n (corner % 2 === 0 ? bounds[0]! : bounds[2]!) -\n bodies.localCenterX[body]!;\n const y =\n (corner < 2 ? bounds[1]! : bounds[3]!) -\n bodies.localCenterY[body]!;\n radius = Math.max(radius, Math.hypot(x, y));\n }\n const acceleration = Math.hypot(\n gravityX * bodies.gravityScale[body]! +\n bodies.forceX[body]! * bodies.inverseMass[body]!,\n gravityY * bodies.gravityScale[body]! +\n bodies.forceY[body]! * bodies.inverseMass[body]!,\n );\n const angularAcceleration = Math.abs(\n bodies.torque[body]! * bodies.inverseInertia[body]!,\n );\n const speed =\n Math.hypot(\n bodies.linearVelocityX[body]!,\n bodies.linearVelocityY[body]!,\n ) +\n acceleration * dt +\n (Math.abs(bodies.angularVelocity[body]!) + angularAcceleration * dt) *\n radius;\n required = Math.max(required, Math.ceil((speed * dt) / (feature * 0.25)));\n }\n if (required > 64)\n throw new RangeError(\n `Physics CCD requires ${required} substeps (maximum 64). Reduce velocity or fixedStepMilliseconds, or enlarge the collider.`,\n );\n return required;\n }\n\n private hasSolidContact(body: RAPIER.RigidBody): boolean {\n let touching = false;\n for (let i = 0; i < body.numColliders(); i++) {\n const collider = body.collider(i);\n if (collider.isSensor()) continue;\n this.world.contactPairsWith(collider, (other) => {\n if (other.isSensor()) return;\n this.world.contactPair(collider, other, (contact) => {\n for (let point = 0; point < contact.numContacts(); point++)\n if (contact.contactDist(point) <= 0.5 / SCALE) touching = true;\n });\n });\n }\n return touching;\n }\n\n private rebuildColliderIndices(): void {\n this.colliderIndices.clear();\n for (const [index, binding] of this.colliderBindings)\n for (const handle of binding.handles)\n this.colliderIndices.set(handle, index);\n }\n}\n\nfunction worldPoint(\n collider: RAPIER.Collider,\n p: RAPIER.Vector,\n): RAPIER.Vector {\n const position = collider.translation(),\n angle = collider.rotation();\n return {\n x: (position.x + Math.cos(angle) * p.x - Math.sin(angle) * p.y) * SCALE,\n y: (position.y + Math.sin(angle) * p.x + Math.cos(angle) * p.y) * SCALE,\n };\n}\n\nfunction leafDescriptor(\n leaf: ConvexLeaf2D,\n shape: ShapeRecord2D,\n centerX: number,\n centerY: number,\n): RAPIER.ColliderDesc {\n // Reject overflow/underflow before crossing the f32 WASM boundary.\n for (const [key, value] of Object.entries(leaf)) {\n if (value instanceof Float64Array)\n for (const number of value) validateEngineNumber(number / SCALE);\n else if (typeof value === \"number\")\n validateEngineNumber(key === \"rotationRadians\" ? value : value / SCALE);\n }\n for (const value of [shape.localPose.x, shape.localPose.y, centerX, centerY])\n validateEngineNumber(value / SCALE);\n let desc: RAPIER.ColliderDesc;\n let x = 0,\n y = 0,\n angle = 0;\n if (leaf.kind === \"circle\") {\n desc = RAPIER.ColliderDesc.ball(leaf.radius / SCALE);\n [x, y] = [leaf.center[0]!, leaf.center[1]!];\n } else if (leaf.kind === \"box\") {\n desc = RAPIER.ColliderDesc.cuboid(\n leaf.halfWidth / SCALE,\n leaf.halfHeight / SCALE,\n );\n [x, y] = [leaf.center[0]!, leaf.center[1]!];\n } else if (leaf.kind === \"capsule\") {\n const dx = leaf.end[0]! - leaf.start[0]!,\n dy = leaf.end[1]! - leaf.start[1]!;\n desc = RAPIER.ColliderDesc.capsule(\n Math.hypot(dx, dy) / 2 / SCALE,\n leaf.radius / SCALE,\n );\n x = (leaf.start[0]! + leaf.end[0]!) / 2;\n y = (leaf.start[1]! + leaf.end[1]!) / 2;\n angle = Math.atan2(dy, dx) - Math.PI / 2;\n } else if (leaf.kind === \"segment\")\n desc = RAPIER.ColliderDesc.segment(\n { x: leaf.start[0]! / SCALE, y: leaf.start[1]! / SCALE },\n { x: leaf.end[0]! / SCALE, y: leaf.end[1]! / SCALE },\n );\n else {\n let vertices: Float32Array;\n if (leaf.kind === \"polygon\")\n vertices = Float32Array.from(leaf.vertices, (value) => value / SCALE);\n else {\n const radius =\n leaf.kind === \"ellipse\"\n ? Math.max(leaf.radiusX, leaf.radiusY)\n : Math.max(...leaf.radii);\n const count =\n 4 *\n Math.max(\n 8,\n Math.ceil(\n Math.PI /\n Math.acos(Math.max(-1, 1 - 0.01 / Math.max(radius, 0.01))) /\n 4,\n ),\n );\n if (!Number.isFinite(count) || count > 4096)\n throw new RangeError(\n \"Curved physics collider requires more than 4096 vertices at 0.01-unit accuracy. Reduce its size or provide explicit collision geometry.\",\n );\n const points: number[] = [];\n if (leaf.kind === \"ellipse\") {\n const cosine = Math.cos(leaf.rotationRadians),\n sine = Math.sin(leaf.rotationRadians);\n for (let i = 0; i < count; i++) {\n const x = leaf.radiusX * Math.cos((i * Math.PI * 2) / count),\n y = leaf.radiusY * Math.sin((i * Math.PI * 2) / count);\n points.push(\n leaf.center[0]! + cosine * x - sine * y,\n leaf.center[1]! + sine * x + cosine * y,\n );\n }\n } else {\n // Parametric corner arcs bound chord error by r*(1-cos(angle/2)).\n for (let corner = 0; corner < 4; corner++) {\n const r = leaf.radii[corner]!,\n right = corner === 1 || corner === 2,\n bottom = corner >= 2;\n const cx =\n leaf.center[0]! +\n (right ? leaf.halfWidth - r : -leaf.halfWidth + r);\n const cy =\n leaf.center[1]! +\n (bottom ? leaf.halfHeight - r : -leaf.halfHeight + r);\n for (let i = 0; i <= count / 4; i++) {\n const a =\n Math.PI + (corner * Math.PI) / 2 + (i * Math.PI * 2) / count;\n points.push(cx + r * Math.cos(a), cy + r * Math.sin(a));\n }\n }\n }\n vertices = Float32Array.from(points, (value) => value / SCALE);\n }\n const hull = RAPIER.ColliderDesc.convexHull(vertices);\n if (!hull)\n throw new Error(\n \"Physics shape cannot form a finite convex Rapier collider.\",\n );\n desc = hull;\n }\n const cosine = Math.cos(shape.localPose.rotationRadians),\n sine = Math.sin(shape.localPose.rotationRadians);\n const translationX =\n (shape.localPose.x + cosine * x - sine * y - centerX) / SCALE;\n const translationY =\n (shape.localPose.y + sine * x + cosine * y - centerY) / SCALE;\n const rotation = shape.localPose.rotationRadians + angle;\n validateEngineNumber(translationX);\n validateEngineNumber(translationY);\n validateEngineNumber(rotation);\n return desc.setTranslation(translationX, translationY).setRotation(rotation);\n}\n\n// A round trip through f32 must not move an axis the engine did not change.\nfunction logicalValue(engineValue: number, previous: number): number {\n return engineValue === Math.fround(previous / SCALE)\n ? previous\n : engineValue * SCALE;\n}\n\n// Bound each convex leaf separately: a distant large leaf must not hide a thin one.\nfunction minimumFeature(leaf: ConvexLeaf2D): number {\n if (leaf.kind === \"circle\" || leaf.kind === \"capsule\") return 2 * leaf.radius;\n if (leaf.kind === \"ellipse\") return 2 * Math.min(leaf.radiusX, leaf.radiusY);\n if (leaf.kind === \"box\" || leaf.kind === \"rounded-box\")\n return 2 * Math.min(leaf.halfWidth, leaf.halfHeight);\n if (leaf.kind === \"segment\") return 0;\n // Exhaustive edge-projection width: O(vertices\u00B2), without temporary arrays.\n // Cached on the collider binding; this is geometry setup, not per-tick work.\n let width = Infinity;\n const v = leaf.vertices;\n for (let i = 0; i < v.length; i += 2) {\n const j = (i + 2) % v.length;\n const dx = v[j]! - v[i]!,\n dy = v[j + 1]! - v[i + 1]!;\n const length = Math.hypot(dx, dy);\n if (length === 0) continue;\n let min = Infinity,\n max = -Infinity;\n for (let k = 0; k < v.length; k += 2) {\n const projection = (v[k]! * -dy + v[k + 1]! * dx) / length;\n min = Math.min(min, projection);\n max = Math.max(max, projection);\n }\n width = Math.min(width, max - min);\n }\n return width;\n}\n\nfunction validateEngineNumber(value: number): void {\n const rounded = Math.fround(value);\n if (!Number.isFinite(rounded) || (value !== 0 && rounded === 0))\n throw new RangeError(\n \"Physics value cannot be represented at 100 logical units per engine meter. Reduce extreme coordinates, speeds, forces, or shape dimensions.\",\n );\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import RAPIER from \"./rapier-engine.js\";\nimport type { BodyStore2D, ColliderStore2D } from \"./storage.js\";\nimport type { ShapeRecord2D, ConvexLeaf2D } from \"../shape-records.js\";\nimport type { PrivateManifold2D } from \"../collision/manifold.js\";\nimport { BODY_CCD_2D, collisionFiltersAllow2D } from \"./ccd.js\";\nimport {\n BODY_TYPE_DYNAMIC_2D,\n BODY_TYPE_KINEMATIC_2D,\n BODY_FIXED_ROTATION_2D,\n} from \"./integrator.js\";\nimport { BODY_SLEEPING_2D, BODY_SLEEP_DISABLED_2D } from \"./solver.js\";\nimport {\n COLLIDER_SENSOR_2D,\n type SortedColliderPairs2D,\n} from \"./contact-cache.js\";\n\n// The compat build embeds WASM; initialization neither starts a clock nor fetches\n// an external URL. Importers finish loading before any world can be mounted.\nawait RAPIER.init();\nconst SCALE = 100;\nlet ownedWorlds = 0;\nexport function liveRapierWorldsForTest(): number {\n return ownedWorlds;\n}\n\ninterface BodyBinding {\n handle: number;\n generation: number;\n configuration?: string;\n staticPose?: readonly [number, number, number];\n}\ninterface ColliderBinding {\n handles: number[];\n generation: number;\n shape: ShapeRecord2D;\n body: number;\n centerX: number;\n centerY: number;\n feature: number;\n}\nexport interface RapierCheckpoint2D {\n bytes: Uint8Array;\n bodies: Map<number, BodyBinding>;\n colliders: Map<number, ColliderBinding>;\n}\n\n/** Private engine bridge. Pibbl retains identity, transactions, commands and time. */\nexport class RapierSimulation2D {\n private world = new RAPIER.World({ x: 0, y: 0 });\n private disposed = false;\n private bodyBindings = new Map<number, BodyBinding>();\n private colliderBindings = new Map<number, ColliderBinding>();\n private colliderIndices = new Map<number, number>();\n private impulses = new Map<string, number[]>();\n private impacts = new Map<\n string,\n {\n first: number;\n second: number;\n manifold: PrivateManifold2D;\n impulses: number[];\n }\n >();\n\n constructor() {\n this.world.lengthUnit = 1;\n ownedWorlds++;\n }\n\n checkpoint(): RapierCheckpoint2D {\n return {\n bytes: this.world.takeSnapshot(),\n bodies: new Map(this.bodyBindings),\n colliders: new Map(this.colliderBindings),\n };\n }\n\n restore(checkpoint: RapierCheckpoint2D): void {\n const restored = RAPIER.World.restoreSnapshot(checkpoint.bytes);\n this.world.free();\n this.world = restored;\n this.bodyBindings = new Map(checkpoint.bodies);\n this.colliderBindings = new Map(checkpoint.colliders);\n this.rebuildColliderIndices();\n this.impulses.clear();\n this.impacts.clear();\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.world.free();\n ownedWorlds--;\n this.bodyBindings.clear();\n this.colliderBindings.clear();\n this.colliderIndices.clear();\n this.impulses.clear();\n this.impacts.clear();\n }\n\n step(\n bodies: BodyStore2D,\n colliders: ColliderStore2D,\n dt: number,\n gravityX: number,\n gravityY: number,\n sleeping: boolean,\n velocityIterations = 4,\n positionIterations = 1,\n ): void {\n validateEngineNumber(gravityX / SCALE);\n validateEngineNumber(gravityY / SCALE);\n this.synchronize(bodies, colliders, sleeping);\n const kinematicTargets = new Map<\n number,\n { x: number; y: number; angle: number }\n >();\n for (const [index, binding] of this.bodyBindings) {\n const body = this.world.getRigidBody(binding.handle);\n if (bodies.flags[index]! & BODY_TYPE_KINEMATIC_2D) {\n const target = {\n x: bodies.positionX[index]! + bodies.linearVelocityX[index]! * dt,\n y: bodies.positionY[index]! + bodies.linearVelocityY[index]! * dt,\n angle:\n bodies.rotationRadians[index]! +\n bodies.angularVelocity[index]! * dt,\n };\n body.setNextKinematicTranslation({\n x: target.x / SCALE,\n y: target.y / SCALE,\n });\n body.setNextKinematicRotation(target.angle);\n kinematicTargets.set(index, target);\n } else if (\n !(bodies.flags[index]! & BODY_SLEEPING_2D) &&\n (gravityX !== 0 || gravityY !== 0) &&\n bodies.gravityScale[index] !== 0 &&\n !this.hasSolidContact(body)\n )\n body.wakeUp();\n }\n this.world.gravity = { x: gravityX / SCALE, y: gravityY / SCALE };\n this.world.numSolverIterations = velocityIterations;\n this.world.numInternalPgsIterations = positionIterations;\n const substeps = this.ccdSubsteps(\n bodies,\n colliders,\n dt,\n gravityX,\n gravityY,\n );\n this.world.timestep = dt / substeps;\n this.world.integrationParameters.maxCcdSubsteps = 4;\n const allowed = (a: number, b: number) => {\n const first = this.colliderIndices.get(a);\n const second = this.colliderIndices.get(b);\n return (\n first !== undefined &&\n second !== undefined &&\n collisionFiltersAllow2D(\n colliders.filters[first],\n colliders.filters[second],\n )\n );\n };\n const hooks: RAPIER.PhysicsHooks = {\n filterContactPair: (a, b) =>\n allowed(a, b) ? RAPIER.SolverFlags.COMPUTE_IMPULSE : null,\n filterIntersectionPair: allowed,\n };\n const starts = new Map(\n [...kinematicTargets.keys()].map((index) => [\n index,\n {\n x: bodies.positionX[index]!,\n y: bodies.positionY[index]!,\n angle: bodies.rotationRadians[index]!,\n },\n ]),\n );\n this.impulses.clear();\n this.impacts.clear();\n for (let substep = 1; substep <= substeps; substep++) {\n const fraction = substep / substeps;\n for (const [index, target] of kinematicTargets) {\n const start = starts.get(index)!;\n const body = this.world.getRigidBody(\n this.bodyBindings.get(index)!.handle,\n );\n body.setNextKinematicTranslation({\n x: (start.x + (target.x - start.x) * fraction) / SCALE,\n y: (start.y + (target.y - start.y) * fraction) / SCALE,\n });\n body.setNextKinematicRotation(\n start.angle + (target.angle - start.angle) * fraction,\n );\n }\n this.world.step(undefined, hooks);\n if (substeps > 1) this.captureImpacts(bodies);\n }\n for (const [index, binding] of this.bodyBindings) {\n if (\n !(\n bodies.flags[index]! &\n (BODY_TYPE_DYNAMIC_2D | BODY_TYPE_KINEMATIC_2D)\n )\n )\n continue;\n const body = this.world.getRigidBody(binding.handle);\n const position = body.translation();\n const velocity = body.linvel();\n validateEngineNumber(position.x);\n validateEngineNumber(position.y);\n validateEngineNumber(velocity.x);\n validateEngineNumber(velocity.y);\n validateEngineNumber(body.rotation());\n validateEngineNumber(body.angvel());\n const target = kinematicTargets.get(index);\n bodies.positionX[index] =\n target?.x ?? logicalValue(position.x, bodies.positionX[index]!);\n bodies.positionY[index] =\n target?.y ?? logicalValue(position.y, bodies.positionY[index]!);\n bodies.rotationRadians[index] = target?.angle ?? body.rotation();\n bodies.linearVelocityX[index] = logicalValue(\n velocity.x,\n bodies.linearVelocityX[index]!,\n );\n bodies.linearVelocityY[index] = logicalValue(\n velocity.y,\n bodies.linearVelocityY[index]!,\n );\n bodies.angularVelocity[index] = body.angvel();\n bodies.forceX[index] = 0;\n bodies.forceY[index] = 0;\n bodies.torque[index] = 0;\n if (body.isSleeping()) bodies.flags[index]! |= BODY_SLEEPING_2D;\n else bodies.flags[index]! &= ~BODY_SLEEPING_2D;\n }\n }\n\n manifold(first: number, second: number): PrivateManifold2D | null {\n const impact = this.impacts.get(`${first}:${second}`);\n if (impact) {\n this.impulses.set(`${first}:${second}`, impact.impulses);\n return impact.manifold;\n }\n return this.currentManifold(first, second);\n }\n\n contactPairs(\n pairs: SortedColliderPairs2D,\n colliders: ColliderStore2D,\n ): SortedColliderPairs2D {\n if (this.impacts.size === 0) return pairs;\n const merged = new Map<string, readonly [number, number]>();\n for (let i = 0; i < pairs.pairCount; i++) {\n const a = pairs.pairFirstColliderIndices[i]!,\n b = pairs.pairSecondColliderIndices[i]!;\n merged.set(`${a}:${b}`, [a, b]);\n }\n for (const [key, impact] of this.impacts)\n merged.set(key, [impact.first, impact.second]);\n const sorted = [...merged.values()].sort(\n (a, b) => a[0] - b[0] || a[1] - b[1],\n );\n return {\n pairCount: sorted.length,\n pairFirstColliderIndices: Int32Array.from(sorted, (pair) => pair[0]),\n pairSecondColliderIndices: Int32Array.from(sorted, (pair) => pair[1]),\n pairFirstColliderGenerations: Uint32Array.from(\n sorted,\n (pair) => colliders.generations[pair[0]]!,\n ),\n pairSecondColliderGenerations: Uint32Array.from(\n sorted,\n (pair) => colliders.generations[pair[1]]!,\n ),\n };\n }\n\n private captureImpacts(bodies: BodyStore2D): void {\n const seen = new Set<string>();\n for (const [index, binding] of this.colliderBindings) {\n if (!(bodies.flags[binding.body]! & BODY_CCD_2D)) continue;\n for (const handle of binding.handles) {\n const collider = this.world.getCollider(handle);\n if (collider.isSensor()) continue;\n this.world.contactPairsWith(collider, (other) => {\n if (other.isSensor()) return;\n const otherIndex = this.colliderIndices.get(other.handle);\n if (otherIndex === undefined || otherIndex === index) return;\n const first = Math.min(index, otherIndex),\n second = Math.max(index, otherIndex),\n key = `${first}:${second}`;\n if (seen.has(key)) return;\n seen.add(key);\n const manifold = this.currentManifold(first, second, true);\n const impulses = this.impulses.get(key);\n if (!manifold || !impulses?.some((value) => value > 0)) return;\n const previous = this.impacts.get(key);\n this.impacts.set(key, {\n first,\n second,\n manifold,\n impulses: impulses.map(\n (value, i) => value + (previous?.impulses[i] ?? 0),\n ),\n });\n });\n }\n }\n }\n\n private currentManifold(\n first: number,\n second: number,\n includePredictiveImpact = false,\n ): PrivateManifold2D | null {\n const a = this.colliderBindings.get(first);\n const b = this.colliderBindings.get(second);\n if (!a || !b) return null;\n let result: PrivateManifold2D | null = null;\n let depth = Infinity;\n for (let ai = 0; ai < a.handles.length; ai++)\n for (let bi = 0; bi < b.handles.length; bi++) {\n const ca = this.world.getCollider(a.handles[ai]!);\n const cb = this.world.getCollider(b.handles[bi]!);\n if (ca.isSensor() || cb.isSensor()) {\n if (this.world.intersectionPair(ca, cb))\n return {\n normalX: 1,\n normalY: 0,\n firstLeaf: ai,\n secondLeaf: bi,\n points: [\n {\n firstX: ca.translation().x,\n firstY: ca.translation().y,\n secondX: cb.translation().x,\n secondY: cb.translation().y,\n separation: 0,\n firstFeature: 0,\n secondFeature: 0,\n },\n ],\n };\n continue;\n }\n this.world.contactPair(ca, cb, (contact, flipped) => {\n if (contact.numContacts() === 0) return;\n const separation =\n SCALE *\n Math.min(\n ...Array.from({ length: contact.numContacts() }, (_, i) =>\n contact.contactDist(i),\n ),\n );\n if (\n (!includePredictiveImpact && separation > 0.5) ||\n separation >= depth\n )\n return;\n const normal = contact.normal();\n const nx = normal.x * (flipped ? 1 : -1),\n ny = normal.y * (flipped ? 1 : -1);\n const points = [];\n const impulses = [];\n for (let i = 0; i < Math.min(2, contact.numContacts()); i++) {\n const pa = contact.localContactPoint1(i)!;\n const pb = contact.localContactPoint2(i)!;\n const wa = worldPoint(flipped ? cb : ca, pa);\n const wb = worldPoint(flipped ? ca : cb, pb);\n points.push({\n firstX: flipped ? wb.x : wa.x,\n firstY: flipped ? wb.y : wa.y,\n secondX: flipped ? wa.x : wb.x,\n secondY: flipped ? wa.y : wb.y,\n separation: contact.contactDist(i) * SCALE,\n firstFeature: contact.contactFid1(i),\n secondFeature: contact.contactFid2(i),\n });\n impulses.push(contact.contactImpulse(i) * SCALE);\n }\n result = {\n normalX: nx,\n normalY: ny,\n firstLeaf: ai,\n secondLeaf: bi,\n points,\n };\n depth = separation;\n this.impulses.set(`${first}:${second}`, impulses);\n });\n }\n return result;\n }\n\n normalImpulses(first: number, second: number): readonly number[] {\n return this.impulses.get(`${first}:${second}`) ?? [];\n }\n\n private synchronize(\n bodies: BodyStore2D,\n colliders: ColliderStore2D,\n sleeping: boolean,\n ): void {\n for (const [index, binding] of this.colliderBindings) {\n if (\n colliders.has(index, binding.generation) &&\n colliders.shapes[index] === binding.shape &&\n colliders.bodyIndices[index] === binding.body &&\n bodies.localCenterX[binding.body] === binding.centerX &&\n bodies.localCenterY[binding.body] === binding.centerY\n )\n continue;\n for (const handle of binding.handles) {\n const collider = this.world.getCollider(handle);\n if (collider) this.world.removeCollider(collider, false);\n }\n this.colliderBindings.delete(index);\n }\n for (const [index, binding] of this.bodyBindings) {\n if (bodies.has(index, binding.generation)) continue;\n this.world.removeRigidBody(this.world.getRigidBody(binding.handle));\n this.bodyBindings.delete(index);\n }\n for (let index = 0; index < bodies.capacity; index++) {\n const generation = bodies.generations[index]!;\n if (!bodies.has(index, generation)) continue;\n const flags = bodies.flags[index]!;\n validateEngineNumber(bodies.positionX[index]! / SCALE);\n validateEngineNumber(bodies.positionY[index]! / SCALE);\n validateEngineNumber(bodies.linearVelocityX[index]! / SCALE);\n validateEngineNumber(bodies.linearVelocityY[index]! / SCALE);\n validateEngineNumber(bodies.rotationRadians[index]!);\n validateEngineNumber(bodies.angularVelocity[index]!);\n validateEngineNumber(bodies.forceX[index]! / SCALE);\n validateEngineNumber(bodies.forceY[index]! / SCALE);\n validateEngineNumber(bodies.torque[index]! / (SCALE * SCALE));\n validateEngineNumber(bodies.gravityScale[index]!);\n validateEngineNumber(bodies.linearDamping[index]!);\n validateEngineNumber(bodies.angularDamping[index]!);\n if (bodies.inverseMass[index]! > 0)\n validateEngineNumber(1 / bodies.inverseMass[index]!);\n if (bodies.inverseInertia[index]! > 0)\n validateEngineNumber(\n 1 / bodies.inverseInertia[index]! / (SCALE * SCALE),\n );\n const type =\n flags & BODY_TYPE_DYNAMIC_2D\n ? RAPIER.RigidBodyType.Dynamic\n : flags & BODY_TYPE_KINEMATIC_2D\n ? RAPIER.RigidBodyType.KinematicPositionBased\n : RAPIER.RigidBodyType.Fixed;\n let binding = this.bodyBindings.get(index);\n if (!binding) {\n const created = this.world.createRigidBody(\n new RAPIER.RigidBodyDesc(type).setCanSleep(true),\n );\n binding = { handle: created.handle, generation };\n this.bodyBindings.set(index, binding);\n }\n const configuration = [\n type,\n bodies.gravityScale[index],\n bodies.linearDamping[index],\n bodies.angularDamping[index],\n flags & (BODY_CCD_2D | BODY_FIXED_ROTATION_2D),\n bodies.inverseMass[index],\n bodies.inverseInertia[index],\n ].join(\":\");\n if (\n type === RAPIER.RigidBodyType.Fixed &&\n binding.configuration === configuration &&\n binding.staticPose?.[0] === bodies.positionX[index] &&\n binding.staticPose[1] === bodies.positionY[index] &&\n binding.staticPose[2] === bodies.rotationRadians[index]\n )\n continue;\n const body = this.world.getRigidBody(binding.handle);\n if (body.bodyType() !== type) body.setBodyType(type, false);\n const position = body.translation();\n if (\n position.x !== Math.fround(bodies.positionX[index]! / SCALE) ||\n position.y !== Math.fround(bodies.positionY[index]! / SCALE)\n )\n body.setTranslation(\n {\n x: bodies.positionX[index]! / SCALE,\n y: bodies.positionY[index]! / SCALE,\n },\n false,\n );\n if (body.rotation() !== bodies.rotationRadians[index])\n body.setRotation(bodies.rotationRadians[index]!, false);\n const velocity = body.linvel();\n if (\n velocity.x !== Math.fround(bodies.linearVelocityX[index]! / SCALE) ||\n velocity.y !== Math.fround(bodies.linearVelocityY[index]! / SCALE)\n )\n body.setLinvel(\n {\n x: bodies.linearVelocityX[index]! / SCALE,\n y: bodies.linearVelocityY[index]! / SCALE,\n },\n false,\n );\n if (body.angvel() !== bodies.angularVelocity[index])\n body.setAngvel(bodies.angularVelocity[index]!, false);\n\n if (binding.configuration !== configuration) {\n this.bodyBindings.set(index, { ...binding, configuration });\n body.setGravityScale(bodies.gravityScale[index]!, false);\n body.setLinearDamping(bodies.linearDamping[index]!);\n body.setAngularDamping(bodies.angularDamping[index]!);\n body.enableCcd(!!(flags & BODY_CCD_2D));\n body.lockRotations(!!(flags & BODY_FIXED_ROTATION_2D), false);\n const inverseMass = bodies.inverseMass[index]!,\n inverseInertia = bodies.inverseInertia[index]!;\n body.setAdditionalMassProperties(\n inverseMass > 0 ? 1 / inverseMass : 0,\n { x: 0, y: 0 },\n inverseInertia > 0 ? 1 / inverseInertia / (SCALE * SCALE) : 0,\n false,\n );\n }\n if (type === RAPIER.RigidBodyType.Fixed) {\n this.bodyBindings.set(index, {\n ...this.bodyBindings.get(index)!,\n staticPose: [\n bodies.positionX[index]!,\n bodies.positionY[index]!,\n bodies.rotationRadians[index]!,\n ],\n });\n continue;\n }\n body.resetForces(false);\n body.resetTorques(false);\n body.addForce(\n { x: bodies.forceX[index]! / SCALE, y: bodies.forceY[index]! / SCALE },\n false,\n );\n body.addTorque(bodies.torque[index]! / (SCALE * SCALE), false);\n if (flags & BODY_SLEEPING_2D) {\n if (!body.isSleeping()) body.sleep();\n } else if (\n body.isSleeping() ||\n !sleeping ||\n flags & BODY_SLEEP_DISABLED_2D\n )\n body.wakeUp();\n }\n for (let index = 0; index < colliders.capacity; index++) {\n const generation = colliders.generations[index]!;\n if (!colliders.has(index, generation) || this.colliderBindings.has(index))\n continue;\n const shape = colliders.shapes[index]!;\n const bodyIndex = colliders.bodyIndices[index]!;\n const body = this.world.getRigidBody(\n this.bodyBindings.get(bodyIndex)!.handle,\n );\n const material = colliders.materials[index] as {\n friction?: number;\n restitution?: number;\n } | null;\n const handles = shape.leaves.map((leaf) => {\n const desc = leafDescriptor(\n leaf,\n shape,\n bodies.localCenterX[bodyIndex]!,\n bodies.localCenterY[bodyIndex]!,\n );\n desc\n .setDensity(0)\n .setFriction(Math.sqrt(material?.friction ?? 0.5))\n .setRestitution(material?.restitution ?? 0)\n .setFrictionCombineRule(RAPIER.CoefficientCombineRule.Multiply)\n .setRestitutionCombineRule(RAPIER.CoefficientCombineRule.Max)\n .setSensor(!!(colliders.flags[index]! & COLLIDER_SENSOR_2D))\n .setActiveCollisionTypes(RAPIER.ActiveCollisionTypes.ALL)\n .setActiveHooks(\n RAPIER.ActiveHooks.FILTER_CONTACT_PAIRS |\n RAPIER.ActiveHooks.FILTER_INTERSECTION_PAIRS,\n );\n return this.world.createCollider(desc, body).handle;\n });\n this.colliderBindings.set(index, {\n handles,\n generation,\n shape,\n body: bodyIndex,\n centerX: bodies.localCenterX[bodyIndex]!,\n centerY: bodies.localCenterY[bodyIndex]!,\n feature: Math.max(0.01, Math.min(...shape.leaves.map(minimumFeature))),\n });\n }\n this.rebuildColliderIndices();\n }\n\n private ccdSubsteps(\n bodies: BodyStore2D,\n colliders: ColliderStore2D,\n dt: number,\n gravityX: number,\n gravityY: number,\n ): number {\n let required = 1;\n for (const [index, binding] of this.colliderBindings) {\n const body = binding.body;\n if (\n !(bodies.flags[body]! & BODY_CCD_2D) ||\n !(bodies.flags[body]! & BODY_TYPE_DYNAMIC_2D) ||\n colliders.flags[index]! & COLLIDER_SENSOR_2D\n )\n continue;\n const bounds = binding.shape.localBounds;\n const width = bounds[2]! - bounds[0]!,\n height = bounds[3]! - bounds[1]!;\n const feature = Math.max(0.01, Math.min(width, height, binding.feature));\n // Bound every shape corner about the body's center of mass. Bounds can\n // occupy opposite quadrants, and collider descriptors are COM-relative.\n let radius = 0;\n for (let corner = 0; corner < 4; corner++) {\n const x =\n (corner % 2 === 0 ? bounds[0]! : bounds[2]!) -\n bodies.localCenterX[body]!;\n const y =\n (corner < 2 ? bounds[1]! : bounds[3]!) -\n bodies.localCenterY[body]!;\n radius = Math.max(radius, Math.hypot(x, y));\n }\n const acceleration = Math.hypot(\n gravityX * bodies.gravityScale[body]! +\n bodies.forceX[body]! * bodies.inverseMass[body]!,\n gravityY * bodies.gravityScale[body]! +\n bodies.forceY[body]! * bodies.inverseMass[body]!,\n );\n const angularAcceleration = Math.abs(\n bodies.torque[body]! * bodies.inverseInertia[body]!,\n );\n const speed =\n Math.hypot(\n bodies.linearVelocityX[body]!,\n bodies.linearVelocityY[body]!,\n ) +\n acceleration * dt +\n (Math.abs(bodies.angularVelocity[body]!) + angularAcceleration * dt) *\n radius;\n required = Math.max(required, Math.ceil((speed * dt) / (feature * 0.25)));\n }\n if (required > 64)\n throw new RangeError(\n `Physics CCD requires ${required} substeps (maximum 64). Reduce velocity or fixedStepMilliseconds, or enlarge the collider.`,\n );\n return required;\n }\n\n private hasSolidContact(body: RAPIER.RigidBody): boolean {\n let touching = false;\n for (let i = 0; i < body.numColliders(); i++) {\n const collider = body.collider(i);\n if (collider.isSensor()) continue;\n this.world.contactPairsWith(collider, (other) => {\n if (other.isSensor()) return;\n this.world.contactPair(collider, other, (contact) => {\n for (let point = 0; point < contact.numContacts(); point++)\n if (contact.contactDist(point) <= 0.5 / SCALE) touching = true;\n });\n });\n }\n return touching;\n }\n\n private rebuildColliderIndices(): void {\n this.colliderIndices.clear();\n for (const [index, binding] of this.colliderBindings)\n for (const handle of binding.handles)\n this.colliderIndices.set(handle, index);\n }\n}\n\nfunction worldPoint(\n collider: RAPIER.Collider,\n p: RAPIER.Vector,\n): RAPIER.Vector {\n const position = collider.translation(),\n angle = collider.rotation();\n return {\n x: (position.x + Math.cos(angle) * p.x - Math.sin(angle) * p.y) * SCALE,\n y: (position.y + Math.sin(angle) * p.x + Math.cos(angle) * p.y) * SCALE,\n };\n}\n\nfunction leafDescriptor(\n leaf: ConvexLeaf2D,\n shape: ShapeRecord2D,\n centerX: number,\n centerY: number,\n): RAPIER.ColliderDesc {\n // Reject overflow/underflow before crossing the f32 WASM boundary.\n for (const [key, value] of Object.entries(leaf)) {\n if (value instanceof Float64Array)\n for (const number of value) validateEngineNumber(number / SCALE);\n else if (typeof value === \"number\")\n validateEngineNumber(key === \"rotationRadians\" ? value : value / SCALE);\n }\n validateEngineNumber(shape.localPose.x / SCALE);\n validateEngineNumber(shape.localPose.y / SCALE);\n validateEngineNumber(centerX / SCALE);\n validateEngineNumber(centerY / SCALE);\n let desc: RAPIER.ColliderDesc;\n let x = 0,\n y = 0,\n angle = 0;\n if (leaf.kind === \"circle\") {\n desc = RAPIER.ColliderDesc.ball(leaf.radius / SCALE);\n [x, y] = [leaf.center[0]!, leaf.center[1]!];\n } else if (leaf.kind === \"box\") {\n desc = RAPIER.ColliderDesc.cuboid(\n leaf.halfWidth / SCALE,\n leaf.halfHeight / SCALE,\n );\n [x, y] = [leaf.center[0]!, leaf.center[1]!];\n } else if (leaf.kind === \"capsule\") {\n const dx = leaf.end[0]! - leaf.start[0]!,\n dy = leaf.end[1]! - leaf.start[1]!;\n desc = RAPIER.ColliderDesc.capsule(\n Math.hypot(dx, dy) / 2 / SCALE,\n leaf.radius / SCALE,\n );\n x = (leaf.start[0]! + leaf.end[0]!) / 2;\n y = (leaf.start[1]! + leaf.end[1]!) / 2;\n angle = Math.atan2(dy, dx) - Math.PI / 2;\n } else if (leaf.kind === \"segment\")\n desc = RAPIER.ColliderDesc.segment(\n { x: leaf.start[0]! / SCALE, y: leaf.start[1]! / SCALE },\n { x: leaf.end[0]! / SCALE, y: leaf.end[1]! / SCALE },\n );\n else {\n let vertices: Float32Array;\n if (leaf.kind === \"polygon\")\n vertices = Float32Array.from(leaf.vertices, (value) => value / SCALE);\n else {\n const radius =\n leaf.kind === \"ellipse\"\n ? Math.max(leaf.radiusX, leaf.radiusY)\n : Math.max(...leaf.radii);\n const count =\n 4 *\n Math.max(\n 8,\n Math.ceil(\n Math.PI /\n Math.acos(Math.max(-1, 1 - 0.01 / Math.max(radius, 0.01))) /\n 4,\n ),\n );\n if (!Number.isFinite(count) || count > 4096)\n throw new RangeError(\n \"Curved physics collider requires more than 4096 vertices at 0.01-unit accuracy. Reduce its size or provide explicit collision geometry.\",\n );\n const points: number[] = [];\n if (leaf.kind === \"ellipse\") {\n const cosine = Math.cos(leaf.rotationRadians),\n sine = Math.sin(leaf.rotationRadians);\n for (let i = 0; i < count; i++) {\n const x = leaf.radiusX * Math.cos((i * Math.PI * 2) / count),\n y = leaf.radiusY * Math.sin((i * Math.PI * 2) / count);\n points.push(\n leaf.center[0]! + cosine * x - sine * y,\n leaf.center[1]! + sine * x + cosine * y,\n );\n }\n } else {\n // Parametric corner arcs bound chord error by r*(1-cos(angle/2)).\n for (let corner = 0; corner < 4; corner++) {\n const r = leaf.radii[corner]!,\n right = corner === 1 || corner === 2,\n bottom = corner >= 2;\n const cx =\n leaf.center[0]! +\n (right ? leaf.halfWidth - r : -leaf.halfWidth + r);\n const cy =\n leaf.center[1]! +\n (bottom ? leaf.halfHeight - r : -leaf.halfHeight + r);\n for (let i = 0; i <= count / 4; i++) {\n const a =\n Math.PI + (corner * Math.PI) / 2 + (i * Math.PI * 2) / count;\n points.push(cx + r * Math.cos(a), cy + r * Math.sin(a));\n }\n }\n }\n vertices = Float32Array.from(points, (value) => value / SCALE);\n }\n const hull = RAPIER.ColliderDesc.convexHull(vertices);\n if (!hull)\n throw new Error(\n \"Physics shape cannot form a finite convex Rapier collider.\",\n );\n desc = hull;\n }\n const cosine = Math.cos(shape.localPose.rotationRadians),\n sine = Math.sin(shape.localPose.rotationRadians);\n const translationX =\n (shape.localPose.x + cosine * x - sine * y - centerX) / SCALE;\n const translationY =\n (shape.localPose.y + sine * x + cosine * y - centerY) / SCALE;\n const rotation = shape.localPose.rotationRadians + angle;\n validateEngineNumber(translationX);\n validateEngineNumber(translationY);\n validateEngineNumber(rotation);\n return desc.setTranslation(translationX, translationY).setRotation(rotation);\n}\n\n// A round trip through f32 must not move an axis the engine did not change.\nfunction logicalValue(engineValue: number, previous: number): number {\n return engineValue === Math.fround(previous / SCALE)\n ? previous\n : engineValue * SCALE;\n}\n\n// Bound each convex leaf separately: a distant large leaf must not hide a thin one.\nfunction minimumFeature(leaf: ConvexLeaf2D): number {\n if (leaf.kind === \"circle\" || leaf.kind === \"capsule\") return 2 * leaf.radius;\n if (leaf.kind === \"ellipse\") return 2 * Math.min(leaf.radiusX, leaf.radiusY);\n if (leaf.kind === \"box\" || leaf.kind === \"rounded-box\")\n return 2 * Math.min(leaf.halfWidth, leaf.halfHeight);\n if (leaf.kind === \"segment\") return 0;\n // Exhaustive edge-projection width: O(vertices\u00B2), without temporary arrays.\n // Cached on the collider binding; this is geometry setup, not per-tick work.\n let width = Infinity;\n const v = leaf.vertices;\n for (let i = 0; i < v.length; i += 2) {\n const j = (i + 2) % v.length;\n const dx = v[j]! - v[i]!,\n dy = v[j + 1]! - v[i + 1]!;\n const length = Math.hypot(dx, dy);\n if (length === 0) continue;\n let min = Infinity,\n max = -Infinity;\n for (let k = 0; k < v.length; k += 2) {\n const projection = (v[k]! * -dy + v[k + 1]! * dx) / length;\n min = Math.min(min, projection);\n max = Math.max(max, projection);\n }\n width = Math.min(width, max - min);\n }\n return width;\n}\n\nfunction validateEngineNumber(value: number): void {\n const rounded = Math.fround(value);\n if (!Number.isFinite(rounded) || (value !== 0 && rounded === 0))\n throw new RangeError(\n \"Physics value cannot be represented at 100 logical units per engine meter. Reduce extreme coordinates, speeds, forces, or shape dimensions.\",\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["cosine", "sine", "x", "y"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SpriteSheetFormat } from '../model.js';
|
|
2
|
+
/** Import Aseprite JSON hash or array exports, including frame tags and millisecond timing. See {@link SpriteSheetFormat}.
|
|
3
|
+
* @returns An explicit atlas metadata adapter.
|
|
4
|
+
*/
|
|
5
|
+
export declare function aseprite(): SpriteSheetFormat;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SpriteSheetFormat } from '../model.js';
|
|
2
|
+
/** Import TexturePacker JSON hash/array rectangles with clockwise packed rotation and trim offsets. See {@link SpriteSheetFormat}.
|
|
3
|
+
* @returns An explicit atlas metadata adapter.
|
|
4
|
+
*/
|
|
5
|
+
export declare function texturePacker(): SpriteSheetFormat;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { Sprite } from './sprite.js';
|
|
2
|
+
export type { SpriteProps, SpriteStyle } from './sprite.js';
|
|
3
|
+
export { loadSpriteSheet } from './loader.js';
|
|
4
|
+
export type { SpriteSheet, SpriteGrid } from './loader.js';
|
|
5
|
+
export { defineSpriteAnimation } from './model.js';
|
|
6
|
+
export type { SpriteFrame, SpriteRectangle, SpriteFrameData, SpriteAnimationFrameData, SpriteSheetData, SpriteSheetFormat } from './model.js';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type SpriteFrame, type SpriteSheetFormat } from './model.js';
|
|
2
|
+
import type { PibblAnimationDefinition } from '../../lib/animation/types.js';
|
|
3
|
+
/** Shared decoded atlas and immutable frames/clips. Dispose after all consumers unmount. See {@link SpriteFrame}. */
|
|
4
|
+
export interface SpriteSheet {
|
|
5
|
+
/** Frames indexed by atlas name or numeric grid index. */ readonly frames: Readonly<Record<string | number, SpriteFrame>>;
|
|
6
|
+
/** Named, seekable animation definitions from the atlas. */ readonly animations: Readonly<Record<string, PibblAnimationDefinition<SpriteFrame>>>;
|
|
7
|
+
/** Release decoded images; unmount every consumer before calling. */ readonly dispose: () => void;
|
|
8
|
+
}
|
|
9
|
+
/** Dimensions of a regular grid, in image pixels. See {@link SpriteFrame}. */
|
|
10
|
+
export interface SpriteGrid {
|
|
11
|
+
readonly frameWidth: number; /** Positive cell height in pixels. */
|
|
12
|
+
readonly frameHeight: number; /** Outer border width in pixels; defaults to zero. */
|
|
13
|
+
readonly margin?: number; /** Gap between cells in pixels; defaults to zero. */
|
|
14
|
+
readonly spacing?: number;
|
|
15
|
+
}
|
|
16
|
+
/** Load a grid image or metadata through an explicitly supplied import adapter. See {@link SpriteFrame}.
|
|
17
|
+
* @param url - Grid image URL or atlas metadata URL.
|
|
18
|
+
* @param options - Grid dimensions or an explicit metadata format adapter.
|
|
19
|
+
* @returns A decoded sprite sheet with explicit disposal ownership.
|
|
20
|
+
*/
|
|
21
|
+
export declare function loadSpriteSheet(url: string, options: {
|
|
22
|
+
readonly grid: SpriteGrid;
|
|
23
|
+
} | {
|
|
24
|
+
readonly format: SpriteSheetFormat;
|
|
25
|
+
}): Promise<SpriteSheet>;
|
|
@@ -19,7 +19,8 @@ async function loadSpriteSheet(url, options) {
|
|
|
19
19
|
let clips = {};
|
|
20
20
|
if ("grid" in options) {
|
|
21
21
|
const { frameWidth: w, frameHeight: h, margin = 0, spacing = 0 } = options.grid;
|
|
22
|
-
if (!
|
|
22
|
+
if (!(Number.isInteger(w) && Number.isInteger(h) && Number.isInteger(margin) && Number.isInteger(spacing)) || w <= 0 || h <= 0 || margin < 0 || spacing < 0)
|
|
23
|
+
throw new RangeError("Invalid sprite grid dimensions.");
|
|
23
24
|
const image = await load(url);
|
|
24
25
|
const frames2 = [];
|
|
25
26
|
for (let y = margin; y + h <= image.naturalHeight - margin; y += h + spacing)
|
|
@@ -38,12 +39,14 @@ async function loadSpriteSheet(url, options) {
|
|
|
38
39
|
const frames = /* @__PURE__ */ Object.create(null);
|
|
39
40
|
for (const spec of specs) {
|
|
40
41
|
const image = images[spec.page ?? 0], r = spec.rect;
|
|
41
|
-
if (!image || !
|
|
42
|
+
if (!image || !(Number.isFinite(r.x) && Number.isFinite(r.y) && Number.isFinite(r.width) && Number.isFinite(r.height)) || r.x < 0 || r.y < 0 || r.width <= 0 || r.height <= 0 || r.x + r.width > image.naturalWidth || r.y + r.height > image.naturalHeight)
|
|
43
|
+
throw new RangeError(`Invalid sprite rectangle: ${spec.name}`);
|
|
42
44
|
if (frames[spec.name]) throw new Error(`Duplicate sprite frame: ${spec.name}`);
|
|
43
45
|
const width = spec.sourceSize?.width ?? (spec.rotated ? r.height : r.width);
|
|
44
46
|
const height = spec.sourceSize?.height ?? (spec.rotated ? r.width : r.height);
|
|
45
47
|
const trim = { x: spec.trim?.x ?? 0, y: spec.trim?.y ?? 0 };
|
|
46
|
-
if (!
|
|
48
|
+
if (!(Number.isFinite(width) && Number.isFinite(height) && Number.isFinite(trim.x) && Number.isFinite(trim.y)) || width <= 0 || height <= 0 || trim.x < 0 || trim.y < 0 || trim.x + (spec.rotated ? r.height : r.width) > width || trim.y + (spec.rotated ? r.width : r.height) > height)
|
|
49
|
+
throw new RangeError(`Invalid sprite logical bounds: ${spec.name}`);
|
|
47
50
|
frames[spec.name] = makeFrame({ ...spec, rect: Object.freeze({ ...r }), sourceSize: Object.freeze({ width, height }), trim: Object.freeze(trim), image, owner });
|
|
48
51
|
}
|
|
49
52
|
const animations = /* @__PURE__ */ Object.create(null);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/features/sprites/loader.ts"],
|
|
4
|
-
"sourcesContent": ["import { defineSpriteAnimation, makeFrame, type SpriteFrame, type SpriteFrameData, type SpriteSheetFormat } from './model.js';\nimport type { PibblAnimationDefinition } from '../../lib/animation/types.js';\n/** Shared decoded atlas and immutable frames/clips. Dispose after all consumers unmount. See {@link SpriteFrame}. */\nexport interface SpriteSheet {\n /** Frames indexed by atlas name or numeric grid index. */ readonly frames: Readonly<Record<string | number, SpriteFrame>>;\n /** Named, seekable animation definitions from the atlas. */ readonly animations: Readonly<Record<string, PibblAnimationDefinition<SpriteFrame>>>;\n /** Release decoded images; unmount every consumer before calling. */ readonly dispose: () => void;\n}\n/** Dimensions of a regular grid, in image pixels. See {@link SpriteFrame}. */\nexport interface SpriteGrid { /** Positive cell width in pixels. */ readonly frameWidth: number; /** Positive cell height in pixels. */ readonly frameHeight: number; /** Outer border width in pixels; defaults to zero. */ readonly margin?: number; /** Gap between cells in pixels; defaults to zero. */ readonly spacing?: number }\n/** Load a grid image or metadata through an explicitly supplied import adapter. See {@link SpriteFrame}. \n * @param url - Grid image URL or atlas metadata URL.\n * @param options - Grid dimensions or an explicit metadata format adapter.\n * @returns A decoded sprite sheet with explicit disposal ownership.\n */\nexport async function loadSpriteSheet(url: string
|
|
5
|
-
"mappings": "AAAA,SAAS,uBAAuB,iBAAiF;AAejH,eAAsB,
|
|
4
|
+
"sourcesContent": ["import { defineSpriteAnimation, makeFrame, type SpriteFrame, type SpriteFrameData, type SpriteSheetFormat } from './model.js';\nimport type { PibblAnimationDefinition } from '../../lib/animation/types.js';\n/** Shared decoded atlas and immutable frames/clips. Dispose after all consumers unmount. See {@link SpriteFrame}. */\nexport interface SpriteSheet {\n /** Frames indexed by atlas name or numeric grid index. */ readonly frames: Readonly<Record<string | number, SpriteFrame>>;\n /** Named, seekable animation definitions from the atlas. */ readonly animations: Readonly<Record<string, PibblAnimationDefinition<SpriteFrame>>>;\n /** Release decoded images; unmount every consumer before calling. */ readonly dispose: () => void;\n}\n/** Dimensions of a regular grid, in image pixels. See {@link SpriteFrame}. */\nexport interface SpriteGrid { /** Positive cell width in pixels. */ readonly frameWidth: number; /** Positive cell height in pixels. */ readonly frameHeight: number; /** Outer border width in pixels; defaults to zero. */ readonly margin?: number; /** Gap between cells in pixels; defaults to zero. */ readonly spacing?: number }\n/** Load a grid image or metadata through an explicitly supplied import adapter. See {@link SpriteFrame}. \n * @param url - Grid image URL or atlas metadata URL.\n * @param options - Grid dimensions or an explicit metadata format adapter.\n * @returns A decoded sprite sheet with explicit disposal ownership.\n */\nexport async function loadSpriteSheet(\n url: string,\n options: { readonly grid: SpriteGrid } | { readonly format: SpriteSheetFormat },\n): Promise<SpriteSheet> {\n const owner = { disposed: false };\n const images: HTMLImageElement[] = [];\n const dispose = () => { if (owner.disposed) return; owner.disposed = true; for (const image of images) image.removeAttribute('src'); };\n const load = async (source: string) => {\n const image = new globalThis.Image(); images.push(image); image.src = source; await image.decode(); return image;\n };\n try {\n let specs: readonly SpriteFrameData[];\n let clips: Readonly<Record<string, readonly { frame: string; duration: number }[]>> = {};\n if ('grid' in options) {\n const { frameWidth: w, frameHeight: h, margin = 0, spacing = 0 } = options.grid;\n if (\n !(\n Number.isInteger(w) &&\n Number.isInteger(h) &&\n Number.isInteger(margin) &&\n Number.isInteger(spacing)\n ) ||\n w <= 0 ||\n h <= 0 ||\n margin < 0 ||\n spacing < 0\n )\n throw new RangeError('Invalid sprite grid dimensions.');\n const image = await load(url);\n const frames: SpriteFrameData[] = [];\n for (let y = margin; y + h <= image.naturalHeight - margin; y += h + spacing)\n for (let x = margin; x + w <= image.naturalWidth - margin; x += w + spacing)\n frames.push({ name: String(frames.length), rect: { x, y, width: w, height: h } });\n if (!frames.length) throw new RangeError('Sprite grid contains no complete frames.');\n specs = frames;\n } else {\n const response = await fetch(url); if (!response.ok) throw new Error(`Sprite metadata failed: ${response.status}`);\n const data = options.format.parse(await response.json());\n for (const path of data.images) await load(new URL(path, new URL(url, document.baseURI)).href);\n specs = data.frames; clips = data.animations ?? {};\n }\n const frames: Record<string, SpriteFrame> = Object.create(null);\n for (const spec of specs) {\n const image = images[spec.page ?? 0], r = spec.rect;\n if (\n !image ||\n !(\n Number.isFinite(r.x) &&\n Number.isFinite(r.y) &&\n Number.isFinite(r.width) &&\n Number.isFinite(r.height)\n ) ||\n r.x < 0 ||\n r.y < 0 ||\n r.width <= 0 ||\n r.height <= 0 ||\n r.x + r.width > image.naturalWidth ||\n r.y + r.height > image.naturalHeight\n )\n throw new RangeError(`Invalid sprite rectangle: ${spec.name}`);\n if (frames[spec.name]) throw new Error(`Duplicate sprite frame: ${spec.name}`);\n const width = spec.sourceSize?.width ?? (spec.rotated ? r.height : r.width);\n const height = spec.sourceSize?.height ?? (spec.rotated ? r.width : r.height);\n const trim = { x: spec.trim?.x ?? 0, y: spec.trim?.y ?? 0 };\n if (\n !(\n Number.isFinite(width) &&\n Number.isFinite(height) &&\n Number.isFinite(trim.x) &&\n Number.isFinite(trim.y)\n ) ||\n width <= 0 ||\n height <= 0 ||\n trim.x < 0 ||\n trim.y < 0 ||\n trim.x + (spec.rotated ? r.height : r.width) > width ||\n trim.y + (spec.rotated ? r.width : r.height) > height\n )\n throw new RangeError(`Invalid sprite logical bounds: ${spec.name}`);\n frames[spec.name] = makeFrame({ ...spec, rect: Object.freeze({ ...r }), sourceSize: Object.freeze({ width, height }), trim: Object.freeze(trim), image, owner });\n }\n const animations: Record<string, PibblAnimationDefinition<SpriteFrame>> = Object.create(null);\n for (const [name, entries] of Object.entries(clips)) animations[name] = defineSpriteAnimation({ frames: entries.map(entry => {\n if (!frames[entry.frame]) throw new Error(`Unknown sprite frame: ${entry.frame}`);\n return { frame: frames[entry.frame], duration: entry.duration };\n }) });\n return Object.freeze({ frames: Object.freeze(frames), animations: Object.freeze(animations), dispose });\n } catch (error) { dispose(); throw error; }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["frames"]
|
|
7
7
|
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { PibblAnimationDefinition } from '../../lib/animation/types.js';
|
|
2
|
+
/** Pixel rectangle within an atlas page or original frame. See {@link SpriteFrame}. */
|
|
3
|
+
export interface SpriteRectangle {
|
|
4
|
+
readonly x: number; /** Vertical pixel offset. */
|
|
5
|
+
readonly y: number; /** Width in pixels. */
|
|
6
|
+
readonly width: number; /** Height in pixels. */
|
|
7
|
+
readonly height: number;
|
|
8
|
+
}
|
|
9
|
+
/** Normalized frame information returned by a format adapter. See {@link SpriteFrame}. */
|
|
10
|
+
export interface SpriteFrameData {
|
|
11
|
+
/** Unique frame name in this sheet. */ readonly name: string;
|
|
12
|
+
/** Zero-based atlas page index; defaults to zero. */ readonly page?: number;
|
|
13
|
+
/** Packed rectangle within the atlas page. */ readonly rect: SpriteRectangle;
|
|
14
|
+
/** Original frame dimensions before trimming. */ readonly sourceSize?: Readonly<{
|
|
15
|
+
width: number; /** Height in pixels. */
|
|
16
|
+
height: number;
|
|
17
|
+
}>;
|
|
18
|
+
/** Trimmed content offset within the original frame. */ readonly trim?: Readonly<{
|
|
19
|
+
x: number; /** Vertical pixel offset. */
|
|
20
|
+
y: number;
|
|
21
|
+
}>;
|
|
22
|
+
/** Whether the packed rectangle is rotated clockwise. */ readonly rotated?: boolean;
|
|
23
|
+
}
|
|
24
|
+
/** One normalized timed frame reference. Durations are milliseconds. See {@link SpriteFrame}. */
|
|
25
|
+
export interface SpriteAnimationFrameData {
|
|
26
|
+
readonly frame: string; /** Positive duration of the animation step in milliseconds. */
|
|
27
|
+
readonly duration: number;
|
|
28
|
+
}
|
|
29
|
+
/** Adapter result. Image paths resolve relative to the metadata URL. See {@link SpriteFrame}. */
|
|
30
|
+
export interface SpriteSheetData {
|
|
31
|
+
/** Atlas image URLs, relative to the metadata URL. */ readonly images: readonly string[];
|
|
32
|
+
/** Normalized frame records for this sheet. */ readonly frames: readonly SpriteFrameData[];
|
|
33
|
+
/** Named sequences of timed frame references. */ readonly animations?: Readonly<Record<string, readonly SpriteAnimationFrameData[]>>;
|
|
34
|
+
}
|
|
35
|
+
/** Import adapter; loaders invoke this directly without a format registry. See {@link SpriteFrame}. */
|
|
36
|
+
export interface SpriteSheetFormat {
|
|
37
|
+
readonly parse: (data: unknown) => SpriteSheetData;
|
|
38
|
+
}
|
|
39
|
+
export interface FrameRecord extends SpriteFrameData {
|
|
40
|
+
readonly image: HTMLImageElement;
|
|
41
|
+
readonly owner: {
|
|
42
|
+
disposed: boolean;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/** Immutable atlas frame. Obtain frames from loadSpriteSheet; images belong to the sheet. See {@link SpriteFrame}. */
|
|
46
|
+
export declare class SpriteFrame {
|
|
47
|
+
private readonly identity;
|
|
48
|
+
/** Original logical frame width, before transparent borders were trimmed.
|
|
49
|
+
* @returns Width in logical pixels.
|
|
50
|
+
*/
|
|
51
|
+
get width(): number;
|
|
52
|
+
/** Original logical frame height, before transparent borders were trimmed.
|
|
53
|
+
* @returns Height in logical pixels.
|
|
54
|
+
*/
|
|
55
|
+
get height(): number;
|
|
56
|
+
/** Stable name supplied by the atlas or numeric grid index.
|
|
57
|
+
* @returns The frame name.
|
|
58
|
+
*/
|
|
59
|
+
get name(): string;
|
|
60
|
+
}
|
|
61
|
+
export declare function makeFrame(record: FrameRecord): SpriteFrame;
|
|
62
|
+
export declare function frameRecord(frame: SpriteFrame): FrameRecord;
|
|
63
|
+
/** Author a finite discrete animation using FPS or explicit positive millisecond durations. See {@link SpriteFrame}.
|
|
64
|
+
* @param options - Frames with a shared FPS or individual millisecond durations.
|
|
65
|
+
* @returns A seekable discrete animation definition.
|
|
66
|
+
*/
|
|
67
|
+
export declare function defineSpriteAnimation(options: {
|
|
68
|
+
readonly frames: readonly SpriteFrame[];
|
|
69
|
+
readonly fps: number;
|
|
70
|
+
} | {
|
|
71
|
+
readonly frames: readonly Readonly<{
|
|
72
|
+
frame: SpriteFrame;
|
|
73
|
+
duration: number;
|
|
74
|
+
}>[];
|
|
75
|
+
}): PibblAnimationDefinition<SpriteFrame>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ImageProps } from '../../lib/components/img.js';
|
|
2
|
+
import type { SystemStyle } from '../../lib/types.js';
|
|
3
|
+
import { type SpriteFrame } from './model.js';
|
|
4
|
+
/** Drawing inputs; frame also accepts a signal through Pibbl's declared primitive inputs. See {@link SpriteFrame}. */
|
|
5
|
+
export interface SpriteProps extends ImageProps {
|
|
6
|
+
/** Atlas frame to draw; its sheet must remain undisposed. */ readonly frame: SpriteFrame;
|
|
7
|
+
/** Image interpolation; defaults to linear. */ readonly sampling?: 'nearest' | 'linear';
|
|
8
|
+
/** Normalized origin within the original frame, defaulting to the top-left. */ readonly anchor?: Readonly<{
|
|
9
|
+
x: number; /** Vertical anchor fraction. */
|
|
10
|
+
y: number;
|
|
11
|
+
}>;
|
|
12
|
+
/** Mirror the frame horizontally. */ readonly flipX?: boolean;
|
|
13
|
+
/** Mirror the frame vertically. */ readonly flipY?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** Logical size overrides; omitted dimensions use the original untrimmed frame size. See {@link SpriteFrame}. */
|
|
16
|
+
export interface SpriteStyle extends SystemStyle {
|
|
17
|
+
readonly width?: number; /** Logical height; defaults to the original frame height. */
|
|
18
|
+
readonly height?: number; /** Opacity multiplier applied to the frame. */
|
|
19
|
+
readonly opacity?: number;
|
|
20
|
+
}
|
|
21
|
+
/** Draw a shared atlas frame, preserving its logical geometry across frame changes. See {@link SpriteFrame}. */
|
|
22
|
+
export declare const Sprite: import("@pibbl/core").PibblPrimitiveComponent<SpriteProps, import("@pibbl/core").PrimitiveInput<SpriteProps, SpriteStyle>>;
|
|
@@ -16,7 +16,17 @@ export { tendrils } from "./lib/tendrils.js";
|
|
|
16
16
|
export type { TendrilsOptions, TendrilsMessage } from "./lib/tendrils.js";
|
|
17
17
|
export { lightning } from "./lib/lightning.js";
|
|
18
18
|
export type { LightningOptions, LightningMessage } from "./lib/lightning.js";
|
|
19
|
-
export type { ElectricPoint, ElectricOptions, ElectricControl } from "./lib/electric-shared.js";
|
|
20
|
-
export type { ElectricSource, ElectricSourceMessage } from "./lib/electric-sources.js";
|
|
19
|
+
export type { ElectricPoint, ElectricOptions, ElectricControl, } from "./lib/electric-shared.js";
|
|
20
|
+
export type { ElectricSource, ElectricSourceMessage, } from "./lib/electric-sources.js";
|
|
21
21
|
export { rainDrops } from "./lib/rain-drops.js";
|
|
22
22
|
export type { RainDropsOptions, RainDropsMessage } from "./lib/rain-drops.js";
|
|
23
|
+
export { stripes, checkers, woodGrain, plainWeave, twill, herringbone, } from "./lib/patterns.js";
|
|
24
|
+
export type { FabricOptions, PatternMotionOptions, StripesOptions, CheckersOptions, WoodGrainOptions, } from "./lib/patterns.js";
|
|
25
|
+
export { grayScottPresets } from "./lib/gray-scott.js";
|
|
26
|
+
export type { ReactionDiffusionPreset } from "./lib/gray-scott.js";
|
|
27
|
+
export { softNoise, ridgedNoise } from "./lib/patterns.js";
|
|
28
|
+
export type { NoiseOptions } from "./lib/patterns.js";
|
|
29
|
+
export { schnakenberg, barkley, brusselator, schnakenbergPresets, barkleyPresets, brusselatorPresets } from './lib/chemical-recipes.js';
|
|
30
|
+
export type { SchnakenbergOptions, BarkleyOptions, BrusselatorOptions } from './lib/chemical-recipes.js';
|
|
31
|
+
export { polkaDots, halftone, plaid, truchet, plaidPresets } from './lib/geometric-patterns.js';
|
|
32
|
+
export type { PolkaDotsOptions, HalftoneOptions, PlaidBand, PlaidOptions, TruchetOptions } from './lib/geometric-patterns.js';
|
|
@@ -13,19 +13,51 @@ import { waterSurface } from "./lib/water-surface.js";
|
|
|
13
13
|
import { tendrils } from "./lib/tendrils.js";
|
|
14
14
|
import { lightning } from "./lib/lightning.js";
|
|
15
15
|
import { rainDrops } from "./lib/rain-drops.js";
|
|
16
|
+
import {
|
|
17
|
+
stripes,
|
|
18
|
+
checkers,
|
|
19
|
+
woodGrain,
|
|
20
|
+
plainWeave,
|
|
21
|
+
twill,
|
|
22
|
+
herringbone
|
|
23
|
+
} from "./lib/patterns.js";
|
|
24
|
+
import { grayScottPresets } from "./lib/gray-scott.js";
|
|
25
|
+
import { softNoise, ridgedNoise } from "./lib/patterns.js";
|
|
26
|
+
import { schnakenberg, barkley, brusselator, schnakenbergPresets, barkleyPresets, brusselatorPresets } from "./lib/chemical-recipes.js";
|
|
27
|
+
import { polkaDots, halftone, plaid, truchet, plaidPresets } from "./lib/geometric-patterns.js";
|
|
16
28
|
export {
|
|
17
29
|
ProceduralTexture,
|
|
18
30
|
ReactionDiffusion,
|
|
31
|
+
barkley,
|
|
32
|
+
barkleyPresets,
|
|
33
|
+
brusselator,
|
|
34
|
+
brusselatorPresets,
|
|
19
35
|
cellular,
|
|
36
|
+
checkers,
|
|
37
|
+
grayScottPresets,
|
|
38
|
+
halftone,
|
|
39
|
+
herringbone,
|
|
20
40
|
lightning,
|
|
21
41
|
marble,
|
|
22
42
|
paper,
|
|
43
|
+
plaid,
|
|
44
|
+
plaidPresets,
|
|
45
|
+
plainWeave,
|
|
46
|
+
polkaDots,
|
|
23
47
|
rainDrops,
|
|
24
48
|
reactionDiffusion,
|
|
49
|
+
ridgedNoise,
|
|
50
|
+
schnakenberg,
|
|
51
|
+
schnakenbergPresets,
|
|
52
|
+
softNoise,
|
|
53
|
+
stripes,
|
|
25
54
|
tendrils,
|
|
26
55
|
texturePalettes,
|
|
56
|
+
truchet,
|
|
57
|
+
twill,
|
|
27
58
|
useTexture,
|
|
28
59
|
waterSurface,
|
|
29
|
-
waterWaves
|
|
60
|
+
waterWaves,
|
|
61
|
+
woodGrain
|
|
30
62
|
};
|
|
31
63
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/features/textures/index.ts"],
|
|
4
|
-
"sourcesContent": ["export { ReactionDiffusion } from \"./lib/reaction-diffusion.js\";\nexport type {\n ReactionDiffusionProps,\n TextureBrush,\n} from \"./lib/reaction-diffusion.js\";\nexport { texturePalettes } from \"./lib/palette.js\";\nexport type { TexturePalette, TextureResolution } from \"./lib/palette.js\";\nexport { ProceduralTexture } from \"./lib/procedural-texture.js\";\nexport type { ProceduralTextureProps } from \"./lib/procedural-texture.js\";\nexport type { TextureKind } from \"./lib/material-field.js\";\nexport type {\n TextureRenderer,\n TextureRenderFrame,\n} from \"./lib/presentation.js\";\nexport {\n useTexture,\n marble,\n paper,\n cellular,\n reactionDiffusion,\n} from \"./lib/definitions.js\";\nexport type {\n MaterialOptions,\n ReactionDiffusionOptions,\n InkMessage,\n} from \"./lib/definitions.js\";\nexport { waterWaves } from \"./lib/water-waves.js\";\nexport type {\n WaterWavesOptions,\n WaterWavesMessage,\n} from \"./lib/water-waves.js\";\nexport { waterSurface } from \"./lib/water-surface.js\";\nexport type {\n WaterSurfaceMessage,\n WaterSurfaceObstacle,\n WaterSurfaceOptions,\n} from \"./lib/water-surface.js\";\nexport { tendrils } from \"./lib/tendrils.js\";\nexport type { TendrilsOptions, TendrilsMessage } from \"./lib/tendrils.js\";\nexport { lightning } from \"./lib/lightning.js\";\nexport type { LightningOptions, LightningMessage } from \"./lib/lightning.js\";\nexport type {
|
|
5
|
-
"mappings": "AAAA,SAAS,yBAAyB;AAKlC,SAAS,uBAAuB;AAEhC,SAAS,yBAAyB;AAOlC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAMP,SAAS,kBAAkB;AAK3B,SAAS,oBAAoB;AAM7B,SAAS,gBAAgB;AAEzB,SAAS,iBAAiB;
|
|
4
|
+
"sourcesContent": ["export { ReactionDiffusion } from \"./lib/reaction-diffusion.js\";\nexport type {\n ReactionDiffusionProps,\n TextureBrush,\n} from \"./lib/reaction-diffusion.js\";\nexport { texturePalettes } from \"./lib/palette.js\";\nexport type { TexturePalette, TextureResolution } from \"./lib/palette.js\";\nexport { ProceduralTexture } from \"./lib/procedural-texture.js\";\nexport type { ProceduralTextureProps } from \"./lib/procedural-texture.js\";\nexport type { TextureKind } from \"./lib/material-field.js\";\nexport type {\n TextureRenderer,\n TextureRenderFrame,\n} from \"./lib/presentation.js\";\nexport {\n useTexture,\n marble,\n paper,\n cellular,\n reactionDiffusion,\n} from \"./lib/definitions.js\";\nexport type {\n MaterialOptions,\n ReactionDiffusionOptions,\n InkMessage,\n} from \"./lib/definitions.js\";\nexport { waterWaves } from \"./lib/water-waves.js\";\nexport type {\n WaterWavesOptions,\n WaterWavesMessage,\n} from \"./lib/water-waves.js\";\nexport { waterSurface } from \"./lib/water-surface.js\";\nexport type {\n WaterSurfaceMessage,\n WaterSurfaceObstacle,\n WaterSurfaceOptions,\n} from \"./lib/water-surface.js\";\nexport { tendrils } from \"./lib/tendrils.js\";\nexport type { TendrilsOptions, TendrilsMessage } from \"./lib/tendrils.js\";\nexport { lightning } from \"./lib/lightning.js\";\nexport type { LightningOptions, LightningMessage } from \"./lib/lightning.js\";\nexport type {\n ElectricPoint,\n ElectricOptions,\n ElectricControl,\n} from \"./lib/electric-shared.js\";\nexport type {\n ElectricSource,\n ElectricSourceMessage,\n} from \"./lib/electric-sources.js\";\n\nexport { rainDrops } from \"./lib/rain-drops.js\";\nexport type { RainDropsOptions, RainDropsMessage } from \"./lib/rain-drops.js\";\n\nexport {\n stripes,\n checkers,\n woodGrain,\n plainWeave,\n twill,\n herringbone,\n} from \"./lib/patterns.js\";\nexport type {\n FabricOptions,\n PatternMotionOptions,\n StripesOptions,\n CheckersOptions,\n WoodGrainOptions,\n} from \"./lib/patterns.js\";\nexport { grayScottPresets } from \"./lib/gray-scott.js\";\nexport type { ReactionDiffusionPreset } from \"./lib/gray-scott.js\";\n\nexport { softNoise, ridgedNoise } from \"./lib/patterns.js\";\nexport type { NoiseOptions } from \"./lib/patterns.js\";\n\nexport { schnakenberg, barkley, brusselator, schnakenbergPresets, barkleyPresets, brusselatorPresets } from './lib/chemical-recipes.js';\nexport type { SchnakenbergOptions, BarkleyOptions, BrusselatorOptions } from './lib/chemical-recipes.js';\n\nexport { polkaDots, halftone, plaid, truchet, plaidPresets } from './lib/geometric-patterns.js';\nexport type { PolkaDotsOptions, HalftoneOptions, PlaidBand, PlaidOptions, TruchetOptions } from './lib/geometric-patterns.js';\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,yBAAyB;AAKlC,SAAS,uBAAuB;AAEhC,SAAS,yBAAyB;AAOlC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAMP,SAAS,kBAAkB;AAK3B,SAAS,oBAAoB;AAM7B,SAAS,gBAAgB;AAEzB,SAAS,iBAAiB;AAY1B,SAAS,iBAAiB;AAG1B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAQP,SAAS,wBAAwB;AAGjC,SAAS,WAAW,mBAAmB;AAGvC,SAAS,cAAc,SAAS,aAAa,qBAAqB,gBAAgB,0BAA0B;AAG5G,SAAS,WAAW,UAAU,OAAO,SAAS,oBAAoB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|