@remotion/effects 4.0.540 → 4.0.542

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/THIRD_PARTY_LICENSES.md +10 -0
  2. package/dist/esm/lightning.mjs +603 -0
  3. package/dist/esm/magnify.mjs +403 -0
  4. package/dist/esm/preview/barrel-distortion.mjs +303 -0
  5. package/dist/esm/preview/bevel-alpha.mjs +525 -0
  6. package/dist/esm/preview/blur.mjs +435 -0
  7. package/dist/esm/preview/brightness.mjs +95 -0
  8. package/dist/esm/preview/burlap.mjs +481 -0
  9. package/dist/esm/preview/checkerboard.mjs +8 -0
  10. package/dist/esm/preview/chromatic-aberration.mjs +308 -0
  11. package/dist/esm/preview/color-correction.mjs +522 -0
  12. package/dist/esm/preview/color-key.mjs +440 -0
  13. package/dist/esm/preview/contour-lines.mjs +608 -0
  14. package/dist/esm/preview/contrast.mjs +95 -0
  15. package/dist/esm/preview/corner-pin.mjs +6 -0
  16. package/dist/esm/preview/curves.mjs +357 -0
  17. package/dist/esm/preview/cylinder.mjs +273 -0
  18. package/dist/esm/preview/dot-grid.mjs +333 -0
  19. package/dist/esm/preview/drop-shadow.mjs +607 -0
  20. package/dist/esm/preview/duotone.mjs +344 -0
  21. package/dist/esm/preview/emboss.mjs +479 -0
  22. package/dist/esm/preview/evolve.mjs +485 -0
  23. package/dist/esm/preview/exposure.mjs +264 -0
  24. package/dist/esm/preview/film-burn.mjs +298 -0
  25. package/dist/esm/preview/fisheye.mjs +422 -0
  26. package/dist/esm/preview/flannel.mjs +401 -0
  27. package/dist/esm/preview/fractal-noise.mjs +642 -0
  28. package/dist/esm/preview/glow.mjs +598 -0
  29. package/dist/esm/preview/grayscale.mjs +86 -0
  30. package/dist/esm/preview/gridlines.mjs +8 -0
  31. package/dist/esm/preview/halftone-linear-gradient.mjs +523 -0
  32. package/dist/esm/preview/halftone.mjs +552 -0
  33. package/dist/esm/preview/hue.mjs +83 -0
  34. package/dist/esm/preview/index-00v3hr66.mjs +299 -0
  35. package/dist/esm/preview/index-0w4eqht8.mjs +351 -0
  36. package/dist/esm/preview/index-18y0zcy2.mjs +440 -0
  37. package/dist/esm/preview/index-1m1b1ad7.mjs +520 -0
  38. package/dist/esm/preview/index-34fxm3ax.mjs +518 -0
  39. package/dist/esm/preview/index-4fvp93ps.mjs +32 -0
  40. package/dist/esm/preview/index-4scpn12x.mjs +224 -0
  41. package/dist/esm/preview/index-4z6pt3ka.mjs +104 -0
  42. package/dist/esm/preview/index-618ky75w.mjs +51 -0
  43. package/dist/esm/preview/index-6agxdrvr.mjs +411 -0
  44. package/dist/esm/preview/index-6jkps947.mjs +120 -0
  45. package/dist/esm/preview/index-8agtsbw4.mjs +617 -0
  46. package/dist/esm/preview/index-8jx11jyn.mjs +29 -0
  47. package/dist/esm/preview/index-8p04sssx.mjs +123 -0
  48. package/dist/esm/preview/index-afdtmrh2.mjs +596 -0
  49. package/dist/esm/preview/index-b86qstcs.mjs +18 -0
  50. package/dist/esm/preview/index-cb77qg3g.mjs +587 -0
  51. package/dist/esm/preview/index-cdp7tr8x.mjs +122 -0
  52. package/dist/esm/preview/index-evy8hyah.mjs +55 -0
  53. package/dist/esm/preview/index-gnsce796.mjs +6 -0
  54. package/dist/esm/preview/index-kkvzt8b7.mjs +199 -0
  55. package/dist/esm/preview/index-r0v18b2n.mjs +425 -0
  56. package/dist/esm/preview/index-rswpzmm5.mjs +926 -0
  57. package/dist/esm/preview/index-s9mrx750.mjs +97 -0
  58. package/dist/esm/preview/index-tvfexb7s.mjs +164 -0
  59. package/dist/esm/preview/index-vp56k1gj.mjs +215 -0
  60. package/dist/esm/preview/index-wxhvgv2s.mjs +79 -0
  61. package/dist/esm/preview/index-wy95a41r.mjs +407 -0
  62. package/dist/esm/preview/index-ysnwfc4t.mjs +306 -0
  63. package/dist/esm/preview/index.mjs +51 -0
  64. package/dist/esm/preview/invert.mjs +84 -0
  65. package/dist/esm/preview/iris-wipe.mjs +315 -0
  66. package/dist/esm/preview/lens-blur.mjs +563 -0
  67. package/dist/esm/preview/levels.mjs +400 -0
  68. package/dist/esm/preview/light-leak.mjs +8 -0
  69. package/dist/esm/preview/light-trail.mjs +516 -0
  70. package/dist/esm/preview/lightning.mjs +603 -0
  71. package/dist/esm/preview/linear-gradient-tint.mjs +6 -0
  72. package/dist/esm/preview/linear-gradient.mjs +6 -0
  73. package/dist/esm/preview/linear-progressive-blur.mjs +516 -0
  74. package/dist/esm/preview/linear-progressive-pixelate.mjs +176 -0
  75. package/dist/esm/preview/lines.mjs +536 -0
  76. package/dist/esm/preview/liquid-contours.mjs +512 -0
  77. package/dist/esm/preview/long-shadows.mjs +437 -0
  78. package/dist/esm/preview/lut.mjs +601 -0
  79. package/dist/esm/preview/magnify.mjs +403 -0
  80. package/dist/esm/preview/mirror.mjs +341 -0
  81. package/dist/esm/preview/noise-displacement.mjs +584 -0
  82. package/dist/esm/preview/noise.mjs +318 -0
  83. package/dist/esm/preview/outline.mjs +725 -0
  84. package/dist/esm/preview/page-turn.mjs +302 -0
  85. package/dist/esm/preview/paper.mjs +1249 -0
  86. package/dist/esm/preview/pattern.mjs +6 -0
  87. package/dist/esm/preview/pixel-dissolve.mjs +360 -0
  88. package/dist/esm/preview/pixelate.mjs +249 -0
  89. package/dist/esm/preview/radial-progressive-blur.mjs +582 -0
  90. package/dist/esm/preview/radial-progressive-pixelate.mjs +220 -0
  91. package/dist/esm/preview/radial-wipe.mjs +224 -0
  92. package/dist/esm/preview/rain-fall.mjs +114 -0
  93. package/dist/esm/preview/region-blur.mjs +500 -0
  94. package/dist/esm/preview/rings.mjs +8 -0
  95. package/dist/esm/preview/roughen-edges.mjs +590 -0
  96. package/dist/esm/preview/saturation.mjs +86 -0
  97. package/dist/esm/preview/scale.mjs +109 -0
  98. package/dist/esm/preview/scanlines.mjs +362 -0
  99. package/dist/esm/preview/shadows-highlights.mjs +284 -0
  100. package/dist/esm/preview/shatter.mjs +868 -0
  101. package/dist/esm/preview/shine.mjs +368 -0
  102. package/dist/esm/preview/shrinkwrap.mjs +769 -0
  103. package/dist/esm/preview/skew.mjs +300 -0
  104. package/dist/esm/preview/snow-fall.mjs +170 -0
  105. package/dist/esm/preview/speckle.mjs +356 -0
  106. package/dist/esm/preview/sphere.mjs +252 -0
  107. package/dist/esm/preview/starburst.mjs +8 -0
  108. package/dist/esm/preview/tear.mjs +375 -0
  109. package/dist/esm/preview/thermal-vision.mjs +387 -0
  110. package/dist/esm/preview/tile.mjs +7 -0
  111. package/dist/esm/preview/tint.mjs +125 -0
  112. package/dist/esm/preview/translate.mjs +151 -0
  113. package/dist/esm/preview/turbulent-displace.mjs +613 -0
  114. package/dist/esm/preview/tv-signal-off.mjs +308 -0
  115. package/dist/esm/preview/venetian-blinds.mjs +341 -0
  116. package/dist/esm/preview/vibrance.mjs +254 -0
  117. package/dist/esm/preview/vignette.mjs +458 -0
  118. package/dist/esm/preview/wave.mjs +384 -0
  119. package/dist/esm/preview/waves.mjs +599 -0
  120. package/dist/esm/preview/white-balance.mjs +280 -0
  121. package/dist/esm/preview/white-noise.mjs +244 -0
  122. package/dist/esm/preview/zigzag.mjs +8 -0
  123. package/dist/esm/preview/zoom-blur.mjs +389 -0
  124. package/dist/lightning/geometry.d.ts +10 -0
  125. package/dist/lightning/index.d.ts +4 -0
  126. package/dist/lightning/mask.d.ts +2 -0
  127. package/dist/lightning/params.d.ts +259 -0
  128. package/dist/lightning/shaders.d.ts +2 -0
  129. package/dist/lightning.d.ts +2 -0
  130. package/dist/magnify/shader.d.ts +1 -0
  131. package/dist/magnify/webgpu-shader.d.ts +1 -0
  132. package/dist/magnify.d.ts +28 -0
  133. package/package.json +30 -6
