@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/lens-blur.mjs
CHANGED
|
@@ -1,111 +1,22 @@
|
|
|
1
|
+
import {
|
|
2
|
+
assertOptionalFiniteNumber,
|
|
3
|
+
validateUnitInterval,
|
|
4
|
+
validateNonNegative
|
|
5
|
+
} from "./index-wxhvgv2s.mjs";
|
|
6
|
+
import {
|
|
7
|
+
WEBGPU_SINGLE_PASS_VERTEX,
|
|
8
|
+
setupWebGpuSinglePass,
|
|
9
|
+
cleanupWebGpuSinglePass,
|
|
10
|
+
applyWebGpuSinglePass
|
|
11
|
+
} from "./index-tvfexb7s.mjs";
|
|
12
|
+
import {
|
|
13
|
+
assertEffectParamsObject,
|
|
14
|
+
assertOptionalBoolean
|
|
15
|
+
} from "./index-4fvp93ps.mjs";
|
|
16
|
+
|
|
1
17
|
// src/lens-blur/index.ts
|
|
2
18
|
import { Internals } from "remotion";
|
|
3
19
|
|
|
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
20
|
// src/lens-blur/shader.ts
|
|
110
21
|
var LENS_BLUR_FRAGMENT_SHADER = `#version 300 es
|
|
111
22
|
precision highp float;
|
|
@@ -200,6 +111,70 @@ void main() {
|
|
|
200
111
|
}
|
|
201
112
|
`;
|
|
202
113
|
|
|
114
|
+
// src/lens-blur/webgpu-shader.ts
|
|
115
|
+
var LENS_BLUR_WEBGPU_SHADER = `
|
|
116
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
117
|
+
@group(0) @binding(0) var source: texture_2d<f32>;
|
|
118
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
119
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
120
|
+
// Aperture geometry and highlight controls adapted from EffectCraft's blur2.rs (MIT).
|
|
121
|
+
// See ../../THIRD_PARTY_LICENSES.md.
|
|
122
|
+
struct Params {resolution: vec2f, radius: f32, shape: f32, iris: vec4f, highlights: vec4f, options: vec4f,}
|
|
123
|
+
const PI=3.141592653589793;
|
|
124
|
+
const GOLDEN_ANGLE=2.399963229728653;
|
|
125
|
+
fn toLinear(color: vec3f) -> vec3f {
|
|
126
|
+
return mix(color/12.92,pow((color+0.055)/1.055,vec3f(2.4)),step(vec3f(0.04045),color));
|
|
127
|
+
}
|
|
128
|
+
fn toSrgb(color: vec3f) -> vec3f {
|
|
129
|
+
return mix(color*12.92,1.055*pow(max(color,vec3f(0)),vec3f(1.0/2.4))-0.055,step(vec3f(0.0031308),color));
|
|
130
|
+
}
|
|
131
|
+
fn readSource(uv: vec2f) -> vec4f {
|
|
132
|
+
let sampled=textureSampleLevel(source,sourceSampler,uv,0);
|
|
133
|
+
if (sampled.a<=0.0) {return vec4f(0);}
|
|
134
|
+
var color=sampled.rgb/sampled.a;
|
|
135
|
+
let luminance=dot(color,vec3f(0.2126,0.7152,0.0722));
|
|
136
|
+
if (params.options.y!=0.0) {color=toLinear(color);}
|
|
137
|
+
if (luminance>=params.highlights.y) {
|
|
138
|
+
let brightest=max(color.r,max(color.g,color.b));
|
|
139
|
+
let highlight=mix(vec3f(brightest),color,params.highlights.z);
|
|
140
|
+
color+=highlight*(4.0*params.highlights.x);
|
|
141
|
+
}
|
|
142
|
+
var coverage=1.0;
|
|
143
|
+
if (params.highlights.w==0.0) {
|
|
144
|
+
let pixel=uv*params.resolution;
|
|
145
|
+
let nearEdge=clamp(pixel+0.5,vec2f(0),vec2f(1));
|
|
146
|
+
let farEdge=clamp(params.resolution+0.5-pixel,vec2f(0),vec2f(1));
|
|
147
|
+
coverage=nearEdge.x*nearEdge.y*farEdge.x*farEdge.y;
|
|
148
|
+
}
|
|
149
|
+
return vec4f(color*sampled.a,sampled.a)*coverage;
|
|
150
|
+
}
|
|
151
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
152
|
+
if (params.radius==0.0) {return textureSampleLevel(source,sourceSampler,input.uv,0);}
|
|
153
|
+
var sum=vec4f(0);var total=0.0;
|
|
154
|
+
for (var i=0;i<2048;i++) {
|
|
155
|
+
if (f32(i)>=params.options.x) {break;}
|
|
156
|
+
let angle=f32(i)*GOLDEN_ANGLE;
|
|
157
|
+
var boundary=1.0;
|
|
158
|
+
if (params.shape<11.0) {
|
|
159
|
+
let halfSector=PI/params.shape;
|
|
160
|
+
let value=angle+PI/2.0;
|
|
161
|
+
let localAngle=value-floor(value/(2.0*halfSector))*(2.0*halfSector)-halfSector;
|
|
162
|
+
let polygon=cos(halfSector)/cos(localAngle);
|
|
163
|
+
boundary=mix(polygon,1.0,params.iris.x);
|
|
164
|
+
}
|
|
165
|
+
let distance=sqrt((f32(i)+0.5)/params.options.x)*boundary;
|
|
166
|
+
let rotatedAngle=angle+params.iris.y;
|
|
167
|
+
let offset=vec2f(cos(rotatedAngle)*params.iris.z,sin(rotatedAngle))*distance*params.radius;
|
|
168
|
+
let weight=boundary*boundary;
|
|
169
|
+
sum+=readSource(input.uv-offset/params.resolution)*weight;
|
|
170
|
+
total+=weight;
|
|
171
|
+
}
|
|
172
|
+
var color=sum/total;
|
|
173
|
+
if (params.options.y!=0.0 && color.a>0.0) {color=vec4f(toSrgb(color.rgb/color.a)*color.a,color.a);}
|
|
174
|
+
return vec4f(clamp(color.rgb,vec3f(0),vec3f(color.a)),color.a);
|
|
175
|
+
}
|
|
176
|
+
`;
|
|
177
|
+
|
|
203
178
|
// src/lens-blur/index.ts
|
|
204
179
|
var { createEffect, createWebGL2ContextError } = Internals;
|
|
205
180
|
var DEFAULT_RADIUS = 10;
|
|
@@ -486,61 +461,99 @@ var lensBlur = createEffect({
|
|
|
486
461
|
type: "remotion/lens-blur",
|
|
487
462
|
label: "lensBlur()",
|
|
488
463
|
documentationLink: "https://www.remotion.dev/docs/effects/lens-blur",
|
|
489
|
-
backend: "webgl2",
|
|
490
464
|
calculateKey: (params) => {
|
|
491
465
|
const r = resolve(params);
|
|
492
466
|
return `lens-blur-${JSON.stringify(r)}`;
|
|
493
467
|
},
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
468
|
+
implementations: {
|
|
469
|
+
webgpu: Internals.createEffectImplementation({
|
|
470
|
+
setup: (target) => setupWebGpuSinglePass(target, "lens-blur"),
|
|
471
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
472
|
+
if (!gpuDevice)
|
|
473
|
+
throw new Error("A WebGPU device is required for this effect");
|
|
474
|
+
const r = resolve(params);
|
|
475
|
+
applyWebGpuSinglePass({
|
|
476
|
+
state,
|
|
477
|
+
source,
|
|
478
|
+
width,
|
|
479
|
+
height,
|
|
480
|
+
device: gpuDevice,
|
|
481
|
+
shader: LENS_BLUR_WEBGPU_SHADER,
|
|
482
|
+
uniformData: new Float32Array([
|
|
483
|
+
width,
|
|
484
|
+
height,
|
|
485
|
+
r.radius,
|
|
486
|
+
IRIS_SHAPES.indexOf(r.irisShape) + 3,
|
|
487
|
+
r.irisRoundness,
|
|
488
|
+
r.irisRotation % 360 * Math.PI / 180,
|
|
489
|
+
r.irisAspectRatio,
|
|
490
|
+
0,
|
|
491
|
+
r.highlightGain,
|
|
492
|
+
r.highlightThreshold,
|
|
493
|
+
r.highlightSaturation,
|
|
494
|
+
r.repeatEdgePixels ? 1 : 0,
|
|
495
|
+
r.samples,
|
|
496
|
+
r.linearLight ? 1 : 0,
|
|
497
|
+
0,
|
|
498
|
+
0
|
|
499
|
+
])
|
|
500
|
+
});
|
|
501
|
+
},
|
|
502
|
+
cleanup: cleanupWebGpuSinglePass
|
|
503
|
+
}),
|
|
504
|
+
webgl2: Internals.createEffectImplementation({
|
|
505
|
+
setup: (target) => setupLensBlur(target),
|
|
506
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
507
|
+
const r = resolve(params);
|
|
508
|
+
const { gl, program, texture, vao } = state;
|
|
509
|
+
gl.viewport(0, 0, width, height);
|
|
510
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
511
|
+
gl.clearColor(0, 0, 0, 0);
|
|
512
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
513
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
514
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
515
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
516
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
517
|
+
gl.useProgram(program);
|
|
518
|
+
if (state.uSource)
|
|
519
|
+
gl.uniform1i(state.uSource, 0);
|
|
520
|
+
if (state.uResolution)
|
|
521
|
+
gl.uniform2f(state.uResolution, width, height);
|
|
522
|
+
if (state.uRadius)
|
|
523
|
+
gl.uniform1f(state.uRadius, r.radius);
|
|
524
|
+
if (state.uIrisShape)
|
|
525
|
+
gl.uniform1i(state.uIrisShape, IRIS_SHAPES.indexOf(r.irisShape) + 3);
|
|
526
|
+
if (state.uIrisRoundness)
|
|
527
|
+
gl.uniform1f(state.uIrisRoundness, r.irisRoundness);
|
|
528
|
+
if (state.uIrisRotation)
|
|
529
|
+
gl.uniform1f(state.uIrisRotation, r.irisRotation % 360 * Math.PI / 180);
|
|
530
|
+
if (state.uIrisAspectRatio)
|
|
531
|
+
gl.uniform1f(state.uIrisAspectRatio, r.irisAspectRatio);
|
|
532
|
+
if (state.uHighlightGain)
|
|
533
|
+
gl.uniform1f(state.uHighlightGain, r.highlightGain);
|
|
534
|
+
if (state.uHighlightThreshold)
|
|
535
|
+
gl.uniform1f(state.uHighlightThreshold, r.highlightThreshold);
|
|
536
|
+
if (state.uHighlightSaturation)
|
|
537
|
+
gl.uniform1f(state.uHighlightSaturation, r.highlightSaturation);
|
|
538
|
+
if (state.uRepeatEdgePixels)
|
|
539
|
+
gl.uniform1i(state.uRepeatEdgePixels, r.repeatEdgePixels ? 1 : 0);
|
|
540
|
+
if (state.uSamples)
|
|
541
|
+
gl.uniform1i(state.uSamples, r.samples);
|
|
542
|
+
if (state.uLinearLight)
|
|
543
|
+
gl.uniform1i(state.uLinearLight, r.linearLight ? 1 : 0);
|
|
544
|
+
gl.bindVertexArray(vao);
|
|
545
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
546
|
+
gl.bindVertexArray(null);
|
|
547
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
548
|
+
gl.useProgram(null);
|
|
549
|
+
},
|
|
550
|
+
cleanup: ({ gl, program, vao, vbo, texture }) => {
|
|
551
|
+
gl.deleteTexture(texture);
|
|
552
|
+
gl.deleteBuffer(vbo);
|
|
553
|
+
gl.deleteProgram(program);
|
|
554
|
+
gl.deleteVertexArray(vao);
|
|
555
|
+
}
|
|
556
|
+
})
|
|
544
557
|
},
|
|
545
558
|
schema: lensBlurSchema,
|
|
546
559
|
validateParams: validateLensBlurParams
|
package/dist/esm/levels.mjs
CHANGED
|
@@ -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/levels.ts
|
|
16
|
+
import { Internals } from "remotion";
|
|
110
17
|
var { createEffect, createWebGL2ContextError } = Internals;
|
|
111
18
|
var DEFAULT_BLACK_POINT = 0;
|
|
112
19
|
var DEFAULT_WHITE_POINT = 1;
|
|
@@ -263,6 +170,44 @@ void main() {
|
|
|
263
170
|
fragColor = vec4(color * alpha, alpha);
|
|
264
171
|
}
|
|
265
172
|
`;
|
|
173
|
+
var WEBGPU_SHADER = `
|
|
174
|
+
${WEBGPU_SINGLE_PASS_VERTEX}
|
|
175
|
+
struct Params {
|
|
176
|
+
blackPoint: f32,
|
|
177
|
+
whitePoint: f32,
|
|
178
|
+
gamma: f32,
|
|
179
|
+
outputBlack: f32,
|
|
180
|
+
outputWhite: f32,
|
|
181
|
+
channel: f32,
|
|
182
|
+
padding0: f32,
|
|
183
|
+
padding1: f32,
|
|
184
|
+
}
|
|
185
|
+
@group(0) @binding(0) var source: texture_2d<f32>;
|
|
186
|
+
@group(0) @binding(1) var sourceSampler: sampler;
|
|
187
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
188
|
+
|
|
189
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
190
|
+
let sourceColor = textureSampleLevel(source, sourceSampler, input.uv, 0.0);
|
|
191
|
+
let alpha = sourceColor.a;
|
|
192
|
+
if (alpha <= 0.0) {
|
|
193
|
+
return vec4f(0.0);
|
|
194
|
+
}
|
|
195
|
+
var color = sourceColor.rgb / alpha;
|
|
196
|
+
let normalized = clamp((color - vec3f(params.blackPoint)) / (params.whitePoint - params.blackPoint), vec3f(0.0), vec3f(1.0));
|
|
197
|
+
let corrected = pow(normalized, vec3f(1.0 / params.gamma));
|
|
198
|
+
let outputColor = mix(vec3f(params.outputBlack), vec3f(params.outputWhite), corrected);
|
|
199
|
+
if (params.channel == 1.0) {
|
|
200
|
+
color.r = outputColor.r;
|
|
201
|
+
} else if (params.channel == 2.0) {
|
|
202
|
+
color.g = outputColor.g;
|
|
203
|
+
} else if (params.channel == 3.0) {
|
|
204
|
+
color.b = outputColor.b;
|
|
205
|
+
} else {
|
|
206
|
+
color = outputColor;
|
|
207
|
+
}
|
|
208
|
+
return vec4f(color * alpha, alpha);
|
|
209
|
+
}
|
|
210
|
+
`;
|
|
266
211
|
var compileShader = (gl, type, source) => {
|
|
267
212
|
const shader = gl.createShader(type);
|
|
268
213
|
if (!shader) {
|
|
@@ -359,54 +304,92 @@ var levels = createEffect({
|
|
|
359
304
|
type: "remotion/levels",
|
|
360
305
|
label: "levels()",
|
|
361
306
|
documentationLink: "https://www.remotion.dev/docs/effects/levels",
|
|
362
|
-
backend: "webgl2",
|
|
363
307
|
calculateKey: (params) => {
|
|
364
308
|
const { channel, blackPoint, whitePoint, gamma, outputBlack, outputWhite } = resolve(params);
|
|
365
309
|
return `levels-${channel}-${blackPoint}-${whitePoint}-${gamma}-${outputBlack}-${outputWhite}`;
|
|
366
310
|
},
|
|
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
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
311
|
+
implementations: {
|
|
312
|
+
webgpu: Internals.createEffectImplementation({
|
|
313
|
+
setup: (target) => setupWebGpuSinglePass(target, "levels"),
|
|
314
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
315
|
+
if (!gpuDevice) {
|
|
316
|
+
throw new Error("A WebGPU device is required for the levels effect");
|
|
317
|
+
}
|
|
318
|
+
const r = resolve(params);
|
|
319
|
+
applyWebGpuSinglePass({
|
|
320
|
+
state,
|
|
321
|
+
source,
|
|
322
|
+
width,
|
|
323
|
+
height,
|
|
324
|
+
device: gpuDevice,
|
|
325
|
+
shader: WEBGPU_SHADER,
|
|
326
|
+
uniformData: new Float32Array([
|
|
327
|
+
r.blackPoint,
|
|
328
|
+
r.whitePoint,
|
|
329
|
+
r.gamma,
|
|
330
|
+
r.outputBlack,
|
|
331
|
+
r.outputWhite,
|
|
332
|
+
LEVELS_CHANNELS.indexOf(r.channel),
|
|
333
|
+
0,
|
|
334
|
+
0
|
|
335
|
+
])
|
|
336
|
+
});
|
|
337
|
+
},
|
|
338
|
+
cleanup: cleanupWebGpuSinglePass
|
|
339
|
+
}),
|
|
340
|
+
webgl2: Internals.createEffectImplementation({
|
|
341
|
+
setup: setupLevels,
|
|
342
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
343
|
+
const {
|
|
344
|
+
channel,
|
|
345
|
+
blackPoint,
|
|
346
|
+
whitePoint,
|
|
347
|
+
gamma,
|
|
348
|
+
outputBlack,
|
|
349
|
+
outputWhite
|
|
350
|
+
} = resolve(params);
|
|
351
|
+
const { gl, program, textureSource, uniforms, vao } = state;
|
|
352
|
+
gl.viewport(0, 0, width, height);
|
|
353
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
354
|
+
gl.clearColor(0, 0, 0, 0);
|
|
355
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
356
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
357
|
+
gl.bindTexture(gl.TEXTURE_2D, textureSource);
|
|
358
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
359
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
360
|
+
gl.useProgram(program);
|
|
361
|
+
if (uniforms.uSource)
|
|
362
|
+
gl.uniform1i(uniforms.uSource, 0);
|
|
363
|
+
if (uniforms.uBlackPoint) {
|
|
364
|
+
gl.uniform1f(uniforms.uBlackPoint, blackPoint);
|
|
365
|
+
}
|
|
366
|
+
if (uniforms.uWhitePoint) {
|
|
367
|
+
gl.uniform1f(uniforms.uWhitePoint, whitePoint);
|
|
368
|
+
}
|
|
369
|
+
if (uniforms.uGamma)
|
|
370
|
+
gl.uniform1f(uniforms.uGamma, gamma);
|
|
371
|
+
if (uniforms.uOutputBlack) {
|
|
372
|
+
gl.uniform1f(uniforms.uOutputBlack, outputBlack);
|
|
373
|
+
}
|
|
374
|
+
if (uniforms.uOutputWhite) {
|
|
375
|
+
gl.uniform1f(uniforms.uOutputWhite, outputWhite);
|
|
376
|
+
}
|
|
377
|
+
if (uniforms.uChannel) {
|
|
378
|
+
gl.uniform1i(uniforms.uChannel, LEVELS_CHANNELS.indexOf(channel));
|
|
379
|
+
}
|
|
380
|
+
gl.bindVertexArray(vao);
|
|
381
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
382
|
+
gl.bindVertexArray(null);
|
|
383
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
384
|
+
gl.useProgram(null);
|
|
385
|
+
},
|
|
386
|
+
cleanup: ({ gl, program, vao, vbo, textureSource }) => {
|
|
387
|
+
gl.deleteTexture(textureSource);
|
|
388
|
+
gl.deleteBuffer(vbo);
|
|
389
|
+
gl.deleteProgram(program);
|
|
390
|
+
gl.deleteVertexArray(vao);
|
|
391
|
+
}
|
|
392
|
+
})
|
|
410
393
|
},
|
|
411
394
|
schema: levelsSchema,
|
|
412
395
|
validateParams: validateLevelsParams
|