@flighthq/effects-wgpu 0.4.0-next.1836.147ae1e → 0.4.0-next.1884.6a2d46f

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 (50) hide show
  1. package/dist/wgpuBlurEffect.d.ts +1 -14
  2. package/dist/wgpuBlurEffect.d.ts.map +1 -1
  3. package/dist/wgpuBlurEffect.js +2 -22
  4. package/dist/wgpuBlurEffect.js.map +1 -1
  5. package/dist/wgpuCrtEffect.d.ts.map +1 -1
  6. package/dist/wgpuCrtEffect.js +4 -2
  7. package/dist/wgpuCrtEffect.js.map +1 -1
  8. package/dist/wgpuDirectionalBlurEffect.d.ts.map +1 -1
  9. package/dist/wgpuDirectionalBlurEffect.js +4 -2
  10. package/dist/wgpuDirectionalBlurEffect.js.map +1 -1
  11. package/dist/wgpuDisplacementEffect.d.ts.map +1 -1
  12. package/dist/wgpuDisplacementEffect.js +4 -2
  13. package/dist/wgpuDisplacementEffect.js.map +1 -1
  14. package/dist/wgpuDitherEffect.d.ts.map +1 -1
  15. package/dist/wgpuDitherEffect.js +4 -2
  16. package/dist/wgpuDitherEffect.js.map +1 -1
  17. package/dist/wgpuEffectTexelScale.d.ts +18 -0
  18. package/dist/wgpuEffectTexelScale.d.ts.map +1 -0
  19. package/dist/wgpuEffectTexelScale.js +22 -0
  20. package/dist/wgpuEffectTexelScale.js.map +1 -0
  21. package/dist/wgpuFxaaEffect.d.ts.map +1 -1
  22. package/dist/wgpuFxaaEffect.js +3 -0
  23. package/dist/wgpuFxaaEffect.js.map +1 -1
  24. package/dist/wgpuGlitchEffect.d.ts.map +1 -1
  25. package/dist/wgpuGlitchEffect.js +4 -2
  26. package/dist/wgpuGlitchEffect.js.map +1 -1
  27. package/dist/wgpuKuwaharaEffect.d.ts.map +1 -1
  28. package/dist/wgpuKuwaharaEffect.js +4 -2
  29. package/dist/wgpuKuwaharaEffect.js.map +1 -1
  30. package/dist/wgpuMotionBlurEffect.d.ts.map +1 -1
  31. package/dist/wgpuMotionBlurEffect.js +6 -4
  32. package/dist/wgpuMotionBlurEffect.js.map +1 -1
  33. package/dist/wgpuPixelateEffect.d.ts.map +1 -1
  34. package/dist/wgpuPixelateEffect.js +4 -2
  35. package/dist/wgpuPixelateEffect.js.map +1 -1
  36. package/dist/wgpuSharpenEffect.d.ts.map +1 -1
  37. package/dist/wgpuSharpenEffect.js +4 -2
  38. package/dist/wgpuSharpenEffect.js.map +1 -1
  39. package/dist/wgpuSmaaEffect.d.ts.map +1 -1
  40. package/dist/wgpuSmaaEffect.js +3 -0
  41. package/dist/wgpuSmaaEffect.js.map +1 -1
  42. package/dist/wgpuSsaoEffect.d.ts.map +1 -1
  43. package/dist/wgpuSsaoEffect.js +4 -2
  44. package/dist/wgpuSsaoEffect.js.map +1 -1
  45. package/dist/wgpuTiltShiftEffect.d.ts.map +1 -1
  46. package/dist/wgpuTiltShiftEffect.js +4 -2
  47. package/dist/wgpuTiltShiftEffect.js.map +1 -1
  48. package/package.json +9 -9
  49. package/src/wgpuEffectTexelScale.test.ts +47 -0
  50. package/src/wgpuLogicalEffectResolution.test.ts +247 -0
@@ -1,23 +1,10 @@
1
1
  import type { BlurEffect, WgpuRenderEffectRunner, WgpuRenderState, WgpuRenderTarget } from '@flighthq/types/contract';
2
+ export { getWgpuRenderTargetTexelScale } from './wgpuEffectTexelScale';
2
3
  export declare function applyBlurEffectToWgpu(state: WgpuRenderState, source: Readonly<WgpuRenderTarget>, dest: Readonly<WgpuRenderTarget>, temp: Readonly<WgpuRenderTarget>, effect: Readonly<BlurEffect>): void;
3
4
  export declare function applyGaussianBlurToWgpu(state: WgpuRenderState, source: Readonly<WgpuRenderTarget>, dest: Readonly<WgpuRenderTarget>, temp: Readonly<WgpuRenderTarget>, options: Readonly<{
4
5
  blurX?: number;
5
6
  blurY?: number;
6
7
  }>): void;
7
8
  export declare const defaultWgpuBlurEffectRunner: WgpuRenderEffectRunner;
8
- /**
9
- * Texels per logical pixel in a target, used to keep a blur's width in LOGICAL units.
10
- *
11
- * `blurX`/`blurY` are Gaussian standard deviations in logical pixels — CSS `blur(Xpx)` semantics — while
12
- * the blur pass steps in texels. Those coincide only at 1:1 density, and a `sampleCount: 4` effect target
13
- * is allocated at 2x per axis, so an unscaled sigma covered half the intended distance and every
14
- * blur-based Wgpu effect came out narrower than its Gl twin.
15
- *
16
- * ★ MEASURED FROM WIDTHS RATHER THAN READ OFF `sampleCount`, because the blur runs on POOL targets: those
17
- * are allocated from a descriptor that already carries the supersampled width while their own sampleCount
18
- * stays 1. A sampleCount-based factor returns 1 for exactly the targets that need scaling — the first
19
- * version of this fix did that and changed nothing measurable.
20
- */
21
- export declare function getWgpuRenderTargetTexelScale(targetWidth: number, canvasWidth: number): number;
22
9
  export declare function registerWgpuBlurEffect(state: WgpuRenderState): void;
23
10
  //# sourceMappingURL=wgpuBlurEffect.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuBlurEffect.d.ts","sourceRoot":"","sources":["../src/wgpuBlurEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AActH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,GAC3B,IAAI,CAEN;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,OAAO,EAAE,QAAQ,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACpD,IAAI,CAwBN;AAED,eAAO,MAAM,2BAA2B,EAAE,sBAKzC,CAAC;AAMF;;;;;;;;;;;;GAYG;AACH,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAG9F;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAEnE"}
1
+ {"version":3,"file":"wgpuBlurEffect.d.ts","sourceRoot":"","sources":["../src/wgpuBlurEffect.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAOtH,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAUvE,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,GAC3B,IAAI,CAEN;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,OAAO,EAAE,QAAQ,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GACpD,IAAI,CAwBN;AAED,eAAO,MAAM,2BAA2B,EAAE,sBAKzC,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAEnE"}
@@ -1,7 +1,9 @@
1
1
  import { acquireWgpuRenderTarget, releaseWgpuRenderTarget } from '@flighthq/render-wgpu/contract';
2
2
  import { drawWgpuEffectPass } from './wgpuEffectPass';
3
3
  import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
4
+ import { getWgpuRenderTargetTexelScale } from './wgpuEffectTexelScale';
4
5
  import { registerWgpuRenderEffect } from './wgpuRenderEffectRegistry';
6
+ export { getWgpuRenderTargetTexelScale } from './wgpuEffectTexelScale';
5
7
  // Plain separable Gaussian blur: two axis passes (source → temp horizontally, temp → dest vertically),
6
8
  // each a single weighted fullscreen pass with radius ⌈3σ⌉. `blurX`/`blurY` are the Gaussian standard
7
9
  // deviations (CSS `blur(Xpx)` uses sigma = X), matching the CSS and surface Gaussian references and the
@@ -43,28 +45,6 @@ export const defaultWgpuBlurEffectRunner = (ctx, effect) => {
43
45
  applyBlurEffectToWgpu(ctx.state, ctx.source, ctx.dest, temp, effect);
44
46
  releaseWgpuRenderTarget(ctx.pool, temp);
45
47
  };
46
- // Applies a faithful separable Gaussian blur to `source`, writing to `dest`. `blurX`/`blurY` are the
47
- // Gaussian standard deviations in pixels (default 4). Runs two unconditional separable passes,
48
- // source → temp (X) then temp → dest (Y); a zero-radius axis copies through unchanged, so the result
49
- // always lands in `dest` without a separate blit. `temp` is a ping-pong scratch distinct from both.
50
- /**
51
- * Texels per logical pixel in a target, used to keep a blur's width in LOGICAL units.
52
- *
53
- * `blurX`/`blurY` are Gaussian standard deviations in logical pixels — CSS `blur(Xpx)` semantics — while
54
- * the blur pass steps in texels. Those coincide only at 1:1 density, and a `sampleCount: 4` effect target
55
- * is allocated at 2x per axis, so an unscaled sigma covered half the intended distance and every
56
- * blur-based Wgpu effect came out narrower than its Gl twin.
57
- *
58
- * ★ MEASURED FROM WIDTHS RATHER THAN READ OFF `sampleCount`, because the blur runs on POOL targets: those
59
- * are allocated from a descriptor that already carries the supersampled width while their own sampleCount
60
- * stays 1. A sampleCount-based factor returns 1 for exactly the targets that need scaling — the first
61
- * version of this fix did that and changed nothing measurable.
62
- */
63
- export function getWgpuRenderTargetTexelScale(targetWidth, canvasWidth) {
64
- if (!Number.isFinite(targetWidth) || !Number.isFinite(canvasWidth) || canvasWidth <= 0)
65
- return 1;
66
- return Math.max(1, Math.round(targetWidth / canvasWidth));
67
- }
68
48
  export function registerWgpuBlurEffect(state) {
69
49
  registerWgpuRenderEffect(state, 'BlurEffect', defaultWgpuBlurEffectRunner);
70
50
  }
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuBlurEffect.js","sourceRoot":"","sources":["../src/wgpuBlurEffect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wgpuBlurEffect.js","sourceRoot":"","sources":["../src/wgpuBlurEffect.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuCrtEffect.d.ts","sourceRoot":"","sources":["../src/wgpuCrtEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAQrH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,GAC1B,IAAI,CAcN;AAED,eAAO,MAAM,0BAA0B,EAAE,sBAExC,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAElE"}
1
+ {"version":3,"file":"wgpuCrtEffect.d.ts","sourceRoot":"","sources":["../src/wgpuCrtEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AASrH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,GAC1B,IAAI,CAeN;AAED,eAAO,MAAM,0BAA0B,EAAE,sBAExC,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAElE"}
@@ -1,5 +1,6 @@
1
1
  import { drawWgpuEffectPass } from './wgpuEffectPass';
2
2
  import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
+ import { getWgpuEffectLogicalResolution } from './wgpuEffectTexelScale';
3
4
  import { registerWgpuRenderEffect } from './wgpuRenderEffectRegistry';
4
5
  // CRT: barrel-distort the uv (curvature), darken alternating scanlines, vignette the edges, and split
5
6
  // the channels outward (chromatic aberration) for a tube-monitor look.
@@ -8,14 +9,15 @@ export function applyCrtEffectToWgpu(state, source, dest, effect) {
8
9
  const scanlineIntensity = effect.scanlineIntensity ?? 0.3;
9
10
  const vignette = effect.vignette ?? 0.3;
10
11
  const aberration = effect.aberration ?? 0.005;
12
+ const resolution = getWgpuEffectLogicalResolution(state, source);
11
13
  const pipeline = getWgpuEffectPipeline(state, 'stylization.crt', CRT_FRAGMENT_WGSL, 'replace');
12
14
  drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
13
15
  f32[0] = curvature;
14
16
  f32[1] = scanlineIntensity;
15
17
  f32[2] = vignette;
16
18
  f32[3] = aberration;
17
- f32[4] = source.width;
18
- f32[5] = source.height;
19
+ f32[4] = resolution.width;
20
+ f32[5] = resolution.height;
19
21
  });
20
22
  }
