@remotion/effects 4.0.541 → 4.0.542
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 +10 -0
- package/dist/esm/lightning.mjs +603 -0
- package/dist/esm/magnify.mjs +403 -0
- package/dist/esm/preview/barrel-distortion.mjs +303 -0
- package/dist/esm/preview/bevel-alpha.mjs +525 -0
- package/dist/esm/preview/blur.mjs +435 -0
- package/dist/esm/preview/brightness.mjs +95 -0
- package/dist/esm/preview/burlap.mjs +481 -0
- package/dist/esm/preview/checkerboard.mjs +8 -0
- package/dist/esm/preview/chromatic-aberration.mjs +308 -0
- package/dist/esm/preview/color-correction.mjs +522 -0
- package/dist/esm/preview/color-key.mjs +440 -0
- package/dist/esm/preview/contour-lines.mjs +608 -0
- package/dist/esm/preview/contrast.mjs +95 -0
- package/dist/esm/preview/corner-pin.mjs +6 -0
- package/dist/esm/preview/curves.mjs +357 -0
- package/dist/esm/preview/cylinder.mjs +273 -0
- package/dist/esm/preview/dot-grid.mjs +333 -0
- package/dist/esm/preview/drop-shadow.mjs +607 -0
- package/dist/esm/preview/duotone.mjs +344 -0
- package/dist/esm/preview/emboss.mjs +479 -0
- package/dist/esm/preview/evolve.mjs +485 -0
- package/dist/esm/preview/exposure.mjs +264 -0
- package/dist/esm/preview/film-burn.mjs +298 -0
- package/dist/esm/preview/fisheye.mjs +422 -0
- package/dist/esm/preview/flannel.mjs +401 -0
- package/dist/esm/preview/fractal-noise.mjs +642 -0
- package/dist/esm/preview/glow.mjs +598 -0
- package/dist/esm/preview/grayscale.mjs +86 -0
- package/dist/esm/preview/gridlines.mjs +8 -0
- package/dist/esm/preview/halftone-linear-gradient.mjs +523 -0
- package/dist/esm/preview/halftone.mjs +552 -0
- package/dist/esm/preview/hue.mjs +83 -0
- package/dist/esm/preview/index-00v3hr66.mjs +299 -0
- package/dist/esm/preview/index-0w4eqht8.mjs +351 -0
- package/dist/esm/preview/index-18y0zcy2.mjs +440 -0
- package/dist/esm/preview/index-1m1b1ad7.mjs +520 -0
- package/dist/esm/preview/index-34fxm3ax.mjs +518 -0
- package/dist/esm/preview/index-4fvp93ps.mjs +32 -0
- package/dist/esm/preview/index-4scpn12x.mjs +224 -0
- package/dist/esm/preview/index-4z6pt3ka.mjs +104 -0
- package/dist/esm/preview/index-618ky75w.mjs +51 -0
- package/dist/esm/preview/index-6agxdrvr.mjs +411 -0
- package/dist/esm/preview/index-6jkps947.mjs +120 -0
- package/dist/esm/preview/index-8agtsbw4.mjs +617 -0
- package/dist/esm/preview/index-8jx11jyn.mjs +29 -0
- package/dist/esm/preview/index-8p04sssx.mjs +123 -0
- package/dist/esm/preview/index-afdtmrh2.mjs +596 -0
- package/dist/esm/preview/index-b86qstcs.mjs +18 -0
- package/dist/esm/preview/index-cb77qg3g.mjs +587 -0
- package/dist/esm/preview/index-cdp7tr8x.mjs +122 -0
- package/dist/esm/preview/index-evy8hyah.mjs +55 -0
- package/dist/esm/preview/index-gnsce796.mjs +6 -0
- package/dist/esm/preview/index-kkvzt8b7.mjs +199 -0
- package/dist/esm/preview/index-r0v18b2n.mjs +425 -0
- package/dist/esm/preview/index-rswpzmm5.mjs +926 -0
- package/dist/esm/preview/index-s9mrx750.mjs +97 -0
- package/dist/esm/preview/index-tvfexb7s.mjs +164 -0
- package/dist/esm/preview/index-vp56k1gj.mjs +215 -0
- package/dist/esm/preview/index-wxhvgv2s.mjs +79 -0
- package/dist/esm/preview/index-wy95a41r.mjs +407 -0
- package/dist/esm/preview/index-ysnwfc4t.mjs +306 -0
- package/dist/esm/preview/index.mjs +51 -0
- package/dist/esm/preview/invert.mjs +84 -0
- package/dist/esm/preview/iris-wipe.mjs +315 -0
- package/dist/esm/preview/lens-blur.mjs +563 -0
- package/dist/esm/preview/levels.mjs +400 -0
- package/dist/esm/preview/light-leak.mjs +8 -0
- package/dist/esm/preview/light-trail.mjs +516 -0
- package/dist/esm/preview/lightning.mjs +603 -0
- package/dist/esm/preview/linear-gradient-tint.mjs +6 -0
- package/dist/esm/preview/linear-gradient.mjs +6 -0
- package/dist/esm/preview/linear-progressive-blur.mjs +516 -0
- package/dist/esm/preview/linear-progressive-pixelate.mjs +176 -0
- package/dist/esm/preview/lines.mjs +536 -0
- package/dist/esm/preview/liquid-contours.mjs +512 -0
- package/dist/esm/preview/long-shadows.mjs +437 -0
- package/dist/esm/preview/lut.mjs +601 -0
- package/dist/esm/preview/magnify.mjs +403 -0
- package/dist/esm/preview/mirror.mjs +341 -0
- package/dist/esm/preview/noise-displacement.mjs +584 -0
- package/dist/esm/preview/noise.mjs +318 -0
- package/dist/esm/preview/outline.mjs +725 -0
- package/dist/esm/preview/page-turn.mjs +302 -0
- package/dist/esm/preview/paper.mjs +1249 -0
- package/dist/esm/preview/pattern.mjs +6 -0
- package/dist/esm/preview/pixel-dissolve.mjs +360 -0
- package/dist/esm/preview/pixelate.mjs +249 -0
- package/dist/esm/preview/radial-progressive-blur.mjs +582 -0
- package/dist/esm/preview/radial-progressive-pixelate.mjs +220 -0
- package/dist/esm/preview/radial-wipe.mjs +224 -0
- package/dist/esm/preview/rain-fall.mjs +114 -0
- package/dist/esm/preview/region-blur.mjs +500 -0
- package/dist/esm/preview/rings.mjs +8 -0
- package/dist/esm/preview/roughen-edges.mjs +590 -0
- package/dist/esm/preview/saturation.mjs +86 -0
- package/dist/esm/preview/scale.mjs +109 -0
- package/dist/esm/preview/scanlines.mjs +362 -0
- package/dist/esm/preview/shadows-highlights.mjs +284 -0
- package/dist/esm/preview/shatter.mjs +868 -0
- package/dist/esm/preview/shine.mjs +368 -0
- package/dist/esm/preview/shrinkwrap.mjs +769 -0
- package/dist/esm/preview/skew.mjs +300 -0
- package/dist/esm/preview/snow-fall.mjs +170 -0
- package/dist/esm/preview/speckle.mjs +356 -0
- package/dist/esm/preview/sphere.mjs +252 -0
- package/dist/esm/preview/starburst.mjs +8 -0
- package/dist/esm/preview/tear.mjs +375 -0
- package/dist/esm/preview/thermal-vision.mjs +387 -0
- package/dist/esm/preview/tile.mjs +7 -0
- package/dist/esm/preview/tint.mjs +125 -0
- package/dist/esm/preview/translate.mjs +151 -0
- package/dist/esm/preview/turbulent-displace.mjs +613 -0
- package/dist/esm/preview/tv-signal-off.mjs +308 -0
- package/dist/esm/preview/venetian-blinds.mjs +341 -0
- package/dist/esm/preview/vibrance.mjs +254 -0
- package/dist/esm/preview/vignette.mjs +458 -0
- package/dist/esm/preview/wave.mjs +384 -0
- package/dist/esm/preview/waves.mjs +599 -0
- package/dist/esm/preview/white-balance.mjs +280 -0
- package/dist/esm/preview/white-noise.mjs +244 -0
- package/dist/esm/preview/zigzag.mjs +8 -0
- package/dist/esm/preview/zoom-blur.mjs +389 -0
- package/dist/lightning/geometry.d.ts +10 -0
- package/dist/lightning/index.d.ts +4 -0
- package/dist/lightning/mask.d.ts +2 -0
- package/dist/lightning/params.d.ts +259 -0
- package/dist/lightning/shaders.d.ts +2 -0
- package/dist/lightning.d.ts +2 -0
- package/dist/magnify/shader.d.ts +1 -0
- package/dist/magnify/webgpu-shader.d.ts +1 -0
- package/dist/magnify.d.ts +28 -0
- package/package.json +30 -6
|
@@ -0,0 +1,308 @@
|
|
|
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
|
+
|
|
15
|
+
// src/tv-signal-off.ts
|
|
16
|
+
import { Internals } from "remotion";
|
|
17
|
+
var { createEffect, createWebGL2ContextError } = Internals;
|
|
18
|
+
var DEFAULT_AMOUNT = 1;
|
|
19
|
+
var tvSignalOffSchema = {
|
|
20
|
+
amount: {
|
|
21
|
+
type: "number",
|
|
22
|
+
min: 0,
|
|
23
|
+
max: 1,
|
|
24
|
+
step: 0.01,
|
|
25
|
+
default: DEFAULT_AMOUNT,
|
|
26
|
+
description: "Amount",
|
|
27
|
+
hiddenFromList: false
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
var resolve = (params) => ({
|
|
31
|
+
amount: params.amount ?? DEFAULT_AMOUNT
|
|
32
|
+
});
|
|
33
|
+
var validateTvSignalOffParams = (params) => {
|
|
34
|
+
assertEffectParamsObject(params, "TV signal off");
|
|
35
|
+
assertOptionalFiniteNumber(params.amount, "amount");
|
|
36
|
+
validateUnitInterval(params.amount ?? DEFAULT_AMOUNT, "amount");
|
|
37
|
+
};
|
|
38
|
+
var VERTEX_SHADER = `#version 300 es
|
|
39
|
+
in vec2 aPos;
|
|
40
|
+
in vec2 aUv;
|
|
41
|
+
out vec2 vUv;
|
|
42
|
+
|
|
43
|
+
void main() {
|
|
44
|
+
vUv = aUv;
|
|
45
|
+
gl_Position = vec4(aPos, 0.0, 1.0);
|
|
46
|
+
}
|
|
47
|
+
`;
|
|
48
|
+
var FRAGMENT_SHADER = `#version 300 es
|
|
49
|
+
precision highp float;
|
|
50
|
+
|
|
51
|
+
in vec2 vUv;
|
|
52
|
+
out vec4 fragColor;
|
|
53
|
+
|
|
54
|
+
uniform sampler2D uSource;
|
|
55
|
+
uniform float uAmount;
|
|
56
|
+
uniform vec2 uResolution;
|
|
57
|
+
|
|
58
|
+
vec3 topBar(float x) {
|
|
59
|
+
if (x < 1.0 / 7.0) return vec3(0.74);
|
|
60
|
+
if (x < 2.0 / 7.0) return vec3(1.0, 1.0, 0.0);
|
|
61
|
+
if (x < 3.0 / 7.0) return vec3(0.0, 1.0, 1.0);
|
|
62
|
+
if (x < 4.0 / 7.0) return vec3(0.0, 1.0, 0.0);
|
|
63
|
+
if (x < 5.0 / 7.0) return vec3(1.0, 0.0, 1.0);
|
|
64
|
+
if (x < 6.0 / 7.0) return vec3(1.0, 0.0, 0.0);
|
|
65
|
+
return vec3(0.0, 0.0, 1.0);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
vec3 middleBar(float x) {
|
|
69
|
+
if (x < 1.0 / 7.0) return vec3(0.0, 0.0, 1.0);
|
|
70
|
+
if (x < 2.0 / 7.0) return vec3(0.0);
|
|
71
|
+
if (x < 3.0 / 7.0) return vec3(1.0, 0.0, 1.0);
|
|
72
|
+
if (x < 4.0 / 7.0) return vec3(0.0);
|
|
73
|
+
if (x < 5.0 / 7.0) return vec3(0.0, 1.0, 1.0);
|
|
74
|
+
if (x < 6.0 / 7.0) return vec3(0.0);
|
|
75
|
+
return vec3(0.74);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
vec3 tvPattern(vec2 uv) {
|
|
79
|
+
if (uv.y < 0.64) {
|
|
80
|
+
return topBar(uv.x);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (uv.y < 0.76) {
|
|
84
|
+
return middleBar(uv.x);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (uv.y < 0.88) {
|
|
88
|
+
if (uv.x < 0.58) return vec3(1.0);
|
|
89
|
+
float ramp = smoothstep(0.58, 1.0, uv.x);
|
|
90
|
+
return vec3(1.0 - ramp);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (uv.x < 0.58) {
|
|
94
|
+
float stepValue = floor(uv.x * 12.0) / 11.0;
|
|
95
|
+
return vec3(stepValue);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return vec3(0.0);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
void main() {
|
|
102
|
+
vec4 color = texture(uSource, vUv);
|
|
103
|
+
vec3 sourceColor = color.a == 0.0 ? vec3(0.0) : color.rgb / color.a;
|
|
104
|
+
// Exact pixel centers keep stepped bars stable at fractional boundaries.
|
|
105
|
+
vec3 bars = tvPattern(gl_FragCoord.xy / uResolution);
|
|
106
|
+
vec3 mixed = mix(sourceColor, bars, uAmount);
|
|
107
|
+
|
|
108
|
+
fragColor = vec4(mixed * color.a, color.a);
|
|
109
|
+
}
|
|
110
|
+
`;
|
|
111
|
+
var compileShader = (gl, type, source) => {
|
|
112
|
+
const shader = gl.createShader(type);
|
|
113
|
+
if (!shader) {
|
|
114
|
+
throw new Error("Failed to create shader");
|
|
115
|
+
}
|
|
116
|
+
gl.shaderSource(shader, source);
|
|
117
|
+
gl.compileShader(shader);
|
|
118
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
119
|
+
const info = gl.getShaderInfoLog(shader) ?? "Unknown shader compile error";
|
|
120
|
+
gl.deleteShader(shader);
|
|
121
|
+
throw new Error(info);
|
|
122
|
+
}
|
|
123
|
+
return shader;
|
|
124
|
+
};
|
|
125
|
+
var createProgram = (gl, vertexSource, fragmentSource) => {
|
|
126
|
+
const vertex = compileShader(gl, gl.VERTEX_SHADER, vertexSource);
|
|
127
|
+
const fragment = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
|
|
128
|
+
const program = gl.createProgram();
|
|
129
|
+
if (!program) {
|
|
130
|
+
throw new Error("Failed to create program");
|
|
131
|
+
}
|
|
132
|
+
gl.attachShader(program, vertex);
|
|
133
|
+
gl.attachShader(program, fragment);
|
|
134
|
+
gl.linkProgram(program);
|
|
135
|
+
gl.deleteShader(vertex);
|
|
136
|
+
gl.deleteShader(fragment);
|
|
137
|
+
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
138
|
+
const info = gl.getProgramInfoLog(program) ?? "Unknown program link error";
|
|
139
|
+
gl.deleteProgram(program);
|
|
140
|
+
throw new Error(info);
|
|
141
|
+
}
|
|
142
|
+
return program;
|
|
143
|
+
};
|
|
144
|
+
var createTvSignalOffState = (gl, vertexSource, fragmentSource) => {
|
|
145
|
+
const program = createProgram(gl, vertexSource, fragmentSource);
|
|
146
|
+
const vao = gl.createVertexArray();
|
|
147
|
+
const vbo = gl.createBuffer();
|
|
148
|
+
const texture = gl.createTexture();
|
|
149
|
+
if (!vao || !vbo || !texture) {
|
|
150
|
+
throw new Error("Failed to create WebGL resources");
|
|
151
|
+
}
|
|
152
|
+
gl.bindVertexArray(vao);
|
|
153
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
|
|
154
|
+
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 0, 0, 1, -1, 1, 0, -1, 1, 0, 1, 1, 1, 1, 1]), gl.STATIC_DRAW);
|
|
155
|
+
const aPos = gl.getAttribLocation(program, "aPos");
|
|
156
|
+
const aUv = gl.getAttribLocation(program, "aUv");
|
|
157
|
+
gl.enableVertexAttribArray(aPos);
|
|
158
|
+
gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 16, 0);
|
|
159
|
+
gl.enableVertexAttribArray(aUv);
|
|
160
|
+
gl.vertexAttribPointer(aUv, 2, gl.FLOAT, false, 16, 8);
|
|
161
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
162
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
163
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
164
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
165
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
166
|
+
return {
|
|
167
|
+
gl,
|
|
168
|
+
program,
|
|
169
|
+
vao,
|
|
170
|
+
vbo,
|
|
171
|
+
texture,
|
|
172
|
+
uSource: gl.getUniformLocation(program, "uSource"),
|
|
173
|
+
uAmount: gl.getUniformLocation(program, "uAmount"),
|
|
174
|
+
uResolution: gl.getUniformLocation(program, "uResolution")
|
|
175
|
+
};
|
|
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
|
+
`;
|
|
232
|
+
var tvSignalOff = createEffect({
|
|
233
|
+
type: "dev.remotion.effects.tvSignalOff",
|
|
234
|
+
label: "tvSignalOff()",
|
|
235
|
+
documentationLink: "https://www.remotion.dev/docs/effects/tv-signal-off",
|
|
236
|
+
calculateKey: (params) => {
|
|
237
|
+
const resolved = resolve(params);
|
|
238
|
+
return `tv-signal-off-${resolved.amount}`;
|
|
239
|
+
},
|
|
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
|
+
})
|
|
302
|
+
},
|
|
303
|
+
schema: tvSignalOffSchema,
|
|
304
|
+
validateParams: validateTvSignalOffParams
|
|
305
|
+
});
|
|
306
|
+
export {
|
|
307
|
+
tvSignalOff
|
|
308
|
+
};
|
|
@@ -0,0 +1,341 @@
|
|
|
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
|
+
|
|
15
|
+
// src/venetian-blinds.ts
|
|
16
|
+
import { Internals } from "remotion";
|
|
17
|
+
var { createEffect, createWebGL2ContextError } = Internals;
|
|
18
|
+
var VENETIAN_BLINDS_DIRECTIONS = ["vertical", "horizontal"];
|
|
19
|
+
var DEFAULT_PROGRESS = 0.5;
|
|
20
|
+
var DEFAULT_DIRECTION = "vertical";
|
|
21
|
+
var DEFAULT_SLATS = 12;
|
|
22
|
+
var venetianBlindsSchema = {
|
|
23
|
+
progress: {
|
|
24
|
+
type: "number",
|
|
25
|
+
min: 0,
|
|
26
|
+
max: 1,
|
|
27
|
+
step: 0.01,
|
|
28
|
+
default: DEFAULT_PROGRESS,
|
|
29
|
+
description: "Progress",
|
|
30
|
+
hiddenFromList: false
|
|
31
|
+
},
|
|
32
|
+
direction: {
|
|
33
|
+
type: "enum",
|
|
34
|
+
variants: {
|
|
35
|
+
vertical: {},
|
|
36
|
+
horizontal: {}
|
|
37
|
+
},
|
|
38
|
+
default: DEFAULT_DIRECTION,
|
|
39
|
+
description: "Direction"
|
|
40
|
+
},
|
|
41
|
+
slats: {
|
|
42
|
+
type: "number",
|
|
43
|
+
min: 1,
|
|
44
|
+
max: 100,
|
|
45
|
+
step: 1,
|
|
46
|
+
integer: true,
|
|
47
|
+
default: DEFAULT_SLATS,
|
|
48
|
+
description: "Slats",
|
|
49
|
+
hiddenFromList: false
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
var formatEnum = (variants) => {
|
|
53
|
+
if (variants.length === 2) {
|
|
54
|
+
return `"${variants[0]}" or "${variants[1]}"`;
|
|
55
|
+
}
|
|
56
|
+
return `${variants.slice(0, -1).map((variant) => `"${variant}"`).join(", ")} or "${variants[variants.length - 1]}"`;
|
|
57
|
+
};
|
|
58
|
+
var assertOptionalEnum = (value, name, variants) => {
|
|
59
|
+
if (value === undefined) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (!variants.includes(value)) {
|
|
63
|
+
throw new TypeError(`"${name}" must be ${formatEnum(variants)}, but got ${JSON.stringify(value)}`);
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
var resolve = (p) => ({
|
|
67
|
+
progress: p.progress ?? DEFAULT_PROGRESS,
|
|
68
|
+
direction: p.direction ?? DEFAULT_DIRECTION,
|
|
69
|
+
slats: p.slats ?? DEFAULT_SLATS
|
|
70
|
+
});
|
|
71
|
+
var validatePositiveInteger = (value, name) => {
|
|
72
|
+
if (!Number.isInteger(value)) {
|
|
73
|
+
throw new TypeError(`"${name}" must be an integer, but got ${JSON.stringify(value)}`);
|
|
74
|
+
}
|
|
75
|
+
if (value < 1) {
|
|
76
|
+
throw new TypeError(`"${name}" must be >= 1, but got ${JSON.stringify(value)}`);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
var validateVenetianBlindsParams = (params) => {
|
|
80
|
+
assertEffectParamsObject(params, "Venetian blinds");
|
|
81
|
+
assertOptionalFiniteNumber(params.progress, "progress");
|
|
82
|
+
assertOptionalFiniteNumber(params.slats, "slats");
|
|
83
|
+
assertOptionalEnum(params.direction, "direction", VENETIAN_BLINDS_DIRECTIONS);
|
|
84
|
+
const r = resolve(params);
|
|
85
|
+
validateUnitInterval(r.progress, "progress");
|
|
86
|
+
validatePositiveInteger(r.slats, "slats");
|
|
87
|
+
};
|
|
88
|
+
var VENETIAN_BLINDS_VS = `#version 300 es
|
|
89
|
+
in vec2 aPos;
|
|
90
|
+
in vec2 aUv;
|
|
91
|
+
out vec2 vUv;
|
|
92
|
+
|
|
93
|
+
void main() {
|
|
94
|
+
vUv = aUv;
|
|
95
|
+
gl_Position = vec4(aPos, 0.0, 1.0);
|
|
96
|
+
}
|
|
97
|
+
`;
|
|
98
|
+
var VENETIAN_BLINDS_FS = `#version 300 es
|
|
99
|
+
precision highp float;
|
|
100
|
+
|
|
101
|
+
in vec2 vUv;
|
|
102
|
+
out vec4 fragColor;
|
|
103
|
+
|
|
104
|
+
uniform sampler2D uSource;
|
|
105
|
+
uniform float uProgress;
|
|
106
|
+
uniform int uDirection;
|
|
107
|
+
uniform float uSlats;
|
|
108
|
+
|
|
109
|
+
float maskValue(float distanceToCenter, float progress) {
|
|
110
|
+
float p = clamp(progress, 0.0, 1.0);
|
|
111
|
+
|
|
112
|
+
if (p <= 0.000001) {
|
|
113
|
+
return 0.0;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (p >= 0.999999) {
|
|
117
|
+
return 1.0;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return step(distanceToCenter, p);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
void main() {
|
|
124
|
+
vec4 source = texture(uSource, vUv);
|
|
125
|
+
float axis = uDirection == 0 ? vUv.x : vUv.y;
|
|
126
|
+
float local = fract(axis * max(uSlats, 1.0));
|
|
127
|
+
float distanceToCenter = abs(local - 0.5) * 2.0;
|
|
128
|
+
float mask = maskValue(distanceToCenter, uProgress);
|
|
129
|
+
|
|
130
|
+
fragColor = vec4(source.rgb * mask, source.a * mask);
|
|
131
|
+
}
|
|
132
|
+
`;
|
|
133
|
+
var compileShader = (gl, type, source) => {
|
|
134
|
+
const shader = gl.createShader(type);
|
|
135
|
+
if (!shader) {
|
|
136
|
+
throw new Error("Failed to create WebGL shader");
|
|
137
|
+
}
|
|
138
|
+
gl.shaderSource(shader, source);
|
|
139
|
+
gl.compileShader(shader);
|
|
140
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
141
|
+
const log = gl.getShaderInfoLog(shader);
|
|
142
|
+
gl.deleteShader(shader);
|
|
143
|
+
throw new Error(`Venetian blinds shader compile failed: ${log ?? "(no log)"}`);
|
|
144
|
+
}
|
|
145
|
+
return shader;
|
|
146
|
+
};
|
|
147
|
+
var linkProgram = (gl, vs, fs) => {
|
|
148
|
+
const program = gl.createProgram();
|
|
149
|
+
if (!program) {
|
|
150
|
+
throw new Error("Failed to create WebGL program");
|
|
151
|
+
}
|
|
152
|
+
gl.attachShader(program, vs);
|
|
153
|
+
gl.attachShader(program, fs);
|
|
154
|
+
gl.linkProgram(program);
|
|
155
|
+
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
156
|
+
const log = gl.getProgramInfoLog(program);
|
|
157
|
+
gl.deleteProgram(program);
|
|
158
|
+
throw new Error(`Venetian blinds program link failed: ${log ?? "(no log)"}`);
|
|
159
|
+
}
|
|
160
|
+
return program;
|
|
161
|
+
};
|
|
162
|
+
var setupVenetianBlinds = (target) => {
|
|
163
|
+
const gl = target.getContext("webgl2", {
|
|
164
|
+
premultipliedAlpha: true,
|
|
165
|
+
alpha: true,
|
|
166
|
+
preserveDrawingBuffer: true
|
|
167
|
+
});
|
|
168
|
+
if (!gl) {
|
|
169
|
+
throw createWebGL2ContextError("venetian blinds effect");
|
|
170
|
+
}
|
|
171
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
|
|
172
|
+
const vs = compileShader(gl, gl.VERTEX_SHADER, VENETIAN_BLINDS_VS);
|
|
173
|
+
const fs = compileShader(gl, gl.FRAGMENT_SHADER, VENETIAN_BLINDS_FS);
|
|
174
|
+
const program = linkProgram(gl, vs, fs);
|
|
175
|
+
gl.deleteShader(vs);
|
|
176
|
+
gl.deleteShader(fs);
|
|
177
|
+
const vao = gl.createVertexArray();
|
|
178
|
+
if (!vao) {
|
|
179
|
+
throw new Error("Failed to create WebGL vertex array");
|
|
180
|
+
}
|
|
181
|
+
gl.bindVertexArray(vao);
|
|
182
|
+
const data = new Float32Array([
|
|
183
|
+
-1,
|
|
184
|
+
-1,
|
|
185
|
+
0,
|
|
186
|
+
0,
|
|
187
|
+
1,
|
|
188
|
+
-1,
|
|
189
|
+
1,
|
|
190
|
+
0,
|
|
191
|
+
-1,
|
|
192
|
+
1,
|
|
193
|
+
0,
|
|
194
|
+
1,
|
|
195
|
+
1,
|
|
196
|
+
1,
|
|
197
|
+
1,
|
|
198
|
+
1
|
|
199
|
+
]);
|
|
200
|
+
const vbo = gl.createBuffer();
|
|
201
|
+
if (!vbo) {
|
|
202
|
+
throw new Error("Failed to create WebGL buffer");
|
|
203
|
+
}
|
|
204
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
|
|
205
|
+
gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
|
|
206
|
+
const aPos = gl.getAttribLocation(program, "aPos");
|
|
207
|
+
const aUv = gl.getAttribLocation(program, "aUv");
|
|
208
|
+
gl.enableVertexAttribArray(aPos);
|
|
209
|
+
gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 16, 0);
|
|
210
|
+
gl.enableVertexAttribArray(aUv);
|
|
211
|
+
gl.vertexAttribPointer(aUv, 2, gl.FLOAT, false, 16, 8);
|
|
212
|
+
gl.bindVertexArray(null);
|
|
213
|
+
const texture = gl.createTexture();
|
|
214
|
+
if (!texture) {
|
|
215
|
+
throw new Error("Failed to create WebGL texture");
|
|
216
|
+
}
|
|
217
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
218
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
219
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
220
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
221
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
222
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
223
|
+
return {
|
|
224
|
+
gl,
|
|
225
|
+
program,
|
|
226
|
+
vao,
|
|
227
|
+
vbo,
|
|
228
|
+
texture,
|
|
229
|
+
uniforms: {
|
|
230
|
+
uSource: gl.getUniformLocation(program, "uSource"),
|
|
231
|
+
uProgress: gl.getUniformLocation(program, "uProgress"),
|
|
232
|
+
uDirection: gl.getUniformLocation(program, "uDirection"),
|
|
233
|
+
uSlats: gl.getUniformLocation(program, "uSlats")
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
};
|
|
237
|
+
var directionToInt = (direction) => {
|
|
238
|
+
switch (direction) {
|
|
239
|
+
case "vertical":
|
|
240
|
+
return 0;
|
|
241
|
+
case "horizontal":
|
|
242
|
+
return 1;
|
|
243
|
+
default: {
|
|
244
|
+
const exhaustiveCheck = direction;
|
|
245
|
+
return exhaustiveCheck;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
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
|
+
`;
|
|
266
|
+
var venetianBlinds = createEffect({
|
|
267
|
+
type: "dev.remotion.effects.venetianBlinds",
|
|
268
|
+
label: "venetianBlinds()",
|
|
269
|
+
documentationLink: "https://www.remotion.dev/docs/effects/venetian-blinds",
|
|
270
|
+
calculateKey: (params) => {
|
|
271
|
+
const r = resolve(params);
|
|
272
|
+
return `venetian-blinds-${r.progress}-${r.direction}-${r.slats}`;
|
|
273
|
+
},
|
|
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
|
+
})
|
|
334
|
+
},
|
|
335
|
+
schema: venetianBlindsSchema,
|
|
336
|
+
validateParams: validateVenetianBlindsParams
|
|
337
|
+
});
|
|
338
|
+
export {
|
|
339
|
+
venetianBlinds,
|
|
340
|
+
venetianBlindsSchema
|
|
341
|
+
};
|