@remotion/effects 4.0.538 → 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.
Files changed (209) hide show
  1. package/THIRD_PARTY_LICENSES.md +19 -0
  2. package/dist/barrel-distortion/webgpu-shader.d.ts +1 -0
  3. package/dist/bevel-alpha/webgpu-shaders.d.ts +2 -0
  4. package/dist/burlap-webgpu-shader.d.ts +1 -0
  5. package/dist/checkerboard-webgpu-shader.d.ts +1 -0
  6. package/dist/chromatic-aberration/webgpu-shader.d.ts +1 -0
  7. package/dist/color-correction-webgpu-shader-utils.d.ts +4 -0
  8. package/dist/color-key-webgpu-shader.d.ts +1 -0
  9. package/dist/color-matrix-runtime.d.ts +4 -0
  10. package/dist/contour-lines-webgpu-shader.d.ts +1 -0
  11. package/dist/corner-pin/webgpu-shader.d.ts +1 -0
  12. package/dist/curves.d.ts +65 -0
  13. package/dist/cylinder/webgl-shader.d.ts +1 -0
  14. package/dist/dot-grid-webgpu-shader.d.ts +1 -0
  15. package/dist/drop-shadow/webgpu-shaders.d.ts +2 -0
  16. package/dist/emboss-webgpu-shader.d.ts +1 -0
  17. package/dist/esm/barrel-distortion.mjs +67 -118
  18. package/dist/esm/bevel-alpha.mjs +247 -196
  19. package/dist/esm/blur.mjs +101 -115
  20. package/dist/esm/brightness.mjs +65 -132
  21. package/dist/esm/burlap.mjs +178 -151
  22. package/dist/esm/checkerboard.mjs +6 -514
  23. package/dist/esm/chromatic-aberration.mjs +72 -119
  24. package/dist/esm/color-correction.mjs +186 -224
  25. package/dist/esm/color-key.mjs +149 -136
  26. package/dist/esm/contour-lines.mjs +201 -160
  27. package/dist/esm/contrast.mjs +65 -132
  28. package/dist/esm/corner-pin.mjs +4 -390
  29. package/dist/esm/curves.mjs +357 -0
  30. package/dist/esm/cylinder.mjs +108 -225
  31. package/dist/esm/dot-grid.mjs +184 -213
  32. package/dist/esm/drop-shadow.mjs +162 -180
  33. package/dist/esm/duotone.mjs +110 -143
  34. package/dist/esm/emboss.mjs +153 -151
  35. package/dist/esm/evolve.mjs +228 -154
  36. package/dist/esm/exposure.mjs +93 -201
  37. package/dist/esm/film-burn.mjs +298 -0
  38. package/dist/esm/fisheye.mjs +97 -126
  39. package/dist/esm/flannel.mjs +158 -156
  40. package/dist/esm/fractal-noise.mjs +186 -232
  41. package/dist/esm/glow.mjs +164 -179
  42. package/dist/esm/grayscale.mjs +56 -122
  43. package/dist/esm/gridlines.mjs +6 -575
  44. package/dist/esm/halftone-linear-gradient.mjs +246 -245
  45. package/dist/esm/halftone.mjs +267 -243
  46. package/dist/esm/hue.mjs +55 -122
  47. package/dist/esm/index-00v3hr66.mjs +299 -0
  48. package/dist/esm/index-0w4eqht8.mjs +351 -0
  49. package/dist/esm/index-18y0zcy2.mjs +440 -0
  50. package/dist/esm/index-1m1b1ad7.mjs +520 -0
  51. package/dist/esm/index-34fxm3ax.mjs +518 -0
  52. package/dist/esm/index-4fvp93ps.mjs +32 -0
  53. package/dist/esm/index-4scpn12x.mjs +224 -0
  54. package/dist/esm/index-4z6pt3ka.mjs +104 -0
  55. package/dist/esm/index-618ky75w.mjs +51 -0
  56. package/dist/esm/index-6agxdrvr.mjs +411 -0
  57. package/dist/esm/index-6jkps947.mjs +120 -0
  58. package/dist/esm/index-8agtsbw4.mjs +617 -0
  59. package/dist/esm/index-8jx11jyn.mjs +29 -0
  60. package/dist/esm/index-8p04sssx.mjs +123 -0
  61. package/dist/esm/index-afdtmrh2.mjs +596 -0
  62. package/dist/esm/index-b86qstcs.mjs +18 -0
  63. package/dist/esm/index-cb77qg3g.mjs +587 -0
  64. package/dist/esm/index-cdp7tr8x.mjs +122 -0
  65. package/dist/esm/index-evy8hyah.mjs +55 -0
  66. package/dist/esm/index-gnsce796.mjs +6 -0
  67. package/dist/esm/index-kkvzt8b7.mjs +199 -0
  68. package/dist/esm/index-r0v18b2n.mjs +425 -0
  69. package/dist/esm/index-rswpzmm5.mjs +926 -0
  70. package/dist/esm/index-s9mrx750.mjs +97 -0
  71. package/dist/esm/index-tvfexb7s.mjs +164 -0
  72. package/dist/esm/index-vp56k1gj.mjs +215 -0
  73. package/dist/esm/index-wxhvgv2s.mjs +79 -0
  74. package/dist/esm/index-wy95a41r.mjs +407 -0
  75. package/dist/esm/index-ysnwfc4t.mjs +306 -0
  76. package/dist/esm/index.mjs +49 -4053
  77. package/dist/esm/invert.mjs +54 -122
  78. package/dist/esm/iris-wipe.mjs +315 -0
  79. package/dist/esm/lens-blur.mjs +169 -156
  80. package/dist/esm/levels.mjs +204 -151
  81. package/dist/esm/light-leak.mjs +6 -416
  82. package/dist/esm/light-trail.mjs +124 -128
  83. package/dist/esm/linear-gradient-tint.mjs +4 -424
  84. package/dist/esm/linear-gradient.mjs +4 -370
  85. package/dist/esm/linear-progressive-blur.mjs +92 -118
  86. package/dist/esm/linear-progressive-pixelate.mjs +83 -378
  87. package/dist/esm/lines.mjs +167 -162
  88. package/dist/esm/liquid-contours.mjs +192 -153
  89. package/dist/esm/long-shadows.mjs +278 -251
  90. package/dist/esm/lut.mjs +123 -23
  91. package/dist/esm/mirror.mjs +78 -120
  92. package/dist/esm/noise-displacement.mjs +156 -151
  93. package/dist/esm/noise.mjs +107 -143
  94. package/dist/esm/outline.mjs +192 -170
  95. package/dist/esm/page-turn.mjs +141 -244
  96. package/dist/esm/paper.mjs +522 -194
  97. package/dist/esm/pattern.mjs +4 -568
  98. package/dist/esm/pixel-dissolve.mjs +158 -186
  99. package/dist/esm/pixelate.mjs +92 -149
  100. package/dist/esm/radial-progressive-blur.mjs +96 -118
  101. package/dist/esm/radial-progressive-pixelate.mjs +91 -384
  102. package/dist/esm/radial-wipe.mjs +224 -0
  103. package/dist/esm/rain-fall.mjs +114 -0
  104. package/dist/esm/region-blur.mjs +138 -192
  105. package/dist/esm/rings.mjs +6 -512
  106. package/dist/esm/roughen-edges.mjs +180 -156
  107. package/dist/esm/saturation.mjs +56 -122
  108. package/dist/esm/scale.mjs +50 -60
  109. package/dist/esm/scanlines.mjs +115 -149
  110. package/dist/esm/shadows-highlights.mjs +103 -205
  111. package/dist/esm/shatter.mjs +868 -0
  112. package/dist/esm/shine.mjs +192 -227
  113. package/dist/esm/shrinkwrap.mjs +388 -225
  114. package/dist/esm/skew.mjs +100 -145
  115. package/dist/esm/snow-fall.mjs +170 -0
  116. package/dist/esm/speckle.mjs +192 -210
  117. package/dist/esm/sphere.mjs +101 -225
  118. package/dist/esm/starburst.mjs +6 -345
  119. package/dist/esm/tear.mjs +138 -155
  120. package/dist/esm/thermal-vision.mjs +135 -152
  121. package/dist/esm/tile.mjs +5 -184
  122. package/dist/esm/tint.mjs +80 -132
  123. package/dist/esm/translate.mjs +55 -137
  124. package/dist/esm/turbulent-displace.mjs +182 -221
  125. package/dist/esm/tv-signal-off.mjs +140 -149
  126. package/dist/esm/venetian-blinds.mjs +91 -140
  127. package/dist/esm/vibrance.mjs +95 -204
  128. package/dist/esm/vignette.mjs +136 -155
  129. package/dist/esm/wave.mjs +88 -47
  130. package/dist/esm/waves.mjs +181 -169
  131. package/dist/esm/white-balance.mjs +100 -204
  132. package/dist/esm/white-noise.mjs +98 -146
  133. package/dist/esm/zigzag.mjs +6 -575
  134. package/dist/esm/zoom-blur.mjs +90 -121
  135. package/dist/evolve.d.ts +46 -10
  136. package/dist/film-burn-webgpu-shader.d.ts +1 -0
  137. package/dist/film-burn.d.ts +40 -0
  138. package/dist/fisheye/webgpu-shader.d.ts +1 -0
  139. package/dist/flannel-webgpu-shader.d.ts +1 -0
  140. package/dist/fractal-noise/shader.d.ts +1 -1
  141. package/dist/fractal-noise/webgpu-shader.d.ts +1 -0
  142. package/dist/gaussian-blur-webgpu-shader.d.ts +1 -0
  143. package/dist/glow/webgpu-shaders.d.ts +2 -0
  144. package/dist/gridlines-webgpu-shader.d.ts +1 -0
  145. package/dist/halftone-linear-gradient-webgpu-shader.d.ts +1 -0
  146. package/dist/halftone-webgpu-shader.d.ts +1 -0
  147. package/dist/iris-wipe.d.ts +78 -0
  148. package/dist/lens-blur/webgpu-shader.d.ts +1 -0
  149. package/dist/levels.d.ts +69 -2
  150. package/dist/light-leak-webgpu-shader.d.ts +1 -0
  151. package/dist/light-trail/webgpu-shader.d.ts +1 -0
  152. package/dist/linear-gradient-tint-webgpu-shader.d.ts +1 -0
  153. package/dist/linear-gradient-webgpu-shader.d.ts +1 -0
  154. package/dist/lines-webgpu-shader.d.ts +1 -0
  155. package/dist/liquid-contours-webgpu-shader.d.ts +1 -0
  156. package/dist/long-shadows-webgpu-shaders.d.ts +2 -0
  157. package/dist/lut/webgpu-shader.d.ts +1 -0
  158. package/dist/mirror/webgpu-shader.d.ts +1 -0
  159. package/dist/noise-displacement-webgpu-shader.d.ts +1 -0
  160. package/dist/noise-webgpu-shader.d.ts +1 -0
  161. package/dist/outline/webgpu-shader.d.ts +1 -0
  162. package/dist/page-turn/webgl-shader.d.ts +1 -0
  163. package/dist/paper-webgpu-shader.d.ts +2 -0
  164. package/dist/pattern-webgpu-shader.d.ts +1 -0
  165. package/dist/pixel-dissolve-webgpu-shader.d.ts +1 -0
  166. package/dist/progressive-pixelate-runtime.d.ts +1 -0
  167. package/dist/radial-wipe.d.ts +19 -0
  168. package/dist/rain-fall.d.ts +143 -0
  169. package/dist/rect-transform-runtime.d.ts +11 -0
  170. package/dist/region-blur/webgpu-shader.d.ts +1 -0
  171. package/dist/rings-webgpu-shader.d.ts +1 -0
  172. package/dist/roughen-edges-webgpu-shader.d.ts +1 -0
  173. package/dist/shatter/geometry.d.ts +19 -0
  174. package/dist/shatter/index.d.ts +39 -0
  175. package/dist/shatter/runtime.d.ts +19 -0
  176. package/dist/shatter/webgpu-shader.d.ts +1 -0
  177. package/dist/shatter.d.ts +1 -0
  178. package/dist/shine-webgpu-shader.d.ts +1 -0
  179. package/dist/shrinkwrap-webgpu-shader.d.ts +1 -0
  180. package/dist/single-pass-runtime.d.ts +18 -0
  181. package/dist/skew-webgpu-shader.d.ts +1 -0
  182. package/dist/snow-fall.d.ts +208 -0
  183. package/dist/speckle-webgpu-shader.d.ts +1 -0
  184. package/dist/sphere/webgl-shader.d.ts +1 -0
  185. package/dist/starburst-webgpu-shader.d.ts +1 -0
  186. package/dist/tear-webgpu-shader.d.ts +1 -0
  187. package/dist/thermal-vision-webgpu-shader.d.ts +1 -0
  188. package/dist/tile-gpu-runtime.d.ts +24 -0
  189. package/dist/turbulent-displace/webgpu-shader.d.ts +1 -0
  190. package/dist/value-noise-webgpu-shader.d.ts +1 -0
  191. package/dist/vignette-webgpu-shader.d.ts +1 -0
  192. package/dist/wave/wave-runtime.d.ts +2 -1
  193. package/dist/wave/webgpu-shader.d.ts +1 -0
  194. package/dist/waves-webgpu-shader.d.ts +1 -0
  195. package/dist/weather/params.d.ts +149 -0
  196. package/dist/weather/runtime.d.ts +52 -0
  197. package/dist/weather/shaders.d.ts +4 -0
  198. package/dist/weather/webgpu-runtime.d.ts +36 -0
  199. package/dist/weather/webgpu-shader.d.ts +1 -0
  200. package/dist/webgl-projection-runtime.d.ts +18 -0
  201. package/dist/webgpu-color-state.d.ts +10 -0
  202. package/dist/webgpu-mesh-runtime.d.ts +46 -0
  203. package/dist/webgpu-multipass-runtime.d.ts +50 -0
  204. package/dist/webgpu-projection-runtime.d.ts +9 -5
  205. package/dist/webgpu-single-pass-runtime.d.ts +47 -0
  206. package/dist/white-noise-webgpu-shader.d.ts +1 -0
  207. package/dist/zigzag-webgpu-shader.d.ts +1 -0
  208. package/dist/zoom-blur/webgpu-shader.d.ts +1 -0
  209. package/package.json +59 -3
