@remotion/effects 4.0.538 → 4.0.540
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD_PARTY_LICENSES.md +19 -0
- package/dist/barrel-distortion/webgpu-shader.d.ts +1 -0
- package/dist/bevel-alpha/webgpu-shaders.d.ts +2 -0
- package/dist/burlap-webgpu-shader.d.ts +1 -0
- package/dist/checkerboard-webgpu-shader.d.ts +1 -0
- package/dist/chromatic-aberration/webgpu-shader.d.ts +1 -0
- package/dist/color-correction-webgpu-shader-utils.d.ts +4 -0
- package/dist/color-key-webgpu-shader.d.ts +1 -0
- package/dist/color-matrix-runtime.d.ts +4 -0
- package/dist/contour-lines-webgpu-shader.d.ts +1 -0
- package/dist/corner-pin/webgpu-shader.d.ts +1 -0
- package/dist/curves.d.ts +65 -0
- package/dist/cylinder/webgl-shader.d.ts +1 -0
- package/dist/dot-grid-webgpu-shader.d.ts +1 -0
- package/dist/drop-shadow/webgpu-shaders.d.ts +2 -0
- package/dist/emboss-webgpu-shader.d.ts +1 -0
- package/dist/esm/barrel-distortion.mjs +67 -118
- package/dist/esm/bevel-alpha.mjs +247 -196
- package/dist/esm/blur.mjs +101 -115
- package/dist/esm/brightness.mjs +65 -132
- package/dist/esm/burlap.mjs +178 -151
- package/dist/esm/checkerboard.mjs +6 -514
- package/dist/esm/chromatic-aberration.mjs +72 -119
- package/dist/esm/color-correction.mjs +186 -224
- package/dist/esm/color-key.mjs +149 -136
- package/dist/esm/contour-lines.mjs +201 -160
- package/dist/esm/contrast.mjs +65 -132
- package/dist/esm/corner-pin.mjs +4 -390
- package/dist/esm/curves.mjs +357 -0
- package/dist/esm/cylinder.mjs +108 -225
- package/dist/esm/dot-grid.mjs +184 -213
- package/dist/esm/drop-shadow.mjs +162 -180
- package/dist/esm/duotone.mjs +110 -143
- package/dist/esm/emboss.mjs +153 -151
- package/dist/esm/evolve.mjs +228 -154
- package/dist/esm/exposure.mjs +93 -201
- package/dist/esm/film-burn.mjs +298 -0
- package/dist/esm/fisheye.mjs +97 -126
- package/dist/esm/flannel.mjs +158 -156
- package/dist/esm/fractal-noise.mjs +186 -232
- package/dist/esm/glow.mjs +164 -179
- package/dist/esm/grayscale.mjs +56 -122
- package/dist/esm/gridlines.mjs +6 -575
- package/dist/esm/halftone-linear-gradient.mjs +246 -245
- package/dist/esm/halftone.mjs +267 -243
- package/dist/esm/hue.mjs +55 -122
- package/dist/esm/index-00v3hr66.mjs +299 -0
- package/dist/esm/index-0w4eqht8.mjs +351 -0
- package/dist/esm/index-18y0zcy2.mjs +440 -0
- package/dist/esm/index-1m1b1ad7.mjs +520 -0
- package/dist/esm/index-34fxm3ax.mjs +518 -0
- package/dist/esm/index-4fvp93ps.mjs +32 -0
- package/dist/esm/index-4scpn12x.mjs +224 -0
- package/dist/esm/index-4z6pt3ka.mjs +104 -0
- package/dist/esm/index-618ky75w.mjs +51 -0
- package/dist/esm/index-6agxdrvr.mjs +411 -0
- package/dist/esm/index-6jkps947.mjs +120 -0
- package/dist/esm/index-8agtsbw4.mjs +617 -0
- package/dist/esm/index-8jx11jyn.mjs +29 -0
- package/dist/esm/index-8p04sssx.mjs +123 -0
- package/dist/esm/index-afdtmrh2.mjs +596 -0
- package/dist/esm/index-b86qstcs.mjs +18 -0
- package/dist/esm/index-cb77qg3g.mjs +587 -0
- package/dist/esm/index-cdp7tr8x.mjs +122 -0
- package/dist/esm/index-evy8hyah.mjs +55 -0
- package/dist/esm/index-gnsce796.mjs +6 -0
- package/dist/esm/index-kkvzt8b7.mjs +199 -0
- package/dist/esm/index-r0v18b2n.mjs +425 -0
- package/dist/esm/index-rswpzmm5.mjs +926 -0
- package/dist/esm/index-s9mrx750.mjs +97 -0
- package/dist/esm/index-tvfexb7s.mjs +164 -0
- package/dist/esm/index-vp56k1gj.mjs +215 -0
- package/dist/esm/index-wxhvgv2s.mjs +79 -0
- package/dist/esm/index-wy95a41r.mjs +407 -0
- package/dist/esm/index-ysnwfc4t.mjs +306 -0
- package/dist/esm/index.mjs +49 -4053
- package/dist/esm/invert.mjs +54 -122
- package/dist/esm/iris-wipe.mjs +315 -0
- package/dist/esm/lens-blur.mjs +169 -156
- package/dist/esm/levels.mjs +204 -151
- package/dist/esm/light-leak.mjs +6 -416
- package/dist/esm/light-trail.mjs +124 -128
- package/dist/esm/linear-gradient-tint.mjs +4 -424
- package/dist/esm/linear-gradient.mjs +4 -370
- package/dist/esm/linear-progressive-blur.mjs +92 -118
- package/dist/esm/linear-progressive-pixelate.mjs +83 -378
- package/dist/esm/lines.mjs +167 -162
- package/dist/esm/liquid-contours.mjs +192 -153
- package/dist/esm/long-shadows.mjs +278 -251
- package/dist/esm/lut.mjs +123 -23
- package/dist/esm/mirror.mjs +78 -120
- package/dist/esm/noise-displacement.mjs +156 -151
- package/dist/esm/noise.mjs +107 -143
- package/dist/esm/outline.mjs +192 -170
- package/dist/esm/page-turn.mjs +141 -244
- package/dist/esm/paper.mjs +522 -194
- package/dist/esm/pattern.mjs +4 -568
- package/dist/esm/pixel-dissolve.mjs +158 -186
- package/dist/esm/pixelate.mjs +92 -149
- package/dist/esm/radial-progressive-blur.mjs +96 -118
- package/dist/esm/radial-progressive-pixelate.mjs +91 -384
- package/dist/esm/radial-wipe.mjs +224 -0
- package/dist/esm/rain-fall.mjs +114 -0
- package/dist/esm/region-blur.mjs +138 -192
- package/dist/esm/rings.mjs +6 -512
- package/dist/esm/roughen-edges.mjs +180 -156
- package/dist/esm/saturation.mjs +56 -122
- package/dist/esm/scale.mjs +50 -60
- package/dist/esm/scanlines.mjs +115 -149
- package/dist/esm/shadows-highlights.mjs +103 -205
- package/dist/esm/shatter.mjs +868 -0
- package/dist/esm/shine.mjs +192 -227
- package/dist/esm/shrinkwrap.mjs +388 -225
- package/dist/esm/skew.mjs +100 -145
- package/dist/esm/snow-fall.mjs +170 -0
- package/dist/esm/speckle.mjs +192 -210
- package/dist/esm/sphere.mjs +101 -225
- package/dist/esm/starburst.mjs +6 -345
- package/dist/esm/tear.mjs +138 -155
- package/dist/esm/thermal-vision.mjs +135 -152
- package/dist/esm/tile.mjs +5 -184
- package/dist/esm/tint.mjs +80 -132
- package/dist/esm/translate.mjs +55 -137
- package/dist/esm/turbulent-displace.mjs +182 -221
- package/dist/esm/tv-signal-off.mjs +140 -149
- package/dist/esm/venetian-blinds.mjs +91 -140
- package/dist/esm/vibrance.mjs +95 -204
- package/dist/esm/vignette.mjs +136 -155
- package/dist/esm/wave.mjs +88 -47
- package/dist/esm/waves.mjs +181 -169
- package/dist/esm/white-balance.mjs +100 -204
- package/dist/esm/white-noise.mjs +98 -146
- package/dist/esm/zigzag.mjs +6 -575
- package/dist/esm/zoom-blur.mjs +90 -121
- package/dist/evolve.d.ts +46 -10
- package/dist/film-burn-webgpu-shader.d.ts +1 -0
- package/dist/film-burn.d.ts +40 -0
- package/dist/fisheye/webgpu-shader.d.ts +1 -0
- package/dist/flannel-webgpu-shader.d.ts +1 -0
- package/dist/fractal-noise/shader.d.ts +1 -1
- package/dist/fractal-noise/webgpu-shader.d.ts +1 -0
- package/dist/gaussian-blur-webgpu-shader.d.ts +1 -0
- package/dist/glow/webgpu-shaders.d.ts +2 -0
- package/dist/gridlines-webgpu-shader.d.ts +1 -0
- package/dist/halftone-linear-gradient-webgpu-shader.d.ts +1 -0
- package/dist/halftone-webgpu-shader.d.ts +1 -0
- package/dist/iris-wipe.d.ts +78 -0
- package/dist/lens-blur/webgpu-shader.d.ts +1 -0
- package/dist/levels.d.ts +69 -2
- package/dist/light-leak-webgpu-shader.d.ts +1 -0
- package/dist/light-trail/webgpu-shader.d.ts +1 -0
- package/dist/linear-gradient-tint-webgpu-shader.d.ts +1 -0
- package/dist/linear-gradient-webgpu-shader.d.ts +1 -0
- package/dist/lines-webgpu-shader.d.ts +1 -0
- package/dist/liquid-contours-webgpu-shader.d.ts +1 -0
- package/dist/long-shadows-webgpu-shaders.d.ts +2 -0
- package/dist/lut/webgpu-shader.d.ts +1 -0
- package/dist/mirror/webgpu-shader.d.ts +1 -0
- package/dist/noise-displacement-webgpu-shader.d.ts +1 -0
- package/dist/noise-webgpu-shader.d.ts +1 -0
- package/dist/outline/webgpu-shader.d.ts +1 -0
- package/dist/page-turn/webgl-shader.d.ts +1 -0
- package/dist/paper-webgpu-shader.d.ts +2 -0
- package/dist/pattern-webgpu-shader.d.ts +1 -0
- package/dist/pixel-dissolve-webgpu-shader.d.ts +1 -0
- package/dist/progressive-pixelate-runtime.d.ts +1 -0
- package/dist/radial-wipe.d.ts +19 -0
- package/dist/rain-fall.d.ts +143 -0
- package/dist/rect-transform-runtime.d.ts +11 -0
- package/dist/region-blur/webgpu-shader.d.ts +1 -0
- package/dist/rings-webgpu-shader.d.ts +1 -0
- package/dist/roughen-edges-webgpu-shader.d.ts +1 -0
- package/dist/shatter/geometry.d.ts +19 -0
- package/dist/shatter/index.d.ts +39 -0
- package/dist/shatter/runtime.d.ts +19 -0
- package/dist/shatter/webgpu-shader.d.ts +1 -0
- package/dist/shatter.d.ts +1 -0
- package/dist/shine-webgpu-shader.d.ts +1 -0
- package/dist/shrinkwrap-webgpu-shader.d.ts +1 -0
- package/dist/single-pass-runtime.d.ts +18 -0
- package/dist/skew-webgpu-shader.d.ts +1 -0
- package/dist/snow-fall.d.ts +208 -0
- package/dist/speckle-webgpu-shader.d.ts +1 -0
- package/dist/sphere/webgl-shader.d.ts +1 -0
- package/dist/starburst-webgpu-shader.d.ts +1 -0
- package/dist/tear-webgpu-shader.d.ts +1 -0
- package/dist/thermal-vision-webgpu-shader.d.ts +1 -0
- package/dist/tile-gpu-runtime.d.ts +24 -0
- package/dist/turbulent-displace/webgpu-shader.d.ts +1 -0
- package/dist/value-noise-webgpu-shader.d.ts +1 -0
- package/dist/vignette-webgpu-shader.d.ts +1 -0
- package/dist/wave/wave-runtime.d.ts +2 -1
- package/dist/wave/webgpu-shader.d.ts +1 -0
- package/dist/waves-webgpu-shader.d.ts +1 -0
- package/dist/weather/params.d.ts +149 -0
- package/dist/weather/runtime.d.ts +52 -0
- package/dist/weather/shaders.d.ts +4 -0
- package/dist/weather/webgpu-runtime.d.ts +36 -0
- package/dist/weather/webgpu-shader.d.ts +1 -0
- package/dist/webgl-projection-runtime.d.ts +18 -0
- package/dist/webgpu-color-state.d.ts +10 -0
- package/dist/webgpu-mesh-runtime.d.ts +46 -0
- package/dist/webgpu-multipass-runtime.d.ts +50 -0
- package/dist/webgpu-projection-runtime.d.ts +9 -5
- package/dist/webgpu-single-pass-runtime.d.ts +47 -0
- package/dist/white-noise-webgpu-shader.d.ts +1 -0
- package/dist/zigzag-webgpu-shader.d.ts +1 -0
- package/dist/zoom-blur/webgpu-shader.d.ts +1 -0
- package/package.json +59 -3
package/dist/esm/hue.mjs
CHANGED
|
@@ -1,112 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
};
|
|
15
|
-
var assertRequiredColor = (value, name) => {
|
|
16
|
-
if (typeof value !== "string" || value.length === 0) {
|
|
17
|
-
throw new TypeError(`"${name}" must be a non-empty string, but got ${JSON.stringify(value)}`);
|
|
18
|
-
}
|
|
19
|
-
};
|
|
20
|
-
var assertOptionalColor = (value, name) => {
|
|
21
|
-
if (value === undefined) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
assertRequiredColor(value, name);
|
|
25
|
-
};
|
|
26
|
-
var assertOptionalBoolean = (value, name) => {
|
|
27
|
-
if (value === undefined) {
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
if (typeof value !== "boolean") {
|
|
31
|
-
throw new TypeError(`"${name}" must be a boolean, but got ${JSON.stringify(value)}`);
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
// src/color-utils.ts
|
|
36
|
-
var DEFAULT_AMOUNT = 1;
|
|
37
|
-
var DEFAULT_BRIGHTNESS_AMOUNT = 0;
|
|
38
|
-
var DEFAULT_HUE_DEGREES = 0;
|
|
39
|
-
var colorAmountSchema = {
|
|
40
|
-
type: "number",
|
|
41
|
-
min: 0,
|
|
42
|
-
max: 1,
|
|
43
|
-
step: 0.01,
|
|
44
|
-
default: DEFAULT_AMOUNT,
|
|
45
|
-
description: "Amount",
|
|
46
|
-
hiddenFromList: false
|
|
47
|
-
};
|
|
48
|
-
var colorMultiplierSchema = {
|
|
49
|
-
type: "number",
|
|
50
|
-
min: 0,
|
|
51
|
-
step: 0.01,
|
|
52
|
-
default: DEFAULT_AMOUNT,
|
|
53
|
-
description: "Amount",
|
|
54
|
-
hiddenFromList: false
|
|
55
|
-
};
|
|
56
|
-
var brightnessAmountSchema = {
|
|
57
|
-
type: "number",
|
|
58
|
-
min: -1,
|
|
59
|
-
max: 1,
|
|
60
|
-
step: 0.01,
|
|
61
|
-
default: DEFAULT_BRIGHTNESS_AMOUNT,
|
|
62
|
-
description: "Amount",
|
|
63
|
-
hiddenFromList: false
|
|
64
|
-
};
|
|
65
|
-
var hueDegreesSchema = {
|
|
66
|
-
type: "rotation-degrees",
|
|
67
|
-
step: 1,
|
|
68
|
-
default: DEFAULT_HUE_DEGREES,
|
|
69
|
-
description: "Degrees"
|
|
70
|
-
};
|
|
71
|
-
var assertOptionalFiniteNumber = (value, name) => {
|
|
72
|
-
if (value === undefined) {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
assertRequiredFiniteNumber(value, name);
|
|
76
|
-
};
|
|
77
|
-
var validateUnitInterval = (value, name) => {
|
|
78
|
-
if (value < 0) {
|
|
79
|
-
throw new TypeError(`"${name}" must be >= 0, but got ${JSON.stringify(value)}`);
|
|
80
|
-
}
|
|
81
|
-
if (value > 1) {
|
|
82
|
-
throw new TypeError(`"${name}" must be <= 1, but got ${JSON.stringify(value)}`);
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
var validateNonNegative = (value, name) => {
|
|
86
|
-
if (value < 0) {
|
|
87
|
-
throw new TypeError(`"${name}" must be >= 0, but got ${JSON.stringify(value)}`);
|
|
88
|
-
}
|
|
89
|
-
};
|
|
90
|
-
var validateSignedUnitInterval = (value, name) => {
|
|
91
|
-
if (value < -1) {
|
|
92
|
-
throw new TypeError(`"${name}" must be >= -1, but got ${JSON.stringify(value)}`);
|
|
93
|
-
}
|
|
94
|
-
if (value > 1) {
|
|
95
|
-
throw new TypeError(`"${name}" must be <= 1, but got ${JSON.stringify(value)}`);
|
|
96
|
-
}
|
|
97
|
-
};
|
|
98
|
-
var clampColorChannel = (value) => {
|
|
99
|
-
return Math.max(0, Math.min(255, value));
|
|
100
|
-
};
|
|
101
|
-
var parseColorRgba = (ctx, color) => {
|
|
102
|
-
ctx.clearRect(0, 0, 1, 1);
|
|
103
|
-
ctx.fillStyle = color;
|
|
104
|
-
ctx.fillRect(0, 0, 1, 1);
|
|
105
|
-
const { data } = ctx.getImageData(0, 0, 1, 1);
|
|
106
|
-
return [data[0], data[1], data[2], data[3]];
|
|
107
|
-
};
|
|
1
|
+
import"./index-8p04sssx.mjs";
|
|
2
|
+
import {
|
|
3
|
+
createColorMatrixImplementations
|
|
4
|
+
} from "./index-cdp7tr8x.mjs";
|
|
5
|
+
import {
|
|
6
|
+
DEFAULT_HUE_DEGREES,
|
|
7
|
+
hueDegreesSchema,
|
|
8
|
+
assertOptionalFiniteNumber
|
|
9
|
+
} from "./index-wxhvgv2s.mjs";
|
|
10
|
+
import {
|
|
11
|
+
assertEffectParamsObject
|
|
12
|
+
} from "./index-4fvp93ps.mjs";
|
|
108
13
|
|
|
109
14
|
// src/hue.ts
|
|
15
|
+
import { Internals } from "remotion";
|
|
110
16
|
var { createEffect } = Internals;
|
|
111
17
|
var hueSchema = {
|
|
112
18
|
degrees: hueDegreesSchema
|
|
@@ -122,25 +28,52 @@ var hue = createEffect({
|
|
|
122
28
|
type: "dev.remotion.effects.hue",
|
|
123
29
|
label: "hue()",
|
|
124
30
|
documentationLink: "https://www.remotion.dev/docs/effects/hue",
|
|
125
|
-
backend: "2d",
|
|
126
31
|
calculateKey: (params) => {
|
|
127
32
|
const r = resolve(params);
|
|
128
33
|
return `hue-${r.degrees}`;
|
|
129
34
|
},
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
35
|
+
implementations: {
|
|
36
|
+
...createColorMatrixImplementations("hue", (params) => {
|
|
37
|
+
const { degrees } = resolve(params);
|
|
38
|
+
const radians = degrees % 360 * Math.PI / 180;
|
|
39
|
+
const cosine = Math.cos(radians);
|
|
40
|
+
const sine = Math.sin(radians);
|
|
41
|
+
return new Float32Array([
|
|
42
|
+
0.213 + 0.787 * cosine - 0.213 * sine,
|
|
43
|
+
0.715 - 0.715 * cosine - 0.715 * sine,
|
|
44
|
+
0.072 - 0.072 * cosine + 0.928 * sine,
|
|
45
|
+
0,
|
|
46
|
+
0.213 - 0.213 * cosine + 0.143 * sine,
|
|
47
|
+
0.715 + 0.285 * cosine + 0.14 * sine,
|
|
48
|
+
0.072 - 0.072 * cosine - 0.283 * sine,
|
|
49
|
+
0,
|
|
50
|
+
0.213 - 0.213 * cosine - 0.787 * sine,
|
|
51
|
+
0.715 - 0.715 * cosine + 0.715 * sine,
|
|
52
|
+
0.072 + 0.928 * cosine + 0.072 * sine,
|
|
53
|
+
0,
|
|
54
|
+
0,
|
|
55
|
+
0,
|
|
56
|
+
degrees % 360 === 0 ? 1 : 0,
|
|
57
|
+
0
|
|
58
|
+
]);
|
|
59
|
+
}),
|
|
60
|
+
"2d": Internals.createEffectImplementation({
|
|
61
|
+
setup: () => null,
|
|
62
|
+
apply: ({ source, target, width, height, params }) => {
|
|
63
|
+
const ctx = target.getContext("2d");
|
|
64
|
+
if (!ctx) {
|
|
65
|
+
throw new Error("Failed to acquire 2D context for hue effect. The canvas may have been assigned a different context type.");
|
|
66
|
+
}
|
|
67
|
+
const r = resolve(params);
|
|
68
|
+
ctx.clearRect(0, 0, width, height);
|
|
69
|
+
ctx.filter = `hue-rotate(${r.degrees}deg)`;
|
|
70
|
+
ctx.drawImage(source, 0, 0, width, height);
|
|
71
|
+
ctx.filter = "none";
|
|
72
|
+
},
|
|
73
|
+
cleanup: () => {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
})
|
|
144
77
|
},
|
|
145
78
|
schema: hueSchema,
|
|
146
79
|
validateParams: validateHueParams
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import {
|
|
2
|
+
WEBGPU_SINGLE_PASS_VERTEX
|
|
3
|
+
} from "./index-tvfexb7s.mjs";
|
|
4
|
+
|
|
5
|
+
// src/progressive-pixelate-runtime.ts
|
|
6
|
+
import { Internals } from "remotion";
|
|
7
|
+
var { createWebGL2ContextError } = Internals;
|
|
8
|
+
var VERTEX_SHADER = `#version 300 es
|
|
9
|
+
layout(location = 0) in vec2 aPos;
|
|
10
|
+
layout(location = 1) in vec2 aUv;
|
|
11
|
+
out vec2 vUv;
|
|
12
|
+
|
|
13
|
+
void main() {
|
|
14
|
+
vUv = aUv;
|
|
15
|
+
gl_Position = vec4(aPos, 0.0, 1.0);
|
|
16
|
+
}
|
|
17
|
+
`;
|
|
18
|
+
var FRAGMENT_SHADER = `#version 300 es
|
|
19
|
+
precision highp float;
|
|
20
|
+
|
|
21
|
+
in vec2 vUv;
|
|
22
|
+
out vec4 fragColor;
|
|
23
|
+
|
|
24
|
+
uniform sampler2D uSource;
|
|
25
|
+
uniform vec2 uResolution;
|
|
26
|
+
uniform int uMode;
|
|
27
|
+
uniform vec2 uStart;
|
|
28
|
+
uniform vec2 uEnd;
|
|
29
|
+
uniform vec2 uCenter;
|
|
30
|
+
uniform float uWidth;
|
|
31
|
+
uniform float uHeight;
|
|
32
|
+
uniform float uRotation;
|
|
33
|
+
uniform float uRadialStart;
|
|
34
|
+
uniform float uStartBlockSize;
|
|
35
|
+
uniform float uEndBlockSize;
|
|
36
|
+
|
|
37
|
+
float linearProgress(vec2 uv) {
|
|
38
|
+
vec2 gradient = uEnd - uStart;
|
|
39
|
+
float gradientLengthSq = dot(gradient, gradient);
|
|
40
|
+
if (gradientLengthSq <= 0.0000001) {
|
|
41
|
+
return 0.0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return clamp(dot(uv - uStart, gradient) / gradientLengthSq, 0.0, 1.0);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
float radialProgress(vec2 uv) {
|
|
48
|
+
vec2 radii = vec2(uWidth * uResolution.x, uHeight * uResolution.y) * 0.5;
|
|
49
|
+
if (radii.x <= 0.0000001 || radii.y <= 0.0000001) {
|
|
50
|
+
return 0.0;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
vec2 delta = (uv - uCenter) * uResolution;
|
|
54
|
+
float angle = radians(uRotation);
|
|
55
|
+
float c = cos(angle);
|
|
56
|
+
float s = sin(angle);
|
|
57
|
+
vec2 local = vec2(
|
|
58
|
+
c * delta.x + s * delta.y,
|
|
59
|
+
-s * delta.x + c * delta.y
|
|
60
|
+
);
|
|
61
|
+
float ellipseProgress = clamp(length(local / radii), 0.0, 1.0);
|
|
62
|
+
float distance = 1.0 - uRadialStart;
|
|
63
|
+
return abs(distance) <= 0.0000001
|
|
64
|
+
? step(uRadialStart, ellipseProgress)
|
|
65
|
+
: clamp((ellipseProgress - uRadialStart) / distance, 0.0, 1.0);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
vec4 samplePixelated(float blockSize) {
|
|
69
|
+
vec2 pixelSizeUv = vec2(blockSize) / uResolution;
|
|
70
|
+
vec2 blockUv = floor(vUv / pixelSizeUv) * pixelSizeUv + pixelSizeUv * 0.5;
|
|
71
|
+
return texture(uSource, blockUv);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
void main() {
|
|
75
|
+
// Public UV coordinates use top-left origin, matching canvas/CSS coordinates.
|
|
76
|
+
vec2 publicUv = vec2(vUv.x, 1.0 - vUv.y);
|
|
77
|
+
float progress = uMode == 0
|
|
78
|
+
? linearProgress(publicUv)
|
|
79
|
+
: radialProgress(publicUv);
|
|
80
|
+
float targetBlockSize = max(
|
|
81
|
+
1.0,
|
|
82
|
+
mix(uStartBlockSize, uEndBlockSize, progress)
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
// Adjacent power-of-two grids remain aligned as the block size changes.
|
|
86
|
+
float level = log2(targetBlockSize);
|
|
87
|
+
float lowerBlockSize = exp2(floor(level));
|
|
88
|
+
float upperBlockSize = lowerBlockSize * 2.0;
|
|
89
|
+
float levelProgress = fract(level);
|
|
90
|
+
fragColor = mix(
|
|
91
|
+
samplePixelated(lowerBlockSize),
|
|
92
|
+
samplePixelated(upperBlockSize),
|
|
93
|
+
levelProgress
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
`;
|
|
97
|
+
var compileShader = (gl, type, source) => {
|
|
98
|
+
const shader = gl.createShader(type);
|
|
99
|
+
if (!shader) {
|
|
100
|
+
throw new Error("Failed to create WebGL shader");
|
|
101
|
+
}
|
|
102
|
+
gl.shaderSource(shader, source);
|
|
103
|
+
gl.compileShader(shader);
|
|
104
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
105
|
+
const log = gl.getShaderInfoLog(shader);
|
|
106
|
+
gl.deleteShader(shader);
|
|
107
|
+
throw new Error(`Progressive pixelate shader compile failed: ${log ?? "(no log)"}`);
|
|
108
|
+
}
|
|
109
|
+
return shader;
|
|
110
|
+
};
|
|
111
|
+
var linkProgram = (gl, vs, fs) => {
|
|
112
|
+
const program = gl.createProgram();
|
|
113
|
+
if (!program) {
|
|
114
|
+
throw new Error("Failed to create WebGL program");
|
|
115
|
+
}
|
|
116
|
+
gl.attachShader(program, vs);
|
|
117
|
+
gl.attachShader(program, fs);
|
|
118
|
+
gl.linkProgram(program);
|
|
119
|
+
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
120
|
+
const log = gl.getProgramInfoLog(program);
|
|
121
|
+
gl.deleteProgram(program);
|
|
122
|
+
throw new Error(`Progressive pixelate program link failed: ${log ?? "(no log)"}`);
|
|
123
|
+
}
|
|
124
|
+
return program;
|
|
125
|
+
};
|
|
126
|
+
var setupProgressivePixelate = (target) => {
|
|
127
|
+
const gl = target.getContext("webgl2", {
|
|
128
|
+
premultipliedAlpha: true,
|
|
129
|
+
alpha: true,
|
|
130
|
+
preserveDrawingBuffer: true
|
|
131
|
+
});
|
|
132
|
+
if (!gl) {
|
|
133
|
+
throw createWebGL2ContextError("progressive pixelate effect");
|
|
134
|
+
}
|
|
135
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
|
|
136
|
+
const vs = compileShader(gl, gl.VERTEX_SHADER, VERTEX_SHADER);
|
|
137
|
+
const fs = compileShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SHADER);
|
|
138
|
+
const program = linkProgram(gl, vs, fs);
|
|
139
|
+
gl.deleteShader(vs);
|
|
140
|
+
gl.deleteShader(fs);
|
|
141
|
+
const vao = gl.createVertexArray();
|
|
142
|
+
if (!vao) {
|
|
143
|
+
throw new Error("Failed to create WebGL vertex array");
|
|
144
|
+
}
|
|
145
|
+
gl.bindVertexArray(vao);
|
|
146
|
+
const data = new Float32Array([
|
|
147
|
+
-1,
|
|
148
|
+
-1,
|
|
149
|
+
0,
|
|
150
|
+
0,
|
|
151
|
+
1,
|
|
152
|
+
-1,
|
|
153
|
+
1,
|
|
154
|
+
0,
|
|
155
|
+
-1,
|
|
156
|
+
1,
|
|
157
|
+
0,
|
|
158
|
+
1,
|
|
159
|
+
1,
|
|
160
|
+
1,
|
|
161
|
+
1,
|
|
162
|
+
1
|
|
163
|
+
]);
|
|
164
|
+
const vbo = gl.createBuffer();
|
|
165
|
+
if (!vbo) {
|
|
166
|
+
throw new Error("Failed to create WebGL buffer");
|
|
167
|
+
}
|
|
168
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
|
|
169
|
+
gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
|
|
170
|
+
gl.enableVertexAttribArray(0);
|
|
171
|
+
gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 16, 0);
|
|
172
|
+
gl.enableVertexAttribArray(1);
|
|
173
|
+
gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 16, 8);
|
|
174
|
+
gl.bindVertexArray(null);
|
|
175
|
+
const texture = gl.createTexture();
|
|
176
|
+
if (!texture) {
|
|
177
|
+
throw new Error("Failed to create WebGL texture");
|
|
178
|
+
}
|
|
179
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
180
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
181
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
182
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
183
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
184
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
185
|
+
return {
|
|
186
|
+
gl,
|
|
187
|
+
program,
|
|
188
|
+
vao,
|
|
189
|
+
vbo,
|
|
190
|
+
texture,
|
|
191
|
+
uniforms: {
|
|
192
|
+
uSource: gl.getUniformLocation(program, "uSource"),
|
|
193
|
+
uResolution: gl.getUniformLocation(program, "uResolution"),
|
|
194
|
+
uMode: gl.getUniformLocation(program, "uMode"),
|
|
195
|
+
uStart: gl.getUniformLocation(program, "uStart"),
|
|
196
|
+
uEnd: gl.getUniformLocation(program, "uEnd"),
|
|
197
|
+
uCenter: gl.getUniformLocation(program, "uCenter"),
|
|
198
|
+
uWidth: gl.getUniformLocation(program, "uWidth"),
|
|
199
|
+
uHeight: gl.getUniformLocation(program, "uHeight"),
|
|
200
|
+
uRotation: gl.getUniformLocation(program, "uRotation"),
|
|
201
|
+
uRadialStart: gl.getUniformLocation(program, "uRadialStart"),
|
|
202
|
+
uStartBlockSize: gl.getUniformLocation(program, "uStartBlockSize"),
|
|
203
|
+
uEndBlockSize: gl.getUniformLocation(program, "uEndBlockSize")
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
};
|
|
207
|
+
var prepareProgressivePixelate = ({
|
|
208
|
+
state,
|
|
209
|
+
source,
|
|
210
|
+
width,
|
|
211
|
+
height,
|
|
212
|
+
flipSourceY
|
|
213
|
+
}) => {
|
|
214
|
+
const { gl, uniforms } = state;
|
|
215
|
+
gl.viewport(0, 0, width, height);
|
|
216
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
217
|
+
gl.clearColor(0, 0, 0, 0);
|
|
218
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
219
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
220
|
+
gl.bindTexture(gl.TEXTURE_2D, state.texture);
|
|
221
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
222
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
|
|
223
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
224
|
+
gl.useProgram(state.program);
|
|
225
|
+
if (uniforms.uSource)
|
|
226
|
+
gl.uniform1i(uniforms.uSource, 0);
|
|
227
|
+
if (uniforms.uResolution)
|
|
228
|
+
gl.uniform2f(uniforms.uResolution, width, height);
|
|
229
|
+
};
|
|
230
|
+
var drawProgressivePixelate = (state) => {
|
|
231
|
+
const { gl } = state;
|
|
232
|
+
gl.bindVertexArray(state.vao);
|
|
233
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
234
|
+
gl.bindVertexArray(null);
|
|
235
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
236
|
+
gl.useProgram(null);
|
|
237
|
+
};
|
|
238
|
+
var cleanupProgressivePixelate = ({
|
|
239
|
+
gl,
|
|
240
|
+
program,
|
|
241
|
+
vao,
|
|
242
|
+
vbo,
|
|
243
|
+
texture
|
|
244
|
+
}) => {
|
|
245
|
+
gl.deleteTexture(texture);
|
|
246
|
+
gl.deleteBuffer(vbo);
|
|
247
|
+
gl.deleteProgram(program);
|
|
248
|
+
gl.deleteVertexArray(vao);
|
|
249
|
+
};
|
|
250
|
+
var PROGRESSIVE_PIXELATE_WEBGPU_SHADER = `
|
|
251
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
252
|
+
struct Params {
|
|
253
|
+
resolutionModeBlock: vec4f,
|
|
254
|
+
startEnd: vec4f,
|
|
255
|
+
centerSize: vec4f,
|
|
256
|
+
controls: vec4f,
|
|
257
|
+
}
|
|
258
|
+
@group(0) @binding(0) var source: texture_2d<f32>;
|
|
259
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
260
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
261
|
+
fn linearProgress(uv: vec2f) -> f32 {
|
|
262
|
+
let gradient = params.startEnd.zw - params.startEnd.xy;
|
|
263
|
+
let gradientLengthSq = dot(gradient, gradient);
|
|
264
|
+
if (gradientLengthSq <= 0.0000001) { return 0.0; }
|
|
265
|
+
return clamp(dot(uv - params.startEnd.xy, gradient) / gradientLengthSq, 0.0, 1.0);
|
|
266
|
+
}
|
|
267
|
+
fn radialProgress(uv: vec2f) -> f32 {
|
|
268
|
+
let radii = params.centerSize.zw * params.resolutionModeBlock.xy * 0.5;
|
|
269
|
+
if (radii.x <= 0.0000001 || radii.y <= 0.0000001) { return 0.0; }
|
|
270
|
+
let delta = (uv - params.centerSize.xy) * params.resolutionModeBlock.xy;
|
|
271
|
+
let angle = radians(params.controls.x);
|
|
272
|
+
let c = cos(angle);
|
|
273
|
+
let s = sin(angle);
|
|
274
|
+
let local = vec2f(c * delta.x + s * delta.y, -s * delta.x + c * delta.y);
|
|
275
|
+
let ellipseProgress = clamp(length(local / radii), 0.0, 1.0);
|
|
276
|
+
let distance = 1.0 - params.controls.y;
|
|
277
|
+
if (abs(distance) <= 0.0000001) { return step(params.controls.y, ellipseProgress); }
|
|
278
|
+
return clamp((ellipseProgress - params.controls.y) / distance, 0.0, 1.0);
|
|
279
|
+
}
|
|
280
|
+
fn samplePixelated(uv: vec2f, blockSize: f32) -> vec4f {
|
|
281
|
+
let pixelSizeUv = vec2f(blockSize) / params.resolutionModeBlock.xy;
|
|
282
|
+
let blockUv = floor(uv / pixelSizeUv) * pixelSizeUv + pixelSizeUv * 0.5;
|
|
283
|
+
return textureSampleLevel(source, sourceSampler, vec2f(blockUv.x, 1.0 - blockUv.y), 0);
|
|
284
|
+
}
|
|
285
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
286
|
+
var progress: f32;
|
|
287
|
+
if (params.resolutionModeBlock.z == 0.0) { progress = linearProgress(input.uv); }
|
|
288
|
+
else { progress = radialProgress(input.uv); }
|
|
289
|
+
let targetBlockSize = max(1.0, mix(params.resolutionModeBlock.w, params.controls.z, progress));
|
|
290
|
+
let level = log2(targetBlockSize);
|
|
291
|
+
let lowerBlockSize = exp2(floor(level));
|
|
292
|
+
let upperBlockSize = lowerBlockSize * 2.0;
|
|
293
|
+
let levelProgress = fract(level);
|
|
294
|
+
let uv = vec2f(input.uv.x, 1.0 - input.uv.y);
|
|
295
|
+
return mix(samplePixelated(uv, lowerBlockSize), samplePixelated(uv, upperBlockSize), levelProgress);
|
|
296
|
+
}
|
|
297
|
+
`;
|
|
298
|
+
|
|
299
|
+
export { setupProgressivePixelate, prepareProgressivePixelate, drawProgressivePixelate, cleanupProgressivePixelate, PROGRESSIVE_PIXELATE_WEBGPU_SHADER };
|