@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
package/dist/esm/fisheye.mjs
CHANGED
|
@@ -1,119 +1,26 @@
|
|
|
1
|
+
import {
|
|
2
|
+
publicUvToShaderUv
|
|
3
|
+
} from "./index-gnsce796.mjs";
|
|
4
|
+
import {
|
|
5
|
+
assertOptionalFiniteNumber,
|
|
6
|
+
validateNonNegative
|
|
7
|
+
} from "./index-wxhvgv2s.mjs";
|
|
8
|
+
import {
|
|
9
|
+
WEBGPU_SINGLE_PASS_VERTEX,
|
|
10
|
+
setupWebGpuSinglePass,
|
|
11
|
+
cleanupWebGpuSinglePass,
|
|
12
|
+
applyWebGpuSinglePass
|
|
13
|
+
} from "./index-tvfexb7s.mjs";
|
|
14
|
+
import {
|
|
15
|
+
assertEffectParamsObject
|
|
16
|
+
} from "./index-4fvp93ps.mjs";
|
|
17
|
+
|
|
1
18
|
// src/fisheye/index.ts
|
|
2
19
|
import { Internals as Internals2 } from "remotion";
|
|
3
20
|
|
|
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
21
|
// src/fisheye/fisheye-runtime.ts
|
|
110
22
|
import { Internals } from "remotion";
|
|
111
23
|
|
|
112
|
-
// src/uv-coordinate.ts
|
|
113
|
-
var publicUvToShaderUv = (uv) => {
|
|
114
|
-
return [uv[0], 1 - uv[1]];
|
|
115
|
-
};
|
|
116
|
-
|
|
117
24
|
// src/fisheye/fisheye-shaders.ts
|
|
118
25
|
var FISHEYE_VS = `#version 300 es
|
|
119
26
|
layout(location = 0) in vec2 aPos;
|
|
@@ -341,6 +248,38 @@ var applyFisheye = ({
|
|
|
341
248
|
gl.useProgram(null);
|
|
342
249
|
};
|
|
343
250
|
|
|
251
|
+
// src/fisheye/webgpu-shader.ts
|
|
252
|
+
var FISHEYE_WEBGPU_SHADER = `
|
|
253
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
254
|
+
@group(0) @binding(0) var source: texture_2d<f32>;
|
|
255
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
256
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
257
|
+
struct Params { centerAndLens: vec4f, zoomAndAspect: vec4f, }
|
|
258
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
259
|
+
let center = params.centerAndLens.xy;
|
|
260
|
+
let fieldOfView = params.centerAndLens.z;
|
|
261
|
+
let radius = params.centerAndLens.w;
|
|
262
|
+
let zoom = params.zoomAndAspect.x;
|
|
263
|
+
let aspect = params.zoomAndAspect.y;
|
|
264
|
+
let toCenter = input.uv - center;
|
|
265
|
+
let corrected = vec2f(toCenter.x * aspect, toCenter.y);
|
|
266
|
+
let dist = length(corrected);
|
|
267
|
+
let r = dist / max(radius, 0.0001);
|
|
268
|
+
if (r > 1.0 || fieldOfView <= 0.0001) {
|
|
269
|
+
return textureSampleLevel(source, sourceSampler, input.uv, 0);
|
|
270
|
+
}
|
|
271
|
+
let halfFov = fieldOfView * 0.5;
|
|
272
|
+
let warped = tan(r * halfFov) / tan(halfFov);
|
|
273
|
+
var scale = 0.0;
|
|
274
|
+
if (dist > 0.00001) { scale = warped * radius / dist; }
|
|
275
|
+
let warpedAspect = corrected * scale;
|
|
276
|
+
let offset = vec2f(warpedAspect.x / aspect, warpedAspect.y) / max(zoom, 0.0001);
|
|
277
|
+
let uv = center + offset;
|
|
278
|
+
if (any(uv < vec2f(0)) || any(uv > vec2f(1))) { return vec4f(0); }
|
|
279
|
+
return textureSampleLevel(source, sourceSampler, uv, 0);
|
|
280
|
+
}
|
|
281
|
+
`;
|
|
282
|
+
|
|
344
283
|
// src/fisheye/index.ts
|
|
345
284
|
var { createEffect } = Internals2;
|
|
346
285
|
var DEFAULT_FISHEYE_FIELD_OF_VIEW = 2.5;
|
|
@@ -422,27 +361,59 @@ var fisheye = createEffect({
|
|
|
422
361
|
type: "dev.remotion.effects.fisheye",
|
|
423
362
|
label: "fisheye()",
|
|
424
363
|
documentationLink: "https://www.remotion.dev/docs/effects/fisheye",
|
|
425
|
-
backend: "webgl2",
|
|
426
364
|
calculateKey: (params) => {
|
|
427
365
|
const r = resolve(params);
|
|
428
366
|
return `fisheye-${r.fieldOfView}-${r.center.join(":")}-${r.radius}-${r.zoom}`;
|
|
429
367
|
},
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
368
|
+
implementations: {
|
|
369
|
+
webgpu: Internals2.createEffectImplementation({
|
|
370
|
+
setup: (target) => setupWebGpuSinglePass(target, "fisheye"),
|
|
371
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
372
|
+
if (!gpuDevice) {
|
|
373
|
+
throw new Error("A WebGPU device is required for the fisheye effect");
|
|
374
|
+
}
|
|
375
|
+
const r = resolve(params);
|
|
376
|
+
const uniformData = new Float32Array([
|
|
377
|
+
r.center[0],
|
|
378
|
+
r.center[1],
|
|
379
|
+
r.fieldOfView,
|
|
380
|
+
r.radius,
|
|
381
|
+
r.zoom,
|
|
382
|
+
width / height,
|
|
383
|
+
0,
|
|
384
|
+
0
|
|
385
|
+
]);
|
|
386
|
+
applyWebGpuSinglePass({
|
|
387
|
+
state,
|
|
388
|
+
source,
|
|
389
|
+
width,
|
|
390
|
+
height,
|
|
391
|
+
device: gpuDevice,
|
|
392
|
+
shader: FISHEYE_WEBGPU_SHADER,
|
|
393
|
+
uniformData
|
|
394
|
+
});
|
|
395
|
+
},
|
|
396
|
+
cleanup: cleanupWebGpuSinglePass
|
|
397
|
+
}),
|
|
398
|
+
webgl2: Internals2.createEffectImplementation({
|
|
399
|
+
setup: (target) => setupFisheye(target),
|
|
400
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
401
|
+
const r = resolve(params);
|
|
402
|
+
applyFisheye({
|
|
403
|
+
state,
|
|
404
|
+
source,
|
|
405
|
+
width,
|
|
406
|
+
height,
|
|
407
|
+
center: r.center,
|
|
408
|
+
fieldOfView: r.fieldOfView,
|
|
409
|
+
radius: r.radius,
|
|
410
|
+
zoom: r.zoom,
|
|
411
|
+
flipSourceY
|
|
412
|
+
});
|
|
413
|
+
},
|
|
414
|
+
cleanup: (state) => cleanupFisheye(state)
|
|
415
|
+
})
|
|
444
416
|
},
|
|
445
|
-
cleanup: (state) => cleanupFisheye(state),
|
|
446
417
|
schema: fisheyeSchema,
|
|
447
418
|
validateParams: validateFisheyeParams
|
|
448
419
|
});
|
package/dist/esm/flannel.mjs
CHANGED
|
@@ -1,114 +1,76 @@
|
|
|
1
|
+
import {
|
|
2
|
+
setupWebGpuColors,
|
|
3
|
+
getWebGpuColors
|
|
4
|
+
} from "./index-8jx11jyn.mjs";
|
|
5
|
+
import {
|
|
6
|
+
assertOptionalFiniteNumber,
|
|
7
|
+
validateUnitInterval,
|
|
8
|
+
parseColorRgba
|
|
9
|
+
} from "./index-wxhvgv2s.mjs";
|
|
10
|
+
import {
|
|
11
|
+
WEBGPU_SINGLE_PASS_VERTEX,
|
|
12
|
+
cleanupWebGpuSinglePass,
|
|
13
|
+
applyWebGpuSinglePass
|
|
14
|
+
} from "./index-tvfexb7s.mjs";
|
|
15
|
+
import {
|
|
16
|
+
assertEffectParamsObject,
|
|
17
|
+
assertOptionalColor
|
|
18
|
+
} from "./index-4fvp93ps.mjs";
|
|
19
|
+
|
|
1
20
|
// src/flannel.ts
|
|
2
21
|
import { Internals } from "remotion";
|
|
3
22
|
|
|
4
|
-
// src/
|
|
5
|
-
var
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
};
|
|
23
|
+
// src/flannel-webgpu-shader.ts
|
|
24
|
+
var FLANNEL_WEBGPU_SHADER = `
|
|
25
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
26
|
+
@group(0) @binding(0) var sourceTexture: texture_2d<f32>;
|
|
27
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
28
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
29
|
+
struct Params {
|
|
30
|
+
geometry: vec4f,
|
|
31
|
+
values: vec4f,
|
|
32
|
+
base: vec4f,
|
|
33
|
+
stripe: vec4f,
|
|
34
|
+
}
|
|
35
|
+
fn sampleSource(uv: vec2f) -> vec4f {
|
|
36
|
+
return textureSampleLevel(sourceTexture, sourceSampler, vec2f(uv.x, 1.0 - uv.y), 0);
|
|
37
|
+
}
|
|
38
|
+
fn stripe(coordinate: f32, center: f32, width: f32, softness: f32) -> f32 {
|
|
39
|
+
let distanceFromCenter = abs(fract(coordinate) - center);
|
|
40
|
+
let halfWidth = width * 0.5;
|
|
41
|
+
return 1.0 - smoothstep(halfWidth, halfWidth + softness, distanceFromCenter);
|
|
42
|
+
}
|
|
43
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
44
|
+
let vUv = vec2f(input.uv.x, 1.0 - input.uv.y);
|
|
34
45
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
};
|
|
46
|
+
let source = sampleSource(vUv);
|
|
47
|
+
if (source.a <= 0.001 || params.geometry.z <= 0.0) { return source; }
|
|
48
|
+
let pixel = vec2f(input.position.x, params.geometry.y - input.position.y);
|
|
49
|
+
let plaid = pixel / max(params.geometry.w, 0.001);
|
|
50
|
+
let edge = mix(0.002, 0.08, params.values.x);
|
|
51
|
+
let verticalWide = stripe(plaid.x, 0.5, 0.34, edge);
|
|
52
|
+
let horizontalWide = stripe(plaid.y, 0.5, 0.34, edge);
|
|
53
|
+
let verticalFine = stripe(plaid.x * 2.0, 0.5, 0.07, edge * 0.5);
|
|
54
|
+
let horizontalFine = stripe(plaid.y * 2.0, 0.5, 0.07, edge * 0.5);
|
|
55
|
+
let bands = max(max(verticalWide, horizontalWide), max(verticalFine, horizontalFine) * 0.72);
|
|
56
|
+
let crossing = max(verticalWide * horizontalWide, verticalFine * horizontalFine);
|
|
57
|
+
let threadX = 0.5 + 0.5 * sin(pixel.x * 3.14159265);
|
|
58
|
+
let threadY = 0.5 + 0.5 * sin(pixel.y * 3.14159265);
|
|
59
|
+
let weave = (threadX - 0.5) * (threadY - 0.5) * 0.12;
|
|
60
|
+
let sourceRgb = source.rgb / source.a;
|
|
61
|
+
let luminance = dot(sourceRgb, vec3f(0.2126, 0.7152, 0.0722));
|
|
62
|
+
var plaidColor = mix(params.base.rgb, params.stripe.rgb, bands * params.stripe.a);
|
|
63
|
+
plaidColor = mix(plaidColor, params.stripe.rgb * 0.72, crossing * params.stripe.a);
|
|
64
|
+
plaidColor *= mix(0.58, 1.18, luminance) + weave;
|
|
65
|
+
let result = mix(sourceRgb, clamp(plaidColor, vec3f(0), vec3f(1)), params.geometry.z);
|
|
66
|
+
return vec4f(result * source.a, source.a);
|
|
67
|
+
|
|
68
|
+
}
|
|
69
|
+
`;
|
|
108
70
|
|
|
109
71
|
// src/flannel.ts
|
|
110
72
|
var { createEffect, createWebGL2ContextError } = Internals;
|
|
111
|
-
var
|
|
73
|
+
var DEFAULT_AMOUNT = 0.7;
|
|
112
74
|
var DEFAULT_SIZE = 96;
|
|
113
75
|
var DEFAULT_SOFTNESS = 0.18;
|
|
114
76
|
var DEFAULT_BASE_COLOR = "#c92f3d";
|
|
@@ -119,7 +81,7 @@ var flannelSchema = {
|
|
|
119
81
|
min: 0,
|
|
120
82
|
max: 1,
|
|
121
83
|
step: 0.01,
|
|
122
|
-
default:
|
|
84
|
+
default: DEFAULT_AMOUNT,
|
|
123
85
|
description: "Amount",
|
|
124
86
|
hiddenFromList: false
|
|
125
87
|
},
|
|
@@ -153,7 +115,7 @@ var flannelSchema = {
|
|
|
153
115
|
}
|
|
154
116
|
};
|
|
155
117
|
var resolve = (params) => ({
|
|
156
|
-
amount: params.amount ??
|
|
118
|
+
amount: params.amount ?? DEFAULT_AMOUNT,
|
|
157
119
|
size: params.size ?? DEFAULT_SIZE,
|
|
158
120
|
softness: params.softness ?? DEFAULT_SOFTNESS,
|
|
159
121
|
baseColor: params.baseColor ?? DEFAULT_BASE_COLOR,
|
|
@@ -210,7 +172,7 @@ void main() {
|
|
|
210
172
|
return;
|
|
211
173
|
}
|
|
212
174
|
|
|
213
|
-
vec2 pixel =
|
|
175
|
+
vec2 pixel = gl_FragCoord.xy;
|
|
214
176
|
vec2 plaid = pixel / max(uSize, 0.001);
|
|
215
177
|
float edge = mix(0.002, 0.08, uSoftness);
|
|
216
178
|
|
|
@@ -337,59 +299,99 @@ var flannel = createEffect({
|
|
|
337
299
|
type: "dev.remotion.effects.flannel",
|
|
338
300
|
label: "flannel()",
|
|
339
301
|
documentationLink: "https://www.remotion.dev/docs/effects/flannel",
|
|
340
|
-
backend: "webgl2",
|
|
341
302
|
calculateKey: (params) => {
|
|
342
303
|
const resolved = resolve(params);
|
|
343
304
|
return `flannel-${resolved.amount}-${resolved.size}-${resolved.softness}-${resolved.baseColor}-${resolved.stripeColor}`;
|
|
344
305
|
},
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
306
|
+
implementations: {
|
|
307
|
+
webgpu: Internals.createEffectImplementation({
|
|
308
|
+
setup: (target) => setupWebGpuColors(target, "flannel"),
|
|
309
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
310
|
+
if (!gpuDevice)
|
|
311
|
+
throw new Error("A WebGPU device is required for the flannel effect");
|
|
312
|
+
const r = resolve(params);
|
|
313
|
+
const colors = getWebGpuColors(state, [r.baseColor, r.stripeColor]);
|
|
314
|
+
const uniformData = new Float32Array([
|
|
315
|
+
width,
|
|
316
|
+
height,
|
|
317
|
+
r.amount,
|
|
318
|
+
r.size,
|
|
319
|
+
r.softness,
|
|
320
|
+
0,
|
|
321
|
+
0,
|
|
322
|
+
0,
|
|
323
|
+
colors[0] / 255,
|
|
324
|
+
colors[1] / 255,
|
|
325
|
+
colors[2] / 255,
|
|
326
|
+
colors[3] / 255,
|
|
327
|
+
colors[4] / 255,
|
|
328
|
+
colors[5] / 255,
|
|
329
|
+
colors[6] / 255,
|
|
330
|
+
colors[7] / 255
|
|
331
|
+
]);
|
|
332
|
+
applyWebGpuSinglePass({
|
|
333
|
+
state,
|
|
334
|
+
source,
|
|
335
|
+
width,
|
|
336
|
+
height,
|
|
337
|
+
device: gpuDevice,
|
|
338
|
+
shader: FLANNEL_WEBGPU_SHADER,
|
|
339
|
+
uniformData
|
|
340
|
+
});
|
|
341
|
+
},
|
|
342
|
+
cleanup: cleanupWebGpuSinglePass
|
|
343
|
+
}),
|
|
344
|
+
webgl2: Internals.createEffectImplementation({
|
|
345
|
+
setup: setupFlannel,
|
|
346
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
347
|
+
const resolved = resolve(params);
|
|
348
|
+
if (state.cachedBaseColor !== resolved.baseColor) {
|
|
349
|
+
state.cachedBaseColor = resolved.baseColor;
|
|
350
|
+
state.cachedBaseColorRgba = parseColorRgba(state.colorCtx, resolved.baseColor);
|
|
351
|
+
}
|
|
352
|
+
if (state.cachedStripeColor !== resolved.stripeColor) {
|
|
353
|
+
state.cachedStripeColor = resolved.stripeColor;
|
|
354
|
+
state.cachedStripeColorRgba = parseColorRgba(state.colorCtx, resolved.stripeColor);
|
|
355
|
+
}
|
|
356
|
+
const base = normalizedRgba(state.cachedBaseColorRgba);
|
|
357
|
+
const stripe = normalizedRgba(state.cachedStripeColorRgba);
|
|
358
|
+
const { gl } = state;
|
|
359
|
+
gl.viewport(0, 0, width, height);
|
|
360
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
361
|
+
gl.clearColor(0, 0, 0, 0);
|
|
362
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
363
|
+
gl.useProgram(state.program);
|
|
364
|
+
gl.bindVertexArray(state.vao);
|
|
365
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
366
|
+
gl.bindTexture(gl.TEXTURE_2D, state.texture);
|
|
367
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
368
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
369
|
+
if (state.uSource)
|
|
370
|
+
gl.uniform1i(state.uSource, 0);
|
|
371
|
+
if (state.uResolution)
|
|
372
|
+
gl.uniform2f(state.uResolution, width, height);
|
|
373
|
+
if (state.uAmount)
|
|
374
|
+
gl.uniform1f(state.uAmount, resolved.amount);
|
|
375
|
+
if (state.uSize)
|
|
376
|
+
gl.uniform1f(state.uSize, resolved.size);
|
|
377
|
+
if (state.uSoftness)
|
|
378
|
+
gl.uniform1f(state.uSoftness, resolved.softness);
|
|
379
|
+
if (state.uBaseColor)
|
|
380
|
+
gl.uniform4f(state.uBaseColor, ...base);
|
|
381
|
+
if (state.uStripeColor)
|
|
382
|
+
gl.uniform4f(state.uStripeColor, ...stripe);
|
|
383
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
384
|
+
gl.bindVertexArray(null);
|
|
385
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
386
|
+
gl.useProgram(null);
|
|
387
|
+
},
|
|
388
|
+
cleanup: ({ gl, program, vao, vbo, texture }) => {
|
|
389
|
+
gl.deleteTexture(texture);
|
|
390
|
+
gl.deleteBuffer(vbo);
|
|
391
|
+
gl.deleteProgram(program);
|
|
392
|
+
gl.deleteVertexArray(vao);
|
|
393
|
+
}
|
|
394
|
+
})
|
|
393
395
|
},
|
|
394
396
|
schema: flannelSchema,
|
|
395
397
|
validateParams: validateFlannelParams
|