21
23
  export const defaultWgpuCrtEffectRunner = (ctx, effect) => {
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuCrtEffect.js","sourceRoot":"","sources":["../src/wgpuCrtEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,sGAAsG;AACtG,uEAAuE;AACvE,MAAM,UAAU,oBAAoB,CAClC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA2B;IAE3B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC;IAC1C,MAAM,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,GAAG,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC;IAC9C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;IAC/F,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC;QAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;QAClB,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,0BAA0B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAChF,oBAAoB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAmB,CAAC,CAAC;AAC7E,CAAC,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,KAAsB;IAC1D,wBAAwB,CAAC,KAAK,EAAE,WAAW,EAAE,0BAA0B,CAAC,CAAC;AAC3E,CAAC;AAED,sGAAsG;AACtG,MAAM,iBAAiB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmCnC,CAAC"}
1
+ {"version":3,"file":"wgpuCrtEffect.js","sourceRoot":"","sources":["../src/wgpuCrtEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,sGAAsG;AACtG,uEAAuE;AACvE,MAAM,UAAU,oBAAoB,CAClC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA2B;IAE3B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC;IAC1C,MAAM,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,GAAG,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC;IACxC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC;IAC9C,MAAM,UAAU,GAAG,8BAA8B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;IAC/F,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC;QAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;QAClB,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;QAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,0BAA0B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAChF,oBAAoB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAmB,CAAC,CAAC;AAC7E,CAAC,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,KAAsB;IAC1D,wBAAwB,CAAC,KAAK,EAAE,WAAW,EAAE,0BAA0B,CAAC,CAAC;AAC3E,CAAC;AAED,sGAAsG;AACtG,MAAM,iBAAiB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmCnC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuDirectionalBlurEffect.d.ts","sourceRoot":"","sources":["../src/wgpuDirectionalBlurEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AASlC,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GACtC,IAAI,CAYN;AAED,eAAO,MAAM,sCAAsC,EAAE,sBAEpD,CAAC;AAEF,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAE9E"}
1
+ {"version":3,"file":"wgpuDirectionalBlurEffect.d.ts","sourceRoot":"","sources":["../src/wgpuDirectionalBlurEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAUlC,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,qBAAqB,CAAC,GACtC,IAAI,CAaN;AAED,eAAO,MAAM,sCAAsC,EAAE,sBAEpD,CAAC;AAEF,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAE9E"}
@@ -1,5 +1,6 @@
1
1
  import { drawWgpuEffectPass } from './wgpuEffectPass';
2
2
  import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
+ import { getWgpuEffectLogicalResolution } from './wgpuEffectTexelScale';
3
4
  import { registerWgpuRenderEffect } from './wgpuRenderEffectRegistry';
4
5
  // Directional blur: accumulate samples stepped along `angle` over `length` texels, normalized by the
5
6
  // sample count. Single-pass reference recipe, the Wgpu mirror of effects-gl's
@@ -8,13 +9,14 @@ export function applyDirectionalBlurEffectToWgpu(state, source, dest, effect) {
8
9
  const angle = ((effect.angle ?? 0) * Math.PI) / 180;
9
10
  const length = effect.length ?? 8;
10
11
  const samples = effect.samples ?? 16;
12
+ const resolution = getWgpuEffectLogicalResolution(state, source);
11
13
  const pipeline = getWgpuEffectPipeline(state, 'motion.directionalBlur', DIRECTIONAL_BLUR_FRAGMENT_WGSL, 'replace');
12
14
  drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
13
15
  f32[0] = angle;
14
16
  f32[1] = length;
15
17
  f32[2] = samples;
16
- f32[4] = source.width;
17
- f32[5] = source.height;
18
+ f32[4] = resolution.width;
19
+ f32[5] = resolution.height;
18
20
  });
19
21
  }
20
22
  export const defaultWgpuDirectionalBlurEffectRunner = (ctx, effect) => {
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuDirectionalBlurEffect.js","sourceRoot":"","sources":["../src/wgpuDirectionalBlurEffect.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,qGAAqG;AACrG,8EAA8E;AAC9E,wFAAwF;AACxF,MAAM,UAAU,gCAAgC,CAC9C,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAuC;IAEvC,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,wBAAwB,EAAE,8BAA8B,EAAE,SAAS,CAAC,CAAC;IACnH,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACf,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QACjB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,sCAAsC,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC5F,gCAAgC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAA+B,CAAC,CAAC;AACrG,CAAC,CAAC;AAEF,MAAM,UAAU,iCAAiC,CAAC,KAAsB;IACtE,wBAAwB,CAAC,KAAK,EAAE,uBAAuB,EAAE,sCAAsC,CAAC,CAAC;AACnG,CAAC;AAED,gGAAgG;AAChG,MAAM,8BAA8B,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BhD,CAAC"}
1
+ {"version":3,"file":"wgpuDirectionalBlurEffect.js","sourceRoot":"","sources":["../src/wgpuDirectionalBlurEffect.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,qGAAqG;AACrG,8EAA8E;AAC9E,wFAAwF;AACxF,MAAM,UAAU,gCAAgC,CAC9C,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAuC;IAEvC,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,8BAA8B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,wBAAwB,EAAE,8BAA8B,EAAE,SAAS,CAAC,CAAC;IACnH,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACf,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QACjB,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;QAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,sCAAsC,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IAC5F,gCAAgC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAA+B,CAAC,CAAC;AACrG,CAAC,CAAC;AAEF,MAAM,UAAU,iCAAiC,CAAC,KAAsB;IACtE,wBAAwB,CAAC,KAAK,EAAE,uBAAuB,EAAE,sCAAsC,CAAC,CAAC;AACnG,CAAC;AAED,gGAAgG;AAChG,MAAM,8BAA8B,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BhD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuDisplacementEffect.d.ts","sourceRoot":"","sources":["../src/wgpuDisplacementEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAOlC,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACnC,IAAI,CAaN;AAED,eAAO,MAAM,mCAAmC,EAAE,sBAEjD,CAAC;AAEF,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAE3E"}
1
+ {"version":3,"file":"wgpuDisplacementEffect.d.ts","sourceRoot":"","sources":["../src/wgpuDisplacementEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAQlC,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GACnC,IAAI,CAcN;AAED,eAAO,MAAM,mCAAmC,EAAE,sBAEjD,CAAC;AAEF,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAE3E"}
@@ -1,19 +1,21 @@
1
1
  import { drawWgpuEffectPass } from './wgpuEffectPass';
2
2
  import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
+ import { getWgpuEffectLogicalResolution } from './wgpuEffectTexelScale';
3
4
  import { registerWgpuRenderEffect } from './wgpuRenderEffectRegistry';
4
5
  // Displacement / heat-haze: warp the sample uv by an animated sine field for a refractive wobble.
5
6
  export function applyDisplacementEffectToWgpu(state, source, dest, effect) {
6
7
  const intensity = effect.intensity ?? 8;
7
8
  const frequency = effect.frequency ?? 12;
8
9
  const seed = effect.seed ?? 0;
10
+ const resolution = getWgpuEffectLogicalResolution(state, source);
9
11
  const pipeline = getWgpuEffectPipeline(state, 'lens.displacement', DISPLACEMENT_FRAGMENT_WGSL, 'replace');
10
12
  drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
11
13
  f32[0] = intensity;
12
14
  f32[1] = frequency;
13
15
  f32[2] = seed;
14
16
  // u_resolution (vec2f) aligns to slot [4].
15
- f32[4] = source.width;
16
- f32[5] = source.height;
17
+ f32[4] = resolution.width;
18
+ f32[5] = resolution.height;
17
19
  });
18
20
  }
19
21
  export const defaultWgpuDisplacementEffectRunner = (ctx, effect) => {
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuDisplacementEffect.js","sourceRoot":"","sources":["../src/wgpuDisplacementEffect.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,kGAAkG;AAClG,MAAM,UAAU,6BAA6B,CAC3C,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAoC;IAEpC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,SAAS,CAAC,CAAC;IAC1G,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACd,2CAA2C;QAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,mCAAmC,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACzF,6BAA6B,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAA4B,CAAC,CAAC;AAC/F,CAAC,CAAC;AAEF,MAAM,UAAU,8BAA8B,CAAC,KAAsB;IACnE,wBAAwB,CAAC,KAAK,EAAE,oBAAoB,EAAE,mCAAmC,CAAC,CAAC;AAC7F,CAAC;AAED,sCAAsC;AACtC,0EAA0E;AAC1E,MAAM,0BAA0B,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;EAoB5C,CAAC"}
1
+ {"version":3,"file":"wgpuDisplacementEffect.js","sourceRoot":"","sources":["../src/wgpuDisplacementEffect.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,kGAAkG;AAClG,MAAM,UAAU,6BAA6B,CAC3C,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAoC;IAEpC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,UAAU,GAAG,8BAA8B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,SAAS,CAAC,CAAC;IAC1G,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACd,2CAA2C;QAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;QAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,mCAAmC,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACzF,6BAA6B,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAA4B,CAAC,CAAC;AAC/F,CAAC,CAAC;AAEF,MAAM,UAAU,8BAA8B,CAAC,KAAsB;IACnE,wBAAwB,CAAC,KAAK,EAAE,oBAAoB,EAAE,mCAAmC,CAAC,CAAC;AAC7F,CAAC;AAED,sCAAsC;AACtC,0EAA0E;AAC1E,MAAM,0BAA0B,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;EAoB5C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuDitherEffect.d.ts","sourceRoot":"","sources":["../src/wgpuDitherEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAQxH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC7B,IAAI,CASN;AAED,eAAO,MAAM,6BAA6B,EAAE,sBAE3C,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAErE"}
1
+ {"version":3,"file":"wgpuDitherEffect.d.ts","sourceRoot":"","sources":["../src/wgpuDitherEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AASxH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC7B,IAAI,CAUN;AAED,eAAO,MAAM,6BAA6B,EAAE,sBAE3C,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAErE"}
@@ -1,16 +1,18 @@
1
1
  import { drawWgpuEffectPass } from './wgpuEffectPass';
2
2
  import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
+ import { getWgpuEffectLogicalResolution } from './wgpuEffectTexelScale';
3
4
  import { registerWgpuRenderEffect } from './wgpuRenderEffectRegistry';
4
5
  // Dither: quantize each channel to `levels` steps with a 4x4 ordered Bayer threshold for a retro
5
6
  // banded-but-textured look.
6
7
  export function applyDitherEffectToWgpu(state, source, dest, effect) {
7
8
  const levels = effect.levels ?? 4;
9
+ const resolution = getWgpuEffectLogicalResolution(state, source);
8
10
  const pipeline = getWgpuEffectPipeline(state, 'stylization.dither', DITHER_FRAGMENT_WGSL, 'replace');
9
11
  drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
10
12
  f32[0] = Math.max(2, levels);
11
13
  // u_resolution (vec2f) aligns to slot [2].
12
- f32[2] = source.width;
13
- f32[3] = source.height;
14
+ f32[2] = resolution.width;
15
+ f32[3] = resolution.height;
14
16
  });
15
17
  }
16
18
  export const defaultWgpuDitherEffectRunner = (ctx, effect) => {
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuDitherEffect.js","sourceRoot":"","sources":["../src/wgpuDitherEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,iGAAiG;AACjG,4BAA4B;AAC5B,MAAM,UAAU,uBAAuB,CACrC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA8B;IAE9B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,SAAS,CAAC,CAAC;IACrG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7B,2CAA2C;QAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,6BAA6B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACnF,uBAAuB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAsB,CAAC,CAAC;AACnF,CAAC,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,KAAsB;IAC7D,wBAAwB,CAAC,KAAK,EAAE,cAAc,EAAE,6BAA6B,CAAC,CAAC;AACjF,CAAC;AAED,uDAAuD;AACvD,MAAM,oBAAoB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;EAyBtC,CAAC"}
1
+ {"version":3,"file":"wgpuDitherEffect.js","sourceRoot":"","sources":["../src/wgpuDitherEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,iGAAiG;AACjG,4BAA4B;AAC5B,MAAM,UAAU,uBAAuB,CACrC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA8B;IAE9B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,UAAU,GAAG,8BAA8B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,SAAS,CAAC,CAAC;IACrG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7B,2CAA2C;QAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;QAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,6BAA6B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACnF,uBAAuB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAsB,CAAC,CAAC;AACnF,CAAC,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,KAAsB;IAC7D,wBAAwB,CAAC,KAAK,EAAE,cAAc,EAAE,6BAA6B,CAAC,CAAC;AACjF,CAAC;AAED,uDAAuD;AACvD,MAAM,oBAAoB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;EAyBtC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { WgpuRenderState, WgpuRenderTarget } from '@flighthq/types/contract';
2
+ interface WgpuEffectLogicalResolution {
3
+ readonly height: number;
4
+ readonly texelsPerLogicalPixel: number;
5
+ readonly width: number;
6
+ }
7
+ export declare function getWgpuEffectLogicalResolution(state: Readonly<WgpuRenderState>, target: Readonly<WgpuRenderTarget>): WgpuEffectLogicalResolution;
8
+ /**
9
+ * Texels per logical canvas pixel in an effect target.
10
+ *
11
+ * WebGPU effect targets use two texels per axis at `sampleCount: 4`. Pool scratch targets retain those
12
+ * enlarged dimensions while their own sample count is 1, so target-to-canvas dimensions are the reliable
13
+ * signal. Use this for descriptor distances and patterns expressed in logical pixels; physical raster
14
+ * kernels such as FXAA and SMAA must continue to use the actual target dimensions.
15
+ */
16
+ export declare function getWgpuRenderTargetTexelScale(targetWidth: number, canvasWidth: number): number;
17
+ export {};
18
+ //# sourceMappingURL=wgpuEffectTexelScale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuEffectTexelScale.d.ts","sourceRoot":"","sources":["../src/wgpuEffectTexelScale.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAElF,UAAU,2BAA2B;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,QAAQ,CAAC,eAAe,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GACjC,2BAA2B,CAO7B;AAED;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAG9F"}
@@ -0,0 +1,22 @@
1
+ export function getWgpuEffectLogicalResolution(state, target) {
2
+ const texelsPerLogicalPixel = getWgpuRenderTargetTexelScale(target.width, state.canvas.width);
3
+ return {
4
+ height: target.height / texelsPerLogicalPixel,
5
+ texelsPerLogicalPixel,
6
+ width: target.width / texelsPerLogicalPixel,
7
+ };
8
+ }
9
+ /**
10
+ * Texels per logical canvas pixel in an effect target.
11
+ *
12
+ * WebGPU effect targets use two texels per axis at `sampleCount: 4`. Pool scratch targets retain those
13
+ * enlarged dimensions while their own sample count is 1, so target-to-canvas dimensions are the reliable
14
+ * signal. Use this for descriptor distances and patterns expressed in logical pixels; physical raster
15
+ * kernels such as FXAA and SMAA must continue to use the actual target dimensions.
16
+ */
17
+ export function getWgpuRenderTargetTexelScale(targetWidth, canvasWidth) {
18
+ if (!Number.isFinite(targetWidth) || !Number.isFinite(canvasWidth) || canvasWidth <= 0)
19
+ return 1;
20
+ return Math.max(1, Math.round(targetWidth / canvasWidth));
21
+ }
22
+ //# sourceMappingURL=wgpuEffectTexelScale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuEffectTexelScale.js","sourceRoot":"","sources":["../src/wgpuEffectTexelScale.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,8BAA8B,CAC5C,KAAgC,EAChC,MAAkC;IAElC,MAAM,qBAAqB,GAAG,6BAA6B,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9F,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,qBAAqB;QAC7C,qBAAqB;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,qBAAqB;KAC5C,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,6BAA6B,CAAC,WAAmB,EAAE,WAAmB;IACpF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,WAAW,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IACjG,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC;AAC5D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuFxaaEffect.d.ts","sourceRoot":"","sources":["../src/wgpuFxaaEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAQtH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,GAC3B,IAAI,CAUN;AAED,eAAO,MAAM,2BAA2B,EAAE,sBAEzC,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAEnE"}
1
+ {"version":3,"file":"wgpuFxaaEffect.d.ts","sourceRoot":"","sources":["../src/wgpuFxaaEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAQtH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,GAC3B,IAAI,CAaN;AAED,eAAO,MAAM,2BAA2B,EAAE,sBAEzC,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAEnE"}
@@ -5,6 +5,9 @@ import { registerWgpuRenderEffect } from './wgpuRenderEffectRegistry';
5
5
  // recipe. Reads `tex`; u_resolution gives the texel size; u_edgeThreshold gates edge detection.
6
6
  export function applyFxaaEffectToWgpu(state, source, dest, effect) {
7
7
  const edgeThreshold = effect.edgeThreshold ?? 0.0312;
8
+ // Intentional PHYSICAL raster kernel: a resolved sampleCount 1→4 discriminator changed only 0.965%
9
+ // of pixels, kept shape centroids within 0.03 px, and shifted horizontal/vertical high-frequency
10
+ // energy by -0.31%. Its one-texel neighborhood therefore follows the actual source texture.
8
11
  const width = source.width;
9
12
  const height = source.height;
10
13
  const pipeline = getWgpuEffectPipeline(state, 'antialiasing.fxaa', FXAA_FRAGMENT_WGSL, 'replace');
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuFxaaEffect.js","sourceRoot":"","sources":["../src/wgpuFxaaEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,oGAAoG;AACpG,gGAAgG;AAChG,MAAM,UAAU,qBAAqB,CACnC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA4B;IAE5B,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC;IACrD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAC;IAClG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACf,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,2BAA2B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACjF,qBAAqB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAoB,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,KAAsB;IAC3D,wBAAwB,CAAC,KAAK,EAAE,YAAY,EAAE,2BAA2B,CAAC,CAAC;AAC7E,CAAC;AAED,0GAA0G;AAC1G,MAAM,kBAAkB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4CpC,CAAC"}
1
+ {"version":3,"file":"wgpuFxaaEffect.js","sourceRoot":"","sources":["../src/wgpuFxaaEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,oGAAoG;AACpG,gGAAgG;AAChG,MAAM,UAAU,qBAAqB,CACnC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA4B;IAE5B,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC;IACrD,mGAAmG;IACnG,iGAAiG;IACjG,4FAA4F;IAC5F,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAC;IAClG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACf,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,2BAA2B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACjF,qBAAqB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAoB,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,KAAsB;IAC3D,wBAAwB,CAAC,KAAK,EAAE,YAAY,EAAE,2BAA2B,CAAC,CAAC;AAC7E,CAAC;AAED,0GAA0G;AAC1G,MAAM,kBAAkB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4CpC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuGlitchEffect.d.ts","sourceRoot":"","sources":["../src/wgpuGlitchEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAQxH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC7B,IAAI,CAeN;AAED,eAAO,MAAM,6BAA6B,EAAE,sBAE3C,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAErE"}
1
+ {"version":3,"file":"wgpuGlitchEffect.d.ts","sourceRoot":"","sources":["../src/wgpuGlitchEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AASxH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC7B,IAAI,CAgBN;AAED,eAAO,MAAM,6BAA6B,EAAE,sBAE3C,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAErE"}
@@ -1,5 +1,6 @@
1
1
  import { drawWgpuEffectPass } from './wgpuEffectPass';
2
2
  import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
+ import { getWgpuEffectLogicalResolution } from './wgpuEffectTexelScale';
3
4
  import { registerWgpuRenderEffect } from './wgpuRenderEffectRegistry';
4
5
  // Glitch: split the frame into horizontal blocks, displace each by a per-block hash (data-mosh tear),
5
6
  // separate the RGB channels, and corrupt the occasional block to white. `seed` animates it.
@@ -8,6 +9,7 @@ export function applyGlitchEffectToWgpu(state, source, dest, effect) {
8
9
  const blockSize = effect.blockSize ?? 24;
9
10
  const colorShift = effect.colorShift ?? 8;
10
11
  const seed = effect.seed ?? 0;
12
+ const resolution = getWgpuEffectLogicalResolution(state, source);
11
13
  const pipeline = getWgpuEffectPipeline(state, 'stylization.glitch', GLITCH_FRAGMENT_WGSL, 'replace');
12
14
  drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
13
15
  f32[0] = intensity;
@@ -15,8 +17,8 @@ export function applyGlitchEffectToWgpu(state, source, dest, effect) {
15
17
  f32[2] = colorShift;
16
18
  f32[3] = seed;
17
19
  // u_resolution (vec2f) aligns to slot [4].
18
- f32[4] = source.width;
19
- f32[5] = source.height;
20
+ f32[4] = resolution.width;
21
+ f32[5] = resolution.height;
20
22
  });
21
23
  }
22
24
  export const defaultWgpuGlitchEffectRunner = (ctx, effect) => {
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuGlitchEffect.js","sourceRoot":"","sources":["../src/wgpuGlitchEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,sGAAsG;AACtG,4FAA4F;AAC5F,MAAM,UAAU,uBAAuB,CACrC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA8B;IAE9B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC;IAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,SAAS,CAAC,CAAC;IACrG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACd,2CAA2C;QAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,6BAA6B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACnF,uBAAuB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAsB,CAAC,CAAC;AACnF,CAAC,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,KAAsB;IAC7D,wBAAwB,CAAC,KAAK,EAAE,cAAc,EAAE,6BAA6B,CAAC,CAAC;AACjF,CAAC;AAED,0FAA0F;AAC1F,MAAM,oBAAoB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCtC,CAAC"}
1
+ {"version":3,"file":"wgpuGlitchEffect.js","sourceRoot":"","sources":["../src/wgpuGlitchEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,sGAAsG;AACtG,4FAA4F;AAC5F,MAAM,UAAU,uBAAuB,CACrC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA8B;IAE9B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC;IAC1C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,UAAU,GAAG,8BAA8B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,SAAS,CAAC,CAAC;IACrG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACd,2CAA2C;QAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;QAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,6BAA6B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACnF,uBAAuB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAsB,CAAC,CAAC;AACnF,CAAC,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,KAAsB;IAC7D,wBAAwB,CAAC,KAAK,EAAE,cAAc,EAAE,6BAA6B,CAAC,CAAC;AACjF,CAAC;AAED,0FAA0F;AAC1F,MAAM,oBAAoB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCtC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuKuwaharaEffect.d.ts","sourceRoot":"","sources":["../src/wgpuKuwaharaEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AASlC,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,GAC/B,IAAI,CASN;AAED,eAAO,MAAM,+BAA+B,EAAE,sBAE7C,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAEvE"}
1
+ {"version":3,"file":"wgpuKuwaharaEffect.d.ts","sourceRoot":"","sources":["../src/wgpuKuwaharaEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAUlC,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,GAC/B,IAAI,CAUN;AAED,eAAO,MAAM,+BAA+B,EAAE,sBAE7C,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAEvE"}
@@ -1,17 +1,19 @@
1
1
  import { drawWgpuEffectPass } from './wgpuEffectPass';
2
2
  import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
+ import { getWgpuEffectLogicalResolution } from './wgpuEffectTexelScale';
3
4
  import { registerWgpuRenderEffect } from './wgpuRenderEffectRegistry';
4
5
  // Kuwahara: edge-preserving smoothing. Over a fixed small radius split the neighborhood into four
5
6
  // overlapping quadrants, compute each mean and variance, and emit the lowest-variance mean — flattens
6
7
  // regions while keeping edges crisp. `radius` gates the sampled extent.
7
8
  export function applyKuwaharaEffectToWgpu(state, source, dest, effect) {
8
9
  const radius = effect.radius ?? 3;
10
+ const resolution = getWgpuEffectLogicalResolution(state, source);
9
11
  const pipeline = getWgpuEffectPipeline(state, 'stylization.kuwahara', KUWAHARA_FRAGMENT_WGSL, 'replace');
10
12
  drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
11
13
  f32[0] = Math.max(1, radius);
12
14
  // u_resolution (vec2f) aligns to slot [2].
13
- f32[2] = source.width;
14
- f32[3] = source.height;
15
+ f32[2] = resolution.width;
16
+ f32[3] = resolution.height;
15
17
  });
16
18
  }
17
19
  export const defaultWgpuKuwaharaEffectRunner = (ctx, effect) => {
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuKuwaharaEffect.js","sourceRoot":"","sources":["../src/wgpuKuwaharaEffect.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,kGAAkG;AAClG,sGAAsG;AACtG,wEAAwE;AACxE,MAAM,UAAU,yBAAyB,CACvC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAgC;IAEhC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,SAAS,CAAC,CAAC;IACzG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7B,2CAA2C;QAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,+BAA+B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACrF,yBAAyB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAwB,CAAC,CAAC;AACvF,CAAC,CAAC;AAEF,MAAM,UAAU,0BAA0B,CAAC,KAAsB;IAC/D,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,EAAE,+BAA+B,CAAC,CAAC;AACrF,CAAC;AAED,uDAAuD;AACvD,MAAM,sBAAsB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsDxC,CAAC"}
1
+ {"version":3,"file":"wgpuKuwaharaEffect.js","sourceRoot":"","sources":["../src/wgpuKuwaharaEffect.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,kGAAkG;AAClG,sGAAsG;AACtG,wEAAwE;AACxE,MAAM,UAAU,yBAAyB,CACvC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAgC;IAEhC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,UAAU,GAAG,8BAA8B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,SAAS,CAAC,CAAC;IACzG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC7B,2CAA2C;QAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;QAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,+BAA+B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACrF,yBAAyB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAwB,CAAC,CAAC;AACvF,CAAC,CAAC;AAEF,MAAM,UAAU,0BAA0B,CAAC,KAAsB;IAC/D,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,EAAE,+BAA+B,CAAC,CAAC;AACrF,CAAC;AAED,uDAAuD;AACvD,MAAM,sBAAsB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsDxC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuMotionBlurEffect.d.ts","sourceRoot":"","sources":["../src/wgpuMotionBlurEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAelC,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,eAAe,EAAE,UAAU,GAAG,IAAI,EAClC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GACjC,IAAI,CAwCN;AAED,eAAO,MAAM,iCAAiC,EAAE,sBAE/C,CAAC;AAEF,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAEzE"}
1
+ {"version":3,"file":"wgpuMotionBlurEffect.d.ts","sourceRoot":"","sources":["../src/wgpuMotionBlurEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAgBlC,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,eAAe,EAAE,UAAU,GAAG,IAAI,EAClC,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GACjC,IAAI,CAyCN;AAED,eAAO,MAAM,iCAAiC,EAAE,sBAE/C,CAAC;AAEF,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAEzE"}
@@ -1,4 +1,5 @@
1
1
  import { createWgpuDualSourceEffectPipeline, drawWgpuDualSourceEffectPass } from './wgpuEffectPass';
2
+ import { getWgpuEffectLogicalResolution } from './wgpuEffectTexelScale';
2
3
  import { registerWgpuRenderEffect } from './wgpuRenderEffectRegistry';
3
4
  // Motion blur (per-object): the velocity-driven analog of the depth consumers (fog/DoF), the Wgpu
4
5
  // mirror of effects-gl's applyMotionBlurEffectToGl. When the scene produced a per-pixel velocity
@@ -12,6 +13,7 @@ import { registerWgpuRenderEffect } from './wgpuRenderEffectRegistry';
12
13
  export function applyMotionBlurEffectToWgpu(state, source, dest, velocityTexture, effect) {
13
14
  const intensity = effect.intensity ?? 1;
14
15
  const samples = effect.samples ?? 16;
16
+ const resolution = getWgpuEffectLogicalResolution(state, source);
15
17
  const pipeline = getMotionBlurPipeline(state);
16
18
  if (velocityTexture === null) {
17
19
  // Sentinel path: no velocity buffer — bind source as both inputs so the dual-source layout is
@@ -19,8 +21,8 @@ export function applyMotionBlurEffectToWgpu(state, source, dest, velocityTexture
19
21
  drawWgpuDualSourceEffectPass(state, source, source, dest, pipeline, (f32) => {
20
22
  f32[0] = intensity;
21
23
  f32[1] = samples;
22
- f32[2] = source.width;
23
- f32[3] = source.height;
24
+ f32[2] = resolution.width;
25
+ f32[3] = resolution.height;
24
26
  f32[4] = 0;
25
27
  });
26
28
  return;
@@ -31,8 +33,8 @@ export function applyMotionBlurEffectToWgpu(state, source, dest, velocityTexture
31
33
  drawWgpuDualSourceEffectPass(state, source, velocitySource, dest, pipeline, (f32) => {
32
34
  f32[0] = intensity;
33
35
  f32[1] = samples;
34
- f32[2] = source.width;
35
- f32[3] = source.height;
36
+ f32[2] = resolution.width;
37
+ f32[3] = resolution.height;
36
38
  f32[4] = 1;
37
39
  });
38
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuMotionBlurEffect.js","sourceRoot":"","sources":["../src/wgpuMotionBlurEffect.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wgpuMotionBlurEffect.js","sourceRoot":"","sources":["../src/wgpuMotionBlurEffect.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuPixelateEffect.d.ts","sourceRoot":"","sources":["../src/wgpuPixelateEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAOlC,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,GAC/B,IAAI,CASN;AAED,eAAO,MAAM,+BAA+B,EAAE,sBAE7C,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAEvE"}
1
+ {"version":3,"file":"wgpuPixelateEffect.d.ts","sourceRoot":"","sources":["../src/wgpuPixelateEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAQlC,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,cAAc,CAAC,GAC/B,IAAI,CAUN;AAED,eAAO,MAAM,+BAA+B,EAAE,sBAE7C,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAEvE"}
@@ -1,15 +1,17 @@
1
1
  import { drawWgpuEffectPass } from './wgpuEffectPass';
2
2
  import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
+ import { getWgpuEffectLogicalResolution } from './wgpuEffectTexelScale';
3
4
  import { registerWgpuRenderEffect } from './wgpuRenderEffectRegistry';
4
5
  // Pixelate: snap uv to the center of `size`-pixel blocks before sampling, producing hard mosaic blocks.
5
6
  export function applyPixelateEffectToWgpu(state, source, dest, effect) {
6
7
  const size = effect.size ?? 8;
8
+ const resolution = getWgpuEffectLogicalResolution(state, source);
7
9
  const pipeline = getWgpuEffectPipeline(state, 'stylization.pixelate', PIXELATE_FRAGMENT_WGSL, 'replace');
8
10
  drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
9
11
  f32[0] = Math.max(1, size);
10
12
  // u_resolution (vec2f) aligns to slot [2].
11
- f32[2] = source.width;
12
- f32[3] = source.height;
13
+ f32[2] = resolution.width;
14
+ f32[3] = resolution.height;
13
15
  });
14
16
  }
15
17
  export const defaultWgpuPixelateEffectRunner = (ctx, effect) => {
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuPixelateEffect.js","sourceRoot":"","sources":["../src/wgpuPixelateEffect.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,wGAAwG;AACxG,MAAM,UAAU,yBAAyB,CACvC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAgC;IAEhC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,SAAS,CAAC,CAAC;IACzG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3B,2CAA2C;QAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,+BAA+B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACrF,yBAAyB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAwB,CAAC,CAAC;AACvF,CAAC,CAAC;AAEF,MAAM,UAAU,0BAA0B,CAAC,KAAsB;IAC/D,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,EAAE,+BAA+B,CAAC,CAAC;AACrF,CAAC;AAED,qDAAqD;AACrD,MAAM,sBAAsB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;EAexC,CAAC"}
1
+ {"version":3,"file":"wgpuPixelateEffect.js","sourceRoot":"","sources":["../src/wgpuPixelateEffect.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,wGAAwG;AACxG,MAAM,UAAU,yBAAyB,CACvC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAgC;IAEhC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,UAAU,GAAG,8BAA8B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,SAAS,CAAC,CAAC;IACzG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC3B,2CAA2C;QAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;QAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,+BAA+B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACrF,yBAAyB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAwB,CAAC,CAAC;AACvF,CAAC,CAAC;AAEF,MAAM,UAAU,0BAA0B,CAAC,KAAsB;IAC/D,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,EAAE,+BAA+B,CAAC,CAAC;AACrF,CAAC;AAED,qDAAqD;AACrD,MAAM,sBAAsB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;EAexC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuSharpenEffect.d.ts","sourceRoot":"","sources":["../src/wgpuSharpenEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAOlC,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,GAC9B,IAAI,CASN;AAED,eAAO,MAAM,8BAA8B,EAAE,sBAE5C,CAAC;AAEF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAEtE"}
1
+ {"version":3,"file":"wgpuSharpenEffect.d.ts","sourceRoot":"","sources":["../src/wgpuSharpenEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAQlC,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,GAC9B,IAAI,CAUN;AAED,eAAO,MAAM,8BAA8B,EAAE,sBAE5C,CAAC;AAEF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAEtE"}
@@ -1,15 +1,17 @@
1
1
  import { drawWgpuEffectPass } from './wgpuEffectPass';
2
2
  import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
+ import { getWgpuEffectLogicalResolution } from './wgpuEffectTexelScale';
3
4
  import { registerWgpuRenderEffect } from './wgpuRenderEffectRegistry';
4
5
  // Sharpen: unsharp mask via a 3x3 Laplacian kernel; `amount` scales the high-frequency boost.
5
6
  export function applySharpenEffectToWgpu(state, source, dest, effect) {
6
7
  const amount = effect.amount ?? 0.5;
8
+ const resolution = getWgpuEffectLogicalResolution(state, source);
7
9
  const pipeline = getWgpuEffectPipeline(state, 'stylization.sharpen', SHARPEN_FRAGMENT_WGSL, 'replace');
8
10
  drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
9
11
  f32[0] = amount;
10
12
  // u_resolution (vec2f) aligns to slot [2].
11
- f32[2] = source.width;
12
- f32[3] = source.height;
13
+ f32[2] = resolution.width;
14
+ f32[3] = resolution.height;
13
15
  });
14
16
  }
15
17
  export const defaultWgpuSharpenEffectRunner = (ctx, effect) => {
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuSharpenEffect.js","sourceRoot":"","sources":["../src/wgpuSharpenEffect.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,8FAA8F;AAC9F,MAAM,UAAU,wBAAwB,CACtC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA+B;IAE/B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC;IACpC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,SAAS,CAAC,CAAC;IACvG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAChB,2CAA2C;QAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACpF,wBAAwB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAuB,CAAC,CAAC;AACrF,CAAC,CAAC;AAEF,MAAM,UAAU,yBAAyB,CAAC,KAAsB;IAC9D,wBAAwB,CAAC,KAAK,EAAE,eAAe,EAAE,8BAA8B,CAAC,CAAC;AACnF,CAAC;AAED,uDAAuD;AACvD,MAAM,qBAAqB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;EAqBvC,CAAC"}
1
+ {"version":3,"file":"wgpuSharpenEffect.js","sourceRoot":"","sources":["../src/wgpuSharpenEffect.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,8FAA8F;AAC9F,MAAM,UAAU,wBAAwB,CACtC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA+B;IAE/B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC;IACpC,MAAM,UAAU,GAAG,8BAA8B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,SAAS,CAAC,CAAC;IACvG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAChB,2CAA2C;QAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;QAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACpF,wBAAwB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAuB,CAAC,CAAC;AACrF,CAAC,CAAC;AAEF,MAAM,UAAU,yBAAyB,CAAC,KAAsB;IAC9D,wBAAwB,CAAC,KAAK,EAAE,eAAe,EAAE,8BAA8B,CAAC,CAAC;AACnF,CAAC;AAED,uDAAuD;AACvD,MAAM,qBAAqB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;EAqBvC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuSmaaEffect.d.ts","sourceRoot":"","sources":["../src/wgpuSmaaEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAStH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,GAC3B,IAAI,CAUN;AAED,eAAO,MAAM,2BAA2B,EAAE,sBAEzC,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAEnE"}
1
+ {"version":3,"file":"wgpuSmaaEffect.d.ts","sourceRoot":"","sources":["../src/wgpuSmaaEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAStH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,GAC3B,IAAI,CAaN;AAED,eAAO,MAAM,2BAA2B,EAAE,sBAEzC,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAEnE"}
@@ -6,6 +6,9 @@ import { registerWgpuRenderEffect } from './wgpuRenderEffectRegistry';
6
6
  // softens detected edges only and is acceptable until the multi-pass recipe lands.
7
7
  export function applySmaaEffectToWgpu(state, source, dest, effect) {
8
8
  const threshold = effect.threshold ?? 0.1;
9
+ // Intentional PHYSICAL raster kernel: a resolved sampleCount 1→4 discriminator changed only 1.011%
10
+ // of pixels, kept shape centroids within 0.03 px, and shifted horizontal/vertical high-frequency
11
+ // energy by +0.03%. Its one-texel neighborhood therefore follows the actual source texture.
9
12
  const width = source.width;
10
13
  const height = source.height;
11
14
  const pipeline = getWgpuEffectPipeline(state, 'antialiasing.smaa', SMAA_FRAGMENT_WGSL, 'replace');
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuSmaaEffect.js","sourceRoot":"","sources":["../src/wgpuSmaaEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,iGAAiG;AACjG,sGAAsG;AACtG,mFAAmF;AACnF,MAAM,UAAU,qBAAqB,CACnC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA4B;IAE5B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAC;IAClG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACf,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,2BAA2B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACjF,qBAAqB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAoB,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,KAAsB;IAC3D,wBAAwB,CAAC,KAAK,EAAE,YAAY,EAAE,2BAA2B,CAAC,CAAC;AAC7E,CAAC;AAED,sGAAsG;AACtG,MAAM,kBAAkB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BpC,CAAC"}
1
+ {"version":3,"file":"wgpuSmaaEffect.js","sourceRoot":"","sources":["../src/wgpuSmaaEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,iGAAiG;AACjG,sGAAsG;AACtG,mFAAmF;AACnF,MAAM,UAAU,qBAAqB,CACnC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA4B;IAE5B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC;IAC1C,mGAAmG;IACnG,iGAAiG;IACjG,4FAA4F;IAC5F,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAC;IAClG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACf,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,2BAA2B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACjF,qBAAqB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAoB,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,KAAsB;IAC3D,wBAAwB,CAAC,KAAK,EAAE,YAAY,EAAE,2BAA2B,CAAC,CAAC;AAC7E,CAAC;AAED,sGAAsG;AACtG,MAAM,kBAAkB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8BpC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuSsaoEffect.d.ts","sourceRoot":"","sources":["../src/wgpuSsaoEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAWtH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,GAC3B,IAAI,CAUN;AAED,eAAO,MAAM,2BAA2B,EAAE,sBAEzC,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAEnE"}
1
+ {"version":3,"file":"wgpuSsaoEffect.d.ts","sourceRoot":"","sources":["../src/wgpuSsaoEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAYtH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,GAC3B,IAAI,CAWN;AAED,eAAO,MAAM,2BAA2B,EAAE,sBAEzC,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAEnE"}
@@ -1,5 +1,6 @@
1
1
  import { drawWgpuEffectPass } from './wgpuEffectPass';
2
2
  import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
+ import { getWgpuEffectLogicalResolution } from './wgpuEffectTexelScale';
3
4
  import { registerWgpuRenderEffect } from './wgpuRenderEffectRegistry';
4
5
  // SSAO: ambient-occlusion approximation. Real SSAO reconstructs view-space position/normals from a
5
6
  // sampleable DEPTH texture and accumulates occlusion over `samples` kernel offsets within `radius`,
@@ -9,12 +10,13 @@ import { registerWgpuRenderEffect } from './wgpuRenderEffectRegistry';
9
10
  export function applySsaoEffectToWgpu(state, source, dest, effect) {
10
11
  const radius = effect.radius ?? 1;
11
12
  const intensity = effect.intensity ?? 1;
13
+ const resolution = getWgpuEffectLogicalResolution(state, source);
12
14
  const pipeline = getWgpuEffectPipeline(state, 'atmospheric.ssao', SSAO_FRAGMENT_WGSL, 'replace');
13
15
  drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
14
16
  f32[0] = radius;
15
17
  f32[1] = intensity;
16
- f32[2] = source.width;
17
- f32[3] = source.height;
18
+ f32[2] = resolution.width;
19
+ f32[3] = resolution.height;
18
20
  });
19
21
  }
20
22
  export const defaultWgpuSsaoEffectRunner = (ctx, effect) => {
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuSsaoEffect.js","sourceRoot":"","sources":["../src/wgpuSsaoEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,mGAAmG;AACnG,oGAAoG;AACpG,sGAAsG;AACtG,sGAAsG;AACtG,yEAAyE;AACzE,MAAM,UAAU,qBAAqB,CACnC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA4B;IAE5B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAC;IACjG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,2BAA2B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACjF,qBAAqB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAoB,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,KAAsB;IAC3D,wBAAwB,CAAC,KAAK,EAAE,YAAY,EAAE,2BAA2B,CAAC,CAAC;AAC7E,CAAC;AAED,8EAA8E;AAC9E,MAAM,kBAAkB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BpC,CAAC"}
1
+ {"version":3,"file":"wgpuSsaoEffect.js","sourceRoot":"","sources":["../src/wgpuSsaoEffect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,mGAAmG;AACnG,oGAAoG;AACpG,sGAAsG;AACtG,sGAAsG;AACtG,yEAAyE;AACzE,MAAM,UAAU,qBAAqB,CACnC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAA4B;IAE5B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,8BAA8B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAC;IACjG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;QAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,2BAA2B,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACjF,qBAAqB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAoB,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,KAAsB;IAC3D,wBAAwB,CAAC,KAAK,EAAE,YAAY,EAAE,2BAA2B,CAAC,CAAC;AAC7E,CAAC;AAED,8EAA8E;AAC9E,MAAM,kBAAkB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BpC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuTiltShiftEffect.d.ts","sourceRoot":"","sources":["../src/wgpuTiltShiftEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AASlC,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,GAChC,IAAI,CAYN;AAED,eAAO,MAAM,gCAAgC,EAAE,sBAE9C,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAExE"}
1
+ {"version":3,"file":"wgpuTiltShiftEffect.d.ts","sourceRoot":"","sources":["../src/wgpuTiltShiftEffect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EACjB,MAAM,0BAA0B,CAAC;AAUlC,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAClC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAChC,MAAM,EAAE,QAAQ,CAAC,eAAe,CAAC,GAChC,IAAI,CAaN;AAED,eAAO,MAAM,gCAAgC,EAAE,sBAE9C,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAExE"}
@@ -1,5 +1,6 @@
1
1
  import { drawWgpuEffectPass } from './wgpuEffectPass';
2
2
  import { getWgpuEffectPipeline } from './wgpuEffectProgramCache';
3
+ import { getWgpuEffectLogicalResolution } from './wgpuEffectTexelScale';
3
4
  import { registerWgpuRenderEffect } from './wgpuRenderEffectRegistry';
4
5
  // Tilt-shift: keep a horizontal focus band sharp and blur above and below it. The band is centered at
5
6
  // `center` on Y with height `width`; blur strength ramps with distance outside the band. Blur is
@@ -8,13 +9,14 @@ export function applyTiltShiftEffectToWgpu(state, source, dest, effect) {
8
9
  const center = effect.center ?? 0.5;
9
10
  const width = effect.width ?? 0.3;
10
11
  const blur = effect.blur ?? 4;
12
+ const resolution = getWgpuEffectLogicalResolution(state, source);
11
13
  const pipeline = getWgpuEffectPipeline(state, 'lens.tiltShift', TILT_SHIFT_FRAGMENT_WGSL, 'replace');
12
14
  drawWgpuEffectPass(state, source, dest, pipeline, (f32) => {
13
15
  f32[0] = center;
14
16
  f32[1] = width;
15
17
  f32[2] = blur;
16
- f32[4] = source.width;
17
- f32[5] = source.height;
18
+ f32[4] = resolution.width;
19
+ f32[5] = resolution.height;
18
20
  });
19
21
  }
20
22
  export const defaultWgpuTiltShiftEffectRunner = (ctx, effect) => {
@@ -1 +1 @@
1
- {"version":3,"file":"wgpuTiltShiftEffect.js","sourceRoot":"","sources":["../src/wgpuTiltShiftEffect.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,sGAAsG;AACtG,iGAAiG;AACjG,kGAAkG;AAClG,MAAM,UAAU,0BAA0B,CACxC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAiC;IAEjC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC;IACpC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,SAAS,CAAC,CAAC;IACrG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACf,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACd,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,gCAAgC,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACtF,0BAA0B,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAyB,CAAC,CAAC;AACzF,CAAC,CAAC;AAEF,MAAM,UAAU,2BAA2B,CAAC,KAAsB;IAChE,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,EAAE,gCAAgC,CAAC,CAAC;AACvF,CAAC;AAED,uGAAuG;AACvG,MAAM,wBAAwB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2B1C,CAAC"}
1
+ {"version":3,"file":"wgpuTiltShiftEffect.js","sourceRoot":"","sources":["../src/wgpuTiltShiftEffect.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,sGAAsG;AACtG,iGAAiG;AACjG,kGAAkG;AAClG,MAAM,UAAU,0BAA0B,CACxC,KAAsB,EACtB,MAAkC,EAClC,IAAgC,EAChC,MAAiC;IAEjC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC;IACpC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC;IAClC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,UAAU,GAAG,8BAA8B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,SAAS,CAAC,CAAC;IACrG,kBAAkB,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QAChG,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QACf,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QACd,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC;QAC1B,GAAG,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,gCAAgC,GAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;IACtF,0BAA0B,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,MAAyB,CAAC,CAAC;AACzF,CAAC,CAAC;AAEF,MAAM,UAAU,2BAA2B,CAAC,KAAsB;IAChE,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,EAAE,gCAAgC,CAAC,CAAC;AACvF,CAAC;AAED,uGAAuG;AACvG,MAAM,wBAAwB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2B1C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flighthq/effects-wgpu",
3
- "version": "0.4.0-next.1836.147ae1e",
3
+ "version": "0.4.0-next.1884.6a2d46f",
4
4
  "author": "Joshua Granick and other contributors",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -38,14 +38,14 @@
38
38
  "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
39
39
  },
40
40
  "dependencies": {
41
- "@flighthq/adjustments": "0.4.0-next.1836.147ae1e",
42
- "@flighthq/color": "0.4.0-next.1836.147ae1e",
43
- "@flighthq/effects": "0.4.0-next.1836.147ae1e",
44
- "@flighthq/geometry": "0.4.0-next.1836.147ae1e",
45
- "@flighthq/log": "0.4.0-next.1836.147ae1e",
46
- "@flighthq/render-wgpu": "0.4.0-next.1836.147ae1e",
47
- "@flighthq/registry": "0.4.0-next.1836.147ae1e",
48
- "@flighthq/types": "0.4.0-next.1836.147ae1e"
41
+ "@flighthq/adjustments": "0.4.0-next.1884.6a2d46f",
42
+ "@flighthq/color": "0.4.0-next.1884.6a2d46f",
43
+ "@flighthq/effects": "0.4.0-next.1884.6a2d46f",
44
+ "@flighthq/geometry": "0.4.0-next.1884.6a2d46f",
45
+ "@flighthq/log": "0.4.0-next.1884.6a2d46f",
46
+ "@flighthq/render-wgpu": "0.4.0-next.1884.6a2d46f",
47
+ "@flighthq/registry": "0.4.0-next.1884.6a2d46f",
48
+ "@flighthq/types": "0.4.0-next.1884.6a2d46f"
49
49
  },
50
50
  "peerDependencies": {
51
51
  "@webgpu/types": "^0.1.70"
@@ -0,0 +1,47 @@
1
+ import { describe, expect, it } from 'vitest';
2
+
3
+ import { getWgpuEffectLogicalResolution, getWgpuRenderTargetTexelScale } from './wgpuEffectTexelScale';
4
+
5
+ describe('getWgpuEffectLogicalResolution', () => {
6
+ const state = { canvas: { width: 800, height: 600 } };
7
+
8
+ it('preserves native target dimensions', () => {
9
+ expect(
10
+ getWgpuEffectLogicalResolution(
11
+ state as never,
12
+ {
13
+ width: 800,
14
+ height: 600,
15
+ sampleCount: 1,
16
+ } as never,
17
+ ),
18
+ ).toEqual({ width: 800, height: 600, texelsPerLogicalPixel: 1 });
19
+ });
20
+
21
+ it('normalizes supersampled scratch targets even when their sample count is one', () => {
22
+ expect(
23
+ getWgpuEffectLogicalResolution(
24
+ state as never,
25
+ {
26
+ width: 1600,
27
+ height: 1200,
28
+ sampleCount: 1,
29
+ } as never,
30
+ ),
31
+ ).toEqual({ width: 800, height: 600, texelsPerLogicalPixel: 2 });
32
+ });
33
+ });
34
+
35
+ describe('getWgpuRenderTargetTexelScale', () => {
36
+ it('derives integer texel density from target and canvas widths', () => {
37
+ expect(getWgpuRenderTargetTexelScale(800, 800)).toBe(1);
38
+ expect(getWgpuRenderTargetTexelScale(1600, 800)).toBe(2);
39
+ expect(getWgpuRenderTargetTexelScale(2400, 800)).toBe(3);
40
+ });
41
+
42
+ it('falls back to one for invalid or undersized dimensions', () => {
43
+ expect(getWgpuRenderTargetTexelScale(400, 800)).toBe(1);
44
+ expect(getWgpuRenderTargetTexelScale(Number.NaN, 800)).toBe(1);
45
+ expect(getWgpuRenderTargetTexelScale(800, 0)).toBe(1);
46
+ });
47
+ });
@@ -0,0 +1,247 @@
1
+ import type { WgpuRenderState, WgpuRenderTarget } from '@flighthq/types/contract';
2
+
3
+ import type * as WgpuCrtEffectModule from './wgpuCrtEffect';
4
+ import type * as WgpuDirectionalBlurEffectModule from './wgpuDirectionalBlurEffect';
5
+ import type * as WgpuDisplacementEffectModule from './wgpuDisplacementEffect';
6
+ import type * as WgpuDitherEffectModule from './wgpuDitherEffect';
7
+ import type * as WgpuFxaaEffectModule from './wgpuFxaaEffect';
8
+ import type * as WgpuGlitchEffectModule from './wgpuGlitchEffect';
9
+ import type * as WgpuKuwaharaEffectModule from './wgpuKuwaharaEffect';
10
+ import type * as WgpuMotionBlurEffectModule from './wgpuMotionBlurEffect';
11
+ import type * as WgpuPixelateEffectModule from './wgpuPixelateEffect';
12
+ import type * as WgpuSharpenEffectModule from './wgpuSharpenEffect';
13
+ import type * as WgpuSmaaEffectModule from './wgpuSmaaEffect';
14
+ import type * as WgpuSsaoEffectModule from './wgpuSsaoEffect';
15
+ import type * as WgpuTiltShiftEffectModule from './wgpuTiltShiftEffect';
16
+
17
+ const recorded = { uniforms: [] as number[][] };
18
+ const passMock = () => {
19
+ const recordUniforms = (setUniforms: (f32: Float32Array) => void): void => {
20
+ const f32 = new Float32Array(8);
21
+ setUniforms(f32);
22
+ recorded.uniforms.push([...f32]);
23
+ };
24
+
25
+ return {
26
+ createWgpuDualSourceEffectPipeline: vi.fn(() => ({})),
27
+ drawWgpuDualSourceEffectPass: vi.fn(
28
+ (
29
+ _state: unknown,
30
+ _firstSource: unknown,
31
+ _secondSource: unknown,
32
+ _dest: unknown,
33
+ _pipeline: unknown,
34
+ setUniforms: (f32: Float32Array) => void,
35
+ ) => recordUniforms(setUniforms),
36
+ ),
37
+ drawWgpuEffectPass: vi.fn(
38
+ (
39
+ _state: unknown,
40
+ _source: unknown,
41
+ _dest: unknown,
42
+ _pipeline: unknown,
43
+ setUniforms: (f32: Float32Array) => void,
44
+ ) => recordUniforms(setUniforms),
45
+ ),
46
+ };
47
+ };
48
+ const pipelineMock = { getWgpuEffectPipeline: vi.fn(() => ({})) };
49
+
50
+ let applyCrtEffectToWgpu: typeof WgpuCrtEffectModule.applyCrtEffectToWgpu;
51
+ let applyDirectionalBlurEffectToWgpu: typeof WgpuDirectionalBlurEffectModule.applyDirectionalBlurEffectToWgpu;
52
+ let applyDisplacementEffectToWgpu: typeof WgpuDisplacementEffectModule.applyDisplacementEffectToWgpu;
53
+ let applyDitherEffectToWgpu: typeof WgpuDitherEffectModule.applyDitherEffectToWgpu;
54
+ let applyFxaaEffectToWgpu: typeof WgpuFxaaEffectModule.applyFxaaEffectToWgpu;
55
+ let applyGlitchEffectToWgpu: typeof WgpuGlitchEffectModule.applyGlitchEffectToWgpu;
56
+ let applyKuwaharaEffectToWgpu: typeof WgpuKuwaharaEffectModule.applyKuwaharaEffectToWgpu;
57
+ let applyMotionBlurEffectToWgpu: typeof WgpuMotionBlurEffectModule.applyMotionBlurEffectToWgpu;
58
+ let applyPixelateEffectToWgpu: typeof WgpuPixelateEffectModule.applyPixelateEffectToWgpu;
59
+ let applySharpenEffectToWgpu: typeof WgpuSharpenEffectModule.applySharpenEffectToWgpu;
60
+ let applySmaaEffectToWgpu: typeof WgpuSmaaEffectModule.applySmaaEffectToWgpu;
61
+ let applySsaoEffectToWgpu: typeof WgpuSsaoEffectModule.applySsaoEffectToWgpu;
62
+ let applyTiltShiftEffectToWgpu: typeof WgpuTiltShiftEffectModule.applyTiltShiftEffectToWgpu;
63
+
64
+ beforeAll(async () => {
65
+ vi.doMock('./wgpuEffectPass', passMock);
66
+ vi.doMock('./wgpuEffectProgramCache', () => pipelineMock);
67
+
68
+ const [
69
+ crt,
70
+ directionalBlur,
71
+ displacement,
72
+ dither,
73
+ fxaa,
74
+ glitch,
75
+ kuwahara,
76
+ motionBlur,
77
+ pixelate,
78
+ sharpen,
79
+ smaa,
80
+ ssao,
81
+ tiltShift,
82
+ ] = await Promise.all([
83
+ import('./wgpuCrtEffect'),
84
+ import('./wgpuDirectionalBlurEffect'),
85
+ import('./wgpuDisplacementEffect'),
86
+ import('./wgpuDitherEffect'),
87
+ import('./wgpuFxaaEffect'),
88
+ import('./wgpuGlitchEffect'),
89
+ import('./wgpuKuwaharaEffect'),
90
+ import('./wgpuMotionBlurEffect'),
91
+ import('./wgpuPixelateEffect'),
92
+ import('./wgpuSharpenEffect'),
93
+ import('./wgpuSmaaEffect'),
94
+ import('./wgpuSsaoEffect'),
95
+ import('./wgpuTiltShiftEffect'),
96
+ ]);
97
+ ({ applyCrtEffectToWgpu } = crt);
98
+ ({ applyDirectionalBlurEffectToWgpu } = directionalBlur);
99
+ ({ applyDisplacementEffectToWgpu } = displacement);
100
+ ({ applyDitherEffectToWgpu } = dither);
101
+ ({ applyFxaaEffectToWgpu } = fxaa);
102
+ ({ applyGlitchEffectToWgpu } = glitch);
103
+ ({ applyKuwaharaEffectToWgpu } = kuwahara);
104
+ ({ applyMotionBlurEffectToWgpu } = motionBlur);
105
+ ({ applyPixelateEffectToWgpu } = pixelate);
106
+ ({ applySharpenEffectToWgpu } = sharpen);
107
+ ({ applySmaaEffectToWgpu } = smaa);
108
+ ({ applySsaoEffectToWgpu } = ssao);
109
+ ({ applyTiltShiftEffectToWgpu } = tiltShift);
110
+ }, 30_000);
111
+
112
+ type ApplyEffect = (
113
+ state: WgpuRenderState,
114
+ source: Readonly<WgpuRenderTarget>,
115
+ dest: Readonly<WgpuRenderTarget>,
116
+ ) => void;
117
+
118
+ const state = { canvas: { height: 600, width: 800 } } as WgpuRenderState;
119
+ const nativeTarget = { height: 600, sampleCount: 1, view: {}, width: 800 } as unknown as WgpuRenderTarget;
120
+ // Pool scratch targets preserve supersampled dimensions but have sampleCount 1; this is the discriminator
121
+ // that prevents a tempting sampleCount-derived implementation from silently returning the wrong scale.
122
+ const supersampledScratchTarget = {
123
+ height: 1200,
124
+ sampleCount: 1,
125
+ view: {},
126
+ width: 1600,
127
+ } as unknown as WgpuRenderTarget;
128
+
129
+ const logicalEffects: ReadonlyArray<{
130
+ readonly apply: ApplyEffect;
131
+ readonly name: string;
132
+ readonly resolutionSlot: number;
133
+ }> = [
134
+ {
135
+ apply: (renderState, source, dest) =>
136
+ applyTiltShiftEffectToWgpu(renderState, source, dest, { kind: 'TiltShiftEffect' } as never),
137
+ name: 'tilt-shift',
138
+ resolutionSlot: 4,
139
+ },
140
+ {
141
+ apply: (renderState, source, dest) =>
142
+ applyDisplacementEffectToWgpu(renderState, source, dest, { kind: 'DisplacementEffect' } as never),
143
+ name: 'displacement',
144
+ resolutionSlot: 4,
145
+ },
146
+ {
147
+ apply: (renderState, source, dest) =>
148
+ applyDirectionalBlurEffectToWgpu(renderState, source, dest, { kind: 'DirectionalBlurEffect' } as never),
149
+ name: 'directional blur',
150
+ resolutionSlot: 4,
151
+ },
152
+ {
153
+ apply: (renderState, source, dest) =>
154
+ applyKuwaharaEffectToWgpu(renderState, source, dest, { kind: 'KuwaharaEffect' } as never),
155
+ name: 'kuwahara',
156
+ resolutionSlot: 2,
157
+ },
158
+ {
159
+ apply: (renderState, source, dest) =>
160
+ applyGlitchEffectToWgpu(renderState, source, dest, { kind: 'GlitchEffect' } as never),
161
+ name: 'glitch',
162
+ resolutionSlot: 4,
163
+ },
164
+ {
165
+ apply: (renderState, source, dest) =>
166
+ applyMotionBlurEffectToWgpu(
167
+ renderState,
168
+ source,
169
+ dest,
170
+ { createView: () => ({}) } as unknown as GPUTexture,
171
+ { kind: 'MotionBlurEffect' } as never,
172
+ ),
173
+ name: 'active motion blur',
174
+ resolutionSlot: 2,
175
+ },
176
+ {
177
+ apply: (renderState, source, dest) =>
178
+ applySsaoEffectToWgpu(renderState, source, dest, { kind: 'SsaoEffect' } as never),
179
+ name: 'SSAO',
180
+ resolutionSlot: 2,
181
+ },
182
+ {
183
+ apply: (renderState, source, dest) =>
184
+ applyPixelateEffectToWgpu(renderState, source, dest, { kind: 'PixelateEffect' } as never),
185
+ name: 'pixelate',
186
+ resolutionSlot: 2,
187
+ },
188
+ {
189
+ apply: (renderState, source, dest) =>
190
+ applyDitherEffectToWgpu(renderState, source, dest, { kind: 'DitherEffect' } as never),
191
+ name: 'dither',
192
+ resolutionSlot: 2,
193
+ },
194
+ {
195
+ apply: (renderState, source, dest) =>
196
+ applyCrtEffectToWgpu(renderState, source, dest, { kind: 'CrtEffect' } as never),
197
+ name: 'CRT',
198
+ resolutionSlot: 4,
199
+ },
200
+ {
201
+ apply: (renderState, source, dest) =>
202
+ applySharpenEffectToWgpu(renderState, source, dest, { kind: 'SharpenEffect' } as never),
203
+ name: 'sharpen',
204
+ resolutionSlot: 2,
205
+ },
206
+ ];
207
+
208
+ const physicalEffects: ReadonlyArray<{ readonly apply: ApplyEffect; readonly name: string }> = [
209
+ {
210
+ apply: (renderState, source, dest) =>
211
+ applyFxaaEffectToWgpu(renderState, source, dest, { kind: 'FxaaEffect' } as never),
212
+ name: 'FXAA',
213
+ },
214
+ {
215
+ apply: (renderState, source, dest) =>
216
+ applySmaaEffectToWgpu(renderState, source, dest, { kind: 'SmaaEffect' } as never),
217
+ name: 'SMAA',
218
+ },
219
+ ];
220
+
221
+ function uploadedBy(apply: ApplyEffect, target: WgpuRenderTarget): readonly number[] {
222
+ recorded.uniforms.length = 0;
223
+ apply(state, target, target);
224
+ return recorded.uniforms[0]!;
225
+ }
226
+
227
+ describe('logical effect resolution', () => {
228
+ // MEASURED defeat proof: replacing the dimension-derived scale with 1 made all eleven table rows fail
229
+ // on the scratch target with `expected [1600, 1200] to deeply equal [800, 600]`; both physical rows
230
+ // remained green. This guards the shared unit conversion as well as every approved effect's wiring.
231
+ it.each(logicalEffects)('$name keeps descriptor distances stable across supersampled scratch targets', (effect) => {
232
+ expect(uploadedBy(effect.apply, nativeTarget).slice(effect.resolutionSlot, effect.resolutionSlot + 2)).toEqual([
233
+ 800, 600,
234
+ ]);
235
+ expect(
236
+ uploadedBy(effect.apply, supersampledScratchTarget).slice(effect.resolutionSlot, effect.resolutionSlot + 2),
237
+ ).toEqual([800, 600]);
238
+ });
239
+
240
+ // FXAA and SMAA are deliberately excluded from logical normalization. Resolved sampleCount 1→4
241
+ // measurements kept their high-frequency energy within 0.31% and shape centroids within 0.03 px,
242
+ // identifying them as physical one-texel raster kernels rather than descriptor-distance effects.
243
+ it.each(physicalEffects)('$name retains physical source resolution', (effect) => {
244
+ expect(uploadedBy(effect.apply, nativeTarget).slice(0, 2)).toEqual([800, 600]);
245
+ expect(uploadedBy(effect.apply, supersampledScratchTarget).slice(0, 2)).toEqual([1600, 1200]);
246
+ });
247
+ });