@@ -0,0 +1,224 @@
1
+ import {
2
+ WEBGPU_SINGLE_PASS_VERTEX
3
+ } from "./index-tvfexb7s.mjs";
4
+
5
+ // src/webgpu-mesh-runtime.ts
6
+ var setupWebGpuMesh = (target, label) => {
7
+ const context = target.getContext("webgpu");
8
+ if (!context)
9
+ throw new Error(`WebGPU is not available for the ${label} effect`);
10
+ return { context, label, resources: null };
11
+ };
12
+ var cleanupWebGpuMesh = (state) => {
13
+ state.resources?.uniforms.destroy();
14
+ state.resources?.multisample?.texture.destroy();
15
+ state.resources?.multisample?.resolved.destroy();
16
+ state.resources?.vertices?.buffer.destroy();
17
+ state.resources?.source?.texture.destroy();
18
+ state.resources = null;
19
+ state.context.unconfigure();
20
+ };
21
+ var applyWebGpuMesh = ({
22
+ state,
23
+ source,
24
+ width,
25
+ height,
26
+ vertices,
27
+ device,
28
+ shader,
29
+ uniformData,
30
+ topology,
31
+ blend,
32
+ vertexCount,
33
+ instanceCount
34
+ }) => {
35
+ const uniformSize = Math.max(16, Math.ceil(uniformData.byteLength / 16) * 16);
36
+ if (state.resources && (state.resources.device !== device || state.resources.shader !== shader || state.resources.uniformSize !== uniformSize || state.resources.topology !== topology || state.resources.blend !== blend))
37
+ cleanupWebGpuMesh(state);
38
+ if (!state.resources) {
39
+ const format = navigator.gpu.getPreferredCanvasFormat();
40
+ state.context.configure({ device, format, alphaMode: "premultiplied" });
41
+ const module = device.createShaderModule({
42
+ code: shader,
43
+ label: state.label
44
+ });
45
+ const blendComponent = {
46
+ srcFactor: "one",
47
+ dstFactor: "one-minus-src-alpha",
48
+ operation: "add"
49
+ };
50
+ const pipeline = device.createRenderPipeline({
51
+ label: state.label,
52
+ layout: device.createPipelineLayout({
53
+ bindGroupLayouts: [
54
+ device.createBindGroupLayout({
55
+ entries: [
56
+ { binding: 0, visibility: GPUShaderStage.FRAGMENT, texture: {} },
57
+ { binding: 1, visibility: GPUShaderStage.FRAGMENT, sampler: {} },
58
+ {
59
+ binding: 2,
60
+ visibility: GPUShaderStage.VERTEX,
61
+ buffer: { type: "uniform" }
62
+ },
63
+ {
64
+ binding: 3,
65
+ visibility: GPUShaderStage.VERTEX,
66
+ buffer: { type: "read-only-storage" }
67
+ }
68
+ ]
69
+ })
70
+ ]
71
+ }),
72
+ vertex: { module, entryPoint: "vertex" },
73
+ fragment: {
74
+ module,
75
+ entryPoint: "fragment",
76
+ targets: [
77
+ {
78
+ format,
79
+ ...blend ? { blend: { color: blendComponent, alpha: blendComponent } } : {}
80
+ }
81
+ ]
82
+ },
83
+ primitive: { topology },
84
+ multisample: { count: 4 }
85
+ });
86
+ const flipModule = device.createShaderModule({
87
+ code: `${WEBGPU_SINGLE_PASS_VERTEX}
88
+ @group(0) @binding(0) var source: texture_2d<f32>;
89
+ @group(0) @binding(1) var sourceSampler: sampler;
90
+ @fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
91
+ return textureSampleLevel(source,sourceSampler,vec2f(input.uv.x,1.0-input.uv.y),0);
92
+ }`
93
+ });
94
+ const flipPipeline = device.createRenderPipeline({
95
+ layout: "auto",
96
+ vertex: { module: flipModule, entryPoint: "vertex" },
97
+ fragment: {
98
+ module: flipModule,
99
+ entryPoint: "fragment",
100
+ targets: [{ format }]
101
+ },
102
+ primitive: { topology: "triangle-list" }
103
+ });
104
+ state.resources = {
105
+ device,
106
+ shader,
107
+ uniformSize,
108
+ topology,
109
+ blend,
110
+ pipeline,
111
+ flipPipeline,
112
+ sampler: device.createSampler({ magFilter: "linear", minFilter: "linear" }),
113
+ uniforms: device.createBuffer({
114
+ size: uniformSize,
115
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST
116
+ }),
117
+ vertices: null,
118
+ multisample: null,
119
+ source: null
120
+ };
121
+ }
122
+ const r = state.resources;
123
+ const sourceWidth = "displayWidth" in source ? source.displayWidth : ("videoWidth" in source) ? source.videoWidth : ("naturalWidth" in source) ? source.naturalWidth : typeof source.width === "number" ? source.width : source.width.baseVal.value;
124
+ const sourceHeight = "displayHeight" in source ? source.displayHeight : ("videoHeight" in source) ? source.videoHeight : ("naturalHeight" in source) ? source.naturalHeight : typeof source.height === "number" ? source.height : source.height.baseVal.value;
125
+ if (r.source && (r.source.width !== sourceWidth || r.source.height !== sourceHeight)) {
126
+ r.source.texture.destroy();
127
+ r.source = null;
128
+ }
129
+ if (!r.source)
130
+ r.source = {
131
+ width: sourceWidth,
132
+ height: sourceHeight,
133
+ texture: device.createTexture({
134
+ size: [sourceWidth, sourceHeight],
135
+ format: "rgba8unorm",
136
+ usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT
137
+ })
138
+ };
139
+ device.queue.copyExternalImageToTexture({ source }, { texture: r.source.texture, premultipliedAlpha: true }, [sourceWidth, sourceHeight]);
140
+ const size = Math.max(4, vertices?.byteLength ?? 0);
141
+ if (!r.vertices || r.vertices.size < size) {
142
+ r.vertices?.buffer.destroy();
143
+ r.vertices = {
144
+ size,
145
+ buffer: device.createBuffer({
146
+ size,
147
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST
148
+ })
149
+ };
150
+ }
151
+ if (vertices)
152
+ device.queue.writeBuffer(r.vertices.buffer, 0, vertices.buffer, vertices.byteOffset, vertices.byteLength);
153
+ device.queue.writeBuffer(r.uniforms, 0, uniformData);
154
+ const bindGroup = device.createBindGroup({
155
+ layout: r.pipeline.getBindGroupLayout(0),
156
+ entries: [
157
+ { binding: 0, resource: r.source.texture.createView() },
158
+ { binding: 1, resource: r.sampler },
159
+ { binding: 2, resource: { buffer: r.uniforms } },
160
+ { binding: 3, resource: { buffer: r.vertices.buffer } }
161
+ ]
162
+ });
163
+ if (r.multisample && (r.multisample.width !== width || r.multisample.height !== height)) {
164
+ r.multisample.texture.destroy();
165
+ r.multisample.resolved.destroy();
166
+ r.multisample = null;
167
+ }
168
+ if (!r.multisample)
169
+ r.multisample = {
170
+ width,
171
+ height,
172
+ resolved: device.createTexture({
173
+ size: [width, height],
174
+ format: navigator.gpu.getPreferredCanvasFormat(),
175
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
176
+ }),
177
+ texture: device.createTexture({
178
+ size: [width, height],
179
+ format: navigator.gpu.getPreferredCanvasFormat(),
180
+ sampleCount: 4,
181
+ usage: GPUTextureUsage.RENDER_ATTACHMENT
182
+ })
183
+ };
184
+ const encoder = device.createCommandEncoder();
185
+ const pass = encoder.beginRenderPass({
186
+ colorAttachments: [
187
+ {
188
+ view: r.multisample.texture.createView(),
189
+ resolveTarget: r.multisample.resolved.createView(),
190
+ clearValue: { r: 0, g: 0, b: 0, a: 0 },
191
+ loadOp: "clear",
192
+ storeOp: "store"
193
+ }
194
+ ]
195
+ });
196
+ pass.setPipeline(r.pipeline);
197
+ pass.setBindGroup(0, bindGroup);
198
+ pass.draw(vertexCount, instanceCount);
199
+ pass.end();
200
+ const flipGroup = device.createBindGroup({
201
+ layout: r.flipPipeline.getBindGroupLayout(0),
202
+ entries: [
203
+ { binding: 0, resource: r.multisample.resolved.createView() },
204
+ { binding: 1, resource: r.sampler }
205
+ ]
206
+ });
207
+ const flipPass = encoder.beginRenderPass({
208
+ colorAttachments: [
209
+ {
210
+ view: state.context.getCurrentTexture().createView(),
211
+ clearValue: { r: 0, g: 0, b: 0, a: 0 },
212
+ loadOp: "clear",
213
+ storeOp: "store"
214
+ }
215
+ ]
216
+ });
217
+ flipPass.setPipeline(r.flipPipeline);
218
+ flipPass.setBindGroup(0, flipGroup);
219
+ flipPass.draw(3);
220
+ flipPass.end();
221
+ device.queue.submit([encoder.finish()]);
222
+ };
223
+
224
+ export { setupWebGpuMesh, cleanupWebGpuMesh, applyWebGpuMesh };
@@ -0,0 +1,104 @@
1
+ // src/value-noise-shader.ts
2
+ var VALUE_NOISE_SHADER = `
3
+ float lattice(ivec3 point, uint seed) {
4
+ // Wrap lattice indices as well as coordinates so interpolation stays continuous
5
+ // across the period boundary, including negative coordinates.
6
+ uvec3 p = uvec3(point) & uvec3(65535u);
7
+ uint h = p.x * 0x27d4eb2du ^ p.y * 0x165667b1u ^ p.z * 0x9e3779b9u ^ seed * 0x85ebca6bu;
8
+ h ^= h >> 15;
9
+ h *= 0x2c1b3c6du;
10
+ h ^= h >> 12;
11
+ h *= 0x297a2d39u;
12
+ h ^= h >> 15;
13
+ return float(h & 65535u) / 65535.0;
14
+ }
15
+
16
+ float catmull(vec4 p, float t) {
17
+ return 0.5 * (2.0 * p.y + (p.z - p.x) * t
18
+ + (2.0 * p.x - 5.0 * p.y + 4.0 * p.z - p.w) * t * t
19
+ + (3.0 * p.y - p.x - 3.0 * p.z + p.w) * t * t * t);
20
+ }
21
+
22
+ vec3 bspline(float t) {
23
+ return vec3(0.5 * (1.0-t) * (1.0-t), 0.5 + t * (1.0-t), 0.5 * t * t);
24
+ }
25
+
26
+ float sliceNoise(ivec3 p, vec2 t, uint seed) {
27
+ if (uNoiseType == 0) return lattice(p, seed);
28
+ if (uNoiseType == 1) {
29
+ return mix(mix(lattice(p, seed), lattice(p + ivec3(1,0,0), seed), t.x),
30
+ mix(lattice(p + ivec3(0,1,0), seed), lattice(p + ivec3(1,1,0), seed), t.x), t.y);
31
+ }
32
+ if (uNoiseType == 2) {
33
+ vec3 wx = bspline(t.x);
34
+ vec3 wy = bspline(t.y);
35
+ float result = 0.0;
36
+ for (int y = 0; y < 3; y++) {
37
+ for (int x = 0; x < 3; x++) {
38
+ result += wx[x] * wy[y] * lattice(p + ivec3(x-1, y-1, 0), seed);
39
+ }
40
+ }
41
+ return result;
42
+ }
43
+ vec4 rows;
44
+ for (int y = 0; y < 4; y++) {
45
+ vec4 row;
46
+ for (int x = 0; x < 4; x++) {
47
+ row[x] = lattice(p + ivec3(x-1, y-1, 0), seed);
48
+ }
49
+ rows[y] = catmull(row, t.x);
50
+ }
51
+ return catmull(rows, t.y);
52
+ }
53
+
54
+ float valueNoise(vec3 point, uint seed) {
55
+ // A large period keeps conversion to integer coordinates defined at extreme scales.
56
+ vec3 p = mod(point + vec3(uNoiseType == 2 ? 0.5 : 0.0, uNoiseType == 2 ? 0.5 : 0.0, 0.0), 65536.0);
57
+ ivec3 cell = ivec3(floor(p));
58
+ vec3 t = fract(p);
59
+ float fz = t.z * t.z * t.z * (t.z * (t.z * 6.0 - 15.0) + 10.0);
60
+ float n = mix(sliceNoise(cell, t.xy, seed), sliceNoise(cell + ivec3(0,0,1), t.xy, seed), fz);
61
+ return uNoiseType == 2 ? 0.5 + (n - 0.5) * (181.0 / 231.0) / 0.55 : n;
62
+ }
63
+ `;
64
+
65
+ // src/value-noise-webgpu-shader.ts
66
+ var VALUE_NOISE_WEBGPU_SHADER = `
67
+ fn lattice(point: vec3i, seed: u32) -> f32 {
68
+ let p = bitcast<vec3u>(point) & vec3u(65535u);
69
+ var h = (p.x*0x27d4eb2du) ^ (p.y*0x165667b1u) ^ (p.z*0x9e3779b9u) ^ (seed*0x85ebca6bu);
70
+ h ^= h >> 15u; h *= 0x2c1b3c6du; h ^= h >> 12u; h *= 0x297a2d39u; h ^= h >> 15u;
71
+ return f32(h & 65535u)/65535.0;
72
+ }
73
+ fn catmull(p: vec4f, t: f32) -> f32 {
74
+ return 0.5*(2.0*p.y+(p.z-p.x)*t+(2.0*p.x-5.0*p.y+4.0*p.z-p.w)*t*t+(3.0*p.y-p.x-3.0*p.z+p.w)*t*t*t);
75
+ }
76
+ fn bspline(t: f32) -> vec3f { return vec3f(0.5*(1.0-t)*(1.0-t),0.5+t*(1.0-t),0.5*t*t); }
77
+ fn sliceNoise(p: vec3i,t: vec2f,seed: u32) -> f32 {
78
+ if(noiseType()==0) { return lattice(p,seed); }
79
+ if(noiseType()==1) { return mix(mix(lattice(p,seed),lattice(p+vec3i(1,0,0),seed),t.x),mix(lattice(p+vec3i(0,1,0),seed),lattice(p+vec3i(1,1,0),seed),t.x),t.y); }
80
+ if(noiseType()==2) {
81
+ let wx=bspline(t.x); let wy=bspline(t.y); var result=0.0;
82
+ for(var y=0;y<3;y++) { for(var x=0;x<3;x++) { result += wx[x]*wy[y]*lattice(p+vec3i(x-1,y-1,0),seed); } }
83
+ return result;
84
+ }
85
+ var rows: vec4f;
86
+ for(var y=0;y<4;y++) {
87
+ var row: vec4f;
88
+ for(var x=0;x<4;x++) { row[x]=lattice(p+vec3i(x-1,y-1,0),seed); }
89
+ rows[y]=catmull(row,t.x);
90
+ }
91
+ return catmull(rows,t.y);
92
+ }
93
+ fn valueNoise(point: vec3f,seed: u32) -> f32 {
94
+ let offset=select(0.0,0.5,noiseType()==2);
95
+ let shifted=point+vec3f(offset,offset,0.0);
96
+ let p=shifted-floor(shifted/65536.0)*65536.0;
97
+ let cell=vec3i(floor(p)); let t=fract(p);
98
+ let fz=t.z*t.z*t.z*(t.z*(t.z*6.0-15.0)+10.0);
99
+ let n=mix(sliceNoise(cell,t.xy,seed),sliceNoise(cell+vec3i(0,0,1),t.xy,seed),fz);
100
+ return select(n,0.5+(n-0.5)*(181.0/231.0)/0.55,noiseType()==2);
101
+ }
102
+ `;
103
+
104
+ export { VALUE_NOISE_SHADER, VALUE_NOISE_WEBGPU_SHADER };
@@ -0,0 +1,51 @@
1
+ import {
2
+ WEBGPU_MULTIPASS_BINDINGS
3
+ } from "./index-kkvzt8b7.mjs";
4
+
5
+ // src/gaussian-blur-webgpu-shader.ts
6
+ var GAUSSIAN_BLUR_WEBGPU_SHADER = `
7
+ ${WEBGPU_MULTIPASS_BINDINGS}
8
+ struct Params { resolution: vec2f, direction: vec2f, values: vec4f, startEnd: vec4f, radial: vec4f, }
9
+ fn radiusAt(uv: vec2f) -> f32 {
10
+ let mode = params.values.y;
11
+ if (mode == 0.0) {return params.values.x;}
12
+ if (mode == 1.0) {
13
+ let gradient = params.startEnd.zw - params.startEnd.xy;
14
+ let lengthSq = dot(gradient, gradient);
15
+ if (lengthSq <= 0.0000001) {return max(0.0, params.values.z);}
16
+ let progress = clamp(dot(uv - params.startEnd.xy, gradient) / lengthSq, 0.0, 1.0);
17
+ return max(0.0, mix(params.values.z, params.values.w, progress));
18
+ }
19
+ let radii = params.startEnd.zw * params.resolution * 0.5;
20
+ if (radii.x <= 0.0000001 || radii.y <= 0.0000001) {return max(0.0, params.values.z);}
21
+ let delta = (uv - params.startEnd.xy) * params.resolution;
22
+ let angle = radians(params.radial.x);
23
+ let c = cos(angle); let s = sin(angle);
24
+ let local = vec2f(c * delta.x + s * delta.y, -s * delta.x + c * delta.y);
25
+ let ellipseProgress = clamp(length(local / radii), 0.0, 1.0);
26
+ let distance = 1.0 - params.radial.y;
27
+ var progress = step(params.radial.y, ellipseProgress);
28
+ if (abs(distance) > 0.0000001) {progress = clamp((ellipseProgress - params.radial.y) / distance, 0.0, 1.0);}
29
+ return max(0.0, mix(params.values.z, params.values.w, progress));
30
+ }
31
+ @fragment fn fragment(input: VertexOutput) -> @location(0) vec4f {
32
+ let radius = radiusAt(input.uv);
33
+ if (radius <= 0.0) {return textureSampleLevel(source, sourceSampler, input.uv, 0);}
34
+ let halfKernel = i32(clamp(ceil(radius / 2.0), 4.0, 32.0));
35
+ let stride = radius / f32(halfKernel);
36
+ let sigma = select(max(radius / 3.0, 0.0001), radius / 3.0, params.values.y == 0.0);
37
+ let twoSigmaSq = 2.0 * sigma * sigma;
38
+ var sum = vec4f(0); var weightSum = 0.0;
39
+ for (var i = -32; i <= 32; i++) {
40
+ if (abs(i) > halfKernel) {continue;}
41
+ let offset = f32(i) * stride;
42
+ let weight = exp(-(offset * offset) / twoSigmaSq);
43
+ let uv = input.uv + params.direction / params.resolution * offset;
44
+ sum += textureSampleLevel(source, sourceSampler, uv, 0) * weight;
45
+ weightSum += weight;
46
+ }
47
+ return sum / weightSum;
48
+ }
49
+ `;
50
+
51
+ export { GAUSSIAN_BLUR_WEBGPU_SHADER };