@remotion/effects 4.0.539 → 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 +15 -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/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 +195 -211
- 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 +134 -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 +133 -153
- 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/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/webgpu-shader.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 +43 -3
|
@@ -1,110 +1,50 @@
|
|
|
1
|
+
import {
|
|
2
|
+
assertOptionalFiniteNumber,
|
|
3
|
+
validateUnitInterval
|
|
4
|
+
} from "./index-wxhvgv2s.mjs";
|
|
5
|
+
import {
|
|
6
|
+
WEBGPU_SINGLE_PASS_VERTEX,
|
|
7
|
+
setupWebGpuSinglePass,
|
|
8
|
+
cleanupWebGpuSinglePass,
|
|
9
|
+
applyWebGpuSinglePass
|
|
10
|
+
} from "./index-tvfexb7s.mjs";
|
|
11
|
+
import {
|
|
12
|
+
assertEffectParamsObject
|
|
13
|
+
} from "./index-4fvp93ps.mjs";
|
|
14
|
+
|
|
1
15
|
// src/pixel-dissolve.ts
|
|
2
16
|
import { Internals } from "remotion";
|
|
3
17
|
|
|
4
|
-
// src/
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
var assertRequiredFiniteNumber = (value, name) => {
|
|
11
|
-
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
12
|
-
throw new TypeError(`"${name}" must be a finite number, but got ${JSON.stringify(value)}`);
|
|
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
|
-
};
|
|
18
|
+
// src/pixel-dissolve-webgpu-shader.ts
|
|
19
|
+
var PIXEL_DISSOLVE_WEBGPU_SHADER = `
|
|
20
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
21
|
+
@group(0) @binding(0) var source: texture_2d<f32>;
|
|
22
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
23
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
34
24
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
var
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
};
|
|
25
|
+
struct Params { progress: f32, columns: f32, rows: f32, seed: f32, feather: f32, }
|
|
26
|
+
|
|
27
|
+
fn hash21(p: vec2f) -> f32 {
|
|
28
|
+
var p3 = fract(p.xyx * vec3f(443.8975, 397.2973, 491.1871));
|
|
29
|
+
p3 += vec3f(dot(p3, p3.yzx + vec3f(19.19)));
|
|
30
|
+
return fract((p3.x + p3.y) * p3.z);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
34
|
+
let divisions = max(vec2f(params.columns, params.rows), vec2f(1));
|
|
35
|
+
let uv = vec2f(input.uv.x, 1.0 - input.uv.y);
|
|
36
|
+
let cell = floor(min(uv, vec2f(1.0 - 0.000001)) * divisions + vec2f(0.00001));
|
|
37
|
+
let color = textureSampleLevel(source, sourceSampler, input.uv, 0);
|
|
38
|
+
let noise = hash21(cell + vec2f(params.seed, params.seed * 1.618));
|
|
39
|
+
let edge = max(params.feather, 0.0);
|
|
40
|
+
let threshold = 1.0 - clamp(params.progress, 0.0, 1.0) * (1.0 + edge);
|
|
41
|
+
var mask: f32;
|
|
42
|
+
if (edge <= 0.0001) { mask = 1.0 - step(threshold, noise); }
|
|
43
|
+
else { mask = 1.0 - smoothstep(threshold, threshold + edge, noise); }
|
|
44
|
+
return color * mask;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
`;
|
|
108
48
|
|
|
109
49
|
// src/pixel-dissolve.ts
|
|
110
50
|
var { createEffect, createWebGL2ContextError } = Internals;
|
|
@@ -237,7 +177,8 @@ float dissolveMask(float noise, float progress, float feather) {
|
|
|
237
177
|
void main() {
|
|
238
178
|
vec2 divisions = max(vec2(uColumns, uRows), vec2(1.0));
|
|
239
179
|
vec2 gridUv = min(vUv, vec2(1.0) - vec2(0.000001));
|
|
240
|
-
|
|
180
|
+
// Stabilize cells when a pixel center falls exactly on a grid boundary.
|
|
181
|
+
vec2 cell = floor(gridUv * divisions + vec2(0.00001));
|
|
241
182
|
vec4 color = texture(uSource, vUv);
|
|
242
183
|
|
|
243
184
|
float noise = hash21(cell + vec2(uSeed, uSeed * 1.618));
|
|
@@ -293,92 +234,123 @@ var pixelDissolve = createEffect({
|
|
|
293
234
|
type: "dev.remotion.effects.pixelDissolve",
|
|
294
235
|
label: "pixelDissolve()",
|
|
295
236
|
documentationLink: "https://www.remotion.dev/docs/effects/pixel-dissolve",
|
|
296
|
-
backend: "webgl2",
|
|
297
237
|
calculateKey: (params) => {
|
|
298
238
|
const r = resolve(params);
|
|
299
239
|
return `pixel-dissolve-${r.progress}-${r.columns}-${r.rows}-${r.seed}-${r.feather}`;
|
|
300
240
|
},
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
241
|
+
implementations: {
|
|
242
|
+
webgpu: Internals.createEffectImplementation({
|
|
243
|
+
setup: (target) => setupWebGpuSinglePass(target, "pixel-dissolve"),
|
|
244
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
245
|
+
if (!gpuDevice)
|
|
246
|
+
throw new Error("A WebGPU device is required for the pixel-dissolve effect");
|
|
247
|
+
const r = resolve(params);
|
|
248
|
+
const uniformData = new Float32Array([
|
|
249
|
+
r.progress,
|
|
250
|
+
r.columns,
|
|
251
|
+
r.rows,
|
|
252
|
+
r.seed,
|
|
253
|
+
r.feather,
|
|
254
|
+
0,
|
|
255
|
+
0,
|
|
256
|
+
0
|
|
257
|
+
]);
|
|
258
|
+
applyWebGpuSinglePass({
|
|
259
|
+
state,
|
|
260
|
+
source,
|
|
261
|
+
width,
|
|
262
|
+
height,
|
|
263
|
+
device: gpuDevice,
|
|
264
|
+
shader: PIXEL_DISSOLVE_WEBGPU_SHADER,
|
|
265
|
+
uniformData
|
|
266
|
+
});
|
|
267
|
+
},
|
|
268
|
+
cleanup: cleanupWebGpuSinglePass
|
|
269
|
+
}),
|
|
270
|
+
webgl2: Internals.createEffectImplementation({
|
|
271
|
+
setup: (target) => {
|
|
272
|
+
const gl = target.getContext("webgl2", {
|
|
273
|
+
premultipliedAlpha: true,
|
|
274
|
+
alpha: true,
|
|
275
|
+
preserveDrawingBuffer: true
|
|
276
|
+
});
|
|
277
|
+
if (!gl) {
|
|
278
|
+
throw createWebGL2ContextError("pixel dissolve effect");
|
|
279
|
+
}
|
|
280
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
|
|
281
|
+
const vs = compileShader(gl, gl.VERTEX_SHADER, VERTEX_SHADER);
|
|
282
|
+
const fs = compileShader(gl, gl.FRAGMENT_SHADER, FRAGMENT_SHADER);
|
|
283
|
+
const program = linkProgram(gl, vs, fs);
|
|
284
|
+
gl.deleteShader(vs);
|
|
285
|
+
gl.deleteShader(fs);
|
|
286
|
+
const { vao, vbo } = createFullscreenQuad(gl);
|
|
287
|
+
const aPos = gl.getAttribLocation(program, "aPos");
|
|
288
|
+
const aUv = gl.getAttribLocation(program, "aUv");
|
|
289
|
+
gl.enableVertexAttribArray(aPos);
|
|
290
|
+
gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 16, 0);
|
|
291
|
+
gl.enableVertexAttribArray(aUv);
|
|
292
|
+
gl.vertexAttribPointer(aUv, 2, gl.FLOAT, false, 16, 8);
|
|
293
|
+
gl.bindVertexArray(null);
|
|
294
|
+
const texture = gl.createTexture();
|
|
295
|
+
if (!texture) {
|
|
296
|
+
throw new Error("Failed to create WebGL texture");
|
|
297
|
+
}
|
|
298
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
299
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
300
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
301
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
302
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
303
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
304
|
+
return {
|
|
305
|
+
gl,
|
|
306
|
+
program,
|
|
307
|
+
vao,
|
|
308
|
+
vbo,
|
|
309
|
+
texture,
|
|
310
|
+
uSource: gl.getUniformLocation(program, "uSource"),
|
|
311
|
+
uProgress: gl.getUniformLocation(program, "uProgress"),
|
|
312
|
+
uColumns: gl.getUniformLocation(program, "uColumns"),
|
|
313
|
+
uRows: gl.getUniformLocation(program, "uRows"),
|
|
314
|
+
uSeed: gl.getUniformLocation(program, "uSeed"),
|
|
315
|
+
uFeather: gl.getUniformLocation(program, "uFeather")
|
|
316
|
+
};
|
|
317
|
+
},
|
|
318
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
319
|
+
const r = resolve(params);
|
|
320
|
+
state.gl.viewport(0, 0, width, height);
|
|
321
|
+
state.gl.bindFramebuffer(state.gl.FRAMEBUFFER, null);
|
|
322
|
+
state.gl.clearColor(0, 0, 0, 0);
|
|
323
|
+
state.gl.clear(state.gl.COLOR_BUFFER_BIT);
|
|
324
|
+
state.gl.useProgram(state.program);
|
|
325
|
+
state.gl.bindVertexArray(state.vao);
|
|
326
|
+
state.gl.activeTexture(state.gl.TEXTURE0);
|
|
327
|
+
state.gl.bindTexture(state.gl.TEXTURE_2D, state.texture);
|
|
328
|
+
state.gl.pixelStorei(state.gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
329
|
+
state.gl.texImage2D(state.gl.TEXTURE_2D, 0, state.gl.RGBA, state.gl.RGBA, state.gl.UNSIGNED_BYTE, source);
|
|
330
|
+
if (state.uSource)
|
|
331
|
+
state.gl.uniform1i(state.uSource, 0);
|
|
332
|
+
if (state.uProgress)
|
|
333
|
+
state.gl.uniform1f(state.uProgress, r.progress);
|
|
334
|
+
if (state.uColumns)
|
|
335
|
+
state.gl.uniform1f(state.uColumns, r.columns);
|
|
336
|
+
if (state.uRows)
|
|
337
|
+
state.gl.uniform1f(state.uRows, r.rows);
|
|
338
|
+
if (state.uSeed)
|
|
339
|
+
state.gl.uniform1f(state.uSeed, r.seed);
|
|
340
|
+
if (state.uFeather)
|
|
341
|
+
state.gl.uniform1f(state.uFeather, r.feather);
|
|
342
|
+
state.gl.drawArrays(state.gl.TRIANGLE_STRIP, 0, 4);
|
|
343
|
+
state.gl.bindVertexArray(null);
|
|
344
|
+
state.gl.bindTexture(state.gl.TEXTURE_2D, null);
|
|
345
|
+
state.gl.useProgram(null);
|
|
346
|
+
},
|
|
347
|
+
cleanup: ({ gl, program, vao, vbo, texture }) => {
|
|
348
|
+
gl.deleteTexture(texture);
|
|
349
|
+
gl.deleteBuffer(vbo);
|
|
350
|
+
gl.deleteProgram(program);
|
|
351
|
+
gl.deleteVertexArray(vao);
|
|
352
|
+
}
|
|
353
|
+
})
|
|
382
354
|
},
|
|
383
355
|
schema: pixelDissolveSchema,
|
|
384
356
|
validateParams: validatePixelDissolveParams
|
package/dist/esm/pixelate.mjs
CHANGED
|
@@ -1,112 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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 {
|
|
2
|
+
assertOptionalFiniteNumber
|
|
3
|
+
} from "./index-wxhvgv2s.mjs";
|
|
4
|
+
import {
|
|
5
|
+
WEBGPU_SINGLE_PASS_VERTEX,
|
|
6
|
+
setupWebGpuSinglePass,
|
|
7
|
+
cleanupWebGpuSinglePass,
|
|
8
|
+
applyWebGpuSinglePass
|
|
9
|
+
} from "./index-tvfexb7s.mjs";
|
|
10
|
+
import {
|
|
11
|
+
assertEffectParamsObject
|
|
12
|
+
} from "./index-4fvp93ps.mjs";
|
|
108
13
|
|
|
109
14
|
// src/pixelate.ts
|
|
15
|
+
import { Internals } from "remotion";
|
|
110
16
|
var { createEffect, createWebGL2ContextError } = Internals;
|
|
111
17
|
var DEFAULT_BLOCK_SIZE = 20;
|
|
112
18
|
var pixelateSchema = {
|
|
@@ -152,7 +58,8 @@ uniform vec2 uResolution;
|
|
|
152
58
|
|
|
153
59
|
void main() {
|
|
154
60
|
vec2 pixelSizeUv = vec2(uBlockSize) / uResolution;
|
|
155
|
-
|
|
61
|
+
// Use fragment pixels directly so fractional grid boundaries do not depend on UV interpolation.
|
|
62
|
+
vec2 blockUv = (floor(gl_FragCoord.xy / uBlockSize) + 0.5) * pixelSizeUv;
|
|
156
63
|
fragColor = texture(uSource, blockUv);
|
|
157
64
|
}
|
|
158
65
|
`;
|
|
@@ -248,55 +155,91 @@ var createPixelateState = (gl) => {
|
|
|
248
155
|
uBlockSize: gl.getUniformLocation(program, "uBlockSize")
|
|
249
156
|
};
|
|
250
157
|
};
|
|
158
|
+
var WEBGPU_SHADER = `
|
|
159
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
160
|
+
struct Params { resolutionBlockSize: vec4f, }
|
|
161
|
+
@group(0) @binding(0) var source: texture_2d<f32>;
|
|
162
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
163
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
164
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
165
|
+
let pixelSizeUv = vec2f(params.resolutionBlockSize.z) / params.resolutionBlockSize.xy;
|
|
166
|
+
// Keep the original grid anchored at the bottom-left corner.
|
|
167
|
+
let pixel = vec2f(input.position.x, params.resolutionBlockSize.y - input.position.y);
|
|
168
|
+
let blockUv = (floor(pixel / params.resolutionBlockSize.z) + 0.5) * pixelSizeUv;
|
|
169
|
+
return textureSampleLevel(source, sourceSampler, vec2f(blockUv.x, 1.0 - blockUv.y), 0);
|
|
170
|
+
}
|
|
171
|
+
`;
|
|
251
172
|
var pixelate = createEffect({
|
|
252
173
|
type: "dev.remotion.effects.pixelate",
|
|
253
174
|
label: "pixelate()",
|
|
254
175
|
documentationLink: "https://www.remotion.dev/docs/effects/pixelate",
|
|
255
|
-
backend: "webgl2",
|
|
256
176
|
calculateKey: (params) => {
|
|
257
177
|
const r = resolve(params);
|
|
258
178
|
return `pixelate-${r.blockSize}`;
|
|
259
179
|
},
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
180
|
+
implementations: {
|
|
181
|
+
webgpu: Internals.createEffectImplementation({
|
|
182
|
+
setup: (target) => setupWebGpuSinglePass(target, "pixelate"),
|
|
183
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
184
|
+
if (!gpuDevice) {
|
|
185
|
+
throw new Error("A WebGPU device is required for the pixelate effect");
|
|
186
|
+
}
|
|
187
|
+
const r = resolve(params);
|
|
188
|
+
applyWebGpuSinglePass({
|
|
189
|
+
source,
|
|
190
|
+
width,
|
|
191
|
+
height,
|
|
192
|
+
state,
|
|
193
|
+
device: gpuDevice,
|
|
194
|
+
shader: WEBGPU_SHADER,
|
|
195
|
+
uniformData: new Float32Array([width, height, r.blockSize, 0])
|
|
196
|
+
});
|
|
197
|
+
},
|
|
198
|
+
cleanup: cleanupWebGpuSinglePass
|
|
199
|
+
}),
|
|
200
|
+
webgl2: Internals.createEffectImplementation({
|
|
201
|
+
setup: (target) => {
|
|
202
|
+
const gl = target.getContext("webgl2", {
|
|
203
|
+
premultipliedAlpha: true,
|
|
204
|
+
alpha: true,
|
|
205
|
+
preserveDrawingBuffer: true
|
|
206
|
+
});
|
|
207
|
+
if (!gl) {
|
|
208
|
+
throw createWebGL2ContextError("pixelate effect");
|
|
209
|
+
}
|
|
210
|
+
return createPixelateState(gl);
|
|
211
|
+
},
|
|
212
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
213
|
+
const r = resolve(params);
|
|
214
|
+
state.gl.viewport(0, 0, width, height);
|
|
215
|
+
state.gl.clearColor(0, 0, 0, 0);
|
|
216
|
+
state.gl.clear(state.gl.COLOR_BUFFER_BIT);
|
|
217
|
+
state.gl.useProgram(state.program);
|
|
218
|
+
state.gl.bindVertexArray(state.vao);
|
|
219
|
+
state.gl.bindFramebuffer(state.gl.FRAMEBUFFER, null);
|
|
220
|
+
state.gl.activeTexture(state.gl.TEXTURE0);
|
|
221
|
+
state.gl.bindTexture(state.gl.TEXTURE_2D, state.texture);
|
|
222
|
+
state.gl.pixelStorei(state.gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
223
|
+
state.gl.pixelStorei(state.gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
|
|
224
|
+
state.gl.texImage2D(state.gl.TEXTURE_2D, 0, state.gl.RGBA, state.gl.RGBA, state.gl.UNSIGNED_BYTE, source);
|
|
225
|
+
if (state.uSource)
|
|
226
|
+
state.gl.uniform1i(state.uSource, 0);
|
|
227
|
+
if (state.uBlockSize)
|
|
228
|
+
state.gl.uniform1f(state.uBlockSize, r.blockSize);
|
|
229
|
+
if (state.uResolution)
|
|
230
|
+
state.gl.uniform2f(state.uResolution, width, height);
|
|
231
|
+
state.gl.drawArrays(state.gl.TRIANGLE_STRIP, 0, 4);
|
|
232
|
+
state.gl.bindVertexArray(null);
|
|
233
|
+
state.gl.bindTexture(state.gl.TEXTURE_2D, null);
|
|
234
|
+
state.gl.useProgram(null);
|
|
235
|
+
},
|
|
236
|
+
cleanup: ({ gl, program, vao, vbo, texture }) => {
|
|
237
|
+
gl.deleteTexture(texture);
|
|
238
|
+
gl.deleteBuffer(vbo);
|
|
239
|
+
gl.deleteProgram(program);
|
|
240
|
+
gl.deleteVertexArray(vao);
|
|
241
|
+
}
|
|
242
|
+
})
|
|
300
243
|
},
|
|
301
244
|
schema: pixelateSchema,
|
|
302
245
|
validateParams: validatePixelateParams
|