@remotion/effects 4.0.479 → 4.0.481

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.
@@ -1,4 +1,4 @@
1
- // src/pattern.ts
1
+ // src/checkerboard.ts
2
2
  import { Internals } from "remotion";
3
3
 
4
4
  // src/validate-effect-param.ts
@@ -106,11 +106,417 @@ var parseColorRgba = (ctx, color) => {
106
106
  return [data[0], data[1], data[2], data[3]];
107
107
  };
108
108
 
109
- // src/pattern.ts
109
+ // src/checkerboard.ts
110
110
  var { createEffect, createWebGL2ContextError } = Internals;
111
+ var DEFAULT_COLORS = ["#dff4ff", "#7cc6ff"];
112
+ var DEFAULT_CELL_SIZE = 80;
113
+ var DEFAULT_GAP = 0;
114
+ var DEFAULT_ANGLE = 0;
115
+ var DEFAULT_OFFSET_X = 0;
116
+ var DEFAULT_OFFSET_Y = 0;
117
+ var DEFAULT_MASK_TO_SOURCE_ALPHA = false;
118
+ var checkerboardSchema = {
119
+ colors: {
120
+ type: "array",
121
+ item: {
122
+ type: "color"
123
+ },
124
+ default: DEFAULT_COLORS,
125
+ minLength: 2,
126
+ newItemDefault: "#ff0000",
127
+ description: "Colors",
128
+ keyframable: false
129
+ },
130
+ cellSize: {
131
+ type: "number",
132
+ min: 0.1,
133
+ max: 800,
134
+ step: 0.1,
135
+ default: DEFAULT_CELL_SIZE,
136
+ description: "Cell size",
137
+ hiddenFromList: false
138
+ },
139
+ gap: {
140
+ type: "number",
141
+ min: 0,
142
+ max: 400,
143
+ step: 0.1,
144
+ default: DEFAULT_GAP,
145
+ description: "Gap",
146
+ hiddenFromList: false
147
+ },
148
+ angle: {
149
+ type: "rotation-degrees",
150
+ step: 1,
151
+ default: DEFAULT_ANGLE,
152
+ description: "Angle"
153
+ },
154
+ offsetX: {
155
+ type: "number",
156
+ step: 0.1,
157
+ default: DEFAULT_OFFSET_X,
158
+ description: "Offset X",
159
+ hiddenFromList: false
160
+ },
161
+ offsetY: {
162
+ type: "number",
163
+ step: 0.1,
164
+ default: DEFAULT_OFFSET_Y,
165
+ description: "Offset Y",
166
+ hiddenFromList: false
167
+ },
168
+ maskToSourceAlpha: {
169
+ type: "boolean",
170
+ default: DEFAULT_MASK_TO_SOURCE_ALPHA,
171
+ description: "Mask to source alpha"
172
+ }
173
+ };
174
+ var resolve = (p) => {
175
+ const cellSize = p.cellSize ?? DEFAULT_CELL_SIZE;
176
+ const gap = p.gap ?? DEFAULT_GAP;
177
+ return {
178
+ colors: p.colors ?? DEFAULT_COLORS,
179
+ cellSize,
180
+ spacing: cellSize + gap,
181
+ angle: p.angle ?? DEFAULT_ANGLE,
182
+ offsetX: p.offsetX ?? DEFAULT_OFFSET_X,
183
+ offsetY: p.offsetY ?? DEFAULT_OFFSET_Y,
184
+ maskToSourceAlpha: p.maskToSourceAlpha ?? DEFAULT_MASK_TO_SOURCE_ALPHA
185
+ };
186
+ };
187
+ var validatePositive = (value, name) => {
188
+ if (value <= 0) {
189
+ throw new TypeError(`"${name}" must be greater than 0, but got ${JSON.stringify(value)}`);
190
+ }
191
+ };
192
+ var validateNonNegative2 = (value, name) => {
193
+ if (value < 0) {
194
+ throw new TypeError(`"${name}" must be greater than or equal to 0, but got ${JSON.stringify(value)}`);
195
+ }
196
+ };
197
+ var validateColors = (colors) => {
198
+ if (colors === undefined) {
199
+ return;
200
+ }
201
+ if (!Array.isArray(colors) || colors.length < 2) {
202
+ throw new TypeError(`"colors" must be an array with at least 2 colors, but got ${JSON.stringify(colors)}`);
203
+ }
204
+ for (let i = 0;i < colors.length; i++) {
205
+ assertRequiredColor(colors[i], `colors[${i}]`);
206
+ }
207
+ };
208
+ var validateCheckerboardParams = (params) => {
209
+ assertEffectParamsObject(params, "Checkerboard");
210
+ validateColors(params.colors);
211
+ assertOptionalFiniteNumber(params.cellSize, "cellSize");
212
+ assertOptionalFiniteNumber(params.gap, "gap");
213
+ assertOptionalFiniteNumber(params.angle, "angle");
214
+ assertOptionalFiniteNumber(params.offsetX, "offsetX");
215
+ assertOptionalFiniteNumber(params.offsetY, "offsetY");
216
+ assertOptionalBoolean(params.maskToSourceAlpha, "maskToSourceAlpha");
217
+ const cellSize = params.cellSize ?? DEFAULT_CELL_SIZE;
218
+ const gap = params.gap ?? DEFAULT_GAP;
219
+ validatePositive(cellSize, "cellSize");
220
+ validateNonNegative2(gap, "gap");
221
+ };
222
+ var CHECKERBOARD_VS = `#version 300 es
223
+ in vec2 aPos;
224
+ in vec2 aUv;
225
+ out vec2 vUv;
226
+
227
+ void main() {
228
+ vUv = aUv;
229
+ gl_Position = vec4(aPos, 0.0, 1.0);
230
+ }
231
+ `;
232
+ var CHECKERBOARD_FS = `#version 300 es
233
+ precision highp float;
234
+
235
+ in vec2 vUv;
236
+ out vec4 fragColor;
237
+
238
+ uniform sampler2D uSource;
239
+ uniform sampler2D uPalette;
240
+ uniform vec2 uResolution;
241
+ uniform float uNumColors;
242
+ uniform float uCellSize;
243
+ uniform float uSpacing;
244
+ uniform float uAngle;
245
+ uniform vec2 uOffset;
246
+ uniform bool uMaskToSourceAlpha;
247
+
248
+ void main() {
249
+ vec4 texColor = texture(uSource, vUv);
250
+ float cellSize = max(uCellSize, 0.001);
251
+ float spacing = max(uSpacing, 0.001);
252
+ vec2 centered = vUv * uResolution - uResolution * 0.5;
253
+ float s = sin(uAngle);
254
+ float c = cos(uAngle);
255
+ vec2 rotated = vec2(
256
+ centered.x * c - centered.y * s,
257
+ centered.x * s + centered.y * c
258
+ );
259
+ vec2 position = rotated + uOffset;
260
+ vec2 localPosition = mod(position, spacing);
261
+ if (localPosition.x < 0.0) {
262
+ localPosition.x += spacing;
263
+ }
264
+ if (localPosition.y < 0.0) {
265
+ localPosition.y += spacing;
266
+ }
267
+
268
+ if (localPosition.x > cellSize || localPosition.y > cellSize) {
269
+ fragColor = texColor;
270
+ return;
271
+ }
272
+
273
+ vec2 cell = floor(position / spacing);
274
+ float colorIndex = mod(cell.x + cell.y, uNumColors);
275
+ if (colorIndex < 0.0) {
276
+ colorIndex += uNumColors;
277
+ }
278
+
279
+ float texCoord = (colorIndex + 0.5) / uNumColors;
280
+ vec4 checkerColor = texture(uPalette, vec2(texCoord, 0.5));
281
+ float checkerAlpha = checkerColor.a;
282
+ vec3 premultipliedChecker = checkerColor.rgb * checkerAlpha;
283
+
284
+ if (uMaskToSourceAlpha) {
285
+ fragColor = vec4(
286
+ premultipliedChecker * texColor.a + texColor.rgb * (1.0 - checkerAlpha),
287
+ texColor.a
288
+ );
289
+ return;
290
+ }
291
+
292
+ fragColor = vec4(
293
+ premultipliedChecker + texColor.rgb * (1.0 - checkerAlpha),
294
+ checkerAlpha + texColor.a * (1.0 - checkerAlpha)
295
+ );
296
+ }
297
+ `;
298
+ var compileShader = (gl, type, source) => {
299
+ const shader = gl.createShader(type);
300
+ if (!shader) {
301
+ throw new Error("Failed to create WebGL shader");
302
+ }
303
+ gl.shaderSource(shader, source);
304
+ gl.compileShader(shader);
305
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
306
+ const log = gl.getShaderInfoLog(shader);
307
+ gl.deleteShader(shader);
308
+ throw new Error(`Checkerboard shader compile failed: ${log ?? "(no log)"}`);
309
+ }
310
+ return shader;
311
+ };
312
+ var linkProgram = (gl, vs, fs) => {
313
+ const program = gl.createProgram();
314
+ if (!program) {
315
+ throw new Error("Failed to create WebGL program");
316
+ }
317
+ gl.attachShader(program, vs);
318
+ gl.attachShader(program, fs);
319
+ gl.linkProgram(program);
320
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
321
+ const log = gl.getProgramInfoLog(program);
322
+ gl.deleteProgram(program);
323
+ throw new Error(`Checkerboard program link failed: ${log ?? "(no log)"}`);
324
+ }
325
+ return program;
326
+ };
327
+ var createProgram = (gl, vertexSource, fragmentSource) => {
328
+ const vs = compileShader(gl, gl.VERTEX_SHADER, vertexSource);
329
+ const fs = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
330
+ const program = linkProgram(gl, vs, fs);
331
+ gl.deleteShader(vs);
332
+ gl.deleteShader(fs);
333
+ return program;
334
+ };
335
+ var createTexture = (gl, filter) => {
336
+ const texture = gl.createTexture();
337
+ if (!texture) {
338
+ throw new Error("Failed to create WebGL texture");
339
+ }
340
+ gl.bindTexture(gl.TEXTURE_2D, texture);
341
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, filter);
342
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, filter);
343
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
344
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
345
+ gl.bindTexture(gl.TEXTURE_2D, null);
346
+ return texture;
347
+ };
348
+ var setupCheckerboard = (target) => {
349
+ const gl = target.getContext("webgl2", {
350
+ premultipliedAlpha: true,
351
+ alpha: true,
352
+ preserveDrawingBuffer: true
353
+ });
354
+ if (!gl) {
355
+ throw createWebGL2ContextError("checkerboard effect");
356
+ }
357
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
358
+ const program = createProgram(gl, CHECKERBOARD_VS, CHECKERBOARD_FS);
359
+ const vao = gl.createVertexArray();
360
+ if (!vao) {
361
+ throw new Error("Failed to create WebGL vertex array");
362
+ }
363
+ gl.bindVertexArray(vao);
364
+ const data = new Float32Array([
365
+ -1,
366
+ -1,
367
+ 0,
368
+ 0,
369
+ 1,
370
+ -1,
371
+ 1,
372
+ 0,
373
+ -1,
374
+ 1,
375
+ 0,
376
+ 1,
377
+ 1,
378
+ 1,
379
+ 1,
380
+ 1
381
+ ]);
382
+ const vbo = gl.createBuffer();
383
+ if (!vbo) {
384
+ throw new Error("Failed to create WebGL buffer");
385
+ }
386
+ gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
387
+ gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
388
+ const aPos = gl.getAttribLocation(program, "aPos");
389
+ const aUv = gl.getAttribLocation(program, "aUv");
390
+ gl.enableVertexAttribArray(aPos);
391
+ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 16, 0);
392
+ gl.enableVertexAttribArray(aUv);
393
+ gl.vertexAttribPointer(aUv, 2, gl.FLOAT, false, 16, 8);
394
+ gl.bindVertexArray(null);
395
+ const colorCanvas = document.createElement("canvas");
396
+ colorCanvas.width = 1;
397
+ colorCanvas.height = 1;
398
+ const colorCtx = colorCanvas.getContext("2d", { willReadFrequently: true });
399
+ if (!colorCtx) {
400
+ throw new Error("Failed to acquire 2D context for color parsing");
401
+ }
402
+ return {
403
+ gl,
404
+ program,
405
+ vao,
406
+ vbo,
407
+ sourceTexture: createTexture(gl, gl.LINEAR),
408
+ paletteTexture: createTexture(gl, gl.NEAREST),
409
+ colorCtx,
410
+ uniforms: {
411
+ uSource: gl.getUniformLocation(program, "uSource"),
412
+ uPalette: gl.getUniformLocation(program, "uPalette"),
413
+ uResolution: gl.getUniformLocation(program, "uResolution"),
414
+ uNumColors: gl.getUniformLocation(program, "uNumColors"),
415
+ uCellSize: gl.getUniformLocation(program, "uCellSize"),
416
+ uSpacing: gl.getUniformLocation(program, "uSpacing"),
417
+ uAngle: gl.getUniformLocation(program, "uAngle"),
418
+ uOffset: gl.getUniformLocation(program, "uOffset"),
419
+ uMaskToSourceAlpha: gl.getUniformLocation(program, "uMaskToSourceAlpha")
420
+ },
421
+ cachedPaletteKey: "",
422
+ palettePixelData: new Uint8Array(0)
423
+ };
424
+ };
425
+ var updatePalette = (state, colors) => {
426
+ const paletteKey = colors.join("|");
427
+ const paletteDirty = state.cachedPaletteKey !== paletteKey;
428
+ if (!paletteDirty) {
429
+ return false;
430
+ }
431
+ state.cachedPaletteKey = paletteKey;
432
+ const len = colors.length * 4;
433
+ if (state.palettePixelData.length !== len) {
434
+ state.palettePixelData = new Uint8Array(len);
435
+ }
436
+ const { palettePixelData } = state;
437
+ for (let i = 0;i < colors.length; i++) {
438
+ const color = parseColorRgba(state.colorCtx, colors[i]);
439
+ palettePixelData[i * 4] = color[0];
440
+ palettePixelData[i * 4 + 1] = color[1];
441
+ palettePixelData[i * 4 + 2] = color[2];
442
+ palettePixelData[i * 4 + 3] = color[3];
443
+ }
444
+ return true;
445
+ };
446
+ var checkerboard = createEffect({
447
+ type: "remotion/checkerboard",
448
+ label: "checkerboard()",
449
+ documentationLink: "https://www.remotion.dev/docs/effects/checkerboard",
450
+ backend: "webgl2",
451
+ calculateKey: (params) => {
452
+ const r = resolve(params);
453
+ const maskSuffix = r.maskToSourceAlpha ? "-mask-to-source-alpha" : "";
454
+ return `checkerboard-${r.colors.join("|")}-${r.cellSize}-${r.spacing}-${r.angle}-${r.offsetX}-${r.offsetY}${maskSuffix}`;
455
+ },
456
+ setup: (target) => setupCheckerboard(target),
457
+ apply: ({ source, width, height, params, state, flipSourceY }) => {
458
+ const r = resolve(params);
459
+ const paletteDirty = updatePalette(state, r.colors);
460
+ const { gl, program, sourceTexture, paletteTexture, uniforms, vao } = state;
461
+ gl.viewport(0, 0, width, height);
462
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
463
+ gl.clearColor(0, 0, 0, 0);
464
+ gl.clear(gl.COLOR_BUFFER_BIT);
465
+ gl.activeTexture(gl.TEXTURE0);
466
+ gl.bindTexture(gl.TEXTURE_2D, sourceTexture);
467
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
468
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
469
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
470
+ gl.activeTexture(gl.TEXTURE1);
471
+ gl.bindTexture(gl.TEXTURE_2D, paletteTexture);
472
+ if (paletteDirty) {
473
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
474
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
475
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, r.colors.length, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, state.palettePixelData);
476
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
477
+ }
478
+ gl.useProgram(program);
479
+ if (uniforms.uSource)
480
+ gl.uniform1i(uniforms.uSource, 0);
481
+ if (uniforms.uPalette)
482
+ gl.uniform1i(uniforms.uPalette, 1);
483
+ if (uniforms.uResolution)
484
+ gl.uniform2f(uniforms.uResolution, width, height);
485
+ if (uniforms.uNumColors)
486
+ gl.uniform1f(uniforms.uNumColors, r.colors.length);
487
+ if (uniforms.uCellSize)
488
+ gl.uniform1f(uniforms.uCellSize, r.cellSize);
489
+ if (uniforms.uSpacing)
490
+ gl.uniform1f(uniforms.uSpacing, r.spacing);
491
+ if (uniforms.uAngle)
492
+ gl.uniform1f(uniforms.uAngle, r.angle * Math.PI / 180);
493
+ if (uniforms.uOffset)
494
+ gl.uniform2f(uniforms.uOffset, r.offsetX, r.offsetY);
495
+ if (uniforms.uMaskToSourceAlpha)
496
+ gl.uniform1i(uniforms.uMaskToSourceAlpha, r.maskToSourceAlpha ? 1 : 0);
497
+ gl.bindVertexArray(vao);
498
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
499
+ gl.bindVertexArray(null);
500
+ gl.bindTexture(gl.TEXTURE_2D, null);
501
+ gl.useProgram(null);
502
+ },
503
+ cleanup: ({ gl, program, vao, vbo, sourceTexture, paletteTexture }) => {
504
+ gl.deleteTexture(sourceTexture);
505
+ gl.deleteTexture(paletteTexture);
506
+ gl.deleteBuffer(vbo);
507
+ gl.deleteProgram(program);
508
+ gl.deleteVertexArray(vao);
509
+ },
510
+ schema: checkerboardSchema,
511
+ validateParams: validateCheckerboardParams
512
+ });
513
+
514
+ // src/pattern.ts
515
+ import { Internals as Internals2 } from "remotion";
516
+ var { createEffect: createEffect2, createWebGL2ContextError: createWebGL2ContextError2 } = Internals2;
111
517
  var DEFAULT_SCALE = 0.1;
