@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,177 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
vec3 applyWhiteBalanceLinear(vec3 linear, float temperature, float tint) {
|
|
21
|
-
vec3 temperatureOffset = vec3(0.3, 0.0, -0.3) * temperature;
|
|
22
|
-
vec3 tintOffset = vec3(0.15, -0.3, 0.15) * tint;
|
|
23
|
-
vec3 gains = exp2(temperatureOffset + tintOffset);
|
|
24
|
-
float luminanceGain = dot(gains, vec3(0.2126, 0.7152, 0.0722));
|
|
25
|
-
return linear * gains / luminanceGain;
|
|
26
|
-
}
|
|
27
|
-
`;
|
|
28
|
-
var SHADOWS_HIGHLIGHTS_GLSL = `
|
|
29
|
-
float getShadowsHighlightsStops(
|
|
30
|
-
vec3 color,
|
|
31
|
-
float shadows,
|
|
32
|
-
float highlights
|
|
33
|
-
) {
|
|
34
|
-
float luminance = dot(color, vec3(0.2126, 0.7152, 0.0722));
|
|
35
|
-
float shadowWeight = 1.0 - smoothstep(0.0, 0.6, luminance);
|
|
36
|
-
float highlightWeight = smoothstep(0.4, 1.0, luminance);
|
|
37
|
-
shadowWeight *= shadowWeight;
|
|
38
|
-
highlightWeight *= highlightWeight;
|
|
39
|
-
return shadows * shadowWeight + highlights * highlightWeight;
|
|
40
|
-
}
|
|
41
|
-
`;
|
|
42
|
-
var VIBRANCE_GLSL = `
|
|
43
|
-
vec3 applyVibrance(vec3 color, float amount) {
|
|
44
|
-
float maximum = max(max(color.r, color.g), color.b);
|
|
45
|
-
float minimum = min(min(color.r, color.g), color.b);
|
|
46
|
-
float lightness = (maximum + minimum) * 0.5;
|
|
47
|
-
float chroma = maximum - minimum;
|
|
48
|
-
float saturationDenominator = 1.0 - abs(2.0 * lightness - 1.0);
|
|
49
|
-
float saturation = saturationDenominator <= 0.0
|
|
50
|
-
? 0.0
|
|
51
|
-
: chroma / saturationDenominator;
|
|
52
|
-
|
|
53
|
-
if (saturation <= 0.000001) {
|
|
54
|
-
return color;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
float targetSaturation = amount >= 0.0
|
|
58
|
-
? saturation + amount * (1.0 - saturation)
|
|
59
|
-
: saturation * (1.0 + amount);
|
|
60
|
-
return clamp(
|
|
61
|
-
vec3(lightness) +
|
|
62
|
-
(color - vec3(lightness)) * (targetSaturation / saturation),
|
|
63
|
-
0.0,
|
|
64
|
-
1.0
|
|
65
|
-
);
|
|
66
|
-
}
|
|
67
|
-
`;
|
|
68
|
-
|
|
69
|
-
// src/validate-effect-param.ts
|
|
70
|
-
var assertEffectParamsObject = (params, effectLabel) => {
|
|
71
|
-
if (params === null || typeof params !== "object") {
|
|
72
|
-
throw new TypeError(`${effectLabel} effect requires a parameters object, but got ${JSON.stringify(params)}`);
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
var assertRequiredFiniteNumber = (value, name) => {
|
|
76
|
-
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
77
|
-
throw new TypeError(`"${name}" must be a finite number, but got ${JSON.stringify(value)}`);
|
|
78
|
-
}
|
|
79
|
-
};
|
|
80
|
-
var assertRequiredColor = (value, name) => {
|
|
81
|
-
if (typeof value !== "string" || value.length === 0) {
|
|
82
|
-
throw new TypeError(`"${name}" must be a non-empty string, but got ${JSON.stringify(value)}`);
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
var assertOptionalColor = (value, name) => {
|
|
86
|
-
if (value === undefined) {
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
assertRequiredColor(value, name);
|
|
90
|
-
};
|
|
91
|
-
var assertOptionalBoolean = (value, name) => {
|
|
92
|
-
if (value === undefined) {
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
if (typeof value !== "boolean") {
|
|
96
|
-
throw new TypeError(`"${name}" must be a boolean, but got ${JSON.stringify(value)}`);
|
|
97
|
-
}
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
// src/color-utils.ts
|
|
101
|
-
var DEFAULT_AMOUNT = 1;
|
|
102
|
-
var DEFAULT_BRIGHTNESS_AMOUNT = 0;
|
|
103
|
-
var DEFAULT_HUE_DEGREES = 0;
|
|
104
|
-
var colorAmountSchema = {
|
|
105
|
-
type: "number",
|
|
106
|
-
min: 0,
|
|
107
|
-
max: 1,
|
|
108
|
-
step: 0.01,
|
|
109
|
-
default: DEFAULT_AMOUNT,
|
|
110
|
-
description: "Amount",
|
|
111
|
-
hiddenFromList: false
|
|
112
|
-
};
|
|
113
|
-
var colorMultiplierSchema = {
|
|
114
|
-
type: "number",
|
|
115
|
-
min: 0,
|
|
116
|
-
step: 0.01,
|
|
117
|
-
default: DEFAULT_AMOUNT,
|
|
118
|
-
description: "Amount",
|
|
119
|
-
hiddenFromList: false
|
|
120
|
-
};
|
|
121
|
-
var brightnessAmountSchema = {
|
|
122
|
-
type: "number",
|
|
123
|
-
min: -1,
|
|
124
|
-
max: 1,
|
|
125
|
-
step: 0.01,
|
|
126
|
-
default: DEFAULT_BRIGHTNESS_AMOUNT,
|
|
127
|
-
description: "Amount",
|
|
128
|
-
hiddenFromList: false
|
|
129
|
-
};
|
|
130
|
-
var hueDegreesSchema = {
|
|
131
|
-
type: "rotation-degrees",
|
|
132
|
-
step: 1,
|
|
133
|
-
default: DEFAULT_HUE_DEGREES,
|
|
134
|
-
description: "Degrees"
|
|
135
|
-
};
|
|
136
|
-
var assertOptionalFiniteNumber = (value, name) => {
|
|
137
|
-
if (value === undefined) {
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
assertRequiredFiniteNumber(value, name);
|
|
141
|
-
};
|
|
142
|
-
var validateUnitInterval = (value, name) => {
|
|
143
|
-
if (value < 0) {
|
|
144
|
-
throw new TypeError(`"${name}" must be >= 0, but got ${JSON.stringify(value)}`);
|
|
145
|
-
}
|
|
146
|
-
if (value > 1) {
|
|
147
|
-
throw new TypeError(`"${name}" must be <= 1, but got ${JSON.stringify(value)}`);
|
|
148
|
-
}
|
|
149
|
-
};
|
|
150
|
-
var validateNonNegative = (value, name) => {
|
|
151
|
-
if (value < 0) {
|
|
152
|
-
throw new TypeError(`"${name}" must be >= 0, but got ${JSON.stringify(value)}`);
|
|
153
|
-
}
|
|
154
|
-
};
|
|
155
|
-
var validateSignedUnitInterval = (value, name) => {
|
|
156
|
-
if (value < -1) {
|
|
157
|
-
throw new TypeError(`"${name}" must be >= -1, but got ${JSON.stringify(value)}`);
|
|
158
|
-
}
|
|
159
|
-
if (value > 1) {
|
|
160
|
-
throw new TypeError(`"${name}" must be <= 1, but got ${JSON.stringify(value)}`);
|
|
161
|
-
}
|
|
162
|
-
};
|
|
163
|
-
var clampColorChannel = (value) => {
|
|
164
|
-
return Math.max(0, Math.min(255, value));
|
|
165
|
-
};
|
|
166
|
-
var parseColorRgba = (ctx, color) => {
|
|
167
|
-
ctx.clearRect(0, 0, 1, 1);
|
|
168
|
-
ctx.fillStyle = color;
|
|
169
|
-
ctx.fillRect(0, 0, 1, 1);
|
|
170
|
-
const { data } = ctx.getImageData(0, 0, 1, 1);
|
|
171
|
-
return [data[0], data[1], data[2], data[3]];
|
|
172
|
-
};
|
|
1
|
+
import {
|
|
2
|
+
COLOR_SPACE_GLSL,
|
|
3
|
+
WHITE_BALANCE_GLSL,
|
|
4
|
+
COLOR_SPACE_WGSL,
|
|
5
|
+
WHITE_BALANCE_WGSL
|
|
6
|
+
} from "./index-6jkps947.mjs";
|
|
7
|
+
import {
|
|
8
|
+
assertOptionalFiniteNumber,
|
|
9
|
+
validateSignedUnitInterval
|
|
10
|
+
} from "./index-wxhvgv2s.mjs";
|
|
11
|
+
import {
|
|
12
|
+
WEBGPU_SINGLE_PASS_VERTEX,
|
|
13
|
+
setupWebGpuSinglePass,
|
|
14
|
+
cleanupWebGpuSinglePass,
|
|
15
|
+
applyWebGpuSinglePass
|
|
16
|
+
} from "./index-tvfexb7s.mjs";
|
|
17
|
+
import {
|
|
18
|
+
assertEffectParamsObject
|
|
19
|
+
} from "./index-4fvp93ps.mjs";
|
|
173
20
|
|
|
174
21
|
// src/white-balance.ts
|
|
22
|
+
import { Internals } from "remotion";
|
|
175
23
|
var { createEffect, createWebGL2ContextError } = Internals;
|
|
176
24
|
var DEFAULT_TEMPERATURE = 0;
|
|
177
25
|
var DEFAULT_TINT = 0;
|
|
@@ -247,6 +95,32 @@ void main() {
|
|
|
247
95
|
fragColor = vec4(corrected * alpha, alpha);
|
|
248
96
|
}
|
|
249
97
|
`;
|
|
98
|
+
var WEBGPU_SHADER = `
|
|
99
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
100
|
+
struct Params {
|
|
101
|
+
temperature: f32,
|
|
102
|
+
tint: f32,
|
|
103
|
+
padding0: f32,
|
|
104
|
+
padding1: f32,
|
|
105
|
+
}
|
|
106
|
+
@group(0) @binding(0) var source: texture_2d<f32>;
|
|
107
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
108
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
109
|
+
${COLOR_SPACE_WGSL}
|
|
110
|
+
${WHITE_BALANCE_WGSL}
|
|
111
|
+
|
|
112
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
113
|
+
let sourceColor = textureSampleLevel(source, sourceSampler, input.uv, 0.0);
|
|
114
|
+
let alpha = sourceColor.a;
|
|
115
|
+
if (alpha <= 0.0) {
|
|
116
|
+
return vec4f(0.0);
|
|
117
|
+
}
|
|
118
|
+
let linear = srgbToLinear(sourceColor.rgb / alpha);
|
|
119
|
+
let balanced = applyWhiteBalanceLinear(linear, params.temperature, params.tint);
|
|
120
|
+
let corrected = linearToSrgb(balanced);
|
|
121
|
+
return vec4f(corrected * alpha, alpha);
|
|
122
|
+
}
|
|
123
|
+
`;
|
|
250
124
|
var compileShader = (gl, type, source) => {
|
|
251
125
|
const shader = gl.createShader(type);
|
|
252
126
|
if (!shader) {
|
|
@@ -339,42 +213,64 @@ var whiteBalance = createEffect({
|
|
|
339
213
|
type: "remotion/white-balance",
|
|
340
214
|
label: "whiteBalance()",
|
|
341
215
|
documentationLink: "https://www.remotion.dev/docs/effects/white-balance",
|
|
342
|
-
backend: "webgl2",
|
|
343
216
|
calculateKey: (params) => {
|
|
344
217
|
const { temperature, tint } = resolve(params);
|
|
345
218
|
return `white-balance-${temperature}-${tint}`;
|
|
346
219
|
},
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
220
|
+
implementations: {
|
|
221
|
+
webgpu: Internals.createEffectImplementation({
|
|
222
|
+
setup: (target) => setupWebGpuSinglePass(target, "white balance"),
|
|
223
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
224
|
+
if (!gpuDevice) {
|
|
225
|
+
throw new Error("A WebGPU device is required for the white balance effect");
|
|
226
|
+
}
|
|
227
|
+
const r = resolve(params);
|
|
228
|
+
applyWebGpuSinglePass({
|
|
229
|
+
state,
|
|
230
|
+
source,
|
|
231
|
+
width,
|
|
232
|
+
height,
|
|
233
|
+
device: gpuDevice,
|
|
234
|
+
shader: WEBGPU_SHADER,
|
|
235
|
+
uniformData: new Float32Array([r.temperature, r.tint, 0, 0])
|
|
236
|
+
});
|
|
237
|
+
},
|
|
238
|
+
cleanup: cleanupWebGpuSinglePass
|
|
239
|
+
}),
|
|
240
|
+
webgl2: Internals.createEffectImplementation({
|
|
241
|
+
setup: setupWhiteBalance,
|
|
242
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
243
|
+
const { temperature, tint } = resolve(params);
|
|
244
|
+
const { gl, program, textureSource, uniforms, vao } = state;
|
|
245
|
+
gl.viewport(0, 0, width, height);
|
|
246
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
247
|
+
gl.clearColor(0, 0, 0, 0);
|
|
248
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
249
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
250
|
+
gl.bindTexture(gl.TEXTURE_2D, textureSource);
|
|
251
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
252
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
253
|
+
gl.useProgram(program);
|
|
254
|
+
if (uniforms.uSource)
|
|
255
|
+
gl.uniform1i(uniforms.uSource, 0);
|
|
256
|
+
if (uniforms.uTemperature) {
|
|
257
|
+
gl.uniform1f(uniforms.uTemperature, temperature);
|
|
258
|
+
}
|
|
259
|
+
if (uniforms.uTint)
|
|
260
|
+
gl.uniform1f(uniforms.uTint, tint);
|
|
261
|
+
gl.bindVertexArray(vao);
|
|
262
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
263
|
+
gl.bindVertexArray(null);
|
|
264
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
265
|
+
gl.useProgram(null);
|
|
266
|
+
},
|
|
267
|
+
cleanup: ({ gl, program, vao, vbo, textureSource }) => {
|
|
268
|
+
gl.deleteTexture(textureSource);
|
|
269
|
+
gl.deleteBuffer(vbo);
|
|
270
|
+
gl.deleteProgram(program);
|
|
271
|
+
gl.deleteVertexArray(vao);
|
|
272
|
+
}
|
|
273
|
+
})
|
|
378
274
|
},
|
|
379
275
|
schema: whiteBalanceSchema,
|
|
380
276
|
validateParams: validateWhiteBalanceParams
|
package/dist/esm/white-noise.mjs
CHANGED
|
@@ -1,114 +1,44 @@
|
|
|
1
|
+
import {
|
|
2
|
+
assertOptionalFiniteNumber,
|
|
3
|
+
validateUnitInterval
|
|
4
|
+
} from "./index-wxhvgv2s.mjs";
|
|
5
|
+
import {
|
|
6
|
+
WEBGPU_SINGLE_PASS_VERTEX,
|
|
7
|
+
setupWebGpuSinglePass,
|
|
8
|
+
cleanupWebGpuSinglePass,
|
|
9
|
+
applyWebGpuSinglePass
|
|
10
|
+
} from "./index-tvfexb7s.mjs";
|
|
11
|
+
import {
|
|
12
|
+
assertEffectParamsObject
|
|
13
|
+
} from "./index-4fvp93ps.mjs";
|
|
14
|
+
|
|
1
15
|
// src/white-noise.ts
|
|
2
16
|
import { Internals } from "remotion";
|
|
3
17
|
|
|
4
|
-
// src/
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
};
|
|
18
|
+
// src/white-noise-webgpu-shader.ts
|
|
19
|
+
var WHITE_NOISE_WEBGPU_SHADER = `
|
|
20
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
21
|
+
@group(0) @binding(0) var source: texture_2d<f32>;
|
|
22
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
23
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
34
24
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
};
|
|
25
|
+
struct Params { size: vec2f, amount: f32, seed: f32, }
|
|
26
|
+
fn random(co: vec2f) -> f32 {
|
|
27
|
+
return fract(sin(dot(co, vec2f(12.9898, 78.233)) + params.seed * 37.719) * 43758.5453);
|
|
28
|
+
}
|
|
29
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
30
|
+
let color = textureSampleLevel(source, sourceSampler, input.uv, 0);
|
|
31
|
+
let noise = random(vec2f(input.position.x, params.size.y - input.position.y));
|
|
32
|
+
var rgb = vec3f(0);
|
|
33
|
+
if (color.a != 0.0) { rgb = color.rgb / color.a; }
|
|
34
|
+
return vec4f(mix(rgb, vec3f(noise), params.amount) * color.a, color.a);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
`;
|
|
108
38
|
|
|
109
39
|
// src/white-noise.ts
|
|
110
40
|
var { createEffect, createWebGL2ContextError } = Internals;
|
|
111
|
-
var
|
|
41
|
+
var DEFAULT_AMOUNT = 1;
|
|
112
42
|
var DEFAULT_SEED = 0;
|
|
113
43
|
var whiteNoiseSchema = {
|
|
114
44
|
amount: {
|
|
@@ -116,7 +46,7 @@ var whiteNoiseSchema = {
|
|
|
116
46
|
min: 0,
|
|
117
47
|
max: 1,
|
|
118
48
|
step: 0.01,
|
|
119
|
-
default:
|
|
49
|
+
default: DEFAULT_AMOUNT,
|
|
120
50
|
description: "Amount",
|
|
121
51
|
hiddenFromList: false
|
|
122
52
|
},
|
|
@@ -129,14 +59,14 @@ var whiteNoiseSchema = {
|
|
|
129
59
|
}
|
|
130
60
|
};
|
|
131
61
|
var resolve = (params) => ({
|
|
132
|
-
amount: params.amount ??
|
|
62
|
+
amount: params.amount ?? DEFAULT_AMOUNT,
|
|
133
63
|
seed: params.seed ?? DEFAULT_SEED
|
|
134
64
|
});
|
|
135
65
|
var validateWhiteNoiseParams = (params) => {
|
|
136
66
|
assertEffectParamsObject(params, "White noise");
|
|
137
67
|
assertOptionalFiniteNumber(params.amount, "amount");
|
|
138
68
|
assertOptionalFiniteNumber(params.seed, "seed");
|
|
139
|
-
validateUnitInterval(params.amount ??
|
|
69
|
+
validateUnitInterval(params.amount ?? DEFAULT_AMOUNT, "amount");
|
|
140
70
|
};
|
|
141
71
|
var VERTEX_SHADER = `#version 300 es
|
|
142
72
|
in vec2 aPos;
|
|
@@ -240,49 +170,71 @@ var whiteNoise = createEffect({
|
|
|
240
170
|
type: "dev.remotion.effects.whiteNoise",
|
|
241
171
|
label: "whiteNoise()",
|
|
242
172
|
documentationLink: "https://www.remotion.dev/docs/effects/white-noise",
|
|
243
|
-
backend: "webgl2",
|
|
244
173
|
calculateKey: (params) => {
|
|
245
174
|
const resolved = resolve(params);
|
|
246
175
|
return `white-noise-${resolved.amount}-${resolved.seed}`;
|
|
247
176
|
},
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
177
|
+
implementations: {
|
|
178
|
+
webgpu: Internals.createEffectImplementation({
|
|
179
|
+
setup: (target) => setupWebGpuSinglePass(target, "white-noise"),
|
|
180
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
181
|
+
if (!gpuDevice)
|
|
182
|
+
throw new Error("A WebGPU device is required for the white-noise effect");
|
|
183
|
+
const r = resolve(params);
|
|
184
|
+
const uniformData = new Float32Array([width, height, r.amount, r.seed]);
|
|
185
|
+
applyWebGpuSinglePass({
|
|
186
|
+
state,
|
|
187
|
+
source,
|
|
188
|
+
width,
|
|
189
|
+
height,
|
|
190
|
+
device: gpuDevice,
|
|
191
|
+
shader: WHITE_NOISE_WEBGPU_SHADER,
|
|
192
|
+
uniformData
|
|
193
|
+
});
|
|
194
|
+
},
|
|
195
|
+
cleanup: cleanupWebGpuSinglePass
|
|
196
|
+
}),
|
|
197
|
+
webgl2: Internals.createEffectImplementation({
|
|
198
|
+
setup: (target) => {
|
|
199
|
+
const gl = target.getContext("webgl2", {
|
|
200
|
+
premultipliedAlpha: true,
|
|
201
|
+
alpha: true,
|
|
202
|
+
preserveDrawingBuffer: true
|
|
203
|
+
});
|
|
204
|
+
if (!gl) {
|
|
205
|
+
throw createWebGL2ContextError("white noise effect");
|
|
206
|
+
}
|
|
207
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
|
|
208
|
+
return createWhiteNoiseState(gl, VERTEX_SHADER, FRAGMENT_SHADER);
|
|
209
|
+
},
|
|
210
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
211
|
+
const resolved = resolve(params);
|
|
212
|
+
state.gl.viewport(0, 0, width, height);
|
|
213
|
+
state.gl.bindFramebuffer(state.gl.FRAMEBUFFER, null);
|
|
214
|
+
state.gl.activeTexture(state.gl.TEXTURE0);
|
|
215
|
+
state.gl.bindTexture(state.gl.TEXTURE_2D, state.texture);
|
|
216
|
+
state.gl.pixelStorei(state.gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
217
|
+
state.gl.texImage2D(state.gl.TEXTURE_2D, 0, state.gl.RGBA, state.gl.RGBA, state.gl.UNSIGNED_BYTE, source);
|
|
218
|
+
state.gl.useProgram(state.program);
|
|
219
|
+
if (state.uSource) {
|
|
220
|
+
state.gl.uniform1i(state.uSource, 0);
|
|
221
|
+
}
|
|
222
|
+
if (state.uAmount) {
|
|
223
|
+
state.gl.uniform1f(state.uAmount, resolved.amount);
|
|
224
|
+
}
|
|
225
|
+
if (state.uSeed) {
|
|
226
|
+
state.gl.uniform1f(state.uSeed, resolved.seed);
|
|
227
|
+
}
|
|
228
|
+
state.gl.bindVertexArray(state.vao);
|
|
229
|
+
state.gl.drawArrays(state.gl.TRIANGLE_STRIP, 0, 4);
|
|
230
|
+
},
|
|
231
|
+
cleanup: ({ gl, program, vao, vbo, texture }) => {
|
|
232
|
+
gl.deleteTexture(texture);
|
|
233
|
+
gl.deleteBuffer(vbo);
|
|
234
|
+
gl.deleteProgram(program);
|
|
235
|
+
gl.deleteVertexArray(vao);
|
|
236
|
+
}
|
|
237
|
+
})
|
|
286
238
|
},
|
|
287
239
|
schema: whiteNoiseSchema,
|
|
288
240
|
validateParams: validateWhiteNoiseParams
|