@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
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
import {
|
|
2
|
+
defineTexture
|
|
3
|
+
} from "@pibbl/core";
|
|
4
|
+
import { paletteLut, texturePalettes, validateSeed } from "./palette.js";
|
|
5
|
+
const tau = Math.PI * 2;
|
|
6
|
+
function wrap(value) {
|
|
7
|
+
return (value % 1 + 1) % 1;
|
|
8
|
+
}
|
|
9
|
+
function bounded(name, value, min, max, integer = false) {
|
|
10
|
+
if (!Number.isFinite(value) || value < min || value > max || integer && !Number.isInteger(value))
|
|
11
|
+
throw new RangeError(
|
|
12
|
+
`${name} must be ${integer ? "an integer " : ""}in [${min}, ${max}].`
|
|
13
|
+
);
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
function motion(options) {
|
|
17
|
+
const phase = options.phase ?? 0;
|
|
18
|
+
if (!Number.isFinite(phase))
|
|
19
|
+
throw new RangeError("Texture phase must be finite.");
|
|
20
|
+
return {
|
|
21
|
+
phase: wrap(phase),
|
|
22
|
+
speed: bounded("Texture speed", options.speed ?? 0, 0, 20)
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function pattern(validate, sample) {
|
|
26
|
+
const definition = defineTexture({
|
|
27
|
+
create(context, config) {
|
|
28
|
+
const { width, height } = context.canvas;
|
|
29
|
+
if (config.speed > 0) context.requestFrame();
|
|
30
|
+
return {
|
|
31
|
+
config,
|
|
32
|
+
phase: config.phase,
|
|
33
|
+
fresh: true,
|
|
34
|
+
fieldDirty: true,
|
|
35
|
+
field: new Float32Array(width * height),
|
|
36
|
+
image: new ImageData(width, height)
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
update(state, config, context) {
|
|
40
|
+
if (JSON.stringify(config) === JSON.stringify(state.config)) return;
|
|
41
|
+
if (config.phase !== state.config.phase) state.phase = config.phase;
|
|
42
|
+
if (config.speed !== state.config.speed) state.fresh = true;
|
|
43
|
+
state.config = config;
|
|
44
|
+
state.fieldDirty = true;
|
|
45
|
+
context.invalidate();
|
|
46
|
+
if (config.speed > 0) context.requestFrame();
|
|
47
|
+
},
|
|
48
|
+
advance(state, frame, context) {
|
|
49
|
+
if (state.config.speed === 0) return;
|
|
50
|
+
if (!state.fresh && frame.delta > 0) {
|
|
51
|
+
state.phase = wrap(
|
|
52
|
+
state.phase + frame.delta * state.config.speed / 1e3
|
|
53
|
+
);
|
|
54
|
+
state.fieldDirty = true;
|
|
55
|
+
context.invalidate();
|
|
56
|
+
}
|
|
57
|
+
state.fresh = false;
|
|
58
|
+
context.requestFrame();
|
|
59
|
+
},
|
|
60
|
+
rasterize(state, context) {
|
|
61
|
+
const { width, height } = context.canvas;
|
|
62
|
+
if (state.fieldDirty) {
|
|
63
|
+
for (let y = 0; y < height; y++)
|
|
64
|
+
for (let x = 0; x < width; x++)
|
|
65
|
+
state.field[y * width + x] = sample(
|
|
66
|
+
state.config,
|
|
67
|
+
x === width - 1 ? 0 : x / (width - 1),
|
|
68
|
+
y === height - 1 ? 0 : y / (height - 1),
|
|
69
|
+
state.phase
|
|
70
|
+
);
|
|
71
|
+
state.fieldDirty = false;
|
|
72
|
+
}
|
|
73
|
+
const palette = context.palette ?? texturePalettes.porcelain;
|
|
74
|
+
const key = palette.join();
|
|
75
|
+
if (key !== state.paletteKey) {
|
|
76
|
+
state.lut = paletteLut(palette);
|
|
77
|
+
state.paletteKey = key;
|
|
78
|
+
}
|
|
79
|
+
const image = state.image;
|
|
80
|
+
const data = image.data, lut = state.lut;
|
|
81
|
+
for (let i = 0; i < state.field.length; i++) {
|
|
82
|
+
const index = Math.round(Math.max(0, Math.min(1, state.field[i])) * 255) * 4;
|
|
83
|
+
data[i * 4] = lut[index];
|
|
84
|
+
data[i * 4 + 1] = lut[index + 1];
|
|
85
|
+
data[i * 4 + 2] = lut[index + 2];
|
|
86
|
+
data[i * 4 + 3] = 255;
|
|
87
|
+
}
|
|
88
|
+
context.canvas.getContext("2d").putImageData(image, 0, 0);
|
|
89
|
+
},
|
|
90
|
+
dispose(state) {
|
|
91
|
+
state.field = new Float32Array(0);
|
|
92
|
+
state.image = void 0;
|
|
93
|
+
state.lut = void 0;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
return (options) => definition(validate(options));
|
|
97
|
+
}
|
|
98
|
+
const stripeRecipe = /* @__PURE__ */ pattern(
|
|
99
|
+
(options) => ({
|
|
100
|
+
...motion(options),
|
|
101
|
+
bands: bounded("Stripe bands", options.bands ?? 8, 1, 64, true),
|
|
102
|
+
dutyCycle: bounded("Stripe dutyCycle", options.dutyCycle ?? 0.5, 0, 1),
|
|
103
|
+
wave: bounded("Stripe wave", options.wave ?? 0, 0, 1),
|
|
104
|
+
waveCycles: bounded(
|
|
105
|
+
"Stripe waveCycles",
|
|
106
|
+
options.waveCycles ?? 1,
|
|
107
|
+
1,
|
|
108
|
+
16,
|
|
109
|
+
true
|
|
110
|
+
)
|
|
111
|
+
}),
|
|
112
|
+
(c, u, v, phase) => wrap(
|
|
113
|
+
(u + c.wave * Math.sin(tau * (v * c.waveCycles + phase))) * c.bands + phase
|
|
114
|
+
) < c.dutyCycle ? 1 : 0
|
|
115
|
+
);
|
|
116
|
+
function stripes(options = {}) {
|
|
117
|
+
return stripeRecipe(options);
|
|
118
|
+
}
|
|
119
|
+
const checkerRecipe = /* @__PURE__ */ pattern(
|
|
120
|
+
(options) => {
|
|
121
|
+
const columns = bounded(
|
|
122
|
+
"Checker columns",
|
|
123
|
+
options.columns ?? 8,
|
|
124
|
+
2,
|
|
125
|
+
64,
|
|
126
|
+
true
|
|
127
|
+
);
|
|
128
|
+
const rows = bounded("Checker rows", options.rows ?? 8, 2, 64, true);
|
|
129
|
+
if (columns % 2 || rows % 2)
|
|
130
|
+
throw new RangeError(
|
|
131
|
+
"Checker rows and columns must be even for seamless alternation."
|
|
132
|
+
);
|
|
133
|
+
return { ...motion(options), columns, rows };
|
|
134
|
+
},
|
|
135
|
+
(c, u, v, phase) => (Math.floor(wrap(u + phase) * c.columns) + Math.floor(v * c.rows)) % 2
|
|
136
|
+
);
|
|
137
|
+
function checkers(options = {}) {
|
|
138
|
+
return checkerRecipe(options);
|
|
139
|
+
}
|
|
140
|
+
function hash(index, seed) {
|
|
141
|
+
let value = Math.imul(index ^ seed, 73244475);
|
|
142
|
+
value = Math.imul(value ^ value >>> 16, 73244475);
|
|
143
|
+
return ((value ^ value >>> 16) >>> 0) / 4294967295;
|
|
144
|
+
}
|
|
145
|
+
function noise(u, v, columns, rows, seed) {
|
|
146
|
+
const x = wrap(u) * columns, y = wrap(v) * rows;
|
|
147
|
+
const ix = Math.floor(x), iy = Math.floor(y);
|
|
148
|
+
const fx = x - ix, fy = y - iy;
|
|
149
|
+
const sx = fx * fx * fx * (fx * (fx * 6 - 15) + 10);
|
|
150
|
+
const sy = fy * fy * fy * (fy * (fy * 6 - 15) + 10);
|
|
151
|
+
const a = hash(iy * columns + ix, seed);
|
|
152
|
+
const b = hash(iy * columns + (ix + 1) % columns, seed);
|
|
153
|
+
const c = hash((iy + 1) % rows * columns + ix, seed);
|
|
154
|
+
const d = hash((iy + 1) % rows * columns + (ix + 1) % columns, seed);
|
|
155
|
+
return ((a + (b - a) * sx) * (1 - sy) + (c + (d - c) * sx) * sy) * 2 - 1;
|
|
156
|
+
}
|
|
157
|
+
const woodRecipe = /* @__PURE__ */ pattern(
|
|
158
|
+
(options) => {
|
|
159
|
+
const seed = validateSeed(options.seed);
|
|
160
|
+
const knots = bounded("Wood knots", options.knots ?? 0, 0, 12, true);
|
|
161
|
+
return {
|
|
162
|
+
...motion(options),
|
|
163
|
+
seed,
|
|
164
|
+
grain: bounded("Wood grain", options.grain ?? 32, 4, 128, true),
|
|
165
|
+
distortion: bounded("Wood distortion", options.distortion ?? 0.5, 0, 1),
|
|
166
|
+
roughness: bounded("Wood roughness", options.roughness ?? 0.4, 0, 1),
|
|
167
|
+
knotSize: bounded("Wood knotSize", options.knotSize ?? 0.09, 0.02, 0.18),
|
|
168
|
+
knots: Array.from({ length: knots }, (_, i) => ({
|
|
169
|
+
u: hash(i * 7 + 11, seed),
|
|
170
|
+
v: hash(i * 7 + 21, seed),
|
|
171
|
+
aspect: 1 + 0.9 * hash(i * 7 + 31, seed)
|
|
172
|
+
}))
|
|
173
|
+
};
|
|
174
|
+
},
|
|
175
|
+
(c, u, v, phase) => {
|
|
176
|
+
v = wrap(v + phase);
|
|
177
|
+
const broad = noise(u, v, 4, 4, c.seed);
|
|
178
|
+
const medium = noise(u, v, 8, 8, c.seed ^ 1367130551);
|
|
179
|
+
const fine = noise(u, v, 16, 16, c.seed ^ 1757159915);
|
|
180
|
+
let coordinate = u + c.distortion * (0.12 * broad + 0.045 * medium + 0.015 * fine);
|
|
181
|
+
for (const knot of c.knots) {
|
|
182
|
+
const dx = wrap(u - knot.u + 0.5) - 0.5;
|
|
183
|
+
const dy = wrap(v - knot.v + 0.5) - 0.5;
|
|
184
|
+
const radius = Math.hypot(dx, dy / knot.aspect) / (c.knotSize * 0.7);
|
|
185
|
+
if (radius >= 2) continue;
|
|
186
|
+
const outside = Math.max(1, radius);
|
|
187
|
+
const influence = Math.pow((4 - outside * outside) / 3, 2);
|
|
188
|
+
coordinate -= dx / (outside * outside) * influence;
|
|
189
|
+
}
|
|
190
|
+
const growth = 0.5 + 0.5 * Math.cos(tau * (coordinate * c.grain + c.roughness * fine * 0.2));
|
|
191
|
+
const fiber = Math.pow(
|
|
192
|
+
0.5 + 0.5 * Math.cos(tau * coordinate * c.grain * 3),
|
|
193
|
+
12
|
|
194
|
+
);
|
|
195
|
+
let value = 0.72 - 0.32 * Math.pow(growth, 7) + 0.055 * broad - c.roughness * (0.09 * fiber + 0.035 * fine);
|
|
196
|
+
for (const knot of c.knots) {
|
|
197
|
+
const dx = wrap(u - knot.u + 0.5) - 0.5;
|
|
198
|
+
const dy = wrap(v - knot.v + 0.5) - 0.5;
|
|
199
|
+
const radius = Math.hypot(dx, dy / knot.aspect) / (c.knotSize * 0.7);
|
|
200
|
+
if (radius >= 1) continue;
|
|
201
|
+
const edge = Math.min(1, Math.max(0, (radius - 0.85) / 0.15));
|
|
202
|
+
const blend = 1 - edge * edge * (3 - 2 * edge);
|
|
203
|
+
const ring = Math.pow(0.5 + 0.5 * Math.cos(tau * radius * 3), 5);
|
|
204
|
+
const knotValue = 0.55 - 0.23 * ring - 0.28 * Math.pow(Math.max(0, 1 - radius * 3), 2);
|
|
205
|
+
value += (knotValue - value) * blend;
|
|
206
|
+
}
|
|
207
|
+
return value;
|
|
208
|
+
}
|
|
209
|
+
);
|
|
210
|
+
function woodGrain(options = {}) {
|
|
211
|
+
return woodRecipe(options);
|
|
212
|
+
}
|
|
213
|
+
function fabricConfig(options) {
|
|
214
|
+
const threads = bounded(
|
|
215
|
+
"Fabric threads",
|
|
216
|
+
options.threads ?? 16,
|
|
217
|
+
8,
|
|
218
|
+
128,
|
|
219
|
+
true
|
|
220
|
+
);
|
|
221
|
+
if (threads % 8 !== 0)
|
|
222
|
+
throw new RangeError("Fabric threads must be a multiple of 8.");
|
|
223
|
+
return {
|
|
224
|
+
...motion(options),
|
|
225
|
+
seed: validateSeed(options.seed),
|
|
226
|
+
threads,
|
|
227
|
+
threadWidth: bounded(
|
|
228
|
+
"Fabric threadWidth",
|
|
229
|
+
options.threadWidth ?? 0.8,
|
|
230
|
+
0.2,
|
|
231
|
+
1
|
|
232
|
+
),
|
|
233
|
+
relief: bounded("Fabric relief", options.relief ?? 0.65, 0, 1),
|
|
234
|
+
fuzz: bounded("Fabric fuzz", options.fuzz ?? 0.2, 0, 1)
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
function fabricSample(c, u, v, warpOnTop) {
|
|
238
|
+
const x = u * c.threads, y = v * c.threads;
|
|
239
|
+
const warpFiber = noise(u, v, c.threads * 8, 16, c.seed);
|
|
240
|
+
const weftFiber = noise(u, v, 16, c.threads * 8, c.seed ^ 1757159915);
|
|
241
|
+
const warpRadius = c.threadWidth * (1 + c.fuzz * 0.14 * warpFiber);
|
|
242
|
+
const weftRadius = c.threadWidth * (1 + c.fuzz * 0.14 * weftFiber);
|
|
243
|
+
const acrossWarp = Math.abs(x % 1 - 0.5) * 2 / warpRadius;
|
|
244
|
+
const acrossWeft = Math.abs(y % 1 - 0.5) * 2 / weftRadius;
|
|
245
|
+
const softness = 0.1 + c.fuzz * 0.45;
|
|
246
|
+
const coverage = (across) => {
|
|
247
|
+
const t = Math.max(
|
|
248
|
+
0,
|
|
249
|
+
Math.min(1, (across - (1 - softness)) / (2 * softness))
|
|
250
|
+
);
|
|
251
|
+
return 1 - t * t * (3 - 2 * t);
|
|
252
|
+
};
|
|
253
|
+
const warp = coverage(acrossWarp), weft = coverage(acrossWeft);
|
|
254
|
+
const warpCrown = Math.sqrt(Math.max(0, 1 - acrossWarp * acrossWarp));
|
|
255
|
+
const weftCrown = Math.sqrt(Math.max(0, 1 - acrossWeft * acrossWeft));
|
|
256
|
+
const warpValue = 0.62 + c.relief * (0.14 * warpCrown - 0.07) + c.fuzz * 0.15 * warpFiber;
|
|
257
|
+
const weftValue = 0.43 + c.relief * (0.14 * weftCrown - 0.07) + c.fuzz * 0.15 * weftFiber;
|
|
258
|
+
const gap = 0.18;
|
|
259
|
+
return warpOnTop ? warpValue * warp + (weftValue * weft + gap * (1 - weft)) * (1 - warp) : weftValue * weft + (warpValue * warp + gap * (1 - warp)) * (1 - weft);
|
|
260
|
+
}
|
|
261
|
+
const plainWeaveRecipe = /* @__PURE__ */ pattern(
|
|
262
|
+
fabricConfig,
|
|
263
|
+
(c, u, v, phase) => {
|
|
264
|
+
v = wrap(v + phase);
|
|
265
|
+
const x = Math.floor(u * c.threads), y = Math.floor(v * c.threads);
|
|
266
|
+
return fabricSample(c, u, v, (x + y) % 2 === 0);
|
|
267
|
+
}
|
|
268
|
+
);
|
|
269
|
+
const twillRecipe = /* @__PURE__ */ pattern(fabricConfig, (c, u, v, phase) => {
|
|
270
|
+
v = wrap(v + phase);
|
|
271
|
+
const x = Math.floor(u * c.threads), y = Math.floor(v * c.threads);
|
|
272
|
+
return fabricSample(c, u, v, ((x - y) % 4 + 4) % 4 < 2);
|
|
273
|
+
});
|
|
274
|
+
const herringboneHarnesses = [0, 1, 2, 3, 1, 0, 3, 2];
|
|
275
|
+
const herringboneRecipe = /* @__PURE__ */ pattern(
|
|
276
|
+
fabricConfig,
|
|
277
|
+
(c, u, v, phase) => {
|
|
278
|
+
v = wrap(v + phase);
|
|
279
|
+
const x = Math.floor(u * c.threads) % 8, y = Math.floor(v * c.threads);
|
|
280
|
+
const harness = herringboneHarnesses[x];
|
|
281
|
+
return fabricSample(c, u, v, (harness + y) % 4 >= 2);
|
|
282
|
+
}
|
|
283
|
+
);
|
|
284
|
+
function plainWeave(options = {}) {
|
|
285
|
+
return plainWeaveRecipe(options);
|
|
286
|
+
}
|
|
287
|
+
function twill(options = {}) {
|
|
288
|
+
return twillRecipe(options);
|
|
289
|
+
}
|
|
290
|
+
function herringbone(options = {}) {
|
|
291
|
+
return herringboneRecipe(options);
|
|
292
|
+
}
|
|
293
|
+
function noiseConfig(options) {
|
|
294
|
+
return {
|
|
295
|
+
...motion(options),
|
|
296
|
+
seed: validateSeed(options.seed),
|
|
297
|
+
frequency: bounded("Noise frequency", options.frequency ?? 4, 1, 16, true),
|
|
298
|
+
octaves: bounded("Noise octaves", options.octaves ?? 4, 1, 6, true),
|
|
299
|
+
persistence: bounded("Noise persistence", options.persistence ?? 0.5, 0, 1),
|
|
300
|
+
contrast: bounded("Noise contrast", options.contrast ?? 1, 0, 4)
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
function layeredNoise(c, u, v, ridge) {
|
|
304
|
+
let sum = 0, weight = 0, amplitude = 1, frequency = c.frequency;
|
|
305
|
+
for (let i = 0; i < c.octaves; i++) {
|
|
306
|
+
const sample = noise(
|
|
307
|
+
u,
|
|
308
|
+
v,
|
|
309
|
+
frequency,
|
|
310
|
+
frequency,
|
|
311
|
+
c.seed ^ Math.imul(i, 1367130551)
|
|
312
|
+
);
|
|
313
|
+
sum += (ridge ? 1 - Math.abs(sample) : 0.5 + sample * 0.5) * amplitude;
|
|
314
|
+
weight += amplitude;
|
|
315
|
+
amplitude *= c.persistence;
|
|
316
|
+
frequency *= 2;
|
|
317
|
+
}
|
|
318
|
+
return 0.5 + (sum / weight - 0.5) * c.contrast;
|
|
319
|
+
}
|
|
320
|
+
const softNoiseRecipe = /* @__PURE__ */ pattern(
|
|
321
|
+
noiseConfig,
|
|
322
|
+
(c, u, v, phase) => layeredNoise(c, u, wrap(v + phase), false)
|
|
323
|
+
);
|
|
324
|
+
const ridgedNoiseRecipe = /* @__PURE__ */ pattern(
|
|
325
|
+
noiseConfig,
|
|
326
|
+
(c, u, v, phase) => layeredNoise(c, u, wrap(v + phase), true)
|
|
327
|
+
);
|
|
328
|
+
function softNoise(options = {}) {
|
|
329
|
+
return softNoiseRecipe(options);
|
|
330
|
+
}
|
|
331
|
+
function ridgedNoise(options = {}) {
|
|
332
|
+
return ridgedNoiseRecipe(options);
|
|
333
|
+
}
|
|
334
|
+
export {
|
|
335
|
+
checkers,
|
|
336
|
+
herringbone,
|
|
337
|
+
plainWeave,
|
|
338
|
+
ridgedNoise,
|
|
339
|
+
softNoise,
|
|
340
|
+
stripes,
|
|
341
|
+
twill,
|
|
342
|
+
woodGrain
|
|
343
|
+
};
|
|
344
|
+
//# sourceMappingURL=patterns.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/features/textures/lib/patterns.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n defineTexture,\n type TextureContext,\n type TextureRecipe,\n} from \"@pibbl/core\";\nimport { paletteLut, texturePalettes, validateSeed } from \"./palette.js\";\n\n/** Shared periodic motion controls for geometric and fiber recipes. @see {@link stripes} */\nexport interface PatternMotionOptions {\n /** Initial phase in cycles; any finite value wraps. See {@link PatternMotionOptions}. */\n readonly phase?: number;\n /** Nonnegative cycles per second, up to 20; zero idles. See {@link PatternMotionOptions}. */\n readonly speed?: number;\n}\n/** Controls for periodic stripes; rotate the repeat lattice through paint placement. @see {@link stripes} */\nexport interface StripesOptions extends PatternMotionOptions {\n /** Integer stripe periods across the tile, 1\u201364; default 8. See {@link StripesOptions}. */\n readonly bands?: number;\n /** Foreground fraction of each period, 0\u20131; default 0.5. See {@link StripesOptions}. */\n readonly dutyCycle?: number;\n /** Horizontal wave amplitude in tile fractions, 0\u20131; default 0. See {@link StripesOptions}. */\n readonly wave?: number;\n /** Integer wave periods down the tile, 1\u201316; default 1. See {@link StripesOptions}. */\n readonly waveCycles?: number;\n}\n/** Controls for a two-color checkerboard. @see {@link checkers} */\nexport interface CheckersOptions extends PatternMotionOptions {\n /** Even integer columns, 2\u201364; default 8. See {@link CheckersOptions}. */\n readonly columns?: number;\n /** Even integer rows, 2\u201364; default 8. See {@link CheckersOptions}. */\n readonly rows?: number;\n}\n/** Controls for seeded seamless wood grain with optional knots. @see {@link woodGrain} */\nexport interface WoodGrainOptions extends PatternMotionOptions {\n /** Unsigned 32-bit variation seed; default 42. See {@link WoodGrainOptions}. */\n readonly seed?: number;\n /** Integer grain periods across the tile, 4\u2013128; default 32. See {@link WoodGrainOptions}. */\n readonly grain?: number;\n /** Irregular grain bending, 0\u20131; default 0.5. See {@link WoodGrainOptions}. */\n readonly distortion?: number;\n /** Fine fiber and pore variation, 0\u20131; default 0.4. See {@link WoodGrainOptions}. */\n readonly roughness?: number;\n /** Integer knot count, 0\u201312; default 0 for clear grain. See {@link WoodGrainOptions}. */\n readonly knots?: number;\n /** Knot radius in tile fractions, 0.02\u20130.18; default 0.09. See {@link WoodGrainOptions}. */\n readonly knotSize?: number;\n}\nconst tau = Math.PI * 2;\nfunction wrap(value: number) {\n return ((value % 1) + 1) % 1;\n}\nfunction bounded(\n name: string,\n value: number,\n min: number,\n max: number,\n integer = false,\n) {\n if (\n !Number.isFinite(value) ||\n value < min ||\n value > max ||\n (integer && !Number.isInteger(value))\n )\n throw new RangeError(\n `${name} must be ${integer ? \"an integer \" : \"\"}in [${min}, ${max}].`,\n );\n return value;\n}\nfunction motion(options: PatternMotionOptions) {\n const phase = options.phase ?? 0;\n if (!Number.isFinite(phase))\n throw new RangeError(\"Texture phase must be finite.\");\n return {\n phase: wrap(phase),\n speed: bounded(\"Texture speed\", options.speed ?? 0, 0, 20),\n };\n}\ntype Motion = ReturnType<typeof motion>;\ninterface PatternState<Config> {\n config: Config;\n phase: number;\n fresh: boolean;\n fieldDirty: boolean;\n field: Float32Array;\n image: ImageData | undefined;\n paletteKey?: string;\n lut?: Uint8ClampedArray;\n}\n// Shared lifecycle only. Each public factory has its own configuration and one\n// fixed return contract. Sampling and recoloring reuse bounded buffers.\nfunction pattern<Options, Config extends Motion>(\n validate: (options: Options) => Config,\n sample: (config: Config, u: number, v: number, phase: number) => number,\n) {\n const definition = defineTexture<Config, PatternState<Config>>({\n create(context, config) {\n const { width, height } = context.canvas;\n if (config.speed > 0) context.requestFrame();\n return {\n config,\n phase: config.phase,\n fresh: true,\n fieldDirty: true,\n field: new Float32Array(width * height),\n image: new ImageData(width, height),\n };\n },\n update(state, config, context) {\n if (JSON.stringify(config) === JSON.stringify(state.config)) return;\n if (config.phase !== state.config.phase) state.phase = config.phase;\n if (config.speed !== state.config.speed) state.fresh = true;\n state.config = config;\n state.fieldDirty = true;\n context.invalidate();\n if (config.speed > 0) context.requestFrame();\n },\n advance(state, frame, context) {\n if (state.config.speed === 0) return;\n if (!state.fresh && frame.delta > 0) {\n state.phase = wrap(\n state.phase + (frame.delta * state.config.speed) / 1000,\n );\n state.fieldDirty = true;\n context.invalidate();\n }\n state.fresh = false;\n context.requestFrame();\n },\n rasterize(state, context: TextureContext) {\n const { width, height } = context.canvas;\n if (state.fieldDirty) {\n for (let y = 0; y < height; y++)\n for (let x = 0; x < width; x++)\n state.field[y * width + x] = sample(\n state.config,\n x === width - 1 ? 0 : x / (width - 1),\n y === height - 1 ? 0 : y / (height - 1),\n state.phase,\n );\n state.fieldDirty = false;\n }\n const palette = context.palette ?? texturePalettes.porcelain;\n const key = palette.join();\n if (key !== state.paletteKey) {\n state.lut = paletteLut(palette);\n state.paletteKey = key;\n }\n const image = state.image!;\n const data = image.data,\n lut = state.lut!;\n for (let i = 0; i < state.field.length; i++) {\n const index =\n Math.round(Math.max(0, Math.min(1, state.field[i])) * 255) * 4;\n data[i * 4] = lut[index];\n data[i * 4 + 1] = lut[index + 1];\n data[i * 4 + 2] = lut[index + 2];\n data[i * 4 + 3] = 255;\n }\n context.canvas.getContext(\"2d\")!.putImageData(image, 0, 0);\n },\n dispose(state) {\n state.field = new Float32Array(0);\n state.image = undefined;\n state.lut = undefined;\n },\n });\n return (options: Options): TextureRecipe => definition(validate(options));\n}\nconst stripeRecipe = /* @__PURE__ */ pattern(\n (options: StripesOptions) => ({\n ...motion(options),\n bands: bounded(\"Stripe bands\", options.bands ?? 8, 1, 64, true),\n dutyCycle: bounded(\"Stripe dutyCycle\", options.dutyCycle ?? 0.5, 0, 1),\n wave: bounded(\"Stripe wave\", options.wave ?? 0, 0, 1),\n waveCycles: bounded(\n \"Stripe waveCycles\",\n options.waveCycles ?? 1,\n 1,\n 16,\n true,\n ),\n }),\n (c, u, v, phase) =>\n wrap(\n (u + c.wave * Math.sin(tau * (v * c.waveCycles + phase))) * c.bands +\n phase,\n ) < c.dutyCycle\n ? 1\n : 0,\n);\n\n/**\n * Creates seamless straight or wavy stripes using the palette endpoints.\n * @param options - Stripe geometry and periodic motion. See {@link StripesOptions}.\n * @returns A mountable texture recipe with no message commands. See {@link TextureRecipe}.\n * @see {@link StripesOptions}\n */\nexport function stripes(options: StripesOptions = {}): TextureRecipe {\n return stripeRecipe(options);\n}\nconst checkerRecipe = /* @__PURE__ */ pattern(\n (options: CheckersOptions) => {\n const columns = bounded(\n \"Checker columns\",\n options.columns ?? 8,\n 2,\n 64,\n true,\n );\n const rows = bounded(\"Checker rows\", options.rows ?? 8, 2, 64, true);\n if (columns % 2 || rows % 2)\n throw new RangeError(\n \"Checker rows and columns must be even for seamless alternation.\",\n );\n return { ...motion(options), columns, rows };\n },\n (c, u, v, phase) =>\n (Math.floor(wrap(u + phase) * c.columns) + Math.floor(v * c.rows)) % 2,\n);\n/**\n * Creates a seamless checkerboard using the palette endpoints.\n * @param options - Even row/column counts and periodic motion. See {@link CheckersOptions}.\n * @returns A mountable texture recipe with no message commands. See {@link TextureRecipe}.\n * @see {@link CheckersOptions}\n */\nexport function checkers(options: CheckersOptions = {}): TextureRecipe {\n return checkerRecipe(options);\n}\nfunction hash(index: number, seed: number) {\n let value = Math.imul(index ^ seed, 0x45d9f3b);\n value = Math.imul(value ^ (value >>> 16), 0x45d9f3b);\n return ((value ^ (value >>> 16)) >>> 0) / 0xffffffff;\n}\n// Seeded lattice noise wraps both axes. Several scales bend the growth lines\n// independently, avoiding the uniform sine-wave paths of the original study.\nfunction noise(\n u: number,\n v: number,\n columns: number,\n rows: number,\n seed: number,\n) {\n const x = wrap(u) * columns,\n y = wrap(v) * rows;\n const ix = Math.floor(x),\n iy = Math.floor(y);\n const fx = x - ix,\n fy = y - iy;\n const sx = fx * fx * fx * (fx * (fx * 6 - 15) + 10);\n const sy = fy * fy * fy * (fy * (fy * 6 - 15) + 10);\n const a = hash(iy * columns + ix, seed);\n const b = hash(iy * columns + ((ix + 1) % columns), seed);\n const c = hash(((iy + 1) % rows) * columns + ix, seed);\n const d = hash(((iy + 1) % rows) * columns + ((ix + 1) % columns), seed);\n return ((a + (b - a) * sx) * (1 - sy) + (c + (d - c) * sx) * sy) * 2 - 1;\n}\nconst woodRecipe = /* @__PURE__ */ pattern(\n (options: WoodGrainOptions) => {\n const seed = validateSeed(options.seed);\n const knots = bounded(\"Wood knots\", options.knots ?? 0, 0, 12, true);\n return {\n ...motion(options),\n seed,\n grain: bounded(\"Wood grain\", options.grain ?? 32, 4, 128, true),\n distortion: bounded(\"Wood distortion\", options.distortion ?? 0.5, 0, 1),\n roughness: bounded(\"Wood roughness\", options.roughness ?? 0.4, 0, 1),\n knotSize: bounded(\"Wood knotSize\", options.knotSize ?? 0.09, 0.02, 0.18),\n knots: Array.from({ length: knots }, (_, i) => ({\n u: hash(i * 7 + 11, seed),\n v: hash(i * 7 + 21, seed),\n aspect: 1 + 0.9 * hash(i * 7 + 31, seed),\n })),\n };\n },\n (c, u, v, phase) => {\n v = wrap(v + phase);\n const broad = noise(u, v, 4, 4, c.seed);\n const medium = noise(u, v, 8, 8, c.seed ^ 0x517cc1b7);\n const fine = noise(u, v, 16, 16, c.seed ^ 0x68bc21eb);\n let coordinate =\n u + c.distortion * (0.12 * broad + 0.045 * medium + 0.015 * fine);\n // Shortest periodic offsets let a knot crossing a tile boundary continue\n // in its neighboring copy. Compact support vanishes before antipodal points.\n for (const knot of c.knots) {\n const dx = wrap(u - knot.u + 0.5) - 0.5;\n const dy = wrap(v - knot.v + 0.5) - 0.5;\n const radius = Math.hypot(dx, dy / knot.aspect) / (c.knotSize * 0.7);\n if (radius >= 2) continue;\n // Inverse stream coordinate around an elliptical obstacle: subtracting\n // this displacement makes equal-growth contours bow away from the core.\n // At radius 1 the center streamline follows the knot boundary; the\n // compact taper restores undisturbed grain at radius 2.\n const outside = Math.max(1, radius);\n const influence = Math.pow((4 - outside * outside) / 3, 2);\n coordinate -= (dx / (outside * outside)) * influence;\n }\n const growth =\n 0.5 +\n 0.5 * Math.cos(tau * (coordinate * c.grain + c.roughness * fine * 0.2));\n const fiber = Math.pow(\n 0.5 + 0.5 * Math.cos(tau * coordinate * c.grain * 3),\n 12,\n );\n let value =\n 0.72 -\n 0.32 * Math.pow(growth, 7) +\n 0.055 * broad -\n c.roughness * (0.09 * fiber + 0.035 * fine);\n for (const knot of c.knots) {\n const dx = wrap(u - knot.u + 0.5) - 0.5;\n const dy = wrap(v - knot.v + 0.5) - 0.5;\n const radius = Math.hypot(dx, dy / knot.aspect) / (c.knotSize * 0.7);\n if (radius >= 1) continue;\n const edge = Math.min(1, Math.max(0, (radius - 0.85) / 0.15));\n const blend = 1 - edge * edge * (3 - 2 * edge);\n const ring = Math.pow(0.5 + 0.5 * Math.cos(tau * radius * 3), 5);\n const knotValue =\n 0.55 - 0.23 * ring - 0.28 * Math.pow(Math.max(0, 1 - radius * 3), 2);\n value += (knotValue - value) * blend;\n }\n return value;\n },\n);\n/**\n * Creates seamless seeded wood with irregular grain, fine fibers, and optional knots.\n * @param options - Grain frequency, distortion, roughness, knots, seed, and motion. See {@link WoodGrainOptions}.\n * @returns A mountable texture recipe with no message commands. See {@link TextureRecipe}.\n * @see {@link WoodGrainOptions}\n */\nexport function woodGrain(options: WoodGrainOptions = {}): TextureRecipe {\n return woodRecipe(options);\n}\n\n/** Shared thread geometry and shading for seamless woven fabrics. @see {@link plainWeave} */\nexport interface FabricOptions extends PatternMotionOptions {\n /** Unsigned 32-bit fiber variation seed; default 42. See {@link FabricOptions}. */\n readonly seed?: number;\n /** Thread count on each axis, a multiple of 8 in 8\u2013128; default 16. See {@link FabricOptions}. */\n readonly threads?: number;\n /** Thread width as a fraction of cell spacing, 0.2\u20131; default 0.8. See {@link FabricOptions}. */\n readonly threadWidth?: number;\n /** Rounded thread lighting strength, 0\u20131; default 0.65. See {@link FabricOptions}. */\n readonly relief?: number;\n /** Seeded directional fibers and soft, uneven yarn edges, 0\u20131; default 0.2. See {@link FabricOptions}. */\n readonly fuzz?: number;\n}\nfunction fabricConfig(options: FabricOptions) {\n const threads = bounded(\n \"Fabric threads\",\n options.threads ?? 16,\n 8,\n 128,\n true,\n );\n if (threads % 8 !== 0)\n throw new RangeError(\"Fabric threads must be a multiple of 8.\");\n return {\n ...motion(options),\n seed: validateSeed(options.seed),\n threads,\n threadWidth: bounded(\n \"Fabric threadWidth\",\n options.threadWidth ?? 0.8,\n 0.2,\n 1,\n ),\n relief: bounded(\"Fabric relief\", options.relief ?? 0.65, 0, 1),\n fuzz: bounded(\"Fabric fuzz\", options.fuzz ?? 0.2, 0, 1),\n };\n}\ntype FabricConfig = ReturnType<typeof fabricConfig>;\nfunction fabricSample(\n c: FabricConfig,\n u: number,\n v: number,\n warpOnTop: boolean,\n) {\n const x = u * c.threads,\n y = v * c.threads;\n const warpFiber = noise(u, v, c.threads * 8, 16, c.seed);\n const weftFiber = noise(u, v, 16, c.threads * 8, c.seed ^ 0x68bc21eb);\n // Spun yarn has uneven edges and a soft fiber envelope. Coverage, rather\n // than a binary inside/outside test, keeps enlarged yarn from looking cut out.\n const warpRadius = c.threadWidth * (1 + c.fuzz * 0.14 * warpFiber);\n const weftRadius = c.threadWidth * (1 + c.fuzz * 0.14 * weftFiber);\n const acrossWarp = (Math.abs((x % 1) - 0.5) * 2) / warpRadius;\n const acrossWeft = (Math.abs((y % 1) - 0.5) * 2) / weftRadius;\n const softness = 0.1 + c.fuzz * 0.45;\n const coverage = (across: number) => {\n const t = Math.max(\n 0,\n Math.min(1, (across - (1 - softness)) / (2 * softness)),\n );\n return 1 - t * t * (3 - 2 * t);\n };\n const warp = coverage(acrossWarp),\n weft = coverage(acrossWeft);\n const warpCrown = Math.sqrt(Math.max(0, 1 - acrossWarp * acrossWarp));\n const weftCrown = Math.sqrt(Math.max(0, 1 - acrossWeft * acrossWeft));\n const warpValue =\n 0.62 + c.relief * (0.14 * warpCrown - 0.07) + c.fuzz * 0.15 * warpFiber;\n const weftValue =\n 0.43 + c.relief * (0.14 * weftCrown - 0.07) + c.fuzz * 0.15 * weftFiber;\n const gap = 0.18;\n // The drawdown determines occlusion at crossings. A yarn stays continuous\n // along a float; no per-cell bevel or repeated shadow chops it into blocks.\n return warpOnTop\n ? warpValue * warp + (weftValue * weft + gap * (1 - weft)) * (1 - warp)\n : weftValue * weft + (warpValue * warp + gap * (1 - warp)) * (1 - weft);\n}\nconst plainWeaveRecipe = /* @__PURE__ */ pattern(\n fabricConfig,\n (c, u, v, phase) => {\n v = wrap(v + phase);\n const x = Math.floor(u * c.threads),\n y = Math.floor(v * c.threads);\n return fabricSample(c, u, v, (x + y) % 2 === 0);\n },\n);\nconst twillRecipe = /* @__PURE__ */ pattern(fabricConfig, (c, u, v, phase) => {\n v = wrap(v + phase);\n const x = Math.floor(u * c.threads),\n y = Math.floor(v * c.threads);\n return fabricSample(c, u, v, (((x - y) % 4) + 4) % 4 < 2);\n});\nconst herringboneHarnesses = [0, 1, 2, 3, 1, 0, 3, 2] as const;\nconst herringboneRecipe = /* @__PURE__ */ pattern(\n fabricConfig,\n (c, u, v, phase) => {\n v = wrap(v + phase);\n const x = Math.floor(u * c.threads) % 8,\n y = Math.floor(v * c.threads);\n // CottonWorks Weaving 101, p. 23: harness sequence 1,2,3,4,2,1,4,3.\n // The offset at each reversal breaks the diagonal instead of duplicating\n // the turning end, which would produce a pointed/chevron-like twill.\n const harness = herringboneHarnesses[x];\n return fabricSample(c, u, v, (harness + y) % 4 >= 2);\n },\n);\n/**\n * Creates an alternating over-under plain weave with rounded threads and seeded fibers.\n * @param options - Thread geometry, shading, seed, and motion. See {@link FabricOptions}.\n * @returns A mountable recipe with no message commands. See {@link TextureRecipe}.\n * @see {@link FabricOptions}\n */\nexport function plainWeave(options: FabricOptions = {}): TextureRecipe {\n return plainWeaveRecipe(options);\n}\n/**\n * Creates a two-over, two-under diagonal twill fabric.\n * @param options - Thread geometry, shading, seed, and motion. See {@link FabricOptions}.\n * @returns A mountable recipe with no message commands. See {@link TextureRecipe}.\n * @see {@link FabricOptions}\n */\nexport function twill(options: FabricOptions = {}): TextureRecipe {\n return twillRecipe(options);\n}\n/**\n * Creates a reversing twill fabric with repeating herringbone chevrons.\n * @param options - Thread geometry, shading, seed, and motion. See {@link FabricOptions}.\n * @returns A mountable recipe with no message commands. See {@link TextureRecipe}.\n * @see {@link FabricOptions}\n */\nexport function herringbone(options: FabricOptions = {}): TextureRecipe {\n return herringboneRecipe(options);\n}\n\n/** Seeded seamless noise layers and their tonal response. @see {@link softNoise} */\nexport interface NoiseOptions extends PatternMotionOptions {\n /** Unsigned 32-bit noise seed; default 42. See {@link NoiseOptions}. */\n readonly seed?: number;\n /** Integer base lattice periods per axis, 1\u201316; default 4. See {@link NoiseOptions}. */\n readonly frequency?: number;\n /** Number of doubled-frequency layers, integer 1\u20136; default 4. See {@link NoiseOptions}. */\n readonly octaves?: number;\n /** Relative amplitude of each successive layer, 0\u20131; default 0.5. See {@link NoiseOptions}. */\n readonly persistence?: number;\n /** Tonal contrast about the midpoint, 0\u20134; default 1. See {@link NoiseOptions}. */\n readonly contrast?: number;\n}\nfunction noiseConfig(options: NoiseOptions) {\n return {\n ...motion(options),\n seed: validateSeed(options.seed),\n frequency: bounded(\"Noise frequency\", options.frequency ?? 4, 1, 16, true),\n octaves: bounded(\"Noise octaves\", options.octaves ?? 4, 1, 6, true),\n persistence: bounded(\"Noise persistence\", options.persistence ?? 0.5, 0, 1),\n contrast: bounded(\"Noise contrast\", options.contrast ?? 1, 0, 4),\n };\n}\nfunction layeredNoise(\n c: ReturnType<typeof noiseConfig>,\n u: number,\n v: number,\n ridge: boolean,\n) {\n let sum = 0,\n weight = 0,\n amplitude = 1,\n frequency = c.frequency;\n for (let i = 0; i < c.octaves; i++) {\n const sample = noise(\n u,\n v,\n frequency,\n frequency,\n c.seed ^ Math.imul(i, 0x517cc1b7),\n );\n sum += (ridge ? 1 - Math.abs(sample) : 0.5 + sample * 0.5) * amplitude;\n weight += amplitude;\n amplitude *= c.persistence;\n frequency *= 2;\n }\n return 0.5 + (sum / weight - 0.5) * c.contrast;\n}\nconst softNoiseRecipe = /* @__PURE__ */ pattern(noiseConfig, (c, u, v, phase) =>\n layeredNoise(c, u, wrap(v + phase), false),\n);\nconst ridgedNoiseRecipe = /* @__PURE__ */ pattern(\n noiseConfig,\n (c, u, v, phase) => layeredNoise(c, u, wrap(v + phase), true),\n);\n/**\n * Creates smooth seamless multiscale lattice noise for clouds, pigment, and material variation.\n * @param options - Seed, lattice frequencies, amplitudes, contrast, and motion. See {@link NoiseOptions}.\n * @returns A mountable recipe with no message commands. See {@link TextureRecipe}.\n * @see {@link NoiseOptions}\n */\nexport function softNoise(options: NoiseOptions = {}): TextureRecipe {\n return softNoiseRecipe(options);\n}\n/**\n * Creates seamless multiscale ridges by folding each noise layer around its midpoint.\n * @param options - Seed, lattice frequencies, amplitudes, contrast, and motion. See {@link NoiseOptions}.\n * @returns A mountable recipe with no message commands. See {@link TextureRecipe}.\n * @see {@link NoiseOptions}\n */\nexport function ridgedNoise(options: NoiseOptions = {}): TextureRecipe {\n return ridgedNoiseRecipe(options);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -221,7 +221,8 @@ const recipe = defineTexture({
|
|
|
221
221
|
const x = bounded(message.x, "nudge x", 1), y = bounded(message.y, "nudge y", 1);
|
|
222
222
|
const radius = bounded(message.radius ?? 0.12, "nudge radius", 2);
|
|
223
223
|
if (radius === 0) throw new RangeError("Rain nudge radius must be positive.");
|
|
224
|
-
|
|
224
|
+
if (!Number.isFinite(message.dx) || Math.abs(message.dx) > 1 || !Number.isFinite(message.dy) || Math.abs(message.dy) > 1)
|
|
225
|
+
throw new RangeError("Rain nudge movement must be finite and within [-1, 1].");
|
|
225
226
|
if (message.dx === 0 && message.dy === 0) return;
|
|
226
227
|
const side = Math.min(context.canvas.width, context.canvas.height);
|
|
227
228
|
const width = context.canvas.width / side, height = context.canvas.height / side;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/features/textures/lib/rain-drops.ts"],
|
|
4
|
-
"sourcesContent": ["import { defineTexture, type TextureContext, type TextureRecipe } from \"@pibbl/core\";\nimport { validateSeed } from \"./palette.js\";\n\n/**\n * Rain rate, gravity, initial drops, condensation, trail, and outline controls for a raindrop texture.\n *\n * @see {@link rainDrops}\n */\nexport interface RainDropsOptions {\n /**\n * Seed used for deterministic sampling or simulation initialization. See\n * {@link RainDropsOptions}.\n */\n readonly seed?: number;\n /** New beads per second, from 0 through 120. */\n readonly rainRate?: number;\n /** Downward acceleration multiplier, from 0 through 10. */\n readonly gravity?: number;\n /** Number of drops seeded before continuous rain starts. See {@link RainDropsOptions}. */\n readonly initialDrops?: number;\n /** Whether simulation or playback advancement is suspended. See {@link RainDropsOptions}. */\n readonly paused?: boolean;\n /** Fine droplet film coverage, from 0 (clear) through 1 (mist). */\n readonly condensation?: number;\n /** Seconds controlling trail drying and condensation recovery, from 0 through 60. */\n readonly trailPersistence?: number;\n /** Residual water left behind a moving drop, from 0 through 1. */\n readonly trailStrength?: number;\n /** Outline and path variation, from 0 (smooth) through 1. */\n readonly irregularity?: number;\n}\n\n/**\n * Pause, reset, finger-wipe, release, and localized nudge commands for a raindrop texture.\n *\n * @see {@link rainDrops}\n */\nexport type RainDropsMessage =\n | {\n /** The literal \"pause\" identifying this variant. See {@link RainDropsMessage}. */\n readonly type: \"pause\";\n /** Whether simulation or playback advancement is suspended. See {@link RainDropsMessage}. */\n readonly paused: boolean;\n }\n | {\n /** The literal \"reset\" identifying this variant. See {@link RainDropsMessage}. */\n readonly type: \"reset\";\n }\n /** Begin or move one finger contact; successive positions wipe a continuous path. */\n | {\n /** The literal \"finger\" identifying this variant. See {@link RainDropsMessage}. */\n readonly type: \"finger\";\n /**\n * Horizontal coordinate or displacement in the containing coordinate system. See\n * {@link RainDropsMessage}.\n */\n readonly x: number;\n /**\n * Vertical coordinate or displacement in the containing coordinate system. See\n * {@link RainDropsMessage}.\n */\n readonly y: number;\n /** Radius in the coordinate system of this geometry or effect. See {@link RainDropsMessage}. */\n readonly radius?: number;\n }\n | {\n /** The literal \"release\" identifying this variant. See {@link RainDropsMessage}. */\n readonly type: \"release\";\n }\n /** Center and movement use normalized width/height; radius uses the shorter side. */\n | {\n /** The literal \"nudge\" identifying this variant. See {@link RainDropsMessage}. */\n readonly type: \"nudge\";\n /**\n * Horizontal coordinate or displacement in the containing coordinate system. See\n * {@link RainDropsMessage}.\n */\n readonly x: number;\n /**\n * Vertical coordinate or displacement in the containing coordinate system. See\n * {@link RainDropsMessage}.\n */\n readonly y: number;\n /** Horizontal displacement applied by the interaction. See {@link RainDropsMessage}. */\n readonly dx: number;\n /** Vertical displacement applied by the interaction. See {@link RainDropsMessage}. */\n readonly dy: number;\n /** Radius in the coordinate system of this geometry or effect. See {@link RainDropsMessage}. */\n readonly radius?: number;\n };\n\ninterface Drop { x: number; y: number; radius: number; vx: number; vy: number; phase: number }\ninterface Config { seed: number; rainRate: number; gravity: number; initialDrops: number; paused: boolean; condensation: number; trailPersistence: number; trailStrength: number; irregularity: number }\ninterface State {\n finger?: { x: number; y: number; radius: number; drop?: Drop };\n config: Config;\n drops: Drop[];\n random: number;\n births: number;\n paused: boolean;\n fresh: boolean;\n image: ImageData;\n film: Float32Array;\n trails: Float32Array;\n surface: Float32Array;\n grain: Float32Array;\n fieldActive: boolean;\n}\nconst MAX_DROPS = 256;\n\nfunction bounded(value: number, name: string, maximum: number): number {\n if (!Number.isFinite(value) || value < 0 || value > maximum) throw new RangeError(`Rain ${name} must be finite and within [0, ${maximum}].`);\n return value;\n}\nfunction options(input: RainDropsOptions): Config {\n const initialDrops = bounded(input.initialDrops ?? 100, \"initialDrops\", MAX_DROPS);\n if (!Number.isInteger(initialDrops)) throw new RangeError(\"Rain initialDrops must be an integer.\");\n return { seed: validateSeed(input.seed ?? 7), rainRate: bounded(input.rainRate ?? 24, \"rainRate\", 120), gravity: bounded(input.gravity ?? 1, \"gravity\", 10), initialDrops, paused: input.paused ?? false,\n condensation: bounded(input.condensation ?? 0, \"condensation\", 1),\n trailPersistence: bounded(input.trailPersistence ?? 8, \"trailPersistence\", 60),\n trailStrength: bounded(input.trailStrength ?? 0.65, \"trailStrength\", 1),\n irregularity: bounded(input.irregularity ?? 0.8, \"irregularity\", 1) };\n}\nfunction assertMap(context: TextureContext): void {\n if (context.palette !== undefined) throw new TypeError(\"rainDrops is a numeric displacement map and does not accept a palette.\");\n}\nfunction random(state: State): number {\n state.random = (Math.imul(state.random, 1664525) + 1013904223) >>> 0;\n return state.random / 4294967296;\n}\nfunction spawn(state: State, context: TextureContext): void {\n if (state.drops.length >= MAX_DROPS) return;\n const side = Math.min(context.canvas.width, context.canvas.height);\n state.drops.push({ x: random(state) * context.canvas.width / side, y: random(state) * context.canvas.height / side, radius: 0.005 + random(state) ** 2 * 0.015, vx: 0, vy: 0, phase: random(state) * Math.PI * 2 });\n}\nfunction reset(state: State, context: TextureContext): void {\n state.finger = undefined;\n state.random = state.config.seed; state.drops = []; state.births = 0; state.fresh = true;\n state.film.fill(1); state.trails.fill(0); state.fieldActive = false;\n for (let i = 0; i < state.grain.length; i++) {\n let value = Math.imul(i + 1, 0x45d9f3b) ^ state.config.seed;\n value = Math.imul(value ^ (value >>> 16), 0x45d9f3b);\n state.grain[i] = ((value ^ (value >>> 16)) >>> 0) / 4294967296;\n }\n for (let i = 0; i < state.config.initialDrops; i++) spawn(state, context);\n}\n/** Coalescence conserves volume and volume-weighted position/momentum. */\nfunction merge(drops: Drop[]): void {\n for (let i = 0; i < drops.length; i++) {\n const a = drops[i];\n for (let j = i + 1; j < drops.length; j++) {\n const b = drops[j];\n if (Math.hypot(a.x - b.x, a.y - b.y) >= a.radius + b.radius) continue;\n const av = a.radius ** 3, bv = b.radius ** 3, volume = av + bv;\n a.x = (a.x * av + b.x * bv) / volume; a.y = (a.y * av + b.y * bv) / volume;\n a.vx = (a.vx * av + b.vx * bv) / volume; a.vy = (a.vy * av + b.vy * bv) / volume;\n a.radius = Math.cbrt(volume);\n drops.splice(j--, 1);\n }\n }\n}\nfunction active(state: State): boolean {\n return state.fieldActive || state.config.rainRate > 0 || state.drops.some(d => (state.config.gravity > 0 && d.radius > 0.012) || Math.abs(d.vx) + Math.abs(d.vy) > 0.0001);\n}\nfunction schedule(state: State, context: TextureContext): void {\n if (!state.paused && active(state)) context.requestFrame();\n}\n\n/** Sweep the actual drop footprint, collecting film and leaving a beaded residual trail. */\nfunction sweep(state: State, drop: Drop, oldX: number, oldY: number, context: TextureContext): void {\n const { width, height } = context.canvas, side = Math.min(width, height);\n const ax = oldX * side, ay = oldY * side, bx = drop.x * side, by = drop.y * side;\n const dx = bx - ax, dy = by - ay, length2 = dx * dx + dy * dy;\n if (length2 < 0.000001) return;\n const radius = Math.max(1, drop.radius * side * 1.1);\n let collected = 0;\n for (let y = Math.max(0, Math.floor(Math.min(ay, by) - radius)); y < Math.min(height, Math.ceil(Math.max(ay, by) + radius)); y++) {\n for (let x = Math.max(0, Math.floor(Math.min(ax, bx) - radius)); x < Math.min(width, Math.ceil(Math.max(ax, bx) + radius)); x++) {\n const t = Math.max(0, Math.min(1, ((x + 0.5 - ax) * dx + (y + 0.5 - ay) * dy) / length2));\n const distance = Math.hypot(x + 0.5 - ax - t * dx, y + 0.5 - ay - t * dy) / radius;\n if (distance >= 1) continue;\n const i = y * width + x;\n const remaining = Math.max(0, Math.min(1, (distance - 0.7) / 0.3));\n const removed = Math.max(0, state.film[i] - remaining);\n collected += removed;\n state.film[i] = Math.min(state.film[i], remaining);\n // Spatially stable necks and beads avoid frame-rate-dependent trail stamping.\n const neck = 0.18 + 0.12 * Math.sin(y * 0.7 + drop.phase);\n const bead = Math.pow(state.grain[i], 7);\n const residual = Math.max(0, 1 - distance / (neck + bead * 0.6));\n state.trails[i] = Math.max(state.trails[i], residual * (0.00045 + bead * 0.0018) * state.config.trailStrength);\n }\n }\n // Film volume is swept area times a small effective thickness.\n drop.radius = Math.cbrt(drop.radius ** 3 + collected / (side * side) * state.config.condensation * 0.0002);\n state.fieldActive = true;\n}\n\n/** At capacity, coalesce the closest free beads before releasing newly gathered water. */\nfunction makeReleaseRoom(drops: Drop[]): void {\n if (drops.length < MAX_DROPS) return;\n let first = 0, second = 1, nearest = Infinity;\n for (let i = 0; i < drops.length; i++) for (let j = i + 1; j < drops.length; j++) {\n const distance = Math.hypot(drops[i].x - drops[j].x, drops[i].y - drops[j].y);\n if (distance < nearest) { nearest = distance; first = i; second = j; }\n }\n const a = drops[first], b = drops[second], av = a.radius ** 3, bv = b.radius ** 3, volume = av + bv;\n a.x = (a.x * av + b.x * bv) / volume; a.y = (a.y * av + b.y * bv) / volume;\n a.vx = (a.vx * av + b.vx * bv) / volume; a.vy = (a.vy * av + b.vy * bv) / volume;\n a.radius = Math.cbrt(volume); drops.splice(second, 1);\n}\n\n/** A finger removes film and residual water, and carries intersected beads without inertia. */\nfunction wipeFinger(state: State, oldX: number, oldY: number, context: TextureContext): void {\n const finger = state.finger;\n if (!finger) return;\n const { width, height } = context.canvas, side = Math.min(width, height);\n const dx = finger.x - oldX, dy = finger.y - oldY, length2 = dx * dx + dy * dy;\n const distance = (x: number, y: number): number => {\n const t = length2 === 0 ? 0 : Math.max(0, Math.min(1, ((x - oldX) * dx + (y - oldY) * dy) / length2));\n return Math.hypot(x - oldX - t * dx, y - oldY - t * dy);\n };\n let volume = finger.drop ? finger.drop.radius ** 3 : 0;\n for (let i = state.drops.length - 1; i >= 0; i--) {\n const drop = state.drops[i];\n if (distance(drop.x, drop.y) > finger.radius + drop.radius * 1.3) continue;\n volume += drop.radius ** 3;\n state.drops.splice(i, 1);\n }\n for (let y = Math.max(0, Math.floor((Math.min(oldY, finger.y) - finger.radius) * side)); y < Math.min(height, Math.ceil((Math.max(oldY, finger.y) + finger.radius) * side)); y++) {\n for (let x = Math.max(0, Math.floor((Math.min(oldX, finger.x) - finger.radius) * side)); x < Math.min(width, Math.ceil((Math.max(oldX, finger.x) + finger.radius) * side)); x++) {\n const coverage = Math.max(0, Math.min(1, (1 - distance((x + 0.5) / side, (y + 0.5) / side) / finger.radius) / 0.15));\n if (coverage === 0) continue;\n const i = y * width + x, remaining = 1 - coverage;\n const removedFilm = Math.max(0, state.film[i] - remaining);\n const removedTrail = state.trails[i] * coverage;\n volume += (removedFilm * state.config.condensation * 0.0002 + removedTrail) / (side * side);\n state.film[i] = Math.min(state.film[i], remaining);\n state.trails[i] -= removedTrail;\n }\n }\n if (volume > 0) {\n finger.drop ??= { x: finger.x, y: finger.y, radius: 0, vx: 0, vy: 0, phase: 0 };\n finger.drop.x = finger.x; finger.drop.y = finger.y; finger.drop.radius = Math.cbrt(volume);\n }\n state.fieldActive = true;\n}\n\nfunction recoverFilm(state: State, elapsed: number): void {\n if (!state.fieldActive) return;\n const retention = state.config.trailPersistence === 0 ? 0 : Math.exp(-elapsed / state.config.trailPersistence);\n let active = false;\n for (let i = 0; i < state.film.length; i++) {\n const missing = (1 - state.film[i]) * retention;\n state.film[i] = missing < 0.002 ? 1 : 1 - missing;\n const trail = state.trails[i] * retention;\n state.trails[i] = trail < 0.000005 ? 0 : trail;\n active ||= state.film[i] < 1 || state.trails[i] > 0;\n }\n state.fieldActive = active;\n}\n\nconst recipe = defineTexture<RainDropsOptions, State, RainDropsMessage>({\n create(context, input) {\n assertMap(context);\n const config = options(input);\n const cells = context.canvas.width * context.canvas.height;\n const state: State = { film: new Float32Array(cells), trails: new Float32Array(cells), surface: new Float32Array(cells), grain: new Float32Array(cells), fieldActive: false, config, drops: [], random: config.seed, births: 0, paused: config.paused, fresh: true, image: context.canvas.getContext(\"2d\")!.createImageData(context.canvas.width, context.canvas.height) };\n reset(state, context); schedule(state, context); return state;\n },\n update(state, input, context) {\n assertMap(context);\n const next = options(input), previous = state.config;\n state.config = next;\n if (next.condensation !== previous.condensation || next.irregularity !== previous.irregularity || next.trailStrength !== previous.trailStrength) context.invalidate();\n if (next.paused !== previous.paused) { state.paused = next.paused; state.fresh = true; }\n if (next.rainRate !== previous.rainRate || next.gravity !== previous.gravity) state.fresh = true;\n if (next.seed !== previous.seed || next.initialDrops !== previous.initialDrops) { reset(state, context); context.invalidate(); }\n schedule(state, context);\n },\n receive(state, message, context) {\n if (message.type === \"pause\") { state.paused = message.paused; state.fresh = true; }\n else if (message.type === \"reset\") { reset(state, context); context.invalidate(); }\n else if (message.type === \"finger\") {\n const x = bounded(message.x, \"finger x\", 1), y = bounded(message.y, \"finger y\", 1);\n const radius = bounded(message.radius ?? 0.045, \"finger radius\", 2);\n if (radius === 0) throw new RangeError(\"Rain finger radius must be positive.\");\n const side = Math.min(context.canvas.width, context.canvas.height);\n const nextX = x * context.canvas.width / side, nextY = y * context.canvas.height / side;\n const oldX = state.finger?.x ?? nextX, oldY = state.finger?.y ?? nextY;\n state.finger ??= { x: nextX, y: nextY, radius };\n state.finger.x = nextX; state.finger.y = nextY; state.finger.radius = radius;\n wipeFinger(state, oldX, oldY, context); context.invalidate();\n }\n else if (message.type === \"release\") {\n if (state.finger?.drop) { makeReleaseRoom(state.drops); state.drops.push(state.finger.drop); }\n state.finger = undefined; context.invalidate();\n }\n else if (message.type === \"nudge\") {\n const x = bounded(message.x, \"nudge x\", 1), y = bounded(message.y, \"nudge y\", 1);\n const radius = bounded(message.radius ?? 0.12, \"nudge radius\", 2);\n if (radius === 0) throw new RangeError(\"Rain nudge radius must be positive.\");\n for (const delta of [message.dx, message.dy]) if (!Number.isFinite(delta) || Math.abs(delta) > 1) throw new RangeError(\"Rain nudge movement must be finite and within [-1, 1].\");\n if (message.dx === 0 && message.dy === 0) return;\n const side = Math.min(context.canvas.width, context.canvas.height);\n const width = context.canvas.width / side, height = context.canvas.height / side;\n for (const drop of state.drops) {\n const distance = Math.hypot(drop.x - x * width, drop.y - y * height);\n const weight = Math.max(0, 1 - distance / radius) ** 2;\n const oldX = drop.x, oldY = drop.y;\n drop.x = Math.max(0, Math.min(width, drop.x + message.dx * width * weight));\n drop.y = Math.max(0, Math.min(height, drop.y + message.dy * height * weight));\n sweep(state, drop, oldX, oldY, context);\n drop.vx += message.dx * width * weight * 3; drop.vy += message.dy * height * weight * 3;\n }\n merge(state.drops); context.invalidate();\n } else throw new TypeError(\"Unknown rain drop message.\");\n schedule(state, context);\n },\n advance(state, frame, context) {\n if (state.paused) return;\n if (state.fresh) state.fresh = false;\n else {\n // Bounded substeps prevent tab suspension from creating a rainfall burst.\n const elapsed = Math.min(frame.delta / 1000, 0.05);\n recoverFilm(state, elapsed);\n const steps = Math.max(1, Math.ceil(elapsed * 120)), dt = elapsed / steps;\n const side = Math.min(context.canvas.width, context.canvas.height);\n for (let step = 0; step < steps; step++) {\n state.births += state.config.rainRate * dt;\n while (state.births >= 1) { spawn(state, context); state.births--; }\n for (const drop of state.drops) {\n const slide = Math.max(0, drop.radius / 0.012 - 1);\n const oldX = drop.x, oldY = drop.y;\n drop.vx += Math.sin(drop.y * 85 + drop.phase) * slide * state.config.gravity * state.config.irregularity * 0.09 * dt;\n drop.vy += state.config.gravity * slide * 0.3 * dt;\n drop.vx *= Math.exp(-7 * dt); drop.vy *= Math.exp(-3 * dt);\n if (Math.abs(drop.vx) < 0.00005) drop.vx = 0;\n if (Math.abs(drop.vy) < 0.00005) drop.vy = 0;\n drop.x += drop.vx * dt; drop.y += drop.vy * dt;\n sweep(state, drop, oldX, oldY, context);\n }\n merge(state.drops);\n state.drops = state.drops.filter(d => d.y - d.radius < context.canvas.height / side && d.y + d.radius > 0 && d.x + d.radius > 0 && d.x - d.radius < context.canvas.width / side);\n }\n if (state.finger) wipeFinger(state, state.finger.x, state.finger.y, context);\n context.invalidate();\n }\n schedule(state, context);\n },\n rasterize(state, context) {\n const { width, height } = context.canvas, side = Math.min(width, height);\n const data = state.image.data, surface = state.surface;\n for (let i = 0; i < surface.length; i++) {\n surface[i] = state.trails[i] + state.grain[i] * 0.00018 * state.config.condensation * state.film[i];\n }\n const visibleDrops = state.finger?.drop ? [...state.drops, state.finger.drop] : state.drops;\n for (const drop of visibleDrops) {\n const stretch = 1 + Math.min(1.3, Math.abs(drop.vy) * 3);\n const rx = drop.radius * side / Math.sqrt(stretch), ry = drop.radius * side * stretch;\n const cx = drop.x * side, cy = drop.y * side;\n const extent = 1.3;\n for (let y = Math.max(0, Math.floor(cy - ry * extent)); y < Math.min(height, Math.ceil(cy + ry * extent)); y++) {\n for (let x = Math.max(0, Math.floor(cx - rx * extent)); x < Math.min(width, Math.ceil(cx + rx * extent)); x++) {\n const ny = (y + 0.5 - cy) / ry;\n const nx = (x + 0.5 - cx) / rx - state.config.irregularity * 0.09 * Math.sin(ny * 3 + drop.phase);\n const angle = Math.atan2(ny, nx);\n const edge = 1 + state.config.irregularity * (0.12 * Math.sin(angle * 3 + drop.phase) + 0.07 * Math.sin(angle * 5 - drop.phase));\n const r2 = (nx * nx + ny * ny) / (edge * edge);\n if (r2 >= 1) continue;\n const i = y * width + x;\n surface[i] = Math.max(surface[i], drop.radius * Math.sqrt(1 - r2));\n }\n }\n }\n for (let y = 0; y < height; y++) for (let x = 0; x < width; x++) {\n const i = y * width + x, index = i * 4;\n const dx = (surface[y * width + Math.min(width - 1, x + 1)] - surface[y * width + Math.max(0, x - 1)]) * side * 0.5;\n const dy = (surface[Math.min(height - 1, y + 1) * width + x] - surface[Math.max(0, y - 1) * width + x]) * side * 0.5;\n data[index] = Math.round(128 + Math.max(-1, Math.min(1, dx)) * 110);\n data[index + 1] = Math.round(128 + Math.max(-1, Math.min(1, dy)) * 110);\n const droplet = Math.min(1, Math.max(0, (surface[i] - 0.001) * 1500));\n data[index + 2] = Math.round(255 * state.config.condensation * state.film[i] * (0.8 + state.grain[i] * 0.2) * (1 - droplet));\n data[index + 3] = state.config.condensation > 0 ? 255 : Math.round(Math.min(1, surface[i] * side * 2) * 255);\n }\n context.canvas.getContext(\"2d\")!.putImageData(state.image, 0, 0);\n },\n});\n\n/**\n * A seeded rain-on-glass displacement map, advanced by Pibbl's scheduler.\n *\n * @param options - Raindrop simulation and appearance settings. See {@link RainDropsOptions}.\n * @returns A raindrop texture recipe accepting raindrop messages. See {@link TextureRecipe} ,\n * {@link RainDropsMessage} .\n *\n * @see {@link RainDropsOptions}\n * @see {@link TextureRecipe}\n * @see {@link RainDropsMessage}\n */\nexport function rainDrops(options: RainDropsOptions = {}): TextureRecipe<RainDropsMessage> { return recipe(options); }\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { defineTexture, type TextureContext, type TextureRecipe } from \"@pibbl/core\";\nimport { validateSeed } from \"./palette.js\";\n\n/**\n * Rain rate, gravity, initial drops, condensation, trail, and outline controls for a raindrop texture.\n *\n * @see {@link rainDrops}\n */\nexport interface RainDropsOptions {\n /**\n * Seed used for deterministic sampling or simulation initialization. See\n * {@link RainDropsOptions}.\n */\n readonly seed?: number;\n /** New beads per second, from 0 through 120. */\n readonly rainRate?: number;\n /** Downward acceleration multiplier, from 0 through 10. */\n readonly gravity?: number;\n /** Number of drops seeded before continuous rain starts. See {@link RainDropsOptions}. */\n readonly initialDrops?: number;\n /** Whether simulation or playback advancement is suspended. See {@link RainDropsOptions}. */\n readonly paused?: boolean;\n /** Fine droplet film coverage, from 0 (clear) through 1 (mist). */\n readonly condensation?: number;\n /** Seconds controlling trail drying and condensation recovery, from 0 through 60. */\n readonly trailPersistence?: number;\n /** Residual water left behind a moving drop, from 0 through 1. */\n readonly trailStrength?: number;\n /** Outline and path variation, from 0 (smooth) through 1. */\n readonly irregularity?: number;\n}\n\n/**\n * Pause, reset, finger-wipe, release, and localized nudge commands for a raindrop texture.\n *\n * @see {@link rainDrops}\n */\nexport type RainDropsMessage =\n | {\n /** The literal \"pause\" identifying this variant. See {@link RainDropsMessage}. */\n readonly type: \"pause\";\n /** Whether simulation or playback advancement is suspended. See {@link RainDropsMessage}. */\n readonly paused: boolean;\n }\n | {\n /** The literal \"reset\" identifying this variant. See {@link RainDropsMessage}. */\n readonly type: \"reset\";\n }\n /** Begin or move one finger contact; successive positions wipe a continuous path. */\n | {\n /** The literal \"finger\" identifying this variant. See {@link RainDropsMessage}. */\n readonly type: \"finger\";\n /**\n * Horizontal coordinate or displacement in the containing coordinate system. See\n * {@link RainDropsMessage}.\n */\n readonly x: number;\n /**\n * Vertical coordinate or displacement in the containing coordinate system. See\n * {@link RainDropsMessage}.\n */\n readonly y: number;\n /** Radius in the coordinate system of this geometry or effect. See {@link RainDropsMessage}. */\n readonly radius?: number;\n }\n | {\n /** The literal \"release\" identifying this variant. See {@link RainDropsMessage}. */\n readonly type: \"release\";\n }\n /** Center and movement use normalized width/height; radius uses the shorter side. */\n | {\n /** The literal \"nudge\" identifying this variant. See {@link RainDropsMessage}. */\n readonly type: \"nudge\";\n /**\n * Horizontal coordinate or displacement in the containing coordinate system. See\n * {@link RainDropsMessage}.\n */\n readonly x: number;\n /**\n * Vertical coordinate or displacement in the containing coordinate system. See\n * {@link RainDropsMessage}.\n */\n readonly y: number;\n /** Horizontal displacement applied by the interaction. See {@link RainDropsMessage}. */\n readonly dx: number;\n /** Vertical displacement applied by the interaction. See {@link RainDropsMessage}. */\n readonly dy: number;\n /** Radius in the coordinate system of this geometry or effect. See {@link RainDropsMessage}. */\n readonly radius?: number;\n };\n\ninterface Drop { x: number; y: number; radius: number; vx: number; vy: number; phase: number }\ninterface Config { seed: number; rainRate: number; gravity: number; initialDrops: number; paused: boolean; condensation: number; trailPersistence: number; trailStrength: number; irregularity: number }\ninterface State {\n finger?: { x: number; y: number; radius: number; drop?: Drop };\n config: Config;\n drops: Drop[];\n random: number;\n births: number;\n paused: boolean;\n fresh: boolean;\n image: ImageData;\n film: Float32Array;\n trails: Float32Array;\n surface: Float32Array;\n grain: Float32Array;\n fieldActive: boolean;\n}\nconst MAX_DROPS = 256;\n\nfunction bounded(value: number, name: string, maximum: number): number {\n if (!Number.isFinite(value) || value < 0 || value > maximum) throw new RangeError(`Rain ${name} must be finite and within [0, ${maximum}].`);\n return value;\n}\nfunction options(input: RainDropsOptions): Config {\n const initialDrops = bounded(input.initialDrops ?? 100, \"initialDrops\", MAX_DROPS);\n if (!Number.isInteger(initialDrops)) throw new RangeError(\"Rain initialDrops must be an integer.\");\n return { seed: validateSeed(input.seed ?? 7), rainRate: bounded(input.rainRate ?? 24, \"rainRate\", 120), gravity: bounded(input.gravity ?? 1, \"gravity\", 10), initialDrops, paused: input.paused ?? false,\n condensation: bounded(input.condensation ?? 0, \"condensation\", 1),\n trailPersistence: bounded(input.trailPersistence ?? 8, \"trailPersistence\", 60),\n trailStrength: bounded(input.trailStrength ?? 0.65, \"trailStrength\", 1),\n irregularity: bounded(input.irregularity ?? 0.8, \"irregularity\", 1) };\n}\nfunction assertMap(context: TextureContext): void {\n if (context.palette !== undefined) throw new TypeError(\"rainDrops is a numeric displacement map and does not accept a palette.\");\n}\nfunction random(state: State): number {\n state.random = (Math.imul(state.random, 1664525) + 1013904223) >>> 0;\n return state.random / 4294967296;\n}\nfunction spawn(state: State, context: TextureContext): void {\n if (state.drops.length >= MAX_DROPS) return;\n const side = Math.min(context.canvas.width, context.canvas.height);\n state.drops.push({ x: random(state) * context.canvas.width / side, y: random(state) * context.canvas.height / side, radius: 0.005 + random(state) ** 2 * 0.015, vx: 0, vy: 0, phase: random(state) * Math.PI * 2 });\n}\nfunction reset(state: State, context: TextureContext): void {\n state.finger = undefined;\n state.random = state.config.seed; state.drops = []; state.births = 0; state.fresh = true;\n state.film.fill(1); state.trails.fill(0); state.fieldActive = false;\n for (let i = 0; i < state.grain.length; i++) {\n let value = Math.imul(i + 1, 0x45d9f3b) ^ state.config.seed;\n value = Math.imul(value ^ (value >>> 16), 0x45d9f3b);\n state.grain[i] = ((value ^ (value >>> 16)) >>> 0) / 4294967296;\n }\n for (let i = 0; i < state.config.initialDrops; i++) spawn(state, context);\n}\n/** Coalescence conserves volume and volume-weighted position/momentum. */\nfunction merge(drops: Drop[]): void {\n for (let i = 0; i < drops.length; i++) {\n const a = drops[i];\n for (let j = i + 1; j < drops.length; j++) {\n const b = drops[j];\n if (Math.hypot(a.x - b.x, a.y - b.y) >= a.radius + b.radius) continue;\n const av = a.radius ** 3, bv = b.radius ** 3, volume = av + bv;\n a.x = (a.x * av + b.x * bv) / volume; a.y = (a.y * av + b.y * bv) / volume;\n a.vx = (a.vx * av + b.vx * bv) / volume; a.vy = (a.vy * av + b.vy * bv) / volume;\n a.radius = Math.cbrt(volume);\n drops.splice(j--, 1);\n }\n }\n}\nfunction active(state: State): boolean {\n return state.fieldActive || state.config.rainRate > 0 || state.drops.some(d => (state.config.gravity > 0 && d.radius > 0.012) || Math.abs(d.vx) + Math.abs(d.vy) > 0.0001);\n}\nfunction schedule(state: State, context: TextureContext): void {\n if (!state.paused && active(state)) context.requestFrame();\n}\n\n/** Sweep the actual drop footprint, collecting film and leaving a beaded residual trail. */\nfunction sweep(state: State, drop: Drop, oldX: number, oldY: number, context: TextureContext): void {\n const { width, height } = context.canvas, side = Math.min(width, height);\n const ax = oldX * side, ay = oldY * side, bx = drop.x * side, by = drop.y * side;\n const dx = bx - ax, dy = by - ay, length2 = dx * dx + dy * dy;\n if (length2 < 0.000001) return;\n const radius = Math.max(1, drop.radius * side * 1.1);\n let collected = 0;\n for (let y = Math.max(0, Math.floor(Math.min(ay, by) - radius)); y < Math.min(height, Math.ceil(Math.max(ay, by) + radius)); y++) {\n for (let x = Math.max(0, Math.floor(Math.min(ax, bx) - radius)); x < Math.min(width, Math.ceil(Math.max(ax, bx) + radius)); x++) {\n const t = Math.max(0, Math.min(1, ((x + 0.5 - ax) * dx + (y + 0.5 - ay) * dy) / length2));\n const distance = Math.hypot(x + 0.5 - ax - t * dx, y + 0.5 - ay - t * dy) / radius;\n if (distance >= 1) continue;\n const i = y * width + x;\n const remaining = Math.max(0, Math.min(1, (distance - 0.7) / 0.3));\n const removed = Math.max(0, state.film[i] - remaining);\n collected += removed;\n state.film[i] = Math.min(state.film[i], remaining);\n // Spatially stable necks and beads avoid frame-rate-dependent trail stamping.\n const neck = 0.18 + 0.12 * Math.sin(y * 0.7 + drop.phase);\n const bead = Math.pow(state.grain[i], 7);\n const residual = Math.max(0, 1 - distance / (neck + bead * 0.6));\n state.trails[i] = Math.max(state.trails[i], residual * (0.00045 + bead * 0.0018) * state.config.trailStrength);\n }\n }\n // Film volume is swept area times a small effective thickness.\n drop.radius = Math.cbrt(drop.radius ** 3 + collected / (side * side) * state.config.condensation * 0.0002);\n state.fieldActive = true;\n}\n\n/** At capacity, coalesce the closest free beads before releasing newly gathered water. */\nfunction makeReleaseRoom(drops: Drop[]): void {\n if (drops.length < MAX_DROPS) return;\n let first = 0, second = 1, nearest = Infinity;\n for (let i = 0; i < drops.length; i++) for (let j = i + 1; j < drops.length; j++) {\n const distance = Math.hypot(drops[i].x - drops[j].x, drops[i].y - drops[j].y);\n if (distance < nearest) { nearest = distance; first = i; second = j; }\n }\n const a = drops[first], b = drops[second], av = a.radius ** 3, bv = b.radius ** 3, volume = av + bv;\n a.x = (a.x * av + b.x * bv) / volume; a.y = (a.y * av + b.y * bv) / volume;\n a.vx = (a.vx * av + b.vx * bv) / volume; a.vy = (a.vy * av + b.vy * bv) / volume;\n a.radius = Math.cbrt(volume); drops.splice(second, 1);\n}\n\n/** A finger removes film and residual water, and carries intersected beads without inertia. */\nfunction wipeFinger(state: State, oldX: number, oldY: number, context: TextureContext): void {\n const finger = state.finger;\n if (!finger) return;\n const { width, height } = context.canvas, side = Math.min(width, height);\n const dx = finger.x - oldX, dy = finger.y - oldY, length2 = dx * dx + dy * dy;\n const distance = (x: number, y: number): number => {\n const t = length2 === 0 ? 0 : Math.max(0, Math.min(1, ((x - oldX) * dx + (y - oldY) * dy) / length2));\n return Math.hypot(x - oldX - t * dx, y - oldY - t * dy);\n };\n let volume = finger.drop ? finger.drop.radius ** 3 : 0;\n for (let i = state.drops.length - 1; i >= 0; i--) {\n const drop = state.drops[i];\n if (distance(drop.x, drop.y) > finger.radius + drop.radius * 1.3) continue;\n volume += drop.radius ** 3;\n state.drops.splice(i, 1);\n }\n for (let y = Math.max(0, Math.floor((Math.min(oldY, finger.y) - finger.radius) * side)); y < Math.min(height, Math.ceil((Math.max(oldY, finger.y) + finger.radius) * side)); y++) {\n for (let x = Math.max(0, Math.floor((Math.min(oldX, finger.x) - finger.radius) * side)); x < Math.min(width, Math.ceil((Math.max(oldX, finger.x) + finger.radius) * side)); x++) {\n const coverage = Math.max(0, Math.min(1, (1 - distance((x + 0.5) / side, (y + 0.5) / side) / finger.radius) / 0.15));\n if (coverage === 0) continue;\n const i = y * width + x, remaining = 1 - coverage;\n const removedFilm = Math.max(0, state.film[i] - remaining);\n const removedTrail = state.trails[i] * coverage;\n volume += (removedFilm * state.config.condensation * 0.0002 + removedTrail) / (side * side);\n state.film[i] = Math.min(state.film[i], remaining);\n state.trails[i] -= removedTrail;\n }\n }\n if (volume > 0) {\n finger.drop ??= { x: finger.x, y: finger.y, radius: 0, vx: 0, vy: 0, phase: 0 };\n finger.drop.x = finger.x; finger.drop.y = finger.y; finger.drop.radius = Math.cbrt(volume);\n }\n state.fieldActive = true;\n}\n\nfunction recoverFilm(state: State, elapsed: number): void {\n if (!state.fieldActive) return;\n const retention = state.config.trailPersistence === 0 ? 0 : Math.exp(-elapsed / state.config.trailPersistence);\n let active = false;\n for (let i = 0; i < state.film.length; i++) {\n const missing = (1 - state.film[i]) * retention;\n state.film[i] = missing < 0.002 ? 1 : 1 - missing;\n const trail = state.trails[i] * retention;\n state.trails[i] = trail < 0.000005 ? 0 : trail;\n active ||= state.film[i] < 1 || state.trails[i] > 0;\n }\n state.fieldActive = active;\n}\n\nconst recipe = defineTexture<RainDropsOptions, State, RainDropsMessage>({\n create(context, input) {\n assertMap(context);\n const config = options(input);\n const cells = context.canvas.width * context.canvas.height;\n const state: State = { film: new Float32Array(cells), trails: new Float32Array(cells), surface: new Float32Array(cells), grain: new Float32Array(cells), fieldActive: false, config, drops: [], random: config.seed, births: 0, paused: config.paused, fresh: true, image: context.canvas.getContext(\"2d\")!.createImageData(context.canvas.width, context.canvas.height) };\n reset(state, context); schedule(state, context); return state;\n },\n update(state, input, context) {\n assertMap(context);\n const next = options(input), previous = state.config;\n state.config = next;\n if (next.condensation !== previous.condensation || next.irregularity !== previous.irregularity || next.trailStrength !== previous.trailStrength) context.invalidate();\n if (next.paused !== previous.paused) { state.paused = next.paused; state.fresh = true; }\n if (next.rainRate !== previous.rainRate || next.gravity !== previous.gravity) state.fresh = true;\n if (next.seed !== previous.seed || next.initialDrops !== previous.initialDrops) { reset(state, context); context.invalidate(); }\n schedule(state, context);\n },\n receive(state, message, context) {\n if (message.type === \"pause\") { state.paused = message.paused; state.fresh = true; }\n else if (message.type === \"reset\") { reset(state, context); context.invalidate(); }\n else if (message.type === \"finger\") {\n const x = bounded(message.x, \"finger x\", 1), y = bounded(message.y, \"finger y\", 1);\n const radius = bounded(message.radius ?? 0.045, \"finger radius\", 2);\n if (radius === 0) throw new RangeError(\"Rain finger radius must be positive.\");\n const side = Math.min(context.canvas.width, context.canvas.height);\n const nextX = x * context.canvas.width / side, nextY = y * context.canvas.height / side;\n const oldX = state.finger?.x ?? nextX, oldY = state.finger?.y ?? nextY;\n state.finger ??= { x: nextX, y: nextY, radius };\n state.finger.x = nextX; state.finger.y = nextY; state.finger.radius = radius;\n wipeFinger(state, oldX, oldY, context); context.invalidate();\n }\n else if (message.type === \"release\") {\n if (state.finger?.drop) { makeReleaseRoom(state.drops); state.drops.push(state.finger.drop); }\n state.finger = undefined; context.invalidate();\n }\n else if (message.type === \"nudge\") {\n const x = bounded(message.x, \"nudge x\", 1), y = bounded(message.y, \"nudge y\", 1);\n const radius = bounded(message.radius ?? 0.12, \"nudge radius\", 2);\n if (radius === 0) throw new RangeError(\"Rain nudge radius must be positive.\");\n if (\n !Number.isFinite(message.dx) ||\n Math.abs(message.dx) > 1 ||\n !Number.isFinite(message.dy) ||\n Math.abs(message.dy) > 1\n )\n throw new RangeError(\"Rain nudge movement must be finite and within [-1, 1].\");\n if (message.dx === 0 && message.dy === 0) return;\n const side = Math.min(context.canvas.width, context.canvas.height);\n const width = context.canvas.width / side, height = context.canvas.height / side;\n for (const drop of state.drops) {\n const distance = Math.hypot(drop.x - x * width, drop.y - y * height);\n const weight = Math.max(0, 1 - distance / radius) ** 2;\n const oldX = drop.x, oldY = drop.y;\n drop.x = Math.max(0, Math.min(width, drop.x + message.dx * width * weight));\n drop.y = Math.max(0, Math.min(height, drop.y + message.dy * height * weight));\n sweep(state, drop, oldX, oldY, context);\n drop.vx += message.dx * width * weight * 3; drop.vy += message.dy * height * weight * 3;\n }\n merge(state.drops); context.invalidate();\n } else throw new TypeError(\"Unknown rain drop message.\");\n schedule(state, context);\n },\n advance(state, frame, context) {\n if (state.paused) return;\n if (state.fresh) state.fresh = false;\n else {\n // Bounded substeps prevent tab suspension from creating a rainfall burst.\n const elapsed = Math.min(frame.delta / 1000, 0.05);\n recoverFilm(state, elapsed);\n const steps = Math.max(1, Math.ceil(elapsed * 120)), dt = elapsed / steps;\n const side = Math.min(context.canvas.width, context.canvas.height);\n for (let step = 0; step < steps; step++) {\n state.births += state.config.rainRate * dt;\n while (state.births >= 1) { spawn(state, context); state.births--; }\n for (const drop of state.drops) {\n const slide = Math.max(0, drop.radius / 0.012 - 1);\n const oldX = drop.x, oldY = drop.y;\n drop.vx += Math.sin(drop.y * 85 + drop.phase) * slide * state.config.gravity * state.config.irregularity * 0.09 * dt;\n drop.vy += state.config.gravity * slide * 0.3 * dt;\n drop.vx *= Math.exp(-7 * dt); drop.vy *= Math.exp(-3 * dt);\n if (Math.abs(drop.vx) < 0.00005) drop.vx = 0;\n if (Math.abs(drop.vy) < 0.00005) drop.vy = 0;\n drop.x += drop.vx * dt; drop.y += drop.vy * dt;\n sweep(state, drop, oldX, oldY, context);\n }\n merge(state.drops);\n state.drops = state.drops.filter(d => d.y - d.radius < context.canvas.height / side && d.y + d.radius > 0 && d.x + d.radius > 0 && d.x - d.radius < context.canvas.width / side);\n }\n if (state.finger) wipeFinger(state, state.finger.x, state.finger.y, context);\n context.invalidate();\n }\n schedule(state, context);\n },\n rasterize(state, context) {\n const { width, height } = context.canvas, side = Math.min(width, height);\n const data = state.image.data, surface = state.surface;\n for (let i = 0; i < surface.length; i++) {\n surface[i] = state.trails[i] + state.grain[i] * 0.00018 * state.config.condensation * state.film[i];\n }\n const visibleDrops = state.finger?.drop ? [...state.drops, state.finger.drop] : state.drops;\n for (const drop of visibleDrops) {\n const stretch = 1 + Math.min(1.3, Math.abs(drop.vy) * 3);\n const rx = drop.radius * side / Math.sqrt(stretch), ry = drop.radius * side * stretch;\n const cx = drop.x * side, cy = drop.y * side;\n const extent = 1.3;\n for (let y = Math.max(0, Math.floor(cy - ry * extent)); y < Math.min(height, Math.ceil(cy + ry * extent)); y++) {\n for (let x = Math.max(0, Math.floor(cx - rx * extent)); x < Math.min(width, Math.ceil(cx + rx * extent)); x++) {\n const ny = (y + 0.5 - cy) / ry;\n const nx = (x + 0.5 - cx) / rx - state.config.irregularity * 0.09 * Math.sin(ny * 3 + drop.phase);\n const angle = Math.atan2(ny, nx);\n const edge = 1 + state.config.irregularity * (0.12 * Math.sin(angle * 3 + drop.phase) + 0.07 * Math.sin(angle * 5 - drop.phase));\n const r2 = (nx * nx + ny * ny) / (edge * edge);\n if (r2 >= 1) continue;\n const i = y * width + x;\n surface[i] = Math.max(surface[i], drop.radius * Math.sqrt(1 - r2));\n }\n }\n }\n for (let y = 0; y < height; y++) for (let x = 0; x < width; x++) {\n const i = y * width + x, index = i * 4;\n const dx = (surface[y * width + Math.min(width - 1, x + 1)] - surface[y * width + Math.max(0, x - 1)]) * side * 0.5;\n const dy = (surface[Math.min(height - 1, y + 1) * width + x] - surface[Math.max(0, y - 1) * width + x]) * side * 0.5;\n data[index] = Math.round(128 + Math.max(-1, Math.min(1, dx)) * 110);\n data[index + 1] = Math.round(128 + Math.max(-1, Math.min(1, dy)) * 110);\n const droplet = Math.min(1, Math.max(0, (surface[i] - 0.001) * 1500));\n data[index + 2] = Math.round(255 * state.config.condensation * state.film[i] * (0.8 + state.grain[i] * 0.2) * (1 - droplet));\n data[index + 3] = state.config.condensation > 0 ? 255 : Math.round(Math.min(1, surface[i] * side * 2) * 255);\n }\n context.canvas.getContext(\"2d\")!.putImageData(state.image, 0, 0);\n },\n});\n\n/**\n * A seeded rain-on-glass displacement map, advanced by Pibbl's scheduler.\n *\n * @param options - Raindrop simulation and appearance settings. See {@link RainDropsOptions}.\n * @returns A raindrop texture recipe accepting raindrop messages. See {@link TextureRecipe} ,\n * {@link RainDropsMessage} .\n *\n * @see {@link RainDropsOptions}\n * @see {@link TextureRecipe}\n * @see {@link RainDropsMessage}\n */\nexport function rainDrops(options: RainDropsOptions = {}): TextureRecipe<RainDropsMessage> { return recipe(options); }\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["active", "options"]
|
|
7
7
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type ReactionDiffusionOptions, type ReactionDiffusionPreset } from "./gray-scott.js";
|
|
1
2
|
import { type TextureRenderer } from "./presentation.js";
|
|
2
3
|
import { type TexturePalette, type TextureResolution } from "./palette.js";
|
|
3
4
|
/**
|
|
@@ -20,7 +21,7 @@ export interface TextureBrush {
|
|
|
20
21
|
* @see {@link TextureBrush}
|
|
21
22
|
* @see {@link ReactionDiffusion}
|
|
22
23
|
*/
|
|
23
|
-
export interface ReactionDiffusionProps {
|
|
24
|
+
export interface ReactionDiffusionProps extends ReactionDiffusionOptions {
|
|
24
25
|
/**
|
|
25
26
|
* Renders the current data or resources using the supplied context. See {@link TextureRenderer}
|
|
26
27
|
* .
|
|
@@ -37,7 +38,7 @@ export interface ReactionDiffusionProps {
|
|
|
37
38
|
* Named pattern configuration used to initialize the simulation. See
|
|
38
39
|
* {@link ReactionDiffusionProps}.
|
|
39
40
|
*/
|
|
40
|
-
readonly preset?:
|
|
41
|
+
readonly preset?: ReactionDiffusionPreset;
|
|
41
42
|
/** Ordered colors used to present texture intensity. See {@link TexturePalette}. */
|
|
42
43
|
readonly palette?: TexturePalette;
|
|
43
44
|
/**
|