@remotion/effects 4.0.539 → 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 +15 -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/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 +195 -211
- 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 +134 -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 +133 -153
- 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/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/webgpu-shader.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 +43 -3
|
@@ -1,175 +1,25 @@
|
|
|
1
|
+
import {
|
|
2
|
+
VALUE_NOISE_SHADER,
|
|
3
|
+
VALUE_NOISE_WEBGPU_SHADER
|
|
4
|
+
} from "./index-4z6pt3ka.mjs";
|
|
5
|
+
import {
|
|
6
|
+
assertOptionalFiniteNumber
|
|
7
|
+
} from "./index-wxhvgv2s.mjs";
|
|
8
|
+
import {
|
|
9
|
+
WEBGPU_SINGLE_PASS_VERTEX,
|
|
10
|
+
setupWebGpuSinglePass,
|
|
11
|
+
cleanupWebGpuSinglePass,
|
|
12
|
+
applyWebGpuSinglePass
|
|
13
|
+
} from "./index-tvfexb7s.mjs";
|
|
14
|
+
import {
|
|
15
|
+
assertEffectParamsObject,
|
|
16
|
+
assertRequiredFiniteNumber,
|
|
17
|
+
assertOptionalBoolean
|
|
18
|
+
} from "./index-4fvp93ps.mjs";
|
|
19
|
+
|
|
1
20
|
// src/turbulent-displace/index.ts
|
|
2
21
|
import { Internals } from "remotion";
|
|
3
22
|
|
|
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
23
|
// src/turbulent-displace/shader.ts
|
|
174
24
|
var TURBULENT_DISPLACE_FRAGMENT_SHADER = `#version 300 es
|
|
175
25
|
precision highp float;
|
|
@@ -279,10 +129,81 @@ void main() {
|
|
|
279
129
|
}
|
|
280
130
|
`;
|
|
281
131
|
|
|
132
|
+
// src/turbulent-displace/webgpu-shader.ts
|
|
133
|
+
var TURBULENT_DISPLACE_WEBGPU_SHADER = `
|
|
134
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
135
|
+
@group(0) @binding(0) var source: texture_2d<f32>;
|
|
136
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
137
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
138
|
+
|
|
139
|
+
struct Params { size: vec2f, offset: vec2f, amount: f32, scale: f32, complexity: f32, evolution: f32, cycle: f32, seed: u32, displacement: f32, pinning: f32, cycleEvolution: f32, }
|
|
140
|
+
fn noiseType() -> i32 { return 2; }
|
|
141
|
+
${VALUE_NOISE_WEBGPU_SHADER}
|
|
142
|
+
fn noiseLayer(p: vec2f,z: f32,seed: u32) -> f32 {
|
|
143
|
+
if(params.cycleEvolution==0.0) { return valueNoise(vec3f(p,params.evolution+z),seed); }
|
|
144
|
+
let t=params.evolution-floor(params.evolution/params.cycle)*params.cycle;
|
|
145
|
+
let weight=smoothstep(0.0,1.0,t/params.cycle);
|
|
146
|
+
return mix(valueNoise(vec3f(p,t+z),seed),valueNoise(vec3f(p,t-params.cycle+z),seed),weight);
|
|
147
|
+
}
|
|
148
|
+
fn turbulence(p: vec2f,channel: u32) -> f32 {
|
|
149
|
+
var sum=0.0; var norm=0.0; var amplitude=1.0; var frequency=1.0;
|
|
150
|
+
let falloff=select(0.5,0.3,params.displacement>=3.0 && params.displacement<=5.0);
|
|
151
|
+
for(var octave=0;octave<10;octave++) {
|
|
152
|
+
let weight=clamp(params.complexity-f32(octave),0.0,1.0);
|
|
153
|
+
if(weight==0.0) { break; }
|
|
154
|
+
let seed=(params.seed ^ 0x7d15u)+channel+u32(octave)*101u;
|
|
155
|
+
sum += noiseLayer(p*frequency,f32(octave)*5.17,seed)*amplitude*weight;
|
|
156
|
+
norm += amplitude*weight; amplitude *= falloff; frequency *= 2.0;
|
|
157
|
+
}
|
|
158
|
+
return sum/norm-0.5;
|
|
159
|
+
}
|
|
160
|
+
fn readPixel(p: vec2i) -> vec4f {
|
|
161
|
+
if(any(p<vec2i(0)) || any(p>=vec2i(params.size))) { return vec4f(0); }
|
|
162
|
+
let sourceSize=vec2i(textureDimensions(source));
|
|
163
|
+
let sourcePixel=p+vec2i(0,sourceSize.y-i32(params.size.y));
|
|
164
|
+
if(any(sourcePixel<vec2i(0)) || any(sourcePixel>=sourceSize)) { return vec4f(0); }
|
|
165
|
+
return textureLoad(source,sourcePixel,0);
|
|
166
|
+
}
|
|
167
|
+
fn sampleSource(p: vec2f) -> vec4f {
|
|
168
|
+
let base=vec2i(floor(p-vec2f(0.5))); let t=fract(p-vec2f(0.5));
|
|
169
|
+
return mix(mix(readPixel(base),readPixel(base+vec2i(1,0)),t.x),mix(readPixel(base+vec2i(0,1)),readPixel(base+vec2i(1,1)),t.x),t.y);
|
|
170
|
+
}
|
|
171
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
172
|
+
if(params.amount==0.0) { return textureSampleLevel(source,sourceSampler,input.uv,0); }
|
|
173
|
+
let pixel=input.uv*params.size;
|
|
174
|
+
let p=(pixel-params.offset*params.size)/params.scale;
|
|
175
|
+
let mode=i32(params.displacement);
|
|
176
|
+
var displacement: vec2f;
|
|
177
|
+
if(mode==1 || mode==2 || mode==4 || mode==5) {
|
|
178
|
+
let epsilon=0.05;
|
|
179
|
+
let gradient=vec2f(turbulence(p+vec2f(epsilon,0),0u)-turbulence(p-vec2f(epsilon,0),0u),turbulence(p+vec2f(0,epsilon),0u)-turbulence(p-vec2f(0,epsilon),0u))/(2.0*epsilon);
|
|
180
|
+
displacement=select(vec2f(-gradient.y,gradient.x),gradient,mode==1 || mode==4)*params.amount*0.25;
|
|
181
|
+
} else if(mode==6) { displacement=vec2f(0,turbulence(p,17u)*params.amount); }
|
|
182
|
+
else if(mode==7) { displacement=vec2f(turbulence(p,0u)*params.amount,0); }
|
|
183
|
+
else if(mode==8) { displacement=vec2f(turbulence(p,0u)*params.amount); }
|
|
184
|
+
else { displacement=vec2f(turbulence(p,0u),turbulence(p,17u))*params.amount; }
|
|
185
|
+
let locked=params.pinning>=8.0;
|
|
186
|
+
let pin=select(params.pinning,params.pinning-7.0,locked);
|
|
187
|
+
let edge=max(1.0,min(params.size.x,params.size.y)*select(0.1,0.25,locked));
|
|
188
|
+
let nearEdge=clamp((pixel-vec2f(0.5))/edge,vec2f(0),vec2f(1));
|
|
189
|
+
let farEdge=clamp((params.size-vec2f(0.5)-pixel)/edge,vec2f(0),vec2f(1));
|
|
190
|
+
let horizontal=min(nearEdge.x,farEdge.x); let vertical=min(nearEdge.y,farEdge.y);
|
|
191
|
+
var weight=1.0;
|
|
192
|
+
if(pin==1.0) { weight=min(horizontal,vertical); }
|
|
193
|
+
if(pin==2.0) { weight=vertical; } if(pin==3.0) { weight=horizontal; }
|
|
194
|
+
if(pin==4.0) { weight=nearEdge.x; } if(pin==5.0) { weight=nearEdge.y; }
|
|
195
|
+
if(pin==6.0) { weight=farEdge.x; } if(pin==7.0) { weight=farEdge.y; }
|
|
196
|
+
var sourcePixel=pixel+displacement*weight;
|
|
197
|
+
if(locked) { sourcePixel=clamp(sourcePixel,vec2f(0.5),params.size-vec2f(0.5)); }
|
|
198
|
+
return sampleSource(sourcePixel);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
`;
|
|
202
|
+
|
|
282
203
|
// src/turbulent-displace/index.ts
|
|
283
204
|
var { createEffect, createWebGL2ContextError } = Internals;
|
|
284
205
|
var DEFAULT_DISPLACEMENT = "turbulent";
|
|
285
|
-
var
|
|
206
|
+
var DEFAULT_AMOUNT = 50;
|
|
286
207
|
var DEFAULT_SIZE = 100;
|
|
287
208
|
var DEFAULT_OFFSET = [0.5, 0.5];
|
|
288
209
|
var DEFAULT_COMPLEXITY = 1;
|
|
@@ -341,7 +262,7 @@ var turbulentDisplaceSchema = {
|
|
|
341
262
|
min: -200,
|
|
342
263
|
max: 200,
|
|
343
264
|
step: 1,
|
|
344
|
-
default:
|
|
265
|
+
default: DEFAULT_AMOUNT,
|
|
345
266
|
description: "Amount",
|
|
346
267
|
hiddenFromList: false
|
|
347
268
|
},
|
|
@@ -425,7 +346,7 @@ var turbulentDisplaceSchema = {
|
|
|
425
346
|
};
|
|
426
347
|
var resolve = (params) => ({
|
|
427
348
|
displacement: params.displacement ?? DEFAULT_DISPLACEMENT,
|
|
428
|
-
amount: params.amount ??
|
|
349
|
+
amount: params.amount ?? DEFAULT_AMOUNT,
|
|
429
350
|
size: params.size ?? DEFAULT_SIZE,
|
|
430
351
|
offset: params.offset ?? DEFAULT_OFFSET,
|
|
431
352
|
complexity: params.complexity ?? DEFAULT_COMPLEXITY,
|
|
@@ -590,59 +511,99 @@ var turbulentDisplace = createEffect({
|
|
|
590
511
|
type: "remotion/turbulent-displace",
|
|
591
512
|
label: "turbulentDisplace()",
|
|
592
513
|
documentationLink: "https://www.remotion.dev/docs/effects/turbulent-displace",
|
|
593
|
-
backend: "webgl2",
|
|
594
514
|
calculateKey: (params) => {
|
|
595
515
|
const r = resolve(params);
|
|
596
516
|
return `turbulent-displace-${JSON.stringify(r)}`;
|
|
597
517
|
},
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
518
|
+
implementations: {
|
|
519
|
+
webgpu: Internals.createEffectImplementation({
|
|
520
|
+
setup: (target) => setupWebGpuSinglePass(target, "index"),
|
|
521
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
522
|
+
if (!gpuDevice)
|
|
523
|
+
throw new Error("A WebGPU device is required for the index effect");
|
|
524
|
+
const r = resolve(params);
|
|
525
|
+
const uniformData = new Float32Array([
|
|
526
|
+
width,
|
|
527
|
+
height,
|
|
528
|
+
r.offset[0],
|
|
529
|
+
r.offset[1],
|
|
530
|
+
r.amount,
|
|
531
|
+
r.size,
|
|
532
|
+
r.complexity,
|
|
533
|
+
r.evolution / 360,
|
|
534
|
+
r.cycle,
|
|
535
|
+
0,
|
|
536
|
+
DISPLACEMENT_MODES.indexOf(r.displacement),
|
|
537
|
+
PINNING_MODES.indexOf(r.pinning),
|
|
538
|
+
r.cycleEvolution ? 1 : 0,
|
|
539
|
+
0,
|
|
540
|
+
0,
|
|
541
|
+
0
|
|
542
|
+
]);
|
|
543
|
+
new Uint32Array(uniformData.buffer)[9] = r.seed;
|
|
544
|
+
applyWebGpuSinglePass({
|
|
545
|
+
state,
|
|
546
|
+
source,
|
|
547
|
+
width,
|
|
548
|
+
height,
|
|
549
|
+
device: gpuDevice,
|
|
550
|
+
shader: TURBULENT_DISPLACE_WEBGPU_SHADER,
|
|
551
|
+
uniformData
|
|
552
|
+
});
|
|
553
|
+
},
|
|
554
|
+
cleanup: cleanupWebGpuSinglePass
|
|
555
|
+
}),
|
|
556
|
+
webgl2: Internals.createEffectImplementation({
|
|
557
|
+
setup: (target) => setupTurbulentDisplace(target),
|
|
558
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
559
|
+
const r = resolve(params);
|
|
560
|
+
const { gl, program, texture, vao } = state;
|
|
561
|
+
gl.viewport(0, 0, width, height);
|
|
562
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
563
|
+
gl.clearColor(0, 0, 0, 0);
|
|
564
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
565
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
566
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
567
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
568
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
569
|
+
gl.useProgram(program);
|
|
570
|
+
if (state.uSource)
|
|
571
|
+
gl.uniform1i(state.uSource, 0);
|
|
572
|
+
if (state.uResolution)
|
|
573
|
+
gl.uniform2f(state.uResolution, width, height);
|
|
574
|
+
if (state.uDisplacement)
|
|
575
|
+
gl.uniform1i(state.uDisplacement, DISPLACEMENT_MODES.indexOf(r.displacement));
|
|
576
|
+
if (state.uAmount)
|
|
577
|
+
gl.uniform1f(state.uAmount, r.amount);
|
|
578
|
+
if (state.uSize)
|
|
579
|
+
gl.uniform1f(state.uSize, r.size);
|
|
580
|
+
if (state.uOffset)
|
|
581
|
+
gl.uniform2f(state.uOffset, r.offset[0], r.offset[1]);
|
|
582
|
+
if (state.uComplexity)
|
|
583
|
+
gl.uniform1f(state.uComplexity, r.complexity);
|
|
584
|
+
if (state.uEvolution)
|
|
585
|
+
gl.uniform1f(state.uEvolution, r.evolution / 360);
|
|
586
|
+
if (state.uCycleEvolution)
|
|
587
|
+
gl.uniform1i(state.uCycleEvolution, r.cycleEvolution ? 1 : 0);
|
|
588
|
+
if (state.uCycle)
|
|
589
|
+
gl.uniform1f(state.uCycle, r.cycle);
|
|
590
|
+
if (state.uSeed)
|
|
591
|
+
gl.uniform1ui(state.uSeed, r.seed);
|
|
592
|
+
if (state.uPinning)
|
|
593
|
+
gl.uniform1i(state.uPinning, PINNING_MODES.indexOf(r.pinning));
|
|
594
|
+
gl.bindVertexArray(vao);
|
|
595
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
596
|
+
gl.bindVertexArray(null);
|
|
597
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
598
|
+
gl.useProgram(null);
|
|
599
|
+
},
|
|
600
|
+
cleanup: ({ gl, program, vao, vbo, texture }) => {
|
|
601
|
+
gl.deleteTexture(texture);
|
|
602
|
+
gl.deleteBuffer(vbo);
|
|
603
|
+
gl.deleteProgram(program);
|
|
604
|
+
gl.deleteVertexArray(vao);
|
|
605
|
+
}
|
|
606
|
+
})
|
|
646
607
|
},
|
|
647
608
|
schema: turbulentDisplaceSchema,
|
|
648
609
|
validateParams: validateTurbulentDisplaceParams
|