112
518
  var DEFAULT_CROP = 0;
113
- var DEFAULT_GAP = 0;
519
+ var DEFAULT_GAP2 = 0;
114
520
  var DEFAULT_OFFSET = 0;
115
521
  var DEFAULT_OFFSET_EVERY = 0;
116
522
  var DEFAULT_ORIGIN = [0, 0];
@@ -156,14 +562,14 @@ var patternSchema = {
156
562
  gapX: {
157
563
  type: "number",
158
564
  step: 1,
159
- default: DEFAULT_GAP,
565
+ default: DEFAULT_GAP2,
160
566
  description: "Gap X",
161
567
  hiddenFromList: false
162
568
  },
163
569
  gapY: {
164
570
  type: "number",
165
571
  step: 1,
166
- default: DEFAULT_GAP,
572
+ default: DEFAULT_GAP2,
167
573
  description: "Gap Y",
168
574
  hiddenFromList: false
169
575
  },
@@ -225,14 +631,14 @@ var patternSchema = {
225
631
  description: "Wrap"
226
632
  }
227
633
  };
228
- var resolve = (p) => ({
634
+ var resolve2 = (p) => ({
229
635
  scale: p.scale ?? DEFAULT_SCALE,
230
636
  cropLeft: p.cropLeft ?? DEFAULT_CROP,
231
637
  cropTop: p.cropTop ?? DEFAULT_CROP,
232
638
  cropRight: p.cropRight ?? DEFAULT_CROP,
233
639
  cropBottom: p.cropBottom ?? DEFAULT_CROP,
234
- gapX: p.gapX ?? DEFAULT_GAP,
235
- gapY: p.gapY ?? DEFAULT_GAP,
640
+ gapX: p.gapX ?? DEFAULT_GAP2,
641
+ gapY: p.gapY ?? DEFAULT_GAP2,
236
642
  offsetU: p.offsetU ?? DEFAULT_OFFSET,
237
643
  offsetV: p.offsetV ?? DEFAULT_OFFSET,
238
644
  rowOffset: p.rowOffset ?? DEFAULT_OFFSET,
@@ -258,7 +664,7 @@ var assertOptionalInteger = (value, name) => {
258
664
  throw new TypeError(`"${name}" must be an integer, but got ${JSON.stringify(value)}`);
259
665
  }
260
666
  };
261
- var validatePositive = (value, name) => {
667
+ var validatePositive2 = (value, name) => {
262
668
  if (value <= 0) {
263
669
  throw new TypeError(`"${name}" must be > 0`);
264
670
  }
@@ -287,8 +693,8 @@ var validatePatternParams = (params) => {
287
693
  assertOptionalBoolean(params.wrap, "wrap");
288
694
  assertOptionalInteger(params.rowOffsetEvery, "rowOffsetEvery");
289
695
  assertOptionalInteger(params.columnOffsetEvery, "columnOffsetEvery");
290
- const r = resolve(params);
291
- validatePositive(r.scale, "scale");
696
+ const r = resolve2(params);
697
+ validatePositive2(r.scale, "scale");
292
698
  validateAtLeast(r.rowOffsetEvery, 0, "rowOffsetEvery");
293
699
  validateAtLeast(r.columnOffsetEvery, 0, "columnOffsetEvery");
294
700
  validateUnitInterval(r.origin[0], "origin[0]");
@@ -398,7 +804,7 @@ void main() {
398
804
  fragColor = vec4(0.0);
399
805
  }
400
806
  `;
401
- var compileShader = (gl, type, source) => {
807
+ var compileShader2 = (gl, type, source) => {
402
808
  const shader = gl.createShader(type);
403
809
  if (!shader) {
404
810
  throw new Error("Failed to create WebGL shader");
@@ -412,7 +818,7 @@ var compileShader = (gl, type, source) => {
412
818
  }
413
819
  return shader;
414
820
  };
415
- var linkProgram = (gl, vs, fs) => {
821
+ var linkProgram2 = (gl, vs, fs) => {
416
822
  const program = gl.createProgram();
417
823
  if (!program) {
418
824
  throw new Error("Failed to create WebGL program");
@@ -427,13 +833,13 @@ var linkProgram = (gl, vs, fs) => {
427
833
  }
428
834
  return program;
429
835
  };
430
- var pattern = createEffect({
836
+ var pattern = createEffect2({
431
837
  type: "dev.remotion.effects.pattern",
432
838
  label: "pattern()",
433
839
  documentationLink: "https://www.remotion.dev/docs/effects/pattern",
434
840
  backend: "webgl2",
435
841
  calculateKey: (params) => {
436
- const r = resolve(params);
842
+ const r = resolve2(params);
437
843
  return `pattern-${r.scale}-${r.cropLeft}-${r.cropTop}-${r.cropRight}-${r.cropBottom}-${r.gapX}-${r.gapY}-${r.offsetU}-${r.offsetV}-${r.rowOffset}-${r.rowOffsetEvery}-${r.columnOffset}-${r.columnOffsetEvery}-${r.origin[0]}-${r.origin[1]}-${r.wrap ? 1 : 0}`;
438
844
  },
439
845
  setup: (target) => {
@@ -443,12 +849,12 @@ var pattern = createEffect({
443
849
  preserveDrawingBuffer: true
444
850
  });
445
851
  if (!gl) {
446
- throw createWebGL2ContextError("pattern effect");
852
+ throw createWebGL2ContextError2("pattern effect");
447
853
  }
448
854
  gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
449
- const vs = compileShader(gl, gl.VERTEX_SHADER, PATTERN_VS);
450
- const fs = compileShader(gl, gl.FRAGMENT_SHADER, PATTERN_FS);
451
- const program = linkProgram(gl, vs, fs);
855
+ const vs = compileShader2(gl, gl.VERTEX_SHADER, PATTERN_VS);
856
+ const fs = compileShader2(gl, gl.FRAGMENT_SHADER, PATTERN_FS);
857
+ const program = linkProgram2(gl, vs, fs);
452
858
  gl.deleteShader(vs);
453
859
  gl.deleteShader(fs);
454
860
  const vao = gl.createVertexArray();
@@ -518,7 +924,7 @@ var pattern = createEffect({
518
924
  };
519
925
  },
520
926
  apply: ({ source, width, height, params, state, flipSourceY }) => {
521
- const r = resolve(params);
927
+ const r = resolve2(params);
522
928
  const { gl, program, vao, texture, uniforms } = state;
523
929
  gl.viewport(0, 0, width, height);
524
930
  gl.clearColor(0, 0, 0, 0);
@@ -565,7 +971,7 @@ var pattern = createEffect({
565
971
  });
566
972
 
567
973
  // src/rings.ts
568
- import { Internals as Internals2 } from "remotion";
974
+ import { Internals as Internals3 } from "remotion";
569
975
 
570
976
  // src/uv-coordinate.ts
571
977
  var publicUvToShaderUv = (uv) => {
@@ -573,20 +979,20 @@ var publicUvToShaderUv = (uv) => {
573
979
  };
574
980
 
575
981
  // src/rings.ts
576
- var { createEffect: createEffect2, createWebGL2ContextError: createWebGL2ContextError2 } = Internals2;
577
- var DEFAULT_COLORS = ["#dff4ff", "#7cc6ff"];
982
+ var { createEffect: createEffect3, createWebGL2ContextError: createWebGL2ContextError3 } = Internals3;
983
+ var DEFAULT_COLORS2 = ["#dff4ff", "#7cc6ff"];
578
984
  var DEFAULT_CENTER = [0.5, 0.5];
579
985
  var DEFAULT_THICKNESS = 40;
580
- var DEFAULT_GAP2 = 0;
986
+ var DEFAULT_GAP3 = 0;
581
987
  var DEFAULT_OFFSET2 = 0;
582
- var DEFAULT_MASK_TO_SOURCE_ALPHA = false;
988
+ var DEFAULT_MASK_TO_SOURCE_ALPHA2 = false;
583
989
  var ringsSchema = {
584
990
  colors: {
585
991
  type: "array",
586
992
  item: {
587
993
  type: "color"
588
994
  },
589
- default: DEFAULT_COLORS,
995
+ default: DEFAULT_COLORS2,
590
996
  minLength: 2,
591
997
  newItemDefault: "#ff0000",
592
998
  description: "Colors",
@@ -614,7 +1020,7 @@ var ringsSchema = {
614
1020
  min: 0,
615
1021
  max: 400,
616
1022
  step: 0.1,
617
- default: DEFAULT_GAP2,
1023
+ default: DEFAULT_GAP3,
618
1024
  description: "Gap",
619
1025
  hiddenFromList: false
620
1026
  },
@@ -627,33 +1033,33 @@ var ringsSchema = {
627
1033
  },
628
1034
  maskToSourceAlpha: {
629
1035
  type: "boolean",
630
- default: DEFAULT_MASK_TO_SOURCE_ALPHA,
1036
+ default: DEFAULT_MASK_TO_SOURCE_ALPHA2,
631
1037
  description: "Mask to source alpha"
632
1038
  }
633
1039
  };
634
- var resolve2 = (p) => {
1040
+ var resolve3 = (p) => {
635
1041
  const thickness = p.thickness ?? DEFAULT_THICKNESS;
636
- const gap = p.gap ?? DEFAULT_GAP2;
1042
+ const gap = p.gap ?? DEFAULT_GAP3;
637
1043
  return {
638
- colors: p.colors ?? DEFAULT_COLORS,
1044
+ colors: p.colors ?? DEFAULT_COLORS2,
639
1045
  center: [...p.center ?? DEFAULT_CENTER],
640
1046
  thickness,
641
1047
  spacing: thickness + gap,
642
1048
  offset: p.offset ?? DEFAULT_OFFSET2,
643
- maskToSourceAlpha: p.maskToSourceAlpha ?? DEFAULT_MASK_TO_SOURCE_ALPHA
1049
+ maskToSourceAlpha: p.maskToSourceAlpha ?? DEFAULT_MASK_TO_SOURCE_ALPHA2
644
1050
  };
645
1051
  };
646
- var validatePositive2 = (value, name) => {
1052
+ var validatePositive3 = (value, name) => {
647
1053
  if (value <= 0) {
648
1054
  throw new TypeError(`"${name}" must be greater than 0, but got ${JSON.stringify(value)}`);
649
1055
  }
650
1056
  };
651
- var validateNonNegative2 = (value, name) => {
1057
+ var validateNonNegative3 = (value, name) => {
652
1058
  if (value < 0) {
653
1059
  throw new TypeError(`"${name}" must be greater than or equal to 0, but got ${JSON.stringify(value)}`);
654
1060
  }
655
1061
  };
656
- var validateColors = (colors) => {
1062
+ var validateColors2 = (colors) => {
657
1063
  if (colors === undefined) {
658
1064
  return;
659
1065
  }
@@ -676,16 +1082,16 @@ var assertOptionalCenter = (value, name) => {
676
1082
  };
677
1083
  var validateRingsParams = (params) => {
678
1084
  assertEffectParamsObject(params, "Rings");
679
- validateColors(params.colors);
1085
+ validateColors2(params.colors);
680
1086
  assertOptionalCenter(params.center, "center");
681
1087
  assertOptionalFiniteNumber(params.thickness, "thickness");
682
1088
  assertOptionalFiniteNumber(params.gap, "gap");
683
1089
  assertOptionalFiniteNumber(params.offset, "offset");
684
1090
  assertOptionalBoolean(params.maskToSourceAlpha, "maskToSourceAlpha");
685
1091
  const thickness = params.thickness ?? DEFAULT_THICKNESS;
686
- const gap = params.gap ?? DEFAULT_GAP2;
687
- validatePositive2(thickness, "thickness");
688
- validateNonNegative2(gap, "gap");
1092
+ const gap = params.gap ?? DEFAULT_GAP3;
1093
+ validatePositive3(thickness, "thickness");
1094
+ validateNonNegative3(gap, "gap");
689
1095
  };
690
1096
  var RINGS_VS = `#version 300 es
691
1097
  in vec2 aPos;
@@ -752,7 +1158,7 @@ void main() {
752
1158
  );
753
1159
  }
754
1160
  `;
755
- var compileShader2 = (gl, type, source) => {
1161
+ var compileShader3 = (gl, type, source) => {
756
1162
  const shader = gl.createShader(type);
757
1163
  if (!shader) {
758
1164
  throw new Error("Failed to create WebGL shader");
@@ -766,7 +1172,7 @@ var compileShader2 = (gl, type, source) => {
766
1172
  }
767
1173
  return shader;
768
1174
  };
769
- var linkProgram2 = (gl, vs, fs) => {
1175
+ var linkProgram3 = (gl, vs, fs) => {
770
1176
  const program = gl.createProgram();
771
1177
  if (!program) {
772
1178
  throw new Error("Failed to create WebGL program");
@@ -781,15 +1187,15 @@ var linkProgram2 = (gl, vs, fs) => {
781
1187
  }
782
1188
  return program;
783
1189
  };
784
- var createProgram = (gl, vertexSource, fragmentSource) => {
785
- const vs = compileShader2(gl, gl.VERTEX_SHADER, vertexSource);
786
- const fs = compileShader2(gl, gl.FRAGMENT_SHADER, fragmentSource);
787
- const program = linkProgram2(gl, vs, fs);
1190
+ var createProgram2 = (gl, vertexSource, fragmentSource) => {
1191
+ const vs = compileShader3(gl, gl.VERTEX_SHADER, vertexSource);
1192
+ const fs = compileShader3(gl, gl.FRAGMENT_SHADER, fragmentSource);
1193
+ const program = linkProgram3(gl, vs, fs);
788
1194
  gl.deleteShader(vs);
789
1195
  gl.deleteShader(fs);
790
1196
  return program;
791
1197
  };
792
- var createTexture = (gl, filter) => {
1198
+ var createTexture2 = (gl, filter) => {
793
1199
  const texture = gl.createTexture();
794
1200
  if (!texture) {
795
1201
  throw new Error("Failed to create WebGL texture");
@@ -809,10 +1215,10 @@ var setupRings = (target) => {
809
1215
  preserveDrawingBuffer: true
810
1216
  });
811
1217
  if (!gl) {
812
- throw createWebGL2ContextError2("rings effect");
1218
+ throw createWebGL2ContextError3("rings effect");
813
1219
  }
814
1220
  gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
815
- const program = createProgram(gl, RINGS_VS, RINGS_FS);
1221
+ const program = createProgram2(gl, RINGS_VS, RINGS_FS);
816
1222
  const vao = gl.createVertexArray();
817
1223
  if (!vao) {
818
1224
  throw new Error("Failed to create WebGL vertex array");
@@ -840,156 +1246,623 @@ var setupRings = (target) => {
840
1246
  if (!vbo) {
841
1247
  throw new Error("Failed to create WebGL buffer");
842
1248
  }
843
- gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
844
- gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
845
- const aPos = gl.getAttribLocation(program, "aPos");
846
- const aUv = gl.getAttribLocation(program, "aUv");
847
- gl.enableVertexAttribArray(aPos);
848
- gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 16, 0);
849
- gl.enableVertexAttribArray(aUv);
850
- gl.vertexAttribPointer(aUv, 2, gl.FLOAT, false, 16, 8);
851
- gl.bindVertexArray(null);
852
- const colorCanvas = document.createElement("canvas");
853
- colorCanvas.width = 1;
854
- colorCanvas.height = 1;
855
- const colorCtx = colorCanvas.getContext("2d", { willReadFrequently: true });
856
- if (!colorCtx) {
857
- throw new Error("Failed to acquire 2D context for color parsing");
1249
+ gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
1250
+ gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
1251
+ const aPos = gl.getAttribLocation(program, "aPos");
1252
+ const aUv = gl.getAttribLocation(program, "aUv");
1253
+ gl.enableVertexAttribArray(aPos);
1254
+ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 16, 0);
1255
+ gl.enableVertexAttribArray(aUv);
1256
+ gl.vertexAttribPointer(aUv, 2, gl.FLOAT, false, 16, 8);
1257
+ gl.bindVertexArray(null);
1258
+ const colorCanvas = document.createElement("canvas");
1259
+ colorCanvas.width = 1;
1260
+ colorCanvas.height = 1;
1261
+ const colorCtx = colorCanvas.getContext("2d", { willReadFrequently: true });
1262
+ if (!colorCtx) {
1263
+ throw new Error("Failed to acquire 2D context for color parsing");
1264
+ }
1265
+ return {
1266
+ gl,
1267
+ program,
1268
+ vao,
1269
+ vbo,
1270
+ sourceTexture: createTexture2(gl, gl.LINEAR),
1271
+ paletteTexture: createTexture2(gl, gl.NEAREST),
1272
+ colorCtx,
1273
+ uniforms: {
1274
+ uSource: gl.getUniformLocation(program, "uSource"),
1275
+ uPalette: gl.getUniformLocation(program, "uPalette"),
1276
+ uResolution: gl.getUniformLocation(program, "uResolution"),
1277
+ uNumColors: gl.getUniformLocation(program, "uNumColors"),
1278
+ uCenter: gl.getUniformLocation(program, "uCenter"),
1279
+ uThickness: gl.getUniformLocation(program, "uThickness"),
1280
+ uSpacing: gl.getUniformLocation(program, "uSpacing"),
1281
+ uOffset: gl.getUniformLocation(program, "uOffset"),
1282
+ uMaskToSourceAlpha: gl.getUniformLocation(program, "uMaskToSourceAlpha")
1283
+ },
1284
+ cachedPaletteKey: "",
1285
+ palettePixelData: new Uint8Array(0)
1286
+ };
1287
+ };
1288
+ var updatePalette2 = (state, colors) => {
1289
+ const paletteKey = colors.join("|");
1290
+ const paletteDirty = state.cachedPaletteKey !== paletteKey;
1291
+ if (!paletteDirty) {
1292
+ return false;
1293
+ }
1294
+ state.cachedPaletteKey = paletteKey;
1295
+ const len = colors.length * 4;
1296
+ if (state.palettePixelData.length !== len) {
1297
+ state.palettePixelData = new Uint8Array(len);
1298
+ }
1299
+ const { palettePixelData } = state;
1300
+ for (let i = 0;i < colors.length; i++) {
1301
+ const color = parseColorRgba(state.colorCtx, colors[i]);
1302
+ palettePixelData[i * 4] = color[0];
1303
+ palettePixelData[i * 4 + 1] = color[1];
1304
+ palettePixelData[i * 4 + 2] = color[2];
1305
+ palettePixelData[i * 4 + 3] = color[3];
1306
+ }
1307
+ return true;
1308
+ };
1309
+ var rings = createEffect3({
1310
+ type: "dev.remotion.effects.rings",
1311
+ label: "rings()",
1312
+ documentationLink: "https://www.remotion.dev/docs/effects/rings",
1313
+ backend: "webgl2",
1314
+ calculateKey: (params) => {
1315
+ const r = resolve3(params);
1316
+ const maskSuffix = r.maskToSourceAlpha ? "-mask-to-source-alpha" : "";
1317
+ return `rings-${r.colors.join("|")}-${r.center.join(":")}-${r.thickness}-${r.spacing}-${r.offset}${maskSuffix}`;
1318
+ },
1319
+ setup: (target) => setupRings(target),
1320
+ apply: ({ source, width, height, params, state, flipSourceY }) => {
1321
+ const r = resolve3(params);
1322
+ const paletteDirty = updatePalette2(state, r.colors);
1323
+ const { gl, program, sourceTexture, paletteTexture, uniforms, vao } = state;
1324
+ gl.viewport(0, 0, width, height);
1325
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
1326
+ gl.clearColor(0, 0, 0, 0);
1327
+ gl.clear(gl.COLOR_BUFFER_BIT);
1328
+ gl.activeTexture(gl.TEXTURE0);
1329
+ gl.bindTexture(gl.TEXTURE_2D, sourceTexture);
1330
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
1331
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
1332
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
1333
+ gl.activeTexture(gl.TEXTURE1);
1334
+ gl.bindTexture(gl.TEXTURE_2D, paletteTexture);
1335
+ if (paletteDirty) {
1336
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
1337
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
1338
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, r.colors.length, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, state.palettePixelData);
1339
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
1340
+ }
1341
+ gl.useProgram(program);
1342
+ if (uniforms.uSource)
1343
+ gl.uniform1i(uniforms.uSource, 0);
1344
+ if (uniforms.uPalette)
1345
+ gl.uniform1i(uniforms.uPalette, 1);
1346
+ if (uniforms.uResolution)
1347
+ gl.uniform2f(uniforms.uResolution, width, height);
1348
+ if (uniforms.uNumColors)
1349
+ gl.uniform1f(uniforms.uNumColors, r.colors.length);
1350
+ if (uniforms.uCenter) {
1351
+ const shaderCenter = publicUvToShaderUv(r.center);
1352
+ gl.uniform2f(uniforms.uCenter, shaderCenter[0], shaderCenter[1]);
1353
+ }
1354
+ if (uniforms.uThickness)
1355
+ gl.uniform1f(uniforms.uThickness, r.thickness);
1356
+ if (uniforms.uSpacing)
1357
+ gl.uniform1f(uniforms.uSpacing, r.spacing);
1358
+ if (uniforms.uOffset)
1359
+ gl.uniform1f(uniforms.uOffset, r.offset);
1360
+ if (uniforms.uMaskToSourceAlpha)
1361
+ gl.uniform1i(uniforms.uMaskToSourceAlpha, r.maskToSourceAlpha ? 1 : 0);
1362
+ gl.bindVertexArray(vao);
1363
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
1364
+ gl.bindVertexArray(null);
1365
+ gl.bindTexture(gl.TEXTURE_2D, null);
1366
+ gl.useProgram(null);
1367
+ },
1368
+ cleanup: ({ gl, program, vao, vbo, sourceTexture, paletteTexture }) => {
1369
+ gl.deleteTexture(sourceTexture);
1370
+ gl.deleteTexture(paletteTexture);
1371
+ gl.deleteBuffer(vbo);
1372
+ gl.deleteProgram(program);
1373
+ gl.deleteVertexArray(vao);
1374
+ },
1375
+ schema: ringsSchema,
1376
+ validateParams: validateRingsParams
1377
+ });
1378
+
1379
+ // src/gridlines.ts
1380
+ import { Internals as Internals4 } from "remotion";
1381
+ var { createEffect: createEffect4, createWebGL2ContextError: createWebGL2ContextError4 } = Internals4;
1382
+ var DEFAULT_GRID_SIZE = 64;
1383
+ var DEFAULT_LINE_WIDTH = 2;
1384
+ var DEFAULT_LINE_COLOR = "#ffffff";
1385
+ var DEFAULT_BACKGROUND_COLOR = "transparent";
1386
+ var DEFAULT_ROTATION = 0;
1387
+ var DEFAULT_ROTATION_X = 0;
1388
+ var DEFAULT_ROTATION_Y = 0;
1389
+ var DEFAULT_PERSPECTIVE = 0;
1390
+ var DEFAULT_OFFSET_X2 = 0;
1391
+ var DEFAULT_OFFSET_Y2 = 0;
1392
+ var DEFAULT_MASK_TO_SOURCE_ALPHA3 = false;
1393
+ var gridlinesSchema = {
1394
+ gridSize: {
1395
+ type: "number",
1396
+ min: 1,
1397
+ max: 400,
1398
+ step: 1,
1399
+ default: DEFAULT_GRID_SIZE,
1400
+ description: "Grid size",
1401
+ hiddenFromList: false
1402
+ },
1403
+ lineWidth: {
1404
+ type: "number",
1405
+ min: 0,
1406
+ max: 100,
1407
+ step: 0.1,
1408
+ default: DEFAULT_LINE_WIDTH,
1409
+ description: "Line width",
1410
+ hiddenFromList: false
1411
+ },
1412
+ lineColor: {
1413
+ type: "color",
1414
+ default: DEFAULT_LINE_COLOR,
1415
+ description: "Line color"
1416
+ },
1417
+ backgroundColor: {
1418
+ type: "color",
1419
+ default: DEFAULT_BACKGROUND_COLOR,
1420
+ description: "Background color"
1421
+ },
1422
+ rotation: {
1423
+ type: "rotation-degrees",
1424
+ min: -180,
1425
+ max: 180,
1426
+ step: 1,
1427
+ default: DEFAULT_ROTATION,
1428
+ description: "Rotation"
1429
+ },
1430
+ rotationX: {
1431
+ type: "rotation-degrees",
1432
+ min: -180,
1433
+ max: 180,
1434
+ step: 1,
1435
+ default: DEFAULT_ROTATION_X,
1436
+ description: "Rotation X"
1437
+ },
1438
+ rotationY: {
1439
+ type: "rotation-degrees",
1440
+ min: -180,
1441
+ max: 180,
1442
+ step: 1,
1443
+ default: DEFAULT_ROTATION_Y,
1444
+ description: "Rotation Y"
1445
+ },
1446
+ perspective: {
1447
+ type: "number",
1448
+ min: 0,
1449
+ max: 4000,
1450
+ step: 1,
1451
+ default: DEFAULT_PERSPECTIVE,
1452
+ description: "Perspective",
1453
+ hiddenFromList: false
1454
+ },
1455
+ offsetX: {
1456
+ type: "number",
1457
+ min: -400,
1458
+ max: 400,
1459
+ step: 0.1,
1460
+ default: DEFAULT_OFFSET_X2,
1461
+ description: "Offset X",
1462
+ hiddenFromList: false
1463
+ },
1464
+ offsetY: {
1465
+ type: "number",
1466
+ min: -400,
1467
+ max: 400,
1468
+ step: 0.1,
1469
+ default: DEFAULT_OFFSET_Y2,
1470
+ description: "Offset Y",
1471
+ hiddenFromList: false
1472
+ },
1473
+ maskToSourceAlpha: {
1474
+ type: "boolean",
1475
+ default: DEFAULT_MASK_TO_SOURCE_ALPHA3,
1476
+ description: "Mask to source alpha"
1477
+ }
1478
+ };
1479
+ var resolve4 = (p) => ({
1480
+ gridSize: p.gridSize ?? DEFAULT_GRID_SIZE,
1481
+ lineWidth: p.lineWidth ?? DEFAULT_LINE_WIDTH,
1482
+ lineColor: p.lineColor ?? DEFAULT_LINE_COLOR,
1483
+ backgroundColor: p.backgroundColor ?? DEFAULT_BACKGROUND_COLOR,
1484
+ rotation: p.rotation ?? DEFAULT_ROTATION,
1485
+ rotationX: p.rotationX ?? DEFAULT_ROTATION_X,
1486
+ rotationY: p.rotationY ?? DEFAULT_ROTATION_Y,
1487
+ perspective: p.perspective ?? DEFAULT_PERSPECTIVE,
1488
+ offsetX: p.offsetX ?? DEFAULT_OFFSET_X2,
1489
+ offsetY: p.offsetY ?? DEFAULT_OFFSET_Y2,
1490
+ maskToSourceAlpha: p.maskToSourceAlpha ?? DEFAULT_MASK_TO_SOURCE_ALPHA3
1491
+ });
1492
+ var validatePositive4 = (value, name) => {
1493
+ if (value <= 0) {
1494
+ throw new TypeError(`"${name}" must be greater than 0, but got ${JSON.stringify(value)}`);
1495
+ }
1496
+ };
1497
+ var validateNonNegative4 = (value, name) => {
1498
+ if (value < 0) {
1499
+ throw new TypeError(`"${name}" must be greater than or equal to 0, but got ${JSON.stringify(value)}`);
1500
+ }
1501
+ };
1502
+ var validateGridlinesParams = (params) => {
1503
+ assertEffectParamsObject(params, "Gridlines");
1504
+ assertOptionalFiniteNumber(params.gridSize, "gridSize");
1505
+ assertOptionalFiniteNumber(params.lineWidth, "lineWidth");
1506
+ assertOptionalFiniteNumber(params.rotation, "rotation");
1507
+ assertOptionalFiniteNumber(params.rotationX, "rotationX");
1508
+ assertOptionalFiniteNumber(params.rotationY, "rotationY");
1509
+ assertOptionalFiniteNumber(params.perspective, "perspective");
1510
+ assertOptionalFiniteNumber(params.offsetX, "offsetX");
1511
+ assertOptionalFiniteNumber(params.offsetY, "offsetY");
1512
+ assertOptionalColor(params.lineColor, "lineColor");
1513
+ assertOptionalColor(params.backgroundColor, "backgroundColor");
1514
+ assertOptionalBoolean(params.maskToSourceAlpha, "maskToSourceAlpha");
1515
+ validatePositive4(params.gridSize ?? DEFAULT_GRID_SIZE, "gridSize");
1516
+ validateNonNegative4(params.lineWidth ?? DEFAULT_LINE_WIDTH, "lineWidth");
1517
+ validateNonNegative4(params.perspective ?? DEFAULT_PERSPECTIVE, "perspective");
1518
+ };
1519
+ var GRIDLINES_VS = `#version 300 es
1520
+ in vec2 aPos;
1521
+ in vec2 aUv;
1522
+ out vec2 vUv;
1523
+
1524
+ void main() {
1525
+ vUv = aUv;
1526
+ gl_Position = vec4(aPos, 0.0, 1.0);
1527
+ }
1528
+ `;
1529
+ var GRIDLINES_FS = `#version 300 es
1530
+ precision highp float;
1531
+
1532
+ in vec2 vUv;
1533
+ out vec4 fragColor;
1534
+
1535
+ uniform sampler2D uSource;
1536
+ uniform vec2 uResolution;
1537
+ uniform float uGridSize;
1538
+ uniform float uLineWidth;
1539
+ uniform vec4 uLineColor;
1540
+ uniform vec4 uBackgroundColor;
1541
+ uniform float uRotation;
1542
+ uniform float uRotationX;
1543
+ uniform float uRotationY;
1544
+ uniform float uPerspective;
1545
+ uniform vec2 uOffset;
1546
+ uniform bool uMaskToSourceAlpha;
1547
+
1548
+ vec4 sourceOver(vec4 backdrop, vec4 overlay) {
1549
+ return overlay + backdrop * (1.0 - overlay.a);
1550
+ }
1551
+
1552
+ vec4 sourceAtop(vec4 backdrop, vec4 overlay) {
1553
+ return vec4(
1554
+ overlay.rgb * backdrop.a + backdrop.rgb * (1.0 - overlay.a),
1555
+ backdrop.a
1556
+ );
1557
+ }
1558
+
1559
+ mat3 rotationMatrix(float rotationX, float rotationY, float rotationZ) {
1560
+ float sx = sin(rotationX);
1561
+ float cx = cos(rotationX);
1562
+ float sy = sin(rotationY);
1563
+ float cy = cos(rotationY);
1564
+ float sz = sin(rotationZ);
1565
+ float cz = cos(rotationZ);
1566
+
1567
+ mat3 rx = mat3(
1568
+ 1.0, 0.0, 0.0,
1569
+ 0.0, cx, sx,
1570
+ 0.0, -sx, cx
1571
+ );
1572
+ mat3 ry = mat3(
1573
+ cy, 0.0, -sy,
1574
+ 0.0, 1.0, 0.0,
1575
+ sy, 0.0, cy
1576
+ );
1577
+ mat3 rz = mat3(
1578
+ cz, sz, 0.0,
1579
+ -sz, cz, 0.0,
1580
+ 0.0, 0.0, 1.0
1581
+ );
1582
+
1583
+ return rz * ry * rx;
1584
+ }
1585
+
1586
+ void main() {
1587
+ vec4 texColor = texture(uSource, vUv);
1588
+ vec2 centered = vUv * uResolution - uResolution * 0.5;
1589
+ mat3 rotation = rotationMatrix(uRotationX, uRotationY, uRotation);
1590
+ vec2 gridCoord;
1591
+
1592
+ if (uPerspective <= 0.0) {
1593
+ vec3 rotated = rotation * vec3(centered, 0.0);
1594
+ gridCoord = rotated.xy + uOffset;
1595
+ } else {
1596
+ vec3 camera = vec3(0.0, 0.0, uPerspective);
1597
+ vec3 ray = normalize(vec3(centered, -uPerspective));
1598
+ vec3 normal = rotation * vec3(0.0, 0.0, 1.0);
1599
+ float denominator = dot(ray, normal);
1600
+ float t = -dot(camera, normal) / denominator;
1601
+
1602
+ if (abs(denominator) < 0.0001 || t <= 0.0) {
1603
+ fragColor = sourceOver(texColor, uBackgroundColor);
1604
+ return;
1605
+ }
1606
+
1607
+ vec3 worldPosition = camera + ray * t;
1608
+ vec3 localPosition = transpose(rotation) * worldPosition;
1609
+ gridCoord = localPosition.xy + uOffset;
1610
+ }
1611
+
1612
+ float gridSize = max(uGridSize, 0.001);
1613
+ vec2 cell = abs(fract(gridCoord / gridSize + 0.5) - 0.5) * gridSize;
1614
+ float halfLineWidth = uLineWidth * 0.5;
1615
+ vec2 gridUnitsPerPixel = max(fwidth(gridCoord), vec2(0.001));
1616
+ vec2 halfWidthInGridUnits = halfLineWidth * gridUnitsPerPixel;
1617
+ vec2 antialiasInGridUnits = gridUnitsPerPixel;
1618
+ vec2 projectedCellSize = gridSize / gridUnitsPerPixel;
1619
+ vec2 densityFade = smoothstep(
1620
+ vec2(max(uLineWidth * 1.5, 1.0)),
1621
+ vec2(max(uLineWidth * 4.0, 2.0)),
1622
+ projectedCellSize
1623
+ );
1624
+ vec2 lineCoverage = halfLineWidth <= 0.001
1625
+ ? vec2(0.0)
1626
+ : 1.0 - smoothstep(
1627
+ halfWidthInGridUnits - antialiasInGridUnits,
1628
+ halfWidthInGridUnits + antialiasInGridUnits,
1629
+ cell
1630
+ );
1631
+ lineCoverage *= densityFade;
1632
+ float coverage = max(lineCoverage.x, lineCoverage.y);
1633
+
1634
+ vec4 background = uBackgroundColor;
1635
+ vec4 line = uLineColor * coverage;
1636
+
1637
+ if (uMaskToSourceAlpha) {
1638
+ fragColor = sourceAtop(sourceAtop(texColor, background), line);
1639
+ return;
1640
+ }
1641
+
1642
+ fragColor = sourceOver(sourceOver(texColor, background), line);
1643
+ }
1644
+ `;
1645
+ var compileShader4 = (gl, type, source) => {
1646
+ const shader = gl.createShader(type);
1647
+ if (!shader) {
1648
+ throw new Error("Failed to create WebGL shader");
1649
+ }
1650
+ gl.shaderSource(shader, source);
1651
+ gl.compileShader(shader);
1652
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
1653
+ const log = gl.getShaderInfoLog(shader);
1654
+ gl.deleteShader(shader);
1655
+ throw new Error(`Gridlines shader compile failed: ${log ?? "(no log)"}`);
858
1656
  }
859
- return {
860
- gl,
861
- program,
862
- vao,
863
- vbo,
864
- sourceTexture: createTexture(gl, gl.LINEAR),
865
- paletteTexture: createTexture(gl, gl.NEAREST),
866
- colorCtx,
867
- uniforms: {
868
- uSource: gl.getUniformLocation(program, "uSource"),
869
- uPalette: gl.getUniformLocation(program, "uPalette"),
870
- uResolution: gl.getUniformLocation(program, "uResolution"),
871
- uNumColors: gl.getUniformLocation(program, "uNumColors"),
872
- uCenter: gl.getUniformLocation(program, "uCenter"),
873
- uThickness: gl.getUniformLocation(program, "uThickness"),
874
- uSpacing: gl.getUniformLocation(program, "uSpacing"),
875
- uOffset: gl.getUniformLocation(program, "uOffset"),
876
- uMaskToSourceAlpha: gl.getUniformLocation(program, "uMaskToSourceAlpha")
877
- },
878
- cachedPaletteKey: "",
879
- palettePixelData: new Uint8Array(0)
880
- };
1657
+ return shader;
881
1658
  };
882
- var updatePalette = (state, colors) => {
883
- const paletteKey = colors.join("|");
884
- const paletteDirty = state.cachedPaletteKey !== paletteKey;
885
- if (!paletteDirty) {
886
- return false;
887
- }
888
- state.cachedPaletteKey = paletteKey;
889
- const len = colors.length * 4;
890
- if (state.palettePixelData.length !== len) {
891
- state.palettePixelData = new Uint8Array(len);
1659
+ var linkProgram4 = (gl, vs, fs) => {
1660
+ const program = gl.createProgram();
1661
+ if (!program) {
1662
+ throw new Error("Failed to create WebGL program");
892
1663
  }
893
- const { palettePixelData } = state;
894
- for (let i = 0;i < colors.length; i++) {
895
- const color = parseColorRgba(state.colorCtx, colors[i]);
896
- palettePixelData[i * 4] = color[0];
897
- palettePixelData[i * 4 + 1] = color[1];
898
- palettePixelData[i * 4 + 2] = color[2];
899
- palettePixelData[i * 4 + 3] = color[3];
1664
+ gl.attachShader(program, vs);
1665
+ gl.attachShader(program, fs);
1666
+ gl.linkProgram(program);
1667
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
1668
+ const log = gl.getProgramInfoLog(program);
1669
+ gl.deleteProgram(program);
1670
+ throw new Error(`Gridlines program link failed: ${log ?? "(no log)"}`);
900
1671
  }
901
- return true;
1672
+ return program;
902
1673
  };
903
- var rings = createEffect2({
904
- type: "dev.remotion.effects.rings",
905
- label: "rings()",
906
- documentationLink: "https://www.remotion.dev/docs/effects/rings",
1674
+ var rgbaToUniform = (rgba) => {
1675
+ const [r, g, b, a] = rgba;
1676
+ const alpha = a / 255;
1677
+ return [r / 255 * alpha, g / 255 * alpha, b / 255 * alpha, alpha];
1678
+ };
1679
+ var gridlines = createEffect4({
1680
+ type: "remotion/gridlines",
1681
+ label: "gridlines()",
1682
+ documentationLink: "https://www.remotion.dev/docs/effects/gridlines",
907
1683
  backend: "webgl2",
908
1684
  calculateKey: (params) => {
909
- const r = resolve2(params);
1685
+ const r = resolve4(params);
910
1686
  const maskSuffix = r.maskToSourceAlpha ? "-mask-to-source-alpha" : "";
911
- return `rings-${r.colors.join("|")}-${r.center.join(":")}-${r.thickness}-${r.spacing}-${r.offset}${maskSuffix}`;
1687
+ return `gridlines-${r.gridSize}-${r.lineWidth}-${r.lineColor}-${r.backgroundColor}-${r.rotation}-${r.rotationX}-${r.rotationY}-${r.perspective}-${r.offsetX}-${r.offsetY}${maskSuffix}`;
1688
+ },
1689
+ setup: (target) => {
1690
+ const gl = target.getContext("webgl2", {
1691
+ premultipliedAlpha: true,
1692
+ alpha: true,
1693
+ preserveDrawingBuffer: true
1694
+ });
1695
+ if (!gl) {
1696
+ throw createWebGL2ContextError4("gridlines effect");
1697
+ }
1698
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
1699
+ const vs = compileShader4(gl, gl.VERTEX_SHADER, GRIDLINES_VS);
1700
+ const fs = compileShader4(gl, gl.FRAGMENT_SHADER, GRIDLINES_FS);
1701
+ const program = linkProgram4(gl, vs, fs);
1702
+ gl.deleteShader(vs);
1703
+ gl.deleteShader(fs);
1704
+ const vao = gl.createVertexArray();
1705
+ if (!vao) {
1706
+ throw new Error("Failed to create WebGL vertex array");
1707
+ }
1708
+ gl.bindVertexArray(vao);
1709
+ const data = new Float32Array([
1710
+ -1,
1711
+ -1,
1712
+ 0,
1713
+ 0,
1714
+ 1,
1715
+ -1,
1716
+ 1,
1717
+ 0,
1718
+ -1,
1719
+ 1,
1720
+ 0,
1721
+ 1,
1722
+ 1,
1723
+ 1,
1724
+ 1,
1725
+ 1
1726
+ ]);
1727
+ const vbo = gl.createBuffer();
1728
+ if (!vbo) {
1729
+ throw new Error("Failed to create WebGL buffer");
1730
+ }
1731
+ gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
1732
+ gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
1733
+ const aPos = gl.getAttribLocation(program, "aPos");
1734
+ const aUv = gl.getAttribLocation(program, "aUv");
1735
+ gl.enableVertexAttribArray(aPos);
1736
+ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 16, 0);
1737
+ gl.enableVertexAttribArray(aUv);
1738
+ gl.vertexAttribPointer(aUv, 2, gl.FLOAT, false, 16, 8);
1739
+ gl.bindVertexArray(null);
1740
+ const texture = gl.createTexture();
1741
+ if (!texture) {
1742
+ throw new Error("Failed to create WebGL texture");
1743
+ }
1744
+ gl.bindTexture(gl.TEXTURE_2D, texture);
1745
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
1746
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
1747
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
1748
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
1749
+ gl.bindTexture(gl.TEXTURE_2D, null);
1750
+ const colorCanvas = document.createElement("canvas");
1751
+ colorCanvas.width = 1;
1752
+ colorCanvas.height = 1;
1753
+ const colorCtx = colorCanvas.getContext("2d", { willReadFrequently: true });
1754
+ if (!colorCtx) {
1755
+ throw new Error("Failed to acquire 2D context for color parsing");
1756
+ }
1757
+ return {
1758
+ gl,
1759
+ program,
1760
+ vao,
1761
+ vbo,
1762
+ texture,
1763
+ uniforms: {
1764
+ uSource: gl.getUniformLocation(program, "uSource"),
1765
+ uResolution: gl.getUniformLocation(program, "uResolution"),
1766
+ uGridSize: gl.getUniformLocation(program, "uGridSize"),
1767
+ uLineWidth: gl.getUniformLocation(program, "uLineWidth"),
1768
+ uLineColor: gl.getUniformLocation(program, "uLineColor"),
1769
+ uBackgroundColor: gl.getUniformLocation(program, "uBackgroundColor"),
1770
+ uRotation: gl.getUniformLocation(program, "uRotation"),
1771
+ uRotationX: gl.getUniformLocation(program, "uRotationX"),
1772
+ uRotationY: gl.getUniformLocation(program, "uRotationY"),
1773
+ uPerspective: gl.getUniformLocation(program, "uPerspective"),
1774
+ uOffset: gl.getUniformLocation(program, "uOffset"),
1775
+ uMaskToSourceAlpha: gl.getUniformLocation(program, "uMaskToSourceAlpha")
1776
+ },
1777
+ colorCtx,
1778
+ cachedLineColorStr: "",
1779
+ cachedLineColorRgba: [255, 255, 255, 255],
1780
+ cachedBackgroundColorStr: "",
1781
+ cachedBackgroundColorRgba: [0, 0, 0, 0]
1782
+ };
912
1783
  },
913
- setup: (target) => setupRings(target),
914
1784
  apply: ({ source, width, height, params, state, flipSourceY }) => {
915
- const r = resolve2(params);
916
- const paletteDirty = updatePalette(state, r.colors);
917
- const { gl, program, sourceTexture, paletteTexture, uniforms, vao } = state;
1785
+ const r = resolve4(params);
1786
+ const { gl, program, vao, texture, uniforms } = state;
1787
+ if (state.cachedLineColorStr !== r.lineColor) {
1788
+ state.cachedLineColorStr = r.lineColor;
1789
+ state.cachedLineColorRgba = parseColorRgba(state.colorCtx, r.lineColor);
1790
+ }
1791
+ if (state.cachedBackgroundColorStr !== r.backgroundColor) {
1792
+ state.cachedBackgroundColorStr = r.backgroundColor;
1793
+ state.cachedBackgroundColorRgba = parseColorRgba(state.colorCtx, r.backgroundColor);
1794
+ }
1795
+ const [lineR, lineG, lineB, lineA] = rgbaToUniform(state.cachedLineColorRgba);
1796
+ const [bgR, bgG, bgB, bgA] = rgbaToUniform(state.cachedBackgroundColorRgba);
918
1797
  gl.viewport(0, 0, width, height);
919
1798
  gl.bindFramebuffer(gl.FRAMEBUFFER, null);
920
1799
  gl.clearColor(0, 0, 0, 0);
921
1800
  gl.clear(gl.COLOR_BUFFER_BIT);
1801
+ gl.useProgram(program);
1802
+ gl.bindVertexArray(vao);
922
1803
  gl.activeTexture(gl.TEXTURE0);
923
- gl.bindTexture(gl.TEXTURE_2D, sourceTexture);
924
- gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
1804
+ gl.bindTexture(gl.TEXTURE_2D, texture);
925
1805
  gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
926
1806
  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
927
- gl.activeTexture(gl.TEXTURE1);
928
- gl.bindTexture(gl.TEXTURE_2D, paletteTexture);
929
- if (paletteDirty) {
930
- gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
931
- gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
932
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, r.colors.length, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, state.palettePixelData);
933
- gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
934
- }
935
- gl.useProgram(program);
936
1807
  if (uniforms.uSource)
937
1808
  gl.uniform1i(uniforms.uSource, 0);
938
- if (uniforms.uPalette)
939
- gl.uniform1i(uniforms.uPalette, 1);
940
1809
  if (uniforms.uResolution)
941
1810
  gl.uniform2f(uniforms.uResolution, width, height);
942
- if (uniforms.uNumColors)
943
- gl.uniform1f(uniforms.uNumColors, r.colors.length);
944
- if (uniforms.uCenter) {
945
- const shaderCenter = publicUvToShaderUv(r.center);
946
- gl.uniform2f(uniforms.uCenter, shaderCenter[0], shaderCenter[1]);
947
- }
948
- if (uniforms.uThickness)
949
- gl.uniform1f(uniforms.uThickness, r.thickness);
950
- if (uniforms.uSpacing)
951
- gl.uniform1f(uniforms.uSpacing, r.spacing);
1811
+ if (uniforms.uGridSize)
1812
+ gl.uniform1f(uniforms.uGridSize, r.gridSize);
1813
+ if (uniforms.uLineWidth)
1814
+ gl.uniform1f(uniforms.uLineWidth, r.lineWidth);
1815
+ if (uniforms.uLineColor)
1816
+ gl.uniform4f(uniforms.uLineColor, lineR, lineG, lineB, lineA);
1817
+ if (uniforms.uBackgroundColor)
1818
+ gl.uniform4f(uniforms.uBackgroundColor, bgR, bgG, bgB, bgA);
1819
+ if (uniforms.uRotation)
1820
+ gl.uniform1f(uniforms.uRotation, r.rotation * Math.PI / 180);
1821
+ if (uniforms.uRotationX)
1822
+ gl.uniform1f(uniforms.uRotationX, r.rotationX * Math.PI / 180);
1823
+ if (uniforms.uRotationY)
1824
+ gl.uniform1f(uniforms.uRotationY, r.rotationY * Math.PI / 180);
1825
+ if (uniforms.uPerspective)
1826
+ gl.uniform1f(uniforms.uPerspective, r.perspective);
952
1827
  if (uniforms.uOffset)
953
- gl.uniform1f(uniforms.uOffset, r.offset);
1828
+ gl.uniform2f(uniforms.uOffset, r.offsetX, r.offsetY);
954
1829
  if (uniforms.uMaskToSourceAlpha)
955
1830
  gl.uniform1i(uniforms.uMaskToSourceAlpha, r.maskToSourceAlpha ? 1 : 0);
956
- gl.bindVertexArray(vao);
957
1831
  gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
958
1832
  gl.bindVertexArray(null);
959
1833
  gl.bindTexture(gl.TEXTURE_2D, null);
960
1834
  gl.useProgram(null);
961
1835
  },
962
- cleanup: ({ gl, program, vao, vbo, sourceTexture, paletteTexture }) => {
963
- gl.deleteTexture(sourceTexture);
964
- gl.deleteTexture(paletteTexture);
1836
+ cleanup: ({ gl, program, vao, vbo, texture }) => {
965
1837
  gl.deleteBuffer(vbo);
966
1838
  gl.deleteProgram(program);
967
1839
  gl.deleteVertexArray(vao);
1840
+ gl.deleteTexture(texture);
968
1841
  },
969
- schema: ringsSchema,
970
- validateParams: validateRingsParams
1842
+ schema: gridlinesSchema,
1843
+ validateParams: validateGridlinesParams
971
1844
  });
972
1845
 
973
1846
  // src/zigzag.ts
974
- import { Internals as Internals3 } from "remotion";
975
- var { createEffect: createEffect3, createWebGL2ContextError: createWebGL2ContextError3 } = Internals3;
1847
+ import { Internals as Internals5 } from "remotion";
1848
+ var { createEffect: createEffect5, createWebGL2ContextError: createWebGL2ContextError5 } = Internals5;
976
1849
  var ZIGZAG_DIRECTIONS = ["horizontal", "vertical"];
977
- var DEFAULT_COLORS2 = ["#dff4ff", "#7cc6ff"];
1850
+ var DEFAULT_COLORS3 = ["#dff4ff", "#7cc6ff"];
978
1851
  var DEFAULT_DIRECTION = "horizontal";
979
1852
  var DEFAULT_THICKNESS2 = 40;
980
- var DEFAULT_GAP3 = 0;
981
- var DEFAULT_ANGLE = 0;
1853
+ var DEFAULT_GAP4 = 0;
1854
+ var DEFAULT_ANGLE2 = 0;
982
1855
  var DEFAULT_OFFSET3 = 0;
983
1856
  var DEFAULT_AMPLITUDE = 40;
984
1857
  var DEFAULT_WAVELENGTH = 160;
985
- var DEFAULT_MASK_TO_SOURCE_ALPHA2 = false;
1858
+ var DEFAULT_MASK_TO_SOURCE_ALPHA4 = false;
986
1859
  var zigzagSchema = {
987
1860
  colors: {
988
1861
  type: "array",
989
1862
  item: {
990
1863
  type: "color"
991
1864
  },
992
- default: DEFAULT_COLORS2,
1865
+ default: DEFAULT_COLORS3,
993
1866
  minLength: 2,
994
1867
  newItemDefault: "#ff0000",
995
1868
  description: "Colors",
@@ -1018,14 +1891,14 @@ var zigzagSchema = {
1018
1891
  min: 0,
1019
1892
  max: 400,
1020
1893
  step: 0.1,
1021
- default: DEFAULT_GAP3,
1894
+ default: DEFAULT_GAP4,
1022
1895
  description: "Gap",
1023
1896
  hiddenFromList: false
1024
1897
  },
1025
1898
  angle: {
1026
1899
  type: "rotation-degrees",
1027
1900
  step: 1,
1028
- default: DEFAULT_ANGLE,
1901
+ default: DEFAULT_ANGLE2,
1029
1902
  description: "Angle"
1030
1903
  },
1031
1904
  offset: {
@@ -1055,23 +1928,23 @@ var zigzagSchema = {
1055
1928
  },
1056
1929
  maskToSourceAlpha: {
1057
1930
  type: "boolean",
1058
- default: DEFAULT_MASK_TO_SOURCE_ALPHA2,
1931
+ default: DEFAULT_MASK_TO_SOURCE_ALPHA4,
1059
1932
  description: "Mask to source alpha"
1060
1933
  }
1061
1934
  };
1062
- var resolve3 = (p) => {
1935
+ var resolve5 = (p) => {
1063
1936
  const thickness = p.thickness ?? DEFAULT_THICKNESS2;
1064
- const gap = p.gap ?? DEFAULT_GAP3;
1937
+ const gap = p.gap ?? DEFAULT_GAP4;
1065
1938
  return {
1066
- colors: p.colors ?? DEFAULT_COLORS2,
1939
+ colors: p.colors ?? DEFAULT_COLORS3,
1067
1940
  direction: p.direction ?? DEFAULT_DIRECTION,
1068
1941
  thickness,
1069
1942
  spacing: thickness + gap,
1070
- angle: p.angle ?? DEFAULT_ANGLE,
1943
+ angle: p.angle ?? DEFAULT_ANGLE2,
1071
1944
  offset: p.offset ?? DEFAULT_OFFSET3,
1072
1945
  amplitude: p.amplitude ?? DEFAULT_AMPLITUDE,
1073
1946
  wavelength: p.wavelength ?? DEFAULT_WAVELENGTH,
1074
- maskToSourceAlpha: p.maskToSourceAlpha ?? DEFAULT_MASK_TO_SOURCE_ALPHA2
1947
+ maskToSourceAlpha: p.maskToSourceAlpha ?? DEFAULT_MASK_TO_SOURCE_ALPHA4
1075
1948
  };
1076
1949
  };
1077
1950
  var formatEnum = (variants) => {
@@ -1080,17 +1953,17 @@ var formatEnum = (variants) => {
1080
1953
  }
1081
1954
  return `${variants.slice(0, -1).map((variant) => `"${variant}"`).join(", ")} or "${variants[variants.length - 1]}"`;
1082
1955
  };
1083
- var validatePositive3 = (value, name) => {
1956
+ var validatePositive5 = (value, name) => {
1084
1957
  if (value <= 0) {
1085
1958
  throw new TypeError(`"${name}" must be greater than 0, but got ${JSON.stringify(value)}`);
1086
1959
  }
1087
1960
  };
1088
- var validateNonNegative3 = (value, name) => {
1961
+ var validateNonNegative5 = (value, name) => {
1089
1962
  if (value < 0) {
1090
1963
  throw new TypeError(`"${name}" must be greater than or equal to 0, but got ${JSON.stringify(value)}`);
1091
1964
  }
1092
1965
  };
1093
- var validateColors2 = (colors) => {
1966
+ var validateColors3 = (colors) => {
1094
1967
  if (colors === undefined) {
1095
1968
  return;
1096
1969
  }
@@ -1111,7 +1984,7 @@ var validateDirection = (direction) => {
1111
1984
  };
1112
1985
  var validateZigzagParams = (params) => {
1113
1986
  assertEffectParamsObject(params, "Zigzag");
1114
- validateColors2(params.colors);
1987
+ validateColors3(params.colors);
1115
1988
  validateDirection(params.direction);
1116
1989
  assertOptionalFiniteNumber(params.thickness, "thickness");
1117
1990
  assertOptionalFiniteNumber(params.gap, "gap");
@@ -1121,13 +1994,13 @@ var validateZigzagParams = (params) => {
1121
1994
  assertOptionalFiniteNumber(params.wavelength, "wavelength");
1122
1995
  assertOptionalBoolean(params.maskToSourceAlpha, "maskToSourceAlpha");
1123
1996
  const thickness = params.thickness ?? DEFAULT_THICKNESS2;
1124
- const gap = params.gap ?? DEFAULT_GAP3;
1997
+ const gap = params.gap ?? DEFAULT_GAP4;
1125
1998
  const amplitude = params.amplitude ?? DEFAULT_AMPLITUDE;
1126
1999
  const wavelength = params.wavelength ?? DEFAULT_WAVELENGTH;
1127
- validatePositive3(thickness, "thickness");
1128
- validateNonNegative3(gap, "gap");
1129
- validateNonNegative3(amplitude, "amplitude");
1130
- validatePositive3(wavelength, "wavelength");
2000
+ validatePositive5(thickness, "thickness");
2001
+ validateNonNegative5(gap, "gap");
2002
+ validateNonNegative5(amplitude, "amplitude");
2003
+ validatePositive5(wavelength, "wavelength");
1131
2004
  };
1132
2005
  var ZIGZAG_VS = `#version 300 es
1133
2006
  in vec2 aPos;
@@ -1205,7 +2078,7 @@ void main() {
1205
2078
  );
1206
2079
  }
1207
2080
  `;
1208
- var compileShader3 = (gl, type, source) => {
2081
+ var compileShader5 = (gl, type, source) => {
1209
2082
  const shader = gl.createShader(type);
1210
2083
  if (!shader) {
1211
2084
  throw new Error("Failed to create WebGL shader");
@@ -1219,7 +2092,7 @@ var compileShader3 = (gl, type, source) => {
1219
2092
  }
1220
2093
  return shader;
1221
2094
  };
1222
- var linkProgram3 = (gl, vs, fs) => {
2095
+ var linkProgram5 = (gl, vs, fs) => {
1223
2096
  const program = gl.createProgram();
1224
2097
  if (!program) {
1225
2098
  throw new Error("Failed to create WebGL program");
@@ -1234,15 +2107,15 @@ var linkProgram3 = (gl, vs, fs) => {
1234
2107
  }
1235
2108
  return program;
1236
2109
  };
1237
- var createProgram2 = (gl, vertexSource, fragmentSource) => {
1238
- const vs = compileShader3(gl, gl.VERTEX_SHADER, vertexSource);
1239
- const fs = compileShader3(gl, gl.FRAGMENT_SHADER, fragmentSource);
1240
- const program = linkProgram3(gl, vs, fs);
2110
+ var createProgram3 = (gl, vertexSource, fragmentSource) => {
2111
+ const vs = compileShader5(gl, gl.VERTEX_SHADER, vertexSource);
2112
+ const fs = compileShader5(gl, gl.FRAGMENT_SHADER, fragmentSource);
2113
+ const program = linkProgram5(gl, vs, fs);
1241
2114
  gl.deleteShader(vs);
1242
2115
  gl.deleteShader(fs);
1243
2116
  return program;
1244
2117
  };
1245
- var createTexture2 = (gl, filter) => {
2118
+ var createTexture3 = (gl, filter) => {
1246
2119
  const texture = gl.createTexture();
1247
2120
  if (!texture) {
1248
2121
  throw new Error("Failed to create WebGL texture");
@@ -1262,10 +2135,10 @@ var setupZigzag = (target) => {
1262
2135
  preserveDrawingBuffer: true
1263
2136
  });
1264
2137
  if (!gl) {
1265
- throw createWebGL2ContextError3("zigzag effect");
2138
+ throw createWebGL2ContextError5("zigzag effect");
1266
2139
  }
1267
2140
  gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
1268
- const program = createProgram2(gl, ZIGZAG_VS, ZIGZAG_FS);
2141
+ const program = createProgram3(gl, ZIGZAG_VS, ZIGZAG_FS);
1269
2142
  const vao = gl.createVertexArray();
1270
2143
  if (!vao) {
1271
2144
  throw new Error("Failed to create WebGL vertex array");
@@ -1314,8 +2187,8 @@ var setupZigzag = (target) => {
1314
2187
  program,
1315
2188
  vao,
1316
2189
  vbo,
1317
- sourceTexture: createTexture2(gl, gl.LINEAR),
1318
- paletteTexture: createTexture2(gl, gl.NEAREST),
2190
+ sourceTexture: createTexture3(gl, gl.LINEAR),
2191
+ paletteTexture: createTexture3(gl, gl.NEAREST),
1319
2192
  colorCtx,
1320
2193
  uniforms: {
1321
2194
  uSource: gl.getUniformLocation(program, "uSource"),
@@ -1335,7 +2208,7 @@ var setupZigzag = (target) => {
1335
2208
  palettePixelData: new Uint8Array(0)
1336
2209
  };
1337
2210
  };
1338
- var updatePalette2 = (state, colors) => {
2211
+ var updatePalette3 = (state, colors) => {
1339
2212
  const paletteKey = colors.join("|");
1340
2213
  const paletteDirty = state.cachedPaletteKey !== paletteKey;
1341
2214
  if (!paletteDirty) {
@@ -1356,20 +2229,20 @@ var updatePalette2 = (state, colors) => {
1356
2229
  }
1357
2230
  return true;
1358
2231
  };
1359
- var zigzag = createEffect3({
2232
+ var zigzag = createEffect5({
1360
2233
  type: "dev.remotion.effects.zigzag",
1361
2234
  label: "zigzag()",
1362
2235
  documentationLink: "https://www.remotion.dev/docs/effects/zigzag",
1363
2236
  backend: "webgl2",
1364
2237
  calculateKey: (params) => {
1365
- const r = resolve3(params);
2238
+ const r = resolve5(params);
1366
2239
  const maskSuffix = r.maskToSourceAlpha ? "-mask-to-source-alpha" : "";
1367
2240
  return `zigzag-${r.colors.join("|")}-${r.direction}-${r.thickness}-${r.spacing}-${r.angle}-${r.offset}-${r.amplitude}-${r.wavelength}${maskSuffix}`;
1368
2241
  },
1369
2242
  setup: (target) => setupZigzag(target),
1370
2243
  apply: ({ source, width, height, params, state, flipSourceY }) => {
1371
- const r = resolve3(params);
1372
- const paletteDirty = updatePalette2(state, r.colors);
2244
+ const r = resolve5(params);
2245
+ const paletteDirty = updatePalette3(state, r.colors);
1373
2246
  const { gl, program, sourceTexture, paletteTexture, uniforms, vao } = state;
1374
2247
  gl.viewport(0, 0, width, height);
1375
2248
  gl.bindFramebuffer(gl.FRAMEBUFFER, null);
@@ -1439,5 +2312,7 @@ var zigzag = createEffect3({
1439
2312
  export {
1440
2313
  zigzag,
1441
2314
  rings,
1442
- pattern
2315
+ pattern,
2316
+ gridlines,
2317
+ checkerboard
1443
2318
  };