@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
package/dist/esm/evolve.mjs
CHANGED
|
@@ -1,117 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
};
|
|
1
|
+
import {
|
|
2
|
+
assertOptionalFiniteNumber,
|
|
3
|
+
validateUnitInterval,
|
|
4
|
+
validateNonNegative
|
|
5
|
+
} from "./index-wxhvgv2s.mjs";
|
|
6
|
+
import {
|
|
7
|
+
WEBGPU_SINGLE_PASS_VERTEX,
|
|
8
|
+
setupWebGpuSinglePass,
|
|
9
|
+
cleanupWebGpuSinglePass,
|
|
10
|
+
applyWebGpuSinglePass
|
|
11
|
+
} from "./index-tvfexb7s.mjs";
|
|
12
|
+
import {
|
|
13
|
+
assertEffectParamsObject
|
|
14
|
+
} from "./index-4fvp93ps.mjs";
|
|
108
15
|
|
|
109
16
|
// src/evolve.ts
|
|
17
|
+
import { Internals } from "remotion";
|
|
110
18
|
var { createEffect, createWebGL2ContextError } = Internals;
|
|
111
|
-
var EVOLVE_DIRECTIONS = ["left", "right", "top", "bottom"];
|
|
19
|
+
var EVOLVE_DIRECTIONS = ["left", "right", "top", "bottom", "angle"];
|
|
20
|
+
var EVOLVE_FEATHER_UNITS = ["relative", "pixels"];
|
|
21
|
+
var DIRECTION_VECTORS = {
|
|
22
|
+
left: [1, 0],
|
|
23
|
+
right: [-1, 0],
|
|
24
|
+
top: [0, 1],
|
|
25
|
+
bottom: [0, -1]
|
|
26
|
+
};
|
|
112
27
|
var DEFAULT_PROGRESS = 0.5;
|
|
113
28
|
var DEFAULT_FEATHER = 0.1;
|
|
114
29
|
var DEFAULT_DIRECTION = "left";
|
|
30
|
+
var DEFAULT_ANGLE = 90;
|
|
31
|
+
var DEFAULT_FEATHER_UNIT = "relative";
|
|
32
|
+
var DEFAULT_FEATHER_PIXELS = 0;
|
|
115
33
|
var evolveSchema = {
|
|
116
34
|
progress: {
|
|
117
35
|
type: "number",
|
|
@@ -128,19 +46,47 @@ var evolveSchema = {
|
|
|
128
46
|
left: {},
|
|
129
47
|
right: {},
|
|
130
48
|
top: {},
|
|
131
|
-
bottom: {}
|
|
49
|
+
bottom: {},
|
|
50
|
+
angle: {
|
|
51
|
+
angle: {
|
|
52
|
+
type: "rotation-degrees",
|
|
53
|
+
step: 1,
|
|
54
|
+
default: DEFAULT_ANGLE,
|
|
55
|
+
description: "Angle"
|
|
56
|
+
}
|
|
57
|
+
}
|
|
132
58
|
},
|
|
133
59
|
default: DEFAULT_DIRECTION,
|
|
134
60
|
description: "Direction"
|
|
135
61
|
},
|
|
136
|
-
|
|
137
|
-
type: "
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
62
|
+
featherUnit: {
|
|
63
|
+
type: "enum",
|
|
64
|
+
variants: {
|
|
65
|
+
relative: {
|
|
66
|
+
feather: {
|
|
67
|
+
type: "number",
|
|
68
|
+
min: 0,
|
|
69
|
+
max: 1,
|
|
70
|
+
step: 0.01,
|
|
71
|
+
default: DEFAULT_FEATHER,
|
|
72
|
+
description: "Feather",
|
|
73
|
+
hiddenFromList: false
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
pixels: {
|
|
77
|
+
featherPixels: {
|
|
78
|
+
type: "number",
|
|
79
|
+
min: 0,
|
|
80
|
+
max: 500,
|
|
81
|
+
step: 1,
|
|
82
|
+
default: DEFAULT_FEATHER_PIXELS,
|
|
83
|
+
description: "Feather in pixels",
|
|
84
|
+
hiddenFromList: false
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
default: DEFAULT_FEATHER_UNIT,
|
|
89
|
+
description: "Feather unit"
|
|
144
90
|
}
|
|
145
91
|
};
|
|
146
92
|
var formatEnum = (variants) => {
|
|
@@ -160,16 +106,23 @@ var assertOptionalEnum = (value, name, variants) => {
|
|
|
160
106
|
var resolve = (p) => ({
|
|
161
107
|
progress: p.progress ?? DEFAULT_PROGRESS,
|
|
162
108
|
direction: p.direction ?? DEFAULT_DIRECTION,
|
|
163
|
-
feather: p.feather ?? DEFAULT_FEATHER
|
|
109
|
+
feather: p.feather ?? DEFAULT_FEATHER,
|
|
110
|
+
angle: p.angle ?? DEFAULT_ANGLE,
|
|
111
|
+
featherUnit: p.featherUnit ?? DEFAULT_FEATHER_UNIT,
|
|
112
|
+
featherPixels: p.featherPixels ?? DEFAULT_FEATHER_PIXELS
|
|
164
113
|
});
|
|
165
114
|
var validateEvolveParams = (params) => {
|
|
166
115
|
assertEffectParamsObject(params, "Evolve");
|
|
167
116
|
assertOptionalFiniteNumber(params.progress, "progress");
|
|
168
117
|
assertOptionalFiniteNumber(params.feather, "feather");
|
|
118
|
+
assertOptionalFiniteNumber(params.angle, "angle");
|
|
119
|
+
assertOptionalFiniteNumber(params.featherPixels, "featherPixels");
|
|
120
|
+
assertOptionalEnum(params.featherUnit, "featherUnit", EVOLVE_FEATHER_UNITS);
|
|
169
121
|
assertOptionalEnum(params.direction, "direction", EVOLVE_DIRECTIONS);
|
|
170
122
|
const r = resolve(params);
|
|
171
123
|
validateUnitInterval(r.progress, "progress");
|
|
172
124
|
validateUnitInterval(r.feather, "feather");
|
|
125
|
+
validateNonNegative(r.featherPixels, "featherPixels");
|
|
173
126
|
};
|
|
174
127
|
var EVOLVE_VS = `#version 300 es
|
|
175
128
|
in vec2 aPos;
|
|
@@ -191,6 +144,10 @@ uniform sampler2D uSource;
|
|
|
191
144
|
uniform float uProgress;
|
|
192
145
|
uniform float uFeather;
|
|
193
146
|
uniform int uDirection;
|
|
147
|
+
uniform vec2 uResolution;
|
|
148
|
+
uniform vec2 uTravelDirection;
|
|
149
|
+
uniform bool uUsePixelFeather;
|
|
150
|
+
uniform float uFeatherPixels;
|
|
194
151
|
|
|
195
152
|
float getT(vec2 uv) {
|
|
196
153
|
// 0: left, 1: right, 2: top, 3: bottom
|
|
@@ -232,7 +189,30 @@ float maskValue(float t, float progress, float feather) {
|
|
|
232
189
|
void main() {
|
|
233
190
|
vec4 source = texture(uSource, vUv);
|
|
234
191
|
float t = getT(vUv);
|
|
235
|
-
float mask
|
|
192
|
+
float mask;
|
|
193
|
+
if (uDirection == 4 || uUsePixelFeather) {
|
|
194
|
+
vec2 extent = uResolution * uTravelDirection;
|
|
195
|
+
float low = min(0.0, extent.x) + min(0.0, extent.y);
|
|
196
|
+
float high = max(0.0, extent.x) + max(0.0, extent.y);
|
|
197
|
+
vec2 position = vec2(vUv.x, 1.0 - vUv.y) * uResolution;
|
|
198
|
+
float projection = dot(position, uTravelDirection);
|
|
199
|
+
if (uUsePixelFeather) {
|
|
200
|
+
// Adapted from EffectCraft's linear_wipe(), under the MIT license:
|
|
201
|
+
// https://github.com/storytold/effectcraft/blob/eb5108786b90bf994a6abe4e6c0b2614c6aeaa29/crates/effects/src/misc.rs
|
|
202
|
+
// See ../THIRD_PARTY_LICENSES.md. Increasing progress reveals the source.
|
|
203
|
+
float edge = mix(low - uFeatherPixels, high + uFeatherPixels, uProgress);
|
|
204
|
+
mask = uFeatherPixels > 0.0
|
|
205
|
+
? clamp((edge - projection) / uFeatherPixels + 0.5, 0.0, 1.0)
|
|
206
|
+
: step(projection, edge);
|
|
207
|
+
if (uProgress <= 0.0) mask = 0.0;
|
|
208
|
+
if (uProgress >= 1.0) mask = 1.0;
|
|
209
|
+
} else {
|
|
210
|
+
t = (projection - low) / (high - low);
|
|
211
|
+
mask = maskValue(t, uProgress, uFeather);
|
|
212
|
+
}
|
|
213
|
+
} else {
|
|
214
|
+
mask = maskValue(t, uProgress, uFeather);
|
|
215
|
+
}
|
|
236
216
|
fragColor = vec4(source.rgb * mask, source.a * mask);
|
|
237
217
|
}
|
|
238
218
|
`;
|
|
@@ -340,7 +320,11 @@ var setupEvolve = (target) => {
|
|
|
340
320
|
uSource: gl.getUniformLocation(program, "uSource"),
|
|
341
321
|
uProgress: gl.getUniformLocation(program, "uProgress"),
|
|
342
322
|
uDirection: gl.getUniformLocation(program, "uDirection"),
|
|
343
|
-
uFeather: gl.getUniformLocation(program, "uFeather")
|
|
323
|
+
uFeather: gl.getUniformLocation(program, "uFeather"),
|
|
324
|
+
uResolution: gl.getUniformLocation(program, "uResolution"),
|
|
325
|
+
uTravelDirection: gl.getUniformLocation(program, "uTravelDirection"),
|
|
326
|
+
uUsePixelFeather: gl.getUniformLocation(program, "uUsePixelFeather"),
|
|
327
|
+
uFeatherPixels: gl.getUniformLocation(program, "uFeatherPixels")
|
|
344
328
|
}
|
|
345
329
|
};
|
|
346
330
|
};
|
|
@@ -354,53 +338,143 @@ var directionToInt = (direction) => {
|
|
|
354
338
|
return 2;
|
|
355
339
|
case "bottom":
|
|
356
340
|
return 3;
|
|
341
|
+
case "angle":
|
|
342
|
+
return 4;
|
|
357
343
|
default: {
|
|
358
344
|
const exhaustiveCheck = direction;
|
|
359
345
|
return exhaustiveCheck;
|
|
360
346
|
}
|
|
361
347
|
}
|
|
362
348
|
};
|
|
349
|
+
var WEBGPU_SHADER = `
|
|
350
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
351
|
+
struct Params { resolutionTravel: vec4f, controls: vec4f, featherPixels: vec4f, }
|
|
352
|
+
@group(0) @binding(0) var source: texture_2d<f32>;
|
|
353
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
354
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
355
|
+
fn maskValue(t: f32, progress: f32, feather: f32) -> f32 {
|
|
356
|
+
let p = clamp(progress, 0.0, 1.0);
|
|
357
|
+
let f = max(feather, 0.0);
|
|
358
|
+
if (p <= 0.000001) { return 0.0; }
|
|
359
|
+
if (p >= 0.999999) { return 1.0; }
|
|
360
|
+
if (f <= 0.0001) { return step(t, p); }
|
|
361
|
+
return 1.0 - smoothstep(p, min(p + f, 1.0), t);
|
|
362
|
+
}
|
|
363
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
364
|
+
let color = textureSampleLevel(source, sourceSampler, input.uv, 0);
|
|
365
|
+
let progress = params.controls.x;
|
|
366
|
+
let direction = params.controls.z;
|
|
367
|
+
let usePixelFeather = params.controls.w != 0.0;
|
|
368
|
+
var t = input.uv.x;
|
|
369
|
+
if (direction == 1.0) { t = 1.0 - input.uv.x; }
|
|
370
|
+
if (direction == 2.0) { t = input.uv.y; }
|
|
371
|
+
if (direction == 3.0) { t = 1.0 - input.uv.y; }
|
|
372
|
+
var mask: f32;
|
|
373
|
+
if (direction == 4.0 || usePixelFeather) {
|
|
374
|
+
let extent = params.resolutionTravel.xy * params.resolutionTravel.zw;
|
|
375
|
+
let low = min(0.0, extent.x) + min(0.0, extent.y);
|
|
376
|
+
let high = max(0.0, extent.x) + max(0.0, extent.y);
|
|
377
|
+
let position = input.uv * params.resolutionTravel.xy;
|
|
378
|
+
let projection = dot(position, params.resolutionTravel.zw);
|
|
379
|
+
if (usePixelFeather) {
|
|
380
|
+
let feather = params.featherPixels.x;
|
|
381
|
+
let edge = mix(low - feather, high + feather, progress);
|
|
382
|
+
mask = step(projection, edge);
|
|
383
|
+
if (feather > 0.0) { mask = clamp((edge - projection) / feather + 0.5, 0.0, 1.0); }
|
|
384
|
+
if (progress <= 0.0) { mask = 0.0; }
|
|
385
|
+
if (progress >= 1.0) { mask = 1.0; }
|
|
386
|
+
} else {
|
|
387
|
+
t = (projection - low) / (high - low);
|
|
388
|
+
mask = maskValue(t, progress, params.controls.y);
|
|
389
|
+
}
|
|
390
|
+
} else { mask = maskValue(t, progress, params.controls.y); }
|
|
391
|
+
return color * mask;
|
|
392
|
+
}
|
|
393
|
+
`;
|
|
363
394
|
var evolve = createEffect({
|
|
364
395
|
type: "dev.remotion.effects.evolve",
|
|
365
396
|
label: "evolve()",
|
|
366
397
|
documentationLink: "https://www.remotion.dev/docs/effects/evolve",
|
|
367
|
-
backend: "webgl2",
|
|
368
398
|
calculateKey: (params) => {
|
|
369
399
|
const r = resolve(params);
|
|
370
|
-
return `evolve-${r.progress}-${r.direction}-${r.feather}`;
|
|
400
|
+
return `evolve-${r.progress}-${r.direction}-${r.feather}-${r.angle}-${r.featherUnit}-${r.featherPixels}`;
|
|
371
401
|
},
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
402
|
+
implementations: {
|
|
403
|
+
webgpu: Internals.createEffectImplementation({
|
|
404
|
+
setup: (target) => setupWebGpuSinglePass(target, "evolve"),
|
|
405
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
406
|
+
if (!gpuDevice) {
|
|
407
|
+
throw new Error("A WebGPU device is required for the evolve effect");
|
|
408
|
+
}
|
|
409
|
+
const r = resolve(params);
|
|
410
|
+
const radians = r.angle % 360 * Math.PI / 180;
|
|
411
|
+
const travelDirection = r.direction === "angle" ? [Math.sin(radians), -Math.cos(radians)] : DIRECTION_VECTORS[r.direction];
|
|
412
|
+
applyWebGpuSinglePass({
|
|
413
|
+
source,
|
|
414
|
+
width,
|
|
415
|
+
height,
|
|
416
|
+
state,
|
|
417
|
+
device: gpuDevice,
|
|
418
|
+
shader: WEBGPU_SHADER,
|
|
419
|
+
uniformData: new Float32Array([
|
|
420
|
+
width,
|
|
421
|
+
height,
|
|
422
|
+
travelDirection[0],
|
|
423
|
+
travelDirection[1],
|
|
424
|
+
r.progress,
|
|
425
|
+
r.feather,
|
|
426
|
+
directionToInt(r.direction),
|
|
427
|
+
r.featherUnit === "pixels" ? 1 : 0,
|
|
428
|
+
r.featherPixels,
|
|
429
|
+
0,
|
|
430
|
+
0,
|
|
431
|
+
0
|
|
432
|
+
])
|
|
433
|
+
});
|
|
434
|
+
},
|
|
435
|
+
cleanup: cleanupWebGpuSinglePass
|
|
436
|
+
}),
|
|
437
|
+
webgl2: Internals.createEffectImplementation({
|
|
438
|
+
setup: (target) => setupEvolve(target),
|
|
439
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
440
|
+
const r = resolve(params);
|
|
441
|
+
const { gl, program, textureSource, uniforms, vao } = state;
|
|
442
|
+
gl.viewport(0, 0, width, height);
|
|
443
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
444
|
+
gl.clearColor(0, 0, 0, 0);
|
|
445
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
446
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
447
|
+
gl.bindTexture(gl.TEXTURE_2D, textureSource);
|
|
448
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
449
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
450
|
+
gl.useProgram(program);
|
|
451
|
+
if (uniforms.uSource)
|
|
452
|
+
gl.uniform1i(uniforms.uSource, 0);
|
|
453
|
+
if (uniforms.uProgress)
|
|
454
|
+
gl.uniform1f(uniforms.uProgress, r.progress);
|
|
455
|
+
if (uniforms.uFeather)
|
|
456
|
+
gl.uniform1f(uniforms.uFeather, r.feather);
|
|
457
|
+
if (uniforms.uDirection)
|
|
458
|
+
gl.uniform1i(uniforms.uDirection, directionToInt(r.direction));
|
|
459
|
+
gl.uniform2f(uniforms.uResolution, width, height);
|
|
460
|
+
const radians = r.angle % 360 * Math.PI / 180;
|
|
461
|
+
const travelDirection = r.direction === "angle" ? [Math.sin(radians), -Math.cos(radians)] : DIRECTION_VECTORS[r.direction];
|
|
462
|
+
gl.uniform2f(uniforms.uTravelDirection, travelDirection[0], travelDirection[1]);
|
|
463
|
+
gl.uniform1i(uniforms.uUsePixelFeather, r.featherUnit === "pixels" ? 1 : 0);
|
|
464
|
+
gl.uniform1f(uniforms.uFeatherPixels, r.featherPixels);
|
|
465
|
+
gl.bindVertexArray(vao);
|
|
466
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
467
|
+
gl.bindVertexArray(null);
|
|
468
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
469
|
+
gl.useProgram(null);
|
|
470
|
+
},
|
|
471
|
+
cleanup: ({ gl, program, vao, vbo, textureSource }) => {
|
|
472
|
+
gl.deleteTexture(textureSource);
|
|
473
|
+
gl.deleteBuffer(vbo);
|
|
474
|
+
gl.deleteProgram(program);
|
|
475
|
+
gl.deleteVertexArray(vao);
|
|
476
|
+
}
|
|
477
|
+
})
|
|
404
478
|
},
|
|
405
479
|
schema: evolveSchema,
|
|
406
480
|
validateParams: validateEvolveParams
|