package/dist/esm/wave.mjs CHANGED
@@ -1,37 +1,17 @@
1
+ import {
2
+ WEBGPU_SINGLE_PASS_VERTEX,
3
+ setupWebGpuSinglePass,
4
+ cleanupWebGpuSinglePass,
5
+ applyWebGpuSinglePass
6
+ } from "./index-tvfexb7s.mjs";
7
+ import {
8
+ assertEffectParamsObject,
9
+ assertRequiredFiniteNumber
10
+ } from "./index-4fvp93ps.mjs";
11
+
1
12
  // src/wave/index.ts
2
13
  import { Internals as Internals2 } from "remotion";
3
14
 
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
15
  // src/wave/wave-runtime.ts
36
16
  import { Internals } from "remotion";
37
17
 
@@ -149,7 +129,6 @@ var setupWave = (target) => {
149
129
  throw createWebGL2ContextError("wave effect");
150
130
  }
151
131
  gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
152
- gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
153
132
  const program = createProgram(gl, WAVE_VS, WAVE_FS);
154
133
  const vao = gl.createVertexArray();
155
134
  if (!vao) {
@@ -213,6 +192,7 @@ var applyWave = ({
213
192
  source,
214
193
  width,
215
194
  height,
195
+ flipSourceY,
216
196
  amplitude,
217
197
  wavelength,
218
198
  phase,
@@ -220,6 +200,8 @@ var applyWave = ({
220
200
  }) => {
221
201
  const { gl, program, textureSource, uniforms } = state;
222
202
  gl.viewport(0, 0, width, height);
203
+ gl.activeTexture(gl.TEXTURE0);
204
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
223
205
  gl.bindTexture(gl.TEXTURE_2D, textureSource);
224
206
  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
225
207
  gl.bindTexture(gl.TEXTURE_2D, null);
@@ -246,6 +228,32 @@ var applyWave = ({
246
228
  gl.useProgram(null);
247
229
  };
248
230
 
231
+ // src/wave/webgpu-shader.ts
232
+ var WAVE_WEBGPU_SHADER = `
233
+ ${WEBGPU_SINGLE_PASS_VERTEX}
234
+ @group(0) @binding(0) var source: texture_2d<f32>;
235
+ @group(0) @binding(1) var sourceSampler: sampler;
236
+ @group(0) @binding(2) var<uniform> params: Params;
237
+ struct Params { resolutionAndWave: vec4f, phaseAndDirection: vec4f, }
238
+ @fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
239
+ let resolution = params.resolutionAndWave.xy;
240
+ let amplitude = params.resolutionAndWave.z;
241
+ let wavelength = max(params.resolutionAndWave.w, 0.001);
242
+ let phase = params.phaseAndDirection.x;
243
+ var uv = input.uv;
244
+ if (params.phaseAndDirection.y == 0.0) {
245
+ let coord = input.uv.x * resolution.x;
246
+ let offset = sin((coord / wavelength) * 6.28318530718 + phase) * amplitude;
247
+ uv.y += offset / resolution.y;
248
+ } else {
249
+ let coord = (1.0 - input.uv.y) * resolution.y;
250
+ let offset = sin((coord / wavelength) * 6.28318530718 + phase) * amplitude;
251
+ uv.x -= offset / resolution.x;
252
+ }
253
+ return textureSampleLevel(source, sourceSampler, uv, 0);
254
+ }
255
+ `;
256
+
249
257
  // src/wave/index.ts
250
258
  var { createEffect } = Internals2;
251
259
  var waveSchema = {
@@ -315,26 +323,59 @@ var wave = createEffect({
315
323
  type: "dev.remotion.effects.wave",
316
324
  label: "wave()",
317
325
  documentationLink: "https://www.remotion.dev/docs/effects/wave",
318
- backend: "webgl2",
319
326
  calculateKey: (params) => {
320
327
  const r = resolve(params);
321
328
  return `wave-${r.phase}-${r.direction}-${r.amplitude}-${r.wavelength}`;
322
329
  },
323
- setup: (target) => setupWave(target),
324
- apply: ({ source, width, height, params, state }) => {
325
- const r = resolve(params);
326
- applyWave({
327
- state,
328
- source,
329
- width,
330
- height,
331
- amplitude: r.amplitude,
332
- wavelength: r.wavelength,
333
- phase: r.phase,
334
- direction: r.direction
335
- });
330
+ implementations: {
331
+ webgpu: Internals2.createEffectImplementation({
332
+ setup: (target) => setupWebGpuSinglePass(target, "wave"),
333
+ apply: ({ source, width, height, params, state, gpuDevice }) => {
334
+ if (!gpuDevice) {
335
+ throw new Error("A WebGPU device is required for the wave effect");
336
+ }
337
+ const r = resolve(params);
338
+ const uniformData = new Float32Array([
339
+ width,
340
+ height,
341
+ r.amplitude,
342
+ r.wavelength,
343
+ r.phase,
344
+ r.direction === "horizontal" ? 0 : 1,
345
+ 0,
346
+ 0
347
+ ]);
348
+ applyWebGpuSinglePass({
349
+ state,
350
+ source,
351
+ width,
352
+ height,
353
+ device: gpuDevice,
354
+ shader: WAVE_WEBGPU_SHADER,
355
+ uniformData
356
+ });
357
+ },
358
+ cleanup: cleanupWebGpuSinglePass
359
+ }),
360
+ webgl2: Internals2.createEffectImplementation({
361
+ setup: (target) => setupWave(target),
362
+ apply: ({ source, width, height, params, state, flipSourceY }) => {
363
+ const r = resolve(params);
364
+ applyWave({
365
+ state,
366
+ source,
367
+ width,
368
+ height,
369
+ flipSourceY,
370
+ amplitude: r.amplitude,
371
+ wavelength: r.wavelength,
372
+ phase: r.phase,
373
+ direction: r.direction
374
+ });
375
+ },
376
+ cleanup: (state) => cleanupWave(state)
377
+ })
336
378
  },
337
- cleanup: (state) => cleanupWave(state),
338
379
  schema: waveSchema,
339
380
  validateParams: validateWaveParams
340
381
  });
@@ -1,110 +1,74 @@
1
+ import {
2
+ setupWebGpuColors,
3
+ getWebGpuColors
4
+ } from "./index-8jx11jyn.mjs";
5
+ import {
6
+ assertOptionalFiniteNumber,
7
+ parseColorRgba
8
+ } from "./index-wxhvgv2s.mjs";
9
+ import {
10
+ WEBGPU_SINGLE_PASS_VERTEX,
11
+ cleanupWebGpuSinglePass,
12
+ applyWebGpuSinglePass
13
+ } from "./index-tvfexb7s.mjs";
14
+ import {
15
+ assertEffectParamsObject,
16
+ assertRequiredColor,
17
+ assertOptionalBoolean
18
+ } from "./index-4fvp93ps.mjs";
19
+
1
20
  // src/waves.ts
2
21
  import { Internals } from "remotion";
3
22
 
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
- };
23
+ // src/waves-webgpu-shader.ts
24
+ var WAVES_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
+ @group(0) @binding(3) var palette: texture_2d<f32>;
30
+ struct Params {
31
+ geometry: vec4f,
32
+ stripe: vec4f,
33
+ flags: vec4f,
34
+ wave: vec4f,
35
+ }
36
+ fn sampleSource(uv: vec2f) -> vec4f {
37
+ return textureSampleLevel(sourceTexture, sourceSampler, vec2f(uv.x, 1.0 - uv.y), 0);
38
+ }
39
+ fn glslModulo(value: f32, divisor: f32) -> f32 { return value - divisor * floor(value / divisor); }
40
+ fn paletteColor(index: f32) -> vec4f { return textureLoad(palette, vec2i(i32(index), 0), 0); }
34
41
 
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
- };
42
+ @fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
43
+ let vUv = vec2f(input.uv.x, 1.0 - input.uv.y);
44
+
45
+ let texColor = sampleSource(vUv);
46
+ let thickness = max(params.stripe.x, 0.001);
47
+ let spacing = max(params.stripe.y, 0.001);
48
+ let cycle = spacing * params.geometry.z;
49
+ let centered = vec2f(input.position.x, params.geometry.y - input.position.y) - params.geometry.xy * 0.5;
50
+ let s = sin(params.stripe.z);
51
+ let c = cos(params.stripe.z);
52
+ let rotated = vec2f(centered.x * c - centered.y * s, centered.x * s + centered.y * c);
53
+ var axis = select(rotated.x, rotated.y, params.geometry.w == 0.0);
54
+ let waveAxis = select(rotated.y, rotated.x, params.geometry.w == 0.0);
55
+ axis += sin((waveAxis / max(params.wave.y, 0.001)) * 6.283185307179586 + params.wave.z) * params.wave.x;
56
+
57
+ var position = glslModulo(axis + params.stripe.w, cycle);
58
+ if (position < 0.0) { position += cycle; }
59
+ let colorIndex = floor(position / spacing);
60
+ let inStripe = glslModulo(position, spacing);
61
+ if (inStripe > thickness) { return texColor; }
62
+
63
+ let overlay = paletteColor(colorIndex);
64
+ let premultiplied = overlay.rgb * overlay.a;
65
+ if (params.flags.x != 0.0) {
66
+ return vec4f(premultiplied * texColor.a + texColor.rgb * (1.0 - overlay.a), texColor.a);
67
+ }
68
+ return vec4f(premultiplied + texColor.rgb * (1.0 - overlay.a), overlay.a + texColor.a * (1.0 - overlay.a));
69
+
70
+ }
71
+ `;
108
72
 
109
73
  // src/waves.ts
110
74
  var { createEffect, createWebGL2ContextError } = Internals;
@@ -231,7 +195,7 @@ var validatePositive = (value, name) => {
231
195
  throw new TypeError(`"${name}" must be greater than 0, but got ${JSON.stringify(value)}`);
232
196
  }
233
197
  };
234
- var validateNonNegative2 = (value, name) => {
198
+ var validateNonNegative = (value, name) => {
235
199
  if (value < 0) {
236
200
  throw new TypeError(`"${name}" must be greater than or equal to 0, but got ${JSON.stringify(value)}`);
237
201
  }
@@ -272,8 +236,8 @@ var validateWavesParams = (params) => {
272
236
  const amplitude = params.amplitude ?? DEFAULT_AMPLITUDE;
273
237
  const wavelength = params.wavelength ?? DEFAULT_WAVELENGTH;
274
238
  validatePositive(thickness, "thickness");
275
- validateNonNegative2(gap, "gap");
276
- validateNonNegative2(amplitude, "amplitude");
239
+ validateNonNegative(gap, "gap");
240
+ validateNonNegative(amplitude, "amplitude");
277
241
  validatePositive(wavelength, "wavelength");
278
242
  };
279
243
  var WAVES_VS = `#version 300 es
@@ -311,7 +275,7 @@ void main() {
311
275
  float thickness = max(uThickness, 0.001);
312
276
  float spacing = max(uSpacing, 0.001);
313
277
  float cycle = spacing * uNumColors;
314
- vec2 centered = vUv * uResolution - uResolution * 0.5;
278
+ vec2 centered = gl_FragCoord.xy - uResolution * 0.5;
315
279
  float s = sin(uAngle);
316
280
  float c = cos(uAngle);
317
281
  vec2 rotated = vec2(
@@ -510,73 +474,121 @@ var waves = createEffect({
510
474
  type: "dev.remotion.effects.waves",
511
475
  label: "waves()",
512
476
  documentationLink: "https://www.remotion.dev/docs/effects/waves",
513
- backend: "webgl2",
514
477
  calculateKey: (params) => {
515
478
  const r = resolve(params);
516
479
  const maskSuffix = r.maskToSourceAlpha ? "-mask-to-source-alpha" : "";
517
480
  return `waves-${r.colors.join("|")}-${r.direction}-${r.thickness}-${r.spacing}-${r.angle}-${r.offset}-${r.amplitude}-${r.wavelength}-${r.phase}${maskSuffix}`;
518
481
  },
519
- setup: (target) => setupWaves(target),
520
- apply: ({ source, width, height, params, state, flipSourceY }) => {
521
- const r = resolve(params);
522
- const paletteDirty = updatePalette(state, r.colors);
523
- const { gl, program, sourceTexture, paletteTexture, uniforms, vao } = state;
524
- gl.viewport(0, 0, width, height);
525
- gl.bindFramebuffer(gl.FRAMEBUFFER, null);
526
- gl.clearColor(0, 0, 0, 0);
527
- gl.clear(gl.COLOR_BUFFER_BIT);
528
- gl.activeTexture(gl.TEXTURE0);
529
- gl.bindTexture(gl.TEXTURE_2D, sourceTexture);
530
- gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
531
- gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
532
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
533
- gl.activeTexture(gl.TEXTURE1);
534
- gl.bindTexture(gl.TEXTURE_2D, paletteTexture);
535
- if (paletteDirty) {
536
- gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
537
- gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
538
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, r.colors.length, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, state.palettePixelData);
539
- gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
540
- }
541
- gl.useProgram(program);
542
- if (uniforms.uSource)
543
- gl.uniform1i(uniforms.uSource, 0);
544
- if (uniforms.uPalette)
545
- gl.uniform1i(uniforms.uPalette, 1);
546
- if (uniforms.uResolution)
547
- gl.uniform2f(uniforms.uResolution, width, height);
548
- if (uniforms.uNumColors)
549
- gl.uniform1f(uniforms.uNumColors, r.colors.length);
550
- if (uniforms.uDirection)
551
- gl.uniform1i(uniforms.uDirection, r.direction === "horizontal" ? 0 : 1);
552
- if (uniforms.uThickness)
553
- gl.uniform1f(uniforms.uThickness, r.thickness);
554
- if (uniforms.uSpacing)
555
- gl.uniform1f(uniforms.uSpacing, r.spacing);
556
- if (uniforms.uAngle)
557
- gl.uniform1f(uniforms.uAngle, r.angle * Math.PI / 180);
558
- if (uniforms.uOffset)
559
- gl.uniform1f(uniforms.uOffset, r.offset);
560
- if (uniforms.uAmplitude)
561
- gl.uniform1f(uniforms.uAmplitude, r.amplitude);
562
- if (uniforms.uWavelength)
563
- gl.uniform1f(uniforms.uWavelength, r.wavelength);
564
- if (uniforms.uPhase)
565
- gl.uniform1f(uniforms.uPhase, r.phase * Math.PI / 180);
566
- if (uniforms.uMaskToSourceAlpha)
567
- gl.uniform1i(uniforms.uMaskToSourceAlpha, r.maskToSourceAlpha ? 1 : 0);
568
- gl.bindVertexArray(vao);
569
- gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
570
- gl.bindVertexArray(null);
571
- gl.bindTexture(gl.TEXTURE_2D, null);
572
- gl.useProgram(null);
573
- },
574
- cleanup: ({ gl, program, vao, vbo, sourceTexture, paletteTexture }) => {
575
- gl.deleteTexture(sourceTexture);
576
- gl.deleteTexture(paletteTexture);
577
- gl.deleteBuffer(vbo);
578
- gl.deleteProgram(program);
579
- gl.deleteVertexArray(vao);
482
+ implementations: {
483
+ webgpu: Internals.createEffectImplementation({
484
+ setup: (target) => setupWebGpuColors(target, "waves"),
485
+ apply: ({ source, width, height, params, state, gpuDevice }) => {
486
+ if (!gpuDevice)
487
+ throw new Error("A WebGPU device is required for the waves effect");
488
+ const r = resolve(params);
489
+ const colors = getWebGpuColors(state, r.colors);
490
+ const uniformData = new Float32Array([
491
+ width,
492
+ height,
493
+ r.colors.length,
494
+ r.direction === "horizontal" ? 0 : 1,
495
+ r.thickness,
496
+ r.spacing,
497
+ r.angle * Math.PI / 180,
498
+ r.offset,
499
+ r.maskToSourceAlpha ? 1 : 0,
500
+ 0,
501
+ 0,
502
+ 0,
503
+ r.amplitude,
504
+ r.wavelength,
505
+ r.phase * Math.PI / 180,
506
+ 0
507
+ ]);
508
+ applyWebGpuSinglePass({
509
+ state,
510
+ source,
511
+ width,
512
+ height,
513
+ device: gpuDevice,
514
+ shader: WAVES_WEBGPU_SHADER,
515
+ uniformData
516
+ }, {
517
+ sourceFilter: null,
518
+ auxiliaryTexture: {
519
+ data: colors,
520
+ width: r.colors.length,
521
+ height: 1,
522
+ format: "rgba8unorm"
523
+ }
524
+ });
525
+ },
526
+ cleanup: cleanupWebGpuSinglePass
527
+ }),
528
+ webgl2: Internals.createEffectImplementation({
529
+ setup: (target) => setupWaves(target),
530
+ apply: ({ source, width, height, params, state, flipSourceY }) => {
531
+ const r = resolve(params);
532
+ const paletteDirty = updatePalette(state, r.colors);
533
+ const { gl, program, sourceTexture, paletteTexture, uniforms, vao } = state;
534
+ gl.viewport(0, 0, width, height);
535
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
536
+ gl.clearColor(0, 0, 0, 0);
537
+ gl.clear(gl.COLOR_BUFFER_BIT);
538
+ gl.activeTexture(gl.TEXTURE0);
539
+ gl.bindTexture(gl.TEXTURE_2D, sourceTexture);
540
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
541
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
542
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
543
+ gl.activeTexture(gl.TEXTURE1);
544
+ gl.bindTexture(gl.TEXTURE_2D, paletteTexture);
545
+ if (paletteDirty) {
546
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
547
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
548
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, r.colors.length, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, state.palettePixelData);
549
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
550
+ }
551
+ gl.useProgram(program);
552
+ if (uniforms.uSource)
553
+ gl.uniform1i(uniforms.uSource, 0);
554
+ if (uniforms.uPalette)
555
+ gl.uniform1i(uniforms.uPalette, 1);
556
+ if (uniforms.uResolution)
557
+ gl.uniform2f(uniforms.uResolution, width, height);
558
+ if (uniforms.uNumColors)
559
+ gl.uniform1f(uniforms.uNumColors, r.colors.length);
560
+ if (uniforms.uDirection)
561
+ gl.uniform1i(uniforms.uDirection, r.direction === "horizontal" ? 0 : 1);
562
+ if (uniforms.uThickness)
563
+ gl.uniform1f(uniforms.uThickness, r.thickness);
564
+ if (uniforms.uSpacing)
565
+ gl.uniform1f(uniforms.uSpacing, r.spacing);
566
+ if (uniforms.uAngle)
567
+ gl.uniform1f(uniforms.uAngle, r.angle * Math.PI / 180);
568
+ if (uniforms.uOffset)
569
+ gl.uniform1f(uniforms.uOffset, r.offset);
570
+ if (uniforms.uAmplitude)
571
+ gl.uniform1f(uniforms.uAmplitude, r.amplitude);
572
+ if (uniforms.uWavelength)
573
+ gl.uniform1f(uniforms.uWavelength, r.wavelength);
574
+ if (uniforms.uPhase)
575
+ gl.uniform1f(uniforms.uPhase, r.phase * Math.PI / 180);
576
+ if (uniforms.uMaskToSourceAlpha)
577
+ gl.uniform1i(uniforms.uMaskToSourceAlpha, r.maskToSourceAlpha ? 1 : 0);
578
+ gl.bindVertexArray(vao);
579
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
580
+ gl.bindVertexArray(null);
581
+ gl.bindTexture(gl.TEXTURE_2D, null);
582
+ gl.useProgram(null);
583
+ },
584
+ cleanup: ({ gl, program, vao, vbo, sourceTexture, paletteTexture }) => {
585
+ gl.deleteTexture(sourceTexture);
586
+ gl.deleteTexture(paletteTexture);
587
+ gl.deleteBuffer(vbo);
588
+ gl.deleteProgram(program);
589
+ gl.deleteVertexArray(vao);
590
+ }
591
+ })
580
592
  },
581
593
  schema: wavesSchema,
582
594
  validateParams: validateWavesParams