@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/tear.mjs CHANGED
@@ -1,110 +1,58 @@
1
+ import {
2
+ setupWebGpuMesh,
3
+ cleanupWebGpuMesh,
4
+ applyWebGpuMesh
5
+ } from "./index-4scpn12x.mjs";
6
+ import {
7
+ assertOptionalFiniteNumber
8
+ } from "./index-wxhvgv2s.mjs";
9
+ import {
10
+ assertEffectParamsObject
11
+ } from "./index-4fvp93ps.mjs";
12
+
1
13
  // src/tear.ts
2
14
  import { Internals } from "remotion";
3
15
 
4
- // src/validate-effect-param.ts
5
- var assertEffectParamsObject = (params, effectLabel) => {
6
- if (params === null || typeof params !== "object") {
7
- throw new TypeError(`${effectLabel} effect requires a parameters object, but got ${JSON.stringify(params)}`);
8
- }
9
- };
10
- var assertRequiredFiniteNumber = (value, name) => {
11
- if (typeof value !== "number" || !Number.isFinite(value)) {
12
- throw new TypeError(`"${name}" must be a finite number, but got ${JSON.stringify(value)}`);
13
- }
14
- };
15
- var assertRequiredColor = (value, name) => {
16
- if (typeof value !== "string" || value.length === 0) {
17
- throw new TypeError(`"${name}" must be a non-empty string, but got ${JSON.stringify(value)}`);
18
- }
19
- };
20
- var assertOptionalColor = (value, name) => {
21
- if (value === undefined) {
22
- return;
23
- }
24
- assertRequiredColor(value, name);
25
- };
26
- var assertOptionalBoolean = (value, name) => {
27
- if (value === undefined) {
28
- return;
29
- }
30
- if (typeof value !== "boolean") {
31
- throw new TypeError(`"${name}" must be a boolean, but got ${JSON.stringify(value)}`);
32
- }
33
- };
34
-
35
- // src/color-utils.ts
36
- var DEFAULT_AMOUNT = 1;
37
- var DEFAULT_BRIGHTNESS_AMOUNT = 0;
38
- var DEFAULT_HUE_DEGREES = 0;
39
- var colorAmountSchema = {
40
- type: "number",
41
- min: 0,
42
- max: 1,
43
- step: 0.01,
44
- default: DEFAULT_AMOUNT,
45
- description: "Amount",
46
- hiddenFromList: false
47
- };
48
- var colorMultiplierSchema = {
49
- type: "number",
50
- min: 0,
51
- step: 0.01,
52
- default: DEFAULT_AMOUNT,
53
- description: "Amount",
54
- hiddenFromList: false
55
- };
56
- var brightnessAmountSchema = {
57
- type: "number",
58
- min: -1,
59
- max: 1,
60
- step: 0.01,
61
- default: DEFAULT_BRIGHTNESS_AMOUNT,
62
- description: "Amount",
63
- hiddenFromList: false
64
- };
65
- var hueDegreesSchema = {
66
- type: "rotation-degrees",
67
- step: 1,
68
- default: DEFAULT_HUE_DEGREES,
69
- description: "Degrees"
70
- };
71
- var assertOptionalFiniteNumber = (value, name) => {
72
- if (value === undefined) {
73
- return;
74
- }
75
- assertRequiredFiniteNumber(value, name);
76
- };
77
- var validateUnitInterval = (value, name) => {
78
- if (value < 0) {
79
- throw new TypeError(`"${name}" must be >= 0, but got ${JSON.stringify(value)}`);
80
- }
81
- if (value > 1) {
82
- throw new TypeError(`"${name}" must be <= 1, but got ${JSON.stringify(value)}`);
83
- }
84
- };
85
- var validateNonNegative = (value, name) => {
86
- if (value < 0) {
87
- throw new TypeError(`"${name}" must be >= 0, but got ${JSON.stringify(value)}`);
88
- }
89
- };
90
- var validateSignedUnitInterval = (value, name) => {
91
- if (value < -1) {
92
- throw new TypeError(`"${name}" must be >= -1, but got ${JSON.stringify(value)}`);
93
- }
94
- if (value > 1) {
95
- throw new TypeError(`"${name}" must be <= 1, but got ${JSON.stringify(value)}`);
96
- }
97
- };
98
- var clampColorChannel = (value) => {
99
- return Math.max(0, Math.min(255, value));
100
- };
101
- var parseColorRgba = (ctx, color) => {
102
- ctx.clearRect(0, 0, 1, 1);
103
- ctx.fillStyle = color;
104
- ctx.fillRect(0, 0, 1, 1);
105
- const { data } = ctx.getImageData(0, 0, 1, 1);
106
- return [data[0], data[1], data[2], data[3]];
107
- };
16
+ // src/tear-webgpu-shader.ts
17
+ var TEAR_WEBGPU_SHADER = `
18
+ struct Params {resolution: vec2f, angle: f32, progress: f32, rotation: f32, jaggedness: f32,}
19
+ struct VertexOutput {@builtin(position) position: vec4f, @location(0) uv: vec2f,}
20
+ @group(0) @binding(0) var sourceTexture: texture_2d<f32>;
21
+ @group(0) @binding(1) var sourceSampler: sampler;
22
+ @group(0) @binding(2) var<uniform> params: Params;
23
+ @vertex fn vertex(@builtin(vertex_index) index: u32, @builtin(instance_index) instance: u32) -> VertexOutput {
24
+ let aPos=vec2f(f32(index%2u),f32(index/2u)/192.0);
25
+ let side=select(-1.0,1.0,instance!=0u);
26
+ let direction=radians(params.angle);let dc=cos(direction);let ds=sin(direction);
27
+ let toCanvas=mat2x2f(vec2f(dc,-ds),vec2f(ds,dc));
28
+ let extent=vec2f(abs(dc)*params.resolution.x+abs(ds)*params.resolution.y,abs(ds)*params.resolution.x+abs(dc)*params.resolution.y);
29
+ let outerEdge=select(0.0,extent.x,side>=0.0);
30
+ let zigzag=1.0-4.0*abs(fract(aPos.y*6.0+0.25)-0.5);
31
+ let seam=extent.x*0.5+zigzag*min(params.jaggedness,extent.x*0.45);
32
+ let source=vec2f(mix(outerEdge,seam,aPos.x),aPos.y*extent.y);
33
+ let sourceCanvas=toCanvas*(source-extent*0.5)+params.resolution*0.5;
34
+ let tearProgress=min(params.progress,1.0);
35
+ let tipY=tearProgress*extent.y;
36
+ let pivot=vec2f(extent.x*0.5,tipY);
37
+ let fullAngle=radians(params.rotation)*tearProgress;
38
+ let bendHeight=max(extent.y*0.15,fullAngle*extent.x*1.5);
39
+ let bend=smoothstep(0.0,bendHeight,tipY-source.y);
40
+ let angle=side*fullAngle*bend;let c=cos(angle);let s=sin(angle);
41
+ let delta=source-pivot;
42
+ var position=pivot+vec2f(c*delta.x-s*delta.y,s*delta.x+c*delta.y);
43
+ position.x+=side*max(params.progress-1.0,0.0)*extent.x*0.5;
44
+ position=toCanvas*(position-extent*0.5)+params.resolution*0.5;
45
+ var output: VertexOutput;
46
+ // Mesh runtime restores orientation after resolving WebGL-compatible samples.
47
+ output.position=vec4f(position.x/params.resolution.x*2.0-1.0,position.y/params.resolution.y*2.0-1.0,0,1);
48
+ output.uv=sourceCanvas/params.resolution;
49
+ return output;
50
+ }
51
+ @fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
52
+ if (any(input.uv<vec2f(0)) || any(input.uv>vec2f(1))) {discard;}
53
+ return textureSample(sourceTexture,sourceSampler,input.uv);
54
+ }
55
+ `;
108
56
 
