@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,106 @@
|
|
|
1
|
+
import { defineTransition } from "./define.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Multi-pass transition. As a noise-masked reveal of to emerges, its
|
|
5
|
+
* bright highlights bloom outward with big cinematic halos impossible
|
|
6
|
+
* in a single pass — the blur radius grows to ~32 pixels via five
|
|
7
|
+
* doubling-step iterations (1, 2, 4, 8, 16 px), which would need
|
|
8
|
+
* ~65² samples single-pass.
|
|
9
|
+
*
|
|
10
|
+
* pass 0 — extract to-highlights gated by the reveal
|
|
11
|
+
* mask AND a 4·p·(1-p) envelope that zeroes
|
|
12
|
+
* at both endpoints.
|
|
13
|
+
* pass 1..passCount-2 — expanding-step 9-tap box blur, doubling
|
|
14
|
+
* radius each iteration.
|
|
15
|
+
* final pass — composite: base = mix(from, to, mask), then
|
|
16
|
+
* add the blurred bloom scaled by intensity.
|
|
17
|
+
*
|
|
18
|
+
* Endpoints: the bloom envelope is zero at progress 0 and 1, so all
|
|
19
|
+
* intermediate passes carry zeros and the composite is pure from/to.
|
|
20
|
+
* Noise is remapped to [softness+safety, 1-softness-safety] so the
|
|
21
|
+
* reveal-mask smoothstep saturates cleanly at progress 0 and 1.
|
|
22
|
+
*/
|
|
23
|
+
export const bloomReveal = defineTransition({
|
|
24
|
+
name: "bloom-reveal",
|
|
25
|
+
passes: 7,
|
|
26
|
+
defaults: {
|
|
27
|
+
scale: 5,
|
|
28
|
+
softness: 0.08,
|
|
29
|
+
threshold: 0.55,
|
|
30
|
+
intensity: 3.0,
|
|
31
|
+
},
|
|
32
|
+
glsl: `
|
|
33
|
+
uniform float uScale;
|
|
34
|
+
uniform float uSoftness;
|
|
35
|
+
uniform float uThreshold;
|
|
36
|
+
uniform float uIntensity;
|
|
37
|
+
|
|
38
|
+
float hash21(vec2 p) {
|
|
39
|
+
return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
float valNoise(vec2 p) {
|
|
43
|
+
vec2 i = floor(p);
|
|
44
|
+
vec2 f = fract(p);
|
|
45
|
+
f = f * f * (3.0 - 2.0 * f);
|
|
46
|
+
float a = hash21(i);
|
|
47
|
+
float b = hash21(i + vec2(1.0, 0.0));
|
|
48
|
+
float c = hash21(i + vec2(0.0, 1.0));
|
|
49
|
+
float d = hash21(i + vec2(1.0, 1.0));
|
|
50
|
+
return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
float fbm(vec2 p) {
|
|
54
|
+
return valNoise(p) * 0.55 +
|
|
55
|
+
valNoise(p * 2.1) * 0.28 +
|
|
56
|
+
valNoise(p * 4.3) * 0.17;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
float revealMask(vec2 uv) {
|
|
60
|
+
// Safe noise bounds guarantee the mask smoothstep saturates to 0 at
|
|
61
|
+
// progress=0 and 1 at progress=1 regardless of where the noise lands.
|
|
62
|
+
float safeLow = uSoftness + 0.005;
|
|
63
|
+
float safeHigh = 1.0 - uSoftness - 0.005;
|
|
64
|
+
float n = mix(safeLow, safeHigh, clamp(fbm(uv * uScale), 0.0, 1.0));
|
|
65
|
+
return smoothstep(n - uSoftness, n + uSoftness, uProgress);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
vec4 transition(vec2 uv) {
|
|
69
|
+
// Final pass: composite bloom on top of the from→to reveal.
|
|
70
|
+
if (uPass == uPassCount - 1) {
|
|
71
|
+
vec3 bloom = getPrevious(uv).rgb;
|
|
72
|
+
float mask = revealMask(uv);
|
|
73
|
+
vec3 base = mix(getFromColor(uv).rgb, getToColor(uv).rgb, mask);
|
|
74
|
+
return vec4(base + bloom * uIntensity, 1.0);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Seed: bloom contribution = to_color * (brightness_mask) * reveal
|
|
78
|
+
// * envelope. Envelope vanishes at progress 0/1 → clean endpoints.
|
|
79
|
+
if (uPass == 0) {
|
|
80
|
+
float mask = revealMask(uv);
|
|
81
|
+
vec3 toColor = getToColor(uv).rgb;
|
|
82
|
+
float lum = dot(toColor, vec3(0.299, 0.587, 0.114));
|
|
83
|
+
float brightness = smoothstep(uThreshold - 0.1, uThreshold + 0.1, lum);
|
|
84
|
+
float envelope = 4.0 * uProgress * (1.0 - uProgress);
|
|
85
|
+
vec3 bloom = toColor * brightness * mask * envelope;
|
|
86
|
+
return vec4(bloom, 1.0);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Blur: 9-tap box blur with an expanding step so the effective
|
|
90
|
+
// radius doubles each pass. After 5 blur passes, reach is ~32 px.
|
|
91
|
+
float step = pow(2.0, float(uPass - 1));
|
|
92
|
+
vec2 px = vec2(step) / uResolution;
|
|
93
|
+
vec3 sum = vec3(0.0);
|
|
94
|
+
sum += getPrevious(uv + vec2(-px.x, -px.y)).rgb;
|
|
95
|
+
sum += getPrevious(uv + vec2(0.0, -px.y)).rgb;
|
|
96
|
+
sum += getPrevious(uv + vec2(px.x, -px.y)).rgb;
|
|
97
|
+
sum += getPrevious(uv + vec2(-px.x, 0.0)).rgb;
|
|
98
|
+
sum += getPrevious(uv).rgb;
|
|
99
|
+
sum += getPrevious(uv + vec2(px.x, 0.0)).rgb;
|
|
100
|
+
sum += getPrevious(uv + vec2(-px.x, px.y)).rgb;
|
|
101
|
+
sum += getPrevious(uv + vec2(0.0, px.y)).rgb;
|
|
102
|
+
sum += getPrevious(uv + vec2(px.x, px.y)).rgb;
|
|
103
|
+
return vec4(sum / 9.0, 1.0);
|
|
104
|
+
}
|
|
105
|
+
`,
|
|
106
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { defineTransition } from "./define.js";
|
|
2
|
+
|
|
3
|
+
export const chromaticPulse = defineTransition({
|
|
4
|
+
name: "chromatic-pulse",
|
|
5
|
+
defaults: {
|
|
6
|
+
intensity: 0.6,
|
|
7
|
+
},
|
|
8
|
+
glsl: `
|
|
9
|
+
uniform float uIntensity;
|
|
10
|
+
|
|
11
|
+
vec4 transition(vec2 uv) {
|
|
12
|
+
// Envelope peaks at midpoint, zero at endpoints.
|
|
13
|
+
float env = 4.0 * uProgress * (1.0 - uProgress);
|
|
14
|
+
float aberration = env * uIntensity * 0.03;
|
|
15
|
+
|
|
16
|
+
// Radial direction from center → outward chromatic shift feels lens-like.
|
|
17
|
+
vec2 toCenter = uv - 0.5;
|
|
18
|
+
float r = length(toCenter);
|
|
19
|
+
vec2 dir = r > 0.0001 ? toCenter / r : vec2(1.0, 0.0);
|
|
20
|
+
|
|
21
|
+
vec2 offR = clamp(uv + dir * aberration, 0.0, 1.0);
|
|
22
|
+
vec2 offG = uv;
|
|
23
|
+
vec2 offB = clamp(uv - dir * aberration, 0.0, 1.0);
|
|
24
|
+
|
|
25
|
+
vec3 fromRGB = vec3(
|
|
26
|
+
getFromColor(offR).r,
|
|
27
|
+
getFromColor(offG).g,
|
|
28
|
+
getFromColor(offB).b
|
|
29
|
+
);
|
|
30
|
+
vec3 toRGB = vec3(
|
|
31
|
+
getToColor(offR).r,
|
|
32
|
+
getToColor(offG).g,
|
|
33
|
+
getToColor(offB).b
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
float mixW = smoothstep(0.3, 0.7, uProgress);
|
|
37
|
+
return vec4(mix(fromRGB, toRGB, mixW), 1.0);
|
|
38
|
+
}
|
|
39
|
+
`,
|
|
40
|
+
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { defineTransition } from "./define.js";
|
|
2
|
+
|
|
3
|
+
export const clockWipe = defineTransition({
|
|
4
|
+
name: "clock-wipe",
|
|
5
|
+
defaults: {
|
|
6
|
+
startAngle: -1.5707963, // -π/2 (12 o'clock)
|
|
7
|
+
direction: 1, // +1 clockwise, -1 counter-clockwise
|
|
8
|
+
softness: 0.02,
|
|
9
|
+
},
|
|
10
|
+
glsl: `
|
|
11
|
+
uniform float uStartAngle;
|
|
12
|
+
uniform float uDirection;
|
|
13
|
+
uniform float uSoftness;
|
|
14
|
+
|
|
15
|
+
const float TWO_PI = 6.2831853;
|
|
16
|
+
|
|
17
|
+
vec4 transition(vec2 uv) {
|
|
18
|
+
vec2 delta = uv - vec2(0.5);
|
|
19
|
+
// Aspect-correct so the sweep stays angularly uniform on non-square canvases.
|
|
20
|
+
vec2 aspectDelta = delta * vec2(uResolution.x / uResolution.y, 1.0);
|
|
21
|
+
|
|
22
|
+
float angle = atan(aspectDelta.y, aspectDelta.x);
|
|
23
|
+
float sweep = mod(uDirection * (angle - uStartAngle), TWO_PI);
|
|
24
|
+
|
|
25
|
+
// Threshold extends beyond [0, 2π] by the softness on each side so the
|
|
26
|
+
// feather zone is outside the visible sweep range at the endpoints.
|
|
27
|
+
float threshold = uProgress * (TWO_PI + 2.0 * uSoftness) - uSoftness;
|
|
28
|
+
float w = smoothstep(threshold - uSoftness, threshold + uSoftness, sweep);
|
|
29
|
+
|
|
30
|
+
return mix(getToColor(uv), getFromColor(uv), w);
|
|
31
|
+
}
|
|
32
|
+
`,
|
|
33
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { defineTransition } from "./define.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Port of gl-transitions' ColorPhase. Each color channel transitions on its
|
|
5
|
+
* own sub-range of progress via smoothstep, giving a phased spectrum-shift
|
|
6
|
+
* reveal (red fades early, green middle, blue late, for the defaults).
|
|
7
|
+
*/
|
|
8
|
+
export const colorPhase = defineTransition({
|
|
9
|
+
name: "color-phase",
|
|
10
|
+
defaults: {
|
|
11
|
+
fromStep: [0.0, 0.2, 0.4, 0.0],
|
|
12
|
+
toStep: [0.6, 0.8, 1.0, 1.0],
|
|
13
|
+
},
|
|
14
|
+
glsl: `
|
|
15
|
+
uniform vec4 uFromStep;
|
|
16
|
+
uniform vec4 uToStep;
|
|
17
|
+
|
|
18
|
+
vec4 transition(vec2 uv) {
|
|
19
|
+
vec4 a = getFromColor(uv);
|
|
20
|
+
vec4 b = getToColor(uv);
|
|
21
|
+
return mix(a, b, smoothstep(uFromStep, uToStep, vec4(uProgress)));
|
|
22
|
+
}
|
|
23
|
+
`,
|
|
24
|
+
});
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { defineTransition } from "./define.js";
|
|
2
|
+
|
|
3
|
+
export const crossZoom = defineTransition({
|
|
4
|
+
name: "cross-zoom",
|
|
5
|
+
defaults: {
|
|
6
|
+
strength: 1.2,
|
|
7
|
+
blur: 0.04,
|
|
8
|
+
},
|
|
9
|
+
glsl: `
|
|
10
|
+
uniform float uStrength;
|
|
11
|
+
uniform float uBlur;
|
|
12
|
+
|
|
13
|
+
vec2 zoomUv(vec2 uv, float scale) {
|
|
14
|
+
return (uv - 0.5) / scale + 0.5;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
vec4 sampleFromBlurred(vec2 uv, float amount) {
|
|
18
|
+
if (amount < 0.001) return getFromColor(uv);
|
|
19
|
+
const int N = 5;
|
|
20
|
+
vec4 sum = vec4(0.0);
|
|
21
|
+
for (int i = 0; i < N; i++) {
|
|
22
|
+
float t = (float(i) - 2.0) / 4.0;
|
|
23
|
+
vec2 offset = (uv - 0.5) * amount * t;
|
|
24
|
+
sum += getFromColor(uv + offset);
|
|
25
|
+
}
|
|
26
|
+
return sum / float(N);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
vec4 sampleToBlurred(vec2 uv, float amount) {
|
|
30
|
+
if (amount < 0.001) return getToColor(uv);
|
|
31
|
+
const int N = 5;
|
|
32
|
+
vec4 sum = vec4(0.0);
|
|
33
|
+
for (int i = 0; i < N; i++) {
|
|
34
|
+
float t = (float(i) - 2.0) / 4.0;
|
|
35
|
+
vec2 offset = (uv - 0.5) * amount * t;
|
|
36
|
+
sum += getToColor(uv + offset);
|
|
37
|
+
}
|
|
38
|
+
return sum / float(N);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
vec4 transition(vec2 uv) {
|
|
42
|
+
float fromScale = 1.0 + uProgress * uStrength;
|
|
43
|
+
float toScale = 1.0 + (1.0 - uProgress) * uStrength;
|
|
44
|
+
|
|
45
|
+
vec2 fromUv = zoomUv(uv, fromScale);
|
|
46
|
+
vec2 toUv = zoomUv(uv, toScale);
|
|
47
|
+
|
|
48
|
+
// Velocity-scaled radial blur (peak at midpoint, zero at endpoints).
|
|
49
|
+
float motion = 4.0 * uProgress * (1.0 - uProgress) * uBlur;
|
|
50
|
+
|
|
51
|
+
vec4 fromColor = sampleFromBlurred(fromUv, motion);
|
|
52
|
+
vec4 toColor = sampleToBlurred(toUv, motion);
|
|
53
|
+
|
|
54
|
+
// Crossfade concentrated in the middle 40% of the transition.
|
|
55
|
+
float mixW = smoothstep(0.3, 0.7, uProgress);
|
|
56
|
+
return mix(fromColor, toColor, mixW);
|
|
57
|
+
}
|
|
58
|
+
`,
|
|
59
|
+
});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { defineTransition } from "./define.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Port of gl-transitions' CrossHatch. Pixels reveal based on an outer
|
|
5
|
+
* radial wave from `center` combined with per-row and per-column random
|
|
6
|
+
* thresholds, producing a sketchy hand-drawn crosshatch reveal. Outer
|
|
7
|
+
* smoothstep envelopes guarantee pixel-pure endpoints.
|
|
8
|
+
*/
|
|
9
|
+
export const crosshatch = defineTransition({
|
|
10
|
+
name: "crosshatch",
|
|
11
|
+
defaults: {
|
|
12
|
+
center: [0.5, 0.5],
|
|
13
|
+
threshold: 3,
|
|
14
|
+
fadeEdge: 0.1,
|
|
15
|
+
},
|
|
16
|
+
glsl: `
|
|
17
|
+
uniform vec2 uCenter;
|
|
18
|
+
uniform float uThreshold;
|
|
19
|
+
uniform float uFadeEdge;
|
|
20
|
+
|
|
21
|
+
float rand(vec2 co) {
|
|
22
|
+
return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
vec4 transition(vec2 uv) {
|
|
26
|
+
// Below threshold=3 the radial wave doesn't have enough range to cover
|
|
27
|
+
// the full canvas before the outer fade-edge envelope kicks in, leaving
|
|
28
|
+
// patchy unrevealed pixels mid-transition that snap to revealed at the
|
|
29
|
+
// end. Clamp here so the transition is reliable regardless of caller input.
|
|
30
|
+
float threshold = max(uThreshold, 3.0);
|
|
31
|
+
float dist = distance(uCenter, uv) / threshold;
|
|
32
|
+
float r = uProgress - min(rand(vec2(uv.y, 0.0)), rand(vec2(0.0, uv.x)));
|
|
33
|
+
|
|
34
|
+
float feather = 0.02;
|
|
35
|
+
float inner = smoothstep(dist - feather, dist + feather, r);
|
|
36
|
+
|
|
37
|
+
// Outer mix structure (from gl-transitions): no reveal until uFadeEdge,
|
|
38
|
+
// forced full reveal in last uFadeEdge of progress — guarantees clean
|
|
39
|
+
// endpoints regardless of the random threshold's noisiness.
|
|
40
|
+
float w = mix(
|
|
41
|
+
0.0,
|
|
42
|
+
mix(inner, 1.0, smoothstep(1.0 - uFadeEdge, 1.0, uProgress)),
|
|
43
|
+
smoothstep(0.0, uFadeEdge, uProgress)
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
return mix(getFromColor(uv), getToColor(uv), w);
|
|
47
|
+
}
|
|
48
|
+
`,
|
|
49
|
+
});
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
MeshGeometry,
|
|
3
|
+
Transition,
|
|
4
|
+
TransitionShader,
|
|
5
|
+
UniformParams,
|
|
6
|
+
Widen,
|
|
7
|
+
} from "../types.js";
|
|
8
|
+
|
|
9
|
+
export interface DefineTransitionSpec<P extends UniformParams> {
|
|
10
|
+
name: string;
|
|
11
|
+
glsl: string;
|
|
12
|
+
/**
|
|
13
|
+
* Full vertex-shader main(). Required when `mesh` is set. See
|
|
14
|
+
* TransitionShader.vertex for shell details.
|
|
15
|
+
*/
|
|
16
|
+
vertex?: string;
|
|
17
|
+
wgsl?: string;
|
|
18
|
+
defaults: P;
|
|
19
|
+
passes?: number;
|
|
20
|
+
mesh?: MeshGeometry;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Build a `Transition` from a plain spec. Authors write a fragment-shader
|
|
25
|
+
* `vec4 transition(vec2 uv) { … }` body and a `defaults` object of named
|
|
26
|
+
* uniforms; the Runner wraps it with the standard headers (`#version
|
|
27
|
+
* 300 es`, precision, `uFrom` / `uTo` / `uProgress` / `uResolution`,
|
|
28
|
+
* sampler helpers `getFromColor` / `getToColor`) and maps each key in
|
|
29
|
+
* `defaults` to a `u<PascalCase>` uniform via the runner's binding rule.
|
|
30
|
+
*
|
|
31
|
+
* Mesh transitions add a `vertex` shader body and a `mesh` geometry
|
|
32
|
+
* descriptor; multi-pass transitions add `passes`.
|
|
33
|
+
*
|
|
34
|
+
* The returned object is a plain `Transition<Widen<P>>` — the `Widen`
|
|
35
|
+
* step lifts literal default tuples (e.g. `readonly [-1, 0]`) back to
|
|
36
|
+
* the general uniform tuple types so callers can override freely.
|
|
37
|
+
*
|
|
38
|
+
* Per the project's engineering invariants, every defined transition
|
|
39
|
+
* must clear the endpoint-correctness, polish-degrades-at-endpoints,
|
|
40
|
+
* no-hard-cuts, full-frame, and continuous-motion rules.
|
|
41
|
+
*/
|
|
42
|
+
export function defineTransition<const P extends UniformParams>(
|
|
43
|
+
spec: DefineTransitionSpec<P>,
|
|
44
|
+
): Transition<Widen<P>> {
|
|
45
|
+
const shader: TransitionShader = { glsl: spec.glsl };
|
|
46
|
+
if (spec.vertex !== undefined) shader.vertex = spec.vertex;
|
|
47
|
+
if (spec.wgsl !== undefined) shader.wgsl = spec.wgsl;
|
|
48
|
+
const t: Transition<Widen<P>> = {
|
|
49
|
+
name: spec.name,
|
|
50
|
+
shader,
|
|
51
|
+
defaults: spec.defaults as unknown as Widen<P>,
|
|
52
|
+
};
|
|
53
|
+
if (spec.passes !== undefined) t.passes = spec.passes;
|
|
54
|
+
if (spec.mesh !== undefined) t.mesh = spec.mesh;
|
|
55
|
+
return t;
|
|
56
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { defineTransition } from "./define.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Linear film-burn sibling: a warm-glowing fire line advances across the
|
|
5
|
+
* frame from one edge, like a sparkler running along a fuse. Distinct
|
|
6
|
+
* from light-leak (smooth colored band passing through) — this is a
|
|
7
|
+
* state-change front: unburned ahead, reveal behind, hot glow ON the
|
|
8
|
+
* line.
|
|
9
|
+
*/
|
|
10
|
+
export const directionalBurn = defineTransition({
|
|
11
|
+
name: "directional-burn",
|
|
12
|
+
defaults: {
|
|
13
|
+
direction: [1, 0],
|
|
14
|
+
scale: 10,
|
|
15
|
+
edgeWidth: 0.035,
|
|
16
|
+
flameColor: [1.6, 0.7, 0.15],
|
|
17
|
+
},
|
|
18
|
+
glsl: `
|
|
19
|
+
uniform vec2 uDirection;
|
|
20
|
+
uniform float uScale;
|
|
21
|
+
uniform float uEdgeWidth;
|
|
22
|
+
uniform vec3 uFlameColor;
|
|
23
|
+
|
|
24
|
+
float hash21(vec2 p) {
|
|
25
|
+
return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
float valueNoise(vec2 p) {
|
|
29
|
+
vec2 i = floor(p);
|
|
30
|
+
vec2 f = fract(p);
|
|
31
|
+
f = f * f * (3.0 - 2.0 * f);
|
|
32
|
+
float a = hash21(i);
|
|
33
|
+
float b = hash21(i + vec2(1.0, 0.0));
|
|
34
|
+
float c = hash21(i + vec2(0.0, 1.0));
|
|
35
|
+
float d = hash21(i + vec2(1.0, 1.0));
|
|
36
|
+
return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
vec4 transition(vec2 uv) {
|
|
40
|
+
vec2 d = normalize(uDirection);
|
|
41
|
+
float projected = dot(uv - 0.5, -d);
|
|
42
|
+
// Max projection magnitude for any uv in [0,1]^2 given this direction;
|
|
43
|
+
// L1 formula that works for axis-aligned and diagonal directions alike.
|
|
44
|
+
float maxProj = 0.5 * (abs(d.x) + abs(d.y));
|
|
45
|
+
|
|
46
|
+
float noiseStrength = 0.06;
|
|
47
|
+
float n = valueNoise(uv * uScale);
|
|
48
|
+
float perturbed = projected - (n - 0.5) * noiseStrength;
|
|
49
|
+
|
|
50
|
+
float totalEdge = uEdgeWidth + noiseStrength * 0.5;
|
|
51
|
+
float boundary = (maxProj + totalEdge) * (1.0 - 2.0 * uProgress);
|
|
52
|
+
float signedDist = perturbed - boundary;
|
|
53
|
+
|
|
54
|
+
// Behind the front: reveal "to". Ahead: still "from".
|
|
55
|
+
float w = smoothstep(-uEdgeWidth, uEdgeWidth, signedDist);
|
|
56
|
+
vec4 base = mix(getFromColor(uv), getToColor(uv), w);
|
|
57
|
+
|
|
58
|
+
// Tight flame band centered on the front, env-gated to zero at endpoints.
|
|
59
|
+
float bandX = signedDist / max(uEdgeWidth * 1.3, 0.0001);
|
|
60
|
+
float flameBand = exp(-bandX * bandX * 3.5);
|
|
61
|
+
float env = 4.0 * uProgress * (1.0 - uProgress);
|
|
62
|
+
vec3 flame = uFlameColor * flameBand * env;
|
|
63
|
+
|
|
64
|
+
return vec4(base.rgb + flame, base.a);
|
|
65
|
+
}
|
|
66
|
+
`,
|
|
67
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { defineTransition } from "./define.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Ported from gl-transitions' directionalwarp. Uses L1-normalized direction
|
|
5
|
+
* so the wavefront covers the full image regardless of direction, and a
|
|
6
|
+
* shrink-to-center sampling that never needs to clamp outside [0,1] — so
|
|
7
|
+
* there are no stretched edge artifacts (the "bars" a naive displacement
|
|
8
|
+
* approach produces).
|
|
9
|
+
*/
|
|
10
|
+
export const directionalWarp = defineTransition({
|
|
11
|
+
name: "directional-warp",
|
|
12
|
+
defaults: {
|
|
13
|
+
direction: [-1, 1],
|
|
14
|
+
smoothness: 0.5,
|
|
15
|
+
},
|
|
16
|
+
glsl: `
|
|
17
|
+
uniform vec2 uDirection;
|
|
18
|
+
uniform float uSmoothness;
|
|
19
|
+
|
|
20
|
+
vec4 transition(vec2 uv) {
|
|
21
|
+
// L1 normalization: ensures the projection v.x*uv.x + v.y*uv.y covers a
|
|
22
|
+
// range of length 1 regardless of direction.
|
|
23
|
+
vec2 v = uDirection;
|
|
24
|
+
float l = abs(v.x) + abs(v.y);
|
|
25
|
+
if (l < 0.0001) v = vec2(1.0, 0.0);
|
|
26
|
+
else v = v / l;
|
|
27
|
+
|
|
28
|
+
vec2 center = vec2(0.5);
|
|
29
|
+
float d = v.x * center.x + v.y * center.y;
|
|
30
|
+
|
|
31
|
+
float m = 1.0 - smoothstep(
|
|
32
|
+
-uSmoothness,
|
|
33
|
+
0.0,
|
|
34
|
+
v.x * uv.x + v.y * uv.y - (d - 0.5 + uProgress * (1.0 + uSmoothness))
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
// Shrink-to-center sampling: fromUv shrinks toward center as m grows,
|
|
38
|
+
// toUv grows out from center. UVs stay in [0,1] — no clamping needed.
|
|
39
|
+
return mix(
|
|
40
|
+
getFromColor((uv - 0.5) * (1.0 - m) + 0.5),
|
|
41
|
+
getToColor((uv - 0.5) * m + 0.5),
|
|
42
|
+
m
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
`,
|
|
46
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { defineTransition } from "./define.js";
|
|
2
|
+
|
|
3
|
+
export const dissolve = defineTransition({
|
|
4
|
+
name: "dissolve",
|
|
5
|
+
defaults: {},
|
|
6
|
+
glsl: `
|
|
7
|
+
vec4 transition(vec2 uv) {
|
|
8
|
+
vec4 a = getFromColor(uv);
|
|
9
|
+
vec4 b = getToColor(uv);
|
|
10
|
+
vec3 aLin = pow(a.rgb, vec3(2.2));
|
|
11
|
+
vec3 bLin = pow(b.rgb, vec3(2.2));
|
|
12
|
+
vec3 mixed = mix(aLin, bLin, uProgress);
|
|
13
|
+
return vec4(pow(mixed, vec3(1.0 / 2.2)), mix(a.a, b.a, uProgress));
|
|
14
|
+
}
|
|
15
|
+
`,
|
|
16
|
+
});
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { defineTransition } from "./define.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Port of gl-transitions' DreamyZoom (Zeh Fernando, MIT). Phase 1 (p<0.5):
|
|
5
|
+
* from-image zooms in + rotates, fading toward white. Phase 2 (p>0.5):
|
|
6
|
+
* white fades back to to-image starting pre-rotated and unwinding to
|
|
7
|
+
* identity while zooming out. The white flash at p=0.5 masks the from→to
|
|
8
|
+
* image swap.
|
|
9
|
+
*
|
|
10
|
+
* Note: the original gl-transitions source has a bug (`* vec4(0)`) that
|
|
11
|
+
* disables the flash — fixed here to use white, matching the actual
|
|
12
|
+
* preview on gl-transitions.com.
|
|
13
|
+
*
|
|
14
|
+
* Single `intensity` param drives both rotation and scale internally.
|
|
15
|
+
* Rotation alone would push corners outside the canvas (visible edge-clamp
|
|
16
|
+
* streaks); scale must compensate. Splitting them as separate params lets
|
|
17
|
+
* the caller pick mismatched values that produce streaks. We map intensity
|
|
18
|
+
* to (rotation, scale) along a curve where scale always covers rotation,
|
|
19
|
+
* so any value in [0, 1] is visually safe.
|
|
20
|
+
*
|
|
21
|
+
* Default `intensity: 0.5` reproduces gl-transitions' defaults exactly
|
|
22
|
+
* (rotation ≈ 0.105 rad / 6°, scale ≈ 1.2).
|
|
23
|
+
*/
|
|
24
|
+
export const dreamyZoom = defineTransition({
|
|
25
|
+
name: "dreamy-zoom",
|
|
26
|
+
defaults: {
|
|
27
|
+
intensity: 0.5,
|
|
28
|
+
},
|
|
29
|
+
glsl: `
|
|
30
|
+
uniform float uIntensity;
|
|
31
|
+
|
|
32
|
+
vec4 transition(vec2 uv) {
|
|
33
|
+
float ratio = uResolution.x / max(uResolution.y, 1.0);
|
|
34
|
+
|
|
35
|
+
// Single knob, mapped to rotation + scale together. Coefficients chosen
|
|
36
|
+
// so intensity=0.5 reproduces gl-transitions' (0.105 rad, 1.2) defaults.
|
|
37
|
+
float intensity = clamp(uIntensity, 0.0, 1.0);
|
|
38
|
+
float rotation = intensity * 0.21;
|
|
39
|
+
float scale = 1.0 + intensity * 0.4;
|
|
40
|
+
|
|
41
|
+
float phase = uProgress < 0.5 ? uProgress * 2.0 : (uProgress - 0.5) * 2.0;
|
|
42
|
+
float angleOffset = uProgress < 0.5
|
|
43
|
+
? mix(0.0, rotation, phase)
|
|
44
|
+
: mix(-rotation, 0.0, phase);
|
|
45
|
+
float newScale = uProgress < 0.5
|
|
46
|
+
? mix(1.0, scale, phase)
|
|
47
|
+
: mix(scale, 1.0, phase);
|
|
48
|
+
|
|
49
|
+
vec2 p = (uv - vec2(0.5)) / newScale * vec2(ratio, 1.0);
|
|
50
|
+
float angle = atan(p.y, p.x) + angleOffset;
|
|
51
|
+
float dist = length(p);
|
|
52
|
+
vec2 sampledP = vec2(
|
|
53
|
+
cos(angle) * dist / ratio + 0.5,
|
|
54
|
+
sin(angle) * dist + 0.5
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
vec4 c = uProgress < 0.5
|
|
58
|
+
? getFromColor(sampledP)
|
|
59
|
+
: getToColor(sampledP);
|
|
60
|
+
|
|
61
|
+
// White flash: zero at endpoints, peaks at midpoint to mask the swap.
|
|
62
|
+
float flash = uProgress < 0.5 ? phase : 1.0 - phase;
|
|
63
|
+
return vec4(c.rgb + flash, c.a);
|
|
64
|
+
}
|
|
65
|
+
`,
|
|
66
|
+
});
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { defineTransition } from "./define.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Ported from gl-transitions' Dreamy. A gentle vertical wobble displaces
|
|
5
|
+
* both images with opposing phases; combined with the linear crossfade this
|
|
6
|
+
* gives a soft, hypnotic "dream" feel. Procedural, no displacement texture
|
|
7
|
+
* required.
|
|
8
|
+
*/
|
|
9
|
+
export const dreamy = defineTransition({
|
|
10
|
+
name: "dreamy",
|
|
11
|
+
defaults: {},
|
|
12
|
+
glsl: `
|
|
13
|
+
vec2 dreamyOffset(float progress, float x, float theta) {
|
|
14
|
+
float shifty = 0.03 * progress * cos(10.0 * (progress + x) + theta);
|
|
15
|
+
return vec2(0.0, shifty);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
vec4 transition(vec2 uv) {
|
|
19
|
+
return mix(
|
|
20
|
+
getFromColor(uv + dreamyOffset(uProgress, uv.x, 0.0)),
|
|
21
|
+
getToColor(uv + dreamyOffset(1.0 - uProgress, uv.x, 3.14159)),
|
|
22
|
+
uProgress
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
`,
|
|
26
|
+
});
|