@remotion/effects 4.0.540 → 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.
Files changed (133) hide show
  1. package/THIRD_PARTY_LICENSES.md +10 -0
  2. package/dist/esm/lightning.mjs +603 -0
  3. package/dist/esm/magnify.mjs +403 -0
  4. package/dist/esm/preview/barrel-distortion.mjs +303 -0
  5. package/dist/esm/preview/bevel-alpha.mjs +525 -0
  6. package/dist/esm/preview/blur.mjs +435 -0
  7. package/dist/esm/preview/brightness.mjs +95 -0
  8. package/dist/esm/preview/burlap.mjs +481 -0
  9. package/dist/esm/preview/checkerboard.mjs +8 -0
  10. package/dist/esm/preview/chromatic-aberration.mjs +308 -0
  11. package/dist/esm/preview/color-correction.mjs +522 -0
  12. package/dist/esm/preview/color-key.mjs +440 -0
  13. package/dist/esm/preview/contour-lines.mjs +608 -0
  14. package/dist/esm/preview/contrast.mjs +95 -0
  15. package/dist/esm/preview/corner-pin.mjs +6 -0
  16. package/dist/esm/preview/curves.mjs +357 -0
  17. package/dist/esm/preview/cylinder.mjs +273 -0
  18. package/dist/esm/preview/dot-grid.mjs +333 -0
  19. package/dist/esm/preview/drop-shadow.mjs +607 -0
  20. package/dist/esm/preview/duotone.mjs +344 -0
  21. package/dist/esm/preview/emboss.mjs +479 -0
  22. package/dist/esm/preview/evolve.mjs +485 -0
  23. package/dist/esm/preview/exposure.mjs +264 -0
  24. package/dist/esm/preview/film-burn.mjs +298 -0
  25. package/dist/esm/preview/fisheye.mjs +422 -0
  26. package/dist/esm/preview/flannel.mjs +401 -0
  27. package/dist/esm/preview/fractal-noise.mjs +642 -0
  28. package/dist/esm/preview/glow.mjs +598 -0
  29. package/dist/esm/preview/grayscale.mjs +86 -0
  30. package/dist/esm/preview/gridlines.mjs +8 -0
  31. package/dist/esm/preview/halftone-linear-gradient.mjs +523 -0
  32. package/dist/esm/preview/halftone.mjs +552 -0
  33. package/dist/esm/preview/hue.mjs +83 -0
  34. package/dist/esm/preview/index-00v3hr66.mjs +299 -0
  35. package/dist/esm/preview/index-0w4eqht8.mjs +351 -0
  36. package/dist/esm/preview/index-18y0zcy2.mjs +440 -0
  37. package/dist/esm/preview/index-1m1b1ad7.mjs +520 -0
  38. package/dist/esm/preview/index-34fxm3ax.mjs +518 -0
  39. package/dist/esm/preview/index-4fvp93ps.mjs +32 -0
  40. package/dist/esm/preview/index-4scpn12x.mjs +224 -0
  41. package/dist/esm/preview/index-4z6pt3ka.mjs +104 -0
  42. package/dist/esm/preview/index-618ky75w.mjs +51 -0
  43. package/dist/esm/preview/index-6agxdrvr.mjs +411 -0
  44. package/dist/esm/preview/index-6jkps947.mjs +120 -0
  45. package/dist/esm/preview/index-8agtsbw4.mjs +617 -0
  46. package/dist/esm/preview/index-8jx11jyn.mjs +29 -0
  47. package/dist/esm/preview/index-8p04sssx.mjs +123 -0
  48. package/dist/esm/preview/index-afdtmrh2.mjs +596 -0
  49. package/dist/esm/preview/index-b86qstcs.mjs +18 -0
  50. package/dist/esm/preview/index-cb77qg3g.mjs +587 -0
  51. package/dist/esm/preview/index-cdp7tr8x.mjs +122 -0
  52. package/dist/esm/preview/index-evy8hyah.mjs +55 -0
  53. package/dist/esm/preview/index-gnsce796.mjs +6 -0
  54. package/dist/esm/preview/index-kkvzt8b7.mjs +199 -0
  55. package/dist/esm/preview/index-r0v18b2n.mjs +425 -0
  56. package/dist/esm/preview/index-rswpzmm5.mjs +926 -0
  57. package/dist/esm/preview/index-s9mrx750.mjs +97 -0
  58. package/dist/esm/preview/index-tvfexb7s.mjs +164 -0
  59. package/dist/esm/preview/index-vp56k1gj.mjs +215 -0
  60. package/dist/esm/preview/index-wxhvgv2s.mjs +79 -0
  61. package/dist/esm/preview/index-wy95a41r.mjs +407 -0
  62. package/dist/esm/preview/index-ysnwfc4t.mjs +306 -0
  63. package/dist/esm/preview/index.mjs +51 -0
  64. package/dist/esm/preview/invert.mjs +84 -0
  65. package/dist/esm/preview/iris-wipe.mjs +315 -0
  66. package/dist/esm/preview/lens-blur.mjs +563 -0
  67. package/dist/esm/preview/levels.mjs +400 -0
  68. package/dist/esm/preview/light-leak.mjs +8 -0
  69. package/dist/esm/preview/light-trail.mjs +516 -0
  70. package/dist/esm/preview/lightning.mjs +603 -0
  71. package/dist/esm/preview/linear-gradient-tint.mjs +6 -0
  72. package/dist/esm/preview/linear-gradient.mjs +6 -0
  73. package/dist/esm/preview/linear-progressive-blur.mjs +516 -0
  74. package/dist/esm/preview/linear-progressive-pixelate.mjs +176 -0
  75. package/dist/esm/preview/lines.mjs +536 -0
  76. package/dist/esm/preview/liquid-contours.mjs +512 -0
  77. package/dist/esm/preview/long-shadows.mjs +437 -0
  78. package/dist/esm/preview/lut.mjs +601 -0
  79. package/dist/esm/preview/magnify.mjs +403 -0
  80. package/dist/esm/preview/mirror.mjs +341 -0
  81. package/dist/esm/preview/noise-displacement.mjs +584 -0
  82. package/dist/esm/preview/noise.mjs +318 -0
  83. package/dist/esm/preview/outline.mjs +725 -0
  84. package/dist/esm/preview/page-turn.mjs +302 -0
  85. package/dist/esm/preview/paper.mjs +1249 -0
  86. package/dist/esm/preview/pattern.mjs +6 -0
  87. package/dist/esm/preview/pixel-dissolve.mjs +360 -0
  88. package/dist/esm/preview/pixelate.mjs +249 -0
  89. package/dist/esm/preview/radial-progressive-blur.mjs +582 -0
  90. package/dist/esm/preview/radial-progressive-pixelate.mjs +220 -0
  91. package/dist/esm/preview/radial-wipe.mjs +224 -0
  92. package/dist/esm/preview/rain-fall.mjs +114 -0
  93. package/dist/esm/preview/region-blur.mjs +500 -0
  94. package/dist/esm/preview/rings.mjs +8 -0
  95. package/dist/esm/preview/roughen-edges.mjs +590 -0
  96. package/dist/esm/preview/saturation.mjs +86 -0
  97. package/dist/esm/preview/scale.mjs +109 -0
  98. package/dist/esm/preview/scanlines.mjs +362 -0
  99. package/dist/esm/preview/shadows-highlights.mjs +284 -0
  100. package/dist/esm/preview/shatter.mjs +868 -0
  101. package/dist/esm/preview/shine.mjs +368 -0
  102. package/dist/esm/preview/shrinkwrap.mjs +769 -0
  103. package/dist/esm/preview/skew.mjs +300 -0
  104. package/dist/esm/preview/snow-fall.mjs +170 -0
  105. package/dist/esm/preview/speckle.mjs +356 -0
  106. package/dist/esm/preview/sphere.mjs +252 -0
  107. package/dist/esm/preview/starburst.mjs +8 -0
  108. package/dist/esm/preview/tear.mjs +375 -0
  109. package/dist/esm/preview/thermal-vision.mjs +387 -0
  110. package/dist/esm/preview/tile.mjs +7 -0
  111. package/dist/esm/preview/tint.mjs +125 -0
  112. package/dist/esm/preview/translate.mjs +151 -0
  113. package/dist/esm/preview/turbulent-displace.mjs +613 -0
  114. package/dist/esm/preview/tv-signal-off.mjs +308 -0
  115. package/dist/esm/preview/venetian-blinds.mjs +341 -0
  116. package/dist/esm/preview/vibrance.mjs +254 -0
  117. package/dist/esm/preview/vignette.mjs +458 -0
  118. package/dist/esm/preview/wave.mjs +384 -0
  119. package/dist/esm/preview/waves.mjs +599 -0
  120. package/dist/esm/preview/white-balance.mjs +280 -0
  121. package/dist/esm/preview/white-noise.mjs +244 -0
  122. package/dist/esm/preview/zigzag.mjs +8 -0
  123. package/dist/esm/preview/zoom-blur.mjs +389 -0
  124. package/dist/lightning/geometry.d.ts +10 -0
  125. package/dist/lightning/index.d.ts +4 -0
  126. package/dist/lightning/mask.d.ts +2 -0
  127. package/dist/lightning/params.d.ts +259 -0
  128. package/dist/lightning/shaders.d.ts +2 -0
  129. package/dist/lightning.d.ts +2 -0
  130. package/dist/magnify/shader.d.ts +1 -0
  131. package/dist/magnify/webgpu-shader.d.ts +1 -0
  132. package/dist/magnify.d.ts +28 -0
  133. package/package.json +30 -6
