@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.
- package/dist/contour-lines.d.ts +114 -0
- package/dist/esm/contour-lines.mjs +567 -0
- package/dist/esm/fisheye.mjs +9 -2
- package/dist/esm/index.mjs +515 -46
- package/dist/esm/pattern.mjs +568 -0
- package/dist/esm/pixel-dissolve.mjs +6 -5
- 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/dist/visual-test/visual-utils.d.ts +5 -0
- package/package.json +19 -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,479 @@ 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 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
|
|
115
|
-
var
|
|
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:
|
|
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:
|
|
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
|
|
634
|
+
var resolve2 = (p) => {
|
|
169
635
|
const thickness = p.thickness ?? DEFAULT_THICKNESS;
|
|
170
|
-
const gap = p.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 ??
|
|
642
|
+
offset: p.offset ?? DEFAULT_OFFSET2,
|
|
177
643
|
maskToSourceAlpha: p.maskToSourceAlpha ?? DEFAULT_MASK_TO_SOURCE_ALPHA
|
|
178
644
|
};
|
|
179
645
|
};
|
|
180
|
-
var
|
|
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 ??
|
|
221
|
-
|
|
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
|
|
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
|
|
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 =
|
|
320
|
-
const fs =
|
|
321
|
-
const program =
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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
|
|
507
|
-
var { createEffect:
|
|
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
|
|
980
|
+
var DEFAULT_GAP3 = 0;
|
|
513
981
|
var DEFAULT_ANGLE = 0;
|
|
514
|
-
var
|
|
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:
|
|
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:
|
|
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
|
|
1062
|
+
var resolve3 = (p) => {
|
|
595
1063
|
const thickness = p.thickness ?? DEFAULT_THICKNESS2;
|
|
596
|
-
const gap = p.gap ??
|
|
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 ??
|
|
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
|
|
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 ??
|
|
1124
|
+
const gap = params.gap ?? DEFAULT_GAP3;
|
|
657
1125
|
const amplitude = params.amplitude ?? DEFAULT_AMPLITUDE;
|
|
658
1126
|
const wavelength = params.wavelength ?? DEFAULT_WAVELENGTH;
|
|
659
|
-
|
|
1127
|
+
validatePositive3(thickness, "thickness");
|
|
660
1128
|
validateNonNegative3(gap, "gap");
|
|
661
1129
|
validateNonNegative3(amplitude, "amplitude");
|
|
662
|
-
|
|
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
|
|
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
|
|
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 =
|
|
771
|
-
const fs =
|
|
772
|
-
const program =
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
};
|