@remotion/effects 4.0.538 → 4.0.540
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 +19 -0
- package/dist/barrel-distortion/webgpu-shader.d.ts +1 -0
- package/dist/bevel-alpha/webgpu-shaders.d.ts +2 -0
- package/dist/burlap-webgpu-shader.d.ts +1 -0
- package/dist/checkerboard-webgpu-shader.d.ts +1 -0
- package/dist/chromatic-aberration/webgpu-shader.d.ts +1 -0
- package/dist/color-correction-webgpu-shader-utils.d.ts +4 -0
- package/dist/color-key-webgpu-shader.d.ts +1 -0
- package/dist/color-matrix-runtime.d.ts +4 -0
- package/dist/contour-lines-webgpu-shader.d.ts +1 -0
- package/dist/corner-pin/webgpu-shader.d.ts +1 -0
- package/dist/curves.d.ts +65 -0
- package/dist/cylinder/webgl-shader.d.ts +1 -0
- package/dist/dot-grid-webgpu-shader.d.ts +1 -0
- package/dist/drop-shadow/webgpu-shaders.d.ts +2 -0
- package/dist/emboss-webgpu-shader.d.ts +1 -0
- package/dist/esm/barrel-distortion.mjs +67 -118
- package/dist/esm/bevel-alpha.mjs +247 -196
- package/dist/esm/blur.mjs +101 -115
- package/dist/esm/brightness.mjs +65 -132
- package/dist/esm/burlap.mjs +178 -151
- package/dist/esm/checkerboard.mjs +6 -514
- package/dist/esm/chromatic-aberration.mjs +72 -119
- package/dist/esm/color-correction.mjs +186 -224
- package/dist/esm/color-key.mjs +149 -136
- package/dist/esm/contour-lines.mjs +201 -160
- package/dist/esm/contrast.mjs +65 -132
- package/dist/esm/corner-pin.mjs +4 -390
- package/dist/esm/curves.mjs +357 -0
- package/dist/esm/cylinder.mjs +108 -225
- package/dist/esm/dot-grid.mjs +184 -213
- package/dist/esm/drop-shadow.mjs +162 -180
- package/dist/esm/duotone.mjs +110 -143
- package/dist/esm/emboss.mjs +153 -151
- package/dist/esm/evolve.mjs +228 -154
- package/dist/esm/exposure.mjs +93 -201
- package/dist/esm/film-burn.mjs +298 -0
- package/dist/esm/fisheye.mjs +97 -126
- package/dist/esm/flannel.mjs +158 -156
- package/dist/esm/fractal-noise.mjs +186 -232
- package/dist/esm/glow.mjs +164 -179
- package/dist/esm/grayscale.mjs +56 -122
- package/dist/esm/gridlines.mjs +6 -575
- package/dist/esm/halftone-linear-gradient.mjs +246 -245
- package/dist/esm/halftone.mjs +267 -243
- package/dist/esm/hue.mjs +55 -122
- package/dist/esm/index-00v3hr66.mjs +299 -0
- package/dist/esm/index-0w4eqht8.mjs +351 -0
- package/dist/esm/index-18y0zcy2.mjs +440 -0
- package/dist/esm/index-1m1b1ad7.mjs +520 -0
- package/dist/esm/index-34fxm3ax.mjs +518 -0
- package/dist/esm/index-4fvp93ps.mjs +32 -0
- package/dist/esm/index-4scpn12x.mjs +224 -0
- package/dist/esm/index-4z6pt3ka.mjs +104 -0
- package/dist/esm/index-618ky75w.mjs +51 -0
- package/dist/esm/index-6agxdrvr.mjs +411 -0
- package/dist/esm/index-6jkps947.mjs +120 -0
- package/dist/esm/index-8agtsbw4.mjs +617 -0
- package/dist/esm/index-8jx11jyn.mjs +29 -0
- package/dist/esm/index-8p04sssx.mjs +123 -0
- package/dist/esm/index-afdtmrh2.mjs +596 -0
- package/dist/esm/index-b86qstcs.mjs +18 -0
- package/dist/esm/index-cb77qg3g.mjs +587 -0
- package/dist/esm/index-cdp7tr8x.mjs +122 -0
- package/dist/esm/index-evy8hyah.mjs +55 -0
- package/dist/esm/index-gnsce796.mjs +6 -0
- package/dist/esm/index-kkvzt8b7.mjs +199 -0
- package/dist/esm/index-r0v18b2n.mjs +425 -0
- package/dist/esm/index-rswpzmm5.mjs +926 -0
- package/dist/esm/index-s9mrx750.mjs +97 -0
- package/dist/esm/index-tvfexb7s.mjs +164 -0
- package/dist/esm/index-vp56k1gj.mjs +215 -0
- package/dist/esm/index-wxhvgv2s.mjs +79 -0
- package/dist/esm/index-wy95a41r.mjs +407 -0
- package/dist/esm/index-ysnwfc4t.mjs +306 -0
- package/dist/esm/index.mjs +49 -4053
- package/dist/esm/invert.mjs +54 -122
- package/dist/esm/iris-wipe.mjs +315 -0
- package/dist/esm/lens-blur.mjs +169 -156
- package/dist/esm/levels.mjs +204 -151
- package/dist/esm/light-leak.mjs +6 -416
- package/dist/esm/light-trail.mjs +124 -128
- package/dist/esm/linear-gradient-tint.mjs +4 -424
- package/dist/esm/linear-gradient.mjs +4 -370
- package/dist/esm/linear-progressive-blur.mjs +92 -118
- package/dist/esm/linear-progressive-pixelate.mjs +83 -378
- package/dist/esm/lines.mjs +167 -162
- package/dist/esm/liquid-contours.mjs +192 -153
- package/dist/esm/long-shadows.mjs +278 -251
- package/dist/esm/lut.mjs +123 -23
- package/dist/esm/mirror.mjs +78 -120
- package/dist/esm/noise-displacement.mjs +156 -151
- package/dist/esm/noise.mjs +107 -143
- package/dist/esm/outline.mjs +192 -170
- package/dist/esm/page-turn.mjs +141 -244
- package/dist/esm/paper.mjs +522 -194
- package/dist/esm/pattern.mjs +4 -568
- package/dist/esm/pixel-dissolve.mjs +158 -186
- package/dist/esm/pixelate.mjs +92 -149
- package/dist/esm/radial-progressive-blur.mjs +96 -118
- package/dist/esm/radial-progressive-pixelate.mjs +91 -384
- package/dist/esm/radial-wipe.mjs +224 -0
- package/dist/esm/rain-fall.mjs +114 -0
- package/dist/esm/region-blur.mjs +138 -192
- package/dist/esm/rings.mjs +6 -512
- package/dist/esm/roughen-edges.mjs +180 -156
- package/dist/esm/saturation.mjs +56 -122
- package/dist/esm/scale.mjs +50 -60
- package/dist/esm/scanlines.mjs +115 -149
- package/dist/esm/shadows-highlights.mjs +103 -205
- package/dist/esm/shatter.mjs +868 -0
- package/dist/esm/shine.mjs +192 -227
- package/dist/esm/shrinkwrap.mjs +388 -225
- package/dist/esm/skew.mjs +100 -145
- package/dist/esm/snow-fall.mjs +170 -0
- package/dist/esm/speckle.mjs +192 -210
- package/dist/esm/sphere.mjs +101 -225
- package/dist/esm/starburst.mjs +6 -345
- package/dist/esm/tear.mjs +138 -155
- package/dist/esm/thermal-vision.mjs +135 -152
- package/dist/esm/tile.mjs +5 -184
- package/dist/esm/tint.mjs +80 -132
- package/dist/esm/translate.mjs +55 -137
- package/dist/esm/turbulent-displace.mjs +182 -221
- package/dist/esm/tv-signal-off.mjs +140 -149
- package/dist/esm/venetian-blinds.mjs +91 -140
- package/dist/esm/vibrance.mjs +95 -204
- package/dist/esm/vignette.mjs +136 -155
- package/dist/esm/wave.mjs +88 -47
- package/dist/esm/waves.mjs +181 -169
- package/dist/esm/white-balance.mjs +100 -204
- package/dist/esm/white-noise.mjs +98 -146
- package/dist/esm/zigzag.mjs +6 -575
- package/dist/esm/zoom-blur.mjs +90 -121
- package/dist/evolve.d.ts +46 -10
- package/dist/film-burn-webgpu-shader.d.ts +1 -0
- package/dist/film-burn.d.ts +40 -0
- package/dist/fisheye/webgpu-shader.d.ts +1 -0
- package/dist/flannel-webgpu-shader.d.ts +1 -0
- package/dist/fractal-noise/shader.d.ts +1 -1
- package/dist/fractal-noise/webgpu-shader.d.ts +1 -0
- package/dist/gaussian-blur-webgpu-shader.d.ts +1 -0
- package/dist/glow/webgpu-shaders.d.ts +2 -0
- package/dist/gridlines-webgpu-shader.d.ts +1 -0
- package/dist/halftone-linear-gradient-webgpu-shader.d.ts +1 -0
- package/dist/halftone-webgpu-shader.d.ts +1 -0
- package/dist/iris-wipe.d.ts +78 -0
- package/dist/lens-blur/webgpu-shader.d.ts +1 -0
- package/dist/levels.d.ts +69 -2
- package/dist/light-leak-webgpu-shader.d.ts +1 -0
- package/dist/light-trail/webgpu-shader.d.ts +1 -0
- package/dist/linear-gradient-tint-webgpu-shader.d.ts +1 -0
- package/dist/linear-gradient-webgpu-shader.d.ts +1 -0
- package/dist/lines-webgpu-shader.d.ts +1 -0
- package/dist/liquid-contours-webgpu-shader.d.ts +1 -0
- package/dist/long-shadows-webgpu-shaders.d.ts +2 -0
- package/dist/lut/webgpu-shader.d.ts +1 -0
- package/dist/mirror/webgpu-shader.d.ts +1 -0
- package/dist/noise-displacement-webgpu-shader.d.ts +1 -0
- package/dist/noise-webgpu-shader.d.ts +1 -0
- package/dist/outline/webgpu-shader.d.ts +1 -0
- package/dist/page-turn/webgl-shader.d.ts +1 -0
- package/dist/paper-webgpu-shader.d.ts +2 -0
- package/dist/pattern-webgpu-shader.d.ts +1 -0
- package/dist/pixel-dissolve-webgpu-shader.d.ts +1 -0
- package/dist/progressive-pixelate-runtime.d.ts +1 -0
- package/dist/radial-wipe.d.ts +19 -0
- package/dist/rain-fall.d.ts +143 -0
- package/dist/rect-transform-runtime.d.ts +11 -0
- package/dist/region-blur/webgpu-shader.d.ts +1 -0
- package/dist/rings-webgpu-shader.d.ts +1 -0
- package/dist/roughen-edges-webgpu-shader.d.ts +1 -0
- package/dist/shatter/geometry.d.ts +19 -0
- package/dist/shatter/index.d.ts +39 -0
- package/dist/shatter/runtime.d.ts +19 -0
- package/dist/shatter/webgpu-shader.d.ts +1 -0
- package/dist/shatter.d.ts +1 -0
- package/dist/shine-webgpu-shader.d.ts +1 -0
- package/dist/shrinkwrap-webgpu-shader.d.ts +1 -0
- package/dist/single-pass-runtime.d.ts +18 -0
- package/dist/skew-webgpu-shader.d.ts +1 -0
- package/dist/snow-fall.d.ts +208 -0
- package/dist/speckle-webgpu-shader.d.ts +1 -0
- package/dist/sphere/webgl-shader.d.ts +1 -0
- package/dist/starburst-webgpu-shader.d.ts +1 -0
- package/dist/tear-webgpu-shader.d.ts +1 -0
- package/dist/thermal-vision-webgpu-shader.d.ts +1 -0
- package/dist/tile-gpu-runtime.d.ts +24 -0
- package/dist/turbulent-displace/webgpu-shader.d.ts +1 -0
- package/dist/value-noise-webgpu-shader.d.ts +1 -0
- package/dist/vignette-webgpu-shader.d.ts +1 -0
- package/dist/wave/wave-runtime.d.ts +2 -1
- package/dist/wave/webgpu-shader.d.ts +1 -0
- package/dist/waves-webgpu-shader.d.ts +1 -0
- package/dist/weather/params.d.ts +149 -0
- package/dist/weather/runtime.d.ts +52 -0
- package/dist/weather/shaders.d.ts +4 -0
- package/dist/weather/webgpu-runtime.d.ts +36 -0
- package/dist/weather/webgpu-shader.d.ts +1 -0
- package/dist/webgl-projection-runtime.d.ts +18 -0
- package/dist/webgpu-color-state.d.ts +10 -0
- package/dist/webgpu-mesh-runtime.d.ts +46 -0
- package/dist/webgpu-multipass-runtime.d.ts +50 -0
- package/dist/webgpu-projection-runtime.d.ts +9 -5
- package/dist/webgpu-single-pass-runtime.d.ts +47 -0
- package/dist/white-noise-webgpu-shader.d.ts +1 -0
- package/dist/zigzag-webgpu-shader.d.ts +1 -0
- package/dist/zoom-blur/webgpu-shader.d.ts +1 -0
- package/package.json +59 -3
|
@@ -1,175 +1,26 @@
|
|
|
1
|
+
import {
|
|
2
|
+
VALUE_NOISE_SHADER,
|
|
3
|
+
VALUE_NOISE_WEBGPU_SHADER
|
|
4
|
+
} from "./index-4z6pt3ka.mjs";
|
|
5
|
+
import {
|
|
6
|
+
assertOptionalFiniteNumber,
|
|
7
|
+
validateUnitInterval,
|
|
8
|
+
validateNonNegative
|
|
9
|
+
} from "./index-wxhvgv2s.mjs";
|
|
10
|
+
import {
|
|
11
|
+
WEBGPU_SINGLE_PASS_VERTEX,
|
|
12
|
+
setupWebGpuSinglePass,
|
|
13
|
+
cleanupWebGpuSinglePass,
|
|
14
|
+
applyWebGpuSinglePass
|
|
15
|
+
} from "./index-tvfexb7s.mjs";
|
|
16
|
+
import {
|
|
17
|
+
assertEffectParamsObject,
|
|
18
|
+
assertOptionalBoolean
|
|
19
|
+
} from "./index-4fvp93ps.mjs";
|
|
20
|
+
|
|
1
21
|
// src/fractal-noise/index.ts
|
|
2
22
|
import { Internals } from "remotion";
|
|
3
23
|
|
|
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
24
|
// src/fractal-noise/shader.ts
|
|
174
25
|
var FRACTAL_NOISE_FRAGMENT_SHADER = `#version 300 es
|
|
175
26
|
precision highp float;
|
|
@@ -221,7 +72,8 @@ void main() {
|
|
|
221
72
|
fragColor = source;
|
|
222
73
|
return;
|
|
223
74
|
}
|
|
224
|
-
|
|
75
|
+
// Use exact pixel centers so block noise stays stable at cell boundaries.
|
|
76
|
+
vec2 pixel = vec2(gl_FragCoord.x, uResolution.y - gl_FragCoord.y);
|
|
225
77
|
vec2 base = (pixel - uResolution * 0.5 - uOffset) / uScale;
|
|
226
78
|
float sum = 0.0;
|
|
227
79
|
float norm = 0.0;
|
|
@@ -260,6 +112,64 @@ void main() {
|
|
|
260
112
|
}
|
|
261
113
|
`;
|
|
262
114
|
|
|
115
|
+
// src/fractal-noise/webgpu-shader.ts
|
|
116
|
+
var FRACTAL_NOISE_WEBGPU_SHADER = `
|
|
117
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
118
|
+
@group(0) @binding(0) var source: texture_2d<f32>;
|
|
119
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
120
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
121
|
+
|
|
122
|
+
struct Params { size: vec2f, offset: vec2f, scale: f32, complexity: f32, evolution: f32, subInfluence: f32, subScaling: f32, contrast: f32, brightness: f32, amount: f32, cycle: f32, seed: u32, fractalType: f32, noiseType: f32, invert: f32, cycleEvolution: f32, }
|
|
123
|
+
fn noiseType() -> i32 { return i32(params.noiseType); }
|
|
124
|
+
${VALUE_NOISE_WEBGPU_SHADER}
|
|
125
|
+
fn layer(p: vec2f,z: f32,seed: u32) -> f32 {
|
|
126
|
+
if(params.cycleEvolution==0.0) { return valueNoise(vec3f(p,params.evolution+z),seed); }
|
|
127
|
+
let t=params.evolution-floor(params.evolution/params.cycle)*params.cycle;
|
|
128
|
+
return mix(valueNoise(vec3f(p,t+z),seed),valueNoise(vec3f(p,t-params.cycle+z),seed),t/params.cycle);
|
|
129
|
+
}
|
|
130
|
+
fn shape(n: f32) -> f32 {
|
|
131
|
+
let s=2.0*n-1.0;
|
|
132
|
+
if(params.fractalType==1.0) { return 1.0-s*s; }
|
|
133
|
+
if(params.fractalType==2.0) { return 1.0-abs(s); }
|
|
134
|
+
if(params.fractalType==3.0) { return (1.0-abs(s))*(1.0-abs(s)); }
|
|
135
|
+
if(params.fractalType==8.0) { let distance=clamp(abs(s)/0.12,0.0,1.0); return 1.0-distance*distance; }
|
|
136
|
+
return n;
|
|
137
|
+
}
|
|
138
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
139
|
+
let color=textureSampleLevel(source,sourceSampler,input.uv,0);
|
|
140
|
+
if(color.a==0.0 || params.amount==0.0) { return color; }
|
|
141
|
+
let pixel=input.position.xy;
|
|
142
|
+
let base=(pixel-params.size*0.5-params.offset)/params.scale;
|
|
143
|
+
var sum=0.0; var norm=0.0; var amplitude=1.0; var frequency=1.0; var best=0.0;
|
|
144
|
+
for(var octave=0;octave<20;octave++) {
|
|
145
|
+
let weight=clamp(params.complexity-f32(octave),0.0,1.0);
|
|
146
|
+
if(weight==0.0 || amplitude==0.0) { break; }
|
|
147
|
+
var p=base*frequency;
|
|
148
|
+
let z=f32(octave)*7.31;
|
|
149
|
+
let seed=(params.seed ^ 0x51edu)+u32(octave);
|
|
150
|
+
if(params.fractalType>=4.0 && params.fractalType<=6.0) {
|
|
151
|
+
let a=layer(p*0.5,z+3.1,seed ^ 0x55u)-0.5;
|
|
152
|
+
if(params.fractalType==5.0) {
|
|
153
|
+
let angle=a*3.0;
|
|
154
|
+
p=mat2x2f(vec2f(cos(angle),sin(angle)),vec2f(-sin(angle),cos(angle)))*p;
|
|
155
|
+
} else {
|
|
156
|
+
let b=layer(p*0.5,z+5.7,seed ^ 0xaau)-0.5;
|
|
157
|
+
let strength=select(1.0,0.5+f32(octave)*0.35,params.fractalType==6.0);
|
|
158
|
+
p += vec2f(a,b)*1.5*strength;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
let n=shape(layer(p,z,seed));
|
|
162
|
+
best=max(best,n*amplitude*weight); sum += n*amplitude*weight; norm += amplitude*weight;
|
|
163
|
+
amplitude *= params.subInfluence; frequency /= params.subScaling;
|
|
164
|
+
}
|
|
165
|
+
var noise=select(sum/norm,best,params.fractalType==7.0);
|
|
166
|
+
noise=clamp((noise-0.5)*params.contrast+0.5+params.brightness,0.0,1.0);
|
|
167
|
+
if(params.invert!=0.0) { noise=1.0-noise; }
|
|
168
|
+
return vec4f(mix(color.rgb,vec3f(noise)*color.a,params.amount),color.a);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
`;
|
|
172
|
+
|
|
263
173
|
// src/fractal-noise/index.ts
|
|
264
174
|
var { createEffect, createWebGL2ContextError } = Internals;
|
|
265
175
|
var DEFAULT_FRACTAL_TYPE = "basic";
|
|
@@ -277,7 +187,7 @@ var DEFAULT_CYCLE_EVOLUTION = false;
|
|
|
277
187
|
var DEFAULT_CYCLE = 1;
|
|
278
188
|
var DEFAULT_SEED = 0;
|
|
279
189
|
var DEFAULT_INVERT = false;
|
|
280
|
-
var
|
|
190
|
+
var DEFAULT_AMOUNT = 1;
|
|
281
191
|
var FRACTAL_TYPES = [
|
|
282
192
|
"basic",
|
|
283
193
|
"turbulent-smooth",
|
|
@@ -427,7 +337,7 @@ var fractalNoiseSchema = {
|
|
|
427
337
|
min: 0,
|
|
428
338
|
max: 1,
|
|
429
339
|
step: 0.01,
|
|
430
|
-
default:
|
|
340
|
+
default: DEFAULT_AMOUNT,
|
|
431
341
|
description: "Amount",
|
|
432
342
|
hiddenFromList: false
|
|
433
343
|
}
|
|
@@ -448,7 +358,7 @@ var resolve = (params) => ({
|
|
|
448
358
|
cycle: params.cycle ?? DEFAULT_CYCLE,
|
|
449
359
|
seed: params.seed ?? DEFAULT_SEED,
|
|
450
360
|
invert: params.invert ?? DEFAULT_INVERT,
|
|
451
|
-
amount: params.amount ??
|
|
361
|
+
amount: params.amount ?? DEFAULT_AMOUNT
|
|
452
362
|
});
|
|
453
363
|
var validateFractalNoiseParams = (params) => {
|
|
454
364
|
assertEffectParamsObject(params, "Fractal noise");
|
|
@@ -616,69 +526,113 @@ var fractalNoise = createEffect({
|
|
|
616
526
|
type: "remotion/fractal-noise",
|
|
617
527
|
label: "fractalNoise()",
|
|
618
528
|
documentationLink: "https://www.remotion.dev/docs/effects/fractal-noise",
|
|
619
|
-
backend: "webgl2",
|
|
620
529
|
calculateKey: (params) => {
|
|
621
530
|
const r = resolve(params);
|
|
622
531
|
return `fractal-noise-${JSON.stringify(r)}`;
|
|
623
532
|
},
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
533
|
+
implementations: {
|
|
534
|
+
webgpu: Internals.createEffectImplementation({
|
|
535
|
+
setup: (target) => setupWebGpuSinglePass(target, "index"),
|
|
536
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
537
|
+
if (!gpuDevice)
|
|
538
|
+
throw new Error("A WebGPU device is required for the index effect");
|
|
539
|
+
const r = resolve(params);
|
|
540
|
+
const uniformData = new Float32Array([
|
|
541
|
+
width,
|
|
542
|
+
height,
|
|
543
|
+
r.offsetX,
|
|
544
|
+
r.offsetY,
|
|
545
|
+
r.scale,
|
|
546
|
+
r.complexity,
|
|
547
|
+
r.evolution / 360,
|
|
548
|
+
r.subInfluence,
|
|
549
|
+
r.subScaling,
|
|
550
|
+
r.contrast,
|
|
551
|
+
r.brightness,
|
|
552
|
+
r.amount,
|
|
553
|
+
r.cycle,
|
|
554
|
+
0,
|
|
555
|
+
FRACTAL_TYPES.indexOf(r.fractalType),
|
|
556
|
+
NOISE_TYPES.indexOf(r.noiseType),
|
|
557
|
+
r.invert ? 1 : 0,
|
|
558
|
+
r.cycleEvolution ? 1 : 0,
|
|
559
|
+
0,
|
|
560
|
+
0
|
|
561
|
+
]);
|
|
562
|
+
new Uint32Array(uniformData.buffer)[13] = r.seed;
|
|
563
|
+
applyWebGpuSinglePass({
|
|
564
|
+
state,
|
|
565
|
+
source,
|
|
566
|
+
width,
|
|
567
|
+
height,
|
|
568
|
+
device: gpuDevice,
|
|
569
|
+
shader: FRACTAL_NOISE_WEBGPU_SHADER,
|
|
570
|
+
uniformData
|
|
571
|
+
});
|
|
572
|
+
},
|
|
573
|
+
cleanup: cleanupWebGpuSinglePass
|
|
574
|
+
}),
|
|
575
|
+
webgl2: Internals.createEffectImplementation({
|
|
576
|
+
setup: (target) => setupFractalNoise(target),
|
|
577
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
578
|
+
const r = resolve(params);
|
|
579
|
+
const { gl, program, texture, vao } = state;
|
|
580
|
+
gl.viewport(0, 0, width, height);
|
|
581
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
582
|
+
gl.clearColor(0, 0, 0, 0);
|
|
583
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
584
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
585
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
586
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
587
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
588
|
+
gl.useProgram(program);
|
|
589
|
+
if (state.uSource)
|
|
590
|
+
gl.uniform1i(state.uSource, 0);
|
|
591
|
+
if (state.uResolution)
|
|
592
|
+
gl.uniform2f(state.uResolution, width, height);
|
|
593
|
+
if (state.uOffset)
|
|
594
|
+
gl.uniform2f(state.uOffset, r.offsetX, r.offsetY);
|
|
595
|
+
if (state.uFractalType)
|
|
596
|
+
gl.uniform1i(state.uFractalType, FRACTAL_TYPES.indexOf(r.fractalType));
|
|
597
|
+
if (state.uNoiseType)
|
|
598
|
+
gl.uniform1i(state.uNoiseType, NOISE_TYPES.indexOf(r.noiseType));
|
|
599
|
+
if (state.uScale)
|
|
600
|
+
gl.uniform1f(state.uScale, r.scale);
|
|
601
|
+
if (state.uComplexity)
|
|
602
|
+
gl.uniform1f(state.uComplexity, r.complexity);
|
|
603
|
+
if (state.uEvolution)
|
|
604
|
+
gl.uniform1f(state.uEvolution, r.evolution / 360);
|
|
605
|
+
if (state.uContrast)
|
|
606
|
+
gl.uniform1f(state.uContrast, r.contrast);
|
|
607
|
+
if (state.uBrightness)
|
|
608
|
+
gl.uniform1f(state.uBrightness, r.brightness);
|
|
609
|
+
if (state.uSubInfluence)
|
|
610
|
+
gl.uniform1f(state.uSubInfluence, r.subInfluence);
|
|
611
|
+
if (state.uSubScaling)
|
|
612
|
+
gl.uniform1f(state.uSubScaling, r.subScaling);
|
|
613
|
+
if (state.uCycleEvolution)
|
|
614
|
+
gl.uniform1i(state.uCycleEvolution, r.cycleEvolution ? 1 : 0);
|
|
615
|
+
if (state.uCycle)
|
|
616
|
+
gl.uniform1f(state.uCycle, r.cycle);
|
|
617
|
+
if (state.uSeed)
|
|
618
|
+
gl.uniform1ui(state.uSeed, r.seed);
|
|
619
|
+
if (state.uInvert)
|
|
620
|
+
gl.uniform1i(state.uInvert, r.invert ? 1 : 0);
|
|
621
|
+
if (state.uAmount)
|
|
622
|
+
gl.uniform1f(state.uAmount, r.amount);
|
|
623
|
+
gl.bindVertexArray(vao);
|
|
624
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
625
|
+
gl.bindVertexArray(null);
|
|
626
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
627
|
+
gl.useProgram(null);
|
|
628
|
+
},
|
|
629
|
+
cleanup: ({ gl, program, vao, vbo, texture }) => {
|
|
630
|
+
gl.deleteTexture(texture);
|
|
631
|
+
gl.deleteBuffer(vbo);
|
|
632
|
+
gl.deleteProgram(program);
|
|
633
|
+
gl.deleteVertexArray(vao);
|
|
634
|
+
}
|
|
635
|
+
})
|
|
682
636
|
},
|
|
683
637
|
schema: fractalNoiseSchema,
|
|
684
638
|
validateParams: validateFractalNoiseParams
|