@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
|
+
SHADOWS_HIGHLIGHTS_GLSL,
|
|
4
|
+
COLOR_SPACE_WGSL,
|
|
5
|
+
SHADOWS_HIGHLIGHTS_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/shadows-highlights.ts
|
|
22
|
+
import { Internals } from "remotion";
|
|
175
23
|
var { createEffect, createWebGL2ContextError } = Internals;
|
|
176
24
|
var DEFAULT_SHADOWS = 0;
|
|
177
25
|
var DEFAULT_HIGHLIGHTS = 0;
|
|
@@ -248,6 +96,34 @@ void main() {
|
|
|
248
96
|
fragColor = vec4(corrected * alpha, alpha);
|
|
249
97
|
}
|
|
250
98
|
`;
|
|
99
|
+
var WEBGPU_SHADER = `
|
|
100
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
101
|
+
struct Params {
|
|
102
|
+
shadows: f32,
|
|
103
|
+
highlights: f32,
|
|
104
|
+
padding0: f32,
|
|
105
|
+
padding1: f32,
|
|
106
|
+
}
|
|
107
|
+
@group(0) @binding(0) var source: texture_2d<f32>;
|
|
108
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
109
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
110
|
+
${COLOR_SPACE_WGSL}
|
|
111
|
+
${SHADOWS_HIGHLIGHTS_WGSL}
|
|
112
|
+
|
|
113
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
114
|
+
let sourceColor = textureSampleLevel(source, sourceSampler, input.uv, 0.0);
|
|
115
|
+
let alpha = sourceColor.a;
|
|
116
|
+
if (alpha <= 0.0) {
|
|
117
|
+
return vec4f(0.0);
|
|
118
|
+
}
|
|
119
|
+
let color = sourceColor.rgb / alpha;
|
|
120
|
+
let stops = getShadowsHighlightsStops(color, params.shadows, params.highlights);
|
|
121
|
+
let linear = srgbToLinear(color);
|
|
122
|
+
let adjusted = linear * exp2(stops);
|
|
123
|
+
let corrected = linearToSrgb(adjusted);
|
|
124
|
+
return vec4f(corrected * alpha, alpha);
|
|
125
|
+
}
|
|
126
|
+
`;
|
|
251
127
|
var compileShader = (gl, type, source) => {
|
|
252
128
|
const shader = gl.createShader(type);
|
|
253
129
|
if (!shader) {
|
|
@@ -340,43 +216,65 @@ var shadowsHighlights = createEffect({
|
|
|
340
216
|
type: "remotion/shadows-highlights",
|
|
341
217
|
label: "shadowsHighlights()",
|
|
342
218
|
documentationLink: "https://www.remotion.dev/docs/effects/shadows-highlights",
|
|
343
|
-
backend: "webgl2",
|
|
344
219
|
calculateKey: (params) => {
|
|
345
220
|
const { shadows, highlights } = resolve(params);
|
|
346
221
|
return `shadows-highlights-${shadows}-${highlights}`;
|
|
347
222
|
},
|
|
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
|
-
|
|
378
|
-
|
|
379
|
-
|
|
223
|
+
implementations: {
|
|
224
|
+
webgpu: Internals.createEffectImplementation({
|
|
225
|
+
setup: (target) => setupWebGpuSinglePass(target, "shadows and highlights"),
|
|
226
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
227
|
+
if (!gpuDevice) {
|
|
228
|
+
throw new Error("A WebGPU device is required for the shadows and highlights effect");
|
|
229
|
+
}
|
|
230
|
+
const r = resolve(params);
|
|
231
|
+
applyWebGpuSinglePass({
|
|
232
|
+
state,
|
|
233
|
+
source,
|
|
234
|
+
width,
|
|
235
|
+
height,
|
|
236
|
+
device: gpuDevice,
|
|
237
|
+
shader: WEBGPU_SHADER,
|
|
238
|
+
uniformData: new Float32Array([r.shadows, r.highlights, 0, 0])
|
|
239
|
+
});
|
|
240
|
+
},
|
|
241
|
+
cleanup: cleanupWebGpuSinglePass
|
|
242
|
+
}),
|
|
243
|
+
webgl2: Internals.createEffectImplementation({
|
|
244
|
+
setup: setupShadowsHighlights,
|
|
245
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
246
|
+
const { shadows, highlights } = resolve(params);
|
|
247
|
+
const { gl, program, textureSource, uniforms, vao } = state;
|
|
248
|
+
gl.viewport(0, 0, width, height);
|
|
249
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
250
|
+
gl.clearColor(0, 0, 0, 0);
|
|
251
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
252
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
253
|
+
gl.bindTexture(gl.TEXTURE_2D, textureSource);
|
|
254
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
255
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
256
|
+
gl.useProgram(program);
|
|
257
|
+
if (uniforms.uSource)
|
|
258
|
+
gl.uniform1i(uniforms.uSource, 0);
|
|
259
|
+
if (uniforms.uShadows) {
|
|
260
|
+
gl.uniform1f(uniforms.uShadows, shadows);
|
|
261
|
+
}
|
|
262
|
+
if (uniforms.uHighlights) {
|
|
263
|
+
gl.uniform1f(uniforms.uHighlights, highlights);
|
|
264
|
+
}
|
|
265
|
+
gl.bindVertexArray(vao);
|
|
266
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
267
|
+
gl.bindVertexArray(null);
|
|
268
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
269
|
+
gl.useProgram(null);
|
|
270
|
+
},
|
|
271
|
+
cleanup: ({ gl, program, vao, vbo, textureSource }) => {
|
|
272
|
+
gl.deleteTexture(textureSource);
|
|
273
|
+
gl.deleteBuffer(vbo);
|
|
274
|
+
gl.deleteProgram(program);
|
|
275
|
+
gl.deleteVertexArray(vao);
|
|
276
|
+
}
|
|
277
|
+
})
|
|
380
278
|
},
|
|
381
279
|
schema: shadowsHighlightsSchema,
|
|
382
280
|
validateParams: validateShadowsHighlightsParams
|
package/dist/esm/shatter.mjs
CHANGED
|
@@ -1,111 +1,20 @@
|
|
|
1
|
+
import {
|
|
2
|
+
setupWebGpuMesh,
|
|
3
|
+
cleanupWebGpuMesh,
|
|
4
|
+
applyWebGpuMesh
|
|
5
|
+
} from "./index-4scpn12x.mjs";
|
|
6
|
+
import {
|
|
7
|
+
assertOptionalFiniteNumber,
|
|
8
|
+
validateUnitInterval,
|
|
9
|
+
validateNonNegative
|
|
10
|
+
} from "./index-wxhvgv2s.mjs";
|
|
11
|
+
import {
|
|
12
|
+
assertEffectParamsObject
|
|
13
|
+
} from "./index-4fvp93ps.mjs";
|
|
14
|
+
|
|
1
15
|
// src/shatter/index.ts
|
|
2
16
|
import { Internals } from "remotion";
|
|
3
17
|
|
|
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
18
|
// src/shatter/geometry.ts
|
|
110
19
|
var signedTriangleArea = (a, b, c) => (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
|
|
111
20
|
var hash = (x, y, seed) => {
|
|
@@ -591,25 +500,28 @@ var drawShatter = ({
|
|
|
591
500
|
gl.clearColor(0, 0, 0, 0);
|
|
592
501
|
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
593
502
|
gl.enable(gl.BLEND);
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
503
|
+
try {
|
|
504
|
+
gl.blendEquation(gl.FUNC_ADD);
|
|
505
|
+
gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
|
|
506
|
+
gl.useProgram(program);
|
|
507
|
+
gl.bindVertexArray(vao);
|
|
508
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
|
|
509
|
+
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.DYNAMIC_DRAW);
|
|
510
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
511
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
512
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
|
|
513
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
514
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
515
|
+
gl.uniform1i(uSource, 0);
|
|
516
|
+
gl.uniform2f(uResolution, width, height);
|
|
517
|
+
gl.drawArrays(gl.TRIANGLES, 0, vertices.length / 7);
|
|
518
|
+
gl.bindVertexArray(null);
|
|
519
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, null);
|
|
520
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
521
|
+
gl.useProgram(null);
|
|
522
|
+
} finally {
|
|
523
|
+
gl.disable(gl.BLEND);
|
|
524
|
+
}
|
|
613
525
|
};
|
|
614
526
|
var cleanupShatter = ({
|
|
615
527
|
gl,
|
|
@@ -624,6 +536,39 @@ var cleanupShatter = ({
|
|
|
624
536
|
gl.deleteProgram(program);
|
|
625
537
|
};
|
|
626
538
|
|
|
539
|
+
// src/shatter/webgpu-shader.ts
|
|
540
|
+
var SHATTER_WEBGPU_SHADER = `
|
|
541
|
+
struct Params {resolution: vec2f,}
|
|
542
|
+
struct VertexOutput {
|
|
543
|
+
@builtin(position) position: vec4f,
|
|
544
|
+
@location(0) uv: vec2f,
|
|
545
|
+
@location(1) shade: f32,
|
|
546
|
+
@location(2) side: f32,
|
|
547
|
+
}
|
|
548
|
+
@group(0) @binding(0) var source: texture_2d<f32>;
|
|
549
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
550
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
551
|
+
@group(0) @binding(3) var<storage, read> vertices: array<f32>;
|
|
552
|
+
@vertex fn vertex(@builtin(vertex_index) index: u32) -> VertexOutput {
|
|
553
|
+
let offset=index*7u;
|
|
554
|
+
let point=vec3f(vertices[offset],vertices[offset+1u],vertices[offset+2u]);
|
|
555
|
+
let distance=max(params.resolution.x,params.resolution.y)*2.0;
|
|
556
|
+
let near=distance*0.05;
|
|
557
|
+
let w=distance+point.z;
|
|
558
|
+
let position=vec2f((point.x-params.resolution.x*0.5)*2.0/params.resolution.x,(params.resolution.y*0.5-point.y)*2.0/params.resolution.y);
|
|
559
|
+
var output: VertexOutput;
|
|
560
|
+
// WebGPU's clip depth is [0,w], corresponding to WebGL's [-w,w].
|
|
561
|
+
output.position=vec4f(position*vec2f(1,-1)*distance,w-near,w);
|
|
562
|
+
output.uv=vec2f(vertices[offset+3u],vertices[offset+4u]);
|
|
563
|
+
output.shade=vertices[offset+5u];output.side=vertices[offset+6u];
|
|
564
|
+
return output;
|
|
565
|
+
}
|
|
566
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
567
|
+
let color=textureSample(source,sourceSampler,input.uv);
|
|
568
|
+
return vec4f(mix(color.rgb,vec3f(color.a),input.side)*input.shade,color.a);
|
|
569
|
+
}
|
|
570
|
+
`;
|
|
571
|
+
|
|
627
572
|
// src/shatter/index.ts
|
|
628
573
|
var { createEffect, createWebGL2ContextError } = Internals;
|
|
629
574
|
var DEFAULT_TIME = 0.5;
|
|
@@ -799,7 +744,6 @@ var shatter = createEffect({
|
|
|
799
744
|
type: "remotion/shatter",
|
|
800
745
|
label: "shatter()",
|
|
801
746
|
documentationLink: "https://www.remotion.dev/docs/effects/shatter",
|
|
802
|
-
backend: "webgl2",
|
|
803
747
|
schema: shatterSchema,
|
|
804
748
|
validateParams: (params) => {
|
|
805
749
|
assertEffectParamsObject(params, "Shatter");
|
|
@@ -854,34 +798,70 @@ var shatter = createEffect({
|
|
|
854
798
|
}
|
|
855
799
|
},
|
|
856
800
|
calculateKey: (params) => `shatter-${JSON.stringify(resolve(params))}`,
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
801
|
+
implementations: {
|
|
802
|
+
webgpu: Internals.createEffectImplementation({
|
|
803
|
+
setup: (target) => ({
|
|
804
|
+
...setupWebGpuMesh(target, "shatter"),
|
|
805
|
+
geometryKey: null,
|
|
806
|
+
vertices: null
|
|
807
|
+
}),
|
|
808
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
809
|
+
if (!gpuDevice)
|
|
810
|
+
throw new Error("A WebGPU device is required for shatter");
|
|
811
|
+
const r = resolve(params);
|
|
812
|
+
const geometryKey = `${width}:${height}:${JSON.stringify(r)}`;
|
|
813
|
+
if (state.geometryKey !== geometryKey || state.vertices === null) {
|
|
814
|
+
state.vertices = createShatterGeometry(width, height, r);
|
|
815
|
+
state.geometryKey = geometryKey;
|
|
816
|
+
}
|
|
817
|
+
applyWebGpuMesh({
|
|
818
|
+
state,
|
|
819
|
+
source,
|
|
820
|
+
width,
|
|
821
|
+
height,
|
|
822
|
+
vertices: state.vertices,
|
|
823
|
+
shader: SHATTER_WEBGPU_SHADER,
|
|
824
|
+
uniformData: new Float32Array([width, height, 0, 0]),
|
|
825
|
+
topology: "triangle-list",
|
|
826
|
+
blend: true,
|
|
827
|
+
vertexCount: state.vertices.length / 7,
|
|
828
|
+
instanceCount: 1,
|
|
829
|
+
device: gpuDevice
|
|
830
|
+
});
|
|
831
|
+
},
|
|
832
|
+
cleanup: cleanupWebGpuMesh
|
|
833
|
+
}),
|
|
834
|
+
webgl2: Internals.createEffectImplementation({
|
|
835
|
+
setup: (target) => {
|
|
836
|
+
const gl = target.getContext("webgl2", {
|
|
837
|
+
premultipliedAlpha: true,
|
|
838
|
+
alpha: true,
|
|
839
|
+
preserveDrawingBuffer: true
|
|
840
|
+
});
|
|
841
|
+
if (!gl) {
|
|
842
|
+
throw createWebGL2ContextError("shatter effect");
|
|
843
|
+
}
|
|
844
|
+
return { ...setupShatter(gl), geometryKey: null, vertices: null };
|
|
845
|
+
},
|
|
846
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
847
|
+
const r = resolve(params);
|
|
848
|
+
const geometryKey = `${width}:${height}:${JSON.stringify(r)}`;
|
|
849
|
+
if (state.geometryKey !== geometryKey || state.vertices === null) {
|
|
850
|
+
state.vertices = createShatterGeometry(width, height, r);
|
|
851
|
+
state.geometryKey = geometryKey;
|
|
852
|
+
}
|
|
853
|
+
drawShatter({
|
|
854
|
+
state,
|
|
855
|
+
source,
|
|
856
|
+
width,
|
|
857
|
+
height,
|
|
858
|
+
flipSourceY,
|
|
859
|
+
vertices: state.vertices
|
|
860
|
+
});
|
|
861
|
+
},
|
|
862
|
+
cleanup: cleanupShatter
|
|
863
|
+
})
|
|
864
|
+
}
|
|
885
865
|
});
|
|
886
866
|
export {
|
|
887
867
|
shatter
|