@forgeax/engine-render 0.1.21 → 0.1.24

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 (584) hide show
  1. package/README.md +281 -38
  2. package/dist/assembly/backend-contract.d.ts +13 -0
  3. package/dist/assembly/backend-contract.d.ts.map +1 -1
  4. package/dist/assembly/bundler-contract.d.ts +9 -0
  5. package/dist/assembly/bundler-contract.d.ts.map +1 -0
  6. package/dist/assembly/device-feature-admission.d.ts +8 -0
  7. package/dist/assembly/device-feature-admission.d.ts.map +1 -1
  8. package/dist/assembly/extended-lighting-fallback.d.ts +13 -0
  9. package/dist/assembly/extended-lighting-fallback.d.ts.map +1 -0
  10. package/dist/assembly/factory.d.ts +7 -235
  11. package/dist/assembly/factory.d.ts.map +1 -1
  12. package/dist/assembly/host-contract.d.ts +10 -0
  13. package/dist/assembly/host-contract.d.ts.map +1 -1
  14. package/dist/assembly/material/assembly.d.ts +3 -2
  15. package/dist/assembly/material/assembly.d.ts.map +1 -1
  16. package/dist/assembly/material/standard-layer-projection.d.ts +10 -0
  17. package/dist/assembly/material/standard-layer-projection.d.ts.map +1 -0
  18. package/dist/assembly/material-shader-policy.d.ts +168 -0
  19. package/dist/assembly/material-shader-policy.d.ts.map +1 -0
  20. package/dist/assembly/material-shader-prewarm.d.ts +21 -0
  21. package/dist/assembly/material-shader-prewarm.d.ts.map +1 -0
  22. package/dist/assembly/mesh-ssbo-grow.d.ts +88 -0
  23. package/dist/assembly/mesh-ssbo-grow.d.ts.map +1 -0
  24. package/dist/assembly/recovery/device-loss-fanout.d.ts +14 -0
  25. package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -0
  26. package/dist/assembly/recovery/generation.d.ts +46 -0
  27. package/dist/assembly/recovery/generation.d.ts.map +1 -0
  28. package/dist/assembly/recovery/recovery-attempt.d.ts +63 -0
  29. package/dist/assembly/recovery/recovery-attempt.d.ts.map +1 -0
  30. package/dist/assembly/recovery/renderer-recover.d.ts +115 -0
  31. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -0
  32. package/dist/assembly/renderer-facade.d.ts +10 -0
  33. package/dist/assembly/renderer-facade.d.ts.map +1 -0
  34. package/dist/assembly/renderer-frame-transaction.d.ts +17 -0
  35. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  36. package/dist/assembly/renderer-helpers.d.ts +19 -0
  37. package/dist/assembly/renderer-helpers.d.ts.map +1 -0
  38. package/dist/assembly/renderer-lifecycle.d.ts +34 -0
  39. package/dist/assembly/renderer-lifecycle.d.ts.map +1 -1
  40. package/dist/assembly/shader-prewarm-policy.d.ts +15 -0
  41. package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -0
  42. package/dist/assembly/webgpu-ready-contract.d.ts +9 -0
  43. package/dist/assembly/webgpu-ready-contract.d.ts.map +1 -0
  44. package/dist/assembly/webgpu-ready.d.ts +55 -0
  45. package/dist/assembly/webgpu-ready.d.ts.map +1 -0
  46. package/dist/assembly/webgpu-renderer.d.ts +152 -0
  47. package/dist/assembly/webgpu-renderer.d.ts.map +1 -0
  48. package/dist/authoring.mjs +1 -1
  49. package/dist/{chunk-PCHBPYML.mjs → chunk-GE3SDD72.mjs} +37 -5
  50. package/dist/chunk-GE3SDD72.mjs.map +1 -0
  51. package/dist/chunk-KZFTK6DO.mjs +1191 -0
  52. package/dist/chunk-KZFTK6DO.mjs.map +1 -0
  53. package/dist/{chunk-FS2KNUQH.mjs → chunk-Q752SHI5.mjs} +332 -568
  54. package/dist/chunk-Q752SHI5.mjs.map +1 -0
  55. package/dist/{chunk-6OPXDQ2E.mjs → chunk-RR5L4SRS.mjs} +33 -294
  56. package/dist/chunk-RR5L4SRS.mjs.map +1 -0
  57. package/dist/chunk-TFH5I7JJ.mjs +296 -0
  58. package/dist/chunk-TFH5I7JJ.mjs.map +1 -0
  59. package/dist/chunk-UQYS7FRM.mjs +1003 -0
  60. package/dist/chunk-UQYS7FRM.mjs.map +1 -0
  61. package/dist/chunk-YKB5DQV7.mjs +345 -0
  62. package/dist/chunk-YKB5DQV7.mjs.map +1 -0
  63. package/dist/{chunk-5YADUCA7.mjs → chunk-YRUYGA4A.mjs} +1189 -1217
  64. package/dist/chunk-YRUYGA4A.mjs.map +1 -0
  65. package/dist/chunk-Z3YYH2MB.mjs +5082 -0
  66. package/dist/chunk-Z3YYH2MB.mjs.map +1 -0
  67. package/dist/cluster-binner.d.ts +5 -0
  68. package/dist/cluster-binner.d.ts.map +1 -1
  69. package/dist/components/index.d.ts +3 -0
  70. package/dist/components/index.d.ts.map +1 -1
  71. package/dist/components/light-helpers.d.ts +4 -0
  72. package/dist/components/light-helpers.d.ts.map +1 -1
  73. package/dist/components/light-probe.d.ts +9 -0
  74. package/dist/components/light-probe.d.ts.map +1 -0
  75. package/dist/components/rect-area-light.d.ts +12 -0
  76. package/dist/components/rect-area-light.d.ts.map +1 -0
  77. package/dist/components/scene-instance.d.ts +4 -0
  78. package/dist/components/scene-instance.d.ts.map +1 -1
  79. package/dist/components/spot-light.d.ts +3 -0
  80. package/dist/components/spot-light.d.ts.map +1 -1
  81. package/dist/construct-renderer.mjs +27276 -23232
  82. package/dist/construct-renderer.mjs.map +1 -1
  83. package/dist/device/device-scope.d.ts +2 -0
  84. package/dist/device/device-scope.d.ts.map +1 -1
  85. package/dist/device/gpu-residency.d.ts +32 -5
  86. package/dist/device/gpu-residency.d.ts.map +1 -1
  87. package/dist/device/lifecycle-transaction.d.ts +2 -0
  88. package/dist/device/lifecycle-transaction.d.ts.map +1 -0
  89. package/dist/environment/frame.d.ts +5 -0
  90. package/dist/environment/frame.d.ts.map +1 -1
  91. package/dist/environment/inspection.d.ts +7 -0
  92. package/dist/environment/inspection.d.ts.map +1 -1
  93. package/dist/environment/lifecycle.d.ts +20 -2
  94. package/dist/environment/lifecycle.d.ts.map +1 -1
  95. package/dist/errors/gpu-driven.d.ts +26 -0
  96. package/dist/errors/gpu-driven.d.ts.map +1 -0
  97. package/dist/errors/index.d.ts +1 -0
  98. package/dist/errors/index.d.ts.map +1 -1
  99. package/dist/errors/recover.d.ts +67 -3
  100. package/dist/errors/recover.d.ts.map +1 -1
  101. package/dist/errors/render.d.ts +39 -1
  102. package/dist/errors/render.d.ts.map +1 -1
  103. package/dist/extract/contracts.d.ts +899 -0
  104. package/dist/extract/contracts.d.ts.map +1 -0
  105. package/dist/extract/gpu-driven.d.ts +50 -0
  106. package/dist/extract/gpu-driven.d.ts.map +1 -0
  107. package/dist/extract/visibility.d.ts.map +1 -1
  108. package/dist/features/host.d.ts +2 -0
  109. package/dist/features/host.d.ts.map +1 -1
  110. package/dist/features/prepared-gpu-work.d.ts +3 -0
  111. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  112. package/dist/features/prepared-graphics-store.d.ts +2 -0
  113. package/dist/features/prepared-graphics-store.d.ts.map +1 -1
  114. package/dist/gpu-driven/batch-topology.d.ts +34 -0
  115. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  116. package/dist/gpu-driven/prepared-draw.d.ts +63 -0
  117. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -0
  118. package/dist/gpu-driven/production-raster.d.ts +126 -2
  119. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  120. package/dist/gpu-driven/view-gpu.d.ts +64 -1
  121. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  122. package/dist/gpu-scene-schema.d.ts +14 -0
  123. package/dist/gpu-scene-schema.d.ts.map +1 -1
  124. package/dist/gpu-scene.d.ts +9 -1
  125. package/dist/gpu-scene.d.ts.map +1 -1
  126. package/dist/gpu-usage.d.ts +0 -1
  127. package/dist/gpu-usage.d.ts.map +1 -1
  128. package/dist/hdrp-buffers.d.ts +3 -3
  129. package/dist/hdrp-buffers.d.ts.map +1 -1
  130. package/dist/ibl/IblPipelineCache.d.ts +7 -6
  131. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  132. package/dist/ibl/skylight-bind-group.d.ts +7 -1
  133. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  134. package/dist/index.d.ts +13 -2
  135. package/dist/index.d.ts.map +1 -1
  136. package/dist/index.mjs +90 -5
  137. package/dist/index.mjs.map +1 -1
  138. package/dist/inspection-types.d.ts +163 -1
  139. package/dist/inspection-types.d.ts.map +1 -1
  140. package/dist/internal.d.ts +9 -0
  141. package/dist/internal.d.ts.map +1 -1
  142. package/dist/internal.mjs +23 -2
  143. package/dist/internal.mjs.map +1 -1
  144. package/dist/light-buffer-layout.d.ts +60 -148
  145. package/dist/light-buffer-layout.d.ts.map +1 -1
  146. package/dist/materials.d.ts +34 -10
  147. package/dist/materials.d.ts.map +1 -1
  148. package/dist/mesh-material-bindings.d.ts +56 -0
  149. package/dist/mesh-material-bindings.d.ts.map +1 -1
  150. package/dist/occlusion-proxy.d.ts +4 -0
  151. package/dist/occlusion-proxy.d.ts.map +1 -0
  152. package/dist/pbr-pipeline.d.ts +58 -21
  153. package/dist/pbr-pipeline.d.ts.map +1 -1
  154. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  155. package/dist/pipeline/standard-lighting/graph.d.ts.map +1 -1
  156. package/dist/pipeline/standard-lighting/light-frame.d.ts +3 -3
  157. package/dist/pipeline/standard-lighting/light-frame.d.ts.map +1 -1
  158. package/dist/pipeline/standard-lighting/topology.d.ts +1 -1
  159. package/dist/pipeline/standard-lighting/topology.d.ts.map +1 -1
  160. package/dist/pipeline/standard-lighting/transport.d.ts.map +1 -1
  161. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  162. package/dist/pipeline-builder.d.ts +2 -0
  163. package/dist/pipeline-builder.d.ts.map +1 -1
  164. package/dist/pipeline-spec.d.ts +1 -1
  165. package/dist/pipeline-spec.d.ts.map +1 -1
  166. package/dist/plugin.d.ts.map +1 -1
  167. package/dist/points-lines/prepare.d.ts +3 -0
  168. package/dist/points-lines/prepare.d.ts.map +1 -1
  169. package/dist/points-lines/standard-owner.d.ts +33 -0
  170. package/dist/points-lines/standard-owner.d.ts.map +1 -0
  171. package/dist/prepare/extended-lighting/ltc-resources.d.ts +31 -0
  172. package/dist/prepare/extended-lighting/ltc-resources.d.ts.map +1 -0
  173. package/dist/prepare/extended-lighting/resources.d.ts +72 -0
  174. package/dist/prepare/extended-lighting/resources.d.ts.map +1 -0
  175. package/dist/prepare/extended-lighting/spot-modifiers.d.ts +42 -0
  176. package/dist/prepare/extended-lighting/spot-modifiers.d.ts.map +1 -0
  177. package/dist/prepare/extended-lighting/state.d.ts +24 -0
  178. package/dist/prepare/extended-lighting/state.d.ts.map +1 -0
  179. package/dist/record/frame-lighting.d.ts +8 -6
  180. package/dist/record/frame-lighting.d.ts.map +1 -1
  181. package/dist/record/frame-snapshot.d.ts +55 -10
  182. package/dist/record/frame-snapshot.d.ts.map +1 -1
  183. package/dist/record/frame-targets.d.ts.map +1 -1
  184. package/dist/record/frame.d.ts +21 -5
  185. package/dist/record/frame.d.ts.map +1 -1
  186. package/dist/record/gpu-timing.d.ts +19 -7
  187. package/dist/record/gpu-timing.d.ts.map +1 -1
  188. package/dist/record/helpers.d.ts +0 -20
  189. package/dist/record/helpers.d.ts.map +1 -1
  190. package/dist/record/main-pass-geometry.d.ts +20 -2
  191. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  192. package/dist/record/main-pass-material.d.ts +10 -18
  193. package/dist/record/main-pass-material.d.ts.map +1 -1
  194. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  195. package/dist/record/main-pass.d.ts.map +1 -1
  196. package/dist/record/mesh-ssbo.d.ts +11 -3
  197. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  198. package/dist/record/recovery-pipeline.d.ts +30 -0
  199. package/dist/record/recovery-pipeline.d.ts.map +1 -0
  200. package/dist/record/render-context.d.ts +82 -9
  201. package/dist/record/render-context.d.ts.map +1 -1
  202. package/dist/record/shadow-pass.d.ts.map +1 -1
  203. package/dist/record/typed-frame-graph.d.ts +49 -2
  204. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  205. package/dist/record/view-ubo.d.ts +1 -2
  206. package/dist/record/view-ubo.d.ts.map +1 -1
  207. package/dist/recovery/render-system-candidate.d.ts +65 -0
  208. package/dist/recovery/render-system-candidate.d.ts.map +1 -0
  209. package/dist/reflection/inspection.d.ts +10 -0
  210. package/dist/reflection/inspection.d.ts.map +1 -0
  211. package/dist/reflection/projection.d.ts +49 -0
  212. package/dist/reflection/projection.d.ts.map +1 -1
  213. package/dist/reflection/record-owner.d.ts +60 -0
  214. package/dist/reflection/record-owner.d.ts.map +1 -0
  215. package/dist/render-contract.d.ts +78 -15
  216. package/dist/render-contract.d.ts.map +1 -1
  217. package/dist/render-pipeline.d.ts +7 -0
  218. package/dist/render-pipeline.d.ts.map +1 -1
  219. package/dist/render-system-extract-tail.d.ts +12 -0
  220. package/dist/render-system-extract-tail.d.ts.map +1 -0
  221. package/dist/render-system-extract.d.ts +252 -30
  222. package/dist/render-system-extract.d.ts.map +1 -1
  223. package/dist/render-system.d.ts +140 -5
  224. package/dist/render-system.d.ts.map +1 -1
  225. package/dist/scene/probe-blend-record.d.ts +22 -0
  226. package/dist/scene/probe-blend-record.d.ts.map +1 -0
  227. package/dist/scene/probe-blend.d.ts +142 -0
  228. package/dist/scene/probe-blend.d.ts.map +1 -0
  229. package/dist/scene/render-scene-types.d.ts +0 -6
  230. package/dist/scene/render-scene-types.d.ts.map +1 -1
  231. package/dist/scene/render-scene.d.ts +122 -9
  232. package/dist/scene/render-scene.d.ts.map +1 -1
  233. package/dist/scene/visibility/bounds.d.ts +20 -0
  234. package/dist/scene/visibility/bounds.d.ts.map +1 -0
  235. package/dist/scene/visibility/budget.d.ts +16 -0
  236. package/dist/scene/visibility/budget.d.ts.map +1 -0
  237. package/dist/scene/visibility/facet.d.ts +73 -0
  238. package/dist/scene/visibility/facet.d.ts.map +1 -0
  239. package/dist/scene/visibility/gpu-frame-timing.d.ts +41 -0
  240. package/dist/scene/visibility/gpu-frame-timing.d.ts.map +1 -0
  241. package/dist/scene/visibility/gpu-lod.d.ts +46 -0
  242. package/dist/scene/visibility/gpu-lod.d.ts.map +1 -0
  243. package/dist/scene/visibility/inspection.d.ts +132 -0
  244. package/dist/scene/visibility/inspection.d.ts.map +1 -0
  245. package/dist/scene/visibility/lod-selector.d.ts +25 -0
  246. package/dist/scene/visibility/lod-selector.d.ts.map +1 -0
  247. package/dist/scene/visibility/occlusion-confidence.d.ts +81 -0
  248. package/dist/scene/visibility/occlusion-confidence.d.ts.map +1 -0
  249. package/dist/scene/visibility/occlusion-pass.d.ts +57 -0
  250. package/dist/scene/visibility/occlusion-pass.d.ts.map +1 -0
  251. package/dist/scene/visibility/occlusion-query-pool.d.ts +57 -0
  252. package/dist/scene/visibility/occlusion-query-pool.d.ts.map +1 -0
  253. package/dist/scene/visibility/occlusion-runtime.d.ts +96 -0
  254. package/dist/scene/visibility/occlusion-runtime.d.ts.map +1 -0
  255. package/dist/scene/visibility/types.d.ts +34 -0
  256. package/dist/scene/visibility/types.d.ts.map +1 -0
  257. package/dist/ssr/admission.d.ts +122 -0
  258. package/dist/ssr/admission.d.ts.map +1 -0
  259. package/dist/ssr/composition.d.ts +32 -0
  260. package/dist/ssr/composition.d.ts.map +1 -0
  261. package/dist/ssr/errors.d.ts +39 -0
  262. package/dist/ssr/errors.d.ts.map +1 -0
  263. package/dist/ssr/identity.d.ts +13 -0
  264. package/dist/ssr/identity.d.ts.map +1 -0
  265. package/dist/systems/skin-palette-allocator.d.ts +1 -1
  266. package/dist/temporal/frame-coordinator.d.ts +13 -0
  267. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  268. package/dist/temporal/frame.d.ts +2 -0
  269. package/dist/temporal/frame.d.ts.map +1 -1
  270. package/dist/temporal/index.mjs +6 -5
  271. package/dist/temporal/taa-history-store.d.ts +15 -1
  272. package/dist/temporal/taa-history-store.d.ts.map +1 -1
  273. package/dist/temporal/transaction.d.ts +5 -0
  274. package/dist/temporal/transaction.d.ts.map +1 -1
  275. package/dist/temporal/view.d.ts +7 -0
  276. package/dist/temporal/view.d.ts.map +1 -1
  277. package/dist/tilemap-chunk-extract-system.d.ts +1 -1
  278. package/dist/typed-render-graph-primitives.d.ts +4 -0
  279. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  280. package/dist/volume/passes.d.ts +8 -4
  281. package/dist/volume/passes.d.ts.map +1 -1
  282. package/package.json +20 -20
  283. package/src/__tests__/cluster-grid-default-surface.unit.test.ts +5 -0
  284. package/src/__tests__/detached-inspection.integration.test.ts +6 -0
  285. package/src/__tests__/device-feature-admission.unit.test.ts +19 -1
  286. package/src/__tests__/device-loss-fanout.unit.test.ts +107 -0
  287. package/src/__tests__/device-scope-lifecycle.unit.test.ts +21 -0
  288. package/src/__tests__/direct-light-snapshot.unit.test.ts +59 -3
  289. package/src/__tests__/environment-generation.integration.test.ts +39 -0
  290. package/src/__tests__/evidence-identity.ts +13 -0
  291. package/src/__tests__/evidence-identity.unit.test.ts +24 -0
  292. package/src/__tests__/expose-renderer-errors.unit.test.ts +34 -0
  293. package/src/__tests__/extended-lighting-recovery.browser.test.ts +14 -0
  294. package/src/__tests__/extended-lighting-recovery.dawn.test.ts +14 -0
  295. package/src/__tests__/extended-lighting-recovery.integration.test.ts +81 -0
  296. package/src/__tests__/extended-lighting-resources.unit.test.ts +51 -0
  297. package/src/__tests__/extended-lighting-zero-feature.integration.test.ts +52 -0
  298. package/src/__tests__/factory-contract.integration.test.ts +154 -6
  299. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +4 -1
  300. package/src/__tests__/frame-observation.contract.test.ts +15 -0
  301. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +146 -0
  302. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +1 -0
  303. package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +1 -0
  304. package/src/__tests__/gpu-driven-production.integration.test.ts +572 -9
  305. package/src/__tests__/gpu-driven-scaling.unit.test.ts +66 -2
  306. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +26 -1
  307. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +89 -2
  308. package/src/__tests__/gpu-driven-view.browser.test.ts +3 -3
  309. package/src/__tests__/gpu-driven-view.dawn.test.ts +3 -3
  310. package/src/__tests__/gpu-driven-view.unit.test.ts +50 -0
  311. package/src/__tests__/gpu-lod-evidence.ts +188 -0
  312. package/src/__tests__/gpu-lod-fallback.integration.test.ts +10 -0
  313. package/src/__tests__/gpu-lod-indirect.integration.test.ts +40 -0
  314. package/src/__tests__/gpu-lod-parity.dawn.test.ts +29 -0
  315. package/src/__tests__/gpu-lod-readiness.integration.test.ts +52 -0
  316. package/src/__tests__/gpu-lod-schema.unit.test.ts +66 -0
  317. package/src/__tests__/gpu-lod-selector.unit.test.ts +28 -0
  318. package/src/__tests__/gpu-lod-silhouette.browser.test.ts +13 -0
  319. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +66 -1
  320. package/src/__tests__/gpu-scene.dawn.test.ts +8 -1
  321. package/src/__tests__/gpu-scene.unit.test.ts +49 -3
  322. package/src/__tests__/ibl/face-uniforms.unit.test.ts +2 -0
  323. package/src/__tests__/ibl-residency-publication.unit.test.ts +113 -0
  324. package/src/__tests__/light-buffer-layout.unit.test.ts +113 -3
  325. package/src/__tests__/light-inspection.unit.test.ts +55 -0
  326. package/src/__tests__/light-resource-error.unit.test.ts +43 -0
  327. package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +109 -0
  328. package/src/__tests__/lod-bounds.unit.test.ts +42 -0
  329. package/src/__tests__/lod-cpu-lane.integration.test.ts +55 -0
  330. package/src/__tests__/lod-cpu-no-change.perf.test.ts +19 -0
  331. package/src/__tests__/lod-gpu-frame-timing.unit.test.ts +49 -0
  332. package/src/__tests__/lod-multi-view.integration.test.ts +63 -0
  333. package/src/__tests__/lod-occlusion-device-loss.integration.test.ts +27 -0
  334. package/src/__tests__/lod-occlusion-final-decision.integration.test.ts +47 -0
  335. package/src/__tests__/lod-occlusion-inspection.integration.test.ts +217 -0
  336. package/src/__tests__/lod-occlusion-inspection.schema.test-d.ts +14 -0
  337. package/src/__tests__/lod-occlusion-inspection.unit.test.ts +72 -0
  338. package/src/__tests__/lod-occlusion-visual-evidence.ts +91 -0
  339. package/src/__tests__/lod-occlusion.browser.test.ts +15 -0
  340. package/src/__tests__/lod-occlusion.dawn.test.ts +20 -0
  341. package/src/__tests__/lod-selector.profile.test.ts +35 -0
  342. package/src/__tests__/lod-selector.unit.test.ts +68 -0
  343. package/src/__tests__/lod-visibility-identity.unit.test.ts +198 -0
  344. package/src/__tests__/lod-visibility-lifecycle.integration.test.ts +132 -0
  345. package/src/__tests__/ltc-resources.unit.test.ts +32 -0
  346. package/src/__tests__/material-contract-inventory.unit.test.ts +41 -9
  347. package/src/__tests__/material-cooked-projection.unit.test.ts +19 -1
  348. package/src/__tests__/material-static-dynamic-route.unit.test.ts +29 -0
  349. package/src/__tests__/material-stride-surface.unit.test.ts +7 -3
  350. package/src/__tests__/materials-standard-contract.unit.test.ts +104 -0
  351. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +1 -1
  352. package/src/__tests__/occlusion-confidence.unit.test.ts +168 -0
  353. package/src/__tests__/occlusion-invalidation.integration.test.ts +37 -0
  354. package/src/__tests__/occlusion-pass-routing.unit.test.ts +16 -0
  355. package/src/__tests__/occlusion-pass.dawn.test.ts +20 -0
  356. package/src/__tests__/occlusion-pass.integration.test.ts +43 -0
  357. package/src/__tests__/occlusion-pass.rhi-null.test.ts +22 -0
  358. package/src/__tests__/occlusion-query-pool.rhi-null.test.ts +21 -0
  359. package/src/__tests__/occlusion-query-pool.unit.test.ts +95 -0
  360. package/src/__tests__/occlusion-query-ticket.integration.test.ts +47 -0
  361. package/src/__tests__/occlusion-query.dawn.test.ts +16 -0
  362. package/src/__tests__/occlusion-query.evidence.ts +178 -0
  363. package/src/__tests__/occlusion-query.rhi-null.test.ts +31 -0
  364. package/src/__tests__/occlusion-runtime.unit.test.ts +120 -0
  365. package/src/__tests__/physical-clearcoat.integration.test.ts +89 -0
  366. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +196 -0
  367. package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +1 -1
  368. package/src/__tests__/probe-bindings.unit.test.ts +200 -0
  369. package/src/__tests__/probe-blend-numeric.unit.test.ts +67 -0
  370. package/src/__tests__/probe-blend-oracle.unit.test.ts +136 -0
  371. package/src/__tests__/probe-capacity.integration.test.ts +97 -0
  372. package/src/__tests__/probe-recovery.integration.test.ts +104 -0
  373. package/src/__tests__/probe-scene-dirty.integration.test.ts +211 -0
  374. package/src/__tests__/profiler-phase-catalog.test.ts +4 -1
  375. package/src/__tests__/profiler-phase-token.test.ts +1 -0
  376. package/src/__tests__/recover-error-policy-owner.unit.test.ts +6 -3
  377. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +140 -0
  378. package/src/__tests__/rect-area-boundary.unit.test.ts +24 -0
  379. package/src/__tests__/reflection-fallback-graph.unit.test.ts +67 -0
  380. package/src/__tests__/reflection-fallback-inspection.unit.test.ts +77 -0
  381. package/src/__tests__/reflection-fallback-lifecycle.integration.test.ts +21 -0
  382. package/src/__tests__/reflection-fallback-projection.unit.test.ts +90 -0
  383. package/src/__tests__/reflection-fallback-source.unit.test.ts +32 -0
  384. package/src/__tests__/reflection-probe-owner-placement.unit.test.ts +39 -0
  385. package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +120 -0
  386. package/src/__tests__/render-error-code-owner.test-d.ts +1 -0
  387. package/src/__tests__/render-feature-docs.unit.test.ts +12 -7
  388. package/src/__tests__/render-graph-fallback.integration.test.ts +24 -0
  389. package/src/__tests__/render-perf/extended-lighting.bench.test.ts +66 -0
  390. package/src/__tests__/render-scene-projection.unit.test.ts +447 -18
  391. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +160 -17
  392. package/src/__tests__/renderer-frame-generation-fence.integration.test.ts +47 -0
  393. package/src/__tests__/renderer-generation-assembly.unit.test.ts +77 -0
  394. package/src/__tests__/renderer-generation-failure.unit.test.ts +108 -0
  395. package/src/__tests__/renderer-producer-root-matrix.integration.test.ts +33 -0
  396. package/src/__tests__/renderer-recovery-capability-matrix.unit.test.ts +59 -0
  397. package/src/__tests__/renderer-recovery-contract.unit.test.ts +73 -0
  398. package/src/__tests__/renderer-recovery-lifecycle.unit.test.ts +216 -0
  399. package/src/__tests__/renderer-target-history-recovery.integration.test.ts +80 -0
  400. package/src/__tests__/shader-manifest-fixture.ts +13 -16
  401. package/src/__tests__/shader-stage-surface.unit.test.ts +1 -1
  402. package/src/__tests__/skin-motion-regression.unit.test.ts +22 -0
  403. package/src/__tests__/skinned-shadow-caster.test.ts +2 -2
  404. package/src/__tests__/spot-modifier-projection.unit.test.ts +70 -0
  405. package/src/__tests__/ssr-admission-matrix.integration.test.ts +206 -0
  406. package/src/__tests__/ssr-composition.unit.test.ts +46 -0
  407. package/src/__tests__/ssr-fallback-zero-work.bench.test.ts +94 -0
  408. package/src/__tests__/ssr-recovery-errors.unit.test.ts +58 -0
  409. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +67 -0
  410. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +7 -0
  411. package/src/__tests__/standard-layer-projection.unit.test.ts +23 -0
  412. package/src/__tests__/standard-lighting-inspection.integration.test.ts +1 -1
  413. package/src/__tests__/standard-lighting-write.unit.test.ts +66 -2
  414. package/src/__tests__/temporal-fallback-generation.integration.test.ts +16 -0
  415. package/src/__tests__/temporal-view.unit.test.ts +3 -3
  416. package/src/__tests__/transmission-prewarm.unit.test.ts +111 -32
  417. package/src/__tests__/visibility-budget.integration.test.ts +140 -0
  418. package/src/__tests__/visibility-budget.unit.test.ts +70 -0
  419. package/src/__tests__/visibility-extract.integration.test.ts +11 -6
  420. package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +6 -3
  421. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +31 -28
  422. package/src/__tests__/volumetric-fog-topology.unit.test.ts +3 -1
  423. package/src/assembly/backend-contract.ts +13 -0
  424. package/src/assembly/bundler-contract.ts +9 -0
  425. package/src/assembly/device-feature-admission.ts +26 -9
  426. package/src/assembly/extended-lighting-fallback.ts +216 -0
  427. package/src/assembly/factory.ts +81 -9634
  428. package/src/assembly/host-contract.ts +10 -0
  429. package/src/assembly/material/assembly.ts +18 -2
  430. package/src/assembly/material/standard-layer-projection.ts +16 -0
  431. package/src/assembly/material-shader-policy.ts +854 -0
  432. package/src/assembly/material-shader-prewarm.ts +88 -0
  433. package/src/assembly/mesh-ssbo-grow.ts +270 -0
  434. package/src/assembly/recovery/device-loss-fanout.ts +89 -0
  435. package/src/assembly/recovery/generation.ts +141 -0
  436. package/src/assembly/recovery/recovery-attempt.ts +800 -0
  437. package/src/assembly/recovery/renderer-recover.ts +906 -0
  438. package/src/assembly/renderer-facade.ts +342 -0
  439. package/src/assembly/renderer-frame-transaction.ts +45 -0
  440. package/src/assembly/renderer-helpers.ts +99 -0
  441. package/src/assembly/renderer-lifecycle.ts +159 -0
  442. package/src/assembly/shader-prewarm-policy.ts +157 -0
  443. package/src/assembly/webgpu-ready-contract.ts +14 -0
  444. package/src/assembly/webgpu-ready.ts +4079 -0
  445. package/src/assembly/webgpu-renderer.ts +4095 -0
  446. package/src/cluster-binner.ts +31 -0
  447. package/src/components/__tests__/lighting-authoring.unit.test.ts +39 -0
  448. package/src/components/__tests__/rect-area-light.unit.test.ts +33 -0
  449. package/src/components/camera.ts +1 -1
  450. package/src/components/index.ts +3 -0
  451. package/src/components/light-helpers.ts +52 -1
  452. package/src/components/light-probe.ts +13 -0
  453. package/src/components/rect-area-light.ts +15 -0
  454. package/src/components/scene-instance.ts +6 -0
  455. package/src/components/spot-light.ts +3 -0
  456. package/src/debug-draw-glue.ts +1 -1
  457. package/src/device/__tests__/extended-lighting-recovery.unit.test.ts +24 -0
  458. package/src/device/device-scope.ts +35 -6
  459. package/src/device/gpu-residency.ts +334 -35
  460. package/src/device/lifecycle-transaction.ts +12 -0
  461. package/src/environment/frame.ts +6 -0
  462. package/src/environment/inspection.ts +10 -0
  463. package/src/environment/lifecycle.ts +122 -9
  464. package/src/errors/gpu-driven.ts +92 -0
  465. package/src/errors/index.ts +1 -0
  466. package/src/errors/recover.ts +108 -5
  467. package/src/errors/render.ts +72 -1
  468. package/src/extract/camera.ts +3 -3
  469. package/src/extract/contracts.ts +974 -0
  470. package/src/extract/gpu-driven.ts +108 -0
  471. package/src/extract/visibility.ts +0 -23
  472. package/src/features/host.ts +16 -0
  473. package/src/features/prepared-gpu-work.ts +20 -2
  474. package/src/features/prepared-graphics-store.ts +17 -0
  475. package/src/gpu-driven/batch-topology.ts +206 -28
  476. package/src/gpu-driven/prepared-draw.ts +208 -0
  477. package/src/gpu-driven/production-raster.ts +1046 -39
  478. package/src/gpu-driven/view-gpu.ts +411 -29
  479. package/src/gpu-scene-schema.ts +13 -0
  480. package/src/gpu-scene.ts +137 -67
  481. package/src/gpu-usage.ts +0 -1
  482. package/src/hdrp-buffers.ts +6 -6
  483. package/src/ibl/IblPipelineCache.ts +134 -50
  484. package/src/ibl/skylight-bind-group.ts +26 -0
  485. package/src/index.ts +83 -1
  486. package/src/inspection-types.ts +220 -1
  487. package/src/internal.ts +38 -0
  488. package/src/light-buffer-layout.ts +157 -324
  489. package/src/materials.ts +278 -47
  490. package/src/mesh-material-bindings.ts +59 -0
  491. package/src/occlusion-proxy.ts +64 -0
  492. package/src/pbr-pipeline.ts +290 -60
  493. package/src/pipeline/standard-forward-lane.ts +47 -0
  494. package/src/pipeline/standard-lighting/graph.ts +2 -1
  495. package/src/pipeline/standard-lighting/light-frame.ts +3 -2
  496. package/src/pipeline/standard-lighting/topology.ts +1 -1
  497. package/src/pipeline/standard-lighting/transport.ts +2 -1
  498. package/src/pipeline/standard-pipeline.ts +2 -0
  499. package/src/pipeline-builder.ts +5 -2
  500. package/src/pipeline-spec.ts +12 -1
  501. package/src/plugin.ts +4 -0
  502. package/src/points-lines/__tests__/cache-recovery.unit.test.ts +22 -0
  503. package/src/points-lines/prepare.ts +9 -0
  504. package/src/points-lines/standard-owner.ts +403 -0
  505. package/src/prepare/__tests__/extended-lighting-capability.unit.test.ts +56 -0
  506. package/src/prepare/extended-lighting/ltc-resources.ts +136 -0
  507. package/src/prepare/extended-lighting/resources.ts +389 -0
  508. package/src/prepare/extended-lighting/spot-modifiers.ts +194 -0
  509. package/src/prepare/extended-lighting/state.ts +92 -0
  510. package/src/record/__tests__/frame-targets-recovery.unit.test.ts +60 -0
  511. package/src/record/__tests__/gpu-timing.unit.test.ts +177 -0
  512. package/src/record/__tests__/main-pass-geometry.unit.test.ts +26 -1
  513. package/src/record/__tests__/mesh-ssbo.unit.test.ts +38 -0
  514. package/src/record/__tests__/recovery-pipeline.unit.test.ts +124 -0
  515. package/src/record/__tests__/sprite-material-abi.unit.test.ts +28 -13
  516. package/src/record/__tests__/standard-pbr-ubo-layout.unit.test.ts +47 -4
  517. package/src/record/__tests__/temporal-payload.unit.test.ts +29 -28
  518. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +21 -2
  519. package/src/record/frame-lighting.ts +252 -53
  520. package/src/record/frame-snapshot.ts +72 -12
  521. package/src/record/frame-targets.ts +11 -1
  522. package/src/record/frame.ts +416 -95
  523. package/src/record/gpu-timing.ts +108 -44
  524. package/src/record/helpers.ts +1 -59
  525. package/src/record/main-pass-geometry.ts +434 -44
  526. package/src/record/main-pass-material.ts +324 -210
  527. package/src/record/main-pass-sprite-draws.ts +58 -92
  528. package/src/record/main-pass.ts +94 -6
  529. package/src/record/mesh-ssbo.ts +79 -46
  530. package/src/record/recovery-pipeline.ts +695 -0
  531. package/src/record/render-context.ts +99 -7
  532. package/src/record/shadow-pass.ts +66 -40
  533. package/src/record/typed-frame-graph.ts +270 -84
  534. package/src/record/view-ubo.ts +17 -27
  535. package/src/recovery/render-system-candidate.ts +839 -0
  536. package/src/reflection/inspection.ts +67 -0
  537. package/src/reflection/projection.ts +196 -1
  538. package/src/reflection/record-owner.ts +1283 -0
  539. package/src/render-contract.ts +82 -12
  540. package/src/render-pipeline.ts +5 -0
  541. package/src/render-system-extract-tail.ts +2983 -0
  542. package/src/render-system-extract.ts +290 -2784
  543. package/src/render-system.ts +1597 -1192
  544. package/src/scene/__tests__/changed-block-summary.candidate.test.ts +36 -0
  545. package/src/scene/probe-blend-record.ts +54 -0
  546. package/src/scene/probe-blend.ts +813 -0
  547. package/src/scene/render-scene-types.ts +0 -7
  548. package/src/scene/render-scene.ts +972 -184
  549. package/src/scene/visibility/bounds.ts +57 -0
  550. package/src/scene/visibility/budget.ts +40 -0
  551. package/src/scene/visibility/facet.ts +400 -0
  552. package/src/scene/visibility/gpu-frame-timing.ts +101 -0
  553. package/src/scene/visibility/gpu-lod.ts +119 -0
  554. package/src/scene/visibility/inspection.ts +313 -0
  555. package/src/scene/visibility/lod-selector.ts +84 -0
  556. package/src/scene/visibility/occlusion-confidence.ts +478 -0
  557. package/src/scene/visibility/occlusion-pass.ts +165 -0
  558. package/src/scene/visibility/occlusion-query-pool.ts +178 -0
  559. package/src/scene/visibility/occlusion-runtime.ts +672 -0
  560. package/src/scene/visibility/types.ts +50 -0
  561. package/src/ssr/admission.ts +451 -0
  562. package/src/ssr/composition.ts +73 -0
  563. package/src/ssr/errors.ts +76 -0
  564. package/src/ssr/identity.ts +12 -0
  565. package/src/systems/skin-palette-allocator.ts +1 -1
  566. package/src/temporal/frame-coordinator.ts +30 -1
  567. package/src/temporal/frame.ts +14 -1
  568. package/src/temporal/taa-history-store.ts +46 -2
  569. package/src/temporal/temporal-view.ts +1 -1
  570. package/src/temporal/transaction.ts +9 -0
  571. package/src/temporal/view.ts +11 -0
  572. package/src/tilemap-chunk-extract-system.ts +5 -5
  573. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +19 -12
  574. package/src/typed-render-graph-primitives.ts +48 -0
  575. package/src/volume/passes.ts +46 -49
  576. package/dist/.tsbuildinfo +0 -1
  577. package/dist/chunk-5YADUCA7.mjs.map +0 -1
  578. package/dist/chunk-6OPXDQ2E.mjs.map +0 -1
  579. package/dist/chunk-BXBQQKFQ.mjs +0 -67
  580. package/dist/chunk-BXBQQKFQ.mjs.map +0 -1
  581. package/dist/chunk-FS2KNUQH.mjs.map +0 -1
  582. package/dist/chunk-PCHBPYML.mjs.map +0 -1
  583. package/dist/chunk-VFPLTKCU.mjs +0 -192
  584. package/dist/chunk-VFPLTKCU.mjs.map +0 -1
