@vysmo/transitions 0.1.0
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/LICENSE +21 -0
- package/README.md +618 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/inputs/normalize.d.ts +2 -0
- package/dist/inputs/normalize.d.ts.map +1 -0
- package/dist/inputs/normalize.js +2 -0
- package/dist/inputs/normalize.js.map +1 -0
- package/dist/runner/gl.d.ts +7 -0
- package/dist/runner/gl.d.ts.map +1 -0
- package/dist/runner/gl.js +59 -0
- package/dist/runner/gl.js.map +1 -0
- package/dist/runner/mesh.d.ts +28 -0
- package/dist/runner/mesh.d.ts.map +1 -0
- package/dist/runner/mesh.js +96 -0
- package/dist/runner/mesh.js.map +1 -0
- package/dist/runner/runner.d.ts +107 -0
- package/dist/runner/runner.d.ts.map +1 -0
- package/dist/runner/runner.js +410 -0
- package/dist/runner/runner.js.map +1 -0
- package/dist/transitions/all.d.ts +9 -0
- package/dist/transitions/all.d.ts.map +1 -0
- package/dist/transitions/all.js +129 -0
- package/dist/transitions/all.js.map +1 -0
- package/dist/transitions/bloom-reveal.d.ts +27 -0
- package/dist/transitions/bloom-reveal.d.ts.map +1 -0
- package/dist/transitions/bloom-reveal.js +106 -0
- package/dist/transitions/bloom-reveal.js.map +1 -0
- package/dist/transitions/chromatic-pulse.d.ts +4 -0
- package/dist/transitions/chromatic-pulse.d.ts.map +1 -0
- package/dist/transitions/chromatic-pulse.js +40 -0
- package/dist/transitions/chromatic-pulse.js.map +1 -0
- package/dist/transitions/clock-wipe.d.ts +6 -0
- package/dist/transitions/clock-wipe.d.ts.map +1 -0
- package/dist/transitions/clock-wipe.js +33 -0
- package/dist/transitions/clock-wipe.js.map +1 -0
- package/dist/transitions/color-phase.d.ts +10 -0
- package/dist/transitions/color-phase.d.ts.map +1 -0
- package/dist/transitions/color-phase.js +24 -0
- package/dist/transitions/color-phase.js.map +1 -0
- package/dist/transitions/colour-distance.d.ts.map +1 -0
- package/dist/transitions/cross-warp.d.ts.map +1 -0
- package/dist/transitions/cross-zoom.d.ts +5 -0
- package/dist/transitions/cross-zoom.d.ts.map +1 -0
- package/dist/transitions/cross-zoom.js +59 -0
- package/dist/transitions/cross-zoom.js.map +1 -0
- package/dist/transitions/crosshatch.d.ts +12 -0
- package/dist/transitions/crosshatch.d.ts.map +1 -0
- package/dist/transitions/crosshatch.js +49 -0
- package/dist/transitions/crosshatch.js.map +1 -0
- package/dist/transitions/define.d.ts +35 -0
- package/dist/transitions/define.d.ts.map +1 -0
- package/dist/transitions/define.js +37 -0
- package/dist/transitions/define.js.map +1 -0
- package/dist/transitions/directional-burn.d.ts +14 -0
- package/dist/transitions/directional-burn.d.ts.map +1 -0
- package/dist/transitions/directional-burn.js +67 -0
- package/dist/transitions/directional-burn.js.map +1 -0
- package/dist/transitions/directional-warp.d.ts +12 -0
- package/dist/transitions/directional-warp.d.ts.map +1 -0
- package/dist/transitions/directional-warp.js +46 -0
- package/dist/transitions/directional-warp.js.map +1 -0
- package/dist/transitions/dissolve.d.ts +2 -0
- package/dist/transitions/dissolve.d.ts.map +1 -0
- package/dist/transitions/dissolve.js +16 -0
- package/dist/transitions/dissolve.js.map +1 -0
- package/dist/transitions/dreamy-zoom.d.ts +25 -0
- package/dist/transitions/dreamy-zoom.d.ts.map +1 -0
- package/dist/transitions/dreamy-zoom.js +66 -0
- package/dist/transitions/dreamy-zoom.js.map +1 -0
- package/dist/transitions/dreamy.d.ts +8 -0
- package/dist/transitions/dreamy.d.ts.map +1 -0
- package/dist/transitions/dreamy.js +26 -0
- package/dist/transitions/dreamy.js.map +1 -0
- package/dist/transitions/drip-wipe.d.ts +22 -0
- package/dist/transitions/drip-wipe.d.ts.map +1 -0
- package/dist/transitions/drip-wipe.js +109 -0
- package/dist/transitions/drip-wipe.js.map +1 -0
- package/dist/transitions/ember-scatter.d.ts +22 -0
- package/dist/transitions/ember-scatter.d.ts.map +1 -0
- package/dist/transitions/ember-scatter.js +94 -0
- package/dist/transitions/ember-scatter.js.map +1 -0
- package/dist/transitions/film-burn.d.ts +17 -0
- package/dist/transitions/film-burn.d.ts.map +1 -0
- package/dist/transitions/film-burn.js +101 -0
- package/dist/transitions/film-burn.js.map +1 -0
- package/dist/transitions/film-grain.d.ts +24 -0
- package/dist/transitions/film-grain.d.ts.map +1 -0
- package/dist/transitions/film-grain.js +78 -0
- package/dist/transitions/film-grain.js.map +1 -0
- package/dist/transitions/flow-warp.d.ts +20 -0
- package/dist/transitions/flow-warp.d.ts.map +1 -0
- package/dist/transitions/flow-warp.js +51 -0
- package/dist/transitions/flow-warp.js.map +1 -0
- package/dist/transitions/fluid-flow.d.ts +26 -0
- package/dist/transitions/fluid-flow.d.ts.map +1 -0
- package/dist/transitions/fluid-flow.js +94 -0
- package/dist/transitions/fluid-flow.js.map +1 -0
- package/dist/transitions/fly-eye.d.ts.map +1 -0
- package/dist/transitions/fly-eye.js +58 -0
- package/dist/transitions/fly-eye.js.map +1 -0
- package/dist/transitions/glass-shatter.d.ts +25 -0
- package/dist/transitions/glass-shatter.d.ts.map +1 -0
- package/dist/transitions/glass-shatter.js +86 -0
- package/dist/transitions/glass-shatter.js.map +1 -0
- package/dist/transitions/glitch.d.ts +6 -0
- package/dist/transitions/glitch.d.ts.map +1 -0
- package/dist/transitions/glitch.js +59 -0
- package/dist/transitions/glitch.js.map +1 -0
- package/dist/transitions/god-rays-reveal.d.ts +32 -0
- package/dist/transitions/god-rays-reveal.d.ts.map +1 -0
- package/dist/transitions/god-rays-reveal.js +110 -0
- package/dist/transitions/god-rays-reveal.js.map +1 -0
- package/dist/transitions/gravity-pull.d.ts +16 -0
- package/dist/transitions/gravity-pull.d.ts.map +1 -0
- package/dist/transitions/gravity-pull.js +65 -0
- package/dist/transitions/gravity-pull.js.map +1 -0
- package/dist/transitions/grid-reveal.d.ts +12 -0
- package/dist/transitions/grid-reveal.d.ts.map +1 -0
- package/dist/transitions/grid-reveal.js +53 -0
- package/dist/transitions/grid-reveal.js.map +1 -0
- package/dist/transitions/heat-haze.d.ts +13 -0
- package/dist/transitions/heat-haze.d.ts.map +1 -0
- package/dist/transitions/heat-haze.js +51 -0
- package/dist/transitions/heat-haze.js.map +1 -0
- package/dist/transitions/index.d.ts +64 -0
- package/dist/transitions/index.d.ts.map +1 -0
- package/dist/transitions/index.js +63 -0
- package/dist/transitions/index.js.map +1 -0
- package/dist/transitions/ink-bloom.d.ts +15 -0
- package/dist/transitions/ink-bloom.d.ts.map +1 -0
- package/dist/transitions/ink-bloom.js +76 -0
- package/dist/transitions/ink-bloom.js.map +1 -0
- package/dist/transitions/ink-diffuse.d.ts +26 -0
- package/dist/transitions/ink-diffuse.d.ts.map +1 -0
- package/dist/transitions/ink-diffuse.js +90 -0
- package/dist/transitions/ink-diffuse.js.map +1 -0
- package/dist/transitions/iris-zoom.d.ts +13 -0
- package/dist/transitions/iris-zoom.d.ts.map +1 -0
- package/dist/transitions/iris-zoom.js +67 -0
- package/dist/transitions/iris-zoom.js.map +1 -0
- package/dist/transitions/kinetic-bands.d.ts +7 -0
- package/dist/transitions/kinetic-bands.d.ts.map +1 -0
- package/dist/transitions/kinetic-bands.js +58 -0
- package/dist/transitions/kinetic-bands.js.map +1 -0
- package/dist/transitions/lenticular-flip.d.ts +22 -0
- package/dist/transitions/lenticular-flip.d.ts.map +1 -0
- package/dist/transitions/lenticular-flip.js +73 -0
- package/dist/transitions/lenticular-flip.js.map +1 -0
- package/dist/transitions/light-leak.d.ts +7 -0
- package/dist/transitions/light-leak.d.ts.map +1 -0
- package/dist/transitions/light-leak.js +43 -0
- package/dist/transitions/light-leak.js.map +1 -0
- package/dist/transitions/lightning-strike.d.ts +22 -0
- package/dist/transitions/lightning-strike.d.ts.map +1 -0
- package/dist/transitions/lightning-strike.js +90 -0
- package/dist/transitions/lightning-strike.js.map +1 -0
- package/dist/transitions/linear-blur.d.ts +11 -0
- package/dist/transitions/linear-blur.d.ts.map +1 -0
- package/dist/transitions/linear-blur.js +40 -0
- package/dist/transitions/linear-blur.js.map +1 -0
- package/dist/transitions/liquid-chrome.d.ts +22 -0
- package/dist/transitions/liquid-chrome.d.ts.map +1 -0
- package/dist/transitions/liquid-chrome.js +114 -0
- package/dist/transitions/liquid-chrome.js.map +1 -0
- package/dist/transitions/liquid-morph.d.ts +6 -0
- package/dist/transitions/liquid-morph.d.ts.map +1 -0
- package/dist/transitions/liquid-morph.js +50 -0
- package/dist/transitions/liquid-morph.js.map +1 -0
- package/dist/transitions/lumina-melt.d.ts +11 -0
- package/dist/transitions/lumina-melt.d.ts.map +1 -0
- package/dist/transitions/lumina-melt.js +36 -0
- package/dist/transitions/lumina-melt.js.map +1 -0
- package/dist/transitions/mosaic.d.ts +13 -0
- package/dist/transitions/mosaic.d.ts.map +1 -0
- package/dist/transitions/mosaic.js +58 -0
- package/dist/transitions/mosaic.js.map +1 -0
- package/dist/transitions/noise-dissolve.d.ts +5 -0
- package/dist/transitions/noise-dissolve.d.ts.map +1 -0
- package/dist/transitions/noise-dissolve.js +41 -0
- package/dist/transitions/noise-dissolve.js.map +1 -0
- package/dist/transitions/page-curl.d.ts +32 -0
- package/dist/transitions/page-curl.d.ts.map +1 -0
- package/dist/transitions/page-curl.js +165 -0
- package/dist/transitions/page-curl.js.map +1 -0
- package/dist/transitions/paint-bleed.d.ts +12 -0
- package/dist/transitions/paint-bleed.d.ts.map +1 -0
- package/dist/transitions/paint-bleed.js +59 -0
- package/dist/transitions/paint-bleed.js.map +1 -0
- package/dist/transitions/particle-assemble.d.ts +23 -0
- package/dist/transitions/particle-assemble.d.ts.map +1 -0
- package/dist/transitions/particle-assemble.js +65 -0
- package/dist/transitions/particle-assemble.js.map +1 -0
- package/dist/transitions/pinwheel.d.ts +11 -0
- package/dist/transitions/pinwheel.d.ts.map +1 -0
- package/dist/transitions/pinwheel.js +40 -0
- package/dist/transitions/pinwheel.js.map +1 -0
- package/dist/transitions/pixelate.d.ts +4 -0
- package/dist/transitions/pixelate.d.ts.map +1 -0
- package/dist/transitions/pixelate.js +26 -0
- package/dist/transitions/pixelate.js.map +1 -0
- package/dist/transitions/plasma-pulse.d.ts.map +1 -0
- package/dist/transitions/plasma-pulse.js +92 -0
- package/dist/transitions/plasma-pulse.js.map +1 -0
- package/dist/transitions/polka-dots-curtain.d.ts +13 -0
- package/dist/transitions/polka-dots-curtain.d.ts.map +1 -0
- package/dist/transitions/polka-dots-curtain.js +46 -0
- package/dist/transitions/polka-dots-curtain.js.map +1 -0
- package/dist/transitions/polygon-flip.d.ts +27 -0
- package/dist/transitions/polygon-flip.d.ts.map +1 -0
- package/dist/transitions/polygon-flip.js +97 -0
- package/dist/transitions/polygon-flip.js.map +1 -0
- package/dist/transitions/portal-dive.d.ts +18 -0
- package/dist/transitions/portal-dive.d.ts.map +1 -0
- package/dist/transitions/portal-dive.js +83 -0
- package/dist/transitions/portal-dive.js.map +1 -0
- package/dist/transitions/prism-split.d.ts +12 -0
- package/dist/transitions/prism-split.d.ts.map +1 -0
- package/dist/transitions/prism-split.js +52 -0
- package/dist/transitions/prism-split.js.map +1 -0
- package/dist/transitions/push.d.ts +4 -0
- package/dist/transitions/push.d.ts.map +1 -0
- package/dist/transitions/push.js +34 -0
- package/dist/transitions/push.js.map +1 -0
- package/dist/transitions/radial-reveal.d.ts +5 -0
- package/dist/transitions/radial-reveal.d.ts.map +1 -0
- package/dist/transitions/radial-reveal.js +31 -0
- package/dist/transitions/radial-reveal.js.map +1 -0
- package/dist/transitions/ripple-wave.d.ts +24 -0
- package/dist/transitions/ripple-wave.d.ts.map +1 -0
- package/dist/transitions/ripple-wave.js +135 -0
- package/dist/transitions/ripple-wave.js.map +1 -0
- package/dist/transitions/ripple.d.ts +7 -0
- package/dist/transitions/ripple.d.ts.map +1 -0
- package/dist/transitions/ripple.js +43 -0
- package/dist/transitions/ripple.js.map +1 -0
- package/dist/transitions/shape-reveal.d.ts +12 -0
- package/dist/transitions/shape-reveal.d.ts.map +1 -0
- package/dist/transitions/shape-reveal.js +53 -0
- package/dist/transitions/shape-reveal.js.map +1 -0
- package/dist/transitions/shockwave.d.ts +10 -0
- package/dist/transitions/shockwave.d.ts.map +1 -0
- package/dist/transitions/shockwave.js +56 -0
- package/dist/transitions/shockwave.js.map +1 -0
- package/dist/transitions/singularity.d.ts +22 -0
- package/dist/transitions/singularity.d.ts.map +1 -0
- package/dist/transitions/singularity.js +59 -0
- package/dist/transitions/singularity.js.map +1 -0
- package/dist/transitions/slide.d.ts +10 -0
- package/dist/transitions/slide.d.ts.map +1 -0
- package/dist/transitions/slide.js +76 -0
- package/dist/transitions/slide.js.map +1 -0
- package/dist/transitions/smoldering-edge.d.ts +15 -0
- package/dist/transitions/smoldering-edge.d.ts.map +1 -0
- package/dist/transitions/smoldering-edge.js +74 -0
- package/dist/transitions/smoldering-edge.js.map +1 -0
- package/dist/transitions/split.d.ts +14 -0
- package/dist/transitions/split.d.ts.map +1 -0
- package/dist/transitions/split.js +53 -0
- package/dist/transitions/split.js.map +1 -0
- package/dist/transitions/swirl.d.ts +12 -0
- package/dist/transitions/swirl.d.ts.map +1 -0
- package/dist/transitions/swirl.js +42 -0
- package/dist/transitions/swirl.js.map +1 -0
- package/dist/transitions/tangent-motion-blur.d.ts +13 -0
- package/dist/transitions/tangent-motion-blur.d.ts.map +1 -0
- package/dist/transitions/tangent-motion-blur.js +58 -0
- package/dist/transitions/tangent-motion-blur.js.map +1 -0
- package/dist/transitions/tile-scatter.d.ts +22 -0
- package/dist/transitions/tile-scatter.d.ts.map +1 -0
- package/dist/transitions/tile-scatter.js +122 -0
- package/dist/transitions/tile-scatter.js.map +1 -0
- package/dist/transitions/tilt-sweep.d.ts +11 -0
- package/dist/transitions/tilt-sweep.d.ts.map +1 -0
- package/dist/transitions/tilt-sweep.js +31 -0
- package/dist/transitions/tilt-sweep.js.map +1 -0
- package/dist/transitions/warp-zoom.d.ts +7 -0
- package/dist/transitions/warp-zoom.d.ts.map +1 -0
- package/dist/transitions/warp-zoom.js +70 -0
- package/dist/transitions/warp-zoom.js.map +1 -0
- package/dist/transitions/wave-stripes.d.ts +16 -0
- package/dist/transitions/wave-stripes.d.ts.map +1 -0
- package/dist/transitions/wave-stripes.js +55 -0
- package/dist/transitions/wave-stripes.js.map +1 -0
- package/dist/transitions/wave-wipe.d.ts +23 -0
- package/dist/transitions/wave-wipe.d.ts.map +1 -0
- package/dist/transitions/wave-wipe.js +84 -0
- package/dist/transitions/wave-wipe.js.map +1 -0
- package/dist/transitions/wind.d.ts +9 -0
- package/dist/transitions/wind.d.ts.map +1 -0
- package/dist/transitions/wind.js +48 -0
- package/dist/transitions/wind.js.map +1 -0
- package/dist/transitions/window-slice.d.ts +11 -0
- package/dist/transitions/window-slice.d.ts.map +1 -0
- package/dist/transitions/window-slice.js +34 -0
- package/dist/transitions/window-slice.js.map +1 -0
- package/dist/transitions/wipe-directional.d.ts +5 -0
- package/dist/transitions/wipe-directional.d.ts.map +1 -0
- package/dist/transitions/wipe-directional.js +26 -0
- package/dist/transitions/wipe-directional.js.map +1 -0
- package/dist/types.d.ts +78 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +56 -0
- package/src/__tests__/__screenshots__/endpoint-correctness.test.ts/endpoint-correctness---every-transition-must-be-pixel-pure-from-to-at-progress-0-1-rippleWave-at-progress-0-is-pure--from--1.png +0 -0
- package/src/__tests__/__screenshots__/endpoint-correctness.test.ts/endpoint-correctness---every-transition-must-be-pixel-pure-from-to-at-progress-0-1-rippleWave-at-progress-1-is-pure--to--1.png +0 -0
- package/src/__tests__/endpoint-correctness.test.ts +161 -0
- package/src/__tests__/readme.test.ts +39 -0
- package/src/__tests__/ssr.test.ts +45 -0
- package/src/index.ts +75 -0
- package/src/inputs/normalize.ts +1 -0
- package/src/runner/__tests__/__screenshots__/mesh.test.ts/buildSubdividedPlane-centroid-is-shared-across-a-face-and-equals-mean-of-its-3-positions-1.png +0 -0
- package/src/runner/__tests__/__screenshots__/mesh.test.ts/buildSubdividedPlane-uv-matches-aPosition---0-5---0-5-1.png +0 -0
- package/src/runner/__tests__/mesh.test.ts +128 -0
- package/src/runner/gl.ts +69 -0
- package/src/runner/mesh.ts +135 -0
- package/src/runner/runner.ts +528 -0
- package/src/transitions/all.ts +131 -0
- package/src/transitions/bloom-reveal.ts +106 -0
- package/src/transitions/chromatic-pulse.ts +40 -0
- package/src/transitions/clock-wipe.ts +33 -0
- package/src/transitions/color-phase.ts +24 -0
- package/src/transitions/cross-zoom.ts +59 -0
- package/src/transitions/crosshatch.ts +49 -0
- package/src/transitions/define.ts +56 -0
- package/src/transitions/directional-burn.ts +67 -0
- package/src/transitions/directional-warp.ts +46 -0
- package/src/transitions/dissolve.ts +16 -0
- package/src/transitions/dreamy-zoom.ts +66 -0
- package/src/transitions/dreamy.ts +26 -0
- package/src/transitions/drip-wipe.ts +109 -0
- package/src/transitions/ember-scatter.ts +94 -0
- package/src/transitions/film-burn.ts +101 -0
- package/src/transitions/film-grain.ts +78 -0
- package/src/transitions/flow-warp.ts +51 -0
- package/src/transitions/fluid-flow.ts +94 -0
- package/src/transitions/glass-shatter.ts +86 -0
- package/src/transitions/glitch.ts +59 -0
- package/src/transitions/god-rays-reveal.ts +110 -0
- package/src/transitions/gravity-pull.ts +65 -0
- package/src/transitions/grid-reveal.ts +53 -0
- package/src/transitions/heat-haze.ts +51 -0
- package/src/transitions/index.ts +63 -0
- package/src/transitions/ink-bloom.ts +76 -0
- package/src/transitions/ink-diffuse.ts +90 -0
- package/src/transitions/iris-zoom.ts +67 -0
- package/src/transitions/kinetic-bands.ts +58 -0
- package/src/transitions/lenticular-flip.ts +73 -0
- package/src/transitions/light-leak.ts +43 -0
- package/src/transitions/linear-blur.ts +40 -0
- package/src/transitions/liquid-chrome.ts +114 -0
- package/src/transitions/liquid-morph.ts +50 -0
- package/src/transitions/lumina-melt.ts +36 -0
- package/src/transitions/mosaic.ts +58 -0
- package/src/transitions/noise-dissolve.ts +41 -0
- package/src/transitions/page-curl.ts +165 -0
- package/src/transitions/paint-bleed.ts +59 -0
- package/src/transitions/pinwheel.ts +40 -0
- package/src/transitions/pixelate.ts +26 -0
- package/src/transitions/polka-dots-curtain.ts +46 -0
- package/src/transitions/polygon-flip.ts +97 -0
- package/src/transitions/portal-dive.ts +83 -0
- package/src/transitions/prism-split.ts +52 -0
- package/src/transitions/push.ts +34 -0
- package/src/transitions/radial-reveal.ts +31 -0
- package/src/transitions/ripple-wave.ts +135 -0
- package/src/transitions/ripple.ts +43 -0
- package/src/transitions/shape-reveal.ts +53 -0
- package/src/transitions/shockwave.ts +56 -0
- package/src/transitions/singularity.ts +59 -0
- package/src/transitions/slide.ts +76 -0
- package/src/transitions/smoldering-edge.ts +74 -0
- package/src/transitions/split.ts +53 -0
- package/src/transitions/swirl.ts +42 -0
- package/src/transitions/tangent-motion-blur.ts +58 -0
- package/src/transitions/tile-scatter.ts +122 -0
- package/src/transitions/warp-zoom.ts +70 -0
- package/src/transitions/wave-stripes.ts +55 -0
- package/src/transitions/wind.ts +48 -0
- package/src/transitions/wipe-directional.ts +26 -0
- package/src/types.ts +87 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { defineTransition } from "./define.js";
|
|
2
|
+
/**
|
|
3
|
+
* Multi-pass transition. A noise-seeded mask grows outward via iterated
|
|
4
|
+
* dilation with an expanding kernel, producing an ink-in-water spread
|
|
5
|
+
* that can't be computed in a single pass (each pixel has to read its
|
|
6
|
+
* neighbours' mask values from the previous iteration).
|
|
7
|
+
*
|
|
8
|
+
* pass 0 — seed the mask by thresholding a noise field
|
|
9
|
+
* against progress. At progress 0 all zero;
|
|
10
|
+
* at progress 1 all one; in between, a noisy
|
|
11
|
+
* boundary seeded where noise ≈ progress.
|
|
12
|
+
* pass 1..passCount-2 — dilate the mask with an expanding kernel
|
|
13
|
+
* (step doubles each pass: 1, 2, 4, 8, 16 px),
|
|
14
|
+
* biased with a light smoothing so edges
|
|
15
|
+
* stay organic.
|
|
16
|
+
* final pass — use the diffused mask to mix from → to.
|
|
17
|
+
*
|
|
18
|
+
* Endpoints: seed saturates to 0 at progress 0 and 1 at progress 1
|
|
19
|
+
* regardless of the noise field. Dilation is monotone on constants,
|
|
20
|
+
* so the mask stays saturated through every pass, and the final
|
|
21
|
+
* composition resolves to pure from / to.
|
|
22
|
+
*/
|
|
23
|
+
export const inkDiffuse = defineTransition({
|
|
24
|
+
name: "ink-diffuse",
|
|
25
|
+
passes: 7,
|
|
26
|
+
defaults: {
|
|
27
|
+
scale: 7,
|
|
28
|
+
softness: 0.08,
|
|
29
|
+
},
|
|
30
|
+
glsl: `
|
|
31
|
+
uniform float uScale;
|
|
32
|
+
uniform float uSoftness;
|
|
33
|
+
|
|
34
|
+
float hash21(vec2 p) {
|
|
35
|
+
return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
float valNoise(vec2 p) {
|
|
39
|
+
vec2 i = floor(p);
|
|
40
|
+
vec2 f = fract(p);
|
|
41
|
+
f = f * f * (3.0 - 2.0 * f);
|
|
42
|
+
float a = hash21(i);
|
|
43
|
+
float b = hash21(i + vec2(1.0, 0.0));
|
|
44
|
+
float c = hash21(i + vec2(0.0, 1.0));
|
|
45
|
+
float d = hash21(i + vec2(1.0, 1.0));
|
|
46
|
+
return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
float fbm(vec2 p) {
|
|
50
|
+
return valNoise(p) * 0.55 +
|
|
51
|
+
valNoise(p * 2.1) * 0.28 +
|
|
52
|
+
valNoise(p * 4.3) * 0.17;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
vec4 transition(vec2 uv) {
|
|
56
|
+
// Final pass: use the diffused mask to composite from/to.
|
|
57
|
+
if (uPass == uPassCount - 1) {
|
|
58
|
+
float mask = getPrevious(uv).r;
|
|
59
|
+
return mix(getFromColor(uv), getToColor(uv), mask);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Seed pass: threshold noise by progress. Clamped noise range
|
|
63
|
+
// [0.05, 0.95] plus a soft edge guarantees the mask saturates to 0
|
|
64
|
+
// at progress=0 and 1 at progress=1, for every pixel.
|
|
65
|
+
if (uPass == 0) {
|
|
66
|
+
float n = clamp(fbm(uv * uScale) * 0.9 + 0.05, 0.05, 0.95);
|
|
67
|
+
float mask = smoothstep(n - uSoftness, n + uSoftness, uProgress);
|
|
68
|
+
return vec4(mask, 0.0, 0.0, 1.0);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Diffusion pass: expanding-kernel dilation blended with light
|
|
72
|
+
// neighbour-averaging. Step doubles each pass for an effective
|
|
73
|
+
// reach of ~2^(passCount-2) pixels by the last iteration.
|
|
74
|
+
float step = pow(2.0, float(uPass - 1));
|
|
75
|
+
vec2 px = vec2(step) / uResolution;
|
|
76
|
+
float c = getPrevious(uv).r;
|
|
77
|
+
float e = getPrevious(uv + vec2(px.x, 0.0)).r;
|
|
78
|
+
float w = getPrevious(uv - vec2(px.x, 0.0)).r;
|
|
79
|
+
float n = getPrevious(uv + vec2(0.0, px.y)).r;
|
|
80
|
+
float s = getPrevious(uv - vec2(0.0, px.y)).r;
|
|
81
|
+
|
|
82
|
+
float dilated = max(c, max(max(e, w), max(n, s)));
|
|
83
|
+
float avg = (c + e + w + n + s) * 0.2;
|
|
84
|
+
float nextMask = mix(dilated, avg, 0.3);
|
|
85
|
+
|
|
86
|
+
return vec4(nextMask, 0.0, 0.0, 1.0);
|
|
87
|
+
}
|
|
88
|
+
`,
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=ink-diffuse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ink-diffuse.js","sourceRoot":"","sources":["../../src/transitions/ink-diffuse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,gBAAgB,CAAC;IACzC,IAAI,EAAE,aAAa;IACnB,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE;QACR,KAAK,EAAE,CAAC;QACR,QAAQ,EAAE,IAAI;KACf;IACD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0DP;CACA,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inspired by akella demo3 (made procedural — original used a baked
|
|
3
|
+
* displacement-map texture that we don't yet support). Circular reveal
|
|
4
|
+
* with a noise-perturbed edge AND bidirectional zoom: from-image shrinks
|
|
5
|
+
* to center while to-image grows from center. Sibling to film-burn but
|
|
6
|
+
* without the flame glow and with the akella zoom-shift on top.
|
|
7
|
+
*/
|
|
8
|
+
export declare const irisZoom: import("../types.js").Transition<import("@vysmo/gl-core").Widen<{
|
|
9
|
+
readonly center: readonly [0.5, 0.5];
|
|
10
|
+
readonly width: 0.08;
|
|
11
|
+
readonly scale: 8;
|
|
12
|
+
}>>;
|
|
13
|
+
//# sourceMappingURL=iris-zoom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iris-zoom.d.ts","sourceRoot":"","sources":["../../src/transitions/iris-zoom.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ;;;;GAyDnB,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { defineTransition } from "./define.js";
|
|
2
|
+
/**
|
|
3
|
+
* Inspired by akella demo3 (made procedural — original used a baked
|
|
4
|
+
* displacement-map texture that we don't yet support). Circular reveal
|
|
5
|
+
* with a noise-perturbed edge AND bidirectional zoom: from-image shrinks
|
|
6
|
+
* to center while to-image grows from center. Sibling to film-burn but
|
|
7
|
+
* without the flame glow and with the akella zoom-shift on top.
|
|
8
|
+
*/
|
|
9
|
+
export const irisZoom = defineTransition({
|
|
10
|
+
name: "iris-zoom",
|
|
11
|
+
defaults: {
|
|
12
|
+
center: [0.5, 0.5],
|
|
13
|
+
width: 0.08,
|
|
14
|
+
scale: 8,
|
|
15
|
+
},
|
|
16
|
+
glsl: `
|
|
17
|
+
uniform vec2 uCenter;
|
|
18
|
+
uniform float uWidth;
|
|
19
|
+
uniform float uScale;
|
|
20
|
+
|
|
21
|
+
float hash21(vec2 p) {
|
|
22
|
+
return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
float valueNoise(vec2 p) {
|
|
26
|
+
vec2 i = floor(p);
|
|
27
|
+
vec2 f = fract(p);
|
|
28
|
+
f = f * f * (3.0 - 2.0 * f);
|
|
29
|
+
float a = hash21(i);
|
|
30
|
+
float b = hash21(i + vec2(1.0, 0.0));
|
|
31
|
+
float c = hash21(i + vec2(0.0, 1.0));
|
|
32
|
+
float d = hash21(i + vec2(1.0, 1.0));
|
|
33
|
+
return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
vec4 transition(vec2 uv) {
|
|
37
|
+
// Aspect-correct distance from the iris center, normalized to [0,1] by
|
|
38
|
+
// the farthest canvas corner.
|
|
39
|
+
vec2 pixel = uv * uResolution;
|
|
40
|
+
vec2 centerPx = uCenter * uResolution;
|
|
41
|
+
float dist = distance(pixel, centerPx);
|
|
42
|
+
float maxDist = max(
|
|
43
|
+
max(length(centerPx), length(centerPx - vec2(uResolution.x, 0.0))),
|
|
44
|
+
max(length(centerPx - vec2(0.0, uResolution.y)), length(centerPx - uResolution))
|
|
45
|
+
);
|
|
46
|
+
float normalizedDist = dist / max(maxDist, 0.0001);
|
|
47
|
+
|
|
48
|
+
float noiseStrength = 0.12;
|
|
49
|
+
float n = valueNoise(uv * uScale);
|
|
50
|
+
float perturbed = normalizedDist - (n - 0.5) * noiseStrength;
|
|
51
|
+
|
|
52
|
+
float totalEdge = uWidth + noiseStrength * 0.5;
|
|
53
|
+
float radius = uProgress * (1.0 + 2.0 * totalEdge) - totalEdge;
|
|
54
|
+
float signedDist = perturbed - radius;
|
|
55
|
+
|
|
56
|
+
// intpl: 0 = unburned (from), 1 = revealed (to).
|
|
57
|
+
float intpl = 1.0 - smoothstep(-uWidth, uWidth, signedDist);
|
|
58
|
+
|
|
59
|
+
// Bidirectional zoom: from shrinks to center, to grows from center.
|
|
60
|
+
vec2 fromUv = clamp((uv - 0.5) * (1.0 - intpl) + 0.5, 0.0, 1.0);
|
|
61
|
+
vec2 toUv = clamp((uv - 0.5) * intpl + 0.5, 0.0, 1.0);
|
|
62
|
+
|
|
63
|
+
return mix(getFromColor(fromUv), getToColor(toUv), intpl);
|
|
64
|
+
}
|
|
65
|
+
`,
|
|
66
|
+
});
|
|
67
|
+
//# sourceMappingURL=iris-zoom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iris-zoom.js","sourceRoot":"","sources":["../../src/transitions/iris-zoom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;IACvC,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE;QACR,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC;QAClB,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,CAAC;KACT;IACD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDP;CACA,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kinetic-bands.d.ts","sourceRoot":"","sources":["../../src/transitions/kinetic-bands.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY;;;;;GAuDvB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { defineTransition } from "./define.js";
|
|
2
|
+
export const kineticBands = defineTransition({
|
|
3
|
+
name: "kinetic-bands",
|
|
4
|
+
defaults: {
|
|
5
|
+
count: 12,
|
|
6
|
+
stagger: 0.6,
|
|
7
|
+
softness: 0.02,
|
|
8
|
+
direction: [1, 0],
|
|
9
|
+
},
|
|
10
|
+
glsl: `
|
|
11
|
+
uniform float uCount;
|
|
12
|
+
uniform float uStagger;
|
|
13
|
+
uniform float uSoftness;
|
|
14
|
+
uniform vec2 uDirection;
|
|
15
|
+
|
|
16
|
+
// Snap to nearest axis-aligned unit. Diagonals would tilt the bands away
|
|
17
|
+
// from the natural horizontal stack and the boundary math would no longer
|
|
18
|
+
// align with the band's own progress envelope. Enforced in-shader so the
|
|
19
|
+
// UI's axis-only picker matches.
|
|
20
|
+
vec2 snapAxis(vec2 v) {
|
|
21
|
+
vec2 dn = normalize(v);
|
|
22
|
+
return abs(dn.x) > abs(dn.y) ? vec2(sign(dn.x), 0.0) : vec2(0.0, sign(dn.y));
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
vec4 transition(vec2 uv) {
|
|
26
|
+
// count=1 collapses to a single full-frame slide; not "kinetic bands".
|
|
27
|
+
// Clamp here so the transition is reliable regardless of caller input.
|
|
28
|
+
float count = max(uCount, 2.0);
|
|
29
|
+
|
|
30
|
+
vec2 d = snapAxis(uDirection);
|
|
31
|
+
|
|
32
|
+
// Bands run perpendicular to the sweep direction. For a horizontal sweep
|
|
33
|
+
// (Right/Left), bands are horizontal stripes stacked vertically (indexed
|
|
34
|
+
// by uv.y). For a vertical sweep (Up/Down), bands are vertical stripes
|
|
35
|
+
// stacked horizontally (indexed by uv.x). Otherwise the bands and sweep
|
|
36
|
+
// axis are mismatched and the effect looks broken.
|
|
37
|
+
bool horizontalBands = abs(d.x) > abs(d.y);
|
|
38
|
+
float bandCoord = horizontalBands ? uv.y : uv.x;
|
|
39
|
+
float band = floor(bandCoord * count);
|
|
40
|
+
float bandPos = (band + 0.5) / count;
|
|
41
|
+
|
|
42
|
+
// Each band starts at bandPos * stagger and runs for (1 - stagger) of time.
|
|
43
|
+
float start = bandPos * uStagger;
|
|
44
|
+
float window = max(0.0001, 1.0 - uStagger);
|
|
45
|
+
float localProgress = clamp((uProgress - start) / window, 0.0, 1.0);
|
|
46
|
+
|
|
47
|
+
// Within the band, run a slide-style sweep so each band has its own
|
|
48
|
+
// endpoint-correct mini-transition.
|
|
49
|
+
float maxProj = 0.5;
|
|
50
|
+
float projected = dot(uv - 0.5, -d);
|
|
51
|
+
float boundary = (maxProj + uSoftness) * (1.0 - 2.0 * localProgress);
|
|
52
|
+
float w = smoothstep(boundary - uSoftness, boundary + uSoftness, projected);
|
|
53
|
+
|
|
54
|
+
return mix(getFromColor(uv), getToColor(uv), w);
|
|
55
|
+
}
|
|
56
|
+
`,
|
|
57
|
+
});
|
|
58
|
+
//# sourceMappingURL=kinetic-bands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kinetic-bands.js","sourceRoot":"","sources":["../../src/transitions/kinetic-bands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,CAAC,MAAM,YAAY,GAAG,gBAAgB,CAAC;IAC3C,IAAI,EAAE,eAAe;IACrB,QAAQ,EAAE;QACR,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,GAAG;QACZ,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;KAClB;IACD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8CP;CACA,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hologram-card flip. The frame is divided into vertical strips, each
|
|
3
|
+
* modelled as a narrow rectangle that rotates around its vertical axis
|
|
4
|
+
* from 0 (showing from face-on) through 90° (edge-on — content pinches
|
|
5
|
+
* to zero width) to 180° (showing to face-on). Flip timing is
|
|
6
|
+
* staggered across strips left → right, so a wavefront of flipping
|
|
7
|
+
* strips sweeps across the image.
|
|
8
|
+
*
|
|
9
|
+
* Perspective is faked by compressing strip content to fit the
|
|
10
|
+
* visible half-width |cos(rotation)| · stripWidth/2. When a strip is
|
|
11
|
+
* edge-on, its visible half-width is zero and every pixel falls into
|
|
12
|
+
* the "crease" region, which fills with a mix(from, to, flipT) so
|
|
13
|
+
* the full-frame rule holds (no black cracks).
|
|
14
|
+
*
|
|
15
|
+
* Endpoints: at progress 0 every strip is at flipT=0 (cos=1, full
|
|
16
|
+
* visibility, sampling from at the correct uv). At progress 1 every
|
|
17
|
+
* strip is at flipT=1 (cos=-1, full visibility, sampling to).
|
|
18
|
+
*/
|
|
19
|
+
export declare const lenticularFlip: import("../types.js").Transition<import("@vysmo/gl-core").Widen<{
|
|
20
|
+
readonly stripCount: 22;
|
|
21
|
+
}>>;
|
|
22
|
+
//# sourceMappingURL=lenticular-flip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lenticular-flip.d.ts","sourceRoot":"","sources":["../../src/transitions/lenticular-flip.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,cAAc;;GAoDzB,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { defineTransition } from "./define.js";
|
|
2
|
+
/**
|
|
3
|
+
* Hologram-card flip. The frame is divided into vertical strips, each
|
|
4
|
+
* modelled as a narrow rectangle that rotates around its vertical axis
|
|
5
|
+
* from 0 (showing from face-on) through 90° (edge-on — content pinches
|
|
6
|
+
* to zero width) to 180° (showing to face-on). Flip timing is
|
|
7
|
+
* staggered across strips left → right, so a wavefront of flipping
|
|
8
|
+
* strips sweeps across the image.
|
|
9
|
+
*
|
|
10
|
+
* Perspective is faked by compressing strip content to fit the
|
|
11
|
+
* visible half-width |cos(rotation)| · stripWidth/2. When a strip is
|
|
12
|
+
* edge-on, its visible half-width is zero and every pixel falls into
|
|
13
|
+
* the "crease" region, which fills with a mix(from, to, flipT) so
|
|
14
|
+
* the full-frame rule holds (no black cracks).
|
|
15
|
+
*
|
|
16
|
+
* Endpoints: at progress 0 every strip is at flipT=0 (cos=1, full
|
|
17
|
+
* visibility, sampling from at the correct uv). At progress 1 every
|
|
18
|
+
* strip is at flipT=1 (cos=-1, full visibility, sampling to).
|
|
19
|
+
*/
|
|
20
|
+
export const lenticularFlip = defineTransition({
|
|
21
|
+
name: "lenticular-flip",
|
|
22
|
+
defaults: {
|
|
23
|
+
stripCount: 22,
|
|
24
|
+
},
|
|
25
|
+
glsl: `
|
|
26
|
+
uniform float uStripCount;
|
|
27
|
+
|
|
28
|
+
vec4 transition(vec2 uv) {
|
|
29
|
+
// stripCount<3 collapses to a single full-canvas flip (1) or a half-and-half
|
|
30
|
+
// (2) — neither reads as "lenticular". Clamp here so the transition is
|
|
31
|
+
// reliable regardless of caller input.
|
|
32
|
+
float stripCount = max(uStripCount, 3.0);
|
|
33
|
+
|
|
34
|
+
float stripF = uv.x * stripCount;
|
|
35
|
+
float stripIdx = floor(stripF);
|
|
36
|
+
float localU = fract(stripF);
|
|
37
|
+
|
|
38
|
+
// Staggered flip timing: each strip flips over a window of 0.5 in
|
|
39
|
+
// progress. The window's start scales from 0 (leftmost strip) to
|
|
40
|
+
// 0.5 (rightmost strip), so the wave finishes exactly at progress 1.
|
|
41
|
+
float stripStart = stripIdx / stripCount;
|
|
42
|
+
float windowStart = stripStart * 0.5;
|
|
43
|
+
float flipT = smoothstep(windowStart, windowStart + 0.5, uProgress);
|
|
44
|
+
|
|
45
|
+
// Strip rotation: 0 at flipT=0, PI at flipT=1.
|
|
46
|
+
float rotAngle = flipT * 3.14159265;
|
|
47
|
+
float cosRot = cos(rotAngle);
|
|
48
|
+
float visibleHalfWidth = abs(cosRot) * 0.5;
|
|
49
|
+
|
|
50
|
+
// Local coord centred in the strip, range [-0.5, 0.5].
|
|
51
|
+
float centered = localU - 0.5;
|
|
52
|
+
|
|
53
|
+
// Decompress: map visible [-vhw, vhw] back to [0, 1] strip-local,
|
|
54
|
+
// clamped so out-of-window pixels sample the strip's edge cleanly
|
|
55
|
+
// (instead of out-of-strip or out-of-canvas).
|
|
56
|
+
float decompressed = clamp((centered / max(visibleHalfWidth, 0.0001) + 1.0) * 0.5, 0.0, 1.0);
|
|
57
|
+
vec2 sampleUv = vec2((stripIdx + decompressed) / stripCount, uv.y);
|
|
58
|
+
vec4 stripColor = cosRot >= 0.0 ? getFromColor(sampleUv) : getToColor(sampleUv);
|
|
59
|
+
|
|
60
|
+
// Crease fallback: outside the visible window, crossfade from→to so
|
|
61
|
+
// we never emit a black pixel. Feather across a small band at the
|
|
62
|
+
// boundary so the spatial edge between "compressed strip sample" and
|
|
63
|
+
// "crossfade crease" doesn't read as a 1-pixel flickering line —
|
|
64
|
+
// those two values are computed from completely different source
|
|
65
|
+
// positions and the hard step between them was the visible artifact.
|
|
66
|
+
vec4 creaseColor = mix(getFromColor(uv), getToColor(uv), flipT);
|
|
67
|
+
float feather = 1.0 / stripCount * 0.04;
|
|
68
|
+
float t = smoothstep(visibleHalfWidth - feather, visibleHalfWidth + feather, abs(centered));
|
|
69
|
+
return mix(stripColor, creaseColor, t);
|
|
70
|
+
}
|
|
71
|
+
`,
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=lenticular-flip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lenticular-flip.js","sourceRoot":"","sources":["../../src/transitions/lenticular-flip.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;IAC7C,IAAI,EAAE,iBAAiB;IACvB,QAAQ,EAAE;QACR,UAAU,EAAE,EAAE;KACf;IACD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8CP;CACA,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const lightLeak: import("../types.js").Transition<import("@vysmo/gl-core").Widen<{
|
|
2
|
+
readonly direction: readonly [1, 0];
|
|
3
|
+
readonly color: readonly [1, 0.85, 0.55];
|
|
4
|
+
readonly bandWidth: 0.2;
|
|
5
|
+
readonly intensity: 1;
|
|
6
|
+
}>>;
|
|
7
|
+
//# sourceMappingURL=light-leak.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"light-leak.d.ts","sourceRoot":"","sources":["../../src/transitions/light-leak.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS;;;;;GAwCpB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { defineTransition } from "./define.js";
|
|
2
|
+
export const lightLeak = defineTransition({
|
|
3
|
+
name: "light-leak",
|
|
4
|
+
defaults: {
|
|
5
|
+
direction: [1, 0],
|
|
6
|
+
color: [1.0, 0.85, 0.55],
|
|
7
|
+
bandWidth: 0.2,
|
|
8
|
+
intensity: 1.0,
|
|
9
|
+
},
|
|
10
|
+
glsl: `
|
|
11
|
+
uniform vec2 uDirection;
|
|
12
|
+
uniform vec3 uColor;
|
|
13
|
+
uniform float uBandWidth;
|
|
14
|
+
uniform float uIntensity;
|
|
15
|
+
|
|
16
|
+
vec4 transition(vec2 uv) {
|
|
17
|
+
vec2 d = normalize(uDirection);
|
|
18
|
+
// Scale by maxProj so diagonal directions clear corners at endpoints
|
|
19
|
+
// (see paint-bleed.ts).
|
|
20
|
+
float maxProj = max((abs(d.x) + abs(d.y)) * 0.5, 0.0001);
|
|
21
|
+
float projected = dot(uv - 0.5, -d);
|
|
22
|
+
|
|
23
|
+
// Boundary sweeps from just beyond the trailing edge to just beyond the
|
|
24
|
+
// leading edge (offset by bandWidth so the bloom zone clears both edges
|
|
25
|
+
// cleanly at the endpoints).
|
|
26
|
+
float boundary = (maxProj + uBandWidth) * (1.0 - 2.0 * uProgress);
|
|
27
|
+
|
|
28
|
+
// Which side of the boundary? 0 = still from, 1 = already to.
|
|
29
|
+
float sweep = smoothstep(-uBandWidth * 0.5, uBandWidth * 0.5, projected - boundary);
|
|
30
|
+
vec4 baseColor = mix(getFromColor(uv), getToColor(uv), sweep);
|
|
31
|
+
|
|
32
|
+
// Gaussian-ish bloom centered on the boundary, scaled to zero at endpoints.
|
|
33
|
+
float env = 4.0 * uProgress * (1.0 - uProgress);
|
|
34
|
+
float distToBand = abs(projected - boundary);
|
|
35
|
+
float bandX = distToBand / max(uBandWidth, 0.0001);
|
|
36
|
+
float bandIntensity = exp(-bandX * bandX * 4.0) * env * uIntensity;
|
|
37
|
+
|
|
38
|
+
vec3 bloomed = baseColor.rgb + uColor * bandIntensity;
|
|
39
|
+
return vec4(bloomed, baseColor.a);
|
|
40
|
+
}
|
|
41
|
+
`,
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=light-leak.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"light-leak.js","sourceRoot":"","sources":["../../src/transitions/light-leak.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,CAAC,MAAM,SAAS,GAAG,gBAAgB,CAAC;IACxC,IAAI,EAAE,YAAY;IAClB,QAAQ,EAAE;QACR,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACjB,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC;QACxB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf;IACD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BP;CACA,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A jagged lightning bolt flashes across the frame and the strike
|
|
3
|
+
* lights up the scene. Three parallel fractal paths (fbm-perturbed
|
|
4
|
+
* vertical lines at decreasing scales) give a branching look; the
|
|
5
|
+
* nearest-path distance drives a bright core + wider glow. A
|
|
6
|
+
* 4·p·(1-p) flash envelope peaks at mid-progress, so the whole scene
|
|
7
|
+
* whites up momentarily at strike time before settling into to.
|
|
8
|
+
*
|
|
9
|
+
* from-to crossfade is separate from the flash (monotonic smoothstep
|
|
10
|
+
* across progress), so the hand-off reads as "lightning reveals what
|
|
11
|
+
* was behind" rather than a regular wipe with a light effect tacked
|
|
12
|
+
* on.
|
|
13
|
+
*
|
|
14
|
+
* Endpoints: flash envelope is zero at progress 0 and 1, so no
|
|
15
|
+
* synthetic luminance leaks into either endpoint. Crossfade saturates
|
|
16
|
+
* to 0 at progress 0 and 1 at progress 1. Output is pixel-pure
|
|
17
|
+
* from / to respectively.
|
|
18
|
+
*/
|
|
19
|
+
export declare const lightningStrike: import("../types.js").Transition<import("../types.js").Widen<{
|
|
20
|
+
readonly intensity: 1;
|
|
21
|
+
}>>;
|
|
22
|
+
//# sourceMappingURL=lightning-strike.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lightning-strike.d.ts","sourceRoot":"","sources":["../../src/transitions/lightning-strike.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,eAAe;;GAqE1B,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { defineTransition } from "./define.js";
|
|
2
|
+
/**
|
|
3
|
+
* A jagged lightning bolt flashes across the frame and the strike
|
|
4
|
+
* lights up the scene. Three parallel fractal paths (fbm-perturbed
|
|
5
|
+
* vertical lines at decreasing scales) give a branching look; the
|
|
6
|
+
* nearest-path distance drives a bright core + wider glow. A
|
|
7
|
+
* 4·p·(1-p) flash envelope peaks at mid-progress, so the whole scene
|
|
8
|
+
* whites up momentarily at strike time before settling into to.
|
|
9
|
+
*
|
|
10
|
+
* from-to crossfade is separate from the flash (monotonic smoothstep
|
|
11
|
+
* across progress), so the hand-off reads as "lightning reveals what
|
|
12
|
+
* was behind" rather than a regular wipe with a light effect tacked
|
|
13
|
+
* on.
|
|
14
|
+
*
|
|
15
|
+
* Endpoints: flash envelope is zero at progress 0 and 1, so no
|
|
16
|
+
* synthetic luminance leaks into either endpoint. Crossfade saturates
|
|
17
|
+
* to 0 at progress 0 and 1 at progress 1. Output is pixel-pure
|
|
18
|
+
* from / to respectively.
|
|
19
|
+
*/
|
|
20
|
+
export const lightningStrike = defineTransition({
|
|
21
|
+
name: "lightning-strike",
|
|
22
|
+
defaults: {
|
|
23
|
+
intensity: 1.0,
|
|
24
|
+
},
|
|
25
|
+
glsl: `
|
|
26
|
+
uniform float uIntensity;
|
|
27
|
+
|
|
28
|
+
float hash21(vec2 p) {
|
|
29
|
+
return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
float valNoise(vec2 p) {
|
|
33
|
+
vec2 i = floor(p);
|
|
34
|
+
vec2 f = fract(p);
|
|
35
|
+
f = f * f * (3.0 - 2.0 * f);
|
|
36
|
+
float a = hash21(i);
|
|
37
|
+
float b = hash21(i + vec2(1.0, 0.0));
|
|
38
|
+
float c = hash21(i + vec2(0.0, 1.0));
|
|
39
|
+
float d = hash21(i + vec2(1.0, 1.0));
|
|
40
|
+
return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
float fbm(vec2 p) {
|
|
44
|
+
return valNoise(p) * 0.55 +
|
|
45
|
+
valNoise(p * 2.1) * 0.28 +
|
|
46
|
+
valNoise(p * 4.3) * 0.17;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// One fractal lightning path: a vertical line at x ≈ 0.5 perturbed
|
|
50
|
+
// by noise at three decreasing scales, giving fractal jaggedness.
|
|
51
|
+
float boltPath(float y, float seed) {
|
|
52
|
+
float x = 0.5;
|
|
53
|
+
x += (fbm(vec2(y * 2.0, seed)) * 2.0 - 1.0) * 0.22;
|
|
54
|
+
x += (fbm(vec2(y * 6.0, seed + 1.3)) * 2.0 - 1.0) * 0.08;
|
|
55
|
+
x += (fbm(vec2(y * 18.0, seed + 2.7)) * 2.0 - 1.0) * 0.025;
|
|
56
|
+
return x;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Nearest-bolt distance across three parallel paths — the min is the
|
|
60
|
+
// distance to the nearest "branch".
|
|
61
|
+
float boltDist(vec2 uv) {
|
|
62
|
+
float d1 = abs(uv.x - boltPath(uv.y, 0.0));
|
|
63
|
+
float d2 = abs(uv.x - boltPath(uv.y, 5.4));
|
|
64
|
+
float d3 = abs(uv.x - boltPath(uv.y, 11.1));
|
|
65
|
+
return min(d1, min(d2, d3));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
vec4 transition(vec2 uv) {
|
|
69
|
+
// Base: a gently-soft from→to crossfade that runs alongside the flash.
|
|
70
|
+
float blend = smoothstep(0.15, 0.85, uProgress);
|
|
71
|
+
vec3 base = mix(getFromColor(uv).rgb, getToColor(uv).rgb, blend);
|
|
72
|
+
|
|
73
|
+
// Flash envelope: zero at both endpoints, peaks at mid.
|
|
74
|
+
float flash = 4.0 * uProgress * (1.0 - uProgress);
|
|
75
|
+
float d = boltDist(uv);
|
|
76
|
+
|
|
77
|
+
// Bright hot core right on the bolt, wider electric halo around.
|
|
78
|
+
float core = (1.0 - smoothstep(0.0, 0.004, d)) * flash;
|
|
79
|
+
float halo = (1.0 - smoothstep(0.004, 0.08, d)) * flash * 0.35;
|
|
80
|
+
|
|
81
|
+
// Content-derived brightening: push base toward white by an amount
|
|
82
|
+
// proportional to core + halo. Keeps output inside "meaningful
|
|
83
|
+
// content" rather than injecting synthetic colour.
|
|
84
|
+
vec3 litBase = base + (1.0 - base) * (core + halo) * uIntensity;
|
|
85
|
+
|
|
86
|
+
return vec4(litBase, 1.0);
|
|
87
|
+
}
|
|
88
|
+
`,
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=lightning-strike.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lightning-strike.js","sourceRoot":"","sources":["../../src/transitions/lightning-strike.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAC;IAC9C,IAAI,EAAE,kBAAkB;IACxB,QAAQ,EAAE;QACR,SAAS,EAAE,GAAG;KACf;IACD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+DP;CACA,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Directional linear blur. 32 samples along a configurable axis, avoiding
|
|
3
|
+
* the 2D grid artifacts that box-blur kernels produce at high displacement.
|
|
4
|
+
* Blur amount peaks at the midpoint (triangular envelope), linear crossfade
|
|
5
|
+
* across the full progress range.
|
|
6
|
+
*/
|
|
7
|
+
export declare const linearBlur: import("../types.js").Transition<import("@vysmo/gl-core").Widen<{
|
|
8
|
+
readonly direction: readonly [1, 0];
|
|
9
|
+
readonly intensity: 0.1;
|
|
10
|
+
}>>;
|
|
11
|
+
//# sourceMappingURL=linear-blur.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear-blur.d.ts","sourceRoot":"","sources":["../../src/transitions/linear-blur.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,eAAO,MAAM,UAAU;;;GA+BrB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { defineTransition } from "./define.js";
|
|
2
|
+
/**
|
|
3
|
+
* Directional linear blur. 32 samples along a configurable axis, avoiding
|
|
4
|
+
* the 2D grid artifacts that box-blur kernels produce at high displacement.
|
|
5
|
+
* Blur amount peaks at the midpoint (triangular envelope), linear crossfade
|
|
6
|
+
* across the full progress range.
|
|
7
|
+
*/
|
|
8
|
+
export const linearBlur = defineTransition({
|
|
9
|
+
name: "linear-blur",
|
|
10
|
+
defaults: {
|
|
11
|
+
direction: [1, 0],
|
|
12
|
+
intensity: 0.1,
|
|
13
|
+
},
|
|
14
|
+
glsl: `
|
|
15
|
+
uniform vec2 uDirection;
|
|
16
|
+
uniform float uIntensity;
|
|
17
|
+
|
|
18
|
+
const int SAMPLES = 32;
|
|
19
|
+
|
|
20
|
+
vec4 transition(vec2 uv) {
|
|
21
|
+
vec2 d = normalize(uDirection);
|
|
22
|
+
// Triangular envelope: zero at endpoints, peaks at p=0.5.
|
|
23
|
+
float disp = uIntensity * (0.5 - distance(0.5, uProgress)) * 2.0;
|
|
24
|
+
|
|
25
|
+
vec4 c1 = vec4(0.0);
|
|
26
|
+
vec4 c2 = vec4(0.0);
|
|
27
|
+
for (int i = 0; i < SAMPLES; i++) {
|
|
28
|
+
float t = (float(i) - float(SAMPLES - 1) * 0.5) / float(SAMPLES - 1);
|
|
29
|
+
vec2 off = d * disp * t;
|
|
30
|
+
c1 += getFromColor(uv + off);
|
|
31
|
+
c2 += getToColor(uv + off);
|
|
32
|
+
}
|
|
33
|
+
c1 /= float(SAMPLES);
|
|
34
|
+
c2 /= float(SAMPLES);
|
|
35
|
+
|
|
36
|
+
return mix(c1, c2, uProgress);
|
|
37
|
+
}
|
|
38
|
+
`,
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=linear-blur.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear-blur.js","sourceRoot":"","sources":["../../src/transitions/linear-blur.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,gBAAgB,CAAC;IACzC,IAAI,EAAE,aAAa;IACnB,QAAQ,EAAE;QACR,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACjB,SAAS,EAAE,GAAG;KACf;IACD,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;CAwBP;CACA,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A liquid-metal blob expands from the centre, showing `to` through its
|
|
3
|
+
* glossy surface. The silhouette is a three-lobe metaball with small
|
|
4
|
+
* orbital wobbles so the boundary feels organic rather than a clean
|
|
5
|
+
* circle. Inside the blob, a fake specular highlight (overhead-left
|
|
6
|
+
* light) and rim brightening derived from the sampled `to` luminance
|
|
7
|
+
* produce the T-1000 chrome read — all gain derived from sampled content,
|
|
8
|
+
* so the full-frame rule holds (no synthetic white).
|
|
9
|
+
*
|
|
10
|
+
* Sample UVs only ever shift inward, so the clamp stays a no-op (no
|
|
11
|
+
* radial streaks from out-of-bounds reads). Specular + rim + refraction
|
|
12
|
+
* all scale by a `4·p·(1-p)` envelope, so at progress 0 and 1 the
|
|
13
|
+
* mercury shading collapses to pure from/to respectively.
|
|
14
|
+
*/
|
|
15
|
+
export declare const liquidChrome: import("../types.js").Transition<import("@vysmo/gl-core").Widen<{
|
|
16
|
+
readonly shine: 0.9;
|
|
17
|
+
readonly rim: 0.25;
|
|
18
|
+
readonly wobble: 0.12;
|
|
19
|
+
readonly refraction: 0.035;
|
|
20
|
+
readonly reflection: 0;
|
|
21
|
+
}>>;
|
|
22
|
+
//# sourceMappingURL=liquid-chrome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liquid-chrome.d.ts","sourceRoot":"","sources":["../../src/transitions/liquid-chrome.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,YAAY;;;;;;GAiGvB,CAAC"}
|