@remotion/effects 4.0.476 → 4.0.478

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/rings.ts
1
+ // src/pattern.ts
2
2
  import { Internals } from "remotion";
3
3
 
4
4
  // src/validate-effect-param.ts
@@ -106,13 +106,479 @@ var parseColorRgba = (ctx, color) => {
106
106
  return [data[0], data[1], data[2], data[3]];
107
107
  };
108
108
 
109
- // src/rings.ts
109
+ // src/pattern.ts
110
110
  var { createEffect, createWebGL2ContextError } = Internals;
111
+ var DEFAULT_SCALE = 0.1;
112
+ var DEFAULT_CROP = 0;
113
+ var DEFAULT_GAP = 0;
114
+ var DEFAULT_OFFSET = 0;
115
+ var DEFAULT_OFFSET_EVERY = 0;
116
+ var DEFAULT_ORIGIN = [0, 0];
117
+ var DEFAULT_WRAP = true;
118
+ var patternSchema = {
119
+ scale: {
120
+ type: "number",
121
+ min: 0.001,
122
+ max: 2,
123
+ step: 0.01,
124
+ default: DEFAULT_SCALE,
125
+ description: "Scale",
126
+ hiddenFromList: false
127
+ },
128
+ cropLeft: {
129
+ type: "number",
130
+ step: 1,
131
+ default: DEFAULT_CROP,
132
+ description: "Crop left",
133
+ hiddenFromList: false
134
+ },
135
+ cropTop: {
136
+ type: "number",
137
+ step: 1,
138
+ default: DEFAULT_CROP,
139
+ description: "Crop top",
140
+ hiddenFromList: false
141
+ },
142
+ cropRight: {
143
+ type: "number",
144
+ step: 1,
145
+ default: DEFAULT_CROP,
146
+ description: "Crop right",
147
+ hiddenFromList: false
148
+ },
149
+ cropBottom: {
150
+ type: "number",
151
+ step: 1,
152
+ default: DEFAULT_CROP,
153
+ description: "Crop bottom",
154
+ hiddenFromList: false
155
+ },
156
+ gapX: {
157
+ type: "number",
158
+ step: 1,
159
+ default: DEFAULT_GAP,
160
+ description: "Gap X",
161
+ hiddenFromList: false
162
+ },
163
+ gapY: {
164
+ type: "number",
165
+ step: 1,
166
+ default: DEFAULT_GAP,
167
+ description: "Gap Y",
168
+ hiddenFromList: false
169
+ },
170
+ offsetU: {
171
+ type: "number",
172
+ step: 0.01,
173
+ default: DEFAULT_OFFSET,
174
+ description: "Offset U",
175
+ hiddenFromList: false
176
+ },
177
+ offsetV: {
178
+ type: "number",
179
+ step: 0.01,
180
+ default: DEFAULT_OFFSET,
181
+ description: "Offset V",
182
+ hiddenFromList: false
183
+ },
184
+ rowOffset: {
185
+ type: "number",
186
+ step: 1,
187
+ default: DEFAULT_OFFSET,
188
+ description: "Row offset",
189
+ hiddenFromList: false
190
+ },
191
+ rowOffsetEvery: {
192
+ type: "number",
193
+ min: 0,
194
+ step: 1,
195
+ default: DEFAULT_OFFSET_EVERY,
196
+ description: "Row offset every",
197
+ hiddenFromList: false
198
+ },
199
+ columnOffset: {
200
+ type: "number",
201
+ step: 1,
202
+ default: DEFAULT_OFFSET,
203
+ description: "Column offset",
204
+ hiddenFromList: false
205
+ },
206
+ columnOffsetEvery: {
207
+ type: "number",
208
+ min: 0,
209
+ step: 1,
210
+ default: DEFAULT_OFFSET_EVERY,
211
+ description: "Column offset every",
212
+ hiddenFromList: false
213
+ },
214
+ origin: {
215
+ type: "uv-coordinate",
216
+ min: 0,
217
+ max: 1,
218
+ step: 0.01,
219
+ default: DEFAULT_ORIGIN,
220
+ description: "Origin"
221
+ },
222
+ wrap: {
223
+ type: "boolean",
224
+ default: DEFAULT_WRAP,
225
+ description: "Wrap"
226
+ }
227
+ };
228
+ var resolve = (p) => ({
229
+ scale: p.scale ?? DEFAULT_SCALE,
230
+ cropLeft: p.cropLeft ?? DEFAULT_CROP,
231
+ cropTop: p.cropTop ?? DEFAULT_CROP,
232
+ cropRight: p.cropRight ?? DEFAULT_CROP,
233
+ cropBottom: p.cropBottom ?? DEFAULT_CROP,
234
+ gapX: p.gapX ?? DEFAULT_GAP,
235
+ gapY: p.gapY ?? DEFAULT_GAP,
236
+ offsetU: p.offsetU ?? DEFAULT_OFFSET,
237
+ offsetV: p.offsetV ?? DEFAULT_OFFSET,
238
+ rowOffset: p.rowOffset ?? DEFAULT_OFFSET,
239
+ rowOffsetEvery: p.rowOffsetEvery ?? DEFAULT_OFFSET_EVERY,
240
+ columnOffset: p.columnOffset ?? DEFAULT_OFFSET,
241
+ columnOffsetEvery: p.columnOffsetEvery ?? DEFAULT_OFFSET_EVERY,
242
+ origin: [...p.origin ?? DEFAULT_ORIGIN],
243
+ wrap: p.wrap ?? DEFAULT_WRAP
244
+ });
245
+ var assertOptionalUvCoordinate = (value, name) => {
246
+ if (value === undefined) {
247
+ return;
248
+ }
249
+ if (!Array.isArray(value) || value.length !== 2 || value.some((item) => typeof item !== "number" || !Number.isFinite(item))) {
250
+ throw new TypeError(`"${name}" must be a [number, number] tuple`);
251
+ }
252
+ };
253
+ var assertOptionalInteger = (value, name) => {
254
+ if (value === undefined) {
255
+ return;
256
+ }
257
+ if (!Number.isInteger(value)) {
258
+ throw new TypeError(`"${name}" must be an integer, but got ${JSON.stringify(value)}`);
259
+ }
260
+ };
261
+ var validatePositive = (value, name) => {
262
+ if (value <= 0) {
263
+ throw new TypeError(`"${name}" must be > 0`);
264
+ }
265
+ };
266
+ var validateAtLeast = (value, min, name) => {
267
+ if (value < min) {
268
+ throw new TypeError(`"${name}" must be >= ${min}, but got ${JSON.stringify(value)}`);
269
+ }
270
+ };
271
+ var validatePatternParams = (params) => {
272
+ assertEffectParamsObject(params, "Pattern");
273
+ assertOptionalFiniteNumber(params.scale, "scale");
274
+ assertOptionalFiniteNumber(params.cropLeft, "cropLeft");
275
+ assertOptionalFiniteNumber(params.cropTop, "cropTop");
276
+ assertOptionalFiniteNumber(params.cropRight, "cropRight");
277
+ assertOptionalFiniteNumber(params.cropBottom, "cropBottom");
278
+ assertOptionalFiniteNumber(params.gapX, "gapX");
279
+ assertOptionalFiniteNumber(params.gapY, "gapY");
280
+ assertOptionalFiniteNumber(params.offsetU, "offsetU");
281
+ assertOptionalFiniteNumber(params.offsetV, "offsetV");
282
+ assertOptionalFiniteNumber(params.rowOffset, "rowOffset");
283
+ assertOptionalFiniteNumber(params.rowOffsetEvery, "rowOffsetEvery");
284
+ assertOptionalFiniteNumber(params.columnOffset, "columnOffset");
285
+ assertOptionalFiniteNumber(params.columnOffsetEvery, "columnOffsetEvery");
286
+ assertOptionalUvCoordinate(params.origin, "origin");
287
+ assertOptionalBoolean(params.wrap, "wrap");
288
+ assertOptionalInteger(params.rowOffsetEvery, "rowOffsetEvery");
289
+ assertOptionalInteger(params.columnOffsetEvery, "columnOffsetEvery");
290
+ const r = resolve(params);
291
+ validatePositive(r.scale, "scale");
292
+ validateAtLeast(r.rowOffsetEvery, 0, "rowOffsetEvery");
293
+ validateAtLeast(r.columnOffsetEvery, 0, "columnOffsetEvery");
294
+ validateUnitInterval(r.origin[0], "origin[0]");
295
+ validateUnitInterval(r.origin[1], "origin[1]");
296
+ };
297
+ var PATTERN_VS = `#version 300 es
298
+ in vec2 aPos;
299
+ in vec2 aUv;
300
+ out vec2 vUv;
301
+
302
+ void main() {
303
+ vUv = aUv;
304
+ gl_Position = vec4(aPos, 0.0, 1.0);
305
+ }
306
+ `;
307
+ var PATTERN_FS = `#version 300 es
308
+ precision highp float;
309
+
310
+ in vec2 vUv;
311
+ out vec4 fragColor;
312
+
313
+ uniform sampler2D uSource;
314
+ uniform vec2 uResolution;
315
+ uniform float uScale;
316
+ uniform vec4 uCrop;
317
+ uniform vec2 uGap;
318
+ uniform vec2 uOffset;
319
+ uniform vec2 uRowOffset;
320
+ uniform vec2 uColumnOffset;
321
+ uniform vec2 uOrigin;
322
+ uniform bool uWrap;
323
+
324
+ float positiveModulo(float value, float modulo) {
325
+ return mod(mod(value, modulo) + modulo, modulo);
326
+ }
327
+
328
+ float getPhase(float index, float every) {
329
+ if (every == 0.0) {
330
+ return index;
331
+ }
332
+
333
+ return positiveModulo(index, every);
334
+ }
335
+
336
+ bool sampleCell(vec2 cell, vec2 fragPx, vec2 cropStart, vec2 tileSize, vec2 pitch, vec2 originPx, out vec4 color) {
337
+ if (!uWrap && (cell.x < 0.0 || cell.y < 0.0)) {
338
+ return false;
339
+ }
340
+
341
+ float rowPhase = getPhase(cell.y, uRowOffset.y);
342
+ float columnPhase = getPhase(cell.x, uColumnOffset.y);
343
+ vec2 stagger = vec2(rowPhase * uRowOffset.x, columnPhase * uColumnOffset.x);
344
+ vec2 localPx = fragPx - originPx - stagger - cell * pitch;
345
+
346
+ if (localPx.x < 0.0 || localPx.y < 0.0 || localPx.x >= tileSize.x || localPx.y >= tileSize.y) {
347
+ return false;
348
+ }
349
+
350
+ vec2 sourcePx = cropStart + localPx / uScale;
351
+ vec2 sourceUv = vec2(sourcePx.x / uResolution.x, 1.0 - sourcePx.y / uResolution.y);
352
+
353
+ if (sourceUv.x < 0.0 || sourceUv.y < 0.0 || sourceUv.x > 1.0 || sourceUv.y > 1.0) {
354
+ return false;
355
+ }
356
+
357
+ color = texture(uSource, sourceUv);
358
+ return true;
359
+ }
360
+
361
+ void main() {
362
+ vec2 cropStart = uCrop.xy;
363
+ vec2 cropEnd = uResolution - uCrop.zw;
364
+ vec2 cropSize = max(cropEnd - cropStart, vec2(0.001));
365
+ vec2 tileSize = max(cropSize * uScale, vec2(0.001));
366
+ vec2 pitch = max(tileSize + uGap, vec2(0.001));
367
+ vec2 patternUv = vec2(vUv.x, 1.0 - vUv.y);
368
+ vec2 originPx = (uOrigin + uOffset) * uResolution;
369
+ vec2 fragPx = patternUv * uResolution;
370
+
371
+ vec2 gridPx = fragPx - originPx;
372
+ vec2 cell = floor(gridPx / pitch);
373
+
374
+ for (int i = 0; i < 4; i++) {
375
+ float rowPhase = getPhase(cell.y, uRowOffset.y);
376
+ float columnPhase = getPhase(cell.x, uColumnOffset.y);
377
+ vec2 stagger = vec2(rowPhase * uRowOffset.x, columnPhase * uColumnOffset.x);
378
+ vec2 adjustedGridPx = fragPx - originPx - stagger;
379
+ vec2 nextCell = floor(adjustedGridPx / pitch);
380
+
381
+ if (all(equal(nextCell, cell))) {
382
+ break;
383
+ }
384
+
385
+ cell = nextCell;
386
+ }
387
+
388
+ vec4 color = vec4(0.0);
389
+ for (int y = -4; y <= 4; y++) {
390
+ for (int x = -4; x <= 4; x++) {
391
+ if (sampleCell(cell + vec2(float(x), float(y)), fragPx, cropStart, tileSize, pitch, originPx, color)) {
392
+ fragColor = color;
393
+ return;
394
+ }
395
+ }
396
+ }
397
+
398
+ fragColor = vec4(0.0);
399
+ }
400
+ `;
401
+ var compileShader = (gl, type, source) => {
402
+ const shader = gl.createShader(type);
403
+ if (!shader) {
404
+ throw new Error("Failed to create WebGL shader");
405
+ }
406
+ gl.shaderSource(shader, source);
407
+ gl.compileShader(shader);
408
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
409
+ const log = gl.getShaderInfoLog(shader);
410
+ gl.deleteShader(shader);
411
+ throw new Error(`Pattern shader compile failed: ${log ?? "(no log)"}`);
412
+ }
413
+ return shader;
414
+ };
415
+ var linkProgram = (gl, vs, fs) => {
416
+ const program = gl.createProgram();
417
+ if (!program) {
418
+ throw new Error("Failed to create WebGL program");
419
+ }
420
+ gl.attachShader(program, vs);
421
+ gl.attachShader(program, fs);
422
+ gl.linkProgram(program);
423
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
424
+ const log = gl.getProgramInfoLog(program);
425
+ gl.deleteProgram(program);
426
+ throw new Error(`Pattern program link failed: ${log ?? "(no log)"}`);
427
+ }
428
+ return program;
429
+ };
430
+ var pattern = createEffect({
431
+ type: "remotion/pattern",
432
+ label: "pattern()",
433
+ documentationLink: "https://www.remotion.dev/docs/effects/pattern",
434
+ backend: "webgl2",
435
+ calculateKey: (params) => {
436
+ const r = resolve(params);
437
+ 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
+ },
439
+ setup: (target) => {
440
+ const gl = target.getContext("webgl2", {
441
+ premultipliedAlpha: true,
442
+ alpha: true,
443
+ preserveDrawingBuffer: true
444
+ });
445
+ if (!gl) {
446
+ throw createWebGL2ContextError("pattern effect");
447
+ }
448
+ 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);
452
+ gl.deleteShader(vs);
453
+ gl.deleteShader(fs);
454
+ const vao = gl.createVertexArray();
455
+ if (!vao) {
456
+ throw new Error("Failed to create WebGL vertex array");
457
+ }
458
+ gl.bindVertexArray(vao);
459
+ const data = new Float32Array([
460
+ -1,
461
+ -1,
462
+ 0,
463
+ 0,
464
+ 1,
465
+ -1,
466
+ 1,
467
+ 0,
468
+ -1,
469
+ 1,
470
+ 0,
471
+ 1,
472
+ 1,
473
+ 1,
474
+ 1,
475
+ 1
476
+ ]);
477
+ const vbo = gl.createBuffer();
478
+ if (!vbo) {
479
+ throw new Error("Failed to create WebGL buffer");
480
+ }
481
+ gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
482
+ gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
483
+ const aPos = gl.getAttribLocation(program, "aPos");
484
+ const aUv = gl.getAttribLocation(program, "aUv");
485
+ gl.enableVertexAttribArray(aPos);
486
+ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 16, 0);
487
+ gl.enableVertexAttribArray(aUv);
488
+ gl.vertexAttribPointer(aUv, 2, gl.FLOAT, false, 16, 8);
489
+ gl.bindVertexArray(null);
490
+ const texture = gl.createTexture();
491
+ if (!texture) {
492
+ throw new Error("Failed to create WebGL texture");
493
+ }
494
+ gl.bindTexture(gl.TEXTURE_2D, texture);
495
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
496
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
497
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
498
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
499
+ gl.bindTexture(gl.TEXTURE_2D, null);
500
+ return {
501
+ gl,
502
+ program,
503
+ vao,
504
+ vbo,
505
+ texture,
506
+ uniforms: {
507
+ uSource: gl.getUniformLocation(program, "uSource"),
508
+ uResolution: gl.getUniformLocation(program, "uResolution"),
509
+ uScale: gl.getUniformLocation(program, "uScale"),
510
+ uCrop: gl.getUniformLocation(program, "uCrop"),
511
+ uGap: gl.getUniformLocation(program, "uGap"),
512
+ uOffset: gl.getUniformLocation(program, "uOffset"),
513
+ uRowOffset: gl.getUniformLocation(program, "uRowOffset"),
514
+ uColumnOffset: gl.getUniformLocation(program, "uColumnOffset"),
515
+ uOrigin: gl.getUniformLocation(program, "uOrigin"),
516
+ uWrap: gl.getUniformLocation(program, "uWrap")
517
+ }
518
+ };
519
+ },
520
+ apply: ({ source, width, height, params, state, flipSourceY }) => {
521
+ const r = resolve(params);
522
+ const { gl, program, vao, texture, uniforms } = state;
523
+ gl.viewport(0, 0, width, height);
524
+ gl.clearColor(0, 0, 0, 0);
525
+ gl.clear(gl.COLOR_BUFFER_BIT);
526
+ gl.useProgram(program);
527
+ gl.bindVertexArray(vao);
528
+ gl.activeTexture(gl.TEXTURE0);
529
+ gl.bindTexture(gl.TEXTURE_2D, texture);
530
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
531
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
532
+ if (uniforms.uSource)
533
+ gl.uniform1i(uniforms.uSource, 0);
534
+ if (uniforms.uResolution)
535
+ gl.uniform2f(uniforms.uResolution, width, height);
536
+ if (uniforms.uScale)
537
+ gl.uniform1f(uniforms.uScale, r.scale);
538
+ if (uniforms.uCrop)
539
+ gl.uniform4f(uniforms.uCrop, r.cropLeft, r.cropTop, r.cropRight, r.cropBottom);
540
+ if (uniforms.uGap)
541
+ gl.uniform2f(uniforms.uGap, r.gapX, r.gapY);
542
+ if (uniforms.uOffset)
543
+ gl.uniform2f(uniforms.uOffset, r.offsetU, r.offsetV);
544
+ if (uniforms.uRowOffset)
545
+ gl.uniform2f(uniforms.uRowOffset, r.rowOffset, r.rowOffsetEvery);
546
+ if (uniforms.uColumnOffset)
547
+ gl.uniform2f(uniforms.uColumnOffset, r.columnOffset, r.columnOffsetEvery);
548
+ if (uniforms.uOrigin)
549
+ gl.uniform2f(uniforms.uOrigin, r.origin[0], r.origin[1]);
550
+ if (uniforms.uWrap)
551
+ gl.uniform1i(uniforms.uWrap, r.wrap ? 1 : 0);
552
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
553
+ gl.bindVertexArray(null);
554
+ gl.bindTexture(gl.TEXTURE_2D, null);
555
+ gl.useProgram(null);
556
+ },
557
+ cleanup: ({ gl, program, vao, vbo, texture }) => {
558
+ gl.deleteBuffer(vbo);
559
+ gl.deleteProgram(program);
560
+ gl.deleteVertexArray(vao);
561
+ gl.deleteTexture(texture);
562
+ },
563
+ schema: patternSchema,
564
+ validateParams: validatePatternParams
565
+ });
566
+
567
+ // src/rings.ts
568
+ import { Internals as Internals2 } from "remotion";
569
+
570
+ // src/uv-coordinate.ts
571
+ var publicUvToShaderUv = (uv) => {
572
+ return [uv[0], 1 - uv[1]];
573
+ };
574
+
575
+ // src/rings.ts
576
+ var { createEffect: createEffect2, createWebGL2ContextError: createWebGL2ContextError2 } = Internals2;
111
577
  var DEFAULT_COLORS = ["#dff4ff", "#7cc6ff"];