109
57
  // src/tear.ts
110
58
  var { createEffect, createWebGL2ContextError } = Internals;
@@ -328,61 +276,96 @@ var tear = createEffect({
328
276
  type: "dev.remotion.effects.tear",
329
277
  label: "tear()",
330
278
  documentationLink: "https://www.remotion.dev/docs/effects/tear",
331
- backend: "webgl2",
332
279
  calculateKey: (params) => {
333
280
  const r = resolve(params);
334
281
  return `tear-${r.progress}-${r.rotation}-${r.jaggedness}-${r.angle}`;
335
282
  },
336
- setup: (target) => {
337
- const gl = target.getContext("webgl2", {
338
- premultipliedAlpha: true,
339
- alpha: true,
340
- preserveDrawingBuffer: true
341
- });
342
- if (!gl) {
343
- throw createWebGL2ContextError("tear effect");
344
- }
345
- return createTearState(gl);
346
- },
347
- apply: ({ source, width, height, params, state, flipSourceY }) => {
348
- const r = resolve(params);
349
- state.gl.viewport(0, 0, width, height);
350
- state.gl.bindFramebuffer(state.gl.FRAMEBUFFER, null);
351
- state.gl.clearColor(0, 0, 0, 0);
352
- state.gl.clear(state.gl.COLOR_BUFFER_BIT);
353
- state.gl.useProgram(state.program);
354
- state.gl.bindVertexArray(state.vao);
355
- state.gl.activeTexture(state.gl.TEXTURE0);
356
- state.gl.bindTexture(state.gl.TEXTURE_2D, state.texture);
357
- state.gl.pixelStorei(state.gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
358
- state.gl.pixelStorei(state.gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
359
- state.gl.texImage2D(state.gl.TEXTURE_2D, 0, state.gl.RGBA, state.gl.RGBA, state.gl.UNSIGNED_BYTE, source);
360
- if (state.uSource)
361
- state.gl.uniform1i(state.uSource, 0);
362
- if (state.uAngle)
363
- state.gl.uniform1f(state.uAngle, r.angle % 360);
364
- if (state.uProgress)
365
- state.gl.uniform1f(state.uProgress, r.progress);
366
- if (state.uRotation)
367
- state.gl.uniform1f(state.uRotation, r.rotation);
368
- if (state.uJaggedness)
369
- state.gl.uniform1f(state.uJaggedness, r.jaggedness);
370
- if (state.uResolution)
371
- state.gl.uniform2f(state.uResolution, width, height);
372
- for (const side of [-1, 1]) {
373
- if (state.uSide)
374
- state.gl.uniform1f(state.uSide, side);
375
- state.gl.drawArrays(state.gl.TRIANGLE_STRIP, 0, (MESH_ROWS + 1) * 2);
376
- }
377
- state.gl.bindVertexArray(null);
378
- state.gl.bindTexture(state.gl.TEXTURE_2D, null);
379
- state.gl.useProgram(null);
380
- },
381
- cleanup: ({ gl, program, vao, vbo, texture }) => {
382
- gl.deleteTexture(texture);
383
- gl.deleteBuffer(vbo);
384
- gl.deleteProgram(program);
385
- gl.deleteVertexArray(vao);
283
+ implementations: {
284
+ webgpu: Internals.createEffectImplementation({
285
+ setup: (target) => setupWebGpuMesh(target, "tear"),
286
+ apply: ({ source, width, height, params, state, gpuDevice }) => {
287
+ if (!gpuDevice)
288
+ throw new Error("A WebGPU device is required for tear");
289
+ const r = resolve(params);
290
+ applyWebGpuMesh({
291
+ state,
292
+ source,
293
+ width,
294
+ height,
295
+ device: gpuDevice,
296
+ shader: TEAR_WEBGPU_SHADER,
297
+ uniformData: new Float32Array([
298
+ width,
299
+ height,
300
+ r.angle % 360,
301
+ r.progress,
302
+ r.rotation,
303
+ r.jaggedness,
304
+ 0,
305
+ 0
306
+ ]),
307
+ vertices: null,
308
+ topology: "triangle-strip",
309
+ blend: false,
310
+ vertexCount: (MESH_ROWS + 1) * 2,
311
+ instanceCount: 2
312
+ });
313
+ },
314
+ cleanup: cleanupWebGpuMesh
315
+ }),
316
+ webgl2: Internals.createEffectImplementation({
317
+ setup: (target) => {
318
+ const gl = target.getContext("webgl2", {
319
+ premultipliedAlpha: true,
320
+ alpha: true,
321
+ preserveDrawingBuffer: true
322
+ });
323
+ if (!gl) {
324
+ throw createWebGL2ContextError("tear effect");
325
+ }
326
+ return createTearState(gl);
327
+ },
328
+ apply: ({ source, width, height, params, state, flipSourceY }) => {
329
+ const r = resolve(params);
330
+ state.gl.viewport(0, 0, width, height);
331
+ state.gl.bindFramebuffer(state.gl.FRAMEBUFFER, null);
332
+ state.gl.clearColor(0, 0, 0, 0);
333
+ state.gl.clear(state.gl.COLOR_BUFFER_BIT);
334
+ state.gl.useProgram(state.program);
335
+ state.gl.bindVertexArray(state.vao);
336
+ state.gl.activeTexture(state.gl.TEXTURE0);
337
+ state.gl.bindTexture(state.gl.TEXTURE_2D, state.texture);
338
+ state.gl.pixelStorei(state.gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
339
+ state.gl.pixelStorei(state.gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
340
+ state.gl.texImage2D(state.gl.TEXTURE_2D, 0, state.gl.RGBA, state.gl.RGBA, state.gl.UNSIGNED_BYTE, source);
341
+ if (state.uSource)
342
+ state.gl.uniform1i(state.uSource, 0);
343
+ if (state.uAngle)
344
+ state.gl.uniform1f(state.uAngle, r.angle % 360);
345
+ if (state.uProgress)
346
+ state.gl.uniform1f(state.uProgress, r.progress);
347
+ if (state.uRotation)
348
+ state.gl.uniform1f(state.uRotation, r.rotation);
349
+ if (state.uJaggedness)
350
+ state.gl.uniform1f(state.uJaggedness, r.jaggedness);
351
+ if (state.uResolution)
352
+ state.gl.uniform2f(state.uResolution, width, height);
353
+ for (const side of [-1, 1]) {
354
+ if (state.uSide)
355
+ state.gl.uniform1f(state.uSide, side);
356
+ state.gl.drawArrays(state.gl.TRIANGLE_STRIP, 0, (MESH_ROWS + 1) * 2);
357
+ }
358
+ state.gl.bindVertexArray(null);
359
+ state.gl.bindTexture(state.gl.TEXTURE_2D, null);
360
+ state.gl.useProgram(null);
361
+ },
362
+ cleanup: ({ gl, program, vao, vbo, texture }) => {
363
+ gl.deleteTexture(texture);
364
+ gl.deleteBuffer(vbo);
365
+ gl.deleteProgram(program);
366
+ gl.deleteVertexArray(vao);
367
+ }
368
+ })
386
369
  },
387
370
  schema: tearSchema,
388
371
  validateParams: validateTearParams
@@ -1,114 +1,50 @@
1
+ import {
2
+ colorAmountSchema,
3
+ assertOptionalFiniteNumber,
4
+ validateUnitInterval,
5
+ parseColorRgba
6
+ } from "./index-wxhvgv2s.mjs";
7
+ import {
8
+ WEBGPU_SINGLE_PASS_VERTEX,
9
+ setupWebGpuSinglePass,
10
+ cleanupWebGpuSinglePass,
11
+ applyWebGpuSinglePass
12
+ } from "./index-tvfexb7s.mjs";
13
+ import {
14
+ assertEffectParamsObject,
15
+ assertRequiredColor
16
+ } from "./index-4fvp93ps.mjs";
17
+
1
18
  // src/thermal-vision.ts
2
19
  import { Internals } from "remotion";
3
20
 
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
- };
21
+ // src/thermal-vision-webgpu-shader.ts
22
+ var THERMAL_VISION_WEBGPU_SHADER = `
23
+ ${WEBGPU_SINGLE_PASS_VERTEX}
24
+ @group(0) @binding(0) var source: texture_2d<f32>;
25
+ @group(0) @binding(1) var sourceSampler: sampler;
26
+ @group(0) @binding(2) var<uniform> params: Params;
34
27
 
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
- };
28
+ struct Params { amount: f32, paletteLength: f32, }
29
+ @group(0) @binding(3) var palette: texture_2d<f32>;
30
+ @fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
31
+ let color=textureSampleLevel(source,sourceSampler,input.uv,0);
32
+ if(color.a<=0.001) { return vec4f(0); }
33
+ let rgb=color.rgb/color.a;
34
+ let luminance=dot(rgb,vec3f(0.299,0.587,0.114));
35
+ let position=clamp(luminance,0.0,1.0)*(max(params.paletteLength,2.0)-1.0);
36
+ let index=i32(floor(position));
37
+ let first=textureLoad(palette,vec2i(index,0),0).rgb;
38
+ let last=textureLoad(palette,vec2i(min(index+1,i32(params.paletteLength)-1),0),0).rgb;
39
+ let thermal=mix(first,last,fract(position));
40
+ return vec4f(mix(rgb,thermal,clamp(params.amount,0.0,1.0))*color.a,color.a);
41
+ }
42
+
43
+ `;
108
44
 
109
45
  // src/thermal-vision.ts
110
46
  var { createEffect, createWebGL2ContextError } = Internals;
111
- var DEFAULT_AMOUNT2 = 1;
47
+ var DEFAULT_AMOUNT = 1;
112
48
  var DEFAULT_PALETTE = [
113
49
  "#020617",
114
50
  "#1238ff",
@@ -134,7 +70,7 @@ var thermalVisionSchema = {
134
70
  }
135
71
  };
136
72
  var resolve = (p) => ({
137
- amount: p.amount ?? DEFAULT_AMOUNT2,
73
+ amount: p.amount ?? DEFAULT_AMOUNT,
138
74
  palette: p.palette ?? DEFAULT_PALETTE
139
75
  });
140
76
  var validatePalette = (palette) => {
@@ -329,9 +265,7 @@ var updatePalette = (state, palette) => {
329
265
  }
330
266
  state.cachedPaletteKey = paletteKey;
331
267
  const len = palette.length * 4;
332
- if (state.palettePixelData.length !== len) {
333
- state.palettePixelData = new Uint8Array(len);
334
- }
268
+ state.palettePixelData = new Uint8Array(len);
335
269
  const { palettePixelData } = state;
336
270
  for (let i = 0;i < palette.length; i++) {
337
271
  const color = parseColorRgba(state.colorCtx, palette[i]);
@@ -346,54 +280,103 @@ var thermalVision = createEffect({
346
280
  type: "remotion/thermal-vision",
347
281
  label: "thermalVision()",
348
282
  documentationLink: "https://www.remotion.dev/docs/effects/thermal-vision",
349
- backend: "webgl2",
350
283
  calculateKey: (params) => {
351
284
  const r = resolve(params);
352
285
  return `thermal-vision-${r.amount}-${r.palette.join("|")}`;
353
286
  },
354
- setup: (target) => setupThermalVision(target),
355
- apply: ({ source, width, height, params, state, flipSourceY }) => {
356
- const r = resolve(params);
357
- const paletteDirty = updatePalette(state, r.palette);
358
- const { gl, program, sourceTexture, paletteTexture, uniforms, vao } = state;
359
- gl.viewport(0, 0, width, height);
360
- gl.bindFramebuffer(gl.FRAMEBUFFER, null);
361
- gl.clearColor(0, 0, 0, 0);
362
- gl.clear(gl.COLOR_BUFFER_BIT);
363
- gl.activeTexture(gl.TEXTURE0);
364
- gl.bindTexture(gl.TEXTURE_2D, sourceTexture);
365
- gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
366
- gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
367
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
368
- gl.activeTexture(gl.TEXTURE1);
369
- gl.bindTexture(gl.TEXTURE_2D, paletteTexture);
370
- if (paletteDirty) {
371
- gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
372
- gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
373
- gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, r.palette.length, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, state.palettePixelData);
374
- gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
375
- }
376
- gl.useProgram(program);
377
- if (uniforms.uSource)
378
- gl.uniform1i(uniforms.uSource, 0);
379
- if (uniforms.uPalette)
380
- gl.uniform1i(uniforms.uPalette, 1);
381
- if (uniforms.uPaletteLength)
382
- gl.uniform1f(uniforms.uPaletteLength, r.palette.length);
383
- if (uniforms.uAmount)
384
- gl.uniform1f(uniforms.uAmount, r.amount);
385
- gl.bindVertexArray(vao);
386
- gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
387
- gl.bindVertexArray(null);
388
- gl.bindTexture(gl.TEXTURE_2D, null);
389
- gl.useProgram(null);
390
- },
391
- cleanup: ({ gl, program, vao, vbo, sourceTexture, paletteTexture }) => {
392
- gl.deleteTexture(sourceTexture);
393
- gl.deleteTexture(paletteTexture);
394
- gl.deleteBuffer(vbo);
395
- gl.deleteProgram(program);
396
- gl.deleteVertexArray(vao);
287
+ implementations: {
288
+ webgpu: Internals.createEffectImplementation({
289
+ setup: (target) => {
290
+ const canvas = document.createElement("canvas");
291
+ canvas.width = 1;
292
+ canvas.height = 1;
293
+ const colorCtx = canvas.getContext("2d", { willReadFrequently: true });
294
+ if (!colorCtx)
295
+ throw new Error("Failed to acquire 2D context for color parsing");
296
+ return {
297
+ ...setupWebGpuSinglePass(target, "thermal-vision"),
298
+ colorCtx,
299
+ cachedPaletteKey: "",
300
+ palettePixelData: new Uint8Array(0)
301
+ };
302
+ },
303
+ apply: ({ source, width, height, params, state, gpuDevice }) => {
304
+ if (!gpuDevice)
305
+ throw new Error("A WebGPU device is required for the thermal-vision effect");
306
+ const r = resolve(params);
307
+ const uniformData = new Float32Array([
308
+ r.amount,
309
+ r.palette.length,
310
+ 0,
311
+ 0
312
+ ]);
313
+ updatePalette(state, r.palette);
314
+ applyWebGpuSinglePass({
315
+ state,
316
+ source,
317
+ width,
318
+ height,
319
+ device: gpuDevice,
320
+ shader: THERMAL_VISION_WEBGPU_SHADER,
321
+ uniformData
322
+ }, {
323
+ sourceFilter: null,
324
+ auxiliaryTexture: {
325
+ data: state.palettePixelData,
326
+ width: r.palette.length,
327
+ height: 1,
328
+ format: "rgba8unorm"
329
+ }
330
+ });
331
+ },
332
+ cleanup: cleanupWebGpuSinglePass
333
+ }),
334
+ webgl2: Internals.createEffectImplementation({
335
+ setup: (target) => setupThermalVision(target),
336
+ apply: ({ source, width, height, params, state, flipSourceY }) => {
337
+ const r = resolve(params);
338
+ const paletteDirty = updatePalette(state, r.palette);
339
+ const { gl, program, sourceTexture, paletteTexture, uniforms, vao } = state;
340
+ gl.viewport(0, 0, width, height);
341
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
342
+ gl.clearColor(0, 0, 0, 0);
343
+ gl.clear(gl.COLOR_BUFFER_BIT);
344
+ gl.activeTexture(gl.TEXTURE0);
345
+ gl.bindTexture(gl.TEXTURE_2D, sourceTexture);
346
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
347
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, flipSourceY);
348
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
349
+ gl.activeTexture(gl.TEXTURE1);
350
+ gl.bindTexture(gl.TEXTURE_2D, paletteTexture);
351
+ if (paletteDirty) {
352
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
353
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
354
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, r.palette.length, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, state.palettePixelData);
355
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
356
+ }
357
+ gl.useProgram(program);
358
+ if (uniforms.uSource)
359
+ gl.uniform1i(uniforms.uSource, 0);
360
+ if (uniforms.uPalette)
361
+ gl.uniform1i(uniforms.uPalette, 1);
362
+ if (uniforms.uPaletteLength)
363
+ gl.uniform1f(uniforms.uPaletteLength, r.palette.length);
364
+ if (uniforms.uAmount)
365
+ gl.uniform1f(uniforms.uAmount, r.amount);
366
+ gl.bindVertexArray(vao);
367
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
368
+ gl.bindVertexArray(null);
369
+ gl.bindTexture(gl.TEXTURE_2D, null);
370
+ gl.useProgram(null);
371
+ },
372
+ cleanup: ({ gl, program, vao, vbo, sourceTexture, paletteTexture }) => {
373
+ gl.deleteTexture(sourceTexture);
374
+ gl.deleteTexture(paletteTexture);
375
+ gl.deleteBuffer(vbo);
376
+ gl.deleteProgram(program);
377
+ gl.deleteVertexArray(vao);
378
+ }
379
+ })
397
380
  },
398
381
  schema: thermalVisionSchema,
399
382
  validateParams: validateThermalVisionParams