@yali-engine/render 0.0.0-stage → 0.4.0

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 (131) hide show
  1. package/dist/bvh.d.ts +66 -0
  2. package/dist/bvh.js +493 -0
  3. package/dist/bvh.js.map +1 -0
  4. package/dist/camera.d.ts +34 -0
  5. package/dist/camera.js +66 -0
  6. package/dist/camera.js.map +1 -0
  7. package/dist/cluster-build.d.ts +46 -0
  8. package/dist/cluster-build.js +179 -0
  9. package/dist/cluster-build.js.map +1 -0
  10. package/dist/cluster-pages.d.ts +70 -0
  11. package/dist/cluster-pages.js +203 -0
  12. package/dist/cluster-pages.js.map +1 -0
  13. package/dist/cluster-stream.d.ts +83 -0
  14. package/dist/cluster-stream.js +226 -0
  15. package/dist/cluster-stream.js.map +1 -0
  16. package/dist/culled-draws.d.ts +30 -0
  17. package/dist/culled-draws.js +103 -0
  18. package/dist/culled-draws.js.map +1 -0
  19. package/dist/debug-lines.d.ts +51 -0
  20. package/dist/debug-lines.js +158 -0
  21. package/dist/debug-lines.js.map +1 -0
  22. package/dist/device-profile.d.ts +100 -0
  23. package/dist/device-profile.js +131 -0
  24. package/dist/device-profile.js.map +1 -0
  25. package/dist/device.d.ts +39 -0
  26. package/dist/device.js +79 -0
  27. package/dist/device.js.map +1 -0
  28. package/dist/environment.d.ts +60 -0
  29. package/dist/environment.js +204 -0
  30. package/dist/environment.js.map +1 -0
  31. package/dist/extract.d.ts +74 -0
  32. package/dist/extract.js +194 -0
  33. package/dist/extract.js.map +1 -0
  34. package/dist/frame-graph.d.ts +112 -0
  35. package/dist/frame-graph.js +226 -0
  36. package/dist/frame-graph.js.map +1 -0
  37. package/dist/gpu-health.d.ts +74 -0
  38. package/dist/gpu-health.js +106 -0
  39. package/dist/gpu-health.js.map +1 -0
  40. package/dist/gpu-timer.d.ts +26 -0
  41. package/dist/gpu-timer.js +93 -0
  42. package/dist/gpu-timer.js.map +1 -0
  43. package/dist/headless.d.ts +28 -0
  44. package/dist/headless.js +91 -0
  45. package/dist/headless.js.map +1 -0
  46. package/dist/index.d.ts +34 -0
  47. package/dist/index.js +36 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/lights.d.ts +81 -0
  50. package/dist/lights.js +247 -0
  51. package/dist/lights.js.map +1 -0
  52. package/dist/matrix.d.ts +6 -0
  53. package/dist/matrix.js +59 -0
  54. package/dist/matrix.js.map +1 -0
  55. package/dist/meshes.d.ts +411 -0
  56. package/dist/meshes.js +545 -0
  57. package/dist/meshes.js.map +1 -0
  58. package/dist/meshlets-decoder.d.ts +20 -0
  59. package/dist/meshlets-decoder.js +47 -0
  60. package/dist/meshlets-decoder.js.map +1 -0
  61. package/dist/meshlets.d.ts +186 -0
  62. package/dist/meshlets.js +1040 -0
  63. package/dist/meshlets.js.map +1 -0
  64. package/dist/occlusion.d.ts +51 -0
  65. package/dist/occlusion.js +188 -0
  66. package/dist/occlusion.js.map +1 -0
  67. package/dist/pick-decoder.d.ts +19 -0
  68. package/dist/pick-decoder.js +45 -0
  69. package/dist/pick-decoder.js.map +1 -0
  70. package/dist/pick.d.ts +86 -0
  71. package/dist/pick.js +452 -0
  72. package/dist/pick.js.map +1 -0
  73. package/dist/pipeline-cache.d.ts +53 -0
  74. package/dist/pipeline-cache.js +96 -0
  75. package/dist/pipeline-cache.js.map +1 -0
  76. package/dist/post-options.d.ts +109 -0
  77. package/dist/post-options.js +23 -0
  78. package/dist/post-options.js.map +1 -0
  79. package/dist/post-shaders.gen.d.ts +40 -0
  80. package/dist/post-shaders.gen.js +43 -0
  81. package/dist/post-shaders.gen.js.map +1 -0
  82. package/dist/post.d.ts +101 -0
  83. package/dist/post.js +555 -0
  84. package/dist/post.js.map +1 -0
  85. package/dist/render-plugin.d.ts +239 -0
  86. package/dist/render-plugin.js +633 -0
  87. package/dist/render-plugin.js.map +1 -0
  88. package/dist/scene.d.ts +406 -0
  89. package/dist/scene.js +2005 -0
  90. package/dist/scene.js.map +1 -0
  91. package/dist/shaders.gen.d.ts +40 -0
  92. package/dist/shaders.gen.js +43 -0
  93. package/dist/shaders.gen.js.map +1 -0
  94. package/dist/shadows.d.ts +104 -0
  95. package/dist/shadows.js +227 -0
  96. package/dist/shadows.js.map +1 -0
  97. package/dist/staging-ring.d.ts +41 -0
  98. package/dist/staging-ring.js +125 -0
  99. package/dist/staging-ring.js.map +1 -0
  100. package/dist/textures.d.ts +165 -0
  101. package/dist/textures.js +361 -0
  102. package/dist/textures.js.map +1 -0
  103. package/dist/tonemap.d.ts +45 -0
  104. package/dist/tonemap.js +141 -0
  105. package/dist/tonemap.js.map +1 -0
  106. package/dist/viewport.d.ts +78 -0
  107. package/dist/viewport.js +130 -0
  108. package/dist/viewport.js.map +1 -0
  109. package/dist/webgl2/plugin.d.ts +40 -0
  110. package/dist/webgl2/plugin.js +190 -0
  111. package/dist/webgl2/plugin.js.map +1 -0
  112. package/dist/webgl2/program.d.ts +27 -0
  113. package/dist/webgl2/program.js +74 -0
  114. package/dist/webgl2/program.js.map +1 -0
  115. package/dist/webgl2/renderer.d.ts +128 -0
  116. package/dist/webgl2/renderer.js +976 -0
  117. package/dist/webgl2/renderer.js.map +1 -0
  118. package/dist/webgl2/shaders.glsl.gen.d.ts +27 -0
  119. package/dist/webgl2/shaders.glsl.gen.js +20 -0
  120. package/dist/webgl2/shaders.glsl.gen.js.map +1 -0
  121. package/dist/webgl2/textures.d.ts +11 -0
  122. package/dist/webgl2/textures.js +82 -0
  123. package/dist/webgl2/textures.js.map +1 -0
  124. package/dist/webgl2/webgl2.d.ts +1 -0
  125. package/dist/webgl2/webgl2.js +4 -0
  126. package/dist/webgl2/webgl2.js.map +1 -0
  127. package/dist/worker-mode.d.ts +85 -0
  128. package/dist/worker-mode.js +204 -0
  129. package/dist/worker-mode.js.map +1 -0
  130. package/package.json +47 -3
  131. package/README.md +0 -3
