@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/lut.mjs
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
import {
|
|
2
|
+
WEBGPU_SINGLE_PASS_VERTEX,
|
|
3
|
+
setupWebGpuSinglePass,
|
|
4
|
+
cleanupWebGpuSinglePass,
|
|
5
|
+
applyWebGpuSinglePass
|
|
6
|
+
} from "./index-tvfexb7s.mjs";
|
|
7
|
+
|
|
1
8
|
// src/lut/index.ts
|
|
2
9
|
import { Internals as Internals2 } from "remotion";
|
|
3
10
|
|
|
@@ -193,17 +200,27 @@ var applyLut = ({
|
|
|
193
200
|
if (parsed.size > maxSize) {
|
|
194
201
|
throw new Error(`LUT_3D_SIZE ${parsed.size} exceeds this browser's maximum 3D texture size of ${maxSize}`);
|
|
195
202
|
}
|
|
196
|
-
gl.
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
203
|
+
const previousError = gl.getError();
|
|
204
|
+
if (previousError !== gl.NO_ERROR) {
|
|
205
|
+
throw new Error(`WebGL error ${previousError} was present before uploading the 3D LUT texture`);
|
|
206
|
+
}
|
|
207
|
+
try {
|
|
208
|
+
gl.activeTexture(gl.TEXTURE1);
|
|
209
|
+
gl.bindTexture(gl.TEXTURE_3D, lutTexture);
|
|
210
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
|
|
211
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
|
|
212
|
+
gl.texImage3D(gl.TEXTURE_3D, 0, gl.RGBA16F, parsed.size, parsed.size, parsed.size, 0, gl.RGBA, gl.FLOAT, parsed.data);
|
|
213
|
+
const uploadError = gl.getError();
|
|
214
|
+
if (uploadError !== gl.NO_ERROR) {
|
|
215
|
+
throw new Error(`Failed to upload the 3D LUT texture (WebGL error ${uploadError})`);
|
|
216
|
+
}
|
|
217
|
+
state.cachedContent = content;
|
|
218
|
+
} finally {
|
|
219
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
|
|
220
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
221
|
+
gl.bindTexture(gl.TEXTURE_3D, null);
|
|
222
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
204
223
|
}
|
|
205
|
-
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
|
|
206
|
-
state.cachedContent = content;
|
|
207
224
|
}
|
|
208
225
|
gl.viewport(0, 0, width, height);
|
|
209
226
|
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
@@ -413,6 +430,37 @@ var parseCubeLut = (content) => {
|
|
|
413
430
|
};
|
|
414
431
|
};
|
|
415
432
|
|
|
433
|
+
// src/lut/webgpu-shader.ts
|
|
434
|
+
var LUT_WEBGPU_SHADER = `
|
|
435
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
436
|
+
struct Params {domainMin: vec4f, domainMax: vec4f,}
|
|
437
|
+
@group(0) @binding(0) var source: texture_2d<f32>;
|
|
438
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
439
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
440
|
+
@group(0) @binding(3) var lut: texture_2d<f32>;
|
|
441
|
+
fn lookup(p: vec3u) -> vec3f {
|
|
442
|
+
let size = u32(params.domainMin.w);
|
|
443
|
+
let index = p.x + size * (p.y + size * p.z);
|
|
444
|
+
let width = textureDimensions(lut).x;
|
|
445
|
+
// The WebGL LUT is RGBA16F. Preserve its rounding before interpolation.
|
|
446
|
+
return quantizeToF16(textureLoad(lut, vec2u(index % width, index / width), 0).rgb);
|
|
447
|
+
}
|
|
448
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
449
|
+
let color = textureSampleLevel(source, sourceSampler, input.uv, 0);
|
|
450
|
+
if (color.a <= 0.0) { return vec4f(0); }
|
|
451
|
+
let normalized = clamp((color.rgb / color.a - params.domainMin.xyz) / (params.domainMax.xyz - params.domainMin.xyz), vec3f(0), vec3f(1));
|
|
452
|
+
let position = normalized * (params.domainMin.w - 1.0);
|
|
453
|
+
let lower = vec3u(floor(position));
|
|
454
|
+
let upper = min(lower + vec3u(1), vec3u(u32(params.domainMin.w) - 1u));
|
|
455
|
+
let fraction = fract(position);
|
|
456
|
+
let c00 = mix(lookup(lower), lookup(vec3u(upper.x, lower.yz)), fraction.x);
|
|
457
|
+
let c10 = mix(lookup(vec3u(lower.x, upper.y, lower.z)), lookup(vec3u(upper.xy, lower.z)), fraction.x);
|
|
458
|
+
let c01 = mix(lookup(vec3u(lower.xy, upper.z)), lookup(vec3u(upper.x, lower.y, upper.z)), fraction.x);
|
|
459
|
+
let c11 = mix(lookup(vec3u(lower.x, upper.yz)), lookup(upper), fraction.x);
|
|
460
|
+
return vec4f(mix(mix(c00, c10, fraction.y), mix(c01, c11, fraction.y), fraction.z) * color.a, color.a);
|
|
461
|
+
}
|
|
462
|
+
`;
|
|
463
|
+
|
|
416
464
|
// src/lut/index.ts
|
|
417
465
|
var { createEffect } = Internals2;
|
|
418
466
|
var DEFAULT_LUT_CONTENT = `TITLE "Identity"
|
|
@@ -477,21 +525,73 @@ var lut = createEffect({
|
|
|
477
525
|
type: "remotion/lut",
|
|
478
526
|
label: "lut()",
|
|
479
527
|
documentationLink: "https://www.remotion.dev/docs/effects/lut",
|
|
480
|
-
backend: "webgl2",
|
|
481
528
|
calculateKey: (params) => getCachedLut(params.content).effectKey,
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
height,
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
529
|
+
implementations: {
|
|
530
|
+
webgpu: Internals2.createEffectImplementation({
|
|
531
|
+
setup: (target) => ({
|
|
532
|
+
...setupWebGpuSinglePass(target, "lut"),
|
|
533
|
+
cached: null
|
|
534
|
+
}),
|
|
535
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
536
|
+
if (!gpuDevice)
|
|
537
|
+
throw new Error("A WebGPU device is required for the LUT effect");
|
|
538
|
+
const device = gpuDevice;
|
|
539
|
+
const { parsed } = getCachedLut(params.content);
|
|
540
|
+
const textureWidth = Math.min(parsed.size * parsed.size, device.limits.maxTextureDimension2D);
|
|
541
|
+
const textureHeight = Math.ceil(parsed.size ** 3 / textureWidth);
|
|
542
|
+
if (textureHeight > device.limits.maxTextureDimension2D)
|
|
543
|
+
throw new Error(`LUT_3D_SIZE ${parsed.size} exceeds this browser's maximum LUT texture size`);
|
|
544
|
+
if (state.cached?.content !== params.content || state.cached.width !== textureWidth) {
|
|
545
|
+
const data = new Float32Array(textureWidth * textureHeight * 4);
|
|
546
|
+
data.set(parsed.data);
|
|
547
|
+
state.cached = {
|
|
548
|
+
content: params.content,
|
|
549
|
+
data,
|
|
550
|
+
width: textureWidth,
|
|
551
|
+
height: textureHeight
|
|
552
|
+
};
|
|
553
|
+
}
|
|
554
|
+
applyWebGpuSinglePass({
|
|
555
|
+
state,
|
|
556
|
+
source,
|
|
557
|
+
width,
|
|
558
|
+
height,
|
|
559
|
+
device,
|
|
560
|
+
shader: LUT_WEBGPU_SHADER,
|
|
561
|
+
uniformData: new Float32Array([
|
|
562
|
+
...parsed.domainMin,
|
|
563
|
+
parsed.size,
|
|
564
|
+
...parsed.domainMax,
|
|
565
|
+
0
|
|
566
|
+
])
|
|
567
|
+
}, {
|
|
568
|
+
sourceFilter: null,
|
|
569
|
+
auxiliaryTexture: {
|
|
570
|
+
data: state.cached.data,
|
|
571
|
+
width: textureWidth,
|
|
572
|
+
height: textureHeight,
|
|
573
|
+
format: "rgba32float"
|
|
574
|
+
}
|
|
575
|
+
});
|
|
576
|
+
},
|
|
577
|
+
cleanup: cleanupWebGpuSinglePass
|
|
578
|
+
}),
|
|
579
|
+
webgl2: Internals2.createEffectImplementation({
|
|
580
|
+
setup: setupLut,
|
|
581
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
582
|
+
applyLut({
|
|
583
|
+
state,
|
|
584
|
+
source,
|
|
585
|
+
width,
|
|
586
|
+
height,
|
|
587
|
+
content: params.content,
|
|
588
|
+
parsed: getCachedLut(params.content).parsed,
|
|
589
|
+
flipSourceY
|
|
590
|
+
});
|
|
591
|
+
},
|
|
592
|
+
cleanup: cleanupLut
|
|
593
|
+
})
|
|
493
594
|
},
|
|
494
|
-
cleanup: cleanupLut,
|
|
495
595
|
schema: lutSchema,
|
|
496
596
|
validateParams: validateLutParams
|
|
497
597
|
});
|
package/dist/esm/mirror.mjs
CHANGED
|
@@ -1,111 +1,20 @@
|
|
|
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/mirror/index.ts
|
|
2
16
|
import { Internals as Internals2 } from "remotion";
|
|
3
17
|
|
|
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
|
-
// 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
|
-
};
|
|
108
|
-
|
|
109
18
|
// src/mirror/mirror-runtime.ts
|
|
110
19
|
import { Internals } from "remotion";
|
|
111
20
|
|
|
@@ -307,6 +216,27 @@ var applyMirror = ({
|
|
|
307
216
|
gl.useProgram(null);
|
|
308
217
|
};
|
|
309
218
|
|
|
219
|
+
// src/mirror/webgpu-shader.ts
|
|
220
|
+
var MIRROR_WEBGPU_SHADER = `
|
|
221
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
222
|
+
@group(0) @binding(0) var source: texture_2d<f32>;
|
|
223
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
224
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
225
|
+
struct Params { values: vec4f, }
|
|
226
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
227
|
+
var uv = vec2f(input.uv.x, 1.0 - input.uv.y);
|
|
228
|
+
let vertical = params.values.y != 0.0;
|
|
229
|
+
let coord = select(uv.x, uv.y, vertical);
|
|
230
|
+
let position = params.values.x;
|
|
231
|
+
let shouldMirror = select(coord > position, coord < position, params.values.z != 0.0);
|
|
232
|
+
if (shouldMirror) {
|
|
233
|
+
let mirrored = 2.0 * position - coord;
|
|
234
|
+
if (vertical) { uv.y = mirrored; } else { uv.x = mirrored; }
|
|
235
|
+
}
|
|
236
|
+
return textureSampleLevel(source, sourceSampler, clamp(vec2f(uv.x, 1.0 - uv.y), vec2f(0), vec2f(1)), 0);
|
|
237
|
+
}
|
|
238
|
+
`;
|
|
239
|
+
|
|
310
240
|
// src/mirror/index.ts
|
|
311
241
|
var { createEffect } = Internals2;
|
|
312
242
|
var mirrorSchema = {
|
|
@@ -355,26 +285,54 @@ var mirror = createEffect({
|
|
|
355
285
|
type: "dev.remotion.effects.mirror",
|
|
356
286
|
label: "mirror()",
|
|
357
287
|
documentationLink: "https://www.remotion.dev/docs/effects/mirror",
|
|
358
|
-
backend: "webgl2",
|
|
359
288
|
calculateKey: (params) => {
|
|
360
289
|
const r = resolve(params);
|
|
361
290
|
return `mirror-${r.direction}-${r.position}-${r.invert ? 1 : 0}`;
|
|
362
291
|
},
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
292
|
+
implementations: {
|
|
293
|
+
webgpu: Internals2.createEffectImplementation({
|
|
294
|
+
setup: (target) => setupWebGpuSinglePass(target, "mirror"),
|
|
295
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
296
|
+
if (!gpuDevice) {
|
|
297
|
+
throw new Error("A WebGPU device is required for the mirror effect");
|
|
298
|
+
}
|
|
299
|
+
const r = resolve(params);
|
|
300
|
+
const uniformData = new Float32Array([
|
|
301
|
+
r.position,
|
|
302
|
+
r.direction === "horizontal" ? 0 : 1,
|
|
303
|
+
r.invert ? 1 : 0,
|
|
304
|
+
0
|
|
305
|
+
]);
|
|
306
|
+
applyWebGpuSinglePass({
|
|
307
|
+
state,
|
|
308
|
+
source,
|
|
309
|
+
width,
|
|
310
|
+
height,
|
|
311
|
+
device: gpuDevice,
|
|
312
|
+
shader: MIRROR_WEBGPU_SHADER,
|
|
313
|
+
uniformData
|
|
314
|
+
});
|
|
315
|
+
},
|
|
316
|
+
cleanup: cleanupWebGpuSinglePass
|
|
317
|
+
}),
|
|
318
|
+
webgl2: Internals2.createEffectImplementation({
|
|
319
|
+
setup: (target) => setupMirror(target),
|
|
320
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
321
|
+
const r = resolve(params);
|
|
322
|
+
applyMirror({
|
|
323
|
+
state,
|
|
324
|
+
source,
|
|
325
|
+
width,
|
|
326
|
+
height,
|
|
327
|
+
position: r.position,
|
|
328
|
+
direction: r.direction,
|
|
329
|
+
invert: r.invert,
|
|
330
|
+
flipSourceY
|
|
331
|
+
});
|
|
332
|
+
},
|
|
333
|
+
cleanup: (state) => cleanupMirror(state)
|
|
334
|
+
})
|
|
376
335
|
},
|
|
377
|
-
cleanup: (state) => cleanupMirror(state),
|
|
378
336
|
schema: mirrorSchema,
|
|
379
337
|
validateParams: validateMirrorParams
|
|
380
338
|
});
|