@nodetool-ai/gpu 0.8.2 → 0.8.4-a13.1

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.
@@ -1 +1 @@
1
- 2026-10-12T08:37:05.790Z
1
+ 2026-10-15T22:44:13.727Z
@@ -25,6 +25,21 @@ export interface InverseAffine {
25
25
  r?: number;
26
26
  }
27
27
  export type CompositorFilter = "nearest" | "linear";
28
+ /** A rectangle of whole pixels on a texture. */
29
+ export interface PixelRect {
30
+ x: number;
31
+ y: number;
32
+ width: number;
33
+ height: number;
34
+ }
35
+ /**
36
+ * The pixels of a `canvasWidth × canvasHeight` target that a `sourceWidth ×
37
+ * sourceHeight` layer placed by `inv` can touch: its quad's bounding box,
38
+ * grown a pixel for filtering and clamped to the target. Null when the quad
39
+ * misses the target. Answers the whole target when the quad cannot be bounded
40
+ * — a perspective whose horizon crosses it.
41
+ */
42
+ export declare function placedLayerRect(inv: InverseAffine, sourceWidth: number, sourceHeight: number, canvasWidth: number, canvasHeight: number): PixelRect | null;
28
43
  export interface BlendPassParams {
29
44
  /** Layer source texture. */
30
45
  source: GPUTexture;
@@ -105,6 +120,19 @@ export declare class WebGPULayerCompositor {
105
120
  * layer source, writes the blended result to `writeTex` (full-screen).
106
121
  */
107
122
  renderBlendPass(encoder: GPUCommandEncoder, readTex: GPUTexture, writeTex: GPUTexture, params: BlendPassParams): void;
123
+ /**
124
+ * Composite one layer onto `accumTex` in place, touching only `rect`.
125
+ *
126
+ * A layer that covers a small part of the frame need not rewrite the rest:
127
+ * the destination pixels under `rect` are copied to `scratchTex`, and the
128
+ * blend reads them there and writes over `accumTex` with a scissor, leaving
129
+ * every other pixel as it was. Outside the layer's quad the blend shader
130
+ * returns the destination unchanged, so the result is the full-frame pass's
131
+ * whenever `rect` covers the quad. The accumulation stays in `accumTex`; no
132
+ * swap. Both textures must allow copies (the ping-pong pair does).
133
+ */
134
+ renderBlendPassInRect(encoder: GPUCommandEncoder, accumTex: GPUTexture, scratchTex: GPUTexture, params: BlendPassParams, rect: PixelRect): void;
135
+ private encodeBlendPass;
108
136
  /** Present `srcTex` to a target view (swap chain or other attachment). */
109
137
  blit(encoder: GPUCommandEncoder, srcTex: GPUTexture, targetView: GPUTextureView): void;
110
138
  dispose(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"compositor.d.ts","sourceRoot":"","sources":["../../src/compositor/compositor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compositor.d.ts","sourceRoot":"","sources":["../../src/compositor/compositor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAwCH,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEpD,gDAAgD;AAChD,MAAM,WAAW,SAAS;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,aAAa,EAClB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,SAAS,GAAG,IAAI,CAkClB;AAED,MAAM,WAAW,eAAe;IAC9B,4BAA4B;IAC5B,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,aAAa,CAAC;IACzB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,IAAI,CAAC,EAAE;QACL,6EAA6E;QAC7E,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpB,4CAA4C;QAC5C,QAAQ,EAAE,MAAM,CAAC;QACjB,0EAA0E;QAC1E,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,IAAI,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C;AAWD;;;;;;;;;GASG;AACH,wBAAgB,gCAAgC,CAC9C,CAAC,EAAE,YAAY,GAAG,MAAM,EAAE,EAC1B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,aAAa,CAMf;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,EAAE,YAAY,GAAG,MAAM,EAAE,EAC1B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,aAAa,GAAG,IAAI,CA2FtB;AAKD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;IAEhC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAqB;IAC1D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAqB;IACzD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,SAAS,CAA2B;IAC5C,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,QAAQ,CAAK;IAMrB,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,SAAS,CAAK;IAEtB,YACE,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,EACxB,MAAM,GAAE,gBAA4B,EACpC,KAAK,SAAqB,EAwD3B;IAED,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,uEAAuE;IACvE,IAAI,QAAQ,IAAI,UAAU,GAAG,IAAI,CAEhC;IAED,IAAI,QAAQ,IAAI,UAAU,GAAG,IAAI,CAEhC;IAED,wEAAwE;IACxE,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA2B9C;IAED;;;OAGG;IACH,UAAU,IAAI,IAAI,CAEjB;IAED;;;OAGG;IACH,eAAe,CACb,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,UAAU,EACpB,MAAM,EAAE,eAAe,GACtB,IAAI,CAEN;IAED;;;;;;;;;;OAUG;IACH,qBAAqB,CACnB,OAAO,EAAE,iBAAiB,EAC1B,QAAQ,EAAE,UAAU,EACpB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,SAAS,GACd,IAAI,CAON;IAED,OAAO,CAAC,eAAe;IA2DvB,0EAA0E;IAC1E,IAAI,CACF,OAAO,EAAE,iBAAiB,EAC1B,MAAM,EAAE,UAAU,EAClB,UAAU,EAAE,cAAc,GACzB,IAAI,CAcN;IAED,OAAO,IAAI,IAAI,CAUd;CACF"}
@@ -39,6 +39,57 @@ const blendLayout = tgpu.bindGroupLayout({
39
39
  const blitLayout = tgpu.bindGroupLayout({
40
40
  blitTexture: { texture: "float" }
41
41
  });
42
+ /**
43
+ * The pixels of a `canvasWidth × canvasHeight` target that a `sourceWidth ×
44
+ * sourceHeight` layer placed by `inv` can touch: its quad's bounding box,
45
+ * grown a pixel for filtering and clamped to the target. Null when the quad
46
+ * misses the target. Answers the whole target when the quad cannot be bounded
47
+ * — a perspective whose horizon crosses it.
48
+ */
49
+ export function placedLayerRect(inv, sourceWidth, sourceHeight, canvasWidth, canvasHeight) {
50
+ const whole = { x: 0, y: 0, width: canvasWidth, height: canvasHeight };
51
+ // `inv` maps a screen pixel (x, y, 1) to a texel by the homogeneous matrix
52
+ // [[a, b, tx], [c, d, ty], [p, q, r]]; its inverse places each corner.
53
+ const a = inv.a, b = inv.b, c = inv.tx;
54
+ const d = inv.c, e = inv.d, f = inv.ty;
55
+ const g = inv.p ?? 0, h = inv.q ?? 0, i = inv.r ?? 1;
56
+ const det = a * (e * i - f * h) - b * (d * i - f * g) + c * (d * h - e * g);
57
+ if (!Number.isFinite(det) || Math.abs(det) < 1e-12)
58
+ return whole;
59
+ const m00 = (e * i - f * h) / det, m01 = (c * h - b * i) / det, m02 = (b * f - c * e) / det;
60
+ const m10 = (f * g - d * i) / det, m11 = (a * i - c * g) / det, m12 = (c * d - a * f) / det;
61
+ const m20 = (d * h - e * g) / det, m21 = (b * g - a * h) / det, m22 = (a * e - b * d) / det;
62
+ let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;
63
+ let sign = 0;
64
+ for (const [u, v] of [[0, 0], [sourceWidth, 0], [0, sourceHeight], [sourceWidth, sourceHeight]]) {
65
+ const w = m20 * u + m21 * v + m22;
66
+ // Corners on both sides of the eye put the horizon inside the quad, and
67
+ // nothing short of the whole target bounds it.
68
+ if (!(Math.abs(w) > 1e-12))
69
+ return whole;
70
+ if (sign === 0)
71
+ sign = Math.sign(w);
72
+ else if (Math.sign(w) !== sign)
73
+ return whole;
74
+ const x = (m00 * u + m01 * v + m02) / w;
75
+ const y = (m10 * u + m11 * v + m12) / w;
76
+ if (x < x0)
77
+ x0 = x;
78
+ if (x > x1)
79
+ x1 = x;
80
+ if (y < y0)
81
+ y0 = y;
82
+ if (y > y1)
83
+ y1 = y;
84
+ }
85
+ const left = Math.max(0, Math.floor(x0) - 1);
86
+ const top = Math.max(0, Math.floor(y0) - 1);
87
+ const right = Math.min(canvasWidth, Math.ceil(x1) + 1);
88
+ const bottom = Math.min(canvasHeight, Math.ceil(y1) + 1);
89
+ if (!(right > left && bottom > top))
90
+ return null;
91
+ return { x: left, y: top, width: right - left, height: bottom - top };
92
+ }
42
93
  const IDENTITY_INVERSE_AFFINE = {
43
94
  a: 1,
44
95
  b: 0,
@@ -280,6 +331,24 @@ export class WebGPULayerCompositor {
280
331
  * layer source, writes the blended result to `writeTex` (full-screen).
281
332
  */
282
333
  renderBlendPass(encoder, readTex, writeTex, params) {
334
+ this.encodeBlendPass(encoder, readTex, writeTex, params, null);
335
+ }
336
+ /**
337
+ * Composite one layer onto `accumTex` in place, touching only `rect`.
338
+ *
339
+ * A layer that covers a small part of the frame need not rewrite the rest:
340
+ * the destination pixels under `rect` are copied to `scratchTex`, and the
341
+ * blend reads them there and writes over `accumTex` with a scissor, leaving
342
+ * every other pixel as it was. Outside the layer's quad the blend shader
343
+ * returns the destination unchanged, so the result is the full-frame pass's
344
+ * whenever `rect` covers the quad. The accumulation stays in `accumTex`; no
345
+ * swap. Both textures must allow copies (the ping-pong pair does).
346
+ */
347
+ renderBlendPassInRect(encoder, accumTex, scratchTex, params, rect) {
348
+ encoder.copyTextureToTexture({ texture: accumTex, origin: { x: rect.x, y: rect.y } }, { texture: scratchTex, origin: { x: rect.x, y: rect.y } }, { width: rect.width, height: rect.height });
349
+ this.encodeBlendPass(encoder, scratchTex, accumTex, params, rect);
350
+ }
351
+ encodeBlendPass(encoder, readTex, writeTex, params, rect) {
283
352
  const { invAffine } = params;
284
353
  const borderRadius = params.borderRadius ?? 0;
285
354
  const smoothness = borderRadius > 0 ? BORDER_RADIUS_SMOOTHNESS : 0;
@@ -314,11 +383,13 @@ export class WebGPULayerCompositor {
314
383
  });
315
384
  const pass = encoder.beginRenderPass({
316
385
  colorAttachments: [
317
- { view: writeTex.createView(), loadOp: "clear", storeOp: "store" }
386
+ { view: writeTex.createView(), loadOp: rect ? "load" : "clear", storeOp: "store" }
318
387
  ]
319
388
  });
320
389
  pass.setPipeline(this.blendPipeline);
321
390
  pass.setBindGroup(0, bindGroup);
391
+ if (rect)
392
+ pass.setScissorRect(rect.x, rect.y, rect.width, rect.height);
322
393
  pass.draw(4);
323
394
  pass.end();
324
395
  }
@@ -1 +1 @@
1
- {"version":3,"file":"compositor.js","sourceRoot":"","sources":["../../src/compositor/compositor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compositor.js","sourceRoot":"","sources":["../../src/compositor/compositor.ts"],"names":[],"mappings":"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"}
@@ -1,36 +1,39 @@
1
1
  /**
2
- * `filters.grain@1` — film grain as a multiplicative gain wobble.
2
+ * `filters.grain@1` — film grain modelled on exposed stock.
3
3
  *
4
- * **Multiplied, not added.** The input is premultiplied, so `rgb <= a` holds on
5
- * every pixel and adding noise would break it: a translucent layer would come
6
- * back with channels brighter than its own alpha, which reads as a bright
7
- * fringe once it composites. A scalar gain preserves the invariant (the same
8
- * reason `filters.vignette@1` may scale), and it is also closer to how exposed
9
- * stock behaves — grain bites in the midtones and leaves black black, because
10
- * there is nothing there to modulate.
4
+ * **Bell-shaped, clumped, two octaves.** Each lattice point draws roughly
5
+ * Gaussian noise (three hashes summed), and smooth value noise interpolates
6
+ * between points, so `size` grows soft clumps rather than square blocks. A
7
+ * second octave at twice the frequency adds the fine layer real grain has.
11
8
  *
12
- * **Reproducible.** The pattern is a hash of the grain cell and `seed`, with no
9
+ * **Follows exposure.** The noise is added to the straight colour and weighted
10
+ * by luma: zero in pure black, strongest through shadows and midtones, thinner
11
+ * in the highlights. The result is clamped to 0..1 and premultiplied again, so
12
+ * `rgb <= a` holds by construction on a translucent layer.
13
+ *
14
+ * **Reproducible.** The pattern is a hash of the lattice and `seed`, with no
13
15
  * clock and no RNG state, so two renders of the same frame are byte-identical
14
16
  * and a cached render can be handed back. A host that wants the pattern to roll
15
- * passes the frame's own time as the seed.
17
+ * passes the frame's own time as the seed; the shader folds it into a small
18
+ * exact integer so large frame times keep their precision.
16
19
  */
17
20
  import * as d from "typegpu/data";
18
21
  export declare const GrainParams: d.WgslStruct<{
19
- /** Gain wobble, 0..1. 0 leaves the picture untouched. */
22
+ /** Grain strength, 0..1. 1 is a 0.15 deviation in midtones. 0 is a no-op. */
20
23
  amount: d.F32;
21
- /** Grain cell size in source pixels. 1 is per-pixel. */
24
+ /** Grain clump size in source pixels. 1 is per-pixel; larger is softer, coarser stock. */
22
25
  size: d.F32;
23
- /** 0 = one gain for the pixel (monochrome), 1 = per-channel colour noise. */
26
+ /** 0 = one noise value for the pixel (monochrome), 1 = per-channel colour noise. */
24
27
  colorAmount: d.F32;
25
28
  /** Rolls the pattern. Same seed, same grain. */
26
29
  seed: d.F32;
27
30
  }>;
28
31
  export declare const filtersGrainV1: import("../../../../module.js").ShaderModule<d.WgslStruct<{
29
- /** Gain wobble, 0..1. 0 leaves the picture untouched. */
32
+ /** Grain strength, 0..1. 1 is a 0.15 deviation in midtones. 0 is a no-op. */
30
33
  amount: d.F32;
31
- /** Grain cell size in source pixels. 1 is per-pixel. */
34
+ /** Grain clump size in source pixels. 1 is per-pixel; larger is softer, coarser stock. */
32
35
  size: d.F32;
33
- /** 0 = one gain for the pixel (monochrome), 1 = per-channel colour noise. */
36
+ /** 0 = one noise value for the pixel (monochrome), 1 = per-channel colour noise. */
34
37
  colorAmount: d.F32;
35
38
  /** Rolls the pattern. Same seed, same grain. */
36
39
  seed: d.F32;
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../src/shaders/filters/grain/v1/module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAGlC,eAAO,MAAM,WAAW;IACtB,yDAAyD;;IAEzD,wDAAwD;;IAExD,6EAA6E;;IAE7E,gDAAgD;;EAEhD,CAAC;AAQH,eAAO,MAAM,cAAc;IAhBzB,yDAAyD;;IAEzD,wDAAwD;;IAExD,6EAA6E;;IAE7E,gDAAgD;;GAoFhD,CAAC"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../src/shaders/filters/grain/v1/module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAGlC,eAAO,MAAM,WAAW;IACtB,6EAA6E;;IAE7E,0FAA0F;;IAE1F,oFAAoF;;IAEpF,gDAAgD;;EAEhD,CAAC;AAQH,eAAO,MAAM,cAAc;IAhBzB,6EAA6E;;IAE7E,0FAA0F;;IAE1F,oFAAoF;;IAEpF,gDAAgD;;GA0IhD,CAAC"}
@@ -1,28 +1,31 @@
1
1
  /**
2
- * `filters.grain@1` — film grain as a multiplicative gain wobble.
2
+ * `filters.grain@1` — film grain modelled on exposed stock.
3
3
  *
4
- * **Multiplied, not added.** The input is premultiplied, so `rgb <= a` holds on
5
- * every pixel and adding noise would break it: a translucent layer would come
6
- * back with channels brighter than its own alpha, which reads as a bright
7
- * fringe once it composites. A scalar gain preserves the invariant (the same
8
- * reason `filters.vignette@1` may scale), and it is also closer to how exposed
9
- * stock behaves — grain bites in the midtones and leaves black black, because
10
- * there is nothing there to modulate.
4
+ * **Bell-shaped, clumped, two octaves.** Each lattice point draws roughly
5
+ * Gaussian noise (three hashes summed), and smooth value noise interpolates
6
+ * between points, so `size` grows soft clumps rather than square blocks. A
7
+ * second octave at twice the frequency adds the fine layer real grain has.
11
8
  *
12
- * **Reproducible.** The pattern is a hash of the grain cell and `seed`, with no
9
+ * **Follows exposure.** The noise is added to the straight colour and weighted
10
+ * by luma: zero in pure black, strongest through shadows and midtones, thinner
11
+ * in the highlights. The result is clamped to 0..1 and premultiplied again, so
12
+ * `rgb <= a` holds by construction on a translucent layer.
13
+ *
14
+ * **Reproducible.** The pattern is a hash of the lattice and `seed`, with no
13
15
  * clock and no RNG state, so two renders of the same frame are byte-identical
14
16
  * and a cached render can be handed back. A host that wants the pattern to roll
15
- * passes the frame's own time as the seed.
17
+ * passes the frame's own time as the seed; the shader folds it into a small
18
+ * exact integer so large frame times keep their precision.
16
19
  */
17
20
  import tgpu from "typegpu";
18
21
  import * as d from "typegpu/data";
19
22
  import { defineModule } from "../../../../module.js";
20
23
  export const GrainParams = d.struct({
21
- /** Gain wobble, 0..1. 0 leaves the picture untouched. */
24
+ /** Grain strength, 0..1. 1 is a 0.15 deviation in midtones. 0 is a no-op. */
22
25
  amount: d.f32,
23
- /** Grain cell size in source pixels. 1 is per-pixel. */
26
+ /** Grain clump size in source pixels. 1 is per-pixel; larger is softer, coarser stock. */
24
27
  size: d.f32,
25
- /** 0 = one gain for the pixel (monochrome), 1 = per-channel colour noise. */
28
+ /** 0 = one noise value for the pixel (monochrome), 1 = per-channel colour noise. */
26
29
  colorAmount: d.f32,
27
30
  /** Rolls the pattern. Same seed, same grain. */
28
31
  seed: d.f32
@@ -58,9 +61,45 @@ fn hash31(p: vec3f) -> f32 {
58
61
  return fract((p3.x + p3.y) * p3.z);
59
62
  }
60
63
 
61
- /** Signed noise in [-1, 1] for one grain cell and channel. */
62
- fn grainAt(cell: vec2f, seed: f32, channel: f32) -> f32 {
63
- return hash31(vec3f(cell.x, cell.y, seed + channel * 19.19)) * 2.0 - 1.0;
64
+ /**
65
+ * Approximately Gaussian noise with unit deviation at one lattice point: the
66
+ * sum of three uniform hashes (Irwin-Hall), centred and rescaled. Real grain is
67
+ * the sum of many silver crystals, so its density is bell-shaped, not flat.
68
+ */
69
+ fn gaussAt(cell: vec2f, seed: f32) -> f32 {
70
+ let a = hash31(vec3f(cell.x, cell.y, seed));
71
+ let b = hash31(vec3f(cell.x + 57.0, cell.y + 57.0, seed));
72
+ let c = hash31(vec3f(cell.x + 113.0, cell.y + 113.0, seed));
73
+ return (a + b + c - 1.5) * 2.0;
74
+ }
75
+
76
+ /**
77
+ * Smooth value noise over the grain lattice. Interpolating between lattice
78
+ * points turns a large size into soft clumps instead of hard square blocks. At
79
+ * integer coordinates the weights are exactly zero, so size 1 returns the
80
+ * lattice value itself: fine, per-pixel grain.
81
+ */
82
+ fn valueNoise(p: vec2f, seed: f32) -> f32 {
83
+ let i = floor(p);
84
+ let f = p - i;
85
+ let u = f * f * (vec2f(3.0) - 2.0 * f);
86
+ let n00 = gaussAt(i, seed);
87
+ let n10 = gaussAt(i + vec2f(1.0, 0.0), seed);
88
+ let n01 = gaussAt(i + vec2f(0.0, 1.0), seed);
89
+ let n11 = gaussAt(i + vec2f(1.0, 1.0), seed);
90
+ return mix(mix(n00, n10, u.x), mix(n01, n11, u.x), u.y);
91
+ }
92
+
93
+ /**
94
+ * Two octaves: the clump at the chosen size and a finer layer at twice the
95
+ * frequency. The doubling and the fixed offset keep every floored coordinate an
96
+ * exact float, so the CPU mirror can reproduce the lattice bit for bit.
97
+ */
98
+ fn grainAt(p: vec2f, seed: f32, channel: f32) -> f32 {
99
+ let s = seed + channel * 19.19;
100
+ let coarse = valueNoise(p, s);
101
+ let fine = valueNoise(p * 2.0 + vec2f(17.0, 29.0), s + 7.0);
102
+ return (coarse + 0.5 * fine) * 0.8944;
64
103
  }
65
104
 
66
105
  @compute @workgroup_size(16, 16, 1)
@@ -70,24 +109,42 @@ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
70
109
  let coords = vec2<i32>(i32(gid.x), i32(gid.y));
71
110
  let v = layout.$.params;
72
111
  let color = textureLoad(layout.$.source, coords, 0);
112
+ if (color.a <= 0.0) {
113
+ textureStore(layout.$.outputTexture, coords, color);
114
+ return;
115
+ }
73
116
 
74
- // Quantize to grain cells so size coarsens the stock instead of just
75
- // reseeding it. Sub-pixel sizes collapse back to per-pixel.
76
- let cell = floor(vec2f(f32(gid.x), f32(gid.y)) / max(v.size, 1.0));
117
+ // Fold the seed into a small exact integer, then turn it into a whole-pixel
118
+ // shift of the lattice. Frame-time seeds run into the hundreds of thousands,
119
+ // where f32 hashing loses the bits that make consecutive frames differ.
120
+ let folded = v.seed - 8192.0 * floor(v.seed / 8192.0);
121
+ let shift = floor(vec2f(
122
+ hash31(vec3f(folded, 1.7, 9.2)),
123
+ hash31(vec3f(folded, 4.1, 3.3))
124
+ ) * 512.0);
125
+ let p = vec2f(f32(gid.x), f32(gid.y)) / max(v.size, 1.0) + shift;
77
126
 
78
- let mono = grainAt(cell, v.seed, 0.0);
79
- let perChannel = vec3f(
80
- grainAt(cell, v.seed, 1.0),
81
- grainAt(cell, v.seed, 2.0),
82
- grainAt(cell, v.seed, 3.0)
83
- );
84
- let n = mix(vec3f(mono), perChannel, clamp(v.colorAmount, 0.0, 1.0));
127
+ let mono = grainAt(p, folded, 0.0);
128
+ var n = vec3f(mono);
129
+ if (v.colorAmount > 0.0) {
130
+ let perChannel = vec3f(
131
+ grainAt(p, folded, 1.0),
132
+ grainAt(p, folded, 2.0),
133
+ grainAt(p, folded, 3.0)
134
+ );
135
+ n = mix(n, perChannel, clamp(v.colorAmount, 0.0, 1.0));
136
+ }
85
137
 
86
- let gain = vec3f(1.0) + n * clamp(v.amount, 0.0, 1.0);
87
- // Saturating against alpha rather than 1.0 is what keeps rgb <= a when the
88
- // gain runs above 1 on an already-bright premultiplied pixel.
89
- let rgb = clamp(color.rgb * gain, vec3f(0.0), vec3f(color.a)); // premul: ok
90
- textureStore(layout.$.outputTexture, coords, vec4<f32>(rgb, color.a));
138
+ // Work on the straight colour: grain follows exposure, not coverage.
139
+ let straight = color.rgb / color.a;
140
+ let luma = dot(straight, vec3f(0.2126, 0.7152, 0.0722));
141
+ // Film response: nothing to expose in pure black, strongest through the
142
+ // shadows and midtones, thinning out toward the highlights.
143
+ let response = clamp(luma * 6.0, 0.0, 1.0) * (1.0 - 0.65 * luma * luma);
144
+ let sigma = clamp(v.amount, 0.0, 1.0) * 0.15 * response;
145
+ let grained = clamp(straight + n * sigma, vec3f(0.0), vec3f(1.0));
146
+ // Re-premultiplying a value in 0..1 keeps rgb <= a by construction.
147
+ textureStore(layout.$.outputTexture, coords, vec4<f32>(grained * color.a, color.a));
91
148
  }
92
149
  `,
93
150
  io: {
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sourceRoot":"","sources":["../../../../../src/shaders/filters/grain/v1/module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,yDAAyD;IACzD,MAAM,EAAE,CAAC,CAAC,GAAG;IACb,wDAAwD;IACxD,IAAI,EAAE,CAAC,CAAC,GAAG;IACX,6EAA6E;IAC7E,WAAW,EAAE,CAAC,CAAC,GAAG;IAClB,gDAAgD;IAChD,IAAI,EAAE,CAAC,CAAC,GAAG;CACZ,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC;IAClC,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE;IAC5B,aAAa,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE;IAC/C,MAAM,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE;CACjC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;IACzC,EAAE,EAAE,eAAe;IACnB,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,UAAU;IACnB,QAAQ,EAAE,SAAS;IACnB,0EAA0E;IAC1E,iDAAiD;IACjD,SAAS,EAAE,eAAe;IAC1B,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,WAAW;IACnB,aAAa,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;IAC9D,OAAO,EAAE;QACP,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;QACvD,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE;QACnD,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;QAC5D,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;KACxB;IACD,MAAM;IACN,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1B,IAAI,EAAE,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsClB;IACC,EAAE,EAAE;QACF,MAAM,EAAE;YACN,MAAM,EAAE;gBACN,UAAU,EAAE,MAAM;gBAClB,KAAK,EAAE,eAAe;gBACtB,YAAY,EAAE,CAAC,YAAY,CAAC;aAC7B;SACF;QACD,MAAM,EAAE;YACN,UAAU,EAAE,MAAM;YAClB,KAAK,EAAE,eAAe;YACtB,MAAM,EAAE,YAAY;YACpB,UAAU,EAAE,gBAAgB;SAC7B;QACD,GAAG,EAAE,gBAAgB;KACtB;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../../../../src/shaders/filters/grain/v1/module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,6EAA6E;IAC7E,MAAM,EAAE,CAAC,CAAC,GAAG;IACb,0FAA0F;IAC1F,IAAI,EAAE,CAAC,CAAC,GAAG;IACX,oFAAoF;IACpF,WAAW,EAAE,CAAC,CAAC,GAAG;IAClB,gDAAgD;IAChD,IAAI,EAAE,CAAC,CAAC,GAAG;CACZ,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC;IAClC,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE;IAC5B,aAAa,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE;IAC/C,MAAM,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE;CACjC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;IACzC,EAAE,EAAE,eAAe;IACnB,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,UAAU;IACnB,QAAQ,EAAE,SAAS;IACnB,0EAA0E;IAC1E,iDAAiD;IACjD,SAAS,EAAE,eAAe;IAC1B,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,WAAW;IACnB,aAAa,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;IAC9D,OAAO,EAAE;QACP,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;QACvD,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE;QACnD,WAAW,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE;QAC5D,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;KACxB;IACD,MAAM;IACN,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1B,IAAI,EAAE,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4FlB;IACC,EAAE,EAAE;QACF,MAAM,EAAE;YACN,MAAM,EAAE;gBACN,UAAU,EAAE,MAAM;gBAClB,KAAK,EAAE,eAAe;gBACtB,YAAY,EAAE,CAAC,YAAY,CAAC;aAC7B;SACF;QACD,MAAM,EAAE;YACN,UAAU,EAAE,MAAM;YAClB,KAAK,EAAE,eAAe;YACtB,MAAM,EAAE,YAAY;YACpB,UAAU,EAAE,gBAAgB;SAC7B;QACD,GAAG,EAAE,gBAAgB;KACtB;CACF,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nodetool-ai/gpu",
3
- "version": "0.8.2",
3
+ "version": "0.8.4-a13.1",
4
4
  "description": "Canonical blend-mode catalog and shared WGSL blend functions for NodeTool compositors (sketch, timeline, Compositor node)",
5
5
  "type": "module",
6
6
  "engines": {
@@ -15,10 +15,8 @@
15
15
  "lint": "node ../../scripts/run-tsc.mjs --noEmit"
16
16
  },
17
17
  "dependencies": {
18
- "@nodetool-ai/protocol": "^0.8.2",
19
- "typegpu": "^0.11.6"
20
- },
21
- "optionalDependencies": {
18
+ "@nodetool-ai/protocol": "0.8.4-a13.1",
19
+ "typegpu": "^0.11.6",
22
20
  "webgpu": "^0.4.0"
23
21
  },
24
22
  "devDependencies": {