@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.
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,613 @@
1
+ import {
2
+ VALUE_NOISE_SHADER,
3
+ VALUE_NOISE_WEBGPU_SHADER
4
+ } from "./index-4z6pt3ka.mjs";
5
+ import {
6
+ assertOptionalFiniteNumber
7
+ } from "./index-wxhvgv2s.mjs";
8
+ import {
9
+ WEBGPU_SINGLE_PASS_VERTEX,
10
+ setupWebGpuSinglePass,
11
+ cleanupWebGpuSinglePass,
12
+ applyWebGpuSinglePass
13
+ } from "./index-tvfexb7s.mjs";
14
+ import {
15
+ assertEffectParamsObject,
16
+ assertRequiredFiniteNumber,
17
+ assertOptionalBoolean
18
+ } from "./index-4fvp93ps.mjs";
19
+
20
+ // src/turbulent-displace/index.ts
21
+ import { Internals } from "remotion";
22
+
23
+ // src/turbulent-displace/shader.ts
24
+ var TURBULENT_DISPLACE_FRAGMENT_SHADER = `#version 300 es
25
+ precision highp float;
26
+ precision highp int;
27
+
28
+ in vec2 vUv;
29
+ out vec4 fragColor;
30
+ uniform sampler2D uSource;
31
+ uniform vec2 uResolution;
32
+ uniform float uAmount;
33
+ uniform float uSize;
34
+ uniform vec2 uOffset;
35
+ uniform float uComplexity;
36
+ uniform float uEvolution;
37
+ uniform bool uCycleEvolution;
38
+ uniform float uCycle;
39
+ uniform uint uSeed;
40
+ uniform int uDisplacement;
41
+ uniform int uPinning;
42
+ const int uNoiseType = 2;
43
+
44
+ ${VALUE_NOISE_SHADER}
45
+
46
+ float noiseLayer(vec2 p, float z, uint seed) {
47
+ if (!uCycleEvolution) return valueNoise(vec3(p, uEvolution + z), seed);
48
+ float t = mod(uEvolution, uCycle);
49
+ // Zero blend derivatives at the seam keep the looping motion smooth.
50
+ float weight = smoothstep(0.0, 1.0, t / uCycle);
51
+ return mix(valueNoise(vec3(p, t + z), seed), valueNoise(vec3(p, t - uCycle + z), seed), weight);
52
+ }
53
+
54
+ float turbulence(vec2 p, uint channel) {
55
+ float sum = 0.0;
56
+ float norm = 0.0;
57
+ float amplitude = 1.0;
58
+ float frequency = 1.0;
59
+ float falloff = uDisplacement >= 3 && uDisplacement <= 5 ? 0.3 : 0.5;
60
+ for (int octave = 0; octave < 10; octave++) {
61
+ float weight = clamp(uComplexity - float(octave), 0.0, 1.0);
62
+ if (weight == 0.0) break;
63
+ uint seed = (uSeed ^ 0x7d15u) + channel + uint(octave) * 101u;
64
+ sum += noiseLayer(p * frequency, float(octave) * 5.17, seed) * amplitude * weight;
65
+ norm += amplitude * weight;
66
+ amplitude *= falloff;
67
+ frequency *= 2.0;
68
+ }
69
+ return sum / norm - 0.5;
70
+ }
71
+
72
+ vec4 readPixel(ivec2 p) {
73
+ if (any(lessThan(p, ivec2(0))) || any(greaterThanEqual(p, ivec2(uResolution)))) return vec4(0.0);
74
+ return texelFetch(uSource, ivec2(p.x, int(uResolution.y) - 1 - p.y), 0);
75
+ }
76
+
77
+ vec4 sampleSource(vec2 p) {
78
+ // Bilinear interpolation with transparent samples outside the source, so
79
+ // warped alpha edges do not smear the outermost pixel across the canvas.
80
+ ivec2 base = ivec2(floor(p - 0.5));
81
+ vec2 t = fract(p - 0.5);
82
+ return mix(mix(readPixel(base), readPixel(base + ivec2(1,0)), t.x),
83
+ mix(readPixel(base + ivec2(0,1)), readPixel(base + ivec2(1,1)), t.x), t.y);
84
+ }
85
+
86
+ void main() {
87
+ if (uAmount == 0.0) {
88
+ fragColor = texture(uSource, vUv);
89
+ return;
90
+ }
91
+ vec2 pixel = vec2(vUv.x, 1.0 - vUv.y) * uResolution;
92
+ vec2 p = (pixel - uOffset * uResolution) / uSize;
93
+ vec2 displacement;
94
+ if (uDisplacement == 1 || uDisplacement == 2 || uDisplacement == 4 || uDisplacement == 5) {
95
+ float epsilon = 0.05;
96
+ vec2 gradient = vec2(
97
+ turbulence(p + vec2(epsilon,0), 0u) - turbulence(p - vec2(epsilon,0), 0u),
98
+ turbulence(p + vec2(0,epsilon), 0u) - turbulence(p - vec2(0,epsilon), 0u)
99
+ ) / (2.0 * epsilon);
100
+ displacement = (uDisplacement == 1 || uDisplacement == 4) ? gradient : vec2(-gradient.y, gradient.x);
101
+ displacement *= uAmount * 0.25;
102
+ } else if (uDisplacement == 6) {
103
+ displacement = vec2(0.0, turbulence(p, 17u) * uAmount);
104
+ } else if (uDisplacement == 7) {
105
+ displacement = vec2(turbulence(p, 0u) * uAmount, 0.0);
106
+ } else if (uDisplacement == 8) {
107
+ displacement = vec2(turbulence(p, 0u) * uAmount);
108
+ } else {
109
+ displacement = vec2(turbulence(p, 0u), turbulence(p, 17u)) * uAmount;
110
+ }
111
+ bool locked = uPinning >= 8;
112
+ int pin = locked ? uPinning - 7 : uPinning;
113
+ float edge = max(1.0, min(uResolution.x, uResolution.y) * (locked ? 0.25 : 0.1));
114
+ vec2 nearEdge = clamp((pixel - 0.5) / edge, 0.0, 1.0);
115
+ vec2 farEdge = clamp((uResolution - 0.5 - pixel) / edge, 0.0, 1.0);
116
+ float horizontal = min(nearEdge.x, farEdge.x);
117
+ float vertical = min(nearEdge.y, farEdge.y);
118
+ float weight = 1.0;
119
+ if (pin == 1) weight = min(horizontal, vertical);
120
+ if (pin == 2) weight = vertical;
121
+ if (pin == 3) weight = horizontal;
122
+ if (pin == 4) weight = nearEdge.x;
123
+ if (pin == 5) weight = nearEdge.y;
124
+ if (pin == 6) weight = farEdge.x;
125
+ if (pin == 7) weight = farEdge.y;
126
+ vec2 sourcePixel = pixel + displacement * weight;
127
+ if (locked) sourcePixel = clamp(sourcePixel, vec2(0.5), uResolution - 0.5);
128
+ fragColor = sampleSource(sourcePixel);
129
+ }
130
+ `;
131
+
132
+ // src/turbulent-displace/webgpu-shader.ts
133
+ var TURBULENT_DISPLACE_WEBGPU_SHADER = `
134
+ ${WEBGPU_SINGLE_PASS_VERTEX}
135
+ @group(0) @binding(0) var source: texture_2d<f32>;
136
+ @group(0) @binding(1) var sourceSampler: sampler;
137
+ @group(0) @binding(2) var<uniform> params: Params;
138
+
139
+ struct Params { size: vec2f, offset: vec2f, amount: f32, scale: f32, complexity: f32, evolution: f32, cycle: f32, seed: u32, displacement: f32, pinning: f32, cycleEvolution: f32, }
140
+ fn noiseType() -> i32 { return 2; }
141
+ ${VALUE_NOISE_WEBGPU_SHADER}
142
+ fn noiseLayer(p: vec2f,z: f32,seed: u32) -> f32 {
143
+ if(params.cycleEvolution==0.0) { return valueNoise(vec3f(p,params.evolution+z),seed); }
144
+ let t=params.evolution-floor(params.evolution/params.cycle)*params.cycle;
145
+ let weight=smoothstep(0.0,1.0,t/params.cycle);
146
+ return mix(valueNoise(vec3f(p,t+z),seed),valueNoise(vec3f(p,t-params.cycle+z),seed),weight);
147
+ }
148
+ fn turbulence(p: vec2f,channel: u32) -> f32 {
149
+ var sum=0.0; var norm=0.0; var amplitude=1.0; var frequency=1.0;
150
+ let falloff=select(0.5,0.3,params.displacement>=3.0 && params.displacement<=5.0);
151
+ for(var octave=0;octave<10;octave++) {
152
+ let weight=clamp(params.complexity-f32(octave),0.0,1.0);
153
+ if(weight==0.0) { break; }
154
+ let seed=(params.seed ^ 0x7d15u)+channel+u32(octave)*101u;
155
+ sum += noiseLayer(p*frequency,f32(octave)*5.17,seed)*amplitude*weight;
156
+ norm += amplitude*weight; amplitude *= falloff; frequency *= 2.0;
157
+ }
158
+ return sum/norm-0.5;
159
+ }
160
+ fn readPixel(p: vec2i) -> vec4f {
161
+ if(any(p<vec2i(0)) || any(p>=vec2i(params.size))) { return vec4f(0); }
162
+ let sourceSize=vec2i(textureDimensions(source));
163
+ let sourcePixel=p+vec2i(0,sourceSize.y-i32(params.size.y));
164
+ if(any(sourcePixel<vec2i(0)) || any(sourcePixel>=sourceSize)) { return vec4f(0); }
165
+ return textureLoad(source,sourcePixel,0);
166
+ }
167
+ fn sampleSource(p: vec2f) -> vec4f {
168
+ let base=vec2i(floor(p-vec2f(0.5))); let t=fract(p-vec2f(0.5));
169
+ return mix(mix(readPixel(base),readPixel(base+vec2i(1,0)),t.x),mix(readPixel(base+vec2i(0,1)),readPixel(base+vec2i(1,1)),t.x),t.y);
170
+ }
171
+ @fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
172
+ if(params.amount==0.0) { return textureSampleLevel(source,sourceSampler,input.uv,0); }
173
+ let pixel=input.uv*params.size;
174
+ let p=(pixel-params.offset*params.size)/params.scale;
175
+ let mode=i32(params.displacement);
176
+ var displacement: vec2f;
177
+ if(mode==1 || mode==2 || mode==4 || mode==5) {
178
+ let epsilon=0.05;
179
+ let gradient=vec2f(turbulence(p+vec2f(epsilon,0),0u)-turbulence(p-vec2f(epsilon,0),0u),turbulence(p+vec2f(0,epsilon),0u)-turbulence(p-vec2f(0,epsilon),0u))/(2.0*epsilon);
180
+ displacement=select(vec2f(-gradient.y,gradient.x),gradient,mode==1 || mode==4)*params.amount*0.25;
181
+ } else if(mode==6) { displacement=vec2f(0,turbulence(p,17u)*params.amount); }
182
+ else if(mode==7) { displacement=vec2f(turbulence(p,0u)*params.amount,0); }
183
+ else if(mode==8) { displacement=vec2f(turbulence(p,0u)*params.amount); }
184
+ else { displacement=vec2f(turbulence(p,0u),turbulence(p,17u))*params.amount; }
185
+ let locked=params.pinning>=8.0;
186
+ let pin=select(params.pinning,params.pinning-7.0,locked);
187
+ let edge=max(1.0,min(params.size.x,params.size.y)*select(0.1,0.25,locked));
188
+ let nearEdge=clamp((pixel-vec2f(0.5))/edge,vec2f(0),vec2f(1));
189
+ let farEdge=clamp((params.size-vec2f(0.5)-pixel)/edge,vec2f(0),vec2f(1));
190
+ let horizontal=min(nearEdge.x,farEdge.x); let vertical=min(nearEdge.y,farEdge.y);
191
+ var weight=1.0;
192
+ if(pin==1.0) { weight=min(horizontal,vertical); }
193
+ if(pin==2.0) { weight=vertical; } if(pin==3.0) { weight=horizontal; }
194
+ if(pin==4.0) { weight=nearEdge.x; } if(pin==5.0) { weight=nearEdge.y; }
195
+ if(pin==6.0) { weight=farEdge.x; } if(pin==7.0) { weight=farEdge.y; }
196
+ var sourcePixel=pixel+displacement*weight;
197
+ if(locked) { sourcePixel=clamp(sourcePixel,vec2f(0.5),params.size-vec2f(0.5)); }
198
+ return sampleSource(sourcePixel);
199
+ }
200
+
201
+ `;
202
+
203
+ // src/turbulent-displace/index.ts
204
+ var { createEffect, createWebGL2ContextError } = Internals;
205
+ var DEFAULT_DISPLACEMENT = "turbulent";
206
+ var DEFAULT_AMOUNT = 50;
207
+ var DEFAULT_SIZE = 100;
208
+ var DEFAULT_OFFSET = [0.5, 0.5];
209
+ var DEFAULT_COMPLEXITY = 1;
210
+ var DEFAULT_EVOLUTION = 0;
211
+ var DEFAULT_CYCLE_EVOLUTION = false;
212
+ var DEFAULT_CYCLE = 1;
213
+ var DEFAULT_SEED = 0;
214
+ var DEFAULT_PINNING = "all";
215
+ var DISPLACEMENT_MODES = [
216
+ "turbulent",
217
+ "bulge",
218
+ "twist",
219
+ "turbulent-smoother",
220
+ "bulge-smoother",
221
+ "twist-smoother",
222
+ "vertical",
223
+ "horizontal",
224
+ "cross"
225
+ ];
226
+ var PINNING_MODES = [
227
+ "none",
228
+ "all",
229
+ "horizontal",
230
+ "vertical",
231
+ "left",
232
+ "top",
233
+ "right",
234
+ "bottom",
235
+ "all-locked",
236
+ "horizontal-locked",
237
+ "vertical-locked",
238
+ "left-locked",
239
+ "top-locked",
240
+ "right-locked",
241
+ "bottom-locked"
242
+ ];
243
+ var turbulentDisplaceSchema = {
244
+ displacement: {
245
+ type: "enum",
246
+ variants: {
247
+ turbulent: {},
248
+ bulge: {},
249
+ twist: {},
250
+ "turbulent-smoother": {},
251
+ "bulge-smoother": {},
252
+ "twist-smoother": {},
253
+ vertical: {},
254
+ horizontal: {},
255
+ cross: {}
256
+ },
257
+ default: DEFAULT_DISPLACEMENT,
258
+ description: "Displacement"
259
+ },
260
+ amount: {
261
+ type: "number",
262
+ min: -200,
263
+ max: 200,
264
+ step: 1,
265
+ default: DEFAULT_AMOUNT,
266
+ description: "Amount",
267
+ hiddenFromList: false
268
+ },
269
+ size: {
270
+ type: "number",
271
+ min: 1,
272
+ max: 1000,
273
+ step: 1,
274
+ default: DEFAULT_SIZE,
275
+ description: "Size",
276
+ hiddenFromList: false
277
+ },
278
+ offset: {
279
+ type: "uv-coordinate",
280
+ step: 0.01,
281
+ default: DEFAULT_OFFSET,
282
+ description: "Offset"
283
+ },
284
+ complexity: {
285
+ type: "number",
286
+ min: 1,
287
+ max: 10,
288
+ step: 0.1,
289
+ default: DEFAULT_COMPLEXITY,
290
+ description: "Complexity",
291
+ hiddenFromList: false
292
+ },
293
+ evolution: {
294
+ type: "rotation-degrees",
295
+ step: 1,
296
+ default: DEFAULT_EVOLUTION,
297
+ description: "Evolution"
298
+ },
299
+ cycleEvolution: {
300
+ type: "boolean",
301
+ default: DEFAULT_CYCLE_EVOLUTION,
302
+ description: "Cycle evolution"
303
+ },
304
+ cycle: {
305
+ type: "number",
306
+ min: 1,
307
+ max: 100,
308
+ step: 1,
309
+ integer: true,
310
+ default: DEFAULT_CYCLE,
311
+ description: "Cycle length",
312
+ hiddenFromList: false
313
+ },
314
+ seed: {
315
+ type: "number",
316
+ min: 0,
317
+ max: 4294967295,
318
+ step: 1,
319
+ integer: true,
320
+ default: DEFAULT_SEED,
321
+ description: "Seed",
322
+ hiddenFromList: false
323
+ },
324
+ pinning: {
325
+ type: "enum",
326
+ variants: {
327
+ none: {},
328
+ all: {},
329
+ horizontal: {},
330
+ vertical: {},
331
+ left: {},
332
+ top: {},
333
+ right: {},
334
+ bottom: {},
335
+ "all-locked": {},
336
+ "horizontal-locked": {},
337
+ "vertical-locked": {},
338
+ "left-locked": {},
339
+ "top-locked": {},
340
+ "right-locked": {},
341
+ "bottom-locked": {}
342
+ },
343
+ default: DEFAULT_PINNING,
344
+ description: "Pinning"
345
+ }
346
+ };
347
+ var resolve = (params) => ({
348
+ displacement: params.displacement ?? DEFAULT_DISPLACEMENT,
349
+ amount: params.amount ?? DEFAULT_AMOUNT,
350
+ size: params.size ?? DEFAULT_SIZE,
351
+ offset: params.offset ?? DEFAULT_OFFSET,
352
+ complexity: params.complexity ?? DEFAULT_COMPLEXITY,
353
+ evolution: params.evolution ?? DEFAULT_EVOLUTION,
354
+ cycleEvolution: params.cycleEvolution ?? DEFAULT_CYCLE_EVOLUTION,
355
+ cycle: params.cycle ?? DEFAULT_CYCLE,
356
+ seed: params.seed ?? DEFAULT_SEED,
357
+ pinning: params.pinning ?? DEFAULT_PINNING
358
+ });
359
+ var validateTurbulentDisplaceParams = (params) => {
360
+ assertEffectParamsObject(params, "Turbulent displace");
361
+ assertOptionalFiniteNumber(params.amount, "amount");
362
+ assertOptionalFiniteNumber(params.size, "size");
363
+ assertOptionalFiniteNumber(params.complexity, "complexity");
364
+ assertOptionalFiniteNumber(params.evolution, "evolution");
365
+ assertOptionalBoolean(params.cycleEvolution, "cycleEvolution");
366
+ assertOptionalFiniteNumber(params.cycle, "cycle");
367
+ assertOptionalFiniteNumber(params.seed, "seed");
368
+ if (params.displacement !== undefined && !DISPLACEMENT_MODES.includes(params.displacement)) {
369
+ throw new TypeError("Invalid displacement: " + JSON.stringify(params.displacement));
370
+ }
371
+ if (params.pinning !== undefined && !PINNING_MODES.includes(params.pinning)) {
372
+ throw new TypeError("Invalid pinning: " + JSON.stringify(params.pinning));
373
+ }
374
+ if (params.offset !== undefined) {
375
+ if (!Array.isArray(params.offset) || params.offset.length !== 2)
376
+ throw new TypeError('"offset" must be a two-number tuple');
377
+ assertRequiredFiniteNumber(params.offset[0], "offset[0]");
378
+ assertRequiredFiniteNumber(params.offset[1], "offset[1]");
379
+ }
380
+ const r = resolve(params);
381
+ if (r.size < 1)
382
+ throw new TypeError('"size" must be at least 1');
383
+ if (r.complexity < 1 || r.complexity > 10)
384
+ throw new TypeError('"complexity" must be between 1 and 10');
385
+ if (!Number.isInteger(r.cycle) || r.cycle < 1 || r.cycle > 65535)
386
+ throw new TypeError('"cycle" must be an integer between 1 and 65535');
387
+ if (!Number.isInteger(r.seed) || r.seed < 0 || r.seed > 4294967295)
388
+ throw new TypeError('"seed" must be an unsigned 32-bit integer');
389
+ };
390
+ var VERTEX_SHADER = `#version 300 es
391
+ in vec2 aPos;
392
+ in vec2 aUv;
393
+ out vec2 vUv;
394
+
395
+ void main() {
396
+ vUv = aUv;
397
+ gl_Position = vec4(aPos, 0.0, 1.0);
398
+ }
399
+ `;
400
+ var compileShader = (gl, type, source) => {
401
+ const shader = gl.createShader(type);
402
+ if (!shader) {
403
+ throw new Error("Failed to create WebGL shader");
404
+ }
405
+ gl.shaderSource(shader, source);
406
+ gl.compileShader(shader);
407
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
408
+ const log = gl.getShaderInfoLog(shader);
409
+ gl.deleteShader(shader);
410
+ throw new Error(`TurbulentDisplace shader compile failed: ${log ?? "(no log)"}`);
411
+ }
412
+ return shader;
413
+ };
414
+ var linkProgram = (gl, vs, fs) => {
415
+ const program = gl.createProgram();
416
+ if (!program) {
417
+ throw new Error("Failed to create WebGL program");
418
+ }
419
+ gl.attachShader(program, vs);
420
+ gl.attachShader(program, fs);
421
+ gl.linkProgram(program);
422
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
423
+ const log = gl.getProgramInfoLog(program);
424
+ gl.deleteProgram(program);
425
+ throw new Error(`TurbulentDisplace program link failed: ${log ?? "(no log)"}`);
426
+ }
427
+ return program;
428
+ };
429
+ var setupTurbulentDisplace = (target) => {
430
+ const gl = target.getContext("webgl2", {
431
+ premultipliedAlpha: true,
432
+ alpha: true,
433
+ preserveDrawingBuffer: true
434
+ });
435
+ if (!gl) {
436
+ throw createWebGL2ContextError("turbulent displace effect");
437
+ }
438
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
439
+ const vs = compileShader(gl, gl.VERTEX_SHADER, VERTEX_SHADER);
440
+ const fs = compileShader(gl, gl.FRAGMENT_SHADER, TURBULENT_DISPLACE_FRAGMENT_SHADER);
441
+ const program = linkProgram(gl, vs, fs);
442
+ gl.deleteShader(vs);
443
+ gl.deleteShader(fs);
444
+ const vao = gl.createVertexArray();
445
+ if (!vao) {
446
+ throw new Error("Failed to create WebGL vertex array");
447
+ }
448
+ gl.bindVertexArray(vao);
449
+ const data = new Float32Array([
450
+ -1,
451
+ -1,
452
+ 0,
453
+ 0,
454
+ 1,
455
+ -1,
456
+ 1,
457
+ 0,
458
+ -1,
459
+ 1,
460
+ 0,
461
+ 1,
462
+ 1,
463
+ 1,
464
+ 1,
465
+ 1
466
+ ]);
467
+ const vbo = gl.createBuffer();
468
+ if (!vbo) {
469
+ throw new Error("Failed to create WebGL buffer");
470
+ }
471
+ gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
472
+ gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
473
+ const aPos = gl.getAttribLocation(program, "aPos");
474
+ const aUv = gl.getAttribLocation(program, "aUv");
475
+ gl.enableVertexAttribArray(aPos);
476
+ gl.vertexAttribPointer(aPos, 2, gl.FLOAT, false, 16, 0);
477
+ gl.enableVertexAttribArray(aUv);
478
+ gl.vertexAttribPointer(aUv, 2, gl.FLOAT, false, 16, 8);
479
+ gl.bindVertexArray(null);
480
+ const texture = gl.createTexture();
481
+ if (!texture) {
482
+ throw new Error("Failed to create WebGL texture");
483
+ }
484
+ gl.bindTexture(gl.TEXTURE_2D, texture);
485
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
486
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
487
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
488
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
489
+ gl.bindTexture(gl.TEXTURE_2D, null);
490
+ return {
491
+ gl,
492
+ program,
493
+ vao,
494
+ vbo,
495
+ texture,
496
+ uSource: gl.getUniformLocation(program, "uSource"),
497
+ uResolution: gl.getUniformLocation(program, "uResolution"),
498
+ uDisplacement: gl.getUniformLocation(program, "uDisplacement"),
499
+ uAmount: gl.getUniformLocation(program, "uAmount"),
500
+ uSize: gl.getUniformLocation(program, "uSize"),
501
+ uOffset: gl.getUniformLocation(program, "uOffset"),
502
+ uComplexity: gl.getUniformLocation(program, "uComplexity"),
503
+ uEvolution: gl.getUniformLocation(program, "uEvolution"),
504
+ uCycleEvolution: gl.getUniformLocation(program, "uCycleEvolution"),
505
+ uCycle: gl.getUniformLocation(program, "uCycle"),
506
+ uSeed: gl.getUniformLocation(program, "uSeed"),
507
+ uPinning: gl.getUniformLocation(program, "uPinning")
508
+ };
509
+ };
510
+ var turbulentDisplace = createEffect({
511
+ type: "remotion/turbulent-displace",
512
+ label: "turbulentDisplace()",
513
+ documentationLink: "https://www.remotion.dev/docs/effects/turbulent-displace",
514
+ calculateKey: (params) => {
515
+ const r = resolve(params);
516
+ return `turbulent-displace-${JSON.stringify(r)}`;
517
+ },
518
+ implementations: {
519
+ webgpu: Internals.createEffectImplementation({
520
+ setup: (target) => setupWebGpuSinglePass(target, "index"),
521
+ apply: ({ source, width, height, params, state, gpuDevice }) => {
522
+ if (!gpuDevice)
523
+ throw new Error("A WebGPU device is required for the index effect");
524
+ const r = resolve(params);
525
+ const uniformData = new Float32Array([
526
+ width,
527
+ height,
528
+ r.offset[0],
529
+ r.offset[1],
530
+ r.amount,
531
+ r.size,
532
+ r.complexity,
533
+ r.evolution / 360,
534
+ r.cycle,
535
+ 0,
536
+ DISPLACEMENT_MODES.indexOf(r.displacement),
537
+ PINNING_MODES.indexOf(r.pinning),
538
+ r.cycleEvolution ? 1 : 0,
539
+ 0,
540
+ 0,
541
+ 0
542
+ ]);
543
+ new Uint32Array(uniformData.buffer)[9] = r.seed;
544
+ applyWebGpuSinglePass({
545
+ state,
546
+ source,
547
+ width,
548
+ height,
549
+ device: gpuDevice,
550
+ shader: TURBULENT_DISPLACE_WEBGPU_SHADER,
551
+ uniformData
552
+ });
553
+ },
554
+ cleanup: cleanupWebGpuSinglePass
555
+ }),
556
+ webgl2: Internals.createEffectImplementation({
557
+ setup: (target) => setupTurbulentDisplace(target),
558
+ apply: ({ source, width, height, params, state, flipSourceY }) => {
559
+ const r = resolve(params);
560
+ const { gl, program, texture, vao } = state;
561
+ gl.viewport(0, 0, width, height);
562
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
563
+ gl.clearColor(0, 0, 0, 0);
564
+ gl.clear(gl.COLOR_BUFFER_BIT);
565
+ gl.activeTexture(gl.TEXTURE0);
566
+ gl.bindTexture(gl.TEXTURE_2D, texture);
567
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
568
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
569
+ gl.useProgram(program);
570
+ if (state.uSource)
571
+ gl.uniform1i(state.uSource, 0);
572
+ if (state.uResolution)
573
+ gl.uniform2f(state.uResolution, width, height);
574
+ if (state.uDisplacement)
575
+ gl.uniform1i(state.uDisplacement, DISPLACEMENT_MODES.indexOf(r.displacement));
576
+ if (state.uAmount)
577
+ gl.uniform1f(state.uAmount, r.amount);
578
+ if (state.uSize)
579
+ gl.uniform1f(state.uSize, r.size);
580
+ if (state.uOffset)
581
+ gl.uniform2f(state.uOffset, r.offset[0], r.offset[1]);
582
+ if (state.uComplexity)
583
+ gl.uniform1f(state.uComplexity, r.complexity);
584
+ if (state.uEvolution)
585
+ gl.uniform1f(state.uEvolution, r.evolution / 360);
586
+ if (state.uCycleEvolution)
587
+ gl.uniform1i(state.uCycleEvolution, r.cycleEvolution ? 1 : 0);
588
+ if (state.uCycle)
589
+ gl.uniform1f(state.uCycle, r.cycle);
590
+ if (state.uSeed)
591
+ gl.uniform1ui(state.uSeed, r.seed);
592
+ if (state.uPinning)
593
+ gl.uniform1i(state.uPinning, PINNING_MODES.indexOf(r.pinning));
594
+ gl.bindVertexArray(vao);
595
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
596
+ gl.bindVertexArray(null);
597
+ gl.bindTexture(gl.TEXTURE_2D, null);
598
+ gl.useProgram(null);
599
+ },
600
+ cleanup: ({ gl, program, vao, vbo, texture }) => {
601
+ gl.deleteTexture(texture);
602
+ gl.deleteBuffer(vbo);
603
+ gl.deleteProgram(program);
604
+ gl.deleteVertexArray(vao);
605
+ }
606
+ })
607
+ },
608
+ schema: turbulentDisplaceSchema,
609
+ validateParams: validateTurbulentDisplaceParams
610
+ });
611
+ export {
612
+ turbulentDisplace
613
+ };