@remotion/effects 4.0.536 → 4.0.538
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/THIRD_PARTY_LICENSES.md +30 -0
- package/dist/barrel-distortion/index.d.ts +1 -1
- package/dist/bevel-alpha/index.d.ts +13 -0
- package/dist/bevel-alpha/shaders.d.ts +3 -0
- package/dist/bevel-alpha.d.ts +1 -0
- package/dist/blur/index.d.ts +1 -1
- package/dist/brightness.d.ts +1 -1
- package/dist/burlap.d.ts +1 -1
- package/dist/checkerboard.d.ts +17 -17
- package/dist/chromatic-aberration/index.d.ts +1 -1
- package/dist/color-correction.d.ts +1 -1
- package/dist/color-key.d.ts +9 -9
- package/dist/color-utils.d.ts +8 -8
- package/dist/contour-lines.d.ts +23 -23
- package/dist/contrast.d.ts +1 -1
- package/dist/corner-pin/index.d.ts +1 -1
- package/dist/cylinder/index.d.ts +20 -0
- package/dist/cylinder/shader.d.ts +1 -0
- package/dist/cylinder.d.ts +1 -0
- package/dist/dot-grid.d.ts +7 -7
- package/dist/drop-shadow/index.d.ts +1 -1
- package/dist/duotone.d.ts +7 -7
- package/dist/emboss.d.ts +15 -15
- package/dist/esm/bevel-alpha.mjs +474 -0
- package/dist/esm/cylinder.mjs +390 -0
- package/dist/esm/fractal-noise.mjs +688 -0
- package/dist/esm/lens-blur.mjs +550 -0
- package/dist/esm/long-shadows.mjs +410 -0
- package/dist/esm/page-turn.mjs +405 -0
- package/dist/esm/sphere.mjs +376 -0
- package/dist/esm/turbulent-displace.mjs +652 -0
- package/dist/evolve.d.ts +8 -8
- package/dist/exposure.d.ts +1 -1
- package/dist/fisheye/index.d.ts +1 -1
- package/dist/flannel.d.ts +1 -1
- package/dist/fractal-noise/index.d.ts +40 -0
- package/dist/fractal-noise/shader.d.ts +1 -0
- package/dist/fractal-noise.d.ts +1 -0
- package/dist/gaussian-blur-shader.d.ts +1 -1
- package/dist/glow/index.d.ts +1 -1
- package/dist/grayscale.d.ts +1 -1
- package/dist/gridlines.d.ts +23 -23
- package/dist/halftone-linear-gradient.d.ts +21 -21
- package/dist/halftone.d.ts +25 -25
- package/dist/hue.d.ts +1 -1
- package/dist/invert.d.ts +1 -1
- package/dist/lens-blur/index.d.ts +30 -0
- package/dist/lens-blur/shader.d.ts +1 -0
- package/dist/lens-blur.d.ts +1 -0
- package/dist/levels.d.ts +1 -1
- package/dist/light-leak.d.ts +7 -7
- package/dist/light-trail/index.d.ts +1 -1
- package/dist/linear-gradient-tint.d.ts +1 -1
- package/dist/linear-gradient.d.ts +1 -1
- package/dist/linear-progressive-blur/index.d.ts +1 -1
- package/dist/linear-progressive-blur/linear-progressive-blur-shaders.d.ts +1 -1
- package/dist/linear-progressive-pixelate/index.d.ts +1 -1
- package/dist/lines.d.ts +18 -18
- package/dist/liquid-contours.d.ts +21 -21
- package/dist/long-shadows.d.ts +13 -0
- package/dist/lut/index.d.ts +3 -3
- package/dist/mirror/index.d.ts +1 -1
- package/dist/noise-displacement.d.ts +1 -1
- package/dist/noise.d.ts +1 -1
- package/dist/outline/polygonize-alpha.d.ts +1 -1
- package/dist/outline.d.ts +11 -11
- package/dist/page-turn/index.d.ts +20 -0
- package/dist/page-turn/shader.d.ts +1 -0
- package/dist/page-turn.d.ts +1 -0
- package/dist/paper.d.ts +1 -1
- package/dist/pattern.d.ts +1 -1
- package/dist/pixel-dissolve.d.ts +1 -1
- package/dist/pixelate.d.ts +1 -1
- package/dist/radial-progressive-blur/index.d.ts +1 -1
- package/dist/radial-progressive-blur/radial-progressive-blur-shaders.d.ts +1 -1
- package/dist/radial-progressive-pixelate/index.d.ts +1 -1
- package/dist/region-blur/index.d.ts +11 -11
- package/dist/rings.d.ts +15 -15
- package/dist/roughen-edges.d.ts +1 -1
- package/dist/saturation.d.ts +1 -1
- package/dist/scale/index.d.ts +1 -1
- package/dist/scanlines.d.ts +1 -1
- package/dist/shadows-highlights.d.ts +1 -1
- package/dist/shine.d.ts +1 -1
- package/dist/shrinkwrap.d.ts +1 -1
- package/dist/skew.d.ts +1 -1
- package/dist/speckle.d.ts +1 -1
- package/dist/sphere/index.d.ts +18 -0
- package/dist/sphere/shader.d.ts +1 -0
- package/dist/sphere.d.ts +1 -0
- package/dist/starburst.d.ts +13 -13
- package/dist/tear.d.ts +1 -1
- package/dist/thermal-vision.d.ts +7 -7
- package/dist/tile.d.ts +1 -1
- package/dist/tint.d.ts +5 -5
- package/dist/translate/index.d.ts +2 -2
- package/dist/turbulent-displace/index.d.ts +28 -0
- package/dist/turbulent-displace/shader.d.ts +1 -0
- package/dist/turbulent-displace.d.ts +1 -0
- package/dist/tv-signal-off.d.ts +1 -1
- package/dist/value-noise-shader.d.ts +1 -0
- package/dist/venetian-blinds.d.ts +8 -8
- package/dist/vibrance.d.ts +1 -1
- package/dist/vignette.d.ts +16 -16
- package/dist/visual-test/visual-utils.d.ts +8 -8
- package/dist/wave/index.d.ts +1 -1
- package/dist/waves.d.ts +24 -24
- package/dist/webgpu-projection-runtime.d.ts +24 -0
- package/dist/white-balance.d.ts +1 -1
- package/dist/white-noise.d.ts +1 -1
- package/dist/zigzag.d.ts +22 -22
- package/dist/zoom-blur/index.d.ts +1 -1
- package/package.json +71 -6
|
@@ -0,0 +1,688 @@
|
|
|
1
|
+
// src/fractal-noise/index.ts
|
|
2
|
+
import { Internals } from "remotion";
|
|
3
|
+
|
|
4
|
+
// src/validate-effect-param.ts
|
|
5
|
+
var assertEffectParamsObject = (params, effectLabel) => {
|
|
6
|
+
if (params === null || typeof params !== "object") {
|
|
7
|
+
throw new TypeError(`${effectLabel} effect requires a parameters object, but got ${JSON.stringify(params)}`);
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
var assertRequiredFiniteNumber = (value, name) => {
|
|
11
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
12
|
+
throw new TypeError(`"${name}" must be a finite number, but got ${JSON.stringify(value)}`);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
var assertRequiredColor = (value, name) => {
|
|
16
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
17
|
+
throw new TypeError(`"${name}" must be a non-empty string, but got ${JSON.stringify(value)}`);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
var assertOptionalColor = (value, name) => {
|
|
21
|
+
if (value === undefined) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
assertRequiredColor(value, name);
|
|
25
|
+
};
|
|
26
|
+
var assertOptionalBoolean = (value, name) => {
|
|
27
|
+
if (value === undefined) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (typeof value !== "boolean") {
|
|
31
|
+
throw new TypeError(`"${name}" must be a boolean, but got ${JSON.stringify(value)}`);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
// src/color-utils.ts
|
|
36
|
+
var DEFAULT_AMOUNT = 1;
|
|
37
|
+
var DEFAULT_BRIGHTNESS_AMOUNT = 0;
|
|
38
|
+
var DEFAULT_HUE_DEGREES = 0;
|
|
39
|
+
var colorAmountSchema = {
|
|
40
|
+
type: "number",
|
|
41
|
+
min: 0,
|
|
42
|
+
max: 1,
|
|
43
|
+
step: 0.01,
|
|
44
|
+
default: DEFAULT_AMOUNT,
|
|
45
|
+
description: "Amount",
|
|
46
|
+
hiddenFromList: false
|
|
47
|
+
};
|
|
48
|
+
var colorMultiplierSchema = {
|
|
49
|
+
type: "number",
|
|
50
|
+
min: 0,
|
|
51
|
+
step: 0.01,
|
|
52
|
+
default: DEFAULT_AMOUNT,
|
|
53
|
+
description: "Amount",
|
|
54
|
+
hiddenFromList: false
|
|
55
|
+
};
|
|
56
|
+
var brightnessAmountSchema = {
|
|
57
|
+
type: "number",
|
|
58
|
+
min: -1,
|
|
59
|
+
max: 1,
|
|
60
|
+
step: 0.01,
|
|
61
|
+
default: DEFAULT_BRIGHTNESS_AMOUNT,
|
|
62
|
+
description: "Amount",
|
|
63
|
+
hiddenFromList: false
|
|
64
|
+
};
|
|
65
|
+
var hueDegreesSchema = {
|
|
66
|
+
type: "rotation-degrees",
|
|
67
|
+
step: 1,
|
|
68
|
+
default: DEFAULT_HUE_DEGREES,
|
|
69
|
+
description: "Degrees"
|
|
70
|
+
};
|
|
71
|
+
var assertOptionalFiniteNumber = (value, name) => {
|
|
72
|
+
if (value === undefined) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
assertRequiredFiniteNumber(value, name);
|
|
76
|
+
};
|
|
77
|
+
var validateUnitInterval = (value, name) => {
|
|
78
|
+
if (value < 0) {
|
|
79
|
+
throw new TypeError(`"${name}" must be >= 0, but got ${JSON.stringify(value)}`);
|
|
80
|
+
}
|
|
81
|
+
if (value > 1) {
|
|
82
|
+
throw new TypeError(`"${name}" must be <= 1, but got ${JSON.stringify(value)}`);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
var validateNonNegative = (value, name) => {
|
|
86
|
+
if (value < 0) {
|
|
87
|
+
throw new TypeError(`"${name}" must be >= 0, but got ${JSON.stringify(value)}`);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
var validateSignedUnitInterval = (value, name) => {
|
|
91
|
+
if (value < -1) {
|
|
92
|
+
throw new TypeError(`"${name}" must be >= -1, but got ${JSON.stringify(value)}`);
|
|
93
|
+
}
|
|
94
|
+
if (value > 1) {
|
|
95
|
+
throw new TypeError(`"${name}" must be <= 1, but got ${JSON.stringify(value)}`);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
var clampColorChannel = (value) => {
|
|
99
|
+
return Math.max(0, Math.min(255, value));
|
|
100
|
+
};
|
|
101
|
+
var parseColorRgba = (ctx, color) => {
|
|
102
|
+
ctx.clearRect(0, 0, 1, 1);
|
|
103
|
+
ctx.fillStyle = color;
|
|
104
|
+
ctx.fillRect(0, 0, 1, 1);
|
|
105
|
+
const { data } = ctx.getImageData(0, 0, 1, 1);
|
|
106
|
+
return [data[0], data[1], data[2], data[3]];
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// src/value-noise-shader.ts
|
|
110
|
+
var VALUE_NOISE_SHADER = `
|
|
111
|
+
float lattice(ivec3 point, uint seed) {
|
|
112
|
+
// Wrap lattice indices as well as coordinates so interpolation stays continuous
|
|
113
|
+
// across the period boundary, including negative coordinates.
|
|
114
|
+
uvec3 p = uvec3(point) & uvec3(65535u);
|
|
115
|
+
uint h = p.x * 0x27d4eb2du ^ p.y * 0x165667b1u ^ p.z * 0x9e3779b9u ^ seed * 0x85ebca6bu;
|
|
116
|
+
h ^= h >> 15;
|
|
117
|
+
h *= 0x2c1b3c6du;
|
|
118
|
+
h ^= h >> 12;
|
|
119
|
+
h *= 0x297a2d39u;
|
|
120
|
+
h ^= h >> 15;
|
|
121
|
+
return float(h & 65535u) / 65535.0;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
float catmull(vec4 p, float t) {
|
|
125
|
+
return 0.5 * (2.0 * p.y + (p.z - p.x) * t
|
|
126
|
+
+ (2.0 * p.x - 5.0 * p.y + 4.0 * p.z - p.w) * t * t
|
|
127
|
+
+ (3.0 * p.y - p.x - 3.0 * p.z + p.w) * t * t * t);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
vec3 bspline(float t) {
|
|
131
|
+
return vec3(0.5 * (1.0-t) * (1.0-t), 0.5 + t * (1.0-t), 0.5 * t * t);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
float sliceNoise(ivec3 p, vec2 t, uint seed) {
|
|
135
|
+
if (uNoiseType == 0) return lattice(p, seed);
|
|
136
|
+
if (uNoiseType == 1) {
|
|
137
|
+
return mix(mix(lattice(p, seed), lattice(p + ivec3(1,0,0), seed), t.x),
|
|
138
|
+
mix(lattice(p + ivec3(0,1,0), seed), lattice(p + ivec3(1,1,0), seed), t.x), t.y);
|
|
139
|
+
}
|
|
140
|
+
if (uNoiseType == 2) {
|
|
141
|
+
vec3 wx = bspline(t.x);
|
|
142
|
+
vec3 wy = bspline(t.y);
|
|
143
|
+
float result = 0.0;
|
|
144
|
+
for (int y = 0; y < 3; y++) {
|
|
145
|
+
for (int x = 0; x < 3; x++) {
|
|
146
|
+
result += wx[x] * wy[y] * lattice(p + ivec3(x-1, y-1, 0), seed);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return result;
|
|
150
|
+
}
|
|
151
|
+
vec4 rows;
|
|
152
|
+
for (int y = 0; y < 4; y++) {
|
|
153
|
+
vec4 row;
|
|
154
|
+
for (int x = 0; x < 4; x++) {
|
|
155
|
+
row[x] = lattice(p + ivec3(x-1, y-1, 0), seed);
|
|
156
|
+
}
|
|
157
|
+
rows[y] = catmull(row, t.x);
|
|
158
|
+
}
|
|
159
|
+
return catmull(rows, t.y);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
float valueNoise(vec3 point, uint seed) {
|
|
163
|
+
// A large period keeps conversion to integer coordinates defined at extreme scales.
|
|
164
|
+
vec3 p = mod(point + vec3(uNoiseType == 2 ? 0.5 : 0.0, uNoiseType == 2 ? 0.5 : 0.0, 0.0), 65536.0);
|
|
165
|
+
ivec3 cell = ivec3(floor(p));
|
|
166
|
+
vec3 t = fract(p);
|
|
167
|
+
float fz = t.z * t.z * t.z * (t.z * (t.z * 6.0 - 15.0) + 10.0);
|
|
168
|
+
float n = mix(sliceNoise(cell, t.xy, seed), sliceNoise(cell + ivec3(0,0,1), t.xy, seed), fz);
|
|
169
|
+
return uNoiseType == 2 ? 0.5 + (n - 0.5) * (181.0 / 231.0) / 0.55 : n;
|
|
170
|
+
}
|
|
171
|
+
`;
|
|
172
|
+
|
|
173
|
+
// src/fractal-noise/shader.ts
|
|
174
|
+
var FRACTAL_NOISE_FRAGMENT_SHADER = `#version 300 es
|
|
175
|
+
precision highp float;
|
|
176
|
+
precision highp int;
|
|
177
|
+
|
|
178
|
+
in vec2 vUv;
|
|
179
|
+
out vec4 fragColor;
|
|
180
|
+
uniform sampler2D uSource;
|
|
181
|
+
uniform vec2 uResolution;
|
|
182
|
+
uniform vec2 uOffset;
|
|
183
|
+
uniform float uScale;
|
|
184
|
+
uniform float uComplexity;
|
|
185
|
+
uniform float uEvolution;
|
|
186
|
+
uniform float uSubInfluence;
|
|
187
|
+
uniform float uSubScaling;
|
|
188
|
+
uniform float uContrast;
|
|
189
|
+
uniform float uBrightness;
|
|
190
|
+
uniform float uAmount;
|
|
191
|
+
uniform float uCycle;
|
|
192
|
+
uniform uint uSeed;
|
|
193
|
+
uniform int uFractalType;
|
|
194
|
+
uniform int uNoiseType;
|
|
195
|
+
uniform bool uInvert;
|
|
196
|
+
uniform bool uCycleEvolution;
|
|
197
|
+
|
|
198
|
+
${VALUE_NOISE_SHADER}
|
|
199
|
+
|
|
200
|
+
float layer(vec2 p, float z, uint seed) {
|
|
201
|
+
if (!uCycleEvolution) return valueNoise(vec3(p, uEvolution + z), seed);
|
|
202
|
+
float t = mod(uEvolution, uCycle);
|
|
203
|
+
return mix(valueNoise(vec3(p, t + z), seed), valueNoise(vec3(p, t - uCycle + z), seed), t / uCycle);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
float shape(float n) {
|
|
207
|
+
float s = 2.0 * n - 1.0;
|
|
208
|
+
if (uFractalType == 1) return 1.0 - s * s;
|
|
209
|
+
if (uFractalType == 2) return 1.0 - abs(s);
|
|
210
|
+
if (uFractalType == 3) return (1.0 - abs(s)) * (1.0 - abs(s));
|
|
211
|
+
if (uFractalType == 8) {
|
|
212
|
+
float distance = clamp(abs(s) / 0.12, 0.0, 1.0);
|
|
213
|
+
return 1.0 - distance * distance;
|
|
214
|
+
}
|
|
215
|
+
return n;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
void main() {
|
|
219
|
+
vec4 source = texture(uSource, vUv);
|
|
220
|
+
if (source.a == 0.0 || uAmount == 0.0) {
|
|
221
|
+
fragColor = source;
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
vec2 pixel = vec2(vUv.x, 1.0 - vUv.y) * uResolution;
|
|
225
|
+
vec2 base = (pixel - uResolution * 0.5 - uOffset) / uScale;
|
|
226
|
+
float sum = 0.0;
|
|
227
|
+
float norm = 0.0;
|
|
228
|
+
float amplitude = 1.0;
|
|
229
|
+
float frequency = 1.0;
|
|
230
|
+
float best = 0.0;
|
|
231
|
+
for (int octave = 0; octave < 20; octave++) {
|
|
232
|
+
float weight = clamp(uComplexity - float(octave), 0.0, 1.0);
|
|
233
|
+
if (weight == 0.0 || amplitude == 0.0) break;
|
|
234
|
+
vec2 p = base * frequency;
|
|
235
|
+
float z = float(octave) * 7.31;
|
|
236
|
+
uint seed = (uSeed ^ 0x51edu) + uint(octave);
|
|
237
|
+
if (uFractalType >= 4 && uFractalType <= 6) {
|
|
238
|
+
float a = layer(p * 0.5, z + 3.1, seed ^ 0x55u) - 0.5;
|
|
239
|
+
if (uFractalType == 5) {
|
|
240
|
+
float angle = a * 3.0;
|
|
241
|
+
p = mat2(cos(angle), sin(angle), -sin(angle), cos(angle)) * p;
|
|
242
|
+
} else {
|
|
243
|
+
float b = layer(p * 0.5, z + 5.7, seed ^ 0xaau) - 0.5;
|
|
244
|
+
float strength = uFractalType == 6 ? 0.5 + float(octave) * 0.35 : 1.0;
|
|
245
|
+
p += vec2(a, b) * 1.5 * strength;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
float n = shape(layer(p, z, seed));
|
|
249
|
+
// Fade fractional octaves in for Max too, so animating complexity is continuous.
|
|
250
|
+
best = max(best, n * amplitude * weight);
|
|
251
|
+
sum += n * amplitude * weight;
|
|
252
|
+
norm += amplitude * weight;
|
|
253
|
+
amplitude *= uSubInfluence;
|
|
254
|
+
frequency /= uSubScaling;
|
|
255
|
+
}
|
|
256
|
+
float noise = uFractalType == 7 ? best : sum / norm;
|
|
257
|
+
noise = clamp((noise - 0.5) * uContrast + 0.5 + uBrightness, 0.0, 1.0);
|
|
258
|
+
if (uInvert) noise = 1.0 - noise;
|
|
259
|
+
fragColor = vec4(mix(source.rgb, vec3(noise) * source.a, uAmount), source.a);
|
|
260
|
+
}
|
|
261
|
+
`;
|
|
262
|
+
|
|
263
|
+
// src/fractal-noise/index.ts
|
|
264
|
+
var { createEffect, createWebGL2ContextError } = Internals;
|
|
265
|
+
var DEFAULT_FRACTAL_TYPE = "basic";
|
|
266
|
+
var DEFAULT_NOISE_TYPE = "soft-linear";
|
|
267
|
+
var DEFAULT_SCALE = 100;
|
|
268
|
+
var DEFAULT_COMPLEXITY = 6;
|
|
269
|
+
var DEFAULT_EVOLUTION = 0;
|
|
270
|
+
var DEFAULT_CONTRAST = 1;
|
|
271
|
+
var DEFAULT_BRIGHTNESS = 0;
|
|
272
|
+
var DEFAULT_OFFSET_X = 0;
|
|
273
|
+
var DEFAULT_OFFSET_Y = 0;
|
|
274
|
+
var DEFAULT_SUB_INFLUENCE = 0.7;
|
|
275
|
+
var DEFAULT_SUB_SCALING = 0.56;
|
|
276
|
+
var DEFAULT_CYCLE_EVOLUTION = false;
|
|
277
|
+
var DEFAULT_CYCLE = 1;
|
|
278
|
+
var DEFAULT_SEED = 0;
|
|
279
|
+
var DEFAULT_INVERT = false;
|
|
280
|
+
var DEFAULT_AMOUNT2 = 1;
|
|
281
|
+
var FRACTAL_TYPES = [
|
|
282
|
+
"basic",
|
|
283
|
+
"turbulent-smooth",
|
|
284
|
+
"turbulent-basic",
|
|
285
|
+
"turbulent-sharp",
|
|
286
|
+
"dynamic",
|
|
287
|
+
"dynamic-twist",
|
|
288
|
+
"dynamic-progressive",
|
|
289
|
+
"max",
|
|
290
|
+
"strings"
|
|
291
|
+
];
|
|
292
|
+
var NOISE_TYPES = ["block", "linear", "soft-linear", "spline"];
|
|
293
|
+
var fractalNoiseSchema = {
|
|
294
|
+
fractalType: {
|
|
295
|
+
type: "enum",
|
|
296
|
+
variants: {
|
|
297
|
+
basic: {},
|
|
298
|
+
"turbulent-smooth": {},
|
|
299
|
+
"turbulent-basic": {},
|
|
300
|
+
"turbulent-sharp": {},
|
|
301
|
+
dynamic: {},
|
|
302
|
+
"dynamic-twist": {},
|
|
303
|
+
"dynamic-progressive": {},
|
|
304
|
+
max: {},
|
|
305
|
+
strings: {}
|
|
306
|
+
},
|
|
307
|
+
default: DEFAULT_FRACTAL_TYPE,
|
|
308
|
+
description: "Fractal type"
|
|
309
|
+
},
|
|
310
|
+
noiseType: {
|
|
311
|
+
type: "enum",
|
|
312
|
+
variants: {
|
|
313
|
+
block: {},
|
|
314
|
+
linear: {},
|
|
315
|
+
"soft-linear": {},
|
|
316
|
+
spline: {}
|
|
317
|
+
},
|
|
318
|
+
default: DEFAULT_NOISE_TYPE,
|
|
319
|
+
description: "Noise type"
|
|
320
|
+
},
|
|
321
|
+
scale: {
|
|
322
|
+
type: "number",
|
|
323
|
+
min: 1,
|
|
324
|
+
max: 1000,
|
|
325
|
+
step: 1,
|
|
326
|
+
default: DEFAULT_SCALE,
|
|
327
|
+
description: "Scale",
|
|
328
|
+
hiddenFromList: false
|
|
329
|
+
},
|
|
330
|
+
complexity: {
|
|
331
|
+
type: "number",
|
|
332
|
+
min: 1,
|
|
333
|
+
max: 20,
|
|
334
|
+
step: 0.1,
|
|
335
|
+
default: DEFAULT_COMPLEXITY,
|
|
336
|
+
description: "Complexity",
|
|
337
|
+
hiddenFromList: false
|
|
338
|
+
},
|
|
339
|
+
evolution: {
|
|
340
|
+
type: "rotation-degrees",
|
|
341
|
+
step: 1,
|
|
342
|
+
default: DEFAULT_EVOLUTION,
|
|
343
|
+
description: "Evolution"
|
|
344
|
+
},
|
|
345
|
+
contrast: {
|
|
346
|
+
type: "number",
|
|
347
|
+
min: 0,
|
|
348
|
+
max: 10,
|
|
349
|
+
step: 0.01,
|
|
350
|
+
default: DEFAULT_CONTRAST,
|
|
351
|
+
description: "Contrast",
|
|
352
|
+
hiddenFromList: false
|
|
353
|
+
},
|
|
354
|
+
brightness: {
|
|
355
|
+
type: "number",
|
|
356
|
+
min: -1,
|
|
357
|
+
max: 1,
|
|
358
|
+
step: 0.01,
|
|
359
|
+
default: DEFAULT_BRIGHTNESS,
|
|
360
|
+
description: "Brightness",
|
|
361
|
+
hiddenFromList: false
|
|
362
|
+
},
|
|
363
|
+
offsetX: {
|
|
364
|
+
type: "number",
|
|
365
|
+
step: 1,
|
|
366
|
+
default: DEFAULT_OFFSET_X,
|
|
367
|
+
description: "Offset X",
|
|
368
|
+
hiddenFromList: false
|
|
369
|
+
},
|
|
370
|
+
offsetY: {
|
|
371
|
+
type: "number",
|
|
372
|
+
step: 1,
|
|
373
|
+
default: DEFAULT_OFFSET_Y,
|
|
374
|
+
description: "Offset Y",
|
|
375
|
+
hiddenFromList: false
|
|
376
|
+
},
|
|
377
|
+
subInfluence: {
|
|
378
|
+
type: "number",
|
|
379
|
+
min: 0,
|
|
380
|
+
max: 1,
|
|
381
|
+
step: 0.01,
|
|
382
|
+
default: DEFAULT_SUB_INFLUENCE,
|
|
383
|
+
description: "Sub influence",
|
|
384
|
+
hiddenFromList: false
|
|
385
|
+
},
|
|
386
|
+
subScaling: {
|
|
387
|
+
type: "number",
|
|
388
|
+
min: 0.1,
|
|
389
|
+
max: 1,
|
|
390
|
+
step: 0.01,
|
|
391
|
+
default: DEFAULT_SUB_SCALING,
|
|
392
|
+
description: "Sub scaling",
|
|
393
|
+
hiddenFromList: false
|
|
394
|
+
},
|
|
395
|
+
cycleEvolution: {
|
|
396
|
+
type: "boolean",
|
|
397
|
+
default: DEFAULT_CYCLE_EVOLUTION,
|
|
398
|
+
description: "Cycle evolution"
|
|
399
|
+
},
|
|
400
|
+
cycle: {
|
|
401
|
+
type: "number",
|
|
402
|
+
min: 1,
|
|
403
|
+
max: 100,
|
|
404
|
+
step: 1,
|
|
405
|
+
integer: true,
|
|
406
|
+
default: DEFAULT_CYCLE,
|
|
407
|
+
description: "Cycle length",
|
|
408
|
+
hiddenFromList: false
|
|
409
|
+
},
|
|
410
|
+
seed: {
|
|
411
|
+
type: "number",
|
|
412
|
+
min: 0,
|
|
413
|
+
max: 4294967295,
|
|
414
|
+
step: 1,
|
|
415
|
+
integer: true,
|
|
416
|
+
default: DEFAULT_SEED,
|
|
417
|
+
description: "Seed",
|
|
418
|
+
hiddenFromList: false
|
|
419
|
+
},
|
|
420
|
+
invert: {
|
|
421
|
+
type: "boolean",
|
|
422
|
+
default: DEFAULT_INVERT,
|
|
423
|
+
description: "Invert"
|
|
424
|
+
},
|
|
425
|
+
amount: {
|
|
426
|
+
type: "number",
|
|
427
|
+
min: 0,
|
|
428
|
+
max: 1,
|
|
429
|
+
step: 0.01,
|
|
430
|
+
default: DEFAULT_AMOUNT2,
|
|
431
|
+
description: "Amount",
|
|
432
|
+
hiddenFromList: false
|
|
433
|
+
}
|
|
434
|
+
};
|
|
435
|
+
var resolve = (params) => ({
|
|
436
|
+
fractalType: params.fractalType ?? DEFAULT_FRACTAL_TYPE,
|
|
437
|
+
noiseType: params.noiseType ?? DEFAULT_NOISE_TYPE,
|
|
438
|
+
scale: params.scale ?? DEFAULT_SCALE,
|
|
439
|
+
complexity: params.complexity ?? DEFAULT_COMPLEXITY,
|
|
440
|
+
evolution: params.evolution ?? DEFAULT_EVOLUTION,
|
|
441
|
+
contrast: params.contrast ?? DEFAULT_CONTRAST,
|
|
442
|
+
brightness: params.brightness ?? DEFAULT_BRIGHTNESS,
|
|
443
|
+
offsetX: params.offsetX ?? DEFAULT_OFFSET_X,
|
|
444
|
+
offsetY: params.offsetY ?? DEFAULT_OFFSET_Y,
|
|
445
|
+
subInfluence: params.subInfluence ?? DEFAULT_SUB_INFLUENCE,
|
|
446
|
+
subScaling: params.subScaling ?? DEFAULT_SUB_SCALING,
|
|
447
|
+
cycleEvolution: params.cycleEvolution ?? DEFAULT_CYCLE_EVOLUTION,
|
|
448
|
+
cycle: params.cycle ?? DEFAULT_CYCLE,
|
|
449
|
+
seed: params.seed ?? DEFAULT_SEED,
|
|
450
|
+
invert: params.invert ?? DEFAULT_INVERT,
|
|
451
|
+
amount: params.amount ?? DEFAULT_AMOUNT2
|
|
452
|
+
});
|
|
453
|
+
var validateFractalNoiseParams = (params) => {
|
|
454
|
+
assertEffectParamsObject(params, "Fractal noise");
|
|
455
|
+
assertOptionalFiniteNumber(params.scale, "scale");
|
|
456
|
+
assertOptionalFiniteNumber(params.complexity, "complexity");
|
|
457
|
+
assertOptionalFiniteNumber(params.evolution, "evolution");
|
|
458
|
+
assertOptionalFiniteNumber(params.contrast, "contrast");
|
|
459
|
+
assertOptionalFiniteNumber(params.brightness, "brightness");
|
|
460
|
+
assertOptionalFiniteNumber(params.offsetX, "offsetX");
|
|
461
|
+
assertOptionalFiniteNumber(params.offsetY, "offsetY");
|
|
462
|
+
assertOptionalFiniteNumber(params.subInfluence, "subInfluence");
|
|
463
|
+
assertOptionalFiniteNumber(params.subScaling, "subScaling");
|
|
464
|
+
assertOptionalBoolean(params.cycleEvolution, "cycleEvolution");
|
|
465
|
+
assertOptionalFiniteNumber(params.cycle, "cycle");
|
|
466
|
+
assertOptionalFiniteNumber(params.seed, "seed");
|
|
467
|
+
assertOptionalBoolean(params.invert, "invert");
|
|
468
|
+
assertOptionalFiniteNumber(params.amount, "amount");
|
|
469
|
+
const r = resolve(params);
|
|
470
|
+
if (params.fractalType !== undefined && !FRACTAL_TYPES.includes(params.fractalType)) {
|
|
471
|
+
throw new TypeError("Invalid fractalType: " + JSON.stringify(params.fractalType));
|
|
472
|
+
}
|
|
473
|
+
if (params.noiseType !== undefined && !NOISE_TYPES.includes(params.noiseType)) {
|
|
474
|
+
throw new TypeError("Invalid noiseType: " + JSON.stringify(params.noiseType));
|
|
475
|
+
}
|
|
476
|
+
if (r.scale < 1)
|
|
477
|
+
throw new TypeError('"scale" must be at least 1');
|
|
478
|
+
if (r.complexity < 1 || r.complexity > 20)
|
|
479
|
+
throw new TypeError('"complexity" must be between 1 and 20');
|
|
480
|
+
if (r.subScaling < 0.1 || r.subScaling > 1)
|
|
481
|
+
throw new TypeError('"subScaling" must be between 0.1 and 1');
|
|
482
|
+
if (!Number.isInteger(r.cycle) || r.cycle < 1 || r.cycle > 65535)
|
|
483
|
+
throw new TypeError('"cycle" must be an integer between 1 and 65535');
|
|
484
|
+
if (!Number.isInteger(r.seed) || r.seed < 0 || r.seed > 4294967295)
|
|
485
|
+
throw new TypeError('"seed" must be an unsigned 32-bit integer');
|
|
486
|
+
validateNonNegative(r.contrast, "contrast");
|
|
487
|
+
validateUnitInterval(r.subInfluence, "subInfluence");
|
|
488
|
+
validateUnitInterval(r.amount, "amount");
|
|
489
|
+
};
|
|
490
|
+
var VERTEX_SHADER = `#version 300 es
|
|
491
|
+
in vec2 aPos;
|
|
492
|
+
in vec2 aUv;
|
|
493
|
+
out vec2 vUv;
|
|
494
|
+
|
|
495
|
+
void main() {
|
|
496
|
+
vUv = aUv;
|
|
497
|
+
gl_Position = vec4(aPos, 0.0, 1.0);
|
|
498
|
+
}
|
|
499
|
+
`;
|
|
500
|
+
var compileShader = (gl, type, source) => {
|
|
501
|
+
const shader = gl.createShader(type);
|
|
502
|
+
if (!shader) {
|
|
503
|
+
throw new Error("Failed to create WebGL shader");
|
|
504
|
+
}
|
|
505
|
+
gl.shaderSource(shader, source);
|
|
506
|
+
gl.compileShader(shader);
|
|
507
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
508
|
+
const log = gl.getShaderInfoLog(shader);
|
|
509
|
+
gl.deleteShader(shader);
|
|
510
|
+
throw new Error(`FractalNoise shader compile failed: ${log ?? "(no log)"}`);
|
|
511
|
+
}
|
|
512
|
+
return shader;
|
|
513
|
+
};
|
|
514
|
+
var linkProgram = (gl, vs, fs) => {
|
|
515
|
+
const program = gl.createProgram();
|
|
516
|
+
if (!program) {
|
|
517
|
+
throw new Error("Failed to create WebGL program");
|
|
518
|
+
}
|
|
519
|
+
gl.attachShader(program, vs);
|
|
520
|
+
gl.attachShader(program, fs);
|
|
521
|
+
gl.linkProgram(program);
|
|
522
|
+
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
523
|
+
const log = gl.getProgramInfoLog(program);
|
|
524
|
+
gl.deleteProgram(program);
|
|
525
|
+
throw new Error(`FractalNoise program link failed: ${log ?? "(no log)"}`);
|
|
526
|
+
}
|
|
527
|
+
return program;
|
|
528
|
+
};
|
|
529
|
+
var setupFractalNoise = (target) => {
|
|
530
|
+
const gl = target.getContext("webgl2", {
|
|
531
|
+
premultipliedAlpha: true,
|
|
532
|
+
alpha: true,
|
|
533
|
+
preserveDrawingBuffer: true
|
|
534
|
+
});
|
|
535
|
+
if (!gl) {
|
|
536
|
+
throw createWebGL2ContextError("fractal noise effect");
|
|
537
|
+
}
|
|
538
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
|
|
539
|
+
const vs = compileShader(gl, gl.VERTEX_SHADER, VERTEX_SHADER);
|
|
540
|
+
const fs = compileShader(gl, gl.FRAGMENT_SHADER, FRACTAL_NOISE_FRAGMENT_SHADER);
|
|
541
|
+
const program = linkProgram(gl, vs, fs);
|
|
542
|
+
gl.deleteShader(vs);
|
|
543
|
+
gl.deleteShader(fs);
|
|
544
|
+
const vao = gl.createVertexArray();
|
|
545
|
+
if (!vao) {
|
|
546
|
+
throw new Error("Failed to create WebGL vertex array");
|
|
547
|
+
}
|
|
548
|
+
gl.bindVertexArray(vao);
|
|
549
|
+
const data = new Float32Array([
|
|
550
|
+
-1,
|
|
551
|
+
-1,
|
|
552
|
+
0,
|
|
553
|
+
0,
|
|
554
|
+
1,
|
|
555
|
+
-1,
|
|
556
|
+
1,
|
|
557
|
+
0,
|
|
558
|
+
-1,
|
|
559
|
+
1,
|
|
560
|
+
0,
|
|
561
|
+
1,
|
|
562
|
+
1,
|
|
563
|
+
1,
|
|
564
|
+
1,
|
|
565
|
+
1
|
|
566
|
+
]);
|
|
567
|
+
const vbo = gl.createBuffer();
|
|
568
|
+
if (!vbo) {
|
|
569
|
+
throw new Error("Failed to create WebGL buffer");
|
|
570
|
+
}
|
|
571
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
|
|
572
|
+
gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
|
|
573
|
+
const aPos = gl.getAttribLocation(program, "aPos");
|
|
574
|
+
const aUv = gl.getAttribLocation(program, "aUv");
|
|
575
|
+
gl.enableVertexAttribArray(aPos);
|
|
576
|
+
gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 16, 0);
|
|
577
|
+
gl.enableVertexAttribArray(aUv);
|
|
578
|
+
gl.vertexAttribPointer(aUv, 2, gl.FLOAT, false, 16, 8);
|
|
579
|
+
gl.bindVertexArray(null);
|
|
580
|
+
const texture = gl.createTexture();
|
|
581
|
+
if (!texture) {
|
|
582
|
+
throw new Error("Failed to create WebGL texture");
|
|
583
|
+
}
|
|
584
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
585
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
586
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
587
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
588
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
589
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
590
|
+
return {
|
|
591
|
+
gl,
|
|
592
|
+
program,
|
|
593
|
+
vao,
|
|
594
|
+
vbo,
|
|
595
|
+
texture,
|
|
596
|
+
uSource: gl.getUniformLocation(program, "uSource"),
|
|
597
|
+
uResolution: gl.getUniformLocation(program, "uResolution"),
|
|
598
|
+
uOffset: gl.getUniformLocation(program, "uOffset"),
|
|
599
|
+
uFractalType: gl.getUniformLocation(program, "uFractalType"),
|
|
600
|
+
uNoiseType: gl.getUniformLocation(program, "uNoiseType"),
|
|
601
|
+
uScale: gl.getUniformLocation(program, "uScale"),
|
|
602
|
+
uComplexity: gl.getUniformLocation(program, "uComplexity"),
|
|
603
|
+
uEvolution: gl.getUniformLocation(program, "uEvolution"),
|
|
604
|
+
uContrast: gl.getUniformLocation(program, "uContrast"),
|
|
605
|
+
uBrightness: gl.getUniformLocation(program, "uBrightness"),
|
|
606
|
+
uSubInfluence: gl.getUniformLocation(program, "uSubInfluence"),
|
|
607
|
+
uSubScaling: gl.getUniformLocation(program, "uSubScaling"),
|
|
608
|
+
uCycleEvolution: gl.getUniformLocation(program, "uCycleEvolution"),
|
|
609
|
+
uCycle: gl.getUniformLocation(program, "uCycle"),
|
|
610
|
+
uSeed: gl.getUniformLocation(program, "uSeed"),
|
|
611
|
+
uInvert: gl.getUniformLocation(program, "uInvert"),
|
|
612
|
+
uAmount: gl.getUniformLocation(program, "uAmount")
|
|
613
|
+
};
|
|
614
|
+
};
|
|
615
|
+
var fractalNoise = createEffect({
|
|
616
|
+
type: "remotion/fractal-noise",
|
|
617
|
+
label: "fractalNoise()",
|
|
618
|
+
documentationLink: "https://www.remotion.dev/docs/effects/fractal-noise",
|
|
619
|
+
backend: "webgl2",
|
|
620
|
+
calculateKey: (params) => {
|
|
621
|
+
const r = resolve(params);
|
|
622
|
+
return `fractal-noise-${JSON.stringify(r)}`;
|
|
623
|
+
},
|
|
624
|
+
setup: (target) => setupFractalNoise(target),
|
|
625
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
626
|
+
const r = resolve(params);
|
|
627
|
+
const { gl, program, texture, vao } = state;
|
|
628
|
+
gl.viewport(0, 0, width, height);
|
|
629
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
630
|
+
gl.clearColor(0, 0, 0, 0);
|
|
631
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
632
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
633
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
634
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
635
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
636
|
+
gl.useProgram(program);
|
|
637
|
+
if (state.uSource)
|
|
638
|
+
gl.uniform1i(state.uSource, 0);
|
|
639
|
+
if (state.uResolution)
|
|
640
|
+
gl.uniform2f(state.uResolution, width, height);
|
|
641
|
+
if (state.uOffset)
|
|
642
|
+
gl.uniform2f(state.uOffset, r.offsetX, r.offsetY);
|
|
643
|
+
if (state.uFractalType)
|
|
644
|
+
gl.uniform1i(state.uFractalType, FRACTAL_TYPES.indexOf(r.fractalType));
|
|
645
|
+
if (state.uNoiseType)
|
|
646
|
+
gl.uniform1i(state.uNoiseType, NOISE_TYPES.indexOf(r.noiseType));
|
|
647
|
+
if (state.uScale)
|
|
648
|
+
gl.uniform1f(state.uScale, r.scale);
|
|
649
|
+
if (state.uComplexity)
|
|
650
|
+
gl.uniform1f(state.uComplexity, r.complexity);
|
|
651
|
+
if (state.uEvolution)
|
|
652
|
+
gl.uniform1f(state.uEvolution, r.evolution / 360);
|
|
653
|
+
if (state.uContrast)
|
|
654
|
+
gl.uniform1f(state.uContrast, r.contrast);
|
|
655
|
+
if (state.uBrightness)
|
|
656
|
+
gl.uniform1f(state.uBrightness, r.brightness);
|
|
657
|
+
if (state.uSubInfluence)
|
|
658
|
+
gl.uniform1f(state.uSubInfluence, r.subInfluence);
|
|
659
|
+
if (state.uSubScaling)
|
|
660
|
+
gl.uniform1f(state.uSubScaling, r.subScaling);
|
|
661
|
+
if (state.uCycleEvolution)
|
|
662
|
+
gl.uniform1i(state.uCycleEvolution, r.cycleEvolution ? 1 : 0);
|
|
663
|
+
if (state.uCycle)
|
|
664
|
+
gl.uniform1f(state.uCycle, r.cycle);
|
|
665
|
+
if (state.uSeed)
|
|
666
|
+
gl.uniform1ui(state.uSeed, r.seed);
|
|
667
|
+
if (state.uInvert)
|
|
668
|
+
gl.uniform1i(state.uInvert, r.invert ? 1 : 0);
|
|
669
|
+
if (state.uAmount)
|
|
670
|
+
gl.uniform1f(state.uAmount, r.amount);
|
|
671
|
+
gl.bindVertexArray(vao);
|
|
672
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
673
|
+
gl.bindVertexArray(null);
|
|
674
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
675
|
+
gl.useProgram(null);
|
|
676
|
+
},
|
|
677
|
+
cleanup: ({ gl, program, vao, vbo, texture }) => {
|
|
678
|
+
gl.deleteTexture(texture);
|
|
679
|
+
gl.deleteBuffer(vbo);
|
|
680
|
+
gl.deleteProgram(program);
|
|
681
|
+
gl.deleteVertexArray(vao);
|
|
682
|
+
},
|
|
683
|
+
schema: fractalNoiseSchema,
|
|
684
|
+
validateParams: validateFractalNoiseParams
|
|
685
|
+
});
|
|
686
|
+
export {
|
|
687
|
+
fractalNoise
|
|
688
|
+
};
|