@@ -0,0 +1,769 @@
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
+ } from "./index-4fvp93ps.mjs";
15
+
16
+ // src/shrinkwrap.ts
17
+ import { Internals } from "remotion";
18
+
19
+ // src/shrinkwrap-webgpu-shader.ts
20
+ var SHRINKWRAP_WEBGPU_SHADER = `
21
+ ${WEBGPU_SINGLE_PASS_VERTEX}
22
+ @group(0) @binding(0) var source: texture_2d<f32>;
23
+ @group(0) @binding(1) var sourceSampler: sampler;
24
+ @group(0) @binding(2) var<uniform> params: Params;
25
+ struct Params { size: vec2f, amount: f32, displacement: f32, highlightIntensity: f32, wrinkleDensity: f32, edgeTension: f32, phase: f32, seed: f32, }
26
+ fn hash21(p: vec2f) -> f32 {
27
+ var p3: vec3f = fract(vec3f(p.xyx) * vec3f(443.8975, 397.2973, 491.1871));
28
+ p3 += vec3f(dot(p3, p3.yzx + vec3f(19.19) + vec3f(params.seed * 0.131)));
29
+ return fract((p3.x + p3.y) * p3.z);
30
+ }
31
+
32
+ fn valueNoise(p: vec2f) -> f32 {
33
+ var i: vec2f = floor(p);
34
+ var f: vec2f = fract(p);
35
+ f = f * f * (vec2f(3.0) - 2.0 * f);
36
+
37
+ var a: f32 = hash21(i);
38
+ var b: f32 = hash21(i + vec2f(1.0, 0.0));
39
+ var c: f32 = hash21(i + vec2f(0.0, 1.0));
40
+ var d: f32 = hash21(i + vec2f(1.0, 1.0));
41
+
42
+ return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
43
+ }
44
+
45
+ fn fbm(point: vec2f) -> f32 {
46
+ var p=point;
47
+ var value: f32 = 0.0;
48
+ var amplitude: f32 = 0.5;
49
+
50
+ for (var i: i32 = 0; i < 4; i++) {
51
+ value += valueNoise(p) * amplitude;
52
+ p = p * 2.03 + vec2f(17.1, 31.7);
53
+ amplitude *= 0.5;
54
+ }
55
+
56
+ return value;
57
+ }
58
+
59
+ fn rotate2d(angle: f32) -> mat2x2f {
60
+ var c: f32 = cos(angle);
61
+ var s: f32 = sin(angle);
62
+ return mat2x2f(vec2f(c,-s),vec2f(s,c));
63
+ }
64
+
65
+ fn phaseVec(xFactor: f32, yFactor: f32) -> vec2f {
66
+ return vec2f(params.phase * xFactor, params.phase * yFactor);
67
+ }
68
+
69
+ fn warpVec(p: vec2f, scale: f32, amount: f32, seedOffset: f32) -> vec2f {
70
+ return vec2f(
71
+ fbm(p / scale + phaseVec(0.21, 0.13) + vec2f(seedOffset, 1.7)) - 0.5,
72
+ fbm(p / scale + phaseVec(-0.17, 0.29) + vec2f(seedOffset + 9.1, 6.4))
73
+ - 0.5
74
+ ) * amount;
75
+ }
76
+
77
+ fn bandField(coord: f32, spacing: f32, width: f32) -> f32 {
78
+ var centered: f32 = abs(fract(coord / spacing) - 0.5) * spacing;
79
+ return 1.0 - smoothstep(width, width * 3.8, centered);
80
+ }
81
+
82
+ fn curvedFoldField(px: vec2f, baseAngle: f32, spacing: f32, width: f32, seedOffset: f32) -> f32 {
83
+ var angleNoise: f32 =
84
+ (fbm(px / (spacing * 5.8) + phaseVec(0.08, -0.11) + vec2f(seedOffset, 3.1))
85
+ - 0.5) * 1.35;
86
+ var warped: vec2f = px + warpVec(
87
+ px + vec2f(seedOffset * 13.0, seedOffset * 7.0),
88
+ spacing * 5.4,
89
+ spacing * 0.95,
90
+ seedOffset
91
+ );
92
+ var q: vec2f = rotate2d(baseAngle + angleNoise) * warped;
93
+ var phase: f32 =
94
+ (fbm(q / (spacing * 3.4) + phaseVec(-0.14, 0.19) + vec2f(seedOffset, 8.6))
95
+ - 0.5) * spacing * 1.3;
96
+ var band: f32 = bandField(q.y + phase, spacing, width);
97
+ var breakup: f32 = smoothstep(
98
+ 0.24,
99
+ 0.88,
100
+ fbm(
101
+ vec2f(q.x / (spacing * 2.6), q.y / (spacing * 7.5)) +
102
+ phaseVec(0.12, 0.07) +
103
+ vec2f(seedOffset)
104
+ )
105
+ );
106
+ var softness: f32 =
107
+ 0.65 +
108
+ fbm(q / (spacing * 8.2) + phaseVec(-0.05, 0.16) + vec2f(seedOffset, 2.3)) *
109
+ 0.35;
110
+
111
+ return band * breakup * softness;
112
+ }
113
+
114
+ fn edgeMask(uv: vec2f) -> f32 {
115
+ var pxFromEdge: vec2f = min(uv, vec2f(1.0) - uv) * params.size;
116
+ var minSide: f32 = min(params.size.x, params.size.y);
117
+ var side: f32 = 1.0 - smoothstep(0.0, minSide * 0.16, min(pxFromEdge.x, pxFromEdge.y));
118
+ var corner: f32 = 1.0 - smoothstep(
119
+ 0.0,
120
+ minSide * 0.23,
121
+ length(pxFromEdge)
122
+ );
123
+
124
+ return clamp(side * 0.55 + corner * 0.85, 0.0, 1.0);
125
+ }
126
+
127
+ fn heightMap(uv: vec2f) -> f32 {
128
+ var px: vec2f = uv * params.size;
129
+ var minSide: f32 = min(params.size.x, params.size.y);
130
+ var density: f32 = clamp(params.wrinkleDensity, 0.0, 1.0);
131
+ var spacing: f32 = mix(minSide * 0.31, minSide * 0.13, density);
132
+ var width: f32 = mix(minSide * 0.03, minSide * 0.013, density);
133
+
134
+ var broadWarp: vec2f = warpVec(px, minSide * 0.42, minSide * 0.06, params.seed + 1.0);
135
+ var detailWarp: vec2f = warpVec(px, minSide * 0.17, minSide * 0.018, params.seed + 6.0);
136
+ var warpedPx: vec2f = px + broadWarp + detailWarp;
137
+
138
+ var h: f32 =
139
+ (fbm(warpedPx / (minSide * 0.26) + phaseVec(0.11, -0.09) + vec2f(params.seed * 0.17))
140
+ - 0.5) * 0.08;
141
+ var broadFold: f32 = curvedFoldField(warpedPx, -0.74, spacing * 1.0, width, 3.1);
142
+ var crossFold: f32 = curvedFoldField(
143
+ warpedPx + broadWarp * 0.7,
144
+ 0.31,
145
+ spacing * 1.9,
146
+ width * 1.55,
147
+ 9.7
148
+ );
149
+ var microFold: f32 = curvedFoldField(
150
+ warpedPx - detailWarp * 0.6,
151
+ 1.04,
152
+ spacing * 0.66,
153
+ width * 0.62,
154
+ 15.3
155
+ );
156
+ h += broadFold * 0.22;
157
+ h += crossFold * 0.11;
158
+ h += microFold * 0.045;
159
+ h +=
160
+ (1.0 -
161
+ abs(
162
+ fbm(
163
+ warpedPx / (minSide * 0.11) +
164
+ phaseVec(-0.23, 0.27) +
165
+ vec2f(params.seed * 0.3)
166
+ ) *
167
+ 2.0 -
168
+ 1.0
169
+ )) * 0.018;
170
+
171
+ var edge: f32 = edgeMask(uv) * clamp(params.edgeTension, 0.0, 1.0);
172
+ var edgeNoise: f32 =
173
+ fbm(warpedPx / (minSide * 0.18) + phaseVec(0.18, 0.21) + vec2f(params.seed * 0.41, 8.0));
174
+ h += edge * (0.16 + edgeNoise * 0.11);
175
+
176
+ return h;
177
+ }
178
+
179
+ @fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
180
+ let vUv=vec2f(input.uv.x,1.0-input.uv.y);
181
+ if (params.amount <= 0.0) {
182
+ return textureSampleLevel(source, sourceSampler, vec2f(vUv.x,1.0-vUv.y), 0);
183
+ }
184
+
185
+ var texel: vec2f = vec2f(1.0) / params.size;
186
+ var left: f32 = heightMap(vUv - vec2f(texel.x, 0.0));
187
+ var right: f32 = heightMap(vUv + vec2f(texel.x, 0.0));
188
+ var down: f32 = heightMap(vUv - vec2f(0.0, texel.y));
189
+ var up: f32 = heightMap(vUv + vec2f(0.0, texel.y));
190
+ var gradient: vec2f = vec2f(right - left, up - down);
191
+ var reliefScale: f32 = mix(42.0, 115.0, params.wrinkleDensity);
192
+ var warpStrength: f32 = reliefScale * 0.32;
193
+
194
+ var sampleOffset: vec2f = gradient * warpStrength * params.displacement * params.amount;
195
+ var sampleUv: vec2f = clamp(vUv - sampleOffset * texel, vec2f(0.0), vec2f(1.0));
196
+ var color: vec4f = textureSampleLevel(source, sourceSampler, vec2f(sampleUv.x,1.0-sampleUv.y), 0);
197
+
198
+ var alpha: f32 = color.a;
199
+ if (alpha <= 0.001) {
200
+ return vec4f(0.0);
201
+ }
202
+
203
+ var rgb: vec3f = color.rgb / alpha;
204
+ var normal: vec3f = normalize(vec3f(-gradient * reliefScale, 1.0));
205
+ var light: vec3f = normalize(vec3f(-0.42, 0.58, 0.72));
206
+ var halfVector: vec3f = normalize(light + vec3f(0.0, 0.0, 1.0));
207
+ var specular: f32 = pow(max(dot(normal, halfVector), 0.0), 24.0);
208
+ var directional: f32 = dot(gradient, normalize(vec2f(-0.45, 0.72)));
209
+ var creaseHighlight: f32 = smoothstep(0.02, 0.07, directional);
210
+ var creaseShadow: f32 = smoothstep(0.02, 0.07, -directional);
211
+ var edge: f32 = edgeMask(vUv) * params.edgeTension;
212
+ var edgeGlint: f32 = edge * smoothstep(
213
+ 0.35,
214
+ 0.95,
215
+ fbm(vUv * params.size / 90.0 + phaseVec(0.31, -0.24) + vec2f(params.seed))
216
+ );
217
+
218
+ var highlight: f32 = clamp(
219
+ (specular * 0.55 + creaseHighlight * 0.4 + edgeGlint * 0.18)
220
+ * params.highlightIntensity
221
+ * params.amount,
222
+ 0.0,
223
+ 1.15
224
+ );
225
+ var shadow: f32 = clamp((creaseShadow * 0.1 + edge * 0.06) * params.amount, 0.0, 0.25);
226
+
227
+ rgb *= 1.0 - shadow;
228
+ rgb += (vec3f(1.0) - rgb) * min(highlight, 1.0);
229
+ rgb += vec3f(max(highlight - 1.0, 0.0)) * 0.35;
230
+
231
+ return vec4f(clamp(rgb, vec3f(0.0), vec3f(1.0)) * alpha, alpha);
232
+ }
233
+
234
+ `;
235
+
236
+ // src/shrinkwrap.ts
237
+ var { createEffect, createWebGL2ContextError } = Internals;
238
+ var DEFAULT_AMOUNT = 1;
239
+ var DEFAULT_DISPLACEMENT = 5;
240
+ var DEFAULT_HIGHLIGHT_INTENSITY = 0.75;
241
+ var DEFAULT_WRINKLE_DENSITY = 0.42;
242
+ var DEFAULT_EDGE_TENSION = 0.45;
243
+ var DEFAULT_PHASE = 0;
244
+ var DEFAULT_SEED = 0;
245
+ var shrinkwrapSchema = {
246
+ amount: {
247
+ type: "number",
248
+ min: 0,
249
+ max: 1,
250
+ step: 0.01,
251
+ default: DEFAULT_AMOUNT,
252
+ description: "Amount",
253
+ hiddenFromList: false
254
+ },
255
+ displacement: {
256
+ type: "number",
257
+ min: 0,
258
+ max: 30,
259
+ step: 0.1,
260
+ default: DEFAULT_DISPLACEMENT,
261
+ description: "Displacement",
262
+ hiddenFromList: false
263
+ },
264
+ highlightIntensity: {
265
+ type: "number",
266
+ min: 0,
267
+ max: 2,
268
+ step: 0.01,
269
+ default: DEFAULT_HIGHLIGHT_INTENSITY,
270
+ description: "Highlight intensity",
271
+ hiddenFromList: false
272
+ },
273
+ wrinkleDensity: {
274
+ type: "number",
275
+ min: 0,
276
+ max: 1,
277
+ step: 0.01,
278
+ default: DEFAULT_WRINKLE_DENSITY,
279
+ description: "Wrinkle density",
280
+ hiddenFromList: false
281
+ },
282
+ edgeTension: {
283
+ type: "number",
284
+ min: 0,
285
+ max: 1,
286
+ step: 0.01,
287
+ default: DEFAULT_EDGE_TENSION,
288
+ description: "Edge tension",
289
+ hiddenFromList: false
290
+ },
291
+ phase: {
292
+ type: "number",
293
+ step: 0.01,
294
+ default: DEFAULT_PHASE,
295
+ description: "Phase",
296
+ hiddenFromList: false
297
+ },
298
+ seed: {
299
+ type: "number",
300
+ step: 1,
301
+ default: DEFAULT_SEED,
302
+ description: "Seed",
303
+ hiddenFromList: false
304
+ }
305
+ };
306
+ var resolve = (p) => ({
307
+ amount: p.amount ?? DEFAULT_AMOUNT,
308
+ displacement: p.displacement ?? DEFAULT_DISPLACEMENT,
309
+ highlightIntensity: p.highlightIntensity ?? DEFAULT_HIGHLIGHT_INTENSITY,
310
+ wrinkleDensity: p.wrinkleDensity ?? DEFAULT_WRINKLE_DENSITY,
311
+ edgeTension: p.edgeTension ?? DEFAULT_EDGE_TENSION,
312
+ phase: p.phase ?? DEFAULT_PHASE,
313
+ seed: p.seed ?? DEFAULT_SEED
314
+ });
315
+ var validateShrinkwrapParams = (params) => {
316
+ assertEffectParamsObject(params, "Shrinkwrap");
317
+ assertOptionalFiniteNumber(params.amount, "amount");
318
+ assertOptionalFiniteNumber(params.displacement, "displacement");
319
+ assertOptionalFiniteNumber(params.highlightIntensity, "highlightIntensity");
320
+ assertOptionalFiniteNumber(params.wrinkleDensity, "wrinkleDensity");
321
+ assertOptionalFiniteNumber(params.edgeTension, "edgeTension");
322
+ assertOptionalFiniteNumber(params.phase, "phase");
323
+ assertOptionalFiniteNumber(params.seed, "seed");
324
+ const r = resolve(params);
325
+ validateUnitInterval(r.amount, "amount");
326
+ validateNonNegative(r.displacement, "displacement");
327
+ validateNonNegative(r.highlightIntensity, "highlightIntensity");
328
+ validateUnitInterval(r.wrinkleDensity, "wrinkleDensity");
329
+ validateUnitInterval(r.edgeTension, "edgeTension");
330
+ };
331
+ var SHRINKWRAP_VS = `#version 300 es
332
+ in vec2 aPos;
333
+ in vec2 aUv;
334
+ out vec2 vUv;
335
+
336
+ void main() {
337
+ vUv = aUv;
338
+ gl_Position = vec4(aPos, 0.0, 1.0);
339
+ }
340
+ `;
341
+ var SHRINKWRAP_FS = `#version 300 es
342
+ precision highp float;
343
+
344
+ in vec2 vUv;
345
+ out vec4 fragColor;
346
+
347
+ uniform sampler2D uSource;
348
+ uniform vec2 uResolution;
349
+ uniform float uAmount;
350
+ uniform float uDisplacement;
351
+ uniform float uHighlightIntensity;
352
+ uniform float uWrinkleDensity;
353
+ uniform float uEdgeTension;
354
+ uniform float uPhase;
355
+ uniform float uSeed;
356
+
357
+ float hash21(vec2 p) {
358
+ vec3 p3 = fract(vec3(p.xyx) * vec3(443.8975, 397.2973, 491.1871));
359
+ p3 += dot(p3, p3.yzx + 19.19 + uSeed * 0.131);
360
+ return fract((p3.x + p3.y) * p3.z);
361
+ }
362
+
363
+ float valueNoise(vec2 p) {
364
+ vec2 i = floor(p);
365
+ vec2 f = fract(p);
366
+ f = f * f * (3.0 - 2.0 * f);
367
+
368
+ float a = hash21(i);
369
+ float b = hash21(i + vec2(1.0, 0.0));
370
+ float c = hash21(i + vec2(0.0, 1.0));
371
+ float d = hash21(i + vec2(1.0, 1.0));
372
+
373
+ return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
374
+ }
375
+
376
+ float fbm(vec2 p) {
377
+ float value = 0.0;
378
+ float amplitude = 0.5;
379
+
380
+ for (int i = 0; i < 4; i++) {
381
+ value += valueNoise(p) * amplitude;
382
+ p = p * 2.03 + vec2(17.1, 31.7);
383
+ amplitude *= 0.5;
384
+ }
385
+
386
+ return value;
387
+ }
388
+
389
+ mat2 rotate2d(float angle) {
390
+ float c = cos(angle);
391
+ float s = sin(angle);
392
+ return mat2(c, -s, s, c);
393
+ }
394
+
395
+ vec2 phaseVec(float xFactor, float yFactor) {
396
+ return vec2(uPhase * xFactor, uPhase * yFactor);
397
+ }
398
+
399
+ vec2 warpVec(vec2 p, float scale, float amount, float seedOffset) {
400
+ return vec2(
401
+ fbm(p / scale + phaseVec(0.21, 0.13) + vec2(seedOffset, 1.7)) - 0.5,
402
+ fbm(p / scale + phaseVec(-0.17, 0.29) + vec2(seedOffset + 9.1, 6.4))
403
+ - 0.5
404
+ ) * amount;
405
+ }
406
+
407
+ float bandField(float coord, float spacing, float width) {
408
+ float centered = abs(fract(coord / spacing) - 0.5) * spacing;
409
+ return 1.0 - smoothstep(width, width * 3.8, centered);
410
+ }
411
+
412
+ float curvedFoldField(
413
+ vec2 px,
414
+ float baseAngle,
415
+ float spacing,
416
+ float width,
417
+ float seedOffset
418
+ ) {
419
+ float angleNoise =
420
+ (fbm(px / (spacing * 5.8) + phaseVec(0.08, -0.11) + vec2(seedOffset, 3.1))
421
+ - 0.5) * 1.35;
422
+ vec2 warped = px + warpVec(
423
+ px + vec2(seedOffset * 13.0, seedOffset * 7.0),
424
+ spacing * 5.4,
425
+ spacing * 0.95,
426
+ seedOffset
427
+ );
428
+ vec2 q = rotate2d(baseAngle + angleNoise) * warped;
429
+ float phase =
430
+ (fbm(q / (spacing * 3.4) + phaseVec(-0.14, 0.19) + vec2(seedOffset, 8.6))
431
+ - 0.5) * spacing * 1.3;
432
+ float band = bandField(q.y + phase, spacing, width);
433
+ float breakup = smoothstep(
434
+ 0.24,
435
+ 0.88,
436
+ fbm(
437
+ vec2(q.x / (spacing * 2.6), q.y / (spacing * 7.5)) +
438
+ phaseVec(0.12, 0.07) +
439
+ vec2(seedOffset)
440
+ )
441
+ );
442
+ float softness =
443
+ 0.65 +
444
+ fbm(q / (spacing * 8.2) + phaseVec(-0.05, 0.16) + vec2(seedOffset, 2.3)) *
445
+ 0.35;
446
+
447
+ return band * breakup * softness;
448
+ }
449
+
450
+ float edgeMask(vec2 uv) {
451
+ vec2 pxFromEdge = min(uv, 1.0 - uv) * uResolution;
452
+ float minSide = min(uResolution.x, uResolution.y);
453
+ float side = 1.0 - smoothstep(0.0, minSide * 0.16, min(pxFromEdge.x, pxFromEdge.y));
454
+ float corner = 1.0 - smoothstep(
455
+ 0.0,
456
+ minSide * 0.23,
457
+ length(pxFromEdge)
458
+ );
459
+
460
+ return clamp(side * 0.55 + corner * 0.85, 0.0, 1.0);
461
+ }
462
+
463
+ float heightMap(vec2 uv) {
464
+ vec2 px = uv * uResolution;
465
+ float minSide = min(uResolution.x, uResolution.y);
466
+ float density = clamp(uWrinkleDensity, 0.0, 1.0);
467
+ float spacing = mix(minSide * 0.31, minSide * 0.13, density);
468
+ float width = mix(minSide * 0.03, minSide * 0.013, density);
469
+
470
+ vec2 broadWarp = warpVec(px, minSide * 0.42, minSide * 0.06, uSeed + 1.0);
471
+ vec2 detailWarp = warpVec(px, minSide * 0.17, minSide * 0.018, uSeed + 6.0);
472
+ vec2 warpedPx = px + broadWarp + detailWarp;
473
+
474
+ float h =
475
+ (fbm(warpedPx / (minSide * 0.26) + phaseVec(0.11, -0.09) + vec2(uSeed * 0.17))
476
+ - 0.5) * 0.08;
477
+ float broadFold = curvedFoldField(warpedPx, -0.74, spacing * 1.0, width, 3.1);
478
+ float crossFold = curvedFoldField(
479
+ warpedPx + broadWarp * 0.7,
480
+ 0.31,
481
+ spacing * 1.9,
482
+ width * 1.55,
483
+ 9.7
484
+ );
485
+ float microFold = curvedFoldField(
486
+ warpedPx - detailWarp * 0.6,
487
+ 1.04,
488
+ spacing * 0.66,
489
+ width * 0.62,
490
+ 15.3
491
+ );
492
+ h += broadFold * 0.22;
493
+ h += crossFold * 0.11;
494
+ h += microFold * 0.045;
495
+ h +=
496
+ (1.0 -
497
+ abs(
498
+ fbm(
499
+ warpedPx / (minSide * 0.11) +
500
+ phaseVec(-0.23, 0.27) +
501
+ vec2(uSeed * 0.3)
502
+ ) *
503
+ 2.0 -
504
+ 1.0
505
+ )) * 0.018;
506
+
507
+ float edge = edgeMask(uv) * clamp(uEdgeTension, 0.0, 1.0);
508
+ float edgeNoise =
509
+ fbm(warpedPx / (minSide * 0.18) + phaseVec(0.18, 0.21) + vec2(uSeed * 0.41, 8.0));
510
+ h += edge * (0.16 + edgeNoise * 0.11);
511
+
512
+ return h;
513
+ }
514
+
515
+ void main() {
516
+ if (uAmount <= 0.0) {
517
+ fragColor = texture(uSource, vUv);
518
+ return;
519
+ }
520
+
521
+ vec2 texel = 1.0 / uResolution;
522
+ float left = heightMap(vUv - vec2(texel.x, 0.0));
523
+ float right = heightMap(vUv + vec2(texel.x, 0.0));
524
+ float down = heightMap(vUv - vec2(0.0, texel.y));
525
+ float up = heightMap(vUv + vec2(0.0, texel.y));
526
+ vec2 gradient = vec2(right - left, up - down);
527
+ float reliefScale = mix(42.0, 115.0, uWrinkleDensity);
528
+ float warpStrength = reliefScale * 0.32;
529
+
530
+ vec2 sampleOffset = gradient * warpStrength * uDisplacement * uAmount;
531
+ vec2 sampleUv = clamp(vUv - sampleOffset * texel, vec2(0.0), vec2(1.0));
532
+ vec4 source = texture(uSource, sampleUv);
533
+
534
+ float alpha = source.a;
535
+ if (alpha <= 0.001) {
536
+ fragColor = vec4(0.0);
537
+ return;
538
+ }
539
+
540
+ vec3 rgb = source.rgb / alpha;
541
+ vec3 normal = normalize(vec3(-gradient * reliefScale, 1.0));
542
+ vec3 light = normalize(vec3(-0.42, 0.58, 0.72));
543
+ vec3 halfVector = normalize(light + vec3(0.0, 0.0, 1.0));
544
+ float specular = pow(max(dot(normal, halfVector), 0.0), 24.0);
545
+ float directional = dot(gradient, normalize(vec2(-0.45, 0.72)));
546
+ float creaseHighlight = smoothstep(0.02, 0.07, directional);
547
+ float creaseShadow = smoothstep(0.02, 0.07, -directional);
548
+ float edge = edgeMask(vUv) * uEdgeTension;
549
+ float edgeGlint = edge * smoothstep(
550
+ 0.35,
551
+ 0.95,
552
+ fbm(vUv * uResolution / 90.0 + phaseVec(0.31, -0.24) + vec2(uSeed))
553
+ );
554
+
555
+ float highlight = clamp(
556
+ (specular * 0.55 + creaseHighlight * 0.4 + edgeGlint * 0.18)
557
+ * uHighlightIntensity
558
+ * uAmount,
559
+ 0.0,
560
+ 1.15
561
+ );
562
+ float shadow = clamp((creaseShadow * 0.1 + edge * 0.06) * uAmount, 0.0, 0.25);
563
+
564
+ rgb *= 1.0 - shadow;
565
+ rgb += (1.0 - rgb) * min(highlight, 1.0);
566
+ rgb += vec3(max(highlight - 1.0, 0.0)) * 0.35;
567
+
568
+ fragColor = vec4(clamp(rgb, 0.0, 1.0) * alpha, alpha);
569
+ }
570
+ `;
571
+ var compileShader = (gl, type, source) => {
572
+ const shader = gl.createShader(type);
573
+ if (!shader) {
574
+ throw new Error("Failed to create WebGL shader");
575
+ }
576
+ gl.shaderSource(shader, source);
577
+ gl.compileShader(shader);
578
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
579
+ const log = gl.getShaderInfoLog(shader);
580
+ gl.deleteShader(shader);
581
+ throw new Error(`Shrinkwrap shader compile failed: ${log ?? "(no log)"}`);
582
+ }
583
+ return shader;
584
+ };
585
+ var linkProgram = (gl, vs, fs) => {
586
+ const program = gl.createProgram();
587
+ if (!program) {
588
+ throw new Error("Failed to create WebGL program");
589
+ }
590
+ gl.attachShader(program, vs);
591
+ gl.attachShader(program, fs);
592
+ gl.linkProgram(program);
593
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
594
+ const log = gl.getProgramInfoLog(program);
595
+ gl.deleteProgram(program);
596
+ throw new Error(`Shrinkwrap program link failed: ${log ?? "(no log)"}`);
597
+ }
598
+ return program;
599
+ };
600
+ var shrinkwrap = createEffect({
601
+ type: "dev.remotion.effects.shrinkwrap",
602
+ label: "shrinkwrap()",
603
+ documentationLink: "https://www.remotion.dev/docs/effects/shrinkwrap",
604
+ calculateKey: (params) => {
605
+ const r = resolve(params);
606
+ return `shrinkwrap-${r.amount}-${r.displacement}-${r.highlightIntensity}-${r.wrinkleDensity}-${r.edgeTension}-${r.phase}-${r.seed}`;
607
+ },
608
+ implementations: {
609
+ webgpu: Internals.createEffectImplementation({
610
+ setup: (target) => setupWebGpuSinglePass(target, "shrinkwrap"),
611
+ apply: ({ source, width, height, params, state, gpuDevice }) => {
612
+ if (!gpuDevice)
613
+ throw new Error("A WebGPU device is required for the shrinkwrap effect");
614
+ const r = resolve(params);
615
+ const uniformData = new Float32Array([
616
+ width,
617
+ height,
618
+ r.amount,
619
+ r.displacement,
620
+ r.highlightIntensity,
621
+ r.wrinkleDensity,
622
+ r.edgeTension,
623
+ r.phase,
624
+ r.seed,
625
+ 0,
626
+ 0,
627
+ 0
628
+ ]);
629
+ applyWebGpuSinglePass({
630
+ state,
631
+ source,
632
+ width,
633
+ height,
634
+ device: gpuDevice,
635
+ shader: SHRINKWRAP_WEBGPU_SHADER,
636
+ uniformData
637
+ });
638
+ },
639
+ cleanup: cleanupWebGpuSinglePass
640
+ }),
641
+ webgl2: Internals.createEffectImplementation({
642
+ setup: (target) => {
643
+ const gl = target.getContext("webgl2", {
644
+ premultipliedAlpha: true,
645
+ alpha: true,
646
+ preserveDrawingBuffer: true
647
+ });
648
+ if (!gl) {
649
+ throw createWebGL2ContextError("shrinkwrap effect");
650
+ }
651
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
652
+ const vs = compileShader(gl, gl.VERTEX_SHADER, SHRINKWRAP_VS);
653
+ const fs = compileShader(gl, gl.FRAGMENT_SHADER, SHRINKWRAP_FS);
654
+ const program = linkProgram(gl, vs, fs);
655
+ gl.deleteShader(vs);
656
+ gl.deleteShader(fs);
657
+ const vao = gl.createVertexArray();
658
+ if (!vao) {
659
+ throw new Error("Failed to create WebGL vertex array");
660
+ }
661
+ gl.bindVertexArray(vao);
662
+ const data = new Float32Array([
663
+ -1,
664
+ -1,
665
+ 0,
666
+ 0,
667
+ 1,
668
+ -1,
669
+ 1,
670
+ 0,
671
+ -1,
672
+ 1,
673
+ 0,
674
+ 1,
675
+ 1,
676
+ 1,
677
+ 1,
678
+ 1
679
+ ]);
680
+ const vbo = gl.createBuffer();
681
+ if (!vbo) {
682
+ throw new Error("Failed to create WebGL buffer");
683
+ }
684
+ gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
685
+ gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
686
+ const aPos = gl.getAttribLocation(program, "aPos");
687
+ const aUv = gl.getAttribLocation(program, "aUv");
688
+ gl.enableVertexAttribArray(aPos);
689
+ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 16, 0);
690
+ gl.enableVertexAttribArray(aUv);
691
+ gl.vertexAttribPointer(aUv, 2, gl.FLOAT, false, 16, 8);
692
+ gl.bindVertexArray(null);
693
+ const texture = gl.createTexture();
694
+ if (!texture) {
695
+ throw new Error("Failed to create WebGL texture");
696
+ }
697
+ gl.bindTexture(gl.TEXTURE_2D, texture);
698
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
699
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
700
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
701
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
702
+ gl.bindTexture(gl.TEXTURE_2D, null);
703
+ return {
704
+ gl,
705
+ program,
706
+ vao,
707
+ vbo,
708
+ texture,
709
+ uSource: gl.getUniformLocation(program, "uSource"),
710
+ uResolution: gl.getUniformLocation(program, "uResolution"),
711
+ uAmount: gl.getUniformLocation(program, "uAmount"),
712
+ uDisplacement: gl.getUniformLocation(program, "uDisplacement"),
713
+ uHighlightIntensity: gl.getUniformLocation(program, "uHighlightIntensity"),
714
+ uWrinkleDensity: gl.getUniformLocation(program, "uWrinkleDensity"),
715
+ uEdgeTension: gl.getUniformLocation(program, "uEdgeTension"),
716
+ uPhase: gl.getUniformLocation(program, "uPhase"),
717
+ uSeed: gl.getUniformLocation(program, "uSeed")
718
+ };
719
+ },
720
+ apply: ({ source, width, height, params, state, flipSourceY }) => {
721
+ const r = resolve(params);
722
+ const { gl, program, vao, texture } = state;
723
+ gl.viewport(0, 0, width, height);
724
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
725
+ gl.clearColor(0, 0, 0, 0);
726
+ gl.clear(gl.COLOR_BUFFER_BIT);
727
+ gl.useProgram(program);
728
+ gl.bindVertexArray(vao);
729
+ gl.activeTexture(gl.TEXTURE0);
730
+ gl.bindTexture(gl.TEXTURE_2D, texture);
731
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
732
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
733
+ if (state.uSource)
734
+ gl.uniform1i(state.uSource, 0);
735
+ if (state.uResolution)
736
+ gl.uniform2f(state.uResolution, width, height);
737
+ if (state.uAmount)
738
+ gl.uniform1f(state.uAmount, r.amount);
739
+ if (state.uDisplacement)
740
+ gl.uniform1f(state.uDisplacement, r.displacement);
741
+ if (state.uHighlightIntensity)
742
+ gl.uniform1f(state.uHighlightIntensity, r.highlightIntensity);
743
+ if (state.uWrinkleDensity)
744
+ gl.uniform1f(state.uWrinkleDensity, r.wrinkleDensity);
745
+ if (state.uEdgeTension)
746
+ gl.uniform1f(state.uEdgeTension, r.edgeTension);
747
+ if (state.uPhase)
748
+ gl.uniform1f(state.uPhase, r.phase);
749
+ if (state.uSeed)
750
+ gl.uniform1f(state.uSeed, r.seed);
751
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
752
+ gl.bindVertexArray(null);
753
+ gl.bindTexture(gl.TEXTURE_2D, null);
754
+ gl.useProgram(null);
755
+ },
756
+ cleanup: ({ gl, program, vao, vbo, texture }) => {
757
+ gl.deleteBuffer(vbo);
758
+ gl.deleteProgram(program);
759
+ gl.deleteVertexArray(vao);
760
+ gl.deleteTexture(texture);
761
+ }
762
+ })
763
+ },
764
+ schema: shrinkwrapSchema,
765
+ validateParams: validateShrinkwrapParams
766
+ });
767
+ export {
768
+ shrinkwrap
769
+ };