@@ -70,6 +70,32 @@ export interface TemporalFrameReceipt<T = unknown> {
70
70
  readonly historyDirection: 'a-to-b' | 'b-to-a';
71
71
  }
72
72
 
73
+ export type ReflectionFallbackTemporalReset =
74
+ | { readonly reset: false }
75
+ | { readonly reset: true; readonly reason: 'reflection-fallback-generation' };
76
+
77
+ /** Maps committed producer generations into the existing temporal reset seam. */
78
+ export function resolveReflectionFallbackTemporalReset(
79
+ previousGeneration: number | undefined,
80
+ nextGeneration: number | undefined,
81
+ ): ReflectionFallbackTemporalReset {
82
+ if (previousGeneration === undefined || nextGeneration === undefined) return { reset: false };
83
+ return previousGeneration === nextGeneration
84
+ ? { reset: false }
85
+ : { reset: true, reason: 'reflection-fallback-generation' };
86
+ }
87
+
88
+ /**
89
+ * Keeps SSR admission on the existing producer-generation reset seam. The
90
+ * admission path never allocates or resolves temporal history itself.
91
+ */
92
+ export function resolveSsrAdmissionTemporalReset(
93
+ previousGeneration: number | undefined,
94
+ nextGeneration: number | undefined,
95
+ ): ReflectionFallbackTemporalReset {
96
+ return resolveReflectionFallbackTemporalReset(previousGeneration, nextGeneration);
97
+ }
98
+
73
99
  function failure(code: TemporalFrameErrorCode, hint: string): TemporalFrameError {
74
100
  return {
75
101
  code,
@@ -176,7 +202,10 @@ export class TemporalFrameCoordinator<T = unknown> {
176
202
  }
177
203
  this.historyDirection = candidate.history.direction === 'a-to-b' ? 'b-to-a' : 'a-to-b';
178
204
  const historyAttempt = this.historyAttempts.get(candidate);
179
- historyAttempt?.commit();
205
+ historyAttempt?.commit({
206
+ deviceGeneration: this.historyStore.inspect().deviceGeneration,
207
+ completed: true,
208
+ });
180
209
  this.coverage = classifySceneDataCoverage({
181
210
  contributors: candidate.contributors,
182
211
  requiredContributorIds: candidate.requiredContributorIds,
@@ -44,6 +44,8 @@ export interface TemporalFrameTransaction {
44
44
  stage(input: TemporalFrameInput): void;
45
45
  commit(submit: TemporalSubmitResult): Result<TemporalFrame, TemporalFrameSubmitError>;
46
46
  snapshot(): TemporalFrame;
47
+ /** Drop accepted/staged history after a producer or device generation cut. */
48
+ reset(reason?: Extract<TemporalResetReason, 'signature-change' | 'device-recovery'>): void;
47
49
  }
48
50
 
49
51
  function copyInput(input: TemporalFrameInput): TemporalFrameInput {
@@ -82,6 +84,7 @@ export function createTemporalFrameTransaction(options: {
82
84
  let accepted: TemporalFrame | undefined;
83
85
  let staged: TemporalFrameInput | undefined;
84
86
  let historyEpoch = 0;
87
+ let pendingResetReason: Exclude<TemporalResetReason, 'none' | 'queue-submit-failed'> | undefined;
85
88
 
86
89
  return {
87
90
  stage(input) {
@@ -96,7 +99,7 @@ export function createTemporalFrameTransaction(options: {
96
99
  return err(new TemporalFrameSubmitError('queue-submit-failed'));
97
100
  }
98
101
 
99
- const resetReason = submit.resetReason ?? staged.resetReason ?? 'none';
102
+ const resetReason = submit.resetReason ?? staged.resetReason ?? pendingResetReason ?? 'none';
100
103
  const shouldReset = resetReason !== 'none';
101
104
  if (shouldReset) historyEpoch += 1;
102
105
  const next: TemporalFrame = {
@@ -117,6 +120,7 @@ export function createTemporalFrameTransaction(options: {
117
120
  };
118
121
  accepted = next;
119
122
  staged = undefined;
123
+ pendingResetReason = undefined;
120
124
  return ok(copyFrame(next));
121
125
  },
122
126
  snapshot() {
@@ -124,5 +128,14 @@ export function createTemporalFrameTransaction(options: {
124
128
  throw new Error('TemporalFrame snapshot is unavailable before commit');
125
129
  return copyFrame(accepted);
126
130
  },
131
+ reset(reason = 'signature-change') {
132
+ accepted = undefined;
133
+ staged = undefined;
134
+ historyEpoch += 1;
135
+ // The reason is carried into the next accepted frame while clearing the
136
+ // committed frame prevents stale motion vectors from crossing the
137
+ // producer/device boundary.
138
+ pendingResetReason = reason;
139
+ },
127
140
  };
128
141
  }
@@ -6,6 +6,11 @@ export type TaaHistoryResetReason =
6
6
  | 'device-generation';
7
7
 
8
8
  export interface TaaHistoryInspection {
9
+ readonly token: number;
10
+ readonly deviceGeneration: number;
11
+ readonly content: 'uninitialized' | 'active';
12
+ readonly fallback: 'neutral-texture';
13
+ readonly requestVersion: number;
9
14
  readonly generation: number;
10
15
  readonly seed: number;
11
16
  readonly attempt: 'none' | 'active' | 'committed' | 'aborted';
@@ -13,15 +18,26 @@ export interface TaaHistoryInspection {
13
18
  readonly resetReason: TaaHistoryResetReason | undefined;
14
19
  }
15
20
 
21
+ export interface TaaHistoryReceipt {
22
+ readonly deviceGeneration: number;
23
+ readonly completed: boolean;
24
+ }
25
+
16
26
  export interface TaaHistoryAttempt {
17
27
  readonly generation: number;
18
28
  readonly seed: number;
19
- commit(): void;
29
+ commit(receipt?: TaaHistoryReceipt): void;
20
30
  abort(): void;
21
31
  }
22
32
 
33
+ let nextHistoryToken = 1;
34
+
23
35
  /** TAA-only history owner. No global registry or backend handle crosses this boundary. */
24
36
  export class TaaHistoryStore {
37
+ private readonly token = nextHistoryToken++;
38
+ private deviceGeneration = 0;
39
+ private content: TaaHistoryInspection['content'] = 'uninitialized';
40
+ private requestVersion = 0;
25
41
  private generation = 0;
26
42
  private seed = 0;
27
43
  private valid = false;
@@ -36,11 +52,21 @@ export class TaaHistoryStore {
36
52
  return {
37
53
  generation,
38
54
  seed,
39
- commit: () => {
55
+ commit: (receipt) => {
40
56
  if (state !== 'active') return;
57
+ if (
58
+ receipt !== undefined &&
59
+ (!receipt.completed || receipt.deviceGeneration !== this.deviceGeneration)
60
+ ) {
61
+ state = 'aborted';
62
+ this.attempt = 'aborted';
63
+ return;
64
+ }
41
65
  state = 'committed';
42
66
  this.attempt = 'committed';
43
67
  this.valid = true;
68
+ this.content = 'active';
69
+ this.requestVersion += 1;
44
70
  this.generation += 1;
45
71
  this.seed += 1;
46
72
  this.resetReason = reason;
@@ -55,6 +81,7 @@ export class TaaHistoryStore {
55
81
 
56
82
  seedHistory(reason: TaaHistoryResetReason = 'first-frame'): void {
57
83
  this.valid = false;
84
+ this.content = 'uninitialized';
58
85
  this.resetReason = reason;
59
86
  this.attempt = 'none';
60
87
  }
@@ -63,12 +90,29 @@ export class TaaHistoryStore {
63
90
  this.generation = 0;
64
91
  this.seed = 0;
65
92
  this.valid = false;
93
+ this.content = 'uninitialized';
66
94
  this.attempt = 'none';
67
95
  this.resetReason = reason;
68
96
  }
69
97
 
98
+ recoverForGeneration(deviceGeneration: number): void {
99
+ if (!Number.isSafeInteger(deviceGeneration) || deviceGeneration < 0) {
100
+ throw new RangeError('deviceGeneration must be a non-negative safe integer.');
101
+ }
102
+ this.deviceGeneration = deviceGeneration;
103
+ this.valid = false;
104
+ this.content = 'uninitialized';
105
+ this.attempt = 'none';
106
+ this.resetReason = 'device-generation';
107
+ }
108
+
70
109
  inspect(): TaaHistoryInspection {
71
110
  return {
111
+ token: this.token,
112
+ deviceGeneration: this.deviceGeneration,
113
+ content: this.content,
114
+ fallback: 'neutral-texture',
115
+ requestVersion: this.requestVersion,
72
116
  generation: this.generation,
73
117
  seed: this.seed,
74
118
  attempt: this.attempt,
@@ -89,8 +89,8 @@ function cameraProjection(camera: CameraSnapshot): Float32Array {
89
89
  projection,
90
90
  camera.orthoLeft,
91
91
  camera.orthoRight,
92
- camera.orthoBottom,
93
92
  camera.orthoTop,
93
+ camera.orthoBottom,
94
94
  camera.near,
95
95
  camera.far,
96
96
  );
@@ -10,6 +10,15 @@ export interface TemporalFrameCandidate {
10
10
  readonly history: TemporalHistory;
11
11
  }
12
12
 
13
+ export interface TemporalGenerationFence {
14
+ readonly capturedGeneration: number;
15
+ readonly currentGeneration: () => number;
16
+ }
17
+
18
+ export function temporalGenerationIsCurrent(fence: TemporalGenerationFence): boolean {
19
+ return fence.currentGeneration() === fence.capturedGeneration;
20
+ }
21
+
13
22
  export function stageTemporalFrame(
14
23
  candidate: TemporalFrameCandidate,
15
24
  ): RendererFrameTransaction<TemporalFrameCandidate> {
@@ -38,6 +38,8 @@ export interface TemporalViewInput {
38
38
  readonly historyValid?: boolean;
39
39
  readonly currentUnjitteredViewProjection?: ArrayLike<number> | undefined;
40
40
  readonly previousUnjitteredViewProjection?: ArrayLike<number> | undefined;
41
+ readonly currentCameraPosition?: readonly [number, number, number] | undefined;
42
+ readonly previousCameraPosition?: readonly [number, number, number] | undefined;
41
43
  readonly resetReason?: TemporalResetReason | undefined;
42
44
  }
43
45
 
@@ -55,6 +57,8 @@ interface TemporalViewSnapshot {
55
57
  readonly historyValid: boolean;
56
58
  readonly currentUnjitteredViewProjection: ArrayLike<number> | undefined;
57
59
  readonly previousUnjitteredViewProjection: ArrayLike<number> | undefined;
60
+ readonly currentCameraPosition: readonly [number, number, number] | undefined;
61
+ readonly previousCameraPosition: readonly [number, number, number] | undefined;
58
62
  readonly resetReason: TemporalResetReason | undefined;
59
63
  }
60
64
 
@@ -70,6 +74,9 @@ export interface TemporalView {
70
74
  /** Unjittered matrices are supplied by the renderer projection owner. */
71
75
  readonly currentUnjitteredViewProjection: ArrayLike<number> | undefined;
72
76
  readonly previousUnjitteredViewProjection: ArrayLike<number> | undefined;
77
+ /** Camera origins follow the same accepted-submit boundary as the matrices. */
78
+ readonly currentCameraPosition: readonly [number, number, number] | undefined;
79
+ readonly previousCameraPosition: readonly [number, number, number] | undefined;
73
80
  readonly currentProjection: 'jittered' | 'unjittered';
74
81
  readonly previousProjection: 'unjittered';
75
82
  readonly historyRequired: boolean;
@@ -112,6 +119,8 @@ export function createTemporalView(input: TemporalViewInput): TemporalView {
112
119
  historyValid: input.historyValid ?? false,
113
120
  currentUnjitteredViewProjection: input.currentUnjitteredViewProjection,
114
121
  previousUnjitteredViewProjection: input.previousUnjitteredViewProjection,
122
+ currentCameraPosition: input.currentCameraPosition,
123
+ previousCameraPosition: input.previousCameraPosition,
115
124
  resetReason: input.resetReason,
116
125
  });
117
126
  const taa = input.antialias === 'taa';
@@ -135,6 +144,8 @@ export function createTemporalView(input: TemporalViewInput): TemporalView {
135
144
  temporalFrameIndex: frameIndex,
136
145
  currentUnjitteredViewProjection: input.currentUnjitteredViewProjection,
137
146
  previousUnjitteredViewProjection: input.previousUnjitteredViewProjection,
147
+ currentCameraPosition: input.currentCameraPosition,
148
+ previousCameraPosition: input.previousCameraPosition,
138
149
  currentProjection: taa ? 'jittered' : 'unjittered',
139
150
  previousProjection: 'unjittered',
140
151
  historyRequired: taa,
@@ -57,7 +57,7 @@ import {
57
57
  import type { EntityHandle, World } from '@forgeax/engine-ecs';
58
58
  import { decodeTileBits } from '@forgeax/engine-graphics-extras';
59
59
  import { type box3, frustum, mat4 } from '@forgeax/engine-math';
60
- import { ChildOf, Children, Transform } from '@forgeax/engine-scene';
60
+ import { ChildOf, Children, GlobalTransform, Transform } from '@forgeax/engine-scene';
61
61
  import {
62
62
  type Handle,
63
63
  type MaterialAsset,
@@ -874,13 +874,13 @@ function bucketTileLayer(
874
874
  * cull paths use byte-identical planes (charter P4 consistent abstraction).
875
875
  */
876
876
  function buildCameraFrustumPlanes(world: World): frustum.Frustum | null {
877
- const query = world.query({ with: [Camera, Transform] }).unwrap();
877
+ const query = world.query({ with: [Camera, Transform, GlobalTransform] }).unwrap();
878
878
  let result: frustum.Frustum | null = null;
879
879
  for (const row of query) {
880
880
  const camEntity = row.entity;
881
881
 
882
882
  const camRes = world.get(camEntity, Camera);
883
- const trRes = world.get(camEntity, Transform);
883
+ const trRes = world.get(camEntity, GlobalTransform);
884
884
  if (!camRes.ok || !trRes.ok) continue;
885
885
 
886
886
  const cam = camRes.value;
@@ -895,8 +895,8 @@ function buildCameraFrustumPlanes(world: World): frustum.Frustum | null {
895
895
  proj as Parameters<typeof mat4.orthographic>[0],
896
896
  cam.left,
897
897
  cam.right,
898
- cam.bottom,
899
898
  cam.top,
899
+ cam.bottom,
900
900
  near,
901
901
  far,
902
902
  );
@@ -1081,7 +1081,7 @@ function evictDeadPerCellStreamingCaches(work: readonly LayerWork[], world: Worl
1081
1081
  /**
1082
1082
  * Walk every TileLayer ChildOf-ing a Tilemap, extract its non-zero cells
1083
1083
  * into derived render entities. A Renderer attaches this system to FrameEnd;
1084
- * World's final publication then resolves newly-created Transform.world values before the
1084
+ * World's final publication then resolves newly-created GlobalTransform.world values before the
1085
1085
  * read-only render walk begins.
1086
1086
  *
1087
1087
  * Two paths based on `TileLayer.sortScope`:
@@ -29,6 +29,7 @@ const BUFFER_USAGE_MAP_READ = 0x0001;
29
29
  const BUFFER_USAGE_COPY_DST = 0x0008;
30
30
  const GPU_MAP_MODE_READ = 0x0001;
31
31
  const TEST_REACTIVE = 0;
32
+ const LIGHTWEIGHT_DAWN = process.env.FORGEAX_DAWN_LIGHTWEIGHT === '1';
32
33
 
33
34
  const ENGINE_MANIFEST = await (async () => {
34
35
  const { buildEngineShaderManifest } = await import('@forgeax/engine-vite-plugin-shader');
@@ -377,8 +378,8 @@ describe('Standard transmission Dawn ROI', () => {
377
378
  }, 120_000);
378
379
 
379
380
  it('keeps IOR, thickness, and roughness monotonic in a finite linear ROI', async () => {
380
- const cases = await Promise.all([
381
- renderCase({
381
+ const fullCases = [
382
+ {
382
383
  name: 'ior-low',
383
384
  transmission: 1,
384
385
  ior: 1.1,
@@ -386,8 +387,8 @@ describe('Standard transmission Dawn ROI', () => {
386
387
  roughness: 0.1,
387
388
  attenuationColor: [0.8, 0.8, 0.8],
388
389
  attenuationDistance: 4,
389
- }),
390
- renderCase({
390
+ },
391
+ {
391
392
  name: 'ior-high',
392
393
  transmission: 1,
393
394
  ior: 2.2,
@@ -395,8 +396,8 @@ describe('Standard transmission Dawn ROI', () => {
395
396
  roughness: 0.1,
396
397
  attenuationColor: [0.8, 0.8, 0.8],
397
398
  attenuationDistance: 4,
398
- }),
399
- renderCase({
399
+ },
400
+ {
400
401
  name: 'thick',
401
402
  transmission: 1,
402
403
  ior: 1.5,
@@ -404,8 +405,8 @@ describe('Standard transmission Dawn ROI', () => {
404
405
  roughness: 0.1,
405
406
  attenuationColor: [0.1, 0.1, 0.1],
406
407
  attenuationDistance: 1,
407
- }),
408
- renderCase({
408
+ },
409
+ {
409
410
  name: 'rough',
410
411
  transmission: 1,
411
412
  ior: 1.5,
@@ -413,12 +414,18 @@ describe('Standard transmission Dawn ROI', () => {
413
414
  roughness: 0.9,
414
415
  attenuationColor: [0.8, 0.8, 0.8],
415
416
  attenuationDistance: 4,
416
- }),
417
- ]);
417
+ },
418
+ ] as const;
419
+ // Browser parity still exercises every transmission fixture. The PR
420
+ // Dawn lane keeps the low/high IOR and roughness boundaries, while the
421
+ // full local/nightly lane retains the thickness case as well.
422
+ const selectedCases = LIGHTWEIGHT_DAWN ? [fullCases[0], fullCases[1], fullCases[3]] : fullCases;
423
+ const cases = await Promise.all(selectedCases.map((testCase) => renderCase(testCase)));
418
424
  for (const result of cases) expect(result.pixel.every(Number.isFinite)).toBe(true);
419
425
  expect(cases[1]?.pixel).not.toEqual(cases[0]?.pixel);
420
- expect(cases[2]?.pixel).not.toEqual(cases[0]?.pixel);
421
- expect(luma(cases[3]?.pixel ?? [0, 0, 0, 0])).toBeLessThanOrEqual(
426
+ if (!LIGHTWEIGHT_DAWN) expect(cases[2]?.pixel).not.toEqual(cases[0]?.pixel);
427
+ const rough = LIGHTWEIGHT_DAWN ? cases[2] : cases[3];
428
+ expect(luma(rough?.pixel ?? [0, 0, 0, 0])).toBeLessThanOrEqual(
422
429
  luma(cases[0]?.pixel ?? [0, 0, 0, 0]) + 2,
423
430
  );
424
431
  }, 120_000);
@@ -34,6 +34,7 @@ import {
34
34
  } from './render-graph-primitives';
35
35
  import type { RenderPipelineFrame, RenderPipelineGpuDrivenProjection } from './render-pipeline';
36
36
  import { createRenderPipelineTarget, type RenderPipelineTarget } from './render-pipeline';
37
+ import type { OcclusionFrameProjection } from './scene/visibility/occlusion-runtime';
37
38
  import {
38
39
  getTemporalBindGroupResources,
39
40
  getTemporalGpuState,
@@ -136,6 +137,7 @@ export interface TypedScenePassOptions {
136
137
  readonly transmissionBackdrop?: GraphTextureView | undefined;
137
138
  readonly extraAccesses?: readonly GraphAccess[] | undefined;
138
139
  readonly gpuDriven?: RenderPipelineGpuDrivenProjection | undefined;
140
+ readonly occlusion?: OcclusionFrameProjection | undefined;
139
141
  }
140
142
 
141
143
  export function addTypedScenePass(
@@ -187,6 +189,7 @@ export function addTypedScenePass(
187
189
  stencilLoadOp: options.depthLoadOp ?? 'clear',
188
190
  stencilStoreOp: 'store',
189
191
  },
192
+ occlusionQuerySet: options.occlusion?.querySet,
190
193
  encode: ({ pass, frame, resources }) => {
191
194
  const colorViews = colorTargets.map((target) => resolvedView(resources, target.view));
192
195
  const depthView = resolvedView(resources, options.depth.view);
@@ -228,13 +231,23 @@ export function addTypedScenePass(
228
231
  if (groups.viewBindGroup !== null) {
229
232
  options.gpuDriven?.encode(groups.viewBindGroup, pass, resources);
230
233
  }
234
+ // The context carries the frame's primary occlusion projection for
235
+ // pipeline construction, but only the pass that owns that projection
236
+ // may begin its query. Forwarding it to deferred/temporal scene passes
237
+ // leaves their descriptors without an occlusionQuerySet and makes Dawn
238
+ // reject beginOcclusionQuery in those passes.
239
+ const activeOcclusion = options.occlusion;
231
240
  encodeMainPass(
232
241
  {
233
242
  ...internal,
243
+ ...(activeOcclusion === undefined ? {} : { occlusion: activeOcclusion }),
234
244
  geometryColorView: colorViews[0] ?? null,
235
245
  geometryDepthView: depthView,
236
246
  geometryColorResolveView: resolveView,
237
247
  transparentColorFormat: colorTargets[0]?.format as GPUTextureFormat,
248
+ ...(colorTargets[1]?.format === 'rgba16float'
249
+ ? { reflectionFallbackColorFormat: 'rgba16float' as const }
250
+ : {}),
238
251
  msaaActive: colorTargets[0]?.sampleCount === 4,
239
252
  viewBindGroup: groups.viewBindGroup,
240
253
  meshBindGroup: groups.meshBindGroup,
@@ -256,6 +269,10 @@ export function addTypedScenePass(
256
269
  : { transmissionBackdropView: transmissionBackdrop }),
257
270
  },
258
271
  );
272
+ if (activeOcclusion !== undefined) {
273
+ const proxyResult = activeOcclusion.encodeProxyBounds(pass);
274
+ if (!proxyResult.ok) throw proxyResult.error;
275
+ }
259
276
  },
260
277
  });
261
278
  }
@@ -291,6 +308,37 @@ export function addTypedFrameObservationPass(
291
308
  });
292
309
  }
293
310
 
311
+ /** Publish the same-frame fallback MRT as a detached, copy-readable source. */
312
+ export function addReflectionFallbackObservationPass(
313
+ graph: RenderGraphBuilder<RenderPipelineFrame>,
314
+ target: RenderPipelineTarget,
315
+ ): Result<void, RenderGraphError> {
316
+ return graph.addCopyPass('reflection-fallback-observation', {
317
+ accesses: [{ resource: target.view, usage: 'copy-src' }],
318
+ encode: ({ frame, resources }) => {
319
+ const internal = frame as _InternalRenderPipelineContext;
320
+ const texture = resources.texture(target.texture);
321
+ if (!texture.ok) throw texture.error;
322
+ internal.frameState.reflectionFallbackObservationSource = {
323
+ texture: texture.value,
324
+ descriptor: {
325
+ texture: texture.value,
326
+ format: target.format,
327
+ size: { width: frame.targetW, height: frame.targetH },
328
+ usage:
329
+ GPU_TEXTURE_USAGE_COPY_SRC |
330
+ GPU_TEXTURE_USAGE_RENDER_ATTACHMENT |
331
+ GPU_TEXTURE_USAGE_TEXTURE_BINDING,
332
+ sample: target.sampleCount,
333
+ },
334
+ frameId: internal.frameState.frameNumber,
335
+ pipelineId: 'forgeax::standard',
336
+ backendId: internal.runtime.device.caps.backendKind,
337
+ };
338
+ },
339
+ });
340
+ }
341
+
294
342
  export interface TypedBloomTargets {
295
343
  readonly scene: RenderPipelineTarget;
296
344
  readonly composited: RenderPipelineTarget;