112
578
  var DEFAULT_CENTER = [0.5, 0.5];
113
579
  var DEFAULT_THICKNESS = 40;
114
- var DEFAULT_GAP = 0;
115
- var DEFAULT_OFFSET = 0;
580
+ var DEFAULT_GAP2 = 0;
581
+ var DEFAULT_OFFSET2 = 0;
116
582
  var DEFAULT_MASK_TO_SOURCE_ALPHA = false;
117
583
  var ringsSchema = {
118
584
  colors: {
@@ -148,14 +614,14 @@ var ringsSchema = {
148
614
  min: 0,
149
615
  max: 400,
150
616
  step: 0.1,
151
- default: DEFAULT_GAP,
617
+ default: DEFAULT_GAP2,
152
618
  description: "Gap",
153
619
  hiddenFromList: false
154
620
  },
155
621
  offset: {
156
622
  type: "number",
157
623
  step: 0.1,
158
- default: DEFAULT_OFFSET,
624
+ default: DEFAULT_OFFSET2,
159
625
  description: "Offset",
160
626
  hiddenFromList: false
161
627
  },
@@ -165,19 +631,19 @@ var ringsSchema = {
165
631
  description: "Mask to source alpha"
166
632
  }
167
633
  };
168
- var resolve = (p) => {
634
+ var resolve2 = (p) => {
169
635
  const thickness = p.thickness ?? DEFAULT_THICKNESS;
170
- const gap = p.gap ?? DEFAULT_GAP;
636
+ const gap = p.gap ?? DEFAULT_GAP2;
171
637
  return {
172
638
  colors: p.colors ?? DEFAULT_COLORS,
173
639
  center: [...p.center ?? DEFAULT_CENTER],
174
640
  thickness,
175
641
  spacing: thickness + gap,
176
- offset: p.offset ?? DEFAULT_OFFSET,
642
+ offset: p.offset ?? DEFAULT_OFFSET2,
177
643
  maskToSourceAlpha: p.maskToSourceAlpha ?? DEFAULT_MASK_TO_SOURCE_ALPHA
178
644
  };
179
645
  };
180
- var validatePositive = (value, name) => {
646
+ var validatePositive2 = (value, name) => {
181
647
  if (value <= 0) {
182
648
  throw new TypeError(`"${name}" must be greater than 0, but got ${JSON.stringify(value)}`);
183
649
  }
@@ -217,8 +683,8 @@ var validateRingsParams = (params) => {
217
683
  assertOptionalFiniteNumber(params.offset, "offset");
218
684
  assertOptionalBoolean(params.maskToSourceAlpha, "maskToSourceAlpha");
219
685
  const thickness = params.thickness ?? DEFAULT_THICKNESS;
220
- const gap = params.gap ?? DEFAULT_GAP;
221
- validatePositive(thickness, "thickness");
686
+ const gap = params.gap ?? DEFAULT_GAP2;
687
+ validatePositive2(thickness, "thickness");
222
688
  validateNonNegative2(gap, "gap");
223
689
  };
224
690
  var RINGS_VS = `#version 300 es
@@ -286,7 +752,7 @@ void main() {
286
752
  );
287
753
  }
288
754
  `;
289
- var compileShader = (gl, type, source) => {
755
+ var compileShader2 = (gl, type, source) => {
290
756
  const shader = gl.createShader(type);
291
757
  if (!shader) {
292
758
  throw new Error("Failed to create WebGL shader");
@@ -300,7 +766,7 @@ var compileShader = (gl, type, source) => {
300
766
  }
301
767
  return shader;
302
768
  };
303
- var linkProgram = (gl, vs, fs) => {
769
+ var linkProgram2 = (gl, vs, fs) => {
304
770
  const program = gl.createProgram();
305
771
  if (!program) {
306
772
  throw new Error("Failed to create WebGL program");
@@ -316,9 +782,9 @@ var linkProgram = (gl, vs, fs) => {
316
782
  return program;
317
783
  };
318
784
  var createProgram = (gl, vertexSource, fragmentSource) => {
319
- const vs = compileShader(gl, gl.VERTEX_SHADER, vertexSource);
320
- const fs = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
321
- const program = linkProgram(gl, vs, fs);
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);
322
788
  gl.deleteShader(vs);
323
789
  gl.deleteShader(fs);
324
790
  return program;
@@ -343,7 +809,7 @@ var setupRings = (target) => {
343
809
  preserveDrawingBuffer: true
344
810
  });
345
811
  if (!gl) {
346
- throw createWebGL2ContextError("rings effect");
812
+ throw createWebGL2ContextError2("rings effect");
347
813
  }
348
814
  gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
349
815
  const program = createProgram(gl, RINGS_VS, RINGS_FS);
@@ -434,19 +900,19 @@ var updatePalette = (state, colors) => {
434
900
  }
435
901
  return true;
436
902
  };
437
- var rings = createEffect({
903
+ var rings = createEffect2({
438
904
  type: "remotion/rings",
439
905
  label: "rings()",
440
906
  documentationLink: "https://www.remotion.dev/docs/effects/rings",
441
907
  backend: "webgl2",
442
908
  calculateKey: (params) => {
443
- const r = resolve(params);
909
+ const r = resolve2(params);
444
910
  const maskSuffix = r.maskToSourceAlpha ? "-mask-to-source-alpha" : "";
445
911
  return `rings-${r.colors.join("|")}-${r.center.join(":")}-${r.thickness}-${r.spacing}-${r.offset}${maskSuffix}`;
446
912
  },
447
913
  setup: (target) => setupRings(target),
448
914
  apply: ({ source, width, height, params, state, flipSourceY }) => {
449
- const r = resolve(params);
915
+ const r = resolve2(params);
450
916
  const paletteDirty = updatePalette(state, r.colors);
451
917
  const { gl, program, sourceTexture, paletteTexture, uniforms, vao } = state;
452
918
  gl.viewport(0, 0, width, height);
@@ -475,8 +941,10 @@ var rings = createEffect({
475
941
  gl.uniform2f(uniforms.uResolution, width, height);
476
942
  if (uniforms.uNumColors)
477
943
  gl.uniform1f(uniforms.uNumColors, r.colors.length);
478
- if (uniforms.uCenter)
479
- gl.uniform2f(uniforms.uCenter, r.center[0], r.center[1]);
944
+ if (uniforms.uCenter) {
945
+ const shaderCenter = publicUvToShaderUv(r.center);
946
+ gl.uniform2f(uniforms.uCenter, shaderCenter[0], shaderCenter[1]);
947
+ }
480
948
  if (uniforms.uThickness)
481
949
  gl.uniform1f(uniforms.uThickness, r.thickness);
482
950
  if (uniforms.uSpacing)
@@ -503,15 +971,15 @@ var rings = createEffect({
503
971
  });
504
972
 
505
973
  // src/zigzag.ts
506
- import { Internals as Internals2 } from "remotion";
507
- var { createEffect: createEffect2, createWebGL2ContextError: createWebGL2ContextError2 } = Internals2;
974
+ import { Internals as Internals3 } from "remotion";
975
+ var { createEffect: createEffect3, createWebGL2ContextError: createWebGL2ContextError3 } = Internals3;
508
976
  var ZIGZAG_DIRECTIONS = ["horizontal", "vertical"];
509
977
  var DEFAULT_COLORS2 = ["#dff4ff", "#7cc6ff"];
510
978
  var DEFAULT_DIRECTION = "horizontal";
511
979
  var DEFAULT_THICKNESS2 = 40;
512
- var DEFAULT_GAP2 = 0;
980
+ var DEFAULT_GAP3 = 0;
513
981
  var DEFAULT_ANGLE = 0;
514
- var DEFAULT_OFFSET2 = 0;
982
+ var DEFAULT_OFFSET3 = 0;
515
983
  var DEFAULT_AMPLITUDE = 40;
516
984
  var DEFAULT_WAVELENGTH = 160;
517
985
  var DEFAULT_MASK_TO_SOURCE_ALPHA2 = false;
@@ -550,7 +1018,7 @@ var zigzagSchema = {
550
1018
  min: 0,
551
1019
  max: 400,
552
1020
  step: 0.1,
553
- default: DEFAULT_GAP2,
1021
+ default: DEFAULT_GAP3,
554
1022
  description: "Gap",
555
1023
  hiddenFromList: false
556
1024
  },
@@ -563,7 +1031,7 @@ var zigzagSchema = {
563
1031
  offset: {
564
1032
  type: "number",
565
1033
  step: 0.1,
566
- default: DEFAULT_OFFSET2,
1034
+ default: DEFAULT_OFFSET3,
567
1035
  description: "Offset",
568
1036
  hiddenFromList: false
569
1037
  },
@@ -591,16 +1059,16 @@ var zigzagSchema = {
591
1059
  description: "Mask to source alpha"
592
1060
  }
593
1061
  };
594
- var resolve2 = (p) => {
1062
+ var resolve3 = (p) => {
595
1063
  const thickness = p.thickness ?? DEFAULT_THICKNESS2;
596
- const gap = p.gap ?? DEFAULT_GAP2;
1064
+ const gap = p.gap ?? DEFAULT_GAP3;
597
1065
  return {
598
1066
  colors: p.colors ?? DEFAULT_COLORS2,
599
1067
  direction: p.direction ?? DEFAULT_DIRECTION,
600
1068
  thickness,
601
1069
  spacing: thickness + gap,
602
1070
  angle: p.angle ?? DEFAULT_ANGLE,
603
- offset: p.offset ?? DEFAULT_OFFSET2,
1071
+ offset: p.offset ?? DEFAULT_OFFSET3,
604
1072
  amplitude: p.amplitude ?? DEFAULT_AMPLITUDE,
605
1073
  wavelength: p.wavelength ?? DEFAULT_WAVELENGTH,
606
1074
  maskToSourceAlpha: p.maskToSourceAlpha ?? DEFAULT_MASK_TO_SOURCE_ALPHA2
@@ -612,7 +1080,7 @@ var formatEnum = (variants) => {
612
1080
  }
613
1081
  return `${variants.slice(0, -1).map((variant) => `"${variant}"`).join(", ")} or "${variants[variants.length - 1]}"`;
614
1082
  };
615
- var validatePositive2 = (value, name) => {
1083
+ var validatePositive3 = (value, name) => {
616
1084
  if (value <= 0) {
617
1085
  throw new TypeError(`"${name}" must be greater than 0, but got ${JSON.stringify(value)}`);
618
1086
  }
@@ -653,13 +1121,13 @@ var validateZigzagParams = (params) => {
653
1121
  assertOptionalFiniteNumber(params.wavelength, "wavelength");
654
1122
  assertOptionalBoolean(params.maskToSourceAlpha, "maskToSourceAlpha");
655
1123
  const thickness = params.thickness ?? DEFAULT_THICKNESS2;
656
- const gap = params.gap ?? DEFAULT_GAP2;
1124
+ const gap = params.gap ?? DEFAULT_GAP3;
657
1125
  const amplitude = params.amplitude ?? DEFAULT_AMPLITUDE;
658
1126
  const wavelength = params.wavelength ?? DEFAULT_WAVELENGTH;
659
- validatePositive2(thickness, "thickness");
1127
+ validatePositive3(thickness, "thickness");
660
1128
  validateNonNegative3(gap, "gap");
661
1129
  validateNonNegative3(amplitude, "amplitude");
662
- validatePositive2(wavelength, "wavelength");
1130
+ validatePositive3(wavelength, "wavelength");
663
1131
  };
664
1132
  var ZIGZAG_VS = `#version 300 es
665
1133
  in vec2 aPos;
@@ -737,7 +1205,7 @@ void main() {
737
1205
  );
738
1206
  }
739
1207
  `;
740
- var compileShader2 = (gl, type, source) => {
1208
+ var compileShader3 = (gl, type, source) => {
741
1209
  const shader = gl.createShader(type);
742
1210
  if (!shader) {
743
1211
  throw new Error("Failed to create WebGL shader");
@@ -751,7 +1219,7 @@ var compileShader2 = (gl, type, source) => {
751
1219
  }
752
1220
  return shader;
753
1221
  };
754
- var linkProgram2 = (gl, vs, fs) => {
1222
+ var linkProgram3 = (gl, vs, fs) => {
755
1223
  const program = gl.createProgram();
756
1224
  if (!program) {
757
1225
  throw new Error("Failed to create WebGL program");
@@ -767,9 +1235,9 @@ var linkProgram2 = (gl, vs, fs) => {
767
1235
  return program;
768
1236
  };
769
1237
  var createProgram2 = (gl, vertexSource, fragmentSource) => {
770
- const vs = compileShader2(gl, gl.VERTEX_SHADER, vertexSource);
771
- const fs = compileShader2(gl, gl.FRAGMENT_SHADER, fragmentSource);
772
- const program = linkProgram2(gl, vs, fs);
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);
773
1241
  gl.deleteShader(vs);
774
1242
  gl.deleteShader(fs);
775
1243
  return program;
@@ -794,7 +1262,7 @@ var setupZigzag = (target) => {
794
1262
  preserveDrawingBuffer: true
795
1263
  });
796
1264
  if (!gl) {
797
- throw createWebGL2ContextError2("zigzag effect");
1265
+ throw createWebGL2ContextError3("zigzag effect");
798
1266
  }
799
1267
  gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
800
1268
  const program = createProgram2(gl, ZIGZAG_VS, ZIGZAG_FS);
@@ -888,19 +1356,19 @@ var updatePalette2 = (state, colors) => {
888
1356
  }
889
1357
  return true;
890
1358
  };
891
- var zigzag = createEffect2({
1359
+ var zigzag = createEffect3({
892
1360
  type: "remotion/zigzag",
893
1361
  label: "zigzag()",
894
1362
  documentationLink: "https://www.remotion.dev/docs/effects/zigzag",
895
1363
  backend: "webgl2",
896
1364
  calculateKey: (params) => {
897
- const r = resolve2(params);
1365
+ const r = resolve3(params);
898
1366
  const maskSuffix = r.maskToSourceAlpha ? "-mask-to-source-alpha" : "";
899
1367
  return `zigzag-${r.colors.join("|")}-${r.direction}-${r.thickness}-${r.spacing}-${r.angle}-${r.offset}-${r.amplitude}-${r.wavelength}${maskSuffix}`;
900
1368
  },
901
1369
  setup: (target) => setupZigzag(target),
902
1370
  apply: ({ source, width, height, params, state, flipSourceY }) => {
903
- const r = resolve2(params);
1371
+ const r = resolve3(params);
904
1372
  const paletteDirty = updatePalette2(state, r.colors);
905
1373
  const { gl, program, sourceTexture, paletteTexture, uniforms, vao } = state;
906
1374
  gl.viewport(0, 0, width, height);
@@ -970,5 +1438,6 @@ var zigzag = createEffect2({
970
1438
  });
971
1439
  export {
972
1440
  zigzag,
973
- rings
1441
+ rings,
1442
+ pattern
974
1443
  };