@remotion/effects 4.0.541 → 4.0.542

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.
Files changed (133) hide show
  1. package/THIRD_PARTY_LICENSES.md +10 -0
  2. package/dist/esm/lightning.mjs +603 -0
  3. package/dist/esm/magnify.mjs +403 -0
  4. package/dist/esm/preview/barrel-distortion.mjs +303 -0
  5. package/dist/esm/preview/bevel-alpha.mjs +525 -0
  6. package/dist/esm/preview/blur.mjs +435 -0
  7. package/dist/esm/preview/brightness.mjs +95 -0
  8. package/dist/esm/preview/burlap.mjs +481 -0
  9. package/dist/esm/preview/checkerboard.mjs +8 -0
  10. package/dist/esm/preview/chromatic-aberration.mjs +308 -0
  11. package/dist/esm/preview/color-correction.mjs +522 -0
  12. package/dist/esm/preview/color-key.mjs +440 -0
  13. package/dist/esm/preview/contour-lines.mjs +608 -0
  14. package/dist/esm/preview/contrast.mjs +95 -0
  15. package/dist/esm/preview/corner-pin.mjs +6 -0
  16. package/dist/esm/preview/curves.mjs +357 -0
  17. package/dist/esm/preview/cylinder.mjs +273 -0
  18. package/dist/esm/preview/dot-grid.mjs +333 -0
  19. package/dist/esm/preview/drop-shadow.mjs +607 -0
  20. package/dist/esm/preview/duotone.mjs +344 -0
  21. package/dist/esm/preview/emboss.mjs +479 -0
  22. package/dist/esm/preview/evolve.mjs +485 -0
  23. package/dist/esm/preview/exposure.mjs +264 -0
  24. package/dist/esm/preview/film-burn.mjs +298 -0
  25. package/dist/esm/preview/fisheye.mjs +422 -0
  26. package/dist/esm/preview/flannel.mjs +401 -0
  27. package/dist/esm/preview/fractal-noise.mjs +642 -0
  28. package/dist/esm/preview/glow.mjs +598 -0
  29. package/dist/esm/preview/grayscale.mjs +86 -0
  30. package/dist/esm/preview/gridlines.mjs +8 -0
  31. package/dist/esm/preview/halftone-linear-gradient.mjs +523 -0
  32. package/dist/esm/preview/halftone.mjs +552 -0
  33. package/dist/esm/preview/hue.mjs +83 -0
  34. package/dist/esm/preview/index-00v3hr66.mjs +299 -0
  35. package/dist/esm/preview/index-0w4eqht8.mjs +351 -0
  36. package/dist/esm/preview/index-18y0zcy2.mjs +440 -0
  37. package/dist/esm/preview/index-1m1b1ad7.mjs +520 -0
  38. package/dist/esm/preview/index-34fxm3ax.mjs +518 -0
  39. package/dist/esm/preview/index-4fvp93ps.mjs +32 -0
  40. package/dist/esm/preview/index-4scpn12x.mjs +224 -0
  41. package/dist/esm/preview/index-4z6pt3ka.mjs +104 -0
  42. package/dist/esm/preview/index-618ky75w.mjs +51 -0
  43. package/dist/esm/preview/index-6agxdrvr.mjs +411 -0
  44. package/dist/esm/preview/index-6jkps947.mjs +120 -0
  45. package/dist/esm/preview/index-8agtsbw4.mjs +617 -0
  46. package/dist/esm/preview/index-8jx11jyn.mjs +29 -0
  47. package/dist/esm/preview/index-8p04sssx.mjs +123 -0
  48. package/dist/esm/preview/index-afdtmrh2.mjs +596 -0
  49. package/dist/esm/preview/index-b86qstcs.mjs +18 -0
  50. package/dist/esm/preview/index-cb77qg3g.mjs +587 -0
  51. package/dist/esm/preview/index-cdp7tr8x.mjs +122 -0
  52. package/dist/esm/preview/index-evy8hyah.mjs +55 -0
  53. package/dist/esm/preview/index-gnsce796.mjs +6 -0
  54. package/dist/esm/preview/index-kkvzt8b7.mjs +199 -0
  55. package/dist/esm/preview/index-r0v18b2n.mjs +425 -0
  56. package/dist/esm/preview/index-rswpzmm5.mjs +926 -0
  57. package/dist/esm/preview/index-s9mrx750.mjs +97 -0
  58. package/dist/esm/preview/index-tvfexb7s.mjs +164 -0
  59. package/dist/esm/preview/index-vp56k1gj.mjs +215 -0
  60. package/dist/esm/preview/index-wxhvgv2s.mjs +79 -0
  61. package/dist/esm/preview/index-wy95a41r.mjs +407 -0
  62. package/dist/esm/preview/index-ysnwfc4t.mjs +306 -0
  63. package/dist/esm/preview/index.mjs +51 -0
  64. package/dist/esm/preview/invert.mjs +84 -0
  65. package/dist/esm/preview/iris-wipe.mjs +315 -0
  66. package/dist/esm/preview/lens-blur.mjs +563 -0
  67. package/dist/esm/preview/levels.mjs +400 -0
  68. package/dist/esm/preview/light-leak.mjs +8 -0
  69. package/dist/esm/preview/light-trail.mjs +516 -0
  70. package/dist/esm/preview/lightning.mjs +603 -0
  71. package/dist/esm/preview/linear-gradient-tint.mjs +6 -0
  72. package/dist/esm/preview/linear-gradient.mjs +6 -0
  73. package/dist/esm/preview/linear-progressive-blur.mjs +516 -0
  74. package/dist/esm/preview/linear-progressive-pixelate.mjs +176 -0
  75. package/dist/esm/preview/lines.mjs +536 -0
  76. package/dist/esm/preview/liquid-contours.mjs +512 -0
  77. package/dist/esm/preview/long-shadows.mjs +437 -0
  78. package/dist/esm/preview/lut.mjs +601 -0
  79. package/dist/esm/preview/magnify.mjs +403 -0
  80. package/dist/esm/preview/mirror.mjs +341 -0
  81. package/dist/esm/preview/noise-displacement.mjs +584 -0
  82. package/dist/esm/preview/noise.mjs +318 -0
  83. package/dist/esm/preview/outline.mjs +725 -0
  84. package/dist/esm/preview/page-turn.mjs +302 -0
  85. package/dist/esm/preview/paper.mjs +1249 -0
  86. package/dist/esm/preview/pattern.mjs +6 -0
  87. package/dist/esm/preview/pixel-dissolve.mjs +360 -0
  88. package/dist/esm/preview/pixelate.mjs +249 -0
  89. package/dist/esm/preview/radial-progressive-blur.mjs +582 -0
  90. package/dist/esm/preview/radial-progressive-pixelate.mjs +220 -0
  91. package/dist/esm/preview/radial-wipe.mjs +224 -0
  92. package/dist/esm/preview/rain-fall.mjs +114 -0
  93. package/dist/esm/preview/region-blur.mjs +500 -0
  94. package/dist/esm/preview/rings.mjs +8 -0
  95. package/dist/esm/preview/roughen-edges.mjs +590 -0
  96. package/dist/esm/preview/saturation.mjs +86 -0
  97. package/dist/esm/preview/scale.mjs +109 -0
  98. package/dist/esm/preview/scanlines.mjs +362 -0
  99. package/dist/esm/preview/shadows-highlights.mjs +284 -0
  100. package/dist/esm/preview/shatter.mjs +868 -0
  101. package/dist/esm/preview/shine.mjs +368 -0
  102. package/dist/esm/preview/shrinkwrap.mjs +769 -0
  103. package/dist/esm/preview/skew.mjs +300 -0
  104. package/dist/esm/preview/snow-fall.mjs +170 -0
  105. package/dist/esm/preview/speckle.mjs +356 -0
  106. package/dist/esm/preview/sphere.mjs +252 -0
  107. package/dist/esm/preview/starburst.mjs +8 -0
  108. package/dist/esm/preview/tear.mjs +375 -0
  109. package/dist/esm/preview/thermal-vision.mjs +387 -0
  110. package/dist/esm/preview/tile.mjs +7 -0
  111. package/dist/esm/preview/tint.mjs +125 -0
  112. package/dist/esm/preview/translate.mjs +151 -0
  113. package/dist/esm/preview/turbulent-displace.mjs +613 -0
  114. package/dist/esm/preview/tv-signal-off.mjs +308 -0
  115. package/dist/esm/preview/venetian-blinds.mjs +341 -0
  116. package/dist/esm/preview/vibrance.mjs +254 -0
  117. package/dist/esm/preview/vignette.mjs +458 -0
  118. package/dist/esm/preview/wave.mjs +384 -0
  119. package/dist/esm/preview/waves.mjs +599 -0
  120. package/dist/esm/preview/white-balance.mjs +280 -0
  121. package/dist/esm/preview/white-noise.mjs +244 -0
  122. package/dist/esm/preview/zigzag.mjs +8 -0
  123. package/dist/esm/preview/zoom-blur.mjs +389 -0
  124. package/dist/lightning/geometry.d.ts +10 -0
  125. package/dist/lightning/index.d.ts +4 -0
  126. package/dist/lightning/mask.d.ts +2 -0
  127. package/dist/lightning/params.d.ts +259 -0
  128. package/dist/lightning/shaders.d.ts +2 -0
  129. package/dist/lightning.d.ts +2 -0
  130. package/dist/magnify/shader.d.ts +1 -0
  131. package/dist/magnify/webgpu-shader.d.ts +1 -0
  132. package/dist/magnify.d.ts +28 -0
  133. package/package.json +30 -6
