@pibbl/core 0.0.2 → 0.0.3-alpha.109.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD_PARTY_NOTICES.txt +81 -0
- package/dist/features/physics/2d-testing.d.ts +1 -1
- package/dist/features/physics/2d-testing.js +2 -2
- package/dist/features/physics/2d-testing.js.map +2 -2
- package/dist/features/physics/lib/2d/canvas/components.js +25 -21
- package/dist/features/physics/lib/2d/canvas/components.js.map +2 -2
- package/dist/features/physics/lib/2d/canvas/presentation.js +1 -2
- package/dist/features/physics/lib/2d/canvas/presentation.js.map +2 -2
- package/dist/features/physics/lib/2d/collision/casts.js +4 -2
- package/dist/features/physics/lib/2d/collision/casts.js.map +2 -2
- package/dist/features/physics/lib/2d/runtime/controller.js +1 -1
- package/dist/features/physics/lib/2d/runtime/controller.js.map +2 -2
- package/dist/features/physics/lib/2d/runtime/obstacles.js +9 -11
- package/dist/features/physics/lib/2d/runtime/obstacles.js.map +2 -2
- package/dist/features/physics/lib/2d/shapes.js +8 -9
- package/dist/features/physics/lib/2d/shapes.js.map +2 -2
- package/dist/features/physics/lib/2d/world/rapier.js +22 -26
- package/dist/features/physics/lib/2d/world/rapier.js.map +2 -2
- package/dist/features/sprites/loader.js +6 -3
- package/dist/features/sprites/loader.js.map +2 -2
- package/dist/features/textures/index.d.ts +12 -2
- package/dist/features/textures/index.js +33 -1
- package/dist/features/textures/index.js.map +2 -2
- package/dist/features/textures/lib/chemical-field.d.ts +56 -0
- package/dist/features/textures/lib/chemical-field.js +154 -0
- package/dist/features/textures/lib/chemical-field.js.map +7 -0
- package/dist/features/textures/lib/chemical-recipes.d.ts +119 -0
- package/dist/features/textures/lib/chemical-recipes.js +275 -0
- package/dist/features/textures/lib/chemical-recipes.js.map +7 -0
- package/dist/features/textures/lib/definitions.d.ts +3 -18
- package/dist/features/textures/lib/definitions.js +17 -24
- package/dist/features/textures/lib/definitions.js.map +2 -2
- package/dist/features/textures/lib/geometric-patterns.d.ts +149 -0
- package/dist/features/textures/lib/geometric-patterns.js +305 -0
- package/dist/features/textures/lib/geometric-patterns.js.map +7 -0
- package/dist/features/textures/lib/gray-scott.d.ts +55 -0
- package/dist/features/textures/lib/gray-scott.js +37 -0
- package/dist/features/textures/lib/gray-scott.js.map +7 -0
- package/dist/features/textures/lib/palette.js +1 -3
- package/dist/features/textures/lib/palette.js.map +2 -2
- package/dist/features/textures/lib/patterns.d.ts +123 -0
- package/dist/features/textures/lib/patterns.js +344 -0
- package/dist/features/textures/lib/patterns.js.map +7 -0
- package/dist/features/textures/lib/rain-drops.js +2 -1
- package/dist/features/textures/lib/rain-drops.js.map +2 -2
- package/dist/features/textures/lib/reaction-diffusion.d.ts +3 -2
- package/dist/features/textures/lib/reaction-diffusion.js +9 -20
- package/dist/features/textures/lib/reaction-diffusion.js.map +2 -2
- package/dist/features/textures/lib/simulation.d.ts +10 -4
- package/dist/features/textures/lib/simulation.js +23 -13
- package/dist/features/textures/lib/simulation.js.map +2 -2
- package/dist/features/textures/lib/wasm/electric.js +8 -1
- package/dist/features/textures/lib/wasm/electric.js.map +2 -2
- package/dist/features/textures/lib/water-surface.js +1 -3
- package/dist/features/textures/lib/water-surface.js.map +2 -2
- package/dist/features/viz/index.d.ts +68 -6
- package/dist/features/viz/index.js +164 -2
- package/dist/features/viz/index.js.map +2 -2
- package/dist/features/viz/inspection/bar.d.ts +79 -0
- package/dist/features/viz/inspection/bar.js +49 -0
- package/dist/features/viz/inspection/bar.js.map +7 -0
- package/dist/features/viz/inspection/candle.d.ts +156 -0
- package/dist/features/viz/inspection/candle.js +120 -0
- package/dist/features/viz/inspection/candle.js.map +7 -0
- package/dist/features/viz/inspection/capture-types.d.ts +65 -0
- package/dist/features/viz/inspection/capture.d.ts +16 -0
- package/dist/features/viz/inspection/capture.js +49 -0
- package/dist/features/viz/inspection/capture.js.map +7 -0
- package/dist/features/viz/inspection/handler.d.ts +36 -0
- package/dist/features/viz/inspection/handler.js +91 -0
- package/dist/features/viz/inspection/handler.js.map +7 -0
- package/dist/features/viz/inspection/ohlc-bar.d.ts +132 -0
- package/dist/features/viz/inspection/ohlc-bar.js +118 -0
- package/dist/features/viz/inspection/ohlc-bar.js.map +7 -0
- package/dist/features/viz/inspection/owned-ref.d.ts +16 -0
- package/dist/features/viz/inspection/owned-ref.js +99 -0
- package/dist/features/viz/inspection/owned-ref.js.map +7 -0
- package/dist/features/viz/inspection/painted-point.d.ts +22 -0
- package/dist/features/viz/inspection/painted-point.js +29 -0
- package/dist/features/viz/inspection/painted-point.js.map +7 -0
- package/dist/features/viz/inspection/queries.d.ts +100 -0
- package/dist/features/viz/inspection/queries.js +192 -0
- package/dist/features/viz/inspection/queries.js.map +7 -0
- package/dist/features/viz/inspection/query-types.d.ts +177 -0
- package/dist/features/viz/inspection/volume.d.ts +104 -0
- package/dist/features/viz/inspection/volume.js +95 -0
- package/dist/features/viz/inspection/volume.js.map +7 -0
- package/dist/features/viz/inspection.d.ts +19 -0
- package/dist/features/viz/inspection.js +54 -0
- package/dist/features/viz/inspection.js.map +7 -0
- package/dist/features/viz/inspection.mjs +1 -0
- package/dist/features/viz/lib/area-series.d.ts +62 -0
- package/dist/features/viz/lib/area-series.js +120 -0
- package/dist/features/viz/lib/area-series.js.map +7 -0
- package/dist/features/viz/lib/axis-title.js +2 -1
- package/dist/features/viz/lib/axis-title.js.map +2 -2
- package/dist/features/viz/lib/axis.js +1 -1
- package/dist/features/viz/lib/axis.js.map +2 -2
- package/dist/features/viz/lib/bar-series.d.ts +3 -1
- package/dist/features/viz/lib/bar-series.js +16 -1
- package/dist/features/viz/lib/bar-series.js.map +2 -2
- package/dist/features/viz/lib/baseline-series.d.ts +55 -0
- package/dist/features/viz/lib/baseline-series.js +136 -0
- package/dist/features/viz/lib/baseline-series.js.map +7 -0
- package/dist/features/viz/lib/candlestick-series.d.ts +62 -0
- package/dist/features/viz/lib/candlestick-series.js +150 -0
- package/dist/features/viz/lib/candlestick-series.js.map +7 -0
- package/dist/features/viz/lib/censored-point-series.d.ts +71 -0
- package/dist/features/viz/lib/censored-point-series.js +129 -0
- package/dist/features/viz/lib/censored-point-series.js.map +7 -0
- package/dist/features/viz/lib/color-context.d.ts +4 -0
- package/dist/features/viz/lib/color-context.js +41 -0
- package/dist/features/viz/lib/color-context.js.map +7 -0
- package/dist/features/viz/lib/color-math.d.ts +4 -0
- package/dist/features/viz/lib/color-math.js +31 -0
- package/dist/features/viz/lib/color-math.js.map +7 -0
- package/dist/features/viz/lib/color-types.d.ts +53 -0
- package/dist/features/viz/lib/curve-definition.d.ts +49 -0
- package/dist/features/viz/lib/curve-definition.js +142 -0
- package/dist/features/viz/lib/curve-definition.js.map +7 -0
- package/dist/features/viz/lib/diverging-color-scale.d.ts +11 -0
- package/dist/features/viz/lib/diverging-color-scale.js +51 -0
- package/dist/features/viz/lib/diverging-color-scale.js.map +7 -0
- package/dist/features/viz/lib/domain-navigation.d.ts +40 -0
- package/dist/features/viz/lib/domain-navigation.js +77 -0
- package/dist/features/viz/lib/domain-navigation.js.map +7 -0
- package/dist/features/viz/lib/editable-chart-elements.d.ts +178 -0
- package/dist/features/viz/lib/editable-chart-elements.js +733 -0
- package/dist/features/viz/lib/editable-chart-elements.js.map +7 -0
- package/dist/features/viz/lib/financial-aggregation.d.ts +127 -0
- package/dist/features/viz/lib/financial-aggregation.js +116 -0
- package/dist/features/viz/lib/financial-aggregation.js.map +7 -0
- package/dist/features/viz/lib/financial-autoscale.d.ts +64 -0
- package/dist/features/viz/lib/financial-autoscale.js +61 -0
- package/dist/features/viz/lib/financial-autoscale.js.map +7 -0
- package/dist/features/viz/lib/financial-comparison.d.ts +62 -0
- package/dist/features/viz/lib/financial-comparison.js +98 -0
- package/dist/features/viz/lib/financial-comparison.js.map +7 -0
- package/dist/features/viz/lib/financial-geometry.d.ts +77 -0
- package/dist/features/viz/lib/financial-geometry.js +67 -0
- package/dist/features/viz/lib/financial-geometry.js.map +7 -0
- package/dist/features/viz/lib/financial-indicators.d.ts +114 -0
- package/dist/features/viz/lib/financial-indicators.js +135 -0
- package/dist/features/viz/lib/financial-indicators.js.map +7 -0
- package/dist/features/viz/lib/financial-oscillators.d.ts +171 -0
- package/dist/features/viz/lib/financial-oscillators.js +265 -0
- package/dist/features/viz/lib/financial-oscillators.js.map +7 -0
- package/dist/features/viz/lib/graph/bipartite.d.ts +14 -0
- package/dist/features/viz/lib/graph/bipartite.js +250 -0
- package/dist/features/viz/lib/graph/bipartite.js.map +7 -0
- package/dist/features/viz/lib/graph/chord.d.ts +44 -0
- package/dist/features/viz/lib/graph/chord.js +348 -0
- package/dist/features/viz/lib/graph/chord.js.map +7 -0
- package/dist/features/viz/lib/graph/dependency.d.ts +26 -0
- package/dist/features/viz/lib/graph/dependency.js +140 -0
- package/dist/features/viz/lib/graph/dependency.js.map +7 -0
- package/dist/features/viz/lib/graph/force.d.ts +28 -0
- package/dist/features/viz/lib/graph/force.js +580 -0
- package/dist/features/viz/lib/graph/force.js.map +7 -0
- package/dist/features/viz/lib/graph/hierarchy.d.ts +21 -0
- package/dist/features/viz/lib/graph/hierarchy.js +112 -0
- package/dist/features/viz/lib/graph/hierarchy.js.map +7 -0
- package/dist/features/viz/lib/graph/icicle.d.ts +16 -0
- package/dist/features/viz/lib/graph/icicle.js +153 -0
- package/dist/features/viz/lib/graph/icicle.js.map +7 -0
- package/dist/features/viz/lib/graph/matrix.d.ts +30 -0
- package/dist/features/viz/lib/graph/matrix.js +243 -0
- package/dist/features/viz/lib/graph/matrix.js.map +7 -0
- package/dist/features/viz/lib/graph/neighborhood.d.ts +11 -0
- package/dist/features/viz/lib/graph/neighborhood.js +281 -0
- package/dist/features/viz/lib/graph/neighborhood.js.map +7 -0
- package/dist/features/viz/lib/graph/routes.d.ts +35 -0
- package/dist/features/viz/lib/graph/routes.js +101 -0
- package/dist/features/viz/lib/graph/routes.js.map +7 -0
- package/dist/features/viz/lib/graph/sankey.d.ts +44 -0
- package/dist/features/viz/lib/graph/sankey.js +341 -0
- package/dist/features/viz/lib/graph/sankey.js.map +7 -0
- package/dist/features/viz/lib/graph/shared.d.ts +59 -0
- package/dist/features/viz/lib/graph/shared.js +301 -0
- package/dist/features/viz/lib/graph/shared.js.map +7 -0
- package/dist/features/viz/lib/graph/tree.d.ts +11 -0
- package/dist/features/viz/lib/graph/tree.js +232 -0
- package/dist/features/viz/lib/graph/tree.js.map +7 -0
- package/dist/features/viz/lib/graph/treemap.d.ts +20 -0
- package/dist/features/viz/lib/graph/treemap.js +227 -0
- package/dist/features/viz/lib/graph/treemap.js.map +7 -0
- package/dist/features/viz/lib/graph/types.d.ts +1097 -0
- package/dist/features/viz/lib/hover-card.js +8 -9
- package/dist/features/viz/lib/hover-card.js.map +2 -2
- package/dist/features/viz/lib/hover-data.d.ts +1 -1
- package/dist/features/viz/lib/hover-data.js +5 -2
- package/dist/features/viz/lib/hover-data.js.map +2 -2
- package/dist/features/viz/lib/interval-band-series.d.ts +49 -0
- package/dist/features/viz/lib/interval-band-series.js +136 -0
- package/dist/features/viz/lib/interval-band-series.js.map +7 -0
- package/dist/features/viz/lib/interval-diamond-series.d.ts +43 -0
- package/dist/features/viz/lib/interval-diamond-series.js +122 -0
- package/dist/features/viz/lib/interval-diamond-series.js.map +7 -0
- package/dist/features/viz/lib/interval-series.d.ts +79 -0
- package/dist/features/viz/lib/interval-series.js +158 -0
- package/dist/features/viz/lib/interval-series.js.map +7 -0
- package/dist/features/viz/lib/layout-pie.js +9 -13
- package/dist/features/viz/lib/layout-pie.js.map +2 -2
- package/dist/features/viz/lib/line-series.d.ts +1 -1
- package/dist/features/viz/lib/line-series.js +47 -28
- package/dist/features/viz/lib/line-series.js.map +2 -2
- package/dist/features/viz/lib/linear-scale.js +1 -1
- package/dist/features/viz/lib/linear-scale.js.map +2 -2
- package/dist/features/viz/lib/monotone-curve.d.ts +11 -0
- package/dist/features/viz/lib/monotone-curve.js +63 -0
- package/dist/features/viz/lib/monotone-curve.js.map +7 -0
- package/dist/features/viz/lib/numeric-range-interpolation.d.ts +15 -0
- package/dist/features/viz/lib/numeric-range-interpolation.js +36 -0
- package/dist/features/viz/lib/numeric-range-interpolation.js.map +7 -0
- package/dist/features/viz/lib/ohlc-bar-series.d.ts +55 -0
- package/dist/features/viz/lib/ohlc-bar-series.js +168 -0
- package/dist/features/viz/lib/ohlc-bar-series.js.map +7 -0
- package/dist/features/viz/lib/paired-series.d.ts +44 -0
- package/dist/features/viz/lib/paired-series.js +93 -0
- package/dist/features/viz/lib/paired-series.js.map +7 -0
- package/dist/features/viz/lib/pie-layout.js +2 -1
- package/dist/features/viz/lib/pie-layout.js.map +2 -2
- package/dist/features/viz/lib/plot-series.js +11 -6
- package/dist/features/viz/lib/plot-series.js.map +2 -2
- package/dist/features/viz/lib/plot-types.d.ts +4 -3
- package/dist/features/viz/lib/point-series.d.ts +1 -1
- package/dist/features/viz/lib/point-series.js +36 -9
- package/dist/features/viz/lib/point-series.js.map +2 -2
- package/dist/features/viz/lib/point-types.d.ts +5 -2
- package/dist/features/viz/lib/reference-band.js +4 -1
- package/dist/features/viz/lib/reference-band.js.map +2 -2
- package/dist/features/viz/lib/scale-context.d.ts +1 -1
- package/dist/features/viz/lib/scale-ticks.js +21 -6
- package/dist/features/viz/lib/scale-ticks.js.map +2 -2
- package/dist/features/viz/lib/sequential-color-scale.d.ts +11 -0
- package/dist/features/viz/lib/sequential-color-scale.js +49 -0
- package/dist/features/viz/lib/sequential-color-scale.js.map +7 -0
- package/dist/features/viz/lib/series-position.d.ts +12 -0
- package/dist/features/viz/lib/series-position.js +44 -0
- package/dist/features/viz/lib/series-position.js.map +7 -0
- package/dist/features/viz/lib/step-curves.d.ts +19 -0
- package/dist/features/viz/lib/step-curves.js +53 -0
- package/dist/features/viz/lib/step-curves.js.map +7 -0
- package/dist/features/viz/lib/threshold-color-scale.d.ts +43 -0
- package/dist/features/viz/lib/threshold-color-scale.js +59 -0
- package/dist/features/viz/lib/threshold-color-scale.js.map +7 -0
- package/dist/features/viz/lib/trading-time-mapping.d.ts +32 -0
- package/dist/features/viz/lib/trading-time-mapping.js +89 -0
- package/dist/features/viz/lib/trading-time-mapping.js.map +7 -0
- package/dist/features/viz/lib/trading-time-scale.d.ts +83 -0
- package/dist/features/viz/lib/trading-time-scale.js +96 -0
- package/dist/features/viz/lib/trading-time-scale.js.map +7 -0
- package/dist/features/viz/lib/trajectory-series.d.ts +71 -0
- package/dist/features/viz/lib/trajectory-series.js +111 -0
- package/dist/features/viz/lib/trajectory-series.js.map +7 -0
- package/dist/features/viz/lib/types.d.ts +20 -4
- package/dist/features/viz/lib/use-continuous-scale.js +6 -1
- package/dist/features/viz/lib/use-continuous-scale.js.map +2 -2
- package/dist/features/viz/lib/utc-scale.js +11 -10
- package/dist/features/viz/lib/utc-scale.js.map +2 -2
- package/dist/features/viz/lib/volume-series.d.ts +59 -0
- package/dist/features/viz/lib/volume-series.js +117 -0
- package/dist/features/viz/lib/volume-series.js.map +7 -0
- package/dist/features/viz/lib/weighted-point-series.d.ts +71 -0
- package/dist/features/viz/lib/weighted-point-series.js +169 -0
- package/dist/features/viz/lib/weighted-point-series.js.map +7 -0
- package/dist/filters/backdrop-contrast-gpu.d.ts +5 -0
- package/dist/filters/backdrop-contrast-gpu.js +33 -0
- package/dist/filters/backdrop-contrast-gpu.js.map +7 -0
- package/dist/filters/backdrop-contrast.d.ts +21 -0
- package/dist/filters/backdrop-contrast.js +61 -0
- package/dist/filters/backdrop-contrast.js.map +7 -0
- package/dist/filters/displacement.js +1 -1
- package/dist/filters/displacement.js.map +2 -2
- package/dist/filters/emboss-gpu.d.ts +4 -0
- package/dist/filters/emboss-gpu.js +39 -0
- package/dist/filters/emboss-gpu.js.map +7 -0
- package/dist/filters/emboss.d.ts +32 -0
- package/dist/filters/emboss.js +104 -0
- package/dist/filters/emboss.js.map +7 -0
- package/dist/filters/filter-executor.d.ts +11 -4
- package/dist/filters/filter-executor.js +104 -49
- package/dist/filters/filter-executor.js.map +2 -2
- package/dist/filters/reflected-light.js +1 -1
- package/dist/filters/reflected-light.js.map +2 -2
- package/dist/filters/reflection-gpu.d.ts +3 -1
- package/dist/filters/reflection-gpu.js +5 -2
- package/dist/filters/reflection-gpu.js.map +2 -2
- package/dist/filters/render-backdrop-contrast-boundary.d.ts +31 -0
- package/dist/filters/render-backdrop-contrast-boundary.js +116 -0
- package/dist/filters/render-backdrop-contrast-boundary.js.map +7 -0
- package/dist/filters/render-emboss-boundary.d.ts +13 -0
- package/dist/filters/render-emboss-boundary.js +131 -0
- package/dist/filters/render-emboss-boundary.js.map +7 -0
- package/dist/filters.d.ts +9 -5
- package/dist/filters.js +4 -0
- package/dist/filters.js.map +2 -2
- package/dist/index.d.ts +9 -5
- package/dist/index.js +18 -2
- package/dist/index.js.map +2 -2
- package/dist/internal.d.ts +4 -0
- package/dist/internal.js +6 -0
- package/dist/internal.js.map +2 -2
- package/dist/layout-kernel.d.ts +12 -0
- package/dist/layout-kernel.js +11 -0
- package/dist/layout-kernel.js.map +7 -0
- package/dist/layout-kernel.mjs +1 -0
- package/dist/lib/backend/types.d.ts +13 -1
- package/dist/lib/backend/types.js.map +2 -2
- package/dist/lib/components/arc-geometry.js +2 -1
- package/dist/lib/components/arc-geometry.js.map +2 -2
- package/dist/lib/components/g.js +2 -0
- package/dist/lib/components/g.js.map +2 -2
- package/dist/lib/components/html-box.js +2 -1
- package/dist/lib/components/html-box.js.map +2 -2
- package/dist/lib/components/img.js +3 -3
- package/dist/lib/components/img.js.map +2 -2
- package/dist/lib/components/layer.js +98 -16
- package/dist/lib/components/layer.js.map +3 -3
- package/dist/lib/components/text.d.ts +16 -0
- package/dist/lib/components/text.js +131 -24
- package/dist/lib/components/text.js.map +2 -2
- package/dist/lib/define-primitive.d.ts +4 -2
- package/dist/lib/define-primitive.js +3 -1
- package/dist/lib/define-primitive.js.map +2 -2
- package/dist/lib/element/metadata.d.ts +9 -0
- package/dist/lib/element/metadata.js +19 -0
- package/dist/lib/element/metadata.js.map +2 -2
- package/dist/lib/element/resolve-primitive-inputs.d.ts +2 -0
- package/dist/lib/element/resolve-primitive-inputs.js +17 -4
- package/dist/lib/element/resolve-primitive-inputs.js.map +2 -2
- package/dist/lib/events/event-facade.d.ts +18 -0
- package/dist/lib/events/event-facade.js +28 -2
- package/dist/lib/events/event-facade.js.map +2 -2
- package/dist/lib/events/hit-test.js +2 -1
- package/dist/lib/events/hit-test.js.map +2 -2
- package/dist/lib/events/propagation.d.ts +2 -1
- package/dist/lib/events/propagation.js +22 -16
- package/dist/lib/events/propagation.js.map +2 -2
- package/dist/lib/events/registrations.d.ts +10 -0
- package/dist/lib/events/registrations.js +160 -5
- package/dist/lib/events/registrations.js.map +2 -2
- package/dist/lib/execute-render.js +25 -1
- package/dist/lib/execute-render.js.map +2 -2
- package/dist/lib/filter/filter-region.js +3 -10
- package/dist/lib/filter/filter-region.js.map +2 -2
- package/dist/lib/focus/focus-manager.d.ts +8 -1
- package/dist/lib/focus/focus-manager.js +87 -43
- package/dist/lib/focus/focus-manager.js.map +2 -2
- package/dist/lib/focus/geometry.d.ts +2 -0
- package/dist/lib/focus/geometry.js +6 -0
- package/dist/lib/focus/geometry.js.map +2 -2
- package/dist/lib/geometry/path-bend-guide.js +1 -1
- package/dist/lib/geometry/path-bend-guide.js.map +2 -2
- package/dist/lib/geometry/path-geometry.js +12 -11
- package/dist/lib/geometry/path-geometry.js.map +2 -2
- package/dist/lib/geometry/path-transforms.js +17 -21
- package/dist/lib/geometry/path-transforms.js.map +2 -2
- package/dist/lib/geometry/path-warp-bezier.js +3 -1
- package/dist/lib/geometry/path-warp-bezier.js.map +2 -2
- package/dist/lib/geometry/path-warp.js +1 -1
- package/dist/lib/geometry/path-warp.js.map +2 -2
- package/dist/lib/global-state.js +2 -0
- package/dist/lib/global-state.js.map +2 -2
- package/dist/lib/html/html-events.d.ts +32 -0
- package/dist/lib/html/html-events.js +179 -0
- package/dist/lib/html/html-events.js.map +7 -0
- package/dist/lib/html/html-service.d.ts +8 -2
- package/dist/lib/html/html-service.js +198 -65
- package/dist/lib/html/html-service.js.map +2 -2
- package/dist/lib/html/overlay-config.js +7 -6
- package/dist/lib/html/overlay-config.js.map +2 -2
- package/dist/lib/html/types.d.ts +29 -2
- package/dist/lib/layout/absolute.d.ts +11 -5
- package/dist/lib/layout/absolute.js +329 -55
- package/dist/lib/layout/absolute.js.map +3 -3
- package/dist/lib/layout/allocation-checkpoint-owner.d.ts +11 -0
- package/dist/lib/layout/allocation-checkpoint-owner.js +86 -0
- package/dist/lib/layout/allocation-checkpoint-owner.js.map +7 -0
- package/dist/lib/layout/allocation-checkpoint.d.ts +53 -0
- package/dist/lib/layout/allocation-checkpoint.js +463 -0
- package/dist/lib/layout/allocation-checkpoint.js.map +7 -0
- package/dist/lib/layout/allocation-dependencies.d.ts +30 -0
- package/dist/lib/layout/allocation-dependencies.js +90 -0
- package/dist/lib/layout/allocation-dependencies.js.map +7 -0
- package/dist/lib/layout/allocation-revision.d.ts +13 -0
- package/dist/lib/layout/allocation-revision.js +67 -0
- package/dist/lib/layout/allocation-revision.js.map +7 -0
- package/dist/lib/layout/box-insets.d.ts +17 -0
- package/dist/lib/layout/box-insets.js +138 -0
- package/dist/lib/layout/box-insets.js.map +7 -0
- package/dist/lib/layout/box-sizing.d.ts +16 -0
- package/dist/lib/layout/box-sizing.js +77 -0
- package/dist/lib/layout/box-sizing.js.map +7 -0
- package/dist/lib/layout/box.js +42 -12
- package/dist/lib/layout/box.js.map +2 -2
- package/dist/lib/layout/canvas-measurement.d.ts +13 -0
- package/dist/lib/layout/canvas-measurement.js +57 -0
- package/dist/lib/layout/canvas-measurement.js.map +7 -0
- package/dist/lib/layout/context.d.ts +35 -6
- package/dist/lib/layout/context.js +72 -3
- package/dist/lib/layout/context.js.map +2 -2
- package/dist/lib/layout/define-layout-component.d.ts +23 -0
- package/dist/lib/layout/define-layout-component.js +84 -0
- package/dist/lib/layout/define-layout-component.js.map +7 -0
- package/dist/lib/layout/flex-allocation-cache.d.ts +42 -0
- package/dist/lib/layout/flex-baseline-mode.d.ts +2 -0
- package/dist/lib/layout/flex-baseline-mode.js +7 -0
- package/dist/lib/layout/flex-baseline-mode.js.map +7 -0
- package/dist/lib/layout/flex.d.ts +50 -15
- package/dist/lib/layout/flex.js +2124 -195
- package/dist/lib/layout/flex.js.map +3 -3
- package/dist/lib/layout/flow.js +225 -49
- package/dist/lib/layout/flow.js.map +2 -2
- package/dist/lib/layout/geometry-publication.d.ts +53 -0
- package/dist/lib/layout/geometry-publication.js +244 -0
- package/dist/lib/layout/geometry-publication.js.map +7 -0
- package/dist/lib/layout/grid-kernel.d.ts +63 -0
- package/dist/lib/layout/grid-kernel.js +168 -0
- package/dist/lib/layout/grid-kernel.js.map +7 -0
- package/dist/lib/layout/grid.d.ts +63 -4
- package/dist/lib/layout/grid.js +767 -171
- package/dist/lib/layout/grid.js.map +3 -3
- package/dist/lib/layout/measure.d.ts +55 -3
- package/dist/lib/layout/measure.js +448 -15
- package/dist/lib/layout/measure.js.map +2 -2
- package/dist/lib/layout/overlay.js +81 -23
- package/dist/lib/layout/overlay.js.map +2 -2
- package/dist/lib/layout/participation.d.ts +27 -0
- package/dist/lib/layout/participation.js +188 -0
- package/dist/lib/layout/participation.js.map +7 -0
- package/dist/lib/layout/place-child.js +1 -1
- package/dist/lib/layout/place-child.js.map +2 -2
- package/dist/lib/layout/positioning-diagnostics.d.ts +1 -1
- package/dist/lib/layout/positioning-diagnostics.js +13 -2
- package/dist/lib/layout/positioning-diagnostics.js.map +2 -2
- package/dist/lib/layout/prepared-root.d.ts +121 -0
- package/dist/lib/layout/prepared-root.js +360 -0
- package/dist/lib/layout/prepared-root.js.map +7 -0
- package/dist/lib/layout/standalone-kernel.d.ts +60 -0
- package/dist/lib/layout/standalone-kernel.js +722 -0
- package/dist/lib/layout/standalone-kernel.js.map +7 -0
- package/dist/lib/layout/topology.d.ts +21 -0
- package/dist/lib/layout/topology.js +113 -0
- package/dist/lib/layout/topology.js.map +7 -0
- package/dist/lib/layout/types.d.ts +5 -0
- package/dist/lib/layout/wasm/artifact.d.ts +1 -0
- package/dist/lib/layout/wasm/artifact.js +5 -0
- package/dist/lib/layout/wasm/artifact.js.map +7 -0
- package/dist/lib/layout/wasm/bytes.d.ts +1 -0
- package/dist/lib/layout/wasm/bytes.js +5 -0
- package/dist/lib/layout/wasm/bytes.js.map +7 -0
- package/dist/lib/layout/wasm/embedded.d.ts +2 -0
- package/dist/lib/layout/wasm/embedded.js +12 -0
- package/dist/lib/layout/wasm/embedded.js.map +7 -0
- package/dist/lib/layout/wasm/layout.wasm +0 -0
- package/dist/lib/layout/wasm/module.d.ts +8 -0
- package/dist/lib/layout/wasm/module.js +70 -0
- package/dist/lib/layout/wasm/module.js.map +7 -0
- package/dist/lib/layout/wasm/region.d.ts +267 -0
- package/dist/lib/layout/wasm/region.js +1018 -0
- package/dist/lib/layout/wasm/region.js.map +7 -0
- package/dist/lib/manipulation/controller.js +4 -7
- package/dist/lib/manipulation/controller.js.map +2 -2
- package/dist/lib/manipulation/frame.js +1 -1
- package/dist/lib/manipulation/frame.js.map +2 -2
- package/dist/lib/manipulation/handles.js +32 -33
- package/dist/lib/manipulation/handles.js.map +2 -2
- package/dist/lib/manipulation/solve.js +12 -10
- package/dist/lib/manipulation/solve.js.map +2 -2
- package/dist/lib/mount-pibbl.js +1 -0
- package/dist/lib/mount-pibbl.js.map +2 -2
- package/dist/lib/mount-prepared-pibbl.d.ts +5 -0
- package/dist/lib/mount-prepared-pibbl.js +29 -0
- package/dist/lib/mount-prepared-pibbl.js.map +7 -0
- package/dist/lib/mount-request.d.ts +8 -0
- package/dist/lib/mount-request.js +41 -0
- package/dist/lib/mount-request.js.map +7 -0
- package/dist/lib/pibbl.d.ts +21 -13
- package/dist/lib/pibbl.js +18 -16
- package/dist/lib/pibbl.js.map +2 -2
- package/dist/lib/recording/recording.d.ts +43 -0
- package/dist/lib/recording/recording.js +555 -0
- package/dist/lib/recording/recording.js.map +7 -0
- package/dist/lib/recording/types.d.ts +118 -0
- package/dist/lib/recording/wasm-bytes.d.ts +1 -0
- package/dist/lib/recording/wasm-bytes.js +5 -0
- package/dist/lib/recording/wasm-bytes.js.map +7 -0
- package/dist/lib/recording/worker-source.d.ts +1 -0
- package/dist/lib/recording/worker-source.js +5 -0
- package/dist/lib/recording/worker-source.js.map +7 -0
- package/dist/lib/render-layer/controller.d.ts +9 -3
- package/dist/lib/render-layer/controller.js +259 -110
- package/dist/lib/render-layer/controller.js.map +2 -2
- package/dist/lib/render-transaction.d.ts +12 -2
- package/dist/lib/render-transaction.js +69 -1
- package/dist/lib/render-transaction.js.map +2 -2
- package/dist/lib/render.js +32 -8
- package/dist/lib/render.js.map +2 -2
- package/dist/lib/scheduler/realm-scheduler.d.ts +2 -0
- package/dist/lib/scheduler/realm-scheduler.js +55 -26
- package/dist/lib/scheduler/realm-scheduler.js.map +2 -2
- package/dist/lib/scheduler/renderer-participant.js +1 -0
- package/dist/lib/scheduler/renderer-participant.js.map +2 -2
- package/dist/lib/series-inspection-frame.d.ts +18 -0
- package/dist/lib/series-inspection-frame.js +70 -0
- package/dist/lib/series-inspection-frame.js.map +7 -0
- package/dist/lib/signals/edge.d.ts +7 -4
- package/dist/lib/signals/edge.js +25 -3
- package/dist/lib/signals/edge.js.map +2 -2
- package/dist/lib/signals/graph.d.ts +16 -2
- package/dist/lib/signals/graph.js +54 -12
- package/dist/lib/signals/graph.js.map +2 -2
- package/dist/lib/signals/input-provision.d.ts +15 -0
- package/dist/lib/signals/input-provision.js +53 -3
- package/dist/lib/signals/input-provision.js.map +2 -2
- package/dist/lib/signals/render-consumer.d.ts +3 -0
- package/dist/lib/signals/render-consumer.js +22 -14
- package/dist/lib/signals/render-consumer.js.map +2 -2
- package/dist/lib/style/positioning.d.ts +50 -2
- package/dist/lib/style/positioning.js +28 -4
- package/dist/lib/style/positioning.js.map +2 -2
- package/dist/lib/style/resolve-built-in.d.ts +4 -3
- package/dist/lib/style/resolve-built-in.js +17 -3
- package/dist/lib/style/resolve-built-in.js.map +2 -2
- package/dist/lib/style/resolve-dispatch.d.ts +3 -0
- package/dist/lib/style/resolve-dispatch.js +77 -4
- package/dist/lib/style/resolve-dispatch.js.map +2 -2
- package/dist/lib/style/resolve-length.d.ts +2 -0
- package/dist/lib/style/resolve-length.js +13 -9
- package/dist/lib/style/resolve-length.js.map +2 -2
- package/dist/lib/style/sizing-length.d.ts +51 -0
- package/dist/lib/style/sizing-length.js +77 -0
- package/dist/lib/style/sizing-length.js.map +7 -0
- package/dist/lib/style/types.d.ts +63 -25
- package/dist/lib/surface/root-surface.js +10 -6
- package/dist/lib/surface/root-surface.js.map +2 -2
- package/dist/lib/textures/texture.js +10 -8
- package/dist/lib/textures/texture.js.map +2 -2
- package/dist/lib/transitions/capture.js +4 -1
- package/dist/lib/transitions/capture.js.map +2 -2
- package/dist/lib/transitions/embers-physics.js +17 -10
- package/dist/lib/transitions/embers-physics.js.map +2 -2
- package/dist/lib/types.d.ts +110 -1
- package/dist/sync.d.ts +16 -0
- package/dist/sync.js +13 -0
- package/dist/sync.js.map +7 -0
- package/dist/sync.mjs +1 -0
- package/package.json +26 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/features/textures/lib/palette.ts"],
|
|
4
|
-
"sourcesContent": ["import type { ProceduralTextureProps } from './procedural-texture.js';\nimport type { ReactionDiffusionProps } from './reaction-diffusion.js';\n/**\n * Ordered colors forming a texture's presentation ramp.\n *\n * @see {@link texturePalettes}\n * @see {@link ProceduralTextureProps}\n * @see {@link ReactionDiffusionProps}\n */\nexport type TexturePalette = readonly string[];\n/**\n * Built-in immutable color ramps for procedural texture presentation.\n *\n * @see {@link TexturePalette}\n */\nexport const texturePalettes = Object.freeze({\n /** Dark blue through teal to pale yellow. See {@link texturePalettes}. */\n lagoon: Object.freeze([\"#081e2c\", \"#125568\", \"#50b8ad\", \"#e5efb3\"]),\n /** Warm ivory through lavender to deep blue. See {@link texturePalettes}. */\n porcelain: Object.freeze([\"#f2e7d4\", \"#b7a9c0\", \"#536194\", \"#172955\"]),\n /** Dark violet through coral to pale yellow. See {@link texturePalettes}. */\n ember: Object.freeze([\"#241526\", \"#893955\", \"#e88470\", \"#ffe3aa\"]),\n});\n\nexport function paletteLut(palette: TexturePalette): Uint8ClampedArray {\n if (palette.length < 2 || palette.length > 16)\n throw new RangeError(\"Texture palette requires 2\u201316 #RRGGBB colors.\");\n const colors = palette.map((color) => {\n if (!/^#[0-9a-f]{6}$/i.test(color))\n throw new TypeError(\"Texture palette colors must use #RRGGBB.\");\n return [\n parseInt(color.slice(1, 3), 16),\n parseInt(color.slice(3, 5), 16),\n parseInt(color.slice(5, 7), 16),\n ];\n });\n const lut = new Uint8ClampedArray(256 * 4);\n for (let i = 0; i < 256; i++) {\n const position = (i / 255) * (colors.length - 1);\n const lo = Math.min(colors.length - 2, Math.floor(position)),\n mix = position - lo;\n for (let c = 0; c < 3; c++)\n lut[i * 4 + c] = colors[lo][c] * (1 - mix) + colors[lo + 1][c] * mix;\n lut[i * 4 + 3] = 255;\n }\n return lut;\n}\n\n/**\n * The width and height of a texture's raster grid.\n *\n * @see {@link TexturePalette}\n * @see {@link ReactionDiffusionProps}\n * @see {@link ProceduralTextureProps}\n */\nexport interface TextureResolution {\n /**\n * Horizontal extent in the units of the containing geometry or surface. See\n * {@link TextureResolution}.\n */\n readonly width: number;\n /**\n * Vertical extent in the units of the containing geometry or surface. See\n * {@link TextureResolution}.\n */\n readonly height: number;\n}\nexport function validateResolution(\n value: TextureResolution = { width: 256, height: 160 },\n): TextureResolution {\n if (\n !
|
|
5
|
-
"mappings": "AAeO,MAAM,kBAAkB,OAAO,OAAO;AAAA;AAAA,EAE3C,QAAQ,OAAO,OAAO,CAAC,WAAW,WAAW,WAAW,SAAS,CAAC;AAAA;AAAA,EAElE,WAAW,OAAO,OAAO,CAAC,WAAW,WAAW,WAAW,SAAS,CAAC;AAAA;AAAA,EAErE,OAAO,OAAO,OAAO,CAAC,WAAW,WAAW,WAAW,SAAS,CAAC;AACnE,CAAC;AAEM,SAAS,WAAW,SAA4C;AACrE,MAAI,QAAQ,SAAS,KAAK,QAAQ,SAAS;AACzC,UAAM,IAAI,WAAW,oDAA+C;AACtE,QAAM,SAAS,QAAQ,IAAI,CAAC,UAAU;AACpC,QAAI,CAAC,kBAAkB,KAAK,KAAK;AAC/B,YAAM,IAAI,UAAU,0CAA0C;AAChE,WAAO;AAAA,MACL,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,MAC9B,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,MAC9B,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAChC;AAAA,EACF,CAAC;AACD,QAAM,MAAM,IAAI,kBAAkB,MAAM,CAAC;AACzC,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,UAAM,WAAY,IAAI,OAAQ,OAAO,SAAS;AAC9C,UAAM,KAAK,KAAK,IAAI,OAAO,SAAS,GAAG,KAAK,MAAM,QAAQ,CAAC,GACzD,MAAM,WAAW;AACnB,aAAS,IAAI,GAAG,IAAI,GAAG;AACrB,UAAI,IAAI,IAAI,CAAC,IAAI,OAAO,EAAE,EAAE,CAAC,KAAK,IAAI,OAAO,OAAO,KAAK,CAAC,EAAE,CAAC,IAAI;AACnE,QAAI,IAAI,IAAI,CAAC,IAAI;AAAA,EACnB;AACA,SAAO;AACT;AAqBO,SAAS,mBACd,QAA2B,EAAE,OAAO,KAAK,QAAQ,IAAI,GAClC;AACnB,MACE,
|
|
4
|
+
"sourcesContent": ["import type { ProceduralTextureProps } from './procedural-texture.js';\nimport type { ReactionDiffusionProps } from './reaction-diffusion.js';\n/**\n * Ordered colors forming a texture's presentation ramp.\n *\n * @see {@link texturePalettes}\n * @see {@link ProceduralTextureProps}\n * @see {@link ReactionDiffusionProps}\n */\nexport type TexturePalette = readonly string[];\n/**\n * Built-in immutable color ramps for procedural texture presentation.\n *\n * @see {@link TexturePalette}\n */\nexport const texturePalettes = Object.freeze({\n /** Dark blue through teal to pale yellow. See {@link texturePalettes}. */\n lagoon: Object.freeze([\"#081e2c\", \"#125568\", \"#50b8ad\", \"#e5efb3\"]),\n /** Warm ivory through lavender to deep blue. See {@link texturePalettes}. */\n porcelain: Object.freeze([\"#f2e7d4\", \"#b7a9c0\", \"#536194\", \"#172955\"]),\n /** Dark violet through coral to pale yellow. See {@link texturePalettes}. */\n ember: Object.freeze([\"#241526\", \"#893955\", \"#e88470\", \"#ffe3aa\"]),\n});\n\nexport function paletteLut(palette: TexturePalette): Uint8ClampedArray {\n if (palette.length < 2 || palette.length > 16)\n throw new RangeError(\"Texture palette requires 2\u201316 #RRGGBB colors.\");\n const colors = palette.map((color) => {\n if (!/^#[0-9a-f]{6}$/i.test(color))\n throw new TypeError(\"Texture palette colors must use #RRGGBB.\");\n return [\n parseInt(color.slice(1, 3), 16),\n parseInt(color.slice(3, 5), 16),\n parseInt(color.slice(5, 7), 16),\n ];\n });\n const lut = new Uint8ClampedArray(256 * 4);\n for (let i = 0; i < 256; i++) {\n const position = (i / 255) * (colors.length - 1);\n const lo = Math.min(colors.length - 2, Math.floor(position)),\n mix = position - lo;\n for (let c = 0; c < 3; c++)\n lut[i * 4 + c] = colors[lo][c] * (1 - mix) + colors[lo + 1][c] * mix;\n lut[i * 4 + 3] = 255;\n }\n return lut;\n}\n\n/**\n * The width and height of a texture's raster grid.\n *\n * @see {@link TexturePalette}\n * @see {@link ReactionDiffusionProps}\n * @see {@link ProceduralTextureProps}\n */\nexport interface TextureResolution {\n /**\n * Horizontal extent in the units of the containing geometry or surface. See\n * {@link TextureResolution}.\n */\n readonly width: number;\n /**\n * Vertical extent in the units of the containing geometry or surface. See\n * {@link TextureResolution}.\n */\n readonly height: number;\n}\nexport function validateResolution(\n value: TextureResolution = { width: 256, height: 160 },\n): TextureResolution {\n if (\n !(\n Number.isInteger(value.width) &&\n value.width >= 8 &&\n value.width <= 1024 &&\n Number.isInteger(value.height) &&\n value.height >= 8 &&\n value.height <= 1024\n ) ||\n value.width * value.height > 262144\n ) {\n throw new RangeError(\n \"Texture resolution must contain integer dimensions from 8 to 1024 and at most 262144 cells.\",\n );\n }\n return { width: value.width, height: value.height };\n}\nexport function validateSeed(seed = 42): number {\n if (!Number.isInteger(seed) || seed < 0 || seed > 0xffffffff)\n throw new RangeError(\"Texture seed must be an unsigned 32-bit integer.\");\n return seed;\n}\n"],
|
|
5
|
+
"mappings": "AAeO,MAAM,kBAAkB,OAAO,OAAO;AAAA;AAAA,EAE3C,QAAQ,OAAO,OAAO,CAAC,WAAW,WAAW,WAAW,SAAS,CAAC;AAAA;AAAA,EAElE,WAAW,OAAO,OAAO,CAAC,WAAW,WAAW,WAAW,SAAS,CAAC;AAAA;AAAA,EAErE,OAAO,OAAO,OAAO,CAAC,WAAW,WAAW,WAAW,SAAS,CAAC;AACnE,CAAC;AAEM,SAAS,WAAW,SAA4C;AACrE,MAAI,QAAQ,SAAS,KAAK,QAAQ,SAAS;AACzC,UAAM,IAAI,WAAW,oDAA+C;AACtE,QAAM,SAAS,QAAQ,IAAI,CAAC,UAAU;AACpC,QAAI,CAAC,kBAAkB,KAAK,KAAK;AAC/B,YAAM,IAAI,UAAU,0CAA0C;AAChE,WAAO;AAAA,MACL,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,MAC9B,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,MAC9B,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;AAAA,IAChC;AAAA,EACF,CAAC;AACD,QAAM,MAAM,IAAI,kBAAkB,MAAM,CAAC;AACzC,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,UAAM,WAAY,IAAI,OAAQ,OAAO,SAAS;AAC9C,UAAM,KAAK,KAAK,IAAI,OAAO,SAAS,GAAG,KAAK,MAAM,QAAQ,CAAC,GACzD,MAAM,WAAW;AACnB,aAAS,IAAI,GAAG,IAAI,GAAG;AACrB,UAAI,IAAI,IAAI,CAAC,IAAI,OAAO,EAAE,EAAE,CAAC,KAAK,IAAI,OAAO,OAAO,KAAK,CAAC,EAAE,CAAC,IAAI;AACnE,QAAI,IAAI,IAAI,CAAC,IAAI;AAAA,EACnB;AACA,SAAO;AACT;AAqBO,SAAS,mBACd,QAA2B,EAAE,OAAO,KAAK,QAAQ,IAAI,GAClC;AACnB,MACE,EACE,OAAO,UAAU,MAAM,KAAK,KAC5B,MAAM,SAAS,KACf,MAAM,SAAS,QACf,OAAO,UAAU,MAAM,MAAM,KAC7B,MAAM,UAAU,KAChB,MAAM,UAAU,SAElB,MAAM,QAAQ,MAAM,SAAS,QAC7B;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,OAAO,MAAM,OAAO,QAAQ,MAAM,OAAO;AACpD;AACO,SAAS,aAAa,OAAO,IAAY;AAC9C,MAAI,CAAC,OAAO,UAAU,IAAI,KAAK,OAAO,KAAK,OAAO;AAChD,UAAM,IAAI,WAAW,kDAAkD;AACzE,SAAO;AACT;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { type TextureRecipe } from "@pibbl/core";
|
|
2
|
+
/** Shared periodic motion controls for geometric and fiber recipes. @see {@link stripes} */
|
|
3
|
+
export interface PatternMotionOptions {
|
|
4
|
+
/** Initial phase in cycles; any finite value wraps. See {@link PatternMotionOptions}. */
|
|
5
|
+
readonly phase?: number;
|
|
6
|
+
/** Nonnegative cycles per second, up to 20; zero idles. See {@link PatternMotionOptions}. */
|
|
7
|
+
readonly speed?: number;
|
|
8
|
+
}
|
|
9
|
+
/** Controls for periodic stripes; rotate the repeat lattice through paint placement. @see {@link stripes} */
|
|
10
|
+
export interface StripesOptions extends PatternMotionOptions {
|
|
11
|
+
/** Integer stripe periods across the tile, 1–64; default 8. See {@link StripesOptions}. */
|
|
12
|
+
readonly bands?: number;
|
|
13
|
+
/** Foreground fraction of each period, 0–1; default 0.5. See {@link StripesOptions}. */
|
|
14
|
+
readonly dutyCycle?: number;
|
|
15
|
+
/** Horizontal wave amplitude in tile fractions, 0–1; default 0. See {@link StripesOptions}. */
|
|
16
|
+
readonly wave?: number;
|
|
17
|
+
/** Integer wave periods down the tile, 1–16; default 1. See {@link StripesOptions}. */
|
|
18
|
+
readonly waveCycles?: number;
|
|
19
|
+
}
|
|
20
|
+
/** Controls for a two-color checkerboard. @see {@link checkers} */
|
|
21
|
+
export interface CheckersOptions extends PatternMotionOptions {
|
|
22
|
+
/** Even integer columns, 2–64; default 8. See {@link CheckersOptions}. */
|
|
23
|
+
readonly columns?: number;
|
|
24
|
+
/** Even integer rows, 2–64; default 8. See {@link CheckersOptions}. */
|
|
25
|
+
readonly rows?: number;
|
|
26
|
+
}
|
|
27
|
+
/** Controls for seeded seamless wood grain with optional knots. @see {@link woodGrain} */
|
|
28
|
+
export interface WoodGrainOptions extends PatternMotionOptions {
|
|
29
|
+
/** Unsigned 32-bit variation seed; default 42. See {@link WoodGrainOptions}. */
|
|
30
|
+
readonly seed?: number;
|
|
31
|
+
/** Integer grain periods across the tile, 4–128; default 32. See {@link WoodGrainOptions}. */
|
|
32
|
+
readonly grain?: number;
|
|
33
|
+
/** Irregular grain bending, 0–1; default 0.5. See {@link WoodGrainOptions}. */
|
|
34
|
+
readonly distortion?: number;
|
|
35
|
+
/** Fine fiber and pore variation, 0–1; default 0.4. See {@link WoodGrainOptions}. */
|
|
36
|
+
readonly roughness?: number;
|
|
37
|
+
/** Integer knot count, 0–12; default 0 for clear grain. See {@link WoodGrainOptions}. */
|
|
38
|
+
readonly knots?: number;
|
|
39
|
+
/** Knot radius in tile fractions, 0.02–0.18; default 0.09. See {@link WoodGrainOptions}. */
|
|
40
|
+
readonly knotSize?: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Creates seamless straight or wavy stripes using the palette endpoints.
|
|
44
|
+
* @param options - Stripe geometry and periodic motion. See {@link StripesOptions}.
|
|
45
|
+
* @returns A mountable texture recipe with no message commands. See {@link TextureRecipe}.
|
|
46
|
+
* @see {@link StripesOptions}
|
|
47
|
+
*/
|
|
48
|
+
export declare function stripes(options?: StripesOptions): TextureRecipe;
|
|
49
|
+
/**
|
|
50
|
+
* Creates a seamless checkerboard using the palette endpoints.
|
|
51
|
+
* @param options - Even row/column counts and periodic motion. See {@link CheckersOptions}.
|
|
52
|
+
* @returns A mountable texture recipe with no message commands. See {@link TextureRecipe}.
|
|
53
|
+
* @see {@link CheckersOptions}
|
|
54
|
+
*/
|
|
55
|
+
export declare function checkers(options?: CheckersOptions): TextureRecipe;
|
|
56
|
+
/**
|
|
57
|
+
* Creates seamless seeded wood with irregular grain, fine fibers, and optional knots.
|
|
58
|
+
* @param options - Grain frequency, distortion, roughness, knots, seed, and motion. See {@link WoodGrainOptions}.
|
|
59
|
+
* @returns A mountable texture recipe with no message commands. See {@link TextureRecipe}.
|
|
60
|
+
* @see {@link WoodGrainOptions}
|
|
61
|
+
*/
|
|
62
|
+
export declare function woodGrain(options?: WoodGrainOptions): TextureRecipe;
|
|
63
|
+
/** Shared thread geometry and shading for seamless woven fabrics. @see {@link plainWeave} */
|
|
64
|
+
export interface FabricOptions extends PatternMotionOptions {
|
|
65
|
+
/** Unsigned 32-bit fiber variation seed; default 42. See {@link FabricOptions}. */
|
|
66
|
+
readonly seed?: number;
|
|
67
|
+
/** Thread count on each axis, a multiple of 8 in 8–128; default 16. See {@link FabricOptions}. */
|
|
68
|
+
readonly threads?: number;
|
|
69
|
+
/** Thread width as a fraction of cell spacing, 0.2–1; default 0.8. See {@link FabricOptions}. */
|
|
70
|
+
readonly threadWidth?: number;
|
|
71
|
+
/** Rounded thread lighting strength, 0–1; default 0.65. See {@link FabricOptions}. */
|
|
72
|
+
readonly relief?: number;
|
|
73
|
+
/** Seeded directional fibers and soft, uneven yarn edges, 0–1; default 0.2. See {@link FabricOptions}. */
|
|
74
|
+
readonly fuzz?: number;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Creates an alternating over-under plain weave with rounded threads and seeded fibers.
|
|
78
|
+
* @param options - Thread geometry, shading, seed, and motion. See {@link FabricOptions}.
|
|
79
|
+
* @returns A mountable recipe with no message commands. See {@link TextureRecipe}.
|
|
80
|
+
* @see {@link FabricOptions}
|
|
81
|
+
*/
|
|
82
|
+
export declare function plainWeave(options?: FabricOptions): TextureRecipe;
|
|
83
|
+
/**
|
|
84
|
+
* Creates a two-over, two-under diagonal twill fabric.
|
|
85
|
+
* @param options - Thread geometry, shading, seed, and motion. See {@link FabricOptions}.
|
|
86
|
+
* @returns A mountable recipe with no message commands. See {@link TextureRecipe}.
|
|
87
|
+
* @see {@link FabricOptions}
|
|
88
|
+
*/
|
|
89
|
+
export declare function twill(options?: FabricOptions): TextureRecipe;
|
|
90
|
+
/**
|
|
91
|
+
* Creates a reversing twill fabric with repeating herringbone chevrons.
|
|
92
|
+
* @param options - Thread geometry, shading, seed, and motion. See {@link FabricOptions}.
|
|
93
|
+
* @returns A mountable recipe with no message commands. See {@link TextureRecipe}.
|
|
94
|
+
* @see {@link FabricOptions}
|
|
95
|
+
*/
|
|
96
|
+
export declare function herringbone(options?: FabricOptions): TextureRecipe;
|
|
97
|
+
/** Seeded seamless noise layers and their tonal response. @see {@link softNoise} */
|
|
98
|
+
export interface NoiseOptions extends PatternMotionOptions {
|
|
99
|
+
/** Unsigned 32-bit noise seed; default 42. See {@link NoiseOptions}. */
|
|
100
|
+
readonly seed?: number;
|
|
101
|
+
/** Integer base lattice periods per axis, 1–16; default 4. See {@link NoiseOptions}. */
|
|
102
|
+
readonly frequency?: number;
|
|
103
|
+
/** Number of doubled-frequency layers, integer 1–6; default 4. See {@link NoiseOptions}. */
|
|
104
|
+
readonly octaves?: number;
|
|
105
|
+
/** Relative amplitude of each successive layer, 0–1; default 0.5. See {@link NoiseOptions}. */
|
|
106
|
+
readonly persistence?: number;
|
|
107
|
+
/** Tonal contrast about the midpoint, 0–4; default 1. See {@link NoiseOptions}. */
|
|
108
|
+
readonly contrast?: number;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Creates smooth seamless multiscale lattice noise for clouds, pigment, and material variation.
|
|
112
|
+
* @param options - Seed, lattice frequencies, amplitudes, contrast, and motion. See {@link NoiseOptions}.
|
|
113
|
+
* @returns A mountable recipe with no message commands. See {@link TextureRecipe}.
|
|
114
|
+
* @see {@link NoiseOptions}
|
|
115
|
+
*/
|
|
116
|
+
export declare function softNoise(options?: NoiseOptions): TextureRecipe;
|
|
117
|
+
/**
|
|
118
|
+
* Creates seamless multiscale ridges by folding each noise layer around its midpoint.
|
|
119
|
+
* @param options - Seed, lattice frequencies, amplitudes, contrast, and motion. See {@link NoiseOptions}.
|
|
120
|
+
* @returns A mountable recipe with no message commands. See {@link TextureRecipe}.
|
|
121
|
+
* @see {@link NoiseOptions}
|
|
122
|
+
*/
|
|
123
|
+
export declare function ridgedNoise(options?: NoiseOptions): TextureRecipe;
|
|
@@ -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;
|