@remotion/effects 4.0.476 → 4.0.477
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/effect-internals.d.ts +8 -0
- package/dist/entrypoints/blur.d.ts +6 -0
- package/dist/esm/fisheye.mjs +9 -2
- package/dist/esm/index.mjs +527 -51
- package/dist/esm/pattern.mjs +575 -0
- package/dist/esm/rings.mjs +9 -2
- package/dist/esm/vignette.mjs +9 -2
- package/dist/index.d.ts +1 -0
- package/dist/pattern.d.ts +33 -0
- package/dist/uv-coordinate.d.ts +2 -0
- package/package.json +11 -3
package/dist/esm/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// src/
|
|
1
|
+
// src/pattern.ts
|
|
2
2
|
import { Internals } from "remotion";
|
|
3
3
|
|
|
4
4
|
// src/validate-effect-param.ts
|
|
@@ -106,13 +106,486 @@ var parseColorRgba = (ctx, color) => {
|
|
|
106
106
|
return [data[0], data[1], data[2], data[3]];
|
|
107
107
|
};
|
|
108
108
|
|
|
109
|
-
// src/
|
|
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 validateNonNegative2 = (value, name) => {
|
|
272
|
+
if (value < 0) {
|
|
273
|
+
throw new TypeError(`"${name}" must be >= 0, but got ${JSON.stringify(value)}`);
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
var validatePatternParams = (params) => {
|
|
277
|
+
assertEffectParamsObject(params, "Pattern");
|
|
278
|
+
assertOptionalFiniteNumber(params.scale, "scale");
|
|
279
|
+
assertOptionalFiniteNumber(params.cropLeft, "cropLeft");
|
|
280
|
+
assertOptionalFiniteNumber(params.cropTop, "cropTop");
|
|
281
|
+
assertOptionalFiniteNumber(params.cropRight, "cropRight");
|
|
282
|
+
assertOptionalFiniteNumber(params.cropBottom, "cropBottom");
|
|
283
|
+
assertOptionalFiniteNumber(params.gapX, "gapX");
|
|
284
|
+
assertOptionalFiniteNumber(params.gapY, "gapY");
|
|
285
|
+
assertOptionalFiniteNumber(params.offsetU, "offsetU");
|
|
286
|
+
assertOptionalFiniteNumber(params.offsetV, "offsetV");
|
|
287
|
+
assertOptionalFiniteNumber(params.rowOffset, "rowOffset");
|
|
288
|
+
assertOptionalFiniteNumber(params.rowOffsetEvery, "rowOffsetEvery");
|
|
289
|
+
assertOptionalFiniteNumber(params.columnOffset, "columnOffset");
|
|
290
|
+
assertOptionalFiniteNumber(params.columnOffsetEvery, "columnOffsetEvery");
|
|
291
|
+
assertOptionalUvCoordinate(params.origin, "origin");
|
|
292
|
+
assertOptionalBoolean(params.wrap, "wrap");
|
|
293
|
+
assertOptionalInteger(params.rowOffsetEvery, "rowOffsetEvery");
|
|
294
|
+
assertOptionalInteger(params.columnOffsetEvery, "columnOffsetEvery");
|
|
295
|
+
const r = resolve(params);
|
|
296
|
+
validatePositive(r.scale, "scale");
|
|
297
|
+
validateNonNegative2(r.gapX, "gapX");
|
|
298
|
+
validateNonNegative2(r.gapY, "gapY");
|
|
299
|
+
validateAtLeast(r.rowOffsetEvery, 0, "rowOffsetEvery");
|
|
300
|
+
validateAtLeast(r.columnOffsetEvery, 0, "columnOffsetEvery");
|
|
301
|
+
validateUnitInterval(r.origin[0], "origin[0]");
|
|
302
|
+
validateUnitInterval(r.origin[1], "origin[1]");
|
|
303
|
+
};
|
|
304
|
+
var PATTERN_VS = `#version 300 es
|
|
305
|
+
in vec2 aPos;
|
|
306
|
+
in vec2 aUv;
|
|
307
|
+
out vec2 vUv;
|
|
308
|
+
|
|
309
|
+
void main() {
|
|
310
|
+
vUv = aUv;
|
|
311
|
+
gl_Position = vec4(aPos, 0.0, 1.0);
|
|
312
|
+
}
|
|
313
|
+
`;
|
|
314
|
+
var PATTERN_FS = `#version 300 es
|
|
315
|
+
precision highp float;
|
|
316
|
+
|
|
317
|
+
in vec2 vUv;
|
|
318
|
+
out vec4 fragColor;
|
|
319
|
+
|
|
320
|
+
uniform sampler2D uSource;
|
|
321
|
+
uniform vec2 uResolution;
|
|
322
|
+
uniform float uScale;
|
|
323
|
+
uniform vec4 uCrop;
|
|
324
|
+
uniform vec2 uGap;
|
|
325
|
+
uniform vec2 uOffset;
|
|
326
|
+
uniform vec2 uRowOffset;
|
|
327
|
+
uniform vec2 uColumnOffset;
|
|
328
|
+
uniform vec2 uOrigin;
|
|
329
|
+
uniform bool uWrap;
|
|
330
|
+
|
|
331
|
+
float positiveModulo(float value, float modulo) {
|
|
332
|
+
return mod(mod(value, modulo) + modulo, modulo);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
float getPhase(float index, float every) {
|
|
336
|
+
if (every == 0.0) {
|
|
337
|
+
return index;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
return positiveModulo(index, every);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
bool sampleCell(vec2 cell, vec2 fragPx, vec2 cropStart, vec2 tileSize, vec2 pitch, vec2 originPx, out vec4 color) {
|
|
344
|
+
if (!uWrap && (cell.x < 0.0 || cell.y < 0.0)) {
|
|
345
|
+
return false;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
float rowPhase = getPhase(cell.y, uRowOffset.y);
|
|
349
|
+
float columnPhase = getPhase(cell.x, uColumnOffset.y);
|
|
350
|
+
vec2 stagger = vec2(rowPhase * uRowOffset.x, columnPhase * uColumnOffset.x);
|
|
351
|
+
vec2 localPx = fragPx - originPx - stagger - cell * pitch;
|
|
352
|
+
|
|
353
|
+
if (localPx.x < 0.0 || localPx.y < 0.0 || localPx.x >= tileSize.x || localPx.y >= tileSize.y) {
|
|
354
|
+
return false;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
vec2 sourcePx = cropStart + localPx / uScale;
|
|
358
|
+
vec2 sourceUv = vec2(sourcePx.x / uResolution.x, 1.0 - sourcePx.y / uResolution.y);
|
|
359
|
+
|
|
360
|
+
if (sourceUv.x < 0.0 || sourceUv.y < 0.0 || sourceUv.x > 1.0 || sourceUv.y > 1.0) {
|
|
361
|
+
return false;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
color = texture(uSource, sourceUv);
|
|
365
|
+
return true;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
void main() {
|
|
369
|
+
vec2 cropStart = uCrop.xy;
|
|
370
|
+
vec2 cropEnd = uResolution - uCrop.zw;
|
|
371
|
+
vec2 cropSize = max(cropEnd - cropStart, vec2(0.001));
|
|
372
|
+
vec2 tileSize = max(cropSize * uScale, vec2(0.001));
|
|
373
|
+
vec2 pitch = max(tileSize + uGap, vec2(0.001));
|
|
374
|
+
vec2 patternUv = vec2(vUv.x, 1.0 - vUv.y);
|
|
375
|
+
vec2 originPx = (uOrigin + uOffset) * uResolution;
|
|
376
|
+
vec2 fragPx = patternUv * uResolution;
|
|
377
|
+
|
|
378
|
+
vec2 gridPx = fragPx - originPx;
|
|
379
|
+
vec2 cell = floor(gridPx / pitch);
|
|
380
|
+
|
|
381
|
+
for (int i = 0; i < 4; i++) {
|
|
382
|
+
float rowPhase = getPhase(cell.y, uRowOffset.y);
|
|
383
|
+
float columnPhase = getPhase(cell.x, uColumnOffset.y);
|
|
384
|
+
vec2 stagger = vec2(rowPhase * uRowOffset.x, columnPhase * uColumnOffset.x);
|
|
385
|
+
vec2 adjustedGridPx = fragPx - originPx - stagger;
|
|
386
|
+
vec2 nextCell = floor(adjustedGridPx / pitch);
|
|
387
|
+
|
|
388
|
+
if (all(equal(nextCell, cell))) {
|
|
389
|
+
break;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
cell = nextCell;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
vec4 color = vec4(0.0);
|
|
396
|
+
for (int y = -4; y <= 4; y++) {
|
|
397
|
+
for (int x = -4; x <= 4; x++) {
|
|
398
|
+
if (sampleCell(cell + vec2(float(x), float(y)), fragPx, cropStart, tileSize, pitch, originPx, color)) {
|
|
399
|
+
fragColor = color;
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
fragColor = vec4(0.0);
|
|
406
|
+
}
|
|
407
|
+
`;
|
|
408
|
+
var compileShader = (gl, type, source) => {
|
|
409
|
+
const shader = gl.createShader(type);
|
|
410
|
+
if (!shader) {
|
|
411
|
+
throw new Error("Failed to create WebGL shader");
|
|
412
|
+
}
|
|
413
|
+
gl.shaderSource(shader, source);
|
|
414
|
+
gl.compileShader(shader);
|
|
415
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
416
|
+
const log = gl.getShaderInfoLog(shader);
|
|
417
|
+
gl.deleteShader(shader);
|
|
418
|
+
throw new Error(`Pattern shader compile failed: ${log ?? "(no log)"}`);
|
|
419
|
+
}
|
|
420
|
+
return shader;
|
|
421
|
+
};
|
|
422
|
+
var linkProgram = (gl, vs, fs) => {
|
|
423
|
+
const program = gl.createProgram();
|
|
424
|
+
if (!program) {
|
|
425
|
+
throw new Error("Failed to create WebGL program");
|
|
426
|
+
}
|
|
427
|
+
gl.attachShader(program, vs);
|
|
428
|
+
gl.attachShader(program, fs);
|
|
429
|
+
gl.linkProgram(program);
|
|
430
|
+
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
431
|
+
const log = gl.getProgramInfoLog(program);
|
|
432
|
+
gl.deleteProgram(program);
|
|
433
|
+
throw new Error(`Pattern program link failed: ${log ?? "(no log)"}`);
|
|
434
|
+
}
|
|
435
|
+
return program;
|
|
436
|
+
};
|
|
437
|
+
var pattern = createEffect({
|
|
438
|
+
type: "remotion/pattern",
|
|
439
|
+
label: "pattern()",
|
|
440
|
+
documentationLink: "https://www.remotion.dev/docs/effects/pattern",
|
|
441
|
+
backend: "webgl2",
|
|
442
|
+
calculateKey: (params) => {
|
|
443
|
+
const r = resolve(params);
|
|
444
|
+
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}`;
|
|
445
|
+
},
|
|
446
|
+
setup: (target) => {
|
|
447
|
+
const gl = target.getContext("webgl2", {
|
|
448
|
+
premultipliedAlpha: true,
|
|
449
|
+
alpha: true,
|
|
450
|
+
preserveDrawingBuffer: true
|
|
451
|
+
});
|
|
452
|
+
if (!gl) {
|
|
453
|
+
throw createWebGL2ContextError("pattern effect");
|
|
454
|
+
}
|
|
455
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
|
|
456
|
+
const vs = compileShader(gl, gl.VERTEX_SHADER, PATTERN_VS);
|
|
457
|
+
const fs = compileShader(gl, gl.FRAGMENT_SHADER, PATTERN_FS);
|
|
458
|
+
const program = linkProgram(gl, vs, fs);
|
|
459
|
+
gl.deleteShader(vs);
|
|
460
|
+
gl.deleteShader(fs);
|
|
461
|
+
const vao = gl.createVertexArray();
|
|
462
|
+
if (!vao) {
|
|
463
|
+
throw new Error("Failed to create WebGL vertex array");
|
|
464
|
+
}
|
|
465
|
+
gl.bindVertexArray(vao);
|
|
466
|
+
const data = new Float32Array([
|
|
467
|
+
-1,
|
|
468
|
+
-1,
|
|
469
|
+
0,
|
|
470
|
+
0,
|
|
471
|
+
1,
|
|
472
|
+
-1,
|
|
473
|
+
1,
|
|
474
|
+
0,
|
|
475
|
+
-1,
|
|
476
|
+
1,
|
|
477
|
+
0,
|
|
478
|
+
1,
|
|
479
|
+
1,
|
|
480
|
+
1,
|
|
481
|
+
1,
|
|
482
|
+
1
|
|
483
|
+
]);
|
|
484
|
+
const vbo = gl.createBuffer();
|
|
485
|
+
if (!vbo) {
|
|
486
|
+
throw new Error("Failed to create WebGL buffer");
|
|
487
|
+
}
|
|
488
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
|
|
489
|
+
gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
|
|
490
|
+
const aPos = gl.getAttribLocation(program, "aPos");
|
|
491
|
+
const aUv = gl.getAttribLocation(program, "aUv");
|
|
492
|
+
gl.enableVertexAttribArray(aPos);
|
|
493
|
+
gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 16, 0);
|
|
494
|
+
gl.enableVertexAttribArray(aUv);
|
|
495
|
+
gl.vertexAttribPointer(aUv, 2, gl.FLOAT, false, 16, 8);
|
|
496
|
+
gl.bindVertexArray(null);
|
|
497
|
+
const texture = gl.createTexture();
|
|
498
|
+
if (!texture) {
|
|
499
|
+
throw new Error("Failed to create WebGL texture");
|
|
500
|
+
}
|
|
501
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
502
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
503
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
504
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
505
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
506
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
507
|
+
return {
|
|
508
|
+
gl,
|
|
509
|
+
program,
|
|
510
|
+
vao,
|
|
511
|
+
vbo,
|
|
512
|
+
texture,
|
|
513
|
+
uniforms: {
|
|
514
|
+
uSource: gl.getUniformLocation(program, "uSource"),
|
|
515
|
+
uResolution: gl.getUniformLocation(program, "uResolution"),
|
|
516
|
+
uScale: gl.getUniformLocation(program, "uScale"),
|
|
517
|
+
uCrop: gl.getUniformLocation(program, "uCrop"),
|
|
518
|
+
uGap: gl.getUniformLocation(program, "uGap"),
|
|
519
|
+
uOffset: gl.getUniformLocation(program, "uOffset"),
|
|
520
|
+
uRowOffset: gl.getUniformLocation(program, "uRowOffset"),
|
|
521
|
+
uColumnOffset: gl.getUniformLocation(program, "uColumnOffset"),
|
|
522
|
+
uOrigin: gl.getUniformLocation(program, "uOrigin"),
|
|
523
|
+
uWrap: gl.getUniformLocation(program, "uWrap")
|
|
524
|
+
}
|
|
525
|
+
};
|
|
526
|
+
},
|
|
527
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
528
|
+
const r = resolve(params);
|
|
529
|
+
const { gl, program, vao, texture, uniforms } = state;
|
|
530
|
+
gl.viewport(0, 0, width, height);
|
|
531
|
+
gl.clearColor(0, 0, 0, 0);
|
|
532
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
533
|
+
gl.useProgram(program);
|
|
534
|
+
gl.bindVertexArray(vao);
|
|
535
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
536
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
537
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
538
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
539
|
+
if (uniforms.uSource)
|
|
540
|
+
gl.uniform1i(uniforms.uSource, 0);
|
|
541
|
+
if (uniforms.uResolution)
|
|
542
|
+
gl.uniform2f(uniforms.uResolution, width, height);
|
|
543
|
+
if (uniforms.uScale)
|
|
544
|
+
gl.uniform1f(uniforms.uScale, r.scale);
|
|
545
|
+
if (uniforms.uCrop)
|
|
546
|
+
gl.uniform4f(uniforms.uCrop, r.cropLeft, r.cropTop, r.cropRight, r.cropBottom);
|
|
547
|
+
if (uniforms.uGap)
|
|
548
|
+
gl.uniform2f(uniforms.uGap, r.gapX, r.gapY);
|
|
549
|
+
if (uniforms.uOffset)
|
|
550
|
+
gl.uniform2f(uniforms.uOffset, r.offsetU, r.offsetV);
|
|
551
|
+
if (uniforms.uRowOffset)
|
|
552
|
+
gl.uniform2f(uniforms.uRowOffset, r.rowOffset, r.rowOffsetEvery);
|
|
553
|
+
if (uniforms.uColumnOffset)
|
|
554
|
+
gl.uniform2f(uniforms.uColumnOffset, r.columnOffset, r.columnOffsetEvery);
|
|
555
|
+
if (uniforms.uOrigin)
|
|
556
|
+
gl.uniform2f(uniforms.uOrigin, r.origin[0], r.origin[1]);
|
|
557
|
+
if (uniforms.uWrap)
|
|
558
|
+
gl.uniform1i(uniforms.uWrap, r.wrap ? 1 : 0);
|
|
559
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
560
|
+
gl.bindVertexArray(null);
|
|
561
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
562
|
+
gl.useProgram(null);
|
|
563
|
+
},
|
|
564
|
+
cleanup: ({ gl, program, vao, vbo, texture }) => {
|
|
565
|
+
gl.deleteBuffer(vbo);
|
|
566
|
+
gl.deleteProgram(program);
|
|
567
|
+
gl.deleteVertexArray(vao);
|
|
568
|
+
gl.deleteTexture(texture);
|
|
569
|
+
},
|
|
570
|
+
schema: patternSchema,
|
|
571
|
+
validateParams: validatePatternParams
|
|
572
|
+
});
|
|
573
|
+
|
|
574
|
+
// src/rings.ts
|
|
575
|
+
import { Internals as Internals2 } from "remotion";
|
|
576
|
+
|
|
577
|
+
// src/uv-coordinate.ts
|
|
578
|
+
var publicUvToShaderUv = (uv) => {
|
|
579
|
+
return [uv[0], 1 - uv[1]];
|
|
580
|
+
};
|
|
581
|
+
|
|
582
|
+
// src/rings.ts
|
|
583
|
+
var { createEffect: createEffect2, createWebGL2ContextError: createWebGL2ContextError2 } = Internals2;
|
|
111
584
|
var DEFAULT_COLORS = ["#dff4ff", "#7cc6ff"];
|
|
112
585
|
var DEFAULT_CENTER = [0.5, 0.5];
|
|
113
586
|
var DEFAULT_THICKNESS = 40;
|
|
114
|
-
var
|
|
115
|
-
var
|
|
587
|
+
var DEFAULT_GAP2 = 0;
|
|
588
|
+
var DEFAULT_OFFSET2 = 0;
|
|
116
589
|
var DEFAULT_MASK_TO_SOURCE_ALPHA = false;
|
|
117
590
|
var ringsSchema = {
|
|
118
591
|
colors: {
|
|
@@ -148,14 +621,14 @@ var ringsSchema = {
|
|
|
148
621
|
min: 0,
|
|
149
622
|
max: 400,
|
|
150
623
|
step: 0.1,
|
|
151
|
-
default:
|
|
624
|
+
default: DEFAULT_GAP2,
|
|
152
625
|
description: "Gap",
|
|
153
626
|
hiddenFromList: false
|
|
154
627
|
},
|
|
155
628
|
offset: {
|
|
156
629
|
type: "number",
|
|
157
630
|
step: 0.1,
|
|
158
|
-
default:
|
|
631
|
+
default: DEFAULT_OFFSET2,
|
|
159
632
|
description: "Offset",
|
|
160
633
|
hiddenFromList: false
|
|
161
634
|
},
|
|
@@ -165,24 +638,24 @@ var ringsSchema = {
|
|
|
165
638
|
description: "Mask to source alpha"
|
|
166
639
|
}
|
|
167
640
|
};
|
|
168
|
-
var
|
|
641
|
+
var resolve2 = (p) => {
|
|
169
642
|
const thickness = p.thickness ?? DEFAULT_THICKNESS;
|
|
170
|
-
const gap = p.gap ??
|
|
643
|
+
const gap = p.gap ?? DEFAULT_GAP2;
|
|
171
644
|
return {
|
|
172
645
|
colors: p.colors ?? DEFAULT_COLORS,
|
|
173
646
|
center: [...p.center ?? DEFAULT_CENTER],
|
|
174
647
|
thickness,
|
|
175
648
|
spacing: thickness + gap,
|
|
176
|
-
offset: p.offset ??
|
|
649
|
+
offset: p.offset ?? DEFAULT_OFFSET2,
|
|
177
650
|
maskToSourceAlpha: p.maskToSourceAlpha ?? DEFAULT_MASK_TO_SOURCE_ALPHA
|
|
178
651
|
};
|
|
179
652
|
};
|
|
180
|
-
var
|
|
653
|
+
var validatePositive2 = (value, name) => {
|
|
181
654
|
if (value <= 0) {
|
|
182
655
|
throw new TypeError(`"${name}" must be greater than 0, but got ${JSON.stringify(value)}`);
|
|
183
656
|
}
|
|
184
657
|
};
|
|
185
|
-
var
|
|
658
|
+
var validateNonNegative3 = (value, name) => {
|
|
186
659
|
if (value < 0) {
|
|
187
660
|
throw new TypeError(`"${name}" must be greater than or equal to 0, but got ${JSON.stringify(value)}`);
|
|
188
661
|
}
|
|
@@ -217,9 +690,9 @@ var validateRingsParams = (params) => {
|
|
|
217
690
|
assertOptionalFiniteNumber(params.offset, "offset");
|
|
218
691
|
assertOptionalBoolean(params.maskToSourceAlpha, "maskToSourceAlpha");
|
|
219
692
|
const thickness = params.thickness ?? DEFAULT_THICKNESS;
|
|
220
|
-
const gap = params.gap ??
|
|
221
|
-
|
|
222
|
-
|
|
693
|
+
const gap = params.gap ?? DEFAULT_GAP2;
|
|
694
|
+
validatePositive2(thickness, "thickness");
|
|
695
|
+
validateNonNegative3(gap, "gap");
|
|
223
696
|
};
|
|
224
697
|
var RINGS_VS = `#version 300 es
|
|
225
698
|
in vec2 aPos;
|
|
@@ -286,7 +759,7 @@ void main() {
|
|
|
286
759
|
);
|
|
287
760
|
}
|
|
288
761
|
`;
|
|
289
|
-
var
|
|
762
|
+
var compileShader2 = (gl, type, source) => {
|
|
290
763
|
const shader = gl.createShader(type);
|
|
291
764
|
if (!shader) {
|
|
292
765
|
throw new Error("Failed to create WebGL shader");
|
|
@@ -300,7 +773,7 @@ var compileShader = (gl, type, source) => {
|
|
|
300
773
|
}
|
|
301
774
|
return shader;
|
|
302
775
|
};
|
|
303
|
-
var
|
|
776
|
+
var linkProgram2 = (gl, vs, fs) => {
|
|
304
777
|
const program = gl.createProgram();
|
|
305
778
|
if (!program) {
|
|
306
779
|
throw new Error("Failed to create WebGL program");
|
|
@@ -316,9 +789,9 @@ var linkProgram = (gl, vs, fs) => {
|
|
|
316
789
|
return program;
|
|
317
790
|
};
|
|
318
791
|
var createProgram = (gl, vertexSource, fragmentSource) => {
|
|
319
|
-
const vs =
|
|
320
|
-
const fs =
|
|
321
|
-
const program =
|
|
792
|
+
const vs = compileShader2(gl, gl.VERTEX_SHADER, vertexSource);
|
|
793
|
+
const fs = compileShader2(gl, gl.FRAGMENT_SHADER, fragmentSource);
|
|
794
|
+
const program = linkProgram2(gl, vs, fs);
|
|
322
795
|
gl.deleteShader(vs);
|
|
323
796
|
gl.deleteShader(fs);
|
|
324
797
|
return program;
|
|
@@ -343,7 +816,7 @@ var setupRings = (target) => {
|
|
|
343
816
|
preserveDrawingBuffer: true
|
|
344
817
|
});
|
|
345
818
|
if (!gl) {
|
|
346
|
-
throw
|
|
819
|
+
throw createWebGL2ContextError2("rings effect");
|
|
347
820
|
}
|
|
348
821
|
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
|
|
349
822
|
const program = createProgram(gl, RINGS_VS, RINGS_FS);
|
|
@@ -434,19 +907,19 @@ var updatePalette = (state, colors) => {
|
|
|
434
907
|
}
|
|
435
908
|
return true;
|
|
436
909
|
};
|
|
437
|
-
var rings =
|
|
910
|
+
var rings = createEffect2({
|
|
438
911
|
type: "remotion/rings",
|
|
439
912
|
label: "rings()",
|
|
440
913
|
documentationLink: "https://www.remotion.dev/docs/effects/rings",
|
|
441
914
|
backend: "webgl2",
|
|
442
915
|
calculateKey: (params) => {
|
|
443
|
-
const r =
|
|
916
|
+
const r = resolve2(params);
|
|
444
917
|
const maskSuffix = r.maskToSourceAlpha ? "-mask-to-source-alpha" : "";
|
|
445
918
|
return `rings-${r.colors.join("|")}-${r.center.join(":")}-${r.thickness}-${r.spacing}-${r.offset}${maskSuffix}`;
|
|
446
919
|
},
|
|
447
920
|
setup: (target) => setupRings(target),
|
|
448
921
|
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
449
|
-
const r =
|
|
922
|
+
const r = resolve2(params);
|
|
450
923
|
const paletteDirty = updatePalette(state, r.colors);
|
|
451
924
|
const { gl, program, sourceTexture, paletteTexture, uniforms, vao } = state;
|
|
452
925
|
gl.viewport(0, 0, width, height);
|
|
@@ -475,8 +948,10 @@ var rings = createEffect({
|
|
|
475
948
|
gl.uniform2f(uniforms.uResolution, width, height);
|
|
476
949
|
if (uniforms.uNumColors)
|
|
477
950
|
gl.uniform1f(uniforms.uNumColors, r.colors.length);
|
|
478
|
-
if (uniforms.uCenter)
|
|
479
|
-
|
|
951
|
+
if (uniforms.uCenter) {
|
|
952
|
+
const shaderCenter = publicUvToShaderUv(r.center);
|
|
953
|
+
gl.uniform2f(uniforms.uCenter, shaderCenter[0], shaderCenter[1]);
|
|
954
|
+
}
|
|
480
955
|
if (uniforms.uThickness)
|
|
481
956
|
gl.uniform1f(uniforms.uThickness, r.thickness);
|
|
482
957
|
if (uniforms.uSpacing)
|
|
@@ -503,15 +978,15 @@ var rings = createEffect({
|
|
|
503
978
|
});
|
|
504
979
|
|
|
505
980
|
// src/zigzag.ts
|
|
506
|
-
import { Internals as
|
|
507
|
-
var { createEffect:
|
|
981
|
+
import { Internals as Internals3 } from "remotion";
|
|
982
|
+
var { createEffect: createEffect3, createWebGL2ContextError: createWebGL2ContextError3 } = Internals3;
|
|
508
983
|
var ZIGZAG_DIRECTIONS = ["horizontal", "vertical"];
|
|
509
984
|
var DEFAULT_COLORS2 = ["#dff4ff", "#7cc6ff"];
|
|
510
985
|
var DEFAULT_DIRECTION = "horizontal";
|
|
511
986
|
var DEFAULT_THICKNESS2 = 40;
|
|
512
|
-
var
|
|
987
|
+
var DEFAULT_GAP3 = 0;
|
|
513
988
|
var DEFAULT_ANGLE = 0;
|
|
514
|
-
var
|
|
989
|
+
var DEFAULT_OFFSET3 = 0;
|
|
515
990
|
var DEFAULT_AMPLITUDE = 40;
|
|
516
991
|
var DEFAULT_WAVELENGTH = 160;
|
|
517
992
|
var DEFAULT_MASK_TO_SOURCE_ALPHA2 = false;
|
|
@@ -550,7 +1025,7 @@ var zigzagSchema = {
|
|
|
550
1025
|
min: 0,
|
|
551
1026
|
max: 400,
|
|
552
1027
|
step: 0.1,
|
|
553
|
-
default:
|
|
1028
|
+
default: DEFAULT_GAP3,
|
|
554
1029
|
description: "Gap",
|
|
555
1030
|
hiddenFromList: false
|
|
556
1031
|
},
|
|
@@ -563,7 +1038,7 @@ var zigzagSchema = {
|
|
|
563
1038
|
offset: {
|
|
564
1039
|
type: "number",
|
|
565
1040
|
step: 0.1,
|
|
566
|
-
default:
|
|
1041
|
+
default: DEFAULT_OFFSET3,
|
|
567
1042
|
description: "Offset",
|
|
568
1043
|
hiddenFromList: false
|
|
569
1044
|
},
|
|
@@ -591,16 +1066,16 @@ var zigzagSchema = {
|
|
|
591
1066
|
description: "Mask to source alpha"
|
|
592
1067
|
}
|
|
593
1068
|
};
|
|
594
|
-
var
|
|
1069
|
+
var resolve3 = (p) => {
|
|
595
1070
|
const thickness = p.thickness ?? DEFAULT_THICKNESS2;
|
|
596
|
-
const gap = p.gap ??
|
|
1071
|
+
const gap = p.gap ?? DEFAULT_GAP3;
|
|
597
1072
|
return {
|
|
598
1073
|
colors: p.colors ?? DEFAULT_COLORS2,
|
|
599
1074
|
direction: p.direction ?? DEFAULT_DIRECTION,
|
|
600
1075
|
thickness,
|
|
601
1076
|
spacing: thickness + gap,
|
|
602
1077
|
angle: p.angle ?? DEFAULT_ANGLE,
|
|
603
|
-
offset: p.offset ??
|
|
1078
|
+
offset: p.offset ?? DEFAULT_OFFSET3,
|
|
604
1079
|
amplitude: p.amplitude ?? DEFAULT_AMPLITUDE,
|
|
605
1080
|
wavelength: p.wavelength ?? DEFAULT_WAVELENGTH,
|
|
606
1081
|
maskToSourceAlpha: p.maskToSourceAlpha ?? DEFAULT_MASK_TO_SOURCE_ALPHA2
|
|
@@ -612,12 +1087,12 @@ var formatEnum = (variants) => {
|
|
|
612
1087
|
}
|
|
613
1088
|
return `${variants.slice(0, -1).map((variant) => `"${variant}"`).join(", ")} or "${variants[variants.length - 1]}"`;
|
|
614
1089
|
};
|
|
615
|
-
var
|
|
1090
|
+
var validatePositive3 = (value, name) => {
|
|
616
1091
|
if (value <= 0) {
|
|
617
1092
|
throw new TypeError(`"${name}" must be greater than 0, but got ${JSON.stringify(value)}`);
|
|
618
1093
|
}
|
|
619
1094
|
};
|
|
620
|
-
var
|
|
1095
|
+
var validateNonNegative4 = (value, name) => {
|
|
621
1096
|
if (value < 0) {
|
|
622
1097
|
throw new TypeError(`"${name}" must be greater than or equal to 0, but got ${JSON.stringify(value)}`);
|
|
623
1098
|
}
|
|
@@ -653,13 +1128,13 @@ var validateZigzagParams = (params) => {
|
|
|
653
1128
|
assertOptionalFiniteNumber(params.wavelength, "wavelength");
|
|
654
1129
|
assertOptionalBoolean(params.maskToSourceAlpha, "maskToSourceAlpha");
|
|
655
1130
|
const thickness = params.thickness ?? DEFAULT_THICKNESS2;
|
|
656
|
-
const gap = params.gap ??
|
|
1131
|
+
const gap = params.gap ?? DEFAULT_GAP3;
|
|
657
1132
|
const amplitude = params.amplitude ?? DEFAULT_AMPLITUDE;
|
|
658
1133
|
const wavelength = params.wavelength ?? DEFAULT_WAVELENGTH;
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
1134
|
+
validatePositive3(thickness, "thickness");
|
|
1135
|
+
validateNonNegative4(gap, "gap");
|
|
1136
|
+
validateNonNegative4(amplitude, "amplitude");
|
|
1137
|
+
validatePositive3(wavelength, "wavelength");
|
|
663
1138
|
};
|
|
664
1139
|
var ZIGZAG_VS = `#version 300 es
|
|
665
1140
|
in vec2 aPos;
|
|
@@ -737,7 +1212,7 @@ void main() {
|
|
|
737
1212
|
);
|
|
738
1213
|
}
|
|
739
1214
|
`;
|
|
740
|
-
var
|
|
1215
|
+
var compileShader3 = (gl, type, source) => {
|
|
741
1216
|
const shader = gl.createShader(type);
|
|
742
1217
|
if (!shader) {
|
|
743
1218
|
throw new Error("Failed to create WebGL shader");
|
|
@@ -751,7 +1226,7 @@ var compileShader2 = (gl, type, source) => {
|
|
|
751
1226
|
}
|
|
752
1227
|
return shader;
|
|
753
1228
|
};
|
|
754
|
-
var
|
|
1229
|
+
var linkProgram3 = (gl, vs, fs) => {
|
|
755
1230
|
const program = gl.createProgram();
|
|
756
1231
|
if (!program) {
|
|
757
1232
|
throw new Error("Failed to create WebGL program");
|
|
@@ -767,9 +1242,9 @@ var linkProgram2 = (gl, vs, fs) => {
|
|
|
767
1242
|
return program;
|
|
768
1243
|
};
|
|
769
1244
|
var createProgram2 = (gl, vertexSource, fragmentSource) => {
|
|
770
|
-
const vs =
|
|
771
|
-
const fs =
|
|
772
|
-
const program =
|
|
1245
|
+
const vs = compileShader3(gl, gl.VERTEX_SHADER, vertexSource);
|
|
1246
|
+
const fs = compileShader3(gl, gl.FRAGMENT_SHADER, fragmentSource);
|
|
1247
|
+
const program = linkProgram3(gl, vs, fs);
|
|
773
1248
|
gl.deleteShader(vs);
|
|
774
1249
|
gl.deleteShader(fs);
|
|
775
1250
|
return program;
|
|
@@ -794,7 +1269,7 @@ var setupZigzag = (target) => {
|
|
|
794
1269
|
preserveDrawingBuffer: true
|
|
795
1270
|
});
|
|
796
1271
|
if (!gl) {
|
|
797
|
-
throw
|
|
1272
|
+
throw createWebGL2ContextError3("zigzag effect");
|
|
798
1273
|
}
|
|
799
1274
|
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
|
|
800
1275
|
const program = createProgram2(gl, ZIGZAG_VS, ZIGZAG_FS);
|
|
@@ -888,19 +1363,19 @@ var updatePalette2 = (state, colors) => {
|
|
|
888
1363
|
}
|
|
889
1364
|
return true;
|
|
890
1365
|
};
|
|
891
|
-
var zigzag =
|
|
1366
|
+
var zigzag = createEffect3({
|
|
892
1367
|
type: "remotion/zigzag",
|
|
893
1368
|
label: "zigzag()",
|
|
894
1369
|
documentationLink: "https://www.remotion.dev/docs/effects/zigzag",
|
|
895
1370
|
backend: "webgl2",
|
|
896
1371
|
calculateKey: (params) => {
|
|
897
|
-
const r =
|
|
1372
|
+
const r = resolve3(params);
|
|
898
1373
|
const maskSuffix = r.maskToSourceAlpha ? "-mask-to-source-alpha" : "";
|
|
899
1374
|
return `zigzag-${r.colors.join("|")}-${r.direction}-${r.thickness}-${r.spacing}-${r.angle}-${r.offset}-${r.amplitude}-${r.wavelength}${maskSuffix}`;
|
|
900
1375
|
},
|
|
901
1376
|
setup: (target) => setupZigzag(target),
|
|
902
1377
|
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
903
|
-
const r =
|
|
1378
|
+
const r = resolve3(params);
|
|
904
1379
|
const paletteDirty = updatePalette2(state, r.colors);
|
|
905
1380
|
const { gl, program, sourceTexture, paletteTexture, uniforms, vao } = state;
|
|
906
1381
|
gl.viewport(0, 0, width, height);
|
|
@@ -970,5 +1445,6 @@ var zigzag = createEffect2({
|
|
|
970
1445
|
});
|
|
971
1446
|
export {
|
|
972
1447
|
zigzag,
|
|
973
|
-
rings
|
|
1448
|
+
rings,
|
|
1449
|
+
pattern
|
|
974
1450
|
};
|