package/dist/post.js ADDED
@@ -0,0 +1,555 @@
1
+ import { halton, invert4, mul4 } from "./matrix.js";
2
+ import { postBloom, postFxaa, postMotion, postTaa, postTaaPost } from "./post-shaders.gen.js";
3
+ import { POSITION_LAYOUT, SKIN_LAYOUT } from "./scene.js";
4
+ export { gradingDefaults, whiteBalance } from "./post-options.js";
5
+ export { halton, invert4 } from "./matrix.js";
6
+ const HDR = 'rgba16float';
7
+ /** RENDER_ATTACHMENT | TEXTURE_BINDING, as numbers: this module loads where `GPUTextureUsage` does not exist (Node, WebGL2). */
8
+ const TARGET = 0x10 | 0x04;
9
+ function linearSampler(device, label) {
10
+ return device.createSampler({ label, magFilter: 'linear', minFilter: 'linear', addressModeU: 'clamp-to-edge', addressModeV: 'clamp-to-edge' });
11
+ }
12
+ /**
13
+ * The bloom chain: `levels` half-size downsamples of the HDR scene (the first Karis-weighted
14
+ * and thresholded), then upsamples back to half size, each adding the level below through a
15
+ * tent. The tone-mapping pass samples `output`.
16
+ */
17
+ export class Bloom {
18
+ device;
19
+ levels;
20
+ intensity;
21
+ threshold;
22
+ knee;
23
+ radius;
24
+ #pipes;
25
+ #params;
26
+ #data = new Float32Array(4);
27
+ #sampler;
28
+ #groups = [];
29
+ #generation = -1;
30
+ constructor(device, o) {
31
+ this.device = device;
32
+ this.levels = Math.max(2, Math.min(8, Math.round(o.levels ?? 5)));
33
+ this.intensity = o.intensity ?? 0.6;
34
+ this.threshold = o.threshold ?? 1;
35
+ this.knee = o.knee ?? 0.5;
36
+ this.radius = o.radius ?? 1;
37
+ this.#params = device.createBuffer({ label: 'yali:bloom:params', size: 16, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });
38
+ this.#sampler = linearSampler(device, 'yali:bloom');
39
+ }
40
+ async init(cache) {
41
+ const pipe = (fs) => cache.render({
42
+ label: `yali:bloom:${fs}`,
43
+ vertex: { shader: postBloom, entryPoint: 'vs' },
44
+ fragment: { shader: postBloom, entryPoint: fs, targets: [{ format: HDR }] },
45
+ primitive: { topology: 'triangle-list' },
46
+ });
47
+ const [prefilter, down, up] = await Promise.all([pipe('fs_prefilter'), pipe('fs_down'), pipe('fs_up')]);
48
+ this.#pipes = { prefilter, down, up };
49
+ }
50
+ /** The chain's top level, which the tone-mapping pass reads. */
51
+ get output() {
52
+ return 'post.bloom.up0';
53
+ }
54
+ /** Adds the chain's passes, reading `input` (the HDR scene). */
55
+ addPasses(graph, input) {
56
+ const n = this.levels;
57
+ const down = (i) => `post.bloom.down${i}`;
58
+ const up = (i) => (i === n - 1 ? down(n - 1) : `post.bloom.up${i}`);
59
+ // After TAA: halves of the output size (larger than the scene's when TAA upscales, ADR-0135).
60
+ for (let i = 0; i < n; i++)
61
+ graph.transientTexture(down(i), { format: HDR, usage: TARGET, scale: 1 / 2 ** (i + 1), output: true });
62
+ for (let i = 0; i < n - 1; i++)
63
+ graph.transientTexture(up(i), { format: HDR, usage: TARGET, scale: 1 / 2 ** (i + 1), output: true });
64
+ // Bind groups per pass, rebuilt when the graph reallocates: down 0..n-1, then up n-2..0.
65
+ const passes = [];
66
+ for (let i = 0; i < n; i++) {
67
+ const src = i === 0 ? input : down(i - 1);
68
+ passes.push({
69
+ name: `post.bloom.down${i}`,
70
+ reads: [src],
71
+ out: down(i),
72
+ pipe: () => (i === 0 ? this.#pipes.prefilter : this.#pipes.down),
73
+ entries: (v) => [
74
+ { binding: 0, resource: v(src) },
75
+ { binding: 1, resource: this.#sampler },
76
+ ...(i === 0 ? [{ binding: 2, resource: { buffer: this.#params } }] : []),
77
+ ],
78
+ });
79
+ }
80
+ for (let i = n - 2; i >= 0; i--) {
81
+ passes.push({
82
+ name: `post.bloom.up${i}`,
83
+ reads: [down(i), up(i + 1)],
84
+ out: up(i),
85
+ pipe: () => this.#pipes.up,
86
+ entries: (v) => [
87
+ { binding: 0, resource: v(down(i)) },
88
+ { binding: 1, resource: this.#sampler },
89
+ { binding: 2, resource: { buffer: this.#params } },
90
+ { binding: 3, resource: v(up(i + 1)) },
91
+ ],
92
+ });
93
+ }
94
+ passes.forEach((p, k) => {
95
+ graph.addPass({
96
+ name: p.name,
97
+ kind: 'render',
98
+ reads: p.reads,
99
+ color: { target: p.out, clear: { r: 0, g: 0, b: 0, a: 1 } },
100
+ execute: (pass, ctx) => {
101
+ if (ctx.generation !== this.#generation) {
102
+ this.#groups = passes.map((q) => this.device.createBindGroup({ label: `yali:${q.name}`, layout: q.pipe().getBindGroupLayout(0), entries: q.entries((s) => ctx.view(s)) }));
103
+ this.#generation = ctx.generation;
104
+ }
105
+ if (k === 0) {
106
+ const d = this.#data;
107
+ if (d[0] !== this.threshold || d[1] !== this.knee || d[2] !== this.radius) {
108
+ d[0] = this.threshold;
109
+ d[1] = this.knee;
110
+ d[2] = this.radius;
111
+ this.device.queue.writeBuffer(this.#params, 0, d);
112
+ }
113
+ }
114
+ pass.setPipeline(p.pipe());
115
+ pass.setBindGroup(0, this.#groups[k]);
116
+ pass.draw(3);
117
+ },
118
+ });
119
+ });
120
+ }
121
+ destroy() {
122
+ this.#params.destroy();
123
+ }
124
+ }
125
+ /** FXAA over the tone-mapped image (`input`, encoded) into `output`. */
126
+ export class Fxaa {
127
+ device;
128
+ #format;
129
+ #pipeline;
130
+ #sampler;
131
+ #group = null;
132
+ #generation = -1;
133
+ constructor(device, format) {
134
+ this.device = device;
135
+ this.#format = format;
136
+ this.#sampler = linearSampler(device, 'yali:fxaa');
137
+ }
138
+ async init(cache) {
139
+ this.#pipeline = await cache.render({
140
+ label: 'yali:fxaa',
141
+ vertex: { shader: postFxaa, entryPoint: 'vs' },
142
+ fragment: { shader: postFxaa, entryPoint: 'fs', targets: [{ format: this.#format }] },
143
+ primitive: { topology: 'triangle-list' },
144
+ });
145
+ }
146
+ addPass(graph, input, output) {
147
+ graph.addPass({
148
+ name: 'post.fxaa',
149
+ kind: 'render',
150
+ reads: [input],
151
+ color: { target: output, clear: { r: 0, g: 0, b: 0, a: 1 } },
152
+ execute: (pass, ctx) => {
153
+ if (ctx.generation !== this.#generation || !this.#group) {
154
+ this.#group = this.device.createBindGroup({
155
+ label: 'yali:fxaa',
156
+ layout: this.#pipeline.getBindGroupLayout(0),
157
+ entries: [
158
+ { binding: 0, resource: ctx.view(input) },
159
+ { binding: 1, resource: this.#sampler },
160
+ ],
161
+ });
162
+ this.#generation = ctx.generation;
163
+ }
164
+ pass.setPipeline(this.#pipeline);
165
+ pass.setBindGroup(0, this.#group);
166
+ pass.draw(3);
167
+ },
168
+ });
169
+ }
170
+ }
171
+ /** Jitter cycle length: Halton (2, 3), 8 samples. */
172
+ const JITTER_SAMPLES = 8;
173
+ /**
174
+ * Temporal anti-aliasing: owns two history targets it ping-pongs (`post.taa`, imported into
175
+ * the graph), jitters the camera (`jitter`, applied by the scene to its view-projection), and
176
+ * reprojects by depth and the camera's move.
177
+ */
178
+ export class Taa {
179
+ device;
180
+ blend;
181
+ /**
182
+ * Sharpening after TAA (ADR-0119): 0 none to 1 strongest (live). Set before `init` to have the
183
+ * pass at all (with `motionBlur`); the history stays unsharpened, so it never accumulates.
184
+ */
185
+ sharpen = 0;
186
+ /** Motion blur's shutter (ADR-0119): the share of each pixel's motion this frame it is smeared over, 0 to 1 (live; needs per-object motion). */
187
+ motionBlur = 0;
188
+ /** Motion blur's taps (live). */
189
+ blurSamples = 8;
190
+ #probeWant = null;
191
+ /**
192
+ * What the motion target held on the next frame (ADR-0124; a diagnostic, reads back from the GPU):
193
+ * pixels drawn into it, those moving more than a twentieth of a pixel, the largest move in pixels, and
194
+ * the drawn pixels' mean view depth (last frame's).
195
+ * Null without per-object motion (the camera path).
196
+ *
197
+ * @example
198
+ * const m = await render.post.readMotion(); // { drawn: 18000, moving: 1200, maxPixels: 3.1, meanDepth: 7.4 }
199
+ */
200
+ readMotion() {
201
+ if (!this.#scene)
202
+ return Promise.resolve(null);
203
+ return new Promise((resolve) => {
204
+ this.#probeWant = ({ buf, width, height, bpr }) => {
205
+ // After the frame's submit (this runs while it is being encoded); the map then waits for the GPU.
206
+ setTimeout(async () => {
207
+ await buf.mapAsync(GPUMapMode.READ);
208
+ const h = new Uint16Array(buf.getMappedRange());
209
+ let drawn = 0;
210
+ let moving = 0;
211
+ let maxPixels = 0;
212
+ let depth = 0;
213
+ for (let y = 0; y < height; y++) {
214
+ for (let x = 0; x < width; x++) {
215
+ const o = (y * bpr) / 2 + x * 4;
216
+ if (half(h[o + 3]) <= 0)
217
+ continue;
218
+ drawn++;
219
+ depth += half(h[o + 2]);
220
+ const px = Math.hypot(half(h[o]) * width, half(h[o + 1]) * height);
221
+ if (px > 0.05)
222
+ moving++;
223
+ if (px > maxPixels)
224
+ maxPixels = px;
225
+ }
226
+ }
227
+ buf.destroy();
228
+ resolve({ drawn, moving, maxPixels, meanDepth: drawn ? depth / drawn : 0 });
229
+ }, 0);
230
+ };
231
+ });
232
+ }
233
+ #fx = null;
234
+ /** This frame's jitter in clip units (x, y), for the scene's view-projection. */
235
+ jitter = new Float32Array(2);
236
+ #pipeline;
237
+ #sampler;
238
+ #params;
239
+ #data = new ArrayBuffer(96);
240
+ #f32 = new Float32Array(this.#data);
241
+ #u32 = new Uint32Array(this.#data);
242
+ #textures = [];
243
+ #views = [];
244
+ #groups = [null, null];
245
+ #generation = -1;
246
+ #frame = 0;
247
+ #reset = true;
248
+ #prevVP = new Float64Array(16);
249
+ #prevEye = new Float64Array(3);
250
+ #inv = new Float64Array(16);
251
+ #out = new Float64Array(16);
252
+ #width = 0;
253
+ #height = 0;
254
+ /** Temporal upscaling (ADR-0135): the history is the output's size, reconstructed from a smaller scene. */
255
+ upscale;
256
+ constructor(device, blend = 0.1, upscale = false) {
257
+ this.device = device;
258
+ this.blend = blend;
259
+ this.upscale = upscale;
260
+ this.#sampler = linearSampler(device, 'yali:taa');
261
+ this.#params = device.createBuffer({ label: 'yali:taa:params', size: 96, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });
262
+ this.#motionParams = device.createBuffer({ label: 'yali:motion:params', size: 144, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST });
263
+ this.#noMotion = device.createTexture({ label: 'yali:taa:noMotion', size: [1, 1], format: HDR, usage: GPUTextureUsage.TEXTURE_BINDING });
264
+ }
265
+ async init(cache) {
266
+ const motion = (skinned) => cache.render({
267
+ label: skinned ? 'yali:motion:skinned' : 'yali:motion',
268
+ vertex: { shader: postMotion, entryPoint: skinned ? 'vs_skinned' : 'vs', buffers: skinned ? [POSITION_LAYOUT, SKIN_LAYOUT] : [POSITION_LAYOUT] },
269
+ fragment: { shader: postMotion, entryPoint: 'fs', targets: [{ format: HDR }] },
270
+ primitive: { topology: 'triangle-list', cullMode: 'none' },
271
+ depthStencil: { format: 'depth32float', depthWriteEnabled: true, depthCompare: 'greater' },
272
+ });
273
+ if (this.sharpen > 0 || this.motionBlur > 0) {
274
+ const pipeline = await cache.render({
275
+ label: 'yali:taa:post',
276
+ vertex: { shader: postTaaPost, entryPoint: 'vs' },
277
+ fragment: { shader: postTaaPost, entryPoint: 'fs', targets: [{ format: HDR }] },
278
+ primitive: { topology: 'triangle-list' },
279
+ });
280
+ this.#fx = { pipeline, params: this.device.createBuffer({ label: 'yali:taa:post', size: 16, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST }), data: new Float32Array(4), groups: [null, null], generation: -1 };
281
+ }
282
+ [this.#pipeline, this.#motionRigid, this.#motionSkinned] = await Promise.all([
283
+ cache.render({
284
+ label: 'yali:taa',
285
+ vertex: { shader: postTaa, entryPoint: 'vs' },
286
+ fragment: { shader: postTaa, entryPoint: 'fs', targets: [{ format: HDR }] },
287
+ primitive: { topology: 'triangle-list' },
288
+ }),
289
+ motion(false),
290
+ motion(true),
291
+ ]);
292
+ }
293
+ // ── Per-object motion (ADR-0098): the scene's opaque instances drawn again, now and then ──
294
+ #scene = null;
295
+ #motionParams;
296
+ #motionData = new Float32Array(36);
297
+ #motionRigid;
298
+ #motionSkinned;
299
+ #motionGroups = null;
300
+ #motionKey = '';
301
+ #clusterMotion = null;
302
+ #noMotion;
303
+ #prevOrigin = new Float32Array(3);
304
+ #motionSeen = '';
305
+ #motionFrames = 0;
306
+ #origin = new Float32Array(3);
307
+ /** Draws per-object motion from `scene` (its GPU cull's storage path; elsewhere the camera's only). */
308
+ motionFrom(scene) {
309
+ if (scene.motionSupported)
310
+ this.#scene = scene;
311
+ }
312
+ /** Whether per-object motion is drawn. */
313
+ get motion() {
314
+ return !!this.#scene;
315
+ }
316
+ /** This frame's camera offset from the records' anchor (ADR-0075), as the scene uploads it. */
317
+ setOrigin(origin) {
318
+ for (let i = 0; i < 3; i++)
319
+ this.#origin[i] = origin[i];
320
+ }
321
+ /** Drops the history: the next frame starts over. */
322
+ reset() {
323
+ this.#reset = true;
324
+ }
325
+ /**
326
+ * Before the camera upload, each frame: sizes the history to the output (the render target's size
327
+ * unless upscaling, ADR-0135), picks this frame's jitter (in the render target's pixels) and computes
328
+ * the reprojection from the camera (unjittered) and its eye.
329
+ */
330
+ prepare(camera, width, height, outputWidth = width, outputHeight = height) {
331
+ if (outputWidth !== this.#width || outputHeight !== this.#height) {
332
+ for (const t of this.#textures)
333
+ t.destroy();
334
+ this.#textures = [0, 1].map((i) => this.device.createTexture({ label: `yali:taa:history${i}`, size: [outputWidth, outputHeight], format: HDR, usage: TARGET }));
335
+ this.#views = this.#textures.map((t) => t.createView());
336
+ this.#groups = [null, null];
337
+ this.#width = outputWidth;
338
+ this.#height = outputHeight;
339
+ this.#reset = true;
340
+ }
341
+ this.#frame++;
342
+ // Upscaling needs more jitter phases to cover each output pixel: 8 × the area ratio (FSR 2's rule).
343
+ const up = outputWidth !== width || outputHeight !== height;
344
+ const phases = up ? Math.max(JITTER_SAMPLES, Math.ceil(JITTER_SAMPLES * ((outputWidth * outputHeight) / (width * height)))) : JITTER_SAMPLES;
345
+ const s = (this.#frame % phases) + 1;
346
+ this.jitter[0] = ((halton(s, 2) - 0.5) * 2) / width;
347
+ this.jitter[1] = ((halton(s, 3) - 0.5) * 2) / height;
348
+ // Where the jitter put each render pixel's sample, in its pixels (clip y is up, pixels down).
349
+ this.#f32[20] = (this.jitter[0] * width) / 2;
350
+ this.#f32[21] = (-this.jitter[1] * height) / 2;
351
+ this.#u32[22] = up ? 1 : 0;
352
+ // This frame's view-projection without the jitter (the scene adds it when it uploads).
353
+ const vp = camera.uniform;
354
+ const ok = invert4(vp, this.#inv);
355
+ // Last frame's clip of a point camera-relative now: translate by the eye's move (now − then).
356
+ const t = this.#out;
357
+ t.fill(0);
358
+ t[0] = t[5] = t[10] = t[15] = 1;
359
+ for (let i = 0; i < 3; i++)
360
+ t[12 + i] = camera.eye[i] - this.#prevEye[i];
361
+ const prevT = mul4(this.#prevVP, t, new Float64Array(16));
362
+ const reproject = mul4(prevT, this.#inv, this.#out);
363
+ this.#f32.set(reproject, 0);
364
+ this.#f32[16] = camera.near;
365
+ // Last frame's copies exist only after a frame with them: until then (and after they are
366
+ // recreated) the camera's motion only, not vectors against zeroed transforms.
367
+ const scene = this.#scene;
368
+ if (scene && scene.motionKey !== this.#motionSeen) {
369
+ this.#motionSeen = scene.motionKey;
370
+ this.#motionFrames = 0;
371
+ }
372
+ this.#u32[17] = scene && this.#motionFrames >= 2 ? 1 : 0;
373
+ this.#motionFrames++;
374
+ this.#f32[18] = this.blend;
375
+ this.#u32[19] = this.#reset || !ok ? 1 : 0;
376
+ this.device.queue.writeBuffer(this.#params, 0, this.#data);
377
+ if (this.#scene) {
378
+ // The motion pass: this frame's view-projection and last frame's (both unjittered), and
379
+ // last frame's origin (the records are relative to an anchor, ADR-0075).
380
+ const m = this.#motionData;
381
+ for (let i = 0; i < 16; i++)
382
+ m[i] = vp[i];
383
+ m.set(this.#prevVP, 16);
384
+ m.set(this.#prevOrigin, 32);
385
+ this.device.queue.writeBuffer(this.#motionParams, 0, m);
386
+ this.#prevOrigin.set(this.#origin);
387
+ }
388
+ for (let i = 0; i < 16; i++)
389
+ this.#prevVP[i] = vp[i];
390
+ for (let i = 0; i < 3; i++)
391
+ this.#prevEye[i] = camera.eye[i];
392
+ this.#reset = false;
393
+ }
394
+ /** The history target this frame writes. */
395
+ get #write() {
396
+ return this.#frame & 1;
397
+ }
398
+ /**
399
+ * Imports `post.taa` and adds the pass, reading `input` (the HDR scene) and `depth`; with
400
+ * sharpening or motion blur (ADR-0119), their pass after it. Returns the chain's next input.
401
+ */
402
+ addPass(graph, input, depth) {
403
+ graph.importTexture('post.taa', () => this.#views[this.#write]);
404
+ const scene = this.#scene;
405
+ if (scene) {
406
+ // The clustered meshes' motion pipeline starts now, so a page awaiting the scene's pipelines awaits it too (ADR-0112).
407
+ scene.clusters?.prepareMotion(postMotion, HDR);
408
+ // Masked cut-outs' motion through their alpha test (ADR-0124), started now so goldens await it.
409
+ scene.prepareMaskMotion(HDR);
410
+ // COPY_SRC (0x01): `readMotion()` copies it out (ADR-0124).
411
+ graph.transientTexture('scene.motion', { format: HDR, usage: TARGET | 0x01 });
412
+ graph.transientTexture('motion.depth', { format: 'depth32float', usage: 0x10 });
413
+ graph.addPass({
414
+ name: 'scene.motion',
415
+ kind: 'render',
416
+ reads: [scene.occlusionActive ? 'scene.visible2' : 'scene.visible', ...scene.motionReads],
417
+ color: { target: 'scene.motion', clear: { r: 0, g: 0, b: 0, a: 0 } },
418
+ depth: { target: 'motion.depth', clear: 0 },
419
+ execute: (pass) => {
420
+ const r = scene.motionResources();
421
+ if (!r)
422
+ return;
423
+ if (!this.#motionGroups || this.#motionKey !== scene.motionKey) {
424
+ const entries = (skinned) => [
425
+ { binding: 0, resource: { buffer: r.camera } },
426
+ { binding: 1, resource: { buffer: r.instances } },
427
+ { binding: 2, resource: { buffer: r.visible } },
428
+ { binding: 3, resource: { buffer: r.prevInstances } },
429
+ { binding: 4, resource: { buffer: this.#motionParams } },
430
+ ...(skinned
431
+ ? [{ binding: 5, resource: r.palette.createView() }, { binding: 6, resource: r.prevPalette.createView() }, { binding: 8, resource: { buffer: r.prevSkinnedPool } }]
432
+ : [{ binding: 7, resource: { buffer: r.prevPool } }]),
433
+ ];
434
+ // The clustered meshes redraw the clusters the view drew, with this shader (ADR-0112).
435
+ this.#clusterMotion = { shader: postMotion, entries: entries(false), key: scene.motionKey, format: HDR };
436
+ this.#motionGroups = [
437
+ this.device.createBindGroup({ label: 'yali:motion', layout: this.#motionRigid.getBindGroupLayout(0), entries: entries(false) }),
438
+ this.device.createBindGroup({ label: 'yali:motion:skinned', layout: this.#motionSkinned.getBindGroupLayout(0), entries: entries(true) }),
439
+ ];
440
+ this.#motionKey = scene.motionKey;
441
+ }
442
+ scene.encodeMotion(pass, [this.#motionRigid, this.#motionGroups[0]], [this.#motionSkinned, this.#motionGroups[1]], this.#clusterMotion ?? undefined, this.#motionParams);
443
+ },
444
+ });
445
+ // `readMotion()`: the motion target copied out on the frame after a request (a diagnostic, ADR-0124).
446
+ graph.addPass({
447
+ name: 'post.motionProbe',
448
+ kind: 'encoder',
449
+ reads: ['scene.motion'],
450
+ writes: ['post.motionProbe'],
451
+ execute: (encoder, ctx) => {
452
+ const want = this.#probeWant;
453
+ if (!want)
454
+ return;
455
+ this.#probeWant = null;
456
+ const tex = ctx.texture('scene.motion');
457
+ const bpr = Math.ceil((tex.width * 8) / 256) * 256;
458
+ const buf = this.device.createBuffer({ label: 'yali:motion:probe', size: bpr * tex.height, usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST });
459
+ encoder.copyTextureToBuffer({ texture: tex }, { buffer: buf, bytesPerRow: bpr }, [tex.width, tex.height]);
460
+ want({ buf, width: tex.width, height: tex.height, bpr });
461
+ },
462
+ });
463
+ }
464
+ graph.addPass({
465
+ name: 'post.taa',
466
+ kind: 'render',
467
+ reads: scene ? [input, depth, 'scene.motion', 'post.motionProbe'] : [input, depth],
468
+ color: { target: 'post.taa', clear: { r: 0, g: 0, b: 0, a: 1 } },
469
+ execute: (pass, ctx) => {
470
+ if (ctx.generation !== this.#generation) {
471
+ this.#groups = [null, null];
472
+ this.#generation = ctx.generation;
473
+ }
474
+ const w = this.#write;
475
+ if (!this.#groups[w]) {
476
+ this.#groups[w] = this.device.createBindGroup({
477
+ label: `yali:taa${w}`,
478
+ layout: this.#pipeline.getBindGroupLayout(0),
479
+ entries: [
480
+ { binding: 0, resource: ctx.view(input) },
481
+ { binding: 1, resource: this.#views[1 - w] },
482
+ { binding: 2, resource: ctx.view(depth) },
483
+ { binding: 3, resource: this.#sampler },
484
+ { binding: 4, resource: { buffer: this.#params } },
485
+ { binding: 5, resource: scene ? ctx.view('scene.motion') : this.#noMotion.createView() },
486
+ ],
487
+ });
488
+ }
489
+ pass.setPipeline(this.#pipeline);
490
+ pass.setBindGroup(0, this.#groups[w]);
491
+ pass.draw(3);
492
+ },
493
+ });
494
+ const fx = this.#fx;
495
+ if (!fx)
496
+ return 'post.taa';
497
+ graph.transientTexture('post.taafx', { format: HDR, usage: TARGET, output: true });
498
+ graph.addPass({
499
+ name: 'post.taafx',
500
+ kind: 'render',
501
+ reads: scene ? ['post.taa', 'scene.motion'] : ['post.taa'],
502
+ color: { target: 'post.taafx', clear: { r: 0, g: 0, b: 0, a: 1 } },
503
+ execute: (pass, ctx) => {
504
+ if (ctx.generation !== fx.generation) {
505
+ fx.groups = [null, null];
506
+ fx.generation = ctx.generation;
507
+ }
508
+ const w = this.#write;
509
+ fx.groups[w] ??= this.device.createBindGroup({
510
+ label: `yali:taa:post${w}`,
511
+ layout: fx.pipeline.getBindGroupLayout(0),
512
+ entries: [
513
+ { binding: 0, resource: this.#views[w] },
514
+ { binding: 1, resource: scene ? ctx.view('scene.motion') : this.#noMotion.createView() },
515
+ { binding: 2, resource: this.#sampler },
516
+ { binding: 3, resource: { buffer: fx.params } },
517
+ ],
518
+ });
519
+ const d = fx.data;
520
+ d[0] = Math.max(0, Math.min(1, this.sharpen));
521
+ d[1] = Math.max(0, Math.min(1, this.motionBlur));
522
+ d[2] = Math.max(2, Math.min(32, Math.round(this.blurSamples)));
523
+ // The vectors exist once the motion pass has last frame's copies (as TAA's own check).
524
+ d[3] = this.#u32[17];
525
+ this.device.queue.writeBuffer(fx.params, 0, d);
526
+ pass.setPipeline(fx.pipeline);
527
+ pass.setBindGroup(0, fx.groups[w]);
528
+ pass.draw(3);
529
+ },
530
+ });
531
+ return 'post.taafx';
532
+ }
533
+ get liveTextures() {
534
+ return this.#textures.length;
535
+ }
536
+ destroy() {
537
+ for (const t of this.#textures)
538
+ t.destroy();
539
+ this.#textures = [];
540
+ this.#params.destroy();
541
+ this.#motionParams.destroy();
542
+ this.#noMotion.destroy();
543
+ this.#fx?.params.destroy();
544
+ }
545
+ }
546
+ /** What `renderPlugin({ post: { passes } })` takes (ADR-0092). */
547
+ export const postPasses = { Bloom, Taa, Fxaa };
548
+ /** An IEEE half float's value. */
549
+ function half(h) {
550
+ const e = (h >> 10) & 0x1f;
551
+ const m = h & 0x3ff;
552
+ const v = e === 0 ? m * 2 ** -24 : e === 31 ? (m ? Number.NaN : Number.POSITIVE_INFINITY) : (1 + m / 1024) * 2 ** (e - 15);
553
+ return h & 0x8000 ? -v : v;
554
+ }
555
+ //# sourceMappingURL=post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post.js","sourceRoot":"","sources":["../src/post.ts"],"names":[],"mappings":"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"}