@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/wave.mjs
CHANGED
|
@@ -1,37 +1,17 @@
|
|
|
1
|
+
import {
|
|
2
|
+
WEBGPU_SINGLE_PASS_VERTEX,
|
|
3
|
+
setupWebGpuSinglePass,
|
|
4
|
+
cleanupWebGpuSinglePass,
|
|
5
|
+
applyWebGpuSinglePass
|
|
6
|
+
} from "./index-tvfexb7s.mjs";
|
|
7
|
+
import {
|
|
8
|
+
assertEffectParamsObject,
|
|
9
|
+
assertRequiredFiniteNumber
|
|
10
|
+
} from "./index-4fvp93ps.mjs";
|
|
11
|
+
|
|
1
12
|
// src/wave/index.ts
|
|
2
13
|
import { Internals as Internals2 } from "remotion";
|
|
3
14
|
|
|
4
|
-
// src/validate-effect-param.ts
|
|
5
|
-
var assertEffectParamsObject = (params, effectLabel) => {
|
|
6
|
-
if (params === null || typeof params !== "object") {
|
|
7
|
-
throw new TypeError(`${effectLabel} effect requires a parameters object, but got ${JSON.stringify(params)}`);
|
|
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
|
-
};
|
|
34
|
-
|
|
35
15
|
// src/wave/wave-runtime.ts
|
|
36
16
|
import { Internals } from "remotion";
|
|
37
17
|
|
|
@@ -149,7 +129,6 @@ var setupWave = (target) => {
|
|
|
149
129
|
throw createWebGL2ContextError("wave effect");
|
|
150
130
|
}
|
|
151
131
|
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
|
|
152
|
-
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
|
|
153
132
|
const program = createProgram(gl, WAVE_VS, WAVE_FS);
|
|
154
133
|
const vao = gl.createVertexArray();
|
|
155
134
|
if (!vao) {
|
|
@@ -213,6 +192,7 @@ var applyWave = ({
|
|
|
213
192
|
source,
|
|
214
193
|
width,
|
|
215
194
|
height,
|
|
195
|
+
flipSourceY,
|
|
216
196
|
amplitude,
|
|
217
197
|
wavelength,
|
|
218
198
|
phase,
|
|
@@ -220,6 +200,8 @@ var applyWave = ({
|
|
|
220
200
|
}) => {
|
|
221
201
|
const { gl, program, textureSource, uniforms } = state;
|
|
222
202
|
gl.viewport(0, 0, width, height);
|
|
203
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
204
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
223
205
|
gl.bindTexture(gl.TEXTURE_2D, textureSource);
|
|
224
206
|
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
225
207
|
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
@@ -246,6 +228,32 @@ var applyWave = ({
|
|
|
246
228
|
gl.useProgram(null);
|
|
247
229
|
};
|
|
248
230
|
|
|
231
|
+
// src/wave/webgpu-shader.ts
|
|
232
|
+
var WAVE_WEBGPU_SHADER = `
|
|
233
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
234
|
+
@group(0) @binding(0) var source: texture_2d<f32>;
|
|
235
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
236
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
237
|
+
struct Params { resolutionAndWave: vec4f, phaseAndDirection: vec4f, }
|
|
238
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
239
|
+
let resolution = params.resolutionAndWave.xy;
|
|
240
|
+
let amplitude = params.resolutionAndWave.z;
|
|
241
|
+
let wavelength = max(params.resolutionAndWave.w, 0.001);
|
|
242
|
+
let phase = params.phaseAndDirection.x;
|
|
243
|
+
var uv = input.uv;
|
|
244
|
+
if (params.phaseAndDirection.y == 0.0) {
|
|
245
|
+
let coord = input.uv.x * resolution.x;
|
|
246
|
+
let offset = sin((coord / wavelength) * 6.28318530718 + phase) * amplitude;
|
|
247
|
+
uv.y += offset / resolution.y;
|
|
248
|
+
} else {
|
|
249
|
+
let coord = (1.0 - input.uv.y) * resolution.y;
|
|
250
|
+
let offset = sin((coord / wavelength) * 6.28318530718 + phase) * amplitude;
|
|
251
|
+
uv.x -= offset / resolution.x;
|
|
252
|
+
}
|
|
253
|
+
return textureSampleLevel(source, sourceSampler, uv, 0);
|
|
254
|
+
}
|
|
255
|
+
`;
|
|
256
|
+
|
|
249
257
|
// src/wave/index.ts
|
|
250
258
|
var { createEffect } = Internals2;
|
|
251
259
|
var waveSchema = {
|
|
@@ -315,26 +323,59 @@ var wave = createEffect({
|
|
|
315
323
|
type: "dev.remotion.effects.wave",
|
|
316
324
|
label: "wave()",
|
|
317
325
|
documentationLink: "https://www.remotion.dev/docs/effects/wave",
|
|
318
|
-
backend: "webgl2",
|
|
319
326
|
calculateKey: (params) => {
|
|
320
327
|
const r = resolve(params);
|
|
321
328
|
return `wave-${r.phase}-${r.direction}-${r.amplitude}-${r.wavelength}`;
|
|
322
329
|
},
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
330
|
+
implementations: {
|
|
331
|
+
webgpu: Internals2.createEffectImplementation({
|
|
332
|
+
setup: (target) => setupWebGpuSinglePass(target, "wave"),
|
|
333
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
334
|
+
if (!gpuDevice) {
|
|
335
|
+
throw new Error("A WebGPU device is required for the wave effect");
|
|
336
|
+
}
|
|
337
|
+
const r = resolve(params);
|
|
338
|
+
const uniformData = new Float32Array([
|
|
339
|
+
width,
|
|
340
|
+
height,
|
|
341
|
+
r.amplitude,
|
|
342
|
+
r.wavelength,
|
|
343
|
+
r.phase,
|
|
344
|
+
r.direction === "horizontal" ? 0 : 1,
|
|
345
|
+
0,
|
|
346
|
+
0
|
|
347
|
+
]);
|
|
348
|
+
applyWebGpuSinglePass({
|
|
349
|
+
state,
|
|
350
|
+
source,
|
|
351
|
+
width,
|
|
352
|
+
height,
|
|
353
|
+
device: gpuDevice,
|
|
354
|
+
shader: WAVE_WEBGPU_SHADER,
|
|
355
|
+
uniformData
|
|
356
|
+
});
|
|
357
|
+
},
|
|
358
|
+
cleanup: cleanupWebGpuSinglePass
|
|
359
|
+
}),
|
|
360
|
+
webgl2: Internals2.createEffectImplementation({
|
|
361
|
+
setup: (target) => setupWave(target),
|
|
362
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
363
|
+
const r = resolve(params);
|
|
364
|
+
applyWave({
|
|
365
|
+
state,
|
|
366
|
+
source,
|
|
367
|
+
width,
|
|
368
|
+
height,
|
|
369
|
+
flipSourceY,
|
|
370
|
+
amplitude: r.amplitude,
|
|
371
|
+
wavelength: r.wavelength,
|
|
372
|
+
phase: r.phase,
|
|
373
|
+
direction: r.direction
|
|
374
|
+
});
|
|
375
|
+
},
|
|
376
|
+
cleanup: (state) => cleanupWave(state)
|
|
377
|
+
})
|
|
336
378
|
},
|
|
337
|
-
cleanup: (state) => cleanupWave(state),
|
|
338
379
|
schema: waveSchema,
|
|
339
380
|
validateParams: validateWaveParams
|
|
340
381
|
});
|
package/dist/esm/waves.mjs
CHANGED
|
@@ -1,110 +1,74 @@
|
|
|
1
|
+
import {
|
|
2
|
+
setupWebGpuColors,
|
|
3
|
+
getWebGpuColors
|
|
4
|
+
} from "./index-8jx11jyn.mjs";
|
|
5
|
+
import {
|
|
6
|
+
assertOptionalFiniteNumber,
|
|
7
|
+
parseColorRgba
|
|
8
|
+
} from "./index-wxhvgv2s.mjs";
|
|
9
|
+
import {
|
|
10
|
+
WEBGPU_SINGLE_PASS_VERTEX,
|
|
11
|
+
cleanupWebGpuSinglePass,
|
|
12
|
+
applyWebGpuSinglePass
|
|
13
|
+
} from "./index-tvfexb7s.mjs";
|
|
14
|
+
import {
|
|
15
|
+
assertEffectParamsObject,
|
|
16
|
+
assertRequiredColor,
|
|
17
|
+
assertOptionalBoolean
|
|
18
|
+
} from "./index-4fvp93ps.mjs";
|
|
19
|
+
|
|
1
20
|
// src/waves.ts
|
|
2
21
|
import { Internals } from "remotion";
|
|
3
22
|
|
|
4
|
-
// src/
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
};
|
|
23
|
+
// src/waves-webgpu-shader.ts
|
|
24
|
+
var WAVES_WEBGPU_SHADER = `
|
|
25
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
26
|
+
@group(0) @binding(0) var sourceTexture: texture_2d<f32>;
|
|
27
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
28
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
29
|
+
@group(0) @binding(3) var palette: texture_2d<f32>;
|
|
30
|
+
struct Params {
|
|
31
|
+
geometry: vec4f,
|
|
32
|
+
stripe: vec4f,
|
|
33
|
+
flags: vec4f,
|
|
34
|
+
wave: vec4f,
|
|
35
|
+
}
|
|
36
|
+
fn sampleSource(uv: vec2f) -> vec4f {
|
|
37
|
+
return textureSampleLevel(sourceTexture, sourceSampler, vec2f(uv.x, 1.0 - uv.y), 0);
|
|
38
|
+
}
|
|
39
|
+
fn glslModulo(value: f32, divisor: f32) -> f32 { return value - divisor * floor(value / divisor); }
|
|
40
|
+
fn paletteColor(index: f32) -> vec4f { return textureLoad(palette, vec2i(i32(index), 0), 0); }
|
|
34
41
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
};
|
|
42
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
43
|
+
let vUv = vec2f(input.uv.x, 1.0 - input.uv.y);
|
|
44
|
+
|
|
45
|
+
let texColor = sampleSource(vUv);
|
|
46
|
+
let thickness = max(params.stripe.x, 0.001);
|
|
47
|
+
let spacing = max(params.stripe.y, 0.001);
|
|
48
|
+
let cycle = spacing * params.geometry.z;
|
|
49
|
+
let centered = vec2f(input.position.x, params.geometry.y - input.position.y) - params.geometry.xy * 0.5;
|
|
50
|
+
let s = sin(params.stripe.z);
|
|
51
|
+
let c = cos(params.stripe.z);
|
|
52
|
+
let rotated = vec2f(centered.x * c - centered.y * s, centered.x * s + centered.y * c);
|
|
53
|
+
var axis = select(rotated.x, rotated.y, params.geometry.w == 0.0);
|
|
54
|
+
let waveAxis = select(rotated.y, rotated.x, params.geometry.w == 0.0);
|
|
55
|
+
axis += sin((waveAxis / max(params.wave.y, 0.001)) * 6.283185307179586 + params.wave.z) * params.wave.x;
|
|
56
|
+
|
|
57
|
+
var position = glslModulo(axis + params.stripe.w, cycle);
|
|
58
|
+
if (position < 0.0) { position += cycle; }
|
|
59
|
+
let colorIndex = floor(position / spacing);
|
|
60
|
+
let inStripe = glslModulo(position, spacing);
|
|
61
|
+
if (inStripe > thickness) { return texColor; }
|
|
62
|
+
|
|
63
|
+
let overlay = paletteColor(colorIndex);
|
|
64
|
+
let premultiplied = overlay.rgb * overlay.a;
|
|
65
|
+
if (params.flags.x != 0.0) {
|
|
66
|
+
return vec4f(premultiplied * texColor.a + texColor.rgb * (1.0 - overlay.a), texColor.a);
|
|
67
|
+
}
|
|
68
|
+
return vec4f(premultiplied + texColor.rgb * (1.0 - overlay.a), overlay.a + texColor.a * (1.0 - overlay.a));
|
|
69
|
+
|
|
70
|
+
}
|
|
71
|
+
`;
|
|
108
72
|
|
|
109
73
|
// src/waves.ts
|
|
110
74
|
var { createEffect, createWebGL2ContextError } = Internals;
|
|
@@ -231,7 +195,7 @@ var validatePositive = (value, name) => {
|
|
|
231
195
|
throw new TypeError(`"${name}" must be greater than 0, but got ${JSON.stringify(value)}`);
|
|
232
196
|
}
|
|
233
197
|
};
|
|
234
|
-
var
|
|
198
|
+
var validateNonNegative = (value, name) => {
|
|
235
199
|
if (value < 0) {
|
|
236
200
|
throw new TypeError(`"${name}" must be greater than or equal to 0, but got ${JSON.stringify(value)}`);
|
|
237
201
|
}
|
|
@@ -272,8 +236,8 @@ var validateWavesParams = (params) => {
|
|
|
272
236
|
const amplitude = params.amplitude ?? DEFAULT_AMPLITUDE;
|
|
273
237
|
const wavelength = params.wavelength ?? DEFAULT_WAVELENGTH;
|
|
274
238
|
validatePositive(thickness, "thickness");
|
|
275
|
-
|
|
276
|
-
|
|
239
|
+
validateNonNegative(gap, "gap");
|
|
240
|
+
validateNonNegative(amplitude, "amplitude");
|
|
277
241
|
validatePositive(wavelength, "wavelength");
|
|
278
242
|
};
|
|
279
243
|
var WAVES_VS = `#version 300 es
|
|
@@ -311,7 +275,7 @@ void main() {
|
|
|
311
275
|
float thickness = max(uThickness, 0.001);
|
|
312
276
|
float spacing = max(uSpacing, 0.001);
|
|
313
277
|
float cycle = spacing * uNumColors;
|
|
314
|
-
vec2 centered =
|
|
278
|
+
vec2 centered = gl_FragCoord.xy - uResolution * 0.5;
|
|
315
279
|
float s = sin(uAngle);
|
|
316
280
|
float c = cos(uAngle);
|
|
317
281
|
vec2 rotated = vec2(
|
|
@@ -510,73 +474,121 @@ var waves = createEffect({
|
|
|
510
474
|
type: "dev.remotion.effects.waves",
|
|
511
475
|
label: "waves()",
|
|
512
476
|
documentationLink: "https://www.remotion.dev/docs/effects/waves",
|
|
513
|
-
backend: "webgl2",
|
|
514
477
|
calculateKey: (params) => {
|
|
515
478
|
const r = resolve(params);
|
|
516
479
|
const maskSuffix = r.maskToSourceAlpha ? "-mask-to-source-alpha" : "";
|
|
517
480
|
return `waves-${r.colors.join("|")}-${r.direction}-${r.thickness}-${r.spacing}-${r.angle}-${r.offset}-${r.amplitude}-${r.wavelength}-${r.phase}${maskSuffix}`;
|
|
518
481
|
},
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
482
|
+
implementations: {
|
|
483
|
+
webgpu: Internals.createEffectImplementation({
|
|
484
|
+
setup: (target) => setupWebGpuColors(target, "waves"),
|
|
485
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
486
|
+
if (!gpuDevice)
|
|
487
|
+
throw new Error("A WebGPU device is required for the waves effect");
|
|
488
|
+
const r = resolve(params);
|
|
489
|
+
const colors = getWebGpuColors(state, r.colors);
|
|
490
|
+
const uniformData = new Float32Array([
|
|
491
|
+
width,
|
|
492
|
+
height,
|
|
493
|
+
r.colors.length,
|
|
494
|
+
r.direction === "horizontal" ? 0 : 1,
|
|
495
|
+
r.thickness,
|
|
496
|
+
r.spacing,
|
|
497
|
+
r.angle * Math.PI / 180,
|
|
498
|
+
r.offset,
|
|
499
|
+
r.maskToSourceAlpha ? 1 : 0,
|
|
500
|
+
0,
|
|
501
|
+
0,
|
|
502
|
+
0,
|
|
503
|
+
r.amplitude,
|
|
504
|
+
r.wavelength,
|
|
505
|
+
r.phase * Math.PI / 180,
|
|
506
|
+
0
|
|
507
|
+
]);
|
|
508
|
+
applyWebGpuSinglePass({
|
|
509
|
+
state,
|
|
510
|
+
source,
|
|
511
|
+
width,
|
|
512
|
+
height,
|
|
513
|
+
device: gpuDevice,
|
|
514
|
+
shader: WAVES_WEBGPU_SHADER,
|
|
515
|
+
uniformData
|
|
516
|
+
}, {
|
|
517
|
+
sourceFilter: null,
|
|
518
|
+
auxiliaryTexture: {
|
|
519
|
+
data: colors,
|
|
520
|
+
width: r.colors.length,
|
|
521
|
+
height: 1,
|
|
522
|
+
format: "rgba8unorm"
|
|
523
|
+
}
|
|
524
|
+
});
|
|
525
|
+
},
|
|
526
|
+
cleanup: cleanupWebGpuSinglePass
|
|
527
|
+
}),
|
|
528
|
+
webgl2: Internals.createEffectImplementation({
|
|
529
|
+
setup: (target) => setupWaves(target),
|
|
530
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
531
|
+
const r = resolve(params);
|
|
532
|
+
const paletteDirty = updatePalette(state, r.colors);
|
|
533
|
+
const { gl, program, sourceTexture, paletteTexture, uniforms, vao } = state;
|
|
534
|
+
gl.viewport(0, 0, width, height);
|
|
535
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
536
|
+
gl.clearColor(0, 0, 0, 0);
|
|
537
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
538
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
539
|
+
gl.bindTexture(gl.TEXTURE_2D, sourceTexture);
|
|
540
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
|
|
541
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
542
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
543
|
+
gl.activeTexture(gl.TEXTURE1);
|
|
544
|
+
gl.bindTexture(gl.TEXTURE_2D, paletteTexture);
|
|
545
|
+
if (paletteDirty) {
|
|
546
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
|
|
547
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
|
|
548
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, r.colors.length, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, state.palettePixelData);
|
|
549
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
|
|
550
|
+
}
|
|
551
|
+
gl.useProgram(program);
|
|
552
|
+
if (uniforms.uSource)
|
|
553
|
+
gl.uniform1i(uniforms.uSource, 0);
|
|
554
|
+
if (uniforms.uPalette)
|
|
555
|
+
gl.uniform1i(uniforms.uPalette, 1);
|
|
556
|
+
if (uniforms.uResolution)
|
|
557
|
+
gl.uniform2f(uniforms.uResolution, width, height);
|
|
558
|
+
if (uniforms.uNumColors)
|
|
559
|
+
gl.uniform1f(uniforms.uNumColors, r.colors.length);
|
|
560
|
+
if (uniforms.uDirection)
|
|
561
|
+
gl.uniform1i(uniforms.uDirection, r.direction === "horizontal" ? 0 : 1);
|
|
562
|
+
if (uniforms.uThickness)
|
|
563
|
+
gl.uniform1f(uniforms.uThickness, r.thickness);
|
|
564
|
+
if (uniforms.uSpacing)
|
|
565
|
+
gl.uniform1f(uniforms.uSpacing, r.spacing);
|
|
566
|
+
if (uniforms.uAngle)
|
|
567
|
+
gl.uniform1f(uniforms.uAngle, r.angle * Math.PI / 180);
|
|
568
|
+
if (uniforms.uOffset)
|
|
569
|
+
gl.uniform1f(uniforms.uOffset, r.offset);
|
|
570
|
+
if (uniforms.uAmplitude)
|
|
571
|
+
gl.uniform1f(uniforms.uAmplitude, r.amplitude);
|
|
572
|
+
if (uniforms.uWavelength)
|
|
573
|
+
gl.uniform1f(uniforms.uWavelength, r.wavelength);
|
|
574
|
+
if (uniforms.uPhase)
|
|
575
|
+
gl.uniform1f(uniforms.uPhase, r.phase * Math.PI / 180);
|
|
576
|
+
if (uniforms.uMaskToSourceAlpha)
|
|
577
|
+
gl.uniform1i(uniforms.uMaskToSourceAlpha, r.maskToSourceAlpha ? 1 : 0);
|
|
578
|
+
gl.bindVertexArray(vao);
|
|
579
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
580
|
+
gl.bindVertexArray(null);
|
|
581
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
582
|
+
gl.useProgram(null);
|
|
583
|
+
},
|
|
584
|
+
cleanup: ({ gl, program, vao, vbo, sourceTexture, paletteTexture }) => {
|
|
585
|
+
gl.deleteTexture(sourceTexture);
|
|
586
|
+
gl.deleteTexture(paletteTexture);
|
|
587
|
+
gl.deleteBuffer(vbo);
|
|
588
|
+
gl.deleteProgram(program);
|
|
589
|
+
gl.deleteVertexArray(vao);
|
|
590
|
+
}
|
|
591
|
+
})
|
|
580
592
|
},
|
|
581
593
|
schema: wavesSchema,
|
|
582
594
|
validateParams: validateWavesParams
|