@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,132 +1,39 @@
|
|
|
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
|
+
} 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";
|
|
108
14
|
|
|
109
15
|
// src/tv-signal-off.ts
|
|
16
|
+
import { Internals } from "remotion";
|
|
110
17
|
var { createEffect, createWebGL2ContextError } = Internals;
|
|
111
|
-
var
|
|
18
|
+
var DEFAULT_AMOUNT = 1;
|
|
112
19
|
var tvSignalOffSchema = {
|
|
113
20
|
amount: {
|
|
114
21
|
type: "number",
|
|
115
22
|
min: 0,
|
|
116
23
|
max: 1,
|
|
117
24
|
step: 0.01,
|
|
118
|
-
default:
|
|
25
|
+
default: DEFAULT_AMOUNT,
|
|
119
26
|
description: "Amount",
|
|
120
27
|
hiddenFromList: false
|
|
121
28
|
}
|
|
122
29
|
};
|
|
123
30
|
var resolve = (params) => ({
|
|
124
|
-
amount: params.amount ??
|
|
31
|
+
amount: params.amount ?? DEFAULT_AMOUNT
|
|
125
32
|
});
|
|
126
33
|
var validateTvSignalOffParams = (params) => {
|
|
127
34
|
assertEffectParamsObject(params, "TV signal off");
|
|
128
35
|
assertOptionalFiniteNumber(params.amount, "amount");
|
|
129
|
-
validateUnitInterval(params.amount ??
|
|
36
|
+
validateUnitInterval(params.amount ?? DEFAULT_AMOUNT, "amount");
|
|
130
37
|
};
|
|
131
38
|
var VERTEX_SHADER = `#version 300 es
|
|
132
39
|
in vec2 aPos;
|
|
@@ -146,6 +53,7 @@ out vec4 fragColor;
|
|
|
146
53
|
|
|
147
54
|
uniform sampler2D uSource;
|
|
148
55
|
uniform float uAmount;
|
|
56
|
+
uniform vec2 uResolution;
|
|
149
57
|
|
|
150
58
|
vec3 topBar(float x) {
|
|
151
59
|
if (x < 1.0 / 7.0) return vec3(0.74);
|
|
@@ -193,7 +101,8 @@ vec3 tvPattern(vec2 uv) {
|
|
|
193
101
|
void main() {
|
|
194
102
|
vec4 color = texture(uSource, vUv);
|
|
195
103
|
vec3 sourceColor = color.a == 0.0 ? vec3(0.0) : color.rgb / color.a;
|
|
196
|
-
|
|
104
|
+
// Exact pixel centers keep stepped bars stable at fractional boundaries.
|
|
105
|
+
vec3 bars = tvPattern(gl_FragCoord.xy / uResolution);
|
|
197
106
|
vec3 mixed = mix(sourceColor, bars, uAmount);
|
|
198
107
|
|
|
199
108
|
fragColor = vec4(mixed * color.a, color.a);
|
|
@@ -261,53 +170,135 @@ var createTvSignalOffState = (gl, vertexSource, fragmentSource) => {
|
|
|
261
170
|
vbo,
|
|
262
171
|
texture,
|
|
263
172
|
uSource: gl.getUniformLocation(program, "uSource"),
|
|
264
|
-
uAmount: gl.getUniformLocation(program, "uAmount")
|
|
173
|
+
uAmount: gl.getUniformLocation(program, "uAmount"),
|
|
174
|
+
uResolution: gl.getUniformLocation(program, "uResolution")
|
|
265
175
|
};
|
|
266
176
|
};
|
|
177
|
+
var TV_SIGNAL_OFF_WEBGPU_SHADER = `
|
|
178
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
179
|
+
@group(0) @binding(0) var source: texture_2d<f32>;
|
|
180
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
181
|
+
@group(0) @binding(2) var<uniform> params: vec4f;
|
|
182
|
+
fn topBar(x: f32) -> vec3f {
|
|
183
|
+
if (x < 1.0 / 7.0) { return vec3f(0.74); }
|
|
184
|
+
if (x < 2.0 / 7.0) { return vec3f(1.0, 1.0, 0.0); }
|
|
185
|
+
if (x < 3.0 / 7.0) { return vec3f(0.0, 1.0, 1.0); }
|
|
186
|
+
if (x < 4.0 / 7.0) { return vec3f(0.0, 1.0, 0.0); }
|
|
187
|
+
if (x < 5.0 / 7.0) { return vec3f(1.0, 0.0, 1.0); }
|
|
188
|
+
if (x < 6.0 / 7.0) { return vec3f(1.0, 0.0, 0.0); }
|
|
189
|
+
return vec3f(0.0, 0.0, 1.0);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
fn middleBar(x: f32) -> vec3f {
|
|
193
|
+
if (x < 1.0 / 7.0) { return vec3f(0.0, 0.0, 1.0); }
|
|
194
|
+
if (x < 2.0 / 7.0) { return vec3f(0.0); }
|
|
195
|
+
if (x < 3.0 / 7.0) { return vec3f(1.0, 0.0, 1.0); }
|
|
196
|
+
if (x < 4.0 / 7.0) { return vec3f(0.0); }
|
|
197
|
+
if (x < 5.0 / 7.0) { return vec3f(0.0, 1.0, 1.0); }
|
|
198
|
+
if (x < 6.0 / 7.0) { return vec3f(0.0); }
|
|
199
|
+
return vec3f(0.74);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
fn tvPattern(uv: vec2f) -> vec3f {
|
|
203
|
+
if (uv.y < 0.64) {
|
|
204
|
+
return topBar(uv.x);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
if (uv.y < 0.76) {
|
|
208
|
+
return middleBar(uv.x);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (uv.y < 0.88) {
|
|
212
|
+
if (uv.x < 0.58) { return vec3f(1.0); }
|
|
213
|
+
let ramp = smoothstep(0.58, 1.0, uv.x);
|
|
214
|
+
return vec3f(1.0 - ramp);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
if (uv.x < 0.58) {
|
|
218
|
+
let stepValue = floor(uv.x * 12.0) / 11.0;
|
|
219
|
+
return vec3f(stepValue);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
return vec3f(0.0);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
226
|
+
let color = textureSampleLevel(source, sourceSampler, input.uv, 0);
|
|
227
|
+
if (color.a == 0.0) {return vec4f(0);}
|
|
228
|
+
let bars = tvPattern(vec2f(input.position.x, params.z - input.position.y) / params.yz);
|
|
229
|
+
return vec4f(mix(color.rgb / color.a, bars, params.x) * color.a, color.a);
|
|
230
|
+
}
|
|
231
|
+
`;
|
|
267
232
|
var tvSignalOff = createEffect({
|
|
268
233
|
type: "dev.remotion.effects.tvSignalOff",
|
|
269
234
|
label: "tvSignalOff()",
|
|
270
235
|
documentationLink: "https://www.remotion.dev/docs/effects/tv-signal-off",
|
|
271
|
-
backend: "webgl2",
|
|
272
236
|
calculateKey: (params) => {
|
|
273
237
|
const resolved = resolve(params);
|
|
274
238
|
return `tv-signal-off-${resolved.amount}`;
|
|
275
239
|
},
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
240
|
+
implementations: {
|
|
241
|
+
webgpu: Internals.createEffectImplementation({
|
|
242
|
+
setup: (target) => setupWebGpuSinglePass(target, "tv-signal-off"),
|
|
243
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
244
|
+
if (!gpuDevice)
|
|
245
|
+
throw new Error("A WebGPU device is required for the TV signal off effect");
|
|
246
|
+
applyWebGpuSinglePass({
|
|
247
|
+
state,
|
|
248
|
+
source,
|
|
249
|
+
width,
|
|
250
|
+
height,
|
|
251
|
+
device: gpuDevice,
|
|
252
|
+
shader: TV_SIGNAL_OFF_WEBGPU_SHADER,
|
|
253
|
+
uniformData: new Float32Array([
|
|
254
|
+
resolve(params).amount,
|
|
255
|
+
width,
|
|
256
|
+
height,
|
|
257
|
+
0
|
|
258
|
+
])
|
|
259
|
+
});
|
|
260
|
+
},
|
|
261
|
+
cleanup: cleanupWebGpuSinglePass
|
|
262
|
+
}),
|
|
263
|
+
webgl2: Internals.createEffectImplementation({
|
|
264
|
+
setup: (target) => {
|
|
265
|
+
const gl = target.getContext("webgl2", {
|
|
266
|
+
premultipliedAlpha: true,
|
|
267
|
+
alpha: true,
|
|
268
|
+
preserveDrawingBuffer: true
|
|
269
|
+
});
|
|
270
|
+
if (!gl) {
|
|
271
|
+
throw createWebGL2ContextError("TV signal off effect");
|
|
272
|
+
}
|
|
273
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
|
|
274
|
+
return createTvSignalOffState(gl, VERTEX_SHADER, FRAGMENT_SHADER);
|
|
275
|
+
},
|
|
276
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
277
|
+
const resolved = resolve(params);
|
|
278
|
+
state.gl.viewport(0, 0, width, height);
|
|
279
|
+
state.gl.bindFramebuffer(state.gl.FRAMEBUFFER, null);
|
|
280
|
+
state.gl.activeTexture(state.gl.TEXTURE0);
|
|
281
|
+
state.gl.bindTexture(state.gl.TEXTURE_2D, state.texture);
|
|
282
|
+
state.gl.pixelStorei(state.gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
283
|
+
state.gl.texImage2D(state.gl.TEXTURE_2D, 0, state.gl.RGBA, state.gl.RGBA, state.gl.UNSIGNED_BYTE, source);
|
|
284
|
+
state.gl.useProgram(state.program);
|
|
285
|
+
if (state.uSource) {
|
|
286
|
+
state.gl.uniform1i(state.uSource, 0);
|
|
287
|
+
}
|
|
288
|
+
if (state.uAmount) {
|
|
289
|
+
state.gl.uniform1f(state.uAmount, resolved.amount);
|
|
290
|
+
}
|
|
291
|
+
state.gl.uniform2f(state.uResolution, width, height);
|
|
292
|
+
state.gl.bindVertexArray(state.vao);
|
|
293
|
+
state.gl.drawArrays(state.gl.TRIANGLE_STRIP, 0, 4);
|
|
294
|
+
},
|
|
295
|
+
cleanup: ({ gl, program, vao, vbo, texture }) => {
|
|
296
|
+
gl.deleteTexture(texture);
|
|
297
|
+
gl.deleteBuffer(vbo);
|
|
298
|
+
gl.deleteProgram(program);
|
|
299
|
+
gl.deleteVertexArray(vao);
|
|
300
|
+
}
|
|
301
|
+
})
|
|
311
302
|
},
|
|
312
303
|
schema: tvSignalOffSchema,
|
|
313
304
|
validateParams: validateTvSignalOffParams
|
|
@@ -1,112 +1,19 @@
|
|
|
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
|
+
} 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";
|
|
108
14
|
|
|
109
15
|
// src/venetian-blinds.ts
|
|
16
|
+
import { Internals } from "remotion";
|
|
110
17
|
var { createEffect, createWebGL2ContextError } = Internals;
|
|
111
18
|
var VENETIAN_BLINDS_DIRECTIONS = ["vertical", "horizontal"];
|
|
112
19
|
var DEFAULT_PROGRESS = 0.5;
|
|
@@ -339,47 +246,91 @@ var directionToInt = (direction) => {
|
|
|
339
246
|
}
|
|
340
247
|
}
|
|
341
248
|
};
|
|
249
|
+
var WEBGPU_SHADER = `
|
|
250
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
251
|
+
struct Params { controls: vec4f, }
|
|
252
|
+
@group(0) @binding(0) var source: texture_2d<f32>;
|
|
253
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
254
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
255
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
256
|
+
let color = textureSampleLevel(source, sourceSampler, input.uv, 0);
|
|
257
|
+
let axis = select(input.uv.x, 1.0 - input.uv.y, params.controls.y != 0.0);
|
|
258
|
+
let local = fract(axis * max(params.controls.z, 1.0));
|
|
259
|
+
let distanceToCenter = abs(local - 0.5) * 2.0;
|
|
260
|
+
let progress = clamp(params.controls.x, 0.0, 1.0);
|
|
261
|
+
if (progress <= 0.000001) { return vec4f(0); }
|
|
262
|
+
if (progress >= 0.999999) { return color; }
|
|
263
|
+
return color * step(distanceToCenter, progress);
|
|
264
|
+
}
|
|
265
|
+
`;
|
|
342
266
|
var venetianBlinds = createEffect({
|
|
343
267
|
type: "dev.remotion.effects.venetianBlinds",
|
|
344
268
|
label: "venetianBlinds()",
|
|
345
269
|
documentationLink: "https://www.remotion.dev/docs/effects/venetian-blinds",
|
|
346
|
-
backend: "webgl2",
|
|
347
270
|
calculateKey: (params) => {
|
|
348
271
|
const r = resolve(params);
|
|
349
272
|
return `venetian-blinds-${r.progress}-${r.direction}-${r.slats}`;
|
|
350
273
|
},
|
|
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
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
274
|
+
implementations: {
|
|
275
|
+
webgpu: Internals.createEffectImplementation({
|
|
276
|
+
setup: (target) => setupWebGpuSinglePass(target, "venetian-blinds"),
|
|
277
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
278
|
+
if (!gpuDevice) {
|
|
279
|
+
throw new Error("A WebGPU device is required for the venetian-blinds effect");
|
|
280
|
+
}
|
|
281
|
+
const r = resolve(params);
|
|
282
|
+
applyWebGpuSinglePass({
|
|
283
|
+
source,
|
|
284
|
+
width,
|
|
285
|
+
height,
|
|
286
|
+
state,
|
|
287
|
+
device: gpuDevice,
|
|
288
|
+
shader: WEBGPU_SHADER,
|
|
289
|
+
uniformData: new Float32Array([
|
|
290
|
+
r.progress,
|
|
291
|
+
r.direction === "vertical" ? 0 : 1,
|
|
292
|
+
r.slats,
|
|
293
|
+
0
|
|
294
|
+
])
|
|
295
|
+
});
|
|
296
|
+
},
|
|
297
|
+
cleanup: cleanupWebGpuSinglePass
|
|
298
|
+
}),
|
|
299
|
+
webgl2: Internals.createEffectImplementation({
|
|
300
|
+
setup: (target) => setupVenetianBlinds(target),
|
|
301
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
302
|
+
const r = resolve(params);
|
|
303
|
+
const { gl, program, texture, uniforms, vao } = state;
|
|
304
|
+
gl.viewport(0, 0, width, height);
|
|
305
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
306
|
+
gl.clearColor(0, 0, 0, 0);
|
|
307
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
308
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
309
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
310
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
311
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
312
|
+
gl.useProgram(program);
|
|
313
|
+
if (uniforms.uSource)
|
|
314
|
+
gl.uniform1i(uniforms.uSource, 0);
|
|
315
|
+
if (uniforms.uProgress)
|
|
316
|
+
gl.uniform1f(uniforms.uProgress, r.progress);
|
|
317
|
+
if (uniforms.uDirection)
|
|
318
|
+
gl.uniform1i(uniforms.uDirection, directionToInt(r.direction));
|
|
319
|
+
if (uniforms.uSlats)
|
|
320
|
+
gl.uniform1f(uniforms.uSlats, r.slats);
|
|
321
|
+
gl.bindVertexArray(vao);
|
|
322
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
323
|
+
gl.bindVertexArray(null);
|
|
324
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
325
|
+
gl.useProgram(null);
|
|
326
|
+
},
|
|
327
|
+
cleanup: ({ gl, program, vao, vbo, texture }) => {
|
|
328
|
+
gl.deleteTexture(texture);
|
|
329
|
+
gl.deleteBuffer(vbo);
|
|
330
|
+
gl.deleteProgram(program);
|
|
331
|
+
gl.deleteVertexArray(vao);
|
|
332
|
+
}
|
|
333
|
+
})
|
|
383
334
|
},
|
|
384
335
|
schema: venetianBlindsSchema,
|
|
385
336
|
validateParams: validateVenetianBlindsParams
|