@@ -0,0 +1,389 @@
1
+ import {
2
+ assertOptionalFiniteNumber,
3
+ validateUnitInterval,
4
+ validateNonNegative
5
+ } from "./index-wxhvgv2s.mjs";
6
+ import {
7
+ WEBGPU_SINGLE_PASS_VERTEX,
8
+ setupWebGpuSinglePass,
9
+ cleanupWebGpuSinglePass,
10
+ applyWebGpuSinglePass
11
+ } from "./index-tvfexb7s.mjs";
12
+ import {
13
+ assertEffectParamsObject
14
+ } from "./index-4fvp93ps.mjs";
15
+
16
+ // src/zoom-blur/index.ts
17
+ import { Internals as Internals2 } from "remotion";
18
+
19
+ // src/zoom-blur/webgpu-shader.ts
20
+ var ZOOM_BLUR_WEBGPU_SHADER = `
21
+ ${WEBGPU_SINGLE_PASS_VERTEX}
22
+ @group(0) @binding(0) var source: texture_2d<f32>;
23
+ @group(0) @binding(1) var sourceSampler: sampler;
24
+ @group(0) @binding(2) var<uniform> params: Params;
25
+ struct Params { resolutionAndCenter: vec4f, amountAndSamples: vec4f, }
26
+ @fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
27
+ let resolution = params.resolutionAndCenter.xy;
28
+ let center = vec2f(params.resolutionAndCenter.z, 1.0 - params.resolutionAndCenter.w);
29
+ let direction = input.uv - center;
30
+ let amount = params.amountAndSamples.x / min(resolution.x, resolution.y);
31
+ let samples = i32(params.amountAndSamples.y);
32
+ var color = vec4f(0);
33
+ var total = 0.0;
34
+ for (var i = 0; i < 64; i++) {
35
+ if (i >= samples) { break; }
36
+ let denominator = max(f32(samples - 1), 1.0);
37
+ let progress = f32(i) / denominator;
38
+ let uv = clamp(input.uv - direction * amount * progress, vec2f(0), vec2f(1));
39
+ color += textureSampleLevel(source, sourceSampler, uv, 0);
40
+ total += 1.0;
41
+ }
42
+ return color / total;
43
+ }
44
+ `;
45
+
46
+ // src/zoom-blur/zoom-blur-runtime.ts
47
+ import { Internals } from "remotion";
48
+
49
+ // src/zoom-blur/zoom-blur-shaders.ts
50
+ var ZOOM_BLUR_VS = `#version 300 es
51
+ layout(location = 0) in vec2 aPos;
52
+ layout(location = 1) in vec2 aUv;
53
+ out vec2 vUv;
54
+ void main() {
55
+ vUv = aUv;
56
+ gl_Position = vec4(aPos, 0.0, 1.0);
57
+ }
58
+ `;
59
+ var ZOOM_BLUR_FS = `#version 300 es
60
+ precision highp float;
61
+ in vec2 vUv;
62
+ out vec4 fragColor;
63
+
64
+ uniform sampler2D uSource;
65
+ uniform vec2 uResolution;
66
+ uniform vec2 uCenter;
67
+ uniform float uAmount;
68
+ uniform int uSamples;
69
+
70
+ const int MAX_SAMPLES = 64;
71
+
72
+ void main() {
73
+ vec2 direction = vUv - uCenter;
74
+ float normalizedAmount = uAmount / min(uResolution.x, uResolution.y);
75
+ vec4 color = vec4(0.0);
76
+ float total = 0.0;
77
+
78
+ for (int i = 0; i < MAX_SAMPLES; i++) {
79
+ if (i >= uSamples) {
80
+ break;
81
+ }
82
+
83
+ float denominator = max(float(uSamples - 1), 1.0);
84
+ float progress = float(i) / denominator;
85
+ vec2 sampleUv = clamp(vUv - direction * normalizedAmount * progress, 0.0, 1.0);
86
+ color += texture(uSource, sampleUv);
87
+ total += 1.0;
88
+ }
89
+
90
+ fragColor = color / total;
91
+ }
92
+ `;
93
+
94
+ // src/zoom-blur/zoom-blur-runtime.ts
95
+ var { createWebGL2ContextError } = Internals;
96
+ var compileShader = (gl, type, source) => {
97
+ const shader = gl.createShader(type);
98
+ if (!shader) {
99
+ throw new Error("Failed to create WebGL shader");
100
+ }
101
+ gl.shaderSource(shader, source);
102
+ gl.compileShader(shader);
103
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
104
+ const log = gl.getShaderInfoLog(shader);
105
+ gl.deleteShader(shader);
106
+ throw new Error(`Shader compile failed: ${log ?? "(no log)"}`);
107
+ }
108
+ return shader;
109
+ };
110
+ var linkProgram = (gl, vs, fs) => {
111
+ const program = gl.createProgram();
112
+ if (!program) {
113
+ throw new Error("Failed to create WebGL program");
114
+ }
115
+ gl.attachShader(program, vs);
116
+ gl.attachShader(program, fs);
117
+ gl.linkProgram(program);
118
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
119
+ const log = gl.getProgramInfoLog(program);
120
+ gl.deleteProgram(program);
121
+ throw new Error(`Program link failed: ${log ?? "(no log)"}`);
122
+ }
123
+ return program;
124
+ };
125
+ var createProgram = (gl, vertexSource, fragmentSource) => {
126
+ const vs = compileShader(gl, gl.VERTEX_SHADER, vertexSource);
127
+ const fs = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
128
+ const program = linkProgram(gl, vs, fs);
129
+ gl.deleteShader(vs);
130
+ gl.deleteShader(fs);
131
+ return program;
132
+ };
133
+ var createRgbaTexture = (gl) => {
134
+ const texture = gl.createTexture();
135
+ if (!texture) {
136
+ throw new Error("Failed to create WebGL texture");
137
+ }
138
+ gl.bindTexture(gl.TEXTURE_2D, texture);
139
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
140
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
141
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
142
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
143
+ gl.bindTexture(gl.TEXTURE_2D, null);
144
+ return texture;
145
+ };
146
+ var setupZoomBlur = (target) => {
147
+ const gl = target.getContext("webgl2", {
148
+ premultipliedAlpha: true,
149
+ alpha: true,
150
+ preserveDrawingBuffer: true
151
+ });
152
+ if (!gl) {
153
+ throw createWebGL2ContextError("zoom blur effect");
154
+ }
155
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
156
+ const program = createProgram(gl, ZOOM_BLUR_VS, ZOOM_BLUR_FS);
157
+ const vao = gl.createVertexArray();
158
+ if (!vao) {
159
+ throw new Error("Failed to create WebGL vertex array");
160
+ }
161
+ gl.bindVertexArray(vao);
162
+ const data = new Float32Array([
163
+ -1,
164
+ -1,
165
+ 0,
166
+ 0,
167
+ 1,
168
+ -1,
169
+ 1,
170
+ 0,
171
+ -1,
172
+ 1,
173
+ 0,
174
+ 1,
175
+ 1,
176
+ 1,
177
+ 1,
178
+ 1
179
+ ]);
180
+ const vbo = gl.createBuffer();
181
+ if (!vbo) {
182
+ throw new Error("Failed to create WebGL buffer");
183
+ }
184
+ gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
185
+ gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
186
+ gl.enableVertexAttribArray(0);
187
+ gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 16, 0);
188
+ gl.enableVertexAttribArray(1);
189
+ gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 16, 8);
190
+ gl.bindVertexArray(null);
191
+ const textureSource = createRgbaTexture(gl);
192
+ return {
193
+ gl,
194
+ program,
195
+ vao,
196
+ vbo,
197
+ textureSource,
198
+ uniforms: {
199
+ uSource: gl.getUniformLocation(program, "uSource"),
200
+ uResolution: gl.getUniformLocation(program, "uResolution"),
201
+ uCenter: gl.getUniformLocation(program, "uCenter"),
202
+ uAmount: gl.getUniformLocation(program, "uAmount"),
203
+ uSamples: gl.getUniformLocation(program, "uSamples")
204
+ }
205
+ };
206
+ };
207
+ var cleanupZoomBlur = (state) => {
208
+ const { gl, program, vao, vbo, textureSource } = state;
209
+ gl.deleteTexture(textureSource);
210
+ gl.deleteBuffer(vbo);
211
+ gl.deleteProgram(program);
212
+ gl.deleteVertexArray(vao);
213
+ };
214
+ var drawFullscreenQuad = (state) => {
215
+ const { gl, vao } = state;
216
+ gl.bindVertexArray(vao);
217
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
218
+ gl.bindVertexArray(null);
219
+ };
220
+ var applyZoomBlur = ({
221
+ state,
222
+ source,
223
+ width,
224
+ height,
225
+ amount,
226
+ center,
227
+ samples,
228
+ flipSourceY
229
+ }) => {
230
+ const { gl, program, textureSource, uniforms } = state;
231
+ gl.viewport(0, 0, width, height);
232
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
233
+ gl.bindTexture(gl.TEXTURE_2D, textureSource);
234
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
235
+ gl.bindTexture(gl.TEXTURE_2D, null);
236
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
237
+ gl.clearColor(0, 0, 0, 0);
238
+ gl.clear(gl.COLOR_BUFFER_BIT);
239
+ gl.useProgram(program);
240
+ if (uniforms.uSource)
241
+ gl.uniform1i(uniforms.uSource, 0);
242
+ if (uniforms.uResolution)
243
+ gl.uniform2f(uniforms.uResolution, width, height);
244
+ if (uniforms.uCenter)
245
+ gl.uniform2f(uniforms.uCenter, center[0], center[1]);
246
+ if (uniforms.uAmount)
247
+ gl.uniform1f(uniforms.uAmount, amount);
248
+ if (uniforms.uSamples)
249
+ gl.uniform1i(uniforms.uSamples, samples);
250
+ gl.activeTexture(gl.TEXTURE0);
251
+ gl.bindTexture(gl.TEXTURE_2D, textureSource);
252
+ drawFullscreenQuad(state);
253
+ gl.bindTexture(gl.TEXTURE_2D, null);
254
+ gl.useProgram(null);
255
+ };
256
+
257
+ // src/zoom-blur/index.ts
258
+ var { createEffect } = Internals2;
259
+ var DEFAULT_AMOUNT = 40;
260
+ var DEFAULT_CENTER = [0.5, 0.5];
261
+ var DEFAULT_SAMPLES = 24;
262
+ var MAX_SAMPLES = 64;
263
+ var zoomBlurSchema = {
264
+ amount: {
265
+ type: "number",
266
+ min: 0,
267
+ max: 200,
268
+ step: 1,
269
+ default: DEFAULT_AMOUNT,
270
+ description: "Amount",
271
+ hiddenFromList: false
272
+ },
273
+ center: {
274
+ type: "uv-coordinate",
275
+ step: 0.01,
276
+ default: DEFAULT_CENTER,
277
+ description: "Center"
278
+ },
279
+ samples: {
280
+ type: "number",
281
+ min: 1,
282
+ max: MAX_SAMPLES,
283
+ step: 1,
284
+ integer: true,
285
+ default: DEFAULT_SAMPLES,
286
+ description: "Samples",
287
+ hiddenFromList: false
288
+ }
289
+ };
290
+ var resolve = (params) => ({
291
+ amount: params.amount ?? DEFAULT_AMOUNT,
292
+ center: [...params.center ?? DEFAULT_CENTER],
293
+ samples: params.samples ?? DEFAULT_SAMPLES
294
+ });
295
+ var assertOptionalUvCoordinate = (value, name) => {
296
+ if (value === undefined) {
297
+ return;
298
+ }
299
+ if (!Array.isArray(value) || value.length !== 2 || value.some((item) => typeof item !== "number" || !Number.isFinite(item))) {
300
+ throw new TypeError(`"${name}" must be a [number, number] tuple`);
301
+ }
302
+ };
303
+ var assertOptionalInteger = (value, name) => {
304
+ if (value === undefined) {
305
+ return;
306
+ }
307
+ if (!Number.isInteger(value)) {
308
+ throw new TypeError(`"${name}" must be an integer, but got ${JSON.stringify(value)}`);
309
+ }
310
+ };
311
+ var validateZoomBlurParams = (params) => {
312
+ assertEffectParamsObject(params, "Zoom Blur");
313
+ assertOptionalFiniteNumber(params.amount, "amount");
314
+ assertOptionalUvCoordinate(params.center, "center");
315
+ assertOptionalFiniteNumber(params.samples, "samples");
316
+ assertOptionalInteger(params.samples, "samples");
317
+ const r = resolve(params);
318
+ validateNonNegative(r.amount, "amount");
319
+ validateUnitInterval(r.center[0], "center[0]");
320
+ validateUnitInterval(r.center[1], "center[1]");
321
+ if (r.samples < 1) {
322
+ throw new TypeError(`"samples" must be >= 1, but got ${JSON.stringify(r.samples)}`);
323
+ }
324
+ if (r.samples > MAX_SAMPLES) {
325
+ throw new TypeError(`"samples" must be <= ${MAX_SAMPLES}, but got ${JSON.stringify(r.samples)}`);
326
+ }
327
+ };
328
+ var zoomBlur = createEffect({
329
+ type: "remotion/zoom-blur",
330
+ label: "zoomBlur()",
331
+ documentationLink: "https://www.remotion.dev/docs/effects/zoom-blur",
332
+ calculateKey: (params) => {
333
+ const r = resolve(params);
334
+ return `zoom-blur-${r.amount}-${r.center[0]}-${r.center[1]}-${r.samples}`;
335
+ },
336
+ implementations: {
337
+ webgpu: Internals2.createEffectImplementation({
338
+ setup: (target) => setupWebGpuSinglePass(target, "zoom-blur"),
339
+ apply: ({ source, width, height, params, state, gpuDevice }) => {
340
+ if (!gpuDevice) {
341
+ throw new Error("A WebGPU device is required for the zoom-blur effect");
342
+ }
343
+ const r = resolve(params);
344
+ const uniformData = new Float32Array([
345
+ width,
346
+ height,
347
+ r.center[0],
348
+ r.center[1],
349
+ r.amount,
350
+ r.samples,
351
+ 0,
352
+ 0
353
+ ]);
354
+ applyWebGpuSinglePass({
355
+ state,
356
+ source,
357
+ width,
358
+ height,
359
+ device: gpuDevice,
360
+ shader: ZOOM_BLUR_WEBGPU_SHADER,
361
+ uniformData
362
+ });
363
+ },
364
+ cleanup: cleanupWebGpuSinglePass
365
+ }),
366
+ webgl2: Internals2.createEffectImplementation({
367
+ setup: (target) => setupZoomBlur(target),
368
+ apply: ({ source, width, height, params, state, flipSourceY }) => {
369
+ const r = resolve(params);
370
+ applyZoomBlur({
371
+ state,
372
+ source,
373
+ width,
374
+ height,
375
+ amount: r.amount,
376
+ center: r.center,
377
+ samples: r.samples,
378
+ flipSourceY
379
+ });
380
+ },
381
+ cleanup: (state) => cleanupZoomBlur(state)
382
+ })
383
+ },
384
+ schema: zoomBlurSchema,
385
+ validateParams: validateZoomBlurParams
386
+ });
387
+ export {
388
+ zoomBlur
389
+ };
@@ -0,0 +1,10 @@
1
+ import type { LightningParams } from './params.js';
2
+ type Point = readonly [number, number];
3
+ type Segment = {
4
+ start: Point;
5
+ end: Point;
6
+ intensity: number;
7
+ main: boolean;
8
+ };
9
+ export declare const lightningSegments: (p: Required<LightningParams>, width: number, height: number, alpha: ImageData | null) => Segment[];
10
+ export {};
@@ -0,0 +1,4 @@
1
+ import { type LightningParams } from './params.js';
2
+ export declare const lightning: (params?: (LightningParams & {
3
+ readonly disabled?: boolean;
4
+ }) | undefined) => import("remotion").EffectDescriptor<unknown>;
@@ -0,0 +1,2 @@
1
+ import type { LightningParams } from './params.js';
2
+ export declare const makeLightningMask: (p: Required<LightningParams>, width: number, height: number, alpha: ImageData | null) => Uint8Array<ArrayBuffer>;
@@ -0,0 +1,259 @@
1
+ import type { UvCoordinate } from '../uv-coordinate.js';
2
+ export type LightningType = 'direction' | 'strike' | 'breaking' | 'bouncy' | 'omni' | 'anywhere' | 'vertical' | 'two-way-strike';
3
+ export type LightningFractalType = 'linear' | 'semi-linear' | 'spline';
4
+ export type LightningParams = {
5
+ readonly lightningType?: LightningType;
6
+ /** Starting UV coordinate measured from the top-left. Defaults to [0.5, 0]. */
7
+ readonly origin?: UvCoordinate;
8
+ /** Destination or direction in UV coordinates. Defaults to [0.5, 1]. */
9
+ readonly direction?: UvCoordinate;
10
+ /** Each integer selects a repeatable bolt shape. Defaults to 10. */
11
+ readonly conductivityState?: number;
12
+ /** Radius of the bright center in pixels. Defaults to 3. */
13
+ readonly coreRadius?: number;
14
+ readonly coreOpacity?: number;
15
+ readonly coreColor?: string;
16
+ /** Radius of the surrounding glow in pixels. Defaults to 50. */
17
+ readonly glowRadius?: number;
18
+ readonly glowOpacity?: number;
19
+ readonly glowColor?: string;
20
+ readonly turbulence?: number;
21
+ readonly forking?: number;
22
+ readonly decay?: number;
23
+ readonly decayMainCore?: boolean;
24
+ /** Positive values repel the bolt from opaque pixels, negative values attract it. Ranges from -10 to 10. */
25
+ readonly alphaObstacle?: number;
26
+ /** Include the source behind the lightning. Defaults to true. */
27
+ readonly compositeOnOriginal?: boolean;
28
+ /** Number of subdivisions, from 1 to 12. Defaults to 6. */
29
+ readonly complexity?: number;
30
+ readonly minForkDistance?: number;
31
+ readonly terminationThreshold?: number;
32
+ readonly mainCoreCollisionOnly?: boolean;
33
+ readonly fractalType?: LightningFractalType;
34
+ readonly coreDrain?: number;
35
+ readonly forkStrength?: number;
36
+ readonly forkVariation?: number;
37
+ /** Unsigned 32-bit seed for the bolt pattern. Defaults to 0. */
38
+ readonly seed?: number;
39
+ };
40
+ export declare const lightningSchema: {
41
+ readonly lightningType: {
42
+ readonly type: 'enum';
43
+ readonly description: 'Lightning type';
44
+ readonly variants: {
45
+ readonly direction: {};
46
+ readonly strike: {};
47
+ readonly breaking: {};
48
+ readonly bouncy: {};
49
+ readonly omni: {};
50
+ readonly anywhere: {};
51
+ readonly vertical: {};
52
+ readonly 'two-way-strike': {};
53
+ };
54
+ readonly default: 'strike';
55
+ };
56
+ readonly origin: {
57
+ readonly type: 'uv-coordinate';
58
+ readonly description: string;
59
+ readonly default: UvCoordinate;
60
+ readonly min: 0;
61
+ readonly max: 1;
62
+ readonly step: 0.01;
63
+ readonly visual: {
64
+ readonly type: 'line';
65
+ readonly to: 'direction';
66
+ };
67
+ };
68
+ readonly direction: {
69
+ readonly type: 'uv-coordinate';
70
+ readonly description: string;
71
+ readonly default: UvCoordinate;
72
+ readonly min: 0;
73
+ readonly max: 1;
74
+ readonly step: 0.01;
75
+ };
76
+ readonly conductivityState: {
77
+ readonly type: 'number';
78
+ readonly description: string;
79
+ readonly default: number;
80
+ readonly min: number;
81
+ readonly max: number;
82
+ readonly step: number;
83
+ readonly hiddenFromList: false;
84
+ };
85
+ readonly coreRadius: {
86
+ readonly type: 'number';
87
+ readonly description: string;
88
+ readonly default: number;
89
+ readonly min: number;
90
+ readonly max: number;
91
+ readonly step: number;
92
+ readonly hiddenFromList: false;
93
+ };
94
+ readonly coreOpacity: {
95
+ readonly type: 'number';
96
+ readonly description: string;
97
+ readonly default: number;
98
+ readonly min: number;
99
+ readonly max: number;
100
+ readonly step: number;
101
+ readonly hiddenFromList: false;
102
+ };
103
+ readonly coreColor: {
104
+ readonly type: 'color';
105
+ readonly description: 'Core color';
106
+ readonly default: '#ffffff';
107
+ };
108
+ readonly glowRadius: {
109
+ readonly type: 'number';
110
+ readonly description: string;
111
+ readonly default: number;
112
+ readonly min: number;
113
+ readonly max: number;
114
+ readonly step: number;
115
+ readonly hiddenFromList: false;
116
+ };
117
+ readonly glowOpacity: {
118
+ readonly type: 'number';
119
+ readonly description: string;
120
+ readonly default: number;
121
+ readonly min: number;
122
+ readonly max: number;
123
+ readonly step: number;
124
+ readonly hiddenFromList: false;
125
+ };
126
+ readonly glowColor: {
127
+ readonly type: 'color';
128
+ readonly description: 'Glow color';
129
+ readonly default: '#4059ff';
130
+ };
131
+ readonly turbulence: {
132
+ readonly type: 'number';
133
+ readonly description: string;
134
+ readonly default: number;
135
+ readonly min: number;
136
+ readonly max: number;
137
+ readonly step: number;
138
+ readonly hiddenFromList: false;
139
+ };
140
+ readonly forking: {
141
+ readonly type: 'number';
142
+ readonly description: string;
143
+ readonly default: number;
144
+ readonly min: number;
145
+ readonly max: number;
146
+ readonly step: number;
147
+ readonly hiddenFromList: false;
148
+ };
149
+ readonly decay: {
150
+ readonly type: 'number';
151
+ readonly description: string;
152
+ readonly default: number;
153
+ readonly min: number;
154
+ readonly max: number;
155
+ readonly step: number;
156
+ readonly hiddenFromList: false;
157
+ };
158
+ readonly decayMainCore: {
159
+ readonly type: 'boolean';
160
+ readonly description: 'Decay main core';
161
+ readonly default: false;
162
+ };
163
+ readonly alphaObstacle: {
164
+ readonly type: 'number';
165
+ readonly description: string;
166
+ readonly default: number;
167
+ readonly min: number;
168
+ readonly max: number;
169
+ readonly step: number;
170
+ readonly hiddenFromList: false;
171
+ };
172
+ readonly compositeOnOriginal: {
173
+ readonly type: 'boolean';
174
+ readonly description: 'Composite on original';
175
+ readonly default: true;
176
+ };
177
+ readonly complexity: {
178
+ readonly type: 'number';
179
+ readonly description: string;
180
+ readonly default: number;
181
+ readonly min: number;
182
+ readonly max: number;
183
+ readonly step: number;
184
+ readonly hiddenFromList: false;
185
+ readonly integer: true;
186
+ };
187
+ readonly minForkDistance: {
188
+ readonly type: 'number';
189
+ readonly description: string;
190
+ readonly default: number;
191
+ readonly min: number;
192
+ readonly max: number;
193
+ readonly step: number;
194
+ readonly hiddenFromList: false;
195
+ };
196
+ readonly terminationThreshold: {
197
+ readonly type: 'number';
198
+ readonly description: string;
199
+ readonly default: number;
200
+ readonly min: number;
201
+ readonly max: number;
202
+ readonly step: number;
203
+ readonly hiddenFromList: false;
204
+ };
205
+ readonly mainCoreCollisionOnly: {
206
+ readonly type: 'boolean';
207
+ readonly description: 'Main core collision only';
208
+ readonly default: false;
209
+ };
210
+ readonly fractalType: {
211
+ readonly type: 'enum';
212
+ readonly description: 'Fractal type';
213
+ readonly variants: {
214
+ readonly linear: {};
215
+ readonly 'semi-linear': {};
216
+ readonly spline: {};
217
+ };
218
+ readonly default: 'linear';
219
+ };
220
+ readonly coreDrain: {
221
+ readonly type: 'number';
222
+ readonly description: string;
223
+ readonly default: number;
224
+ readonly min: number;
225
+ readonly max: number;
226
+ readonly step: number;
227
+ readonly hiddenFromList: false;
228
+ };
229
+ readonly forkStrength: {
230
+ readonly type: 'number';
231
+ readonly description: string;
232
+ readonly default: number;
233
+ readonly min: number;
234
+ readonly max: number;
235
+ readonly step: number;
236
+ readonly hiddenFromList: false;
237
+ };
238
+ readonly forkVariation: {
239
+ readonly type: 'number';
240
+ readonly description: string;
241
+ readonly default: number;
242
+ readonly min: number;
243
+ readonly max: number;
244
+ readonly step: number;
245
+ readonly hiddenFromList: false;
246
+ };
247
+ readonly seed: {
248
+ readonly type: 'number';
249
+ readonly description: string;
250
+ readonly default: number;
251
+ readonly min: number;
252
+ readonly max: number;
253
+ readonly step: number;
254
+ readonly hiddenFromList: false;
255
+ readonly integer: true;
256
+ };
257
+ };
258
+ export declare const resolve: (params: LightningParams) => Required<LightningParams>;
259
+ export declare const validateLightningParams: (params: LightningParams) => void;
@@ -0,0 +1,2 @@
1
+ export declare const LIGHTNING_FRAGMENT_SHADER = "#version 300 es\nprecision highp float;\nuniform sampler2D uSource;\nuniform sampler2D uMask;\nuniform vec4 uCore;\nuniform vec4 uGlow;\nuniform float uComposite;\nin vec2 vUv;\nout vec4 fragColor;\n\nvoid main() {\n\tvec4 source = texture(uSource, vUv) * uComposite;\n\tvec2 mask = texture(uMask, vec2(vUv.x, 1.0 - vUv.y)).rg;\n\tfloat core = mask.r * uCore.a;\n\tfloat glow = mask.g * uGlow.a;\n\tfloat alpha = source.a + max(core, glow) * (1.0 - source.a);\n\tvec3 color = source.rgb + uCore.rgb * core + uGlow.rgb * glow;\n\tfragColor = vec4(min(color, vec3(alpha)), alpha);\n}\n";
2
+ export declare const LIGHTNING_WEBGPU_SHADER = "\n\nstruct VertexOutput {\n\t@builtin(position) position: vec4f,\n\t@location(0) uv: vec2f,\n}\n\n@vertex fn vertex(@builtin(vertex_index) index: u32) -> VertexOutput {\n\tlet positions = array<vec2f, 3>(vec2f(-1, -1), vec2f(3, -1), vec2f(-1, 3));\n\tlet position = positions[index];\n\tvar output: VertexOutput;\n\toutput.position = vec4f(position, 0, 1);\n\toutput.uv = vec2f(position.x * 0.5 + 0.5, 0.5 - position.y * 0.5);\n\treturn output;\n}\n\nstruct Params { core: vec4f, glow: vec4f, composite: f32 }\n@group(0) @binding(0) var source: texture_2d<f32>;\n@group(0) @binding(1) var sourceSampler: sampler;\n@group(0) @binding(2) var<uniform> params: Params;\n@group(0) @binding(3) var mask: texture_2d<f32>;\n\n@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {\n\tlet src = textureSampleLevel(source, sourceSampler, input.uv, 0) * params.composite;\n\tlet coverage = textureLoad(mask, vec2i(input.position.xy), 0).rg;\n\tlet core = coverage.r * params.core.a;\n\tlet glow = coverage.g * params.glow.a;\n\tlet alpha = src.a + max(core, glow) * (1.0 - src.a);\n\tlet color = src.rgb + params.core.rgb * core + params.glow.rgb * glow;\n\treturn vec4f(min(color, vec3f(alpha)), alpha);\n}\n";
@@ -0,0 +1,2 @@
1
+ export { lightning } from './lightning/index.js';
2
+ export type { LightningParams, LightningType, LightningFractalType, } from './lightning/params.js';
@@ -0,0 +1 @@
1
+ export declare const MAGNIFY_FRAGMENT_SHADER = "#version 300 es\nprecision highp float;\nprecision highp int;\n\nin vec2 vUv;\nout vec4 fragColor;\nuniform sampler2D uSource;\nuniform vec2 uResolution;\nuniform vec2 uCenter;\nuniform float uMagnification;\nuniform float uSize;\nuniform float uFeather;\nuniform float uOpacity;\nuniform bool uSquare;\nuniform int uScaling;\nuniform bool uIsolated;\n\nvec4 pixelAt(ivec2 p) {\n\tif (any(lessThan(p, ivec2(0))) || any(greaterThanEqual(p, textureSize(uSource, 0)))) {\n\t\treturn vec4(0.0);\n\t}\n\treturn texelFetch(uSource, p, 0);\n}\n\nvec4 cubicWeights(float t) {\n\tfloat t2 = t * t;\n\tfloat t3 = t2 * t;\n\treturn vec4(-0.5 * t3 + t2 - 0.5 * t,\n\t\t1.5 * t3 - 2.5 * t2 + 1.0,\n\t\t-1.5 * t3 + 2.0 * t2 + 0.5 * t,\n\t\t0.5 * t3 - 0.5 * t2);\n}\n\nvec4 sampleMagnified(vec2 uv, vec2 position) {\n\tvec2 dimensions = vec2(textureSize(uSource, 0));\n\tvec2 p = uv * dimensions;\n\tif (uScaling == 0) return pixelAt(ivec2(floor(p)));\n\tif (uScaling == 2) {\n\t\tuvec2 xy = uvec2(floor(position));\n\t\tuvec2 h = (xy.x ^ (xy.y + uvec2(1048576u, 2097152u))) * 1664525u + 1013904223u;\n\t\th = (h ^ (h >> 16u)) * 2246822519u;\n\t\tvec2 jitter = (vec2(h ^ (h >> 13u)) / 4294967295.0 - 0.5) * max(1.0 - 1.0 / uMagnification, 0.0);\n\t\tjitter.y = -jitter.y;\n\t\tvec2 q = floor(p) + jitter;\n\t\tivec2 base = ivec2(floor(q));\n\t\tvec2 f = fract(q);\n\t\treturn mix(mix(pixelAt(base), pixelAt(base + ivec2(1, 0)), f.x),\n\t\t\tmix(pixelAt(base + ivec2(0, 1)), pixelAt(base + ivec2(1, 1)), f.x), f.y);\n\t}\n\tvec2 q = p - 0.5;\n\tivec2 base = ivec2(floor(q));\n\tvec4 wx = cubicWeights(fract(q.x));\n\tvec4 wy = cubicWeights(fract(q.y));\n\tvec4 color = vec4(0.0);\n\tfor (int y = 0; y < 4; y++) {\n\t\tfor (int x = 0; x < 4; x++) {\n\t\t\tcolor += pixelAt(base + ivec2(x - 1, y - 1)) * wx[x] * wy[y];\n\t\t}\n\t}\n\tfloat alpha = clamp(color.a, 0.0, 1.0);\n\treturn vec4(clamp(color.rgb, vec3(0.0), vec3(alpha)), alpha);\n}\n\nvoid main() {\n\tvec4 original = texture(uSource, vUv);\n\tvec2 uv = vec2(vUv.x, 1.0 - vUv.y);\n\tvec2 offset = (uv - uCenter) * uResolution;\n\tfloat distance = uSquare ? max(abs(offset.x), abs(offset.y)) : length(offset);\n\tfloat weight = 0.0;\n\tif (uSize > 0.0) {\n\t\tweight = uFeather > 0.0\n\t\t\t? 1.0 - smoothstep(uSize - uFeather, uSize, distance)\n\t\t\t: clamp(uSize - distance + 0.5, 0.0, 1.0);\n\t}\n\tweight *= uOpacity;\n\tif (weight <= 0.0) {\n\t\tfragColor = uIsolated ? vec4(0.0) : original;\n\t\treturn;\n\t}\n\tvec2 sourceUv = uCenter + offset / (uResolution * uMagnification);\n\tvec4 magnified = uMagnification == 1.0 ? original\n\t\t: sampleMagnified(vec2(sourceUv.x, 1.0 - sourceUv.y), uv * uResolution);\n\tfragColor = uIsolated ? magnified * weight : mix(original, magnified, weight);\n}\n";
@@ -0,0 +1 @@
1
+ export declare const MAGNIFY_WEBGPU_SHADER = "\n\nstruct VertexOutput {\n\t@builtin(position) position: vec4f,\n\t@location(0) uv: vec2f,\n}\n\n@vertex fn vertex(@builtin(vertex_index) index: u32) -> VertexOutput {\n\tlet positions = array<vec2f, 3>(vec2f(-1, -1), vec2f(3, -1), vec2f(-1, 3));\n\tlet position = positions[index];\n\tvar output: VertexOutput;\n\toutput.position = vec4f(position, 0, 1);\n\toutput.uv = vec2f(position.x * 0.5 + 0.5, 0.5 - position.y * 0.5);\n\treturn output;\n}\n\n@group(0) @binding(0) var source: texture_2d<f32>;\n@group(0) @binding(1) var sourceSampler: sampler;\n@group(0) @binding(2) var<uniform> params: Params;\nstruct Params {\n\tresolutionAndCenter: vec4f,\n\tlens: vec4f,\n\tmodes: vec4f,\n}\n\nfn pixelAt(p: vec2i) -> vec4f {\n\tif (any(p < vec2i(0)) || any(p >= vec2i(textureDimensions(source)))) {\n\t\treturn vec4f(0);\n\t}\n\treturn textureLoad(source, p, 0);\n}\n\nfn cubicWeights(t: f32) -> vec4f {\n\tlet t2 = t * t;\n\tlet t3 = t2 * t;\n\treturn vec4f(-0.5 * t3 + t2 - 0.5 * t,\n\t\t1.5 * t3 - 2.5 * t2 + 1.0,\n\t\t-1.5 * t3 + 2.0 * t2 + 0.5 * t,\n\t\t0.5 * t3 - 0.5 * t2);\n}\n\nfn sampleMagnified(uv: vec2f, position: vec2f) -> vec4f {\n\tlet p = uv * vec2f(textureDimensions(source));\n\tif (params.modes.y == 0) { return pixelAt(vec2i(floor(p))); }\n\tif (params.modes.y == 2) {\n\t\tlet xy = vec2u(floor(position));\n\t\tvar h = (vec2u(xy.x) ^ (vec2u(xy.y) + vec2u(1048576u, 2097152u))) * 1664525u + 1013904223u;\n\t\th = (h ^ (h >> vec2u(16u))) * 2246822519u;\n\t\tlet jitter = (vec2f(h ^ (h >> vec2u(13u))) / 4294967295.0 - 0.5) * max(1.0 - 1.0 / params.lens.x, 0.0);\n\t\tlet q = floor(p) + jitter;\n\t\tlet base = vec2i(floor(q));\n\t\tlet f = fract(q);\n\t\treturn mix(mix(pixelAt(base), pixelAt(base + vec2i(1, 0)), f.x),\n\t\t\tmix(pixelAt(base + vec2i(0, 1)), pixelAt(base + vec2i(1, 1)), f.x), f.y);\n\t}\n\tlet q = p - 0.5;\n\tlet base = vec2i(floor(q));\n\tlet wx = cubicWeights(fract(q.x));\n\tlet wy = cubicWeights(fract(q.y));\n\tvar color = vec4f(0);\n\tfor (var y = 0; y < 4; y++) {\n\t\tfor (var x = 0; x < 4; x++) {\n\t\t\tcolor += pixelAt(base + vec2i(x - 1, y - 1)) * wx[x] * wy[y];\n\t\t}\n\t}\n\tlet alpha = clamp(color.a, 0.0, 1.0);\n\treturn vec4f(clamp(color.rgb, vec3f(0), vec3f(alpha)), alpha);\n}\n\n@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {\n\tlet original = textureSampleLevel(source, sourceSampler, input.uv, 0);\n\tlet resolution = params.resolutionAndCenter.xy;\n\tlet center = params.resolutionAndCenter.zw;\n\tlet offset = (input.uv - center) * resolution;\n\tlet distance = select(length(offset), max(abs(offset.x), abs(offset.y)), params.modes.x == 1);\n\tlet size = params.lens.y;\n\tlet feather = params.lens.z;\n\tvar weight = 0.0;\n\tif (size > 0) {\n\t\tif (feather > 0) {\n\t\t\tweight = 1.0 - smoothstep(size - feather, size, distance);\n\t\t} else {\n\t\t\tweight = clamp(size - distance + 0.5, 0.0, 1.0);\n\t\t}\n\t}\n\tweight *= params.lens.w;\n\tif (weight <= 0) {\n\t\treturn select(original, vec4f(0), params.modes.z == 1);\n\t}\n\tvar magnified = original;\n\tif (params.lens.x != 1) {\n\t\tmagnified = sampleMagnified(center + offset / (resolution * params.lens.x), input.uv * resolution);\n\t}\n\treturn select(mix(original, magnified, weight), magnified * weight, params.modes.z == 1);\n}\n";