@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,481 @@
|
|
|
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
|
+
|
|
20
|
+
// src/burlap.ts
|
|
21
|
+
import { Internals } from "remotion";
|
|
22
|
+
|
|
23
|
+
// src/burlap-webgpu-shader.ts
|
|
24
|
+
var BURLAP_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
|
+
color: vec4f,
|
|
33
|
+
}
|
|
34
|
+
fn sampleSource(uv: vec2f) -> vec4f {
|
|
35
|
+
return textureSampleLevel(sourceTexture, sourceSampler, vec2f(uv.x, 1.0 - uv.y), 0);
|
|
36
|
+
}
|
|
37
|
+
fn glslModulo(value: f32, divisor: f32) -> f32 { return value - divisor * floor(value / divisor); }
|
|
38
|
+
|
|
39
|
+
fn hash21(p: vec2f) -> f32 {
|
|
40
|
+
var p3 = fract(p.xyx * vec3f(443.8975, 397.2973, 491.1871));
|
|
41
|
+
p3 += vec3f(dot(p3, p3.yzx + vec3f(19.19) + vec3f(params.values.y * 0.137)));
|
|
42
|
+
return fract((p3.x + p3.y) * p3.z);
|
|
43
|
+
}
|
|
44
|
+
fn valueNoise(p: vec2f) -> f32 {
|
|
45
|
+
let i = floor(p);
|
|
46
|
+
var f = fract(p);
|
|
47
|
+
f = f * f * (vec2f(3.0) - 2.0 * f);
|
|
48
|
+
let a = hash21(i);
|
|
49
|
+
let b = hash21(i + vec2f(1, 0));
|
|
50
|
+
let c = hash21(i + vec2f(0, 1));
|
|
51
|
+
let d = hash21(i + vec2f(1, 1));
|
|
52
|
+
return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
|
|
53
|
+
}
|
|
54
|
+
fn strand(value: f32) -> f32 {
|
|
55
|
+
let centered = abs(fract(value) - 0.5);
|
|
56
|
+
return 1.0 - smoothstep(0.2, 0.5, centered);
|
|
57
|
+
}
|
|
58
|
+
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
|
|
59
|
+
let vUv = vec2f(input.uv.x, 1.0 - input.uv.y);
|
|
60
|
+
|
|
61
|
+
let texColor = sampleSource(vUv);
|
|
62
|
+
let alpha = texColor.a;
|
|
63
|
+
if (alpha <= 0.001) { return vec4f(0); }
|
|
64
|
+
if (params.geometry.z <= 0.0) { return texColor; }
|
|
65
|
+
// Match WebGL pixel centers without interpolated-UV rounding.
|
|
66
|
+
let fragPos = vec2f(input.position.x, params.geometry.y - input.position.y);
|
|
67
|
+
let strandSize = max(params.geometry.w, 0.001);
|
|
68
|
+
let weave = fragPos / strandSize;
|
|
69
|
+
let roughness = params.values.x;
|
|
70
|
+
let seed = params.values.y;
|
|
71
|
+
let rowJitter = (hash21(vec2f(floor(weave.y), 13.17)) - 0.5) * roughness * 0.28;
|
|
72
|
+
let columnJitter = (hash21(vec2f(71.43, floor(weave.x))) - 0.5) * roughness * 0.28;
|
|
73
|
+
let vertical = strand(weave.x + rowJitter);
|
|
74
|
+
let horizontal = strand(weave.y + columnJitter);
|
|
75
|
+
let cellParity = glslModulo(floor(weave.x) + floor(weave.y), 2.0);
|
|
76
|
+
let overUnder = mix(vertical, horizontal, cellParity);
|
|
77
|
+
let ridge = max(max(vertical, horizontal) * 0.45, overUnder * 0.75);
|
|
78
|
+
let gaps = (1.0 - vertical) * (1.0 - horizontal);
|
|
79
|
+
let coarse = valueNoise(fragPos / (strandSize * 7.0) + vec2f(seed * 1.7, seed * 0.6));
|
|
80
|
+
let fine = valueNoise(fragPos / max(strandSize * 0.55, 0.5) + vec2f(seed * 3.1, 4.7));
|
|
81
|
+
let dashH = smoothstep(0.64, 0.98, hash21(floor(vec2f(weave.x * 2.0, weave.y)) + vec2f(23.9))) * horizontal;
|
|
82
|
+
let dashV = smoothstep(0.64, 0.98, hash21(floor(vec2f(weave.x, weave.y * 2.0)) + vec2f(91.4))) * vertical;
|
|
83
|
+
var texture = 0.0;
|
|
84
|
+
texture += (ridge - 0.42) * 0.22;
|
|
85
|
+
texture -= gaps * 0.18;
|
|
86
|
+
texture += (coarse - 0.5) * 0.18 * roughness;
|
|
87
|
+
texture += (fine - 0.5) * 0.16 * roughness;
|
|
88
|
+
texture -= (dashH + dashV) * 0.08 * roughness;
|
|
89
|
+
var rgb = texColor.rgb / alpha;
|
|
90
|
+
let darkFiber = clamp(-texture * 3.2 + gaps * 0.12 + (dashH + dashV) * 0.18, 0.0, 1.0);
|
|
91
|
+
let shaded = mix(rgb, params.color.rgb, darkFiber * params.color.a);
|
|
92
|
+
let textured = clamp(shaded * (1.0 + max(texture, 0.0) * 0.45), vec3f(0), vec3f(1));
|
|
93
|
+
rgb = mix(rgb, textured, params.geometry.z);
|
|
94
|
+
return vec4f(rgb * alpha, alpha);
|
|
95
|
+
|
|
96
|
+
}
|
|
97
|
+
`;
|
|
98
|
+
|
|
99
|
+
// src/burlap.ts
|
|
100
|
+
var { createEffect, createWebGL2ContextError } = Internals;
|
|
101
|
+
var DEFAULT_AMOUNT = 0.55;
|
|
102
|
+
var DEFAULT_SIZE = 5;
|
|
103
|
+
var DEFAULT_ROUGHNESS = 0.7;
|
|
104
|
+
var DEFAULT_SEED = 0;
|
|
105
|
+
var DEFAULT_COLOR = "#000000";
|
|
106
|
+
var burlapSchema = {
|
|
107
|
+
amount: {
|
|
108
|
+
type: "number",
|
|
109
|
+
min: 0,
|
|
110
|
+
max: 1,
|
|
111
|
+
step: 0.01,
|
|
112
|
+
default: DEFAULT_AMOUNT,
|
|
113
|
+
description: "Amount",
|
|
114
|
+
hiddenFromList: false
|
|
115
|
+
},
|
|
116
|
+
size: {
|
|
117
|
+
type: "number",
|
|
118
|
+
min: 0.1,
|
|
119
|
+
max: 80,
|
|
120
|
+
step: 0.1,
|
|
121
|
+
default: DEFAULT_SIZE,
|
|
122
|
+
description: "Size",
|
|
123
|
+
hiddenFromList: false
|
|
124
|
+
},
|
|
125
|
+
roughness: {
|
|
126
|
+
type: "number",
|
|
127
|
+
min: 0,
|
|
128
|
+
max: 1,
|
|
129
|
+
step: 0.01,
|
|
130
|
+
default: DEFAULT_ROUGHNESS,
|
|
131
|
+
description: "Roughness",
|
|
132
|
+
hiddenFromList: false
|
|
133
|
+
},
|
|
134
|
+
seed: {
|
|
135
|
+
type: "number",
|
|
136
|
+
step: 1,
|
|
137
|
+
default: DEFAULT_SEED,
|
|
138
|
+
description: "Seed",
|
|
139
|
+
hiddenFromList: false
|
|
140
|
+
},
|
|
141
|
+
color: {
|
|
142
|
+
type: "color",
|
|
143
|
+
default: DEFAULT_COLOR,
|
|
144
|
+
description: "Color"
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
var resolve = (p) => ({
|
|
148
|
+
amount: p.amount ?? DEFAULT_AMOUNT,
|
|
149
|
+
size: p.size ?? DEFAULT_SIZE,
|
|
150
|
+
roughness: p.roughness ?? DEFAULT_ROUGHNESS,
|
|
151
|
+
seed: p.seed ?? DEFAULT_SEED,
|
|
152
|
+
color: p.color ?? DEFAULT_COLOR
|
|
153
|
+
});
|
|
154
|
+
var validatePositive = (value, name) => {
|
|
155
|
+
if (value <= 0) {
|
|
156
|
+
throw new TypeError(`"${name}" must be greater than 0, but got ${JSON.stringify(value)}`);
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
var validateBurlapParams = (params) => {
|
|
160
|
+
assertEffectParamsObject(params, "Burlap");
|
|
161
|
+
assertOptionalFiniteNumber(params.amount, "amount");
|
|
162
|
+
assertOptionalFiniteNumber(params.size, "size");
|
|
163
|
+
assertOptionalFiniteNumber(params.roughness, "roughness");
|
|
164
|
+
assertOptionalFiniteNumber(params.seed, "seed");
|
|
165
|
+
assertOptionalColor(params.color, "color");
|
|
166
|
+
const r = resolve(params);
|
|
167
|
+
validateUnitInterval(r.amount, "amount");
|
|
168
|
+
validatePositive(r.size, "size");
|
|
169
|
+
validateUnitInterval(r.roughness, "roughness");
|
|
170
|
+
};
|
|
171
|
+
var BURLAP_VS = `#version 300 es
|
|
172
|
+
in vec2 aPos;
|
|
173
|
+
in vec2 aUv;
|
|
174
|
+
out vec2 vUv;
|
|
175
|
+
|
|
176
|
+
void main() {
|
|
177
|
+
vUv = aUv;
|
|
178
|
+
gl_Position = vec4(aPos, 0.0, 1.0);
|
|
179
|
+
}
|
|
180
|
+
`;
|
|
181
|
+
var BURLAP_FS = `#version 300 es
|
|
182
|
+
precision highp float;
|
|
183
|
+
|
|
184
|
+
in vec2 vUv;
|
|
185
|
+
out vec4 fragColor;
|
|
186
|
+
|
|
187
|
+
uniform sampler2D uSource;
|
|
188
|
+
uniform vec2 uResolution;
|
|
189
|
+
uniform float uAmount;
|
|
190
|
+
uniform float uSize;
|
|
191
|
+
uniform float uRoughness;
|
|
192
|
+
uniform float uSeed;
|
|
193
|
+
uniform vec4 uColor;
|
|
194
|
+
|
|
195
|
+
float hash21(vec2 p) {
|
|
196
|
+
vec3 p3 = fract(vec3(p.xyx) * vec3(443.8975, 397.2973, 491.1871));
|
|
197
|
+
p3 += dot(p3, p3.yzx + 19.19 + uSeed * 0.137);
|
|
198
|
+
return fract((p3.x + p3.y) * p3.z);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
float valueNoise(vec2 p) {
|
|
202
|
+
vec2 i = floor(p);
|
|
203
|
+
vec2 f = fract(p);
|
|
204
|
+
f = f * f * (3.0 - 2.0 * f);
|
|
205
|
+
|
|
206
|
+
float a = hash21(i);
|
|
207
|
+
float b = hash21(i + vec2(1.0, 0.0));
|
|
208
|
+
float c = hash21(i + vec2(0.0, 1.0));
|
|
209
|
+
float d = hash21(i + vec2(1.0, 1.0));
|
|
210
|
+
|
|
211
|
+
return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
float strand(float value) {
|
|
215
|
+
float centered = abs(fract(value) - 0.5);
|
|
216
|
+
return 1.0 - smoothstep(0.2, 0.5, centered);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
void main() {
|
|
220
|
+
vec4 texColor = texture(uSource, vUv);
|
|
221
|
+
float alpha = texColor.a;
|
|
222
|
+
|
|
223
|
+
if (alpha <= 0.001) {
|
|
224
|
+
fragColor = vec4(0.0);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
if (uAmount <= 0.0) {
|
|
229
|
+
fragColor = texColor;
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Use pixel centers so weave-cell boundaries do not depend on UV interpolation.
|
|
234
|
+
vec2 fragPos = gl_FragCoord.xy;
|
|
235
|
+
float strandSize = max(uSize, 0.001);
|
|
236
|
+
vec2 weave = fragPos / strandSize;
|
|
237
|
+
|
|
238
|
+
float rowJitter = (hash21(vec2(floor(weave.y), 13.17)) - 0.5) * uRoughness * 0.28;
|
|
239
|
+
float columnJitter = (hash21(vec2(71.43, floor(weave.x))) - 0.5) * uRoughness * 0.28;
|
|
240
|
+
float vertical = strand(weave.x + rowJitter);
|
|
241
|
+
float horizontal = strand(weave.y + columnJitter);
|
|
242
|
+
|
|
243
|
+
float cellParity = mod(floor(weave.x) + floor(weave.y), 2.0);
|
|
244
|
+
float overUnder = mix(vertical, horizontal, cellParity);
|
|
245
|
+
float ridge = max(max(vertical, horizontal) * 0.45, overUnder * 0.75);
|
|
246
|
+
float gaps = (1.0 - vertical) * (1.0 - horizontal);
|
|
247
|
+
|
|
248
|
+
float coarse = valueNoise(fragPos / (strandSize * 7.0) + vec2(uSeed * 1.7, uSeed * 0.6));
|
|
249
|
+
float fine = valueNoise(fragPos / max(strandSize * 0.55, 0.5) + vec2(uSeed * 3.1, 4.7));
|
|
250
|
+
float dashH = smoothstep(0.64, 0.98, hash21(floor(vec2(weave.x * 2.0, weave.y)) + 23.9)) * horizontal;
|
|
251
|
+
float dashV = smoothstep(0.64, 0.98, hash21(floor(vec2(weave.x, weave.y * 2.0)) + 91.4)) * vertical;
|
|
252
|
+
|
|
253
|
+
float texture = 0.0;
|
|
254
|
+
texture += (ridge - 0.42) * 0.22;
|
|
255
|
+
texture -= gaps * 0.18;
|
|
256
|
+
texture += (coarse - 0.5) * 0.18 * uRoughness;
|
|
257
|
+
texture += (fine - 0.5) * 0.16 * uRoughness;
|
|
258
|
+
texture -= (dashH + dashV) * 0.08 * uRoughness;
|
|
259
|
+
|
|
260
|
+
vec3 rgb = texColor.rgb / alpha;
|
|
261
|
+
float darkFiber = clamp(-texture * 3.2 + gaps * 0.12 + (dashH + dashV) * 0.18, 0.0, 1.0);
|
|
262
|
+
vec3 shaded = mix(rgb, uColor.rgb, darkFiber * uColor.a);
|
|
263
|
+
vec3 textured = clamp(shaded * (1.0 + max(texture, 0.0) * 0.45), 0.0, 1.0);
|
|
264
|
+
rgb = mix(rgb, textured, uAmount);
|
|
265
|
+
|
|
266
|
+
fragColor = vec4(rgb * alpha, alpha);
|
|
267
|
+
}
|
|
268
|
+
`;
|
|
269
|
+
var compileShader = (gl, type, source) => {
|
|
270
|
+
const shader = gl.createShader(type);
|
|
271
|
+
if (!shader) {
|
|
272
|
+
throw new Error("Failed to create WebGL shader");
|
|
273
|
+
}
|
|
274
|
+
gl.shaderSource(shader, source);
|
|
275
|
+
gl.compileShader(shader);
|
|
276
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
277
|
+
const log = gl.getShaderInfoLog(shader);
|
|
278
|
+
gl.deleteShader(shader);
|
|
279
|
+
throw new Error(`Burlap shader compile failed: ${log ?? "(no log)"}`);
|
|
280
|
+
}
|
|
281
|
+
return shader;
|
|
282
|
+
};
|
|
283
|
+
var linkProgram = (gl, vs, fs) => {
|
|
284
|
+
const program = gl.createProgram();
|
|
285
|
+
if (!program) {
|
|
286
|
+
throw new Error("Failed to create WebGL program");
|
|
287
|
+
}
|
|
288
|
+
gl.attachShader(program, vs);
|
|
289
|
+
gl.attachShader(program, fs);
|
|
290
|
+
gl.linkProgram(program);
|
|
291
|
+
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
292
|
+
const log = gl.getProgramInfoLog(program);
|
|
293
|
+
gl.deleteProgram(program);
|
|
294
|
+
throw new Error(`Burlap program link failed: ${log ?? "(no log)"}`);
|
|
295
|
+
}
|
|
296
|
+
return program;
|
|
297
|
+
};
|
|
298
|
+
var setupBurlap = (target) => {
|
|
299
|
+
const gl = target.getContext("webgl2", {
|
|
300
|
+
premultipliedAlpha: true,
|
|
301
|
+
alpha: true,
|
|
302
|
+
preserveDrawingBuffer: true
|
|
303
|
+
});
|
|
304
|
+
if (!gl) {
|
|
305
|
+
throw createWebGL2ContextError("burlap effect");
|
|
306
|
+
}
|
|
307
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
|
|
308
|
+
const vs = compileShader(gl, gl.VERTEX_SHADER, BURLAP_VS);
|
|
309
|
+
const fs = compileShader(gl, gl.FRAGMENT_SHADER, BURLAP_FS);
|
|
310
|
+
const program = linkProgram(gl, vs, fs);
|
|
311
|
+
gl.deleteShader(vs);
|
|
312
|
+
gl.deleteShader(fs);
|
|
313
|
+
const vao = gl.createVertexArray();
|
|
314
|
+
if (!vao) {
|
|
315
|
+
throw new Error("Failed to create WebGL vertex array");
|
|
316
|
+
}
|
|
317
|
+
gl.bindVertexArray(vao);
|
|
318
|
+
const data = new Float32Array([
|
|
319
|
+
-1,
|
|
320
|
+
-1,
|
|
321
|
+
0,
|
|
322
|
+
0,
|
|
323
|
+
1,
|
|
324
|
+
-1,
|
|
325
|
+
1,
|
|
326
|
+
0,
|
|
327
|
+
-1,
|
|
328
|
+
1,
|
|
329
|
+
0,
|
|
330
|
+
1,
|
|
331
|
+
1,
|
|
332
|
+
1,
|
|
333
|
+
1,
|
|
334
|
+
1
|
|
335
|
+
]);
|
|
336
|
+
const vbo = gl.createBuffer();
|
|
337
|
+
if (!vbo) {
|
|
338
|
+
throw new Error("Failed to create WebGL buffer");
|
|
339
|
+
}
|
|
340
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
|
|
341
|
+
gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
|
|
342
|
+
const aPos = gl.getAttribLocation(program, "aPos");
|
|
343
|
+
const aUv = gl.getAttribLocation(program, "aUv");
|
|
344
|
+
gl.enableVertexAttribArray(aPos);
|
|
345
|
+
gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 16, 0);
|
|
346
|
+
gl.enableVertexAttribArray(aUv);
|
|
347
|
+
gl.vertexAttribPointer(aUv, 2, gl.FLOAT, false, 16, 8);
|
|
348
|
+
gl.bindVertexArray(null);
|
|
349
|
+
const texture = gl.createTexture();
|
|
350
|
+
if (!texture) {
|
|
351
|
+
throw new Error("Failed to create WebGL texture");
|
|
352
|
+
}
|
|
353
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
354
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
355
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
356
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
357
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
358
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
359
|
+
const colorCanvas = document.createElement("canvas");
|
|
360
|
+
colorCanvas.width = 1;
|
|
361
|
+
colorCanvas.height = 1;
|
|
362
|
+
const colorCtx = colorCanvas.getContext("2d", { willReadFrequently: true });
|
|
363
|
+
if (!colorCtx) {
|
|
364
|
+
throw new Error("Failed to acquire 2D context for color parsing");
|
|
365
|
+
}
|
|
366
|
+
return {
|
|
367
|
+
gl,
|
|
368
|
+
program,
|
|
369
|
+
vao,
|
|
370
|
+
vbo,
|
|
371
|
+
texture,
|
|
372
|
+
uSource: gl.getUniformLocation(program, "uSource"),
|
|
373
|
+
uResolution: gl.getUniformLocation(program, "uResolution"),
|
|
374
|
+
uAmount: gl.getUniformLocation(program, "uAmount"),
|
|
375
|
+
uSize: gl.getUniformLocation(program, "uSize"),
|
|
376
|
+
uRoughness: gl.getUniformLocation(program, "uRoughness"),
|
|
377
|
+
uSeed: gl.getUniformLocation(program, "uSeed"),
|
|
378
|
+
uColor: gl.getUniformLocation(program, "uColor"),
|
|
379
|
+
colorCtx,
|
|
380
|
+
cachedColor: "",
|
|
381
|
+
cachedColorRgba: [0, 0, 0, 255]
|
|
382
|
+
};
|
|
383
|
+
};
|
|
384
|
+
var normalizedRgba = (color) => {
|
|
385
|
+
return [color[0] / 255, color[1] / 255, color[2] / 255, color[3] / 255];
|
|
386
|
+
};
|
|
387
|
+
var burlap = createEffect({
|
|
388
|
+
type: "dev.remotion.effects.burlap",
|
|
389
|
+
label: "burlap()",
|
|
390
|
+
documentationLink: "https://www.remotion.dev/docs/effects/burlap",
|
|
391
|
+
calculateKey: (params) => {
|
|
392
|
+
const r = resolve(params);
|
|
393
|
+
return `burlap-${r.amount}-${r.size}-${r.roughness}-${r.seed}-${r.color}`;
|
|
394
|
+
},
|
|
395
|
+
implementations: {
|
|
396
|
+
webgpu: Internals.createEffectImplementation({
|
|
397
|
+
setup: (target) => setupWebGpuColors(target, "burlap"),
|
|
398
|
+
apply: ({ source, width, height, params, state, gpuDevice }) => {
|
|
399
|
+
if (!gpuDevice)
|
|
400
|
+
throw new Error("A WebGPU device is required for the burlap effect");
|
|
401
|
+
const r = resolve(params);
|
|
402
|
+
const colors = getWebGpuColors(state, [r.color]);
|
|
403
|
+
const uniformData = new Float32Array([
|
|
404
|
+
width,
|
|
405
|
+
height,
|
|
406
|
+
r.amount,
|
|
407
|
+
r.size,
|
|
408
|
+
r.roughness,
|
|
409
|
+
r.seed,
|
|
410
|
+
0,
|
|
411
|
+
0,
|
|
412
|
+
colors[0] / 255,
|
|
413
|
+
colors[1] / 255,
|
|
414
|
+
colors[2] / 255,
|
|
415
|
+
colors[3] / 255
|
|
416
|
+
]);
|
|
417
|
+
applyWebGpuSinglePass({
|
|
418
|
+
state,
|
|
419
|
+
source,
|
|
420
|
+
width,
|
|
421
|
+
height,
|
|
422
|
+
device: gpuDevice,
|
|
423
|
+
shader: BURLAP_WEBGPU_SHADER,
|
|
424
|
+
uniformData
|
|
425
|
+
});
|
|
426
|
+
},
|
|
427
|
+
cleanup: cleanupWebGpuSinglePass
|
|
428
|
+
}),
|
|
429
|
+
webgl2: Internals.createEffectImplementation({
|
|
430
|
+
setup: (target) => setupBurlap(target),
|
|
431
|
+
apply: ({ source, width, height, params, state, flipSourceY }) => {
|
|
432
|
+
const r = resolve(params);
|
|
433
|
+
const { gl, program, vao, texture } = state;
|
|
434
|
+
if (state.cachedColor !== r.color) {
|
|
435
|
+
state.cachedColor = r.color;
|
|
436
|
+
state.cachedColorRgba = parseColorRgba(state.colorCtx, r.color);
|
|
437
|
+
}
|
|
438
|
+
const [red, green, blue, alpha] = normalizedRgba(state.cachedColorRgba);
|
|
439
|
+
gl.viewport(0, 0, width, height);
|
|
440
|
+
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
|
|
441
|
+
gl.clearColor(0, 0, 0, 0);
|
|
442
|
+
gl.clear(gl.COLOR_BUFFER_BIT);
|
|
443
|
+
gl.useProgram(program);
|
|
444
|
+
gl.bindVertexArray(vao);
|
|
445
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
446
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
447
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
|
|
448
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
449
|
+
if (state.uSource)
|
|
450
|
+
gl.uniform1i(state.uSource, 0);
|
|
451
|
+
if (state.uResolution)
|
|
452
|
+
gl.uniform2f(state.uResolution, width, height);
|
|
453
|
+
if (state.uAmount)
|
|
454
|
+
gl.uniform1f(state.uAmount, r.amount);
|
|
455
|
+
if (state.uSize)
|
|
456
|
+
gl.uniform1f(state.uSize, r.size);
|
|
457
|
+
if (state.uRoughness)
|
|
458
|
+
gl.uniform1f(state.uRoughness, r.roughness);
|
|
459
|
+
if (state.uSeed)
|
|
460
|
+
gl.uniform1f(state.uSeed, r.seed);
|
|
461
|
+
if (state.uColor)
|
|
462
|
+
gl.uniform4f(state.uColor, red, green, blue, alpha);
|
|
463
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
464
|
+
gl.bindVertexArray(null);
|
|
465
|
+
gl.bindTexture(gl.TEXTURE_2D, null);
|
|
466
|
+
gl.useProgram(null);
|
|
467
|
+
},
|
|
468
|
+
cleanup: ({ gl, program, vao, vbo, texture }) => {
|
|
469
|
+
gl.deleteTexture(texture);
|
|
470
|
+
gl.deleteBuffer(vbo);
|
|
471
|
+
gl.deleteProgram(program);
|
|
472
|
+
gl.deleteVertexArray(vao);
|
|
473
|
+
}
|
|
474
|
+
})
|
|
475
|
+
},
|
|
476
|
+
schema: burlapSchema,
|
|
477
|
+
validateParams: validateBurlapParams
|
|
478
|
+
});
|
|
479
|
+
export {
|
|
480
|
+
burlap
|
|
481
|
+
};
|