@forgeax/engine-render 0.1.7 → 0.1.20

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 (777) hide show
  1. package/README.md +140 -2
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/assembly/backend-contract.d.ts +12 -0
  4. package/dist/assembly/backend-contract.d.ts.map +1 -1
  5. package/dist/assembly/factory.d.ts +26 -5
  6. package/dist/assembly/factory.d.ts.map +1 -1
  7. package/dist/assembly/host-contract.d.ts +4 -0
  8. package/dist/assembly/host-contract.d.ts.map +1 -1
  9. package/dist/assembly/renderer-frame-transaction.d.ts +39 -0
  10. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -0
  11. package/dist/assembly/renderer-inspection.d.ts +22 -0
  12. package/dist/assembly/renderer-inspection.d.ts.map +1 -0
  13. package/dist/assembly/renderer-lifecycle.d.ts +4 -0
  14. package/dist/assembly/renderer-lifecycle.d.ts.map +1 -0
  15. package/dist/authoring.mjs +4 -2
  16. package/dist/authoring.mjs.map +1 -1
  17. package/dist/chunk-4XINDLAY.mjs +9404 -0
  18. package/dist/chunk-4XINDLAY.mjs.map +1 -0
  19. package/dist/chunk-CDTWTHZR.mjs +752 -0
  20. package/dist/chunk-CDTWTHZR.mjs.map +1 -0
  21. package/dist/chunk-FJ6P52EE.mjs +46 -0
  22. package/dist/chunk-FJ6P52EE.mjs.map +1 -0
  23. package/dist/chunk-JDWARUOI.mjs +44 -0
  24. package/dist/chunk-JDWARUOI.mjs.map +1 -0
  25. package/dist/chunk-M2MP4ZOU.mjs +73 -0
  26. package/dist/chunk-M2MP4ZOU.mjs.map +1 -0
  27. package/dist/chunk-PCHBPYML.mjs +385 -0
  28. package/dist/chunk-PCHBPYML.mjs.map +1 -0
  29. package/dist/chunk-RXZ3RGOU.mjs +53 -0
  30. package/dist/chunk-RXZ3RGOU.mjs.map +1 -0
  31. package/dist/{chunk-YEJIUW7D.mjs → chunk-TBQJOK2L.mjs} +356 -543
  32. package/dist/chunk-TBQJOK2L.mjs.map +1 -0
  33. package/dist/{chunk-CQXZC5XI.mjs → chunk-VFPLTKCU.mjs} +79 -69
  34. package/dist/chunk-VFPLTKCU.mjs.map +1 -0
  35. package/dist/components/atmosphere.d.ts +9 -0
  36. package/dist/components/atmosphere.d.ts.map +1 -0
  37. package/dist/components/camera.d.ts +2 -1
  38. package/dist/components/camera.d.ts.map +1 -1
  39. package/dist/components/fog.d.ts +8 -0
  40. package/dist/components/fog.d.ts.map +1 -0
  41. package/dist/components/index.d.ts +3 -0
  42. package/dist/components/index.d.ts.map +1 -1
  43. package/dist/components/light-helpers.d.ts.map +1 -1
  44. package/dist/components/motion-blur.d.ts +7 -0
  45. package/dist/components/motion-blur.d.ts.map +1 -0
  46. package/dist/components/spot-light.d.ts +12 -0
  47. package/dist/components/spot-light.d.ts.map +1 -1
  48. package/dist/construct-renderer.d.ts +2 -2
  49. package/dist/construct-renderer.d.ts.map +1 -1
  50. package/dist/construct-renderer.mjs +11146 -14507
  51. package/dist/construct-renderer.mjs.map +1 -1
  52. package/dist/device/device-scope.d.ts +4 -0
  53. package/dist/device/device-scope.d.ts.map +1 -1
  54. package/dist/device/gpu-residency.d.ts +19 -2
  55. package/dist/device/gpu-residency.d.ts.map +1 -1
  56. package/dist/environment/frame.d.ts +60 -0
  57. package/dist/environment/frame.d.ts.map +1 -0
  58. package/dist/environment/generation.d.ts +21 -0
  59. package/dist/environment/generation.d.ts.map +1 -0
  60. package/dist/environment/graph.d.ts +4 -0
  61. package/dist/environment/graph.d.ts.map +1 -0
  62. package/dist/environment/inspection.d.ts +48 -0
  63. package/dist/environment/inspection.d.ts.map +1 -0
  64. package/dist/environment/lifecycle.d.ts +39 -0
  65. package/dist/environment/lifecycle.d.ts.map +1 -0
  66. package/dist/environment/signature.d.ts +25 -0
  67. package/dist/environment/signature.d.ts.map +1 -0
  68. package/dist/errors/render.d.ts +204 -1
  69. package/dist/errors/render.d.ts.map +1 -1
  70. package/dist/extract/camera.d.ts +5 -0
  71. package/dist/extract/camera.d.ts.map +1 -0
  72. package/dist/extract/environment.d.ts +74 -0
  73. package/dist/extract/environment.d.ts.map +1 -0
  74. package/dist/extract/visibility.d.ts +1 -1
  75. package/dist/extract/visibility.d.ts.map +1 -1
  76. package/dist/features/host.d.ts +9 -2
  77. package/dist/features/host.d.ts.map +1 -1
  78. package/dist/features/motion-blur/motion-blur-feature.d.ts +16 -0
  79. package/dist/features/motion-blur/motion-blur-feature.d.ts.map +1 -0
  80. package/dist/features/motion-blur/motion-blur-params.d.ts +25 -0
  81. package/dist/features/motion-blur/motion-blur-params.d.ts.map +1 -0
  82. package/dist/features/plan.d.ts +17 -2
  83. package/dist/features/plan.d.ts.map +1 -1
  84. package/dist/features/prepared-gpu-work.d.ts +3 -1
  85. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  86. package/dist/features/prepared-graphics.d.ts +2 -1
  87. package/dist/features/prepared-graphics.d.ts.map +1 -1
  88. package/dist/features/render-graph-raster.d.ts +2 -1
  89. package/dist/features/render-graph-raster.d.ts.map +1 -1
  90. package/dist/features/targets.d.ts +3 -0
  91. package/dist/features/targets.d.ts.map +1 -1
  92. package/dist/features/types.d.ts +12 -0
  93. package/dist/features/types.d.ts.map +1 -1
  94. package/dist/fullscreen-post-process-pass.d.ts +7 -1
  95. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  96. package/dist/gpu-scene.d.ts +2 -0
  97. package/dist/gpu-scene.d.ts.map +1 -1
  98. package/dist/gpu-usage.d.ts +2 -0
  99. package/dist/gpu-usage.d.ts.map +1 -1
  100. package/dist/ibl/skylight-bind-group.d.ts +5 -6
  101. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  102. package/dist/index.d.ts +24 -7
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.mjs +6 -4
  105. package/dist/index.mjs.map +1 -1
  106. package/dist/inspection-types.d.ts +43 -1
  107. package/dist/inspection-types.d.ts.map +1 -1
  108. package/dist/internal.d.ts +2 -0
  109. package/dist/internal.d.ts.map +1 -1
  110. package/dist/internal.mjs +2 -0
  111. package/dist/light-buffer-layout.d.ts +20 -12
  112. package/dist/light-buffer-layout.d.ts.map +1 -1
  113. package/dist/materials.d.ts +22 -0
  114. package/dist/materials.d.ts.map +1 -1
  115. package/dist/pbr-pipeline.d.ts +16 -9
  116. package/dist/pbr-pipeline.d.ts.map +1 -1
  117. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  118. package/dist/pipeline/standard-pipeline.d.ts +3 -0
  119. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  120. package/dist/pipeline/standard-post.d.ts +48 -0
  121. package/dist/pipeline/standard-post.d.ts.map +1 -0
  122. package/dist/pipeline/standard-profile.d.ts +12 -2
  123. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  124. package/dist/pipeline-builder.d.ts +18 -0
  125. package/dist/pipeline-builder.d.ts.map +1 -1
  126. package/dist/pipeline-spec.d.ts.map +1 -1
  127. package/dist/plugin.d.ts.map +1 -1
  128. package/dist/record/frame-lighting.d.ts +2 -0
  129. package/dist/record/frame-lighting.d.ts.map +1 -1
  130. package/dist/record/frame-snapshot.d.ts +137 -6
  131. package/dist/record/frame-snapshot.d.ts.map +1 -1
  132. package/dist/record/frame-targets.d.ts.map +1 -1
  133. package/dist/record/frame.d.ts +6 -3
  134. package/dist/record/frame.d.ts.map +1 -1
  135. package/dist/record/gpu-timing.d.ts +32 -0
  136. package/dist/record/gpu-timing.d.ts.map +1 -0
  137. package/dist/record/main-pass-geometry.d.ts +11 -0
  138. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  139. package/dist/record/main-pass-material.d.ts +9 -6
  140. package/dist/record/main-pass-material.d.ts.map +1 -1
  141. package/dist/record/main-pass-sprite-draws.d.ts +8 -1
  142. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  143. package/dist/record/main-pass.d.ts +2 -0
  144. package/dist/record/main-pass.d.ts.map +1 -1
  145. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  146. package/dist/record/render-context.d.ts +81 -19
  147. package/dist/record/render-context.d.ts.map +1 -1
  148. package/dist/record/shadow-pass.d.ts.map +1 -1
  149. package/dist/record/skybox-post-pass.d.ts +1 -11
  150. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  151. package/dist/record/typed-frame-graph.d.ts +36 -4
  152. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  153. package/dist/record/view-ubo.d.ts +4 -1
  154. package/dist/record/view-ubo.d.ts.map +1 -1
  155. package/dist/render-contract.d.ts +157 -8
  156. package/dist/render-contract.d.ts.map +1 -1
  157. package/dist/render-data.d.ts +10 -6
  158. package/dist/render-data.d.ts.map +1 -1
  159. package/dist/render-graph-primitives.d.ts.map +1 -1
  160. package/dist/render-pipeline.d.ts +86 -6
  161. package/dist/render-pipeline.d.ts.map +1 -1
  162. package/dist/render-system-extract.d.ts +84 -8
  163. package/dist/render-system-extract.d.ts.map +1 -1
  164. package/dist/render-system.d.ts +30 -5
  165. package/dist/render-system.d.ts.map +1 -1
  166. package/dist/renderer-inspect.d.ts +29 -0
  167. package/dist/renderer-inspect.d.ts.map +1 -0
  168. package/dist/scene/render-scene.d.ts +36 -2
  169. package/dist/scene/render-scene.d.ts.map +1 -1
  170. package/dist/temporal/coverage.d.ts +42 -0
  171. package/dist/temporal/coverage.d.ts.map +1 -0
  172. package/dist/temporal/frame-coordinator.d.ts +99 -0
  173. package/dist/temporal/frame-coordinator.d.ts.map +1 -0
  174. package/dist/temporal/frame.d.ts +44 -0
  175. package/dist/temporal/frame.d.ts.map +1 -0
  176. package/dist/temporal/gpu.d.ts +39 -0
  177. package/dist/temporal/gpu.d.ts.map +1 -0
  178. package/dist/temporal/history.d.ts +37 -0
  179. package/dist/temporal/history.d.ts.map +1 -0
  180. package/dist/temporal/index.d.ts +7 -0
  181. package/dist/temporal/index.d.ts.map +1 -0
  182. package/dist/temporal/index.mjs +8 -0
  183. package/dist/temporal/index.mjs.map +1 -0
  184. package/dist/temporal/inspection.d.ts +36 -0
  185. package/dist/temporal/inspection.d.ts.map +1 -0
  186. package/dist/temporal/scene-data-catalog.d.ts +48 -0
  187. package/dist/temporal/scene-data-catalog.d.ts.map +1 -0
  188. package/dist/temporal/scene-data.d.ts +43 -0
  189. package/dist/temporal/scene-data.d.ts.map +1 -0
  190. package/dist/temporal/standard-scene-data.d.ts +61 -0
  191. package/dist/temporal/standard-scene-data.d.ts.map +1 -0
  192. package/dist/temporal/taa-history-resources.d.ts +22 -0
  193. package/dist/temporal/taa-history-resources.d.ts.map +1 -0
  194. package/dist/temporal/taa-history-store.d.ts +27 -0
  195. package/dist/temporal/taa-history-store.d.ts.map +1 -0
  196. package/dist/temporal/taa-resolve.d.ts +15 -0
  197. package/dist/temporal/taa-resolve.d.ts.map +1 -0
  198. package/dist/temporal/temporal-view.d.ts +40 -0
  199. package/dist/temporal/temporal-view.d.ts.map +1 -0
  200. package/dist/temporal/transaction.d.ts +9 -0
  201. package/dist/temporal/transaction.d.ts.map +1 -0
  202. package/dist/temporal/view.d.ts +56 -0
  203. package/dist/temporal/view.d.ts.map +1 -0
  204. package/dist/transmission/backdrop.d.ts +147 -0
  205. package/dist/transmission/backdrop.d.ts.map +1 -0
  206. package/dist/transmission/inspection.d.ts +57 -0
  207. package/dist/transmission/inspection.d.ts.map +1 -0
  208. package/dist/transmission/oracle.d.ts +42 -0
  209. package/dist/transmission/oracle.d.ts.map +1 -0
  210. package/dist/transmission/projection.d.ts +37 -0
  211. package/dist/transmission/projection.d.ts.map +1 -0
  212. package/dist/typed-render-graph-primitives.d.ts +30 -2
  213. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  214. package/dist/typed-shadow-atlas.d.ts +10 -0
  215. package/dist/typed-shadow-atlas.d.ts.map +1 -0
  216. package/dist/typed-shadow-passes.d.ts.map +1 -1
  217. package/dist/volume/capability.d.ts +57 -0
  218. package/dist/volume/capability.d.ts.map +1 -0
  219. package/dist/volume/component.d.ts +61 -0
  220. package/dist/volume/component.d.ts.map +1 -0
  221. package/dist/volume/extract.d.ts +11 -0
  222. package/dist/volume/extract.d.ts.map +1 -0
  223. package/dist/volume/inspection.d.ts +38 -0
  224. package/dist/volume/inspection.d.ts.map +1 -0
  225. package/dist/volume/passes.d.ts +38 -0
  226. package/dist/volume/passes.d.ts.map +1 -0
  227. package/dist/volume/recovery.d.ts +38 -0
  228. package/dist/volume/recovery.d.ts.map +1 -0
  229. package/dist/volume/resources.d.ts +57 -0
  230. package/dist/volume/resources.d.ts.map +1 -0
  231. package/dist/volume/temporal.d.ts +35 -0
  232. package/dist/volume/temporal.d.ts.map +1 -0
  233. package/package.json +24 -19
  234. package/src/__tests__/ai-user-cold-start.integration.test.ts +59 -0
  235. package/src/__tests__/ai-user-public-surface.test-d.ts +45 -0
  236. package/src/__tests__/bloom-exact-zero.unit.test.ts +202 -0
  237. package/src/__tests__/bloom-lifecycle.integration.test.ts +125 -0
  238. package/src/__tests__/construct-renderer-identity.unit.test.ts +4 -3
  239. package/src/__tests__/detached-inspection.integration.test.ts +177 -0
  240. package/src/__tests__/environment-fog-lanes.integration.test.ts +219 -0
  241. package/src/__tests__/environment-generation.integration.test.ts +141 -0
  242. package/src/__tests__/environment-selection.unit.test.ts +245 -0
  243. package/src/__tests__/factory-contract.integration.test.ts +1380 -9
  244. package/src/__tests__/frame-plan-contract.unit.test.ts +90 -0
  245. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +7 -0
  246. package/src/__tests__/gpu-driven-production.integration.test.ts +74 -22
  247. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +37 -0
  248. package/src/__tests__/gpu-scene.unit.test.ts +10 -0
  249. package/src/__tests__/injection-kind-owner.test-d.ts +2 -1
  250. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +14 -14
  251. package/src/__tests__/material-contract-inventory.unit.test.ts +62 -0
  252. package/src/__tests__/material-cooked-projection.unit.test.ts +18 -146
  253. package/src/__tests__/materials-transmission-validation.unit.test.ts +36 -0
  254. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +1 -1
  255. package/src/__tests__/morph-feature-plan.unit.test.ts +7 -0
  256. package/src/__tests__/motion-blur.pixel.integration.test.ts +121 -0
  257. package/src/__tests__/public-surface.test-d.ts +15 -1
  258. package/src/__tests__/render-error-code-owner.test-d.ts +14 -0
  259. package/src/__tests__/render-error-detail-ssot.test-d.ts +11 -2
  260. package/src/__tests__/render-error-exhaustive.test-d.ts +3 -0
  261. package/src/__tests__/render-feature-errors.unit.test.ts +33 -3
  262. package/src/__tests__/render-feature-gpu-work.integration.test.ts +44 -0
  263. package/src/__tests__/render-feature-plan.test-d.ts +22 -89
  264. package/src/__tests__/render-scene-projection.unit.test.ts +28 -0
  265. package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +26 -0
  266. package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +21 -0
  267. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +423 -1
  268. package/src/__tests__/renderer-frame-transaction.integration.test.ts +405 -0
  269. package/src/__tests__/renderer-lifecycle.integration.test.ts +22 -0
  270. package/src/__tests__/scene-data-catalog.unit.test.ts +59 -0
  271. package/src/__tests__/scene-data-consumer.integration.test.ts +67 -0
  272. package/src/__tests__/scene-data-contract.test-d.ts +35 -0
  273. package/src/__tests__/scene-data-inspection.unit.test.ts +41 -0
  274. package/src/__tests__/scene-data-public-surface.test-d.ts +34 -0
  275. package/src/__tests__/shader-manifest-fixture.ts +111 -0
  276. package/src/__tests__/skinned-shadow-caster.test.ts +123 -0
  277. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +24 -3
  278. package/src/__tests__/standard-pipeline.dawn.test.ts +15 -0
  279. package/src/__tests__/standard-pipeline.integration.test.ts +543 -1
  280. package/src/__tests__/standard-profile-oracle.unit.test.ts +12 -2
  281. package/src/__tests__/standard-temporal-producer.integration.test.ts +35 -0
  282. package/src/__tests__/surface-configuration.unit.test.ts +211 -12
  283. package/src/__tests__/taa-transaction.integration.test.ts +30 -0
  284. package/src/__tests__/temporal-admission.integration.test.ts +40 -0
  285. package/src/__tests__/temporal-coverage.unit.test.ts +35 -0
  286. package/src/__tests__/temporal-demand.unit.test.ts +44 -0
  287. package/src/__tests__/temporal-frame-coordinator.unit.test.ts +64 -0
  288. package/src/__tests__/temporal-graph-topology.unit.test.ts +51 -0
  289. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +170 -0
  290. package/src/__tests__/temporal-performance.integration.test.ts +615 -0
  291. package/src/__tests__/temporal-reset-matrix.unit.test.ts +97 -0
  292. package/src/__tests__/temporal-transaction.integration.test.ts +60 -0
  293. package/src/__tests__/temporal-view.unit.test.ts +152 -0
  294. package/src/__tests__/transmission-prewarm.unit.test.ts +93 -0
  295. package/src/__tests__/typed-pipeline-topology.unit.test.ts +230 -1
  296. package/src/__tests__/urp-pipeline-targets.unit.test.ts +25 -1
  297. package/src/__tests__/urp-pipeline.unit.test.ts +4 -3
  298. package/src/__tests__/visibility-extract.integration.test.ts +27 -1
  299. package/src/__tests__/visibility-producer-matrix.integration.test.ts +10 -0
  300. package/src/__tests__/volume-optics-oracle.unit.test.ts +85 -0
  301. package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +655 -0
  302. package/src/__tests__/volumetric-fog-component.unit.test.ts +71 -0
  303. package/src/__tests__/volumetric-fog-composite-stage-readback.dawn.test.ts +376 -0
  304. package/src/__tests__/volumetric-fog-errors.unit.test.ts +51 -0
  305. package/src/__tests__/volumetric-fog-inspection.unit.test.ts +77 -0
  306. package/src/__tests__/volumetric-fog-light-capability.unit.test.ts +19 -0
  307. package/src/__tests__/volumetric-fog-light-consumers.integration.test.ts +18 -0
  308. package/src/__tests__/volumetric-fog-light-errors.unit.test.ts +17 -0
  309. package/src/__tests__/volumetric-fog-light-topology.unit.test.ts +21 -0
  310. package/src/__tests__/volumetric-fog-light-transaction.integration.test.ts +53 -0
  311. package/src/__tests__/volumetric-fog-m9-watcher.integration.test.ts +27 -0
  312. package/src/__tests__/volumetric-fog-point-light-owner.integration.test.ts +44 -0
  313. package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +49 -0
  314. package/src/__tests__/volumetric-fog-point-spot-contract.unit.test.ts +28 -0
  315. package/src/__tests__/volumetric-fog-point-spot-lkg.integration.test.ts +65 -0
  316. package/src/__tests__/volumetric-fog-point-spot-selection.integration.test.ts +49 -0
  317. package/src/__tests__/volumetric-fog-point-spot-temporal.unit.test.ts +55 -0
  318. package/src/__tests__/volumetric-fog-projector-contract.unit.test.ts +22 -0
  319. package/src/__tests__/volumetric-fog-projector-inspection.unit.test.ts +12 -0
  320. package/src/__tests__/volumetric-fog-projector-surface-volume.integration.test.ts +11 -0
  321. package/src/__tests__/volumetric-fog-projector-transaction.integration.test.ts +26 -0
  322. package/src/__tests__/volumetric-fog-recovery.integration.test.ts +47 -0
  323. package/src/__tests__/volumetric-fog-selected-light-resolution.integration.test.ts +63 -0
  324. package/src/__tests__/volumetric-fog-spot-closure.integration.test.ts +26 -0
  325. package/src/__tests__/volumetric-fog-spot-contract.test-d.ts +21 -0
  326. package/src/__tests__/volumetric-fog-spot-contract.unit.test.ts +27 -0
  327. package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +14 -0
  328. package/src/__tests__/volumetric-fog-spot-optics.integration.test.ts +29 -0
  329. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +550 -0
  330. package/src/__tests__/volumetric-fog-temporal-selected-light.unit.test.ts +33 -0
  331. package/src/__tests__/volumetric-fog-temporal.unit.test.ts +45 -0
  332. package/src/__tests__/volumetric-fog-topology.unit.test.ts +237 -0
  333. package/src/__tests__/volumetric-fog-transparent.integration.test.ts +27 -0
  334. package/src/assembly/backend-contract.ts +47 -1
  335. package/src/assembly/factory.ts +1480 -505
  336. package/src/assembly/host-contract.ts +4 -0
  337. package/src/assembly/renderer-frame-transaction.ts +75 -0
  338. package/src/assembly/renderer-inspection.ts +112 -0
  339. package/src/assembly/renderer-lifecycle.ts +6 -0
  340. package/src/components/__tests__/motion-blur.unit.test.ts +14 -0
  341. package/src/components/__tests__/schema-contract.unit.test.ts +6 -1
  342. package/src/components/atmosphere.ts +10 -0
  343. package/src/components/camera.ts +2 -1
  344. package/src/components/fog.ts +9 -0
  345. package/src/components/index.ts +3 -0
  346. package/src/components/light-helpers.ts +4 -0
  347. package/src/components/motion-blur.ts +8 -0
  348. package/src/components/spot-light.ts +22 -3
  349. package/src/construct-renderer.ts +40 -3
  350. package/src/device/device-scope.ts +15 -1
  351. package/src/device/gpu-residency.ts +168 -58
  352. package/src/environment/frame.ts +185 -0
  353. package/src/environment/generation.ts +23 -0
  354. package/src/environment/graph.ts +9 -0
  355. package/src/environment/inspection.ts +87 -0
  356. package/src/environment/lifecycle.ts +250 -0
  357. package/src/environment/signature.ts +55 -0
  358. package/src/errors/render.ts +404 -1
  359. package/src/extract/camera.ts +78 -0
  360. package/src/extract/environment.ts +171 -0
  361. package/src/extract/visibility.ts +38 -19
  362. package/src/features/host.ts +36 -5
  363. package/src/features/motion-blur/__tests__/motion-blur-feature.unit.test.ts +67 -0
  364. package/src/features/motion-blur/__tests__/motion-blur-params.unit.test.ts +53 -0
  365. package/src/features/motion-blur/motion-blur-feature.ts +119 -0
  366. package/src/features/motion-blur/motion-blur-params.ts +89 -0
  367. package/src/features/plan.ts +32 -3
  368. package/src/features/prepared-gpu-work.ts +21 -6
  369. package/src/features/prepared-graphics.ts +2 -1
  370. package/src/features/render-graph-raster.ts +2 -1
  371. package/src/features/targets.ts +24 -2
  372. package/src/features/types.ts +13 -0
  373. package/src/fullscreen-post-process-pass.ts +34 -4
  374. package/src/gpu-scene.ts +24 -0
  375. package/src/gpu-usage.ts +2 -0
  376. package/src/ibl/skylight-bind-group.ts +30 -38
  377. package/src/index.ts +104 -7
  378. package/src/inspection-types.ts +48 -0
  379. package/src/internal.ts +5 -0
  380. package/src/light-buffer-layout.ts +59 -26
  381. package/src/materials.ts +119 -24
  382. package/src/pbr-pipeline.ts +91 -29
  383. package/src/pipeline/standard-forward-lane.ts +178 -101
  384. package/src/pipeline/standard-pipeline.ts +176 -105
  385. package/src/pipeline/standard-post.ts +373 -0
  386. package/src/pipeline/standard-profile.ts +26 -3
  387. package/src/pipeline-builder.ts +102 -12
  388. package/src/pipeline-spec.ts +9 -0
  389. package/src/plugin.ts +2 -0
  390. package/src/record/__tests__/fullscreen-temporal-routing.unit.test.ts +25 -0
  391. package/src/record/__tests__/main-pass-geometry.unit.test.ts +47 -0
  392. package/src/record/__tests__/material-bg-cache.unit.test.ts +12 -1
  393. package/src/record/__tests__/material-pipeline-pending-cache.unit.test.ts +22 -0
  394. package/src/record/__tests__/sprite-material-abi.unit.test.ts +75 -0
  395. package/src/record/__tests__/standard-pbr-ubo-layout.unit.test.ts +67 -0
  396. package/src/record/__tests__/temporal-payload.unit.test.ts +164 -0
  397. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +127 -0
  398. package/src/record/frame-lighting.ts +103 -89
  399. package/src/record/frame-snapshot.ts +170 -6
  400. package/src/record/frame-targets.ts +21 -8
  401. package/src/record/frame.ts +1014 -7
  402. package/src/record/gpu-timing.ts +224 -0
  403. package/src/record/main-pass-geometry.ts +86 -40
  404. package/src/record/main-pass-material.ts +120 -68
  405. package/src/record/main-pass-sprite-draws.ts +78 -101
  406. package/src/record/main-pass.ts +77 -4
  407. package/src/record/mesh-ssbo.ts +22 -3
  408. package/src/record/render-context.ts +194 -23
  409. package/src/record/shadow-pass.ts +197 -58
  410. package/src/record/skybox-post-pass.ts +97 -41
  411. package/src/record/typed-frame-graph.ts +704 -30
  412. package/src/record/view-ubo.ts +52 -4
  413. package/src/render-contract.ts +181 -6
  414. package/src/render-data.ts +50 -22
  415. package/src/render-graph-primitives.ts +18 -1
  416. package/src/render-pipeline.ts +144 -27
  417. package/src/render-system-extract.ts +522 -72
  418. package/src/render-system.ts +561 -41
  419. package/src/renderer-inspect.ts +66 -0
  420. package/src/scene/render-scene.ts +252 -7
  421. package/src/temporal/__tests__/taa-history-resources.unit.test.ts +45 -0
  422. package/src/temporal/coverage.ts +76 -0
  423. package/src/temporal/frame-coordinator.ts +311 -0
  424. package/src/temporal/frame.ts +128 -0
  425. package/src/temporal/gpu.ts +287 -0
  426. package/src/temporal/history.ts +92 -0
  427. package/src/temporal/index.ts +6 -0
  428. package/src/temporal/inspection.ts +97 -0
  429. package/src/temporal/scene-data-catalog.ts +200 -0
  430. package/src/temporal/scene-data.ts +149 -0
  431. package/src/temporal/standard-scene-data.ts +182 -0
  432. package/src/temporal/taa-history-resources.ts +128 -0
  433. package/src/temporal/taa-history-store.ts +79 -0
  434. package/src/temporal/taa-resolve.ts +34 -0
  435. package/src/temporal/temporal-view.ts +169 -0
  436. package/src/temporal/transaction.ts +17 -0
  437. package/src/temporal/view.ts +161 -0
  438. package/src/transmission/__tests__/capability.unit.test.ts +83 -0
  439. package/src/transmission/__tests__/composition.integration.test.ts +161 -0
  440. package/src/transmission/__tests__/inspection.unit.test.ts +241 -0
  441. package/src/transmission/__tests__/lifecycle.integration.test.ts +96 -0
  442. package/src/transmission/__tests__/oracle.unit.test.ts +131 -0
  443. package/src/transmission/__tests__/projection.unit.test.ts +71 -0
  444. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +437 -0
  445. package/src/transmission/__tests__/transmission-backdrop-topology.unit.test.ts +109 -0
  446. package/src/transmission/__tests__/transmission-backdrop.dawn.test.ts +105 -0
  447. package/src/transmission/backdrop.ts +572 -0
  448. package/src/transmission/inspection.ts +190 -0
  449. package/src/transmission/oracle.ts +141 -0
  450. package/src/transmission/projection.ts +83 -0
  451. package/src/typed-render-graph-primitives.ts +194 -11
  452. package/src/typed-shadow-atlas.ts +17 -0
  453. package/src/typed-shadow-passes.ts +6 -5
  454. package/src/volume/capability.ts +173 -0
  455. package/src/volume/component.ts +110 -0
  456. package/src/volume/extract.ts +21 -0
  457. package/src/volume/inspection.ts +78 -0
  458. package/src/volume/passes.ts +680 -0
  459. package/src/volume/recovery.ts +86 -0
  460. package/src/volume/resources.ts +236 -0
  461. package/src/volume/temporal.ts +89 -0
  462. package/dist/__tests__/authoring-path.unit.test.d.ts +0 -2
  463. package/dist/__tests__/authoring-path.unit.test.d.ts.map +0 -1
  464. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts +0 -2
  465. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts.map +0 -1
  466. package/dist/__tests__/callback-inference.test-d.d.ts +0 -2
  467. package/dist/__tests__/callback-inference.test-d.d.ts.map +0 -1
  468. package/dist/__tests__/cluster-binner.test.d.ts +0 -2
  469. package/dist/__tests__/cluster-binner.test.d.ts.map +0 -1
  470. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts +0 -2
  471. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts.map +0 -1
  472. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts +0 -2
  473. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts.map +0 -1
  474. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +0 -2
  475. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +0 -1
  476. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +0 -2
  477. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +0 -1
  478. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts +0 -2
  479. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts.map +0 -1
  480. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts +0 -2
  481. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts.map +0 -1
  482. package/dist/__tests__/factory-contract.integration.test.d.ts +0 -2
  483. package/dist/__tests__/factory-contract.integration.test.d.ts.map +0 -1
  484. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts +0 -2
  485. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts.map +0 -1
  486. package/dist/__tests__/frame-observation.contract.test.d.ts +0 -2
  487. package/dist/__tests__/frame-observation.contract.test.d.ts.map +0 -1
  488. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +0 -2
  489. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +0 -1
  490. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts +0 -2
  491. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts.map +0 -1
  492. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts +0 -6
  493. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +0 -1
  494. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts +0 -2
  495. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts.map +0 -1
  496. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts +0 -2
  497. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts.map +0 -1
  498. package/dist/__tests__/gpu-driven-production.integration.test.d.ts +0 -2
  499. package/dist/__tests__/gpu-driven-production.integration.test.d.ts.map +0 -1
  500. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts +0 -2
  501. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts.map +0 -1
  502. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +0 -18
  503. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +0 -1
  504. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts +0 -2
  505. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts.map +0 -1
  506. package/dist/__tests__/gpu-driven-view-reference.d.ts +0 -15
  507. package/dist/__tests__/gpu-driven-view-reference.d.ts.map +0 -1
  508. package/dist/__tests__/gpu-driven-view.browser.test.d.ts +0 -2
  509. package/dist/__tests__/gpu-driven-view.browser.test.d.ts.map +0 -1
  510. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts +0 -2
  511. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts.map +0 -1
  512. package/dist/__tests__/gpu-driven-view.unit.test.d.ts +0 -2
  513. package/dist/__tests__/gpu-driven-view.unit.test.d.ts.map +0 -1
  514. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts +0 -2
  515. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts.map +0 -1
  516. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts +0 -7
  517. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +0 -1
  518. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts +0 -2
  519. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts.map +0 -1
  520. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts +0 -2
  521. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts.map +0 -1
  522. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts +0 -2
  523. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts.map +0 -1
  524. package/dist/__tests__/gpu-scene.dawn.test.d.ts +0 -2
  525. package/dist/__tests__/gpu-scene.dawn.test.d.ts.map +0 -1
  526. package/dist/__tests__/gpu-scene.unit.test.d.ts +0 -2
  527. package/dist/__tests__/gpu-scene.unit.test.d.ts.map +0 -1
  528. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +0 -2
  529. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +0 -1
  530. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts +0 -2
  531. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts.map +0 -1
  532. package/dist/__tests__/injection-kind-owner.test-d.d.ts +0 -2
  533. package/dist/__tests__/injection-kind-owner.test-d.d.ts.map +0 -1
  534. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts +0 -2
  535. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts.map +0 -1
  536. package/dist/__tests__/light-buffer-layout.unit.test.d.ts +0 -2
  537. package/dist/__tests__/light-buffer-layout.unit.test.d.ts.map +0 -1
  538. package/dist/__tests__/material-contract-inventory.unit.test.d.ts +0 -2
  539. package/dist/__tests__/material-contract-inventory.unit.test.d.ts.map +0 -1
  540. package/dist/__tests__/material-cooked-projection.unit.test.d.ts +0 -2
  541. package/dist/__tests__/material-cooked-projection.unit.test.d.ts.map +0 -1
  542. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts +0 -2
  543. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts.map +0 -1
  544. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts +0 -2
  545. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts.map +0 -1
  546. package/dist/__tests__/material-stride-surface.unit.test.d.ts +0 -2
  547. package/dist/__tests__/material-stride-surface.unit.test.d.ts.map +0 -1
  548. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts +0 -2
  549. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts.map +0 -1
  550. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts +0 -2
  551. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts.map +0 -1
  552. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts +0 -2
  553. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts.map +0 -1
  554. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts +0 -2
  555. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts.map +0 -1
  556. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts +0 -2
  557. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts.map +0 -1
  558. package/dist/__tests__/morph-feature-plan.unit.test.d.ts +0 -2
  559. package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +0 -1
  560. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts +0 -2
  561. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts.map +0 -1
  562. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts +0 -2
  563. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts.map +0 -1
  564. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts +0 -2
  565. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts.map +0 -1
  566. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts +0 -2
  567. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts.map +0 -1
  568. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts +0 -2
  569. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts.map +0 -1
  570. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts +0 -2
  571. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts.map +0 -1
  572. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts +0 -2
  573. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts.map +0 -1
  574. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts +0 -2
  575. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts.map +0 -1
  576. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts +0 -2
  577. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts.map +0 -1
  578. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts +0 -2
  579. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts.map +0 -1
  580. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts +0 -2
  581. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts.map +0 -1
  582. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts +0 -2
  583. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts.map +0 -1
  584. package/dist/__tests__/profiler-default-off.test.d.ts +0 -2
  585. package/dist/__tests__/profiler-default-off.test.d.ts.map +0 -1
  586. package/dist/__tests__/profiler-phase-catalog.test.d.ts +0 -2
  587. package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +0 -1
  588. package/dist/__tests__/profiler-phase-integration.test.d.ts +0 -2
  589. package/dist/__tests__/profiler-phase-integration.test.d.ts.map +0 -1
  590. package/dist/__tests__/profiler-phase-token.test.d.ts +0 -2
  591. package/dist/__tests__/profiler-phase-token.test.d.ts.map +0 -1
  592. package/dist/__tests__/public-surface.test-d.d.ts +0 -2
  593. package/dist/__tests__/public-surface.test-d.d.ts.map +0 -1
  594. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts +0 -2
  595. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts.map +0 -1
  596. package/dist/__tests__/render-error-code-owner.test-d.d.ts +0 -2
  597. package/dist/__tests__/render-error-code-owner.test-d.d.ts.map +0 -1
  598. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts +0 -2
  599. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts.map +0 -1
  600. package/dist/__tests__/render-error-exhaustive.test-d.d.ts +0 -2
  601. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +0 -1
  602. package/dist/__tests__/render-feature-assembly.test-d.d.ts +0 -2
  603. package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +0 -1
  604. package/dist/__tests__/render-feature-context.test-d.d.ts +0 -2
  605. package/dist/__tests__/render-feature-context.test-d.d.ts.map +0 -1
  606. package/dist/__tests__/render-feature-contract.test-d.d.ts +0 -2
  607. package/dist/__tests__/render-feature-contract.test-d.d.ts.map +0 -1
  608. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts +0 -2
  609. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts.map +0 -1
  610. package/dist/__tests__/render-feature-docs.unit.test.d.ts +0 -2
  611. package/dist/__tests__/render-feature-docs.unit.test.d.ts.map +0 -1
  612. package/dist/__tests__/render-feature-errors.unit.test.d.ts +0 -2
  613. package/dist/__tests__/render-feature-errors.unit.test.d.ts.map +0 -1
  614. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts +0 -2
  615. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts.map +0 -1
  616. package/dist/__tests__/render-feature-plan.test-d.d.ts +0 -2
  617. package/dist/__tests__/render-feature-plan.test-d.d.ts.map +0 -1
  618. package/dist/__tests__/render-feature-plan.unit.test.d.ts +0 -2
  619. package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +0 -1
  620. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts +0 -2
  621. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts.map +0 -1
  622. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts +0 -2
  623. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts.map +0 -1
  624. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +0 -2
  625. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +0 -1
  626. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts +0 -2
  627. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts.map +0 -1
  628. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts +0 -2
  629. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts.map +0 -1
  630. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts +0 -2
  631. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts.map +0 -1
  632. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts +0 -2
  633. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts.map +0 -1
  634. package/dist/__tests__/render-feature-public-surface.test-d.d.ts +0 -2
  635. package/dist/__tests__/render-feature-public-surface.test-d.d.ts.map +0 -1
  636. package/dist/__tests__/render-feature-retry.unit.test.d.ts +0 -2
  637. package/dist/__tests__/render-feature-retry.unit.test.d.ts.map +0 -1
  638. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts +0 -2
  639. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts.map +0 -1
  640. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts +0 -2
  641. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts.map +0 -1
  642. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts +0 -2
  643. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts.map +0 -1
  644. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts +0 -2
  645. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts.map +0 -1
  646. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts +0 -2
  647. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts.map +0 -1
  648. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts +0 -2
  649. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts.map +0 -1
  650. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts +0 -7
  651. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts.map +0 -1
  652. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts +0 -2
  653. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts.map +0 -1
  654. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts +0 -2
  655. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts.map +0 -1
  656. package/dist/__tests__/render-graph-hzb-gpu.d.ts +0 -7
  657. package/dist/__tests__/render-graph-hzb-gpu.d.ts.map +0 -1
  658. package/dist/__tests__/render-graph-hzb.browser.test.d.ts +0 -2
  659. package/dist/__tests__/render-graph-hzb.browser.test.d.ts.map +0 -1
  660. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts +0 -2
  661. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts.map +0 -1
  662. package/dist/__tests__/render-graph-primitives.unit.test.d.ts +0 -2
  663. package/dist/__tests__/render-graph-primitives.unit.test.d.ts.map +0 -1
  664. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts +0 -12
  665. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts.map +0 -1
  666. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts +0 -2
  667. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts.map +0 -1
  668. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts +0 -2
  669. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts.map +0 -1
  670. package/dist/__tests__/render-scene-projection.unit.test.d.ts +0 -2
  671. package/dist/__tests__/render-scene-projection.unit.test.d.ts.map +0 -1
  672. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts +0 -2
  673. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts.map +0 -1
  674. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +0 -2
  675. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +0 -1
  676. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts +0 -2
  677. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts.map +0 -1
  678. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts +0 -2
  679. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts.map +0 -1
  680. package/dist/__tests__/shader-stage-surface.unit.test.d.ts +0 -2
  681. package/dist/__tests__/shader-stage-surface.unit.test.d.ts.map +0 -1
  682. package/dist/__tests__/ssao-config.unit.test.d.ts +0 -2
  683. package/dist/__tests__/ssao-config.unit.test.d.ts.map +0 -1
  684. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts +0 -2
  685. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts.map +0 -1
  686. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +0 -2
  687. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +0 -1
  688. package/dist/__tests__/standard-descriptors.test-d.d.ts +0 -2
  689. package/dist/__tests__/standard-descriptors.test-d.d.ts.map +0 -1
  690. package/dist/__tests__/standard-pipeline.dawn.test.d.ts +0 -2
  691. package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +0 -1
  692. package/dist/__tests__/standard-pipeline.integration.test.d.ts +0 -2
  693. package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +0 -1
  694. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +0 -2
  695. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +0 -1
  696. package/dist/__tests__/surface-configuration.unit.test.d.ts +0 -2
  697. package/dist/__tests__/surface-configuration.unit.test.d.ts.map +0 -1
  698. package/dist/__tests__/texture-usage-surface.unit.test.d.ts +0 -2
  699. package/dist/__tests__/texture-usage-surface.unit.test.d.ts.map +0 -1
  700. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts +0 -2
  701. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts.map +0 -1
  702. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts +0 -2
  703. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts.map +0 -1
  704. package/dist/__tests__/urp-pipeline.unit.test.d.ts +0 -2
  705. package/dist/__tests__/urp-pipeline.unit.test.d.ts.map +0 -1
  706. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts +0 -2
  707. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts.map +0 -1
  708. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts +0 -2
  709. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts.map +0 -1
  710. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts +0 -2
  711. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts.map +0 -1
  712. package/dist/__tests__/visibility-extract.integration.test.d.ts +0 -2
  713. package/dist/__tests__/visibility-extract.integration.test.d.ts.map +0 -1
  714. package/dist/__tests__/visibility-extract.perf.test.d.ts +0 -2
  715. package/dist/__tests__/visibility-extract.perf.test.d.ts.map +0 -1
  716. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts +0 -2
  717. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts.map +0 -1
  718. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts +0 -2
  719. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts.map +0 -1
  720. package/dist/__tests__/visibility-instances.integration.test.d.ts +0 -2
  721. package/dist/__tests__/visibility-instances.integration.test.d.ts.map +0 -1
  722. package/dist/__tests__/visibility-multi-world.integration.test.d.ts +0 -2
  723. package/dist/__tests__/visibility-multi-world.integration.test.d.ts.map +0 -1
  724. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts +0 -2
  725. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts.map +0 -1
  726. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts +0 -2
  727. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts.map +0 -1
  728. package/dist/__tests__/visibility-public-surface.test-d.d.ts +0 -2
  729. package/dist/__tests__/visibility-public-surface.test-d.d.ts.map +0 -1
  730. package/dist/__tests__/visibility-resolver.unit.test.d.ts +0 -2
  731. package/dist/__tests__/visibility-resolver.unit.test.d.ts.map +0 -1
  732. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +0 -2
  733. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +0 -1
  734. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts +0 -2
  735. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts.map +0 -1
  736. package/dist/__tests__/vocabulary.unit.test.d.ts +0 -2
  737. package/dist/__tests__/vocabulary.unit.test.d.ts.map +0 -1
  738. package/dist/chunk-CQXZC5XI.mjs.map +0 -1
  739. package/dist/chunk-HCOGPHKS.mjs +0 -93
  740. package/dist/chunk-HCOGPHKS.mjs.map +0 -1
  741. package/dist/chunk-YEJIUW7D.mjs.map +0 -1
  742. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts +0 -2
  743. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts.map +0 -1
  744. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts +0 -2
  745. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts.map +0 -1
  746. package/dist/components/__tests__/schema-contract.unit.test.d.ts +0 -2
  747. package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +0 -1
  748. package/dist/components/__tests__/schema-parity.unit.test.d.ts +0 -2
  749. package/dist/components/__tests__/schema-parity.unit.test.d.ts.map +0 -1
  750. package/dist/components/__tests__/visibility-schema.unit.test.d.ts +0 -2
  751. package/dist/components/__tests__/visibility-schema.unit.test.d.ts.map +0 -1
  752. package/dist/points-lines/__tests__/bounds.unit.test.d.ts +0 -2
  753. package/dist/points-lines/__tests__/bounds.unit.test.d.ts.map +0 -1
  754. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts +0 -2
  755. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts.map +0 -1
  756. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts +0 -2
  757. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts.map +0 -1
  758. package/dist/points-lines/__tests__/inspection.unit.test.d.ts +0 -2
  759. package/dist/points-lines/__tests__/inspection.unit.test.d.ts.map +0 -1
  760. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts +0 -2
  761. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts.map +0 -1
  762. package/dist/points-lines/__tests__/points-lines.bench.d.ts +0 -2
  763. package/dist/points-lines/__tests__/points-lines.bench.d.ts.map +0 -1
  764. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts +0 -2
  765. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts.map +0 -1
  766. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts +0 -2
  767. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts.map +0 -1
  768. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts +0 -2
  769. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts.map +0 -1
  770. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts +0 -2
  771. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts.map +0 -1
  772. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts +0 -2
  773. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts.map +0 -1
  774. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +0 -2
  775. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +0 -1
  776. package/dist/record/__tests__/video-texture-view.unit.test.d.ts +0 -2
  777. package/dist/record/__tests__/video-texture-view.unit.test.d.ts.map +0 -1
@@ -0,0 +1,66 @@
1
+ import type { TextureFormat } from '@forgeax/engine-rhi';
2
+ import type { TemporalFrame, TemporalResetReason } from './temporal/frame';
3
+
4
+ export type TemporalInspectionStatus =
5
+ | 'authored-off'
6
+ | 'available'
7
+ | 'capability-unavailable'
8
+ | 'temporal-degraded';
9
+
10
+ export interface TemporalInspection {
11
+ readonly status: TemporalInspectionStatus;
12
+ readonly resetReason: TemporalResetReason;
13
+ readonly historyEpoch: number;
14
+ readonly deviceEpoch: number;
15
+ readonly backend: string | undefined;
16
+ readonly format: TextureFormat | undefined;
17
+ readonly limits: Readonly<{
18
+ readonly maxTextureDimension2D?: number;
19
+ readonly maxTextureDimension3D?: number;
20
+ readonly maxTextureArrayLayers?: number;
21
+ }>;
22
+ readonly compute: 'available' | 'unavailable';
23
+ readonly storage: 'available' | 'unavailable';
24
+ }
25
+
26
+ export interface TemporalInspectionInput {
27
+ readonly authored: boolean;
28
+ readonly capability: 'available' | 'unavailable';
29
+ readonly degraded?: boolean;
30
+ readonly frame?: TemporalFrame;
31
+ readonly backend?: string;
32
+ readonly format?: TextureFormat;
33
+ readonly limits?: Readonly<Record<string, number>>;
34
+ }
35
+
36
+ export function inspectTemporalFrame(input: TemporalInspectionInput): TemporalInspection {
37
+ const frame = input.frame;
38
+ const status: TemporalInspectionStatus = !input.authored
39
+ ? 'authored-off'
40
+ : input.capability === 'unavailable'
41
+ ? 'capability-unavailable'
42
+ : input.degraded === true
43
+ ? 'temporal-degraded'
44
+ : 'available';
45
+ return Object.freeze({
46
+ status,
47
+ resetReason: frame?.resetReason ?? 'none',
48
+ historyEpoch: frame?.historyEpoch ?? 0,
49
+ deviceEpoch: frame?.deviceEpoch ?? 0,
50
+ backend: input.backend,
51
+ format: input.format,
52
+ limits: Object.freeze({
53
+ ...(typeof input.limits?.maxTextureDimension2D === 'number'
54
+ ? { maxTextureDimension2D: input.limits.maxTextureDimension2D }
55
+ : {}),
56
+ ...(typeof input.limits?.maxTextureDimension3D === 'number'
57
+ ? { maxTextureDimension3D: input.limits.maxTextureDimension3D }
58
+ : {}),
59
+ ...(typeof input.limits?.maxTextureArrayLayers === 'number'
60
+ ? { maxTextureArrayLayers: input.limits.maxTextureArrayLayers }
61
+ : {}),
62
+ }),
63
+ compute: input.capability === 'available' ? 'available' : 'unavailable',
64
+ storage: input.capability === 'available' ? 'available' : 'unavailable',
65
+ });
66
+ }
@@ -2,9 +2,10 @@ import type { EntityHandle, World } from '@forgeax/engine-ecs';
2
2
  import { componentId } from '@forgeax/engine-ecs/internal';
3
3
  import type { RenderReadLease } from '@forgeax/engine-ecs/projection';
4
4
  import { box3, frustum, mat4 } from '@forgeax/engine-math';
5
- import type { RhiDevice, RhiError } from '@forgeax/engine-rhi';
5
+ import { type RhiDevice, RhiError } from '@forgeax/engine-rhi';
6
6
  import { ChildOf, Transform } from '@forgeax/engine-scene';
7
7
  import { Skin } from '@forgeax/engine-skinning';
8
+ import { err, ok, type Result } from '@forgeax/engine-types';
8
9
  import {
9
10
  Camera,
10
11
  DirectionalLight,
@@ -35,9 +36,18 @@ import type { CameraSnapshot } from '../render-contract';
35
36
  import type {
36
37
  DispatchEntry,
37
38
  ExtractedFrame,
39
+ MaterialSnapshot,
38
40
  MaterialSnapshotCachesByWorld,
41
+ RenderableReactiveReason,
39
42
  RenderableSnapshot,
43
+ RenderableTemporalSnapshot,
40
44
  } from '../render-system-extract';
45
+ import {
46
+ PersistentTransmissionDemandProjection,
47
+ type TransmissionDemand,
48
+ type TransmissionDemandOperation,
49
+ } from '../transmission/projection';
50
+ import { VolumetricFog } from '../volume/component';
41
51
  import type {
42
52
  RenderSceneApplyResult,
43
53
  RenderSceneBounds,
@@ -69,13 +79,63 @@ interface PendingIdentity {
69
79
  removed: boolean;
70
80
  }
71
81
 
82
+ export interface RenderSceneSubmissionCapture {
83
+ readonly revision: number;
84
+ readonly slots: readonly {
85
+ readonly slot: number;
86
+ readonly current: RenderSceneSlot | undefined;
87
+ }[];
88
+ readonly visible: ReadonlySet<string>;
89
+ }
90
+
91
+ export interface RenderSceneSubmissionDelta {
92
+ readonly epoch: number;
93
+ readonly slots: readonly number[];
94
+ }
95
+
72
96
  function identityKey(worldId: number, entityKey: number): string {
73
97
  return `${worldId}:${entityKey}`;
74
98
  }
75
99
 
100
+ const STANDARD_TRANSMISSION_SHADER = 'forgeax::default-standard-pbr';
101
+
102
+ function transmissionValue(material: MaterialSnapshot): number {
103
+ const value = material.paramSnapshot?.transmission;
104
+ return typeof value === 'number' ? value : 0;
105
+ }
106
+
107
+ function transmissionRoughness(material: MaterialSnapshot): number {
108
+ const value = material.paramSnapshot?.roughness;
109
+ return typeof value === 'number' ? value : material.roughness;
110
+ }
111
+
112
+ function transmissionDemandOperations(
113
+ renderables: readonly RenderableSnapshot[],
114
+ ): readonly TransmissionDemandOperation[] {
115
+ const operations: TransmissionDemandOperation[] = [];
116
+ for (const renderable of renderables) {
117
+ for (const [materialIndex, material] of renderable.materials.entries()) {
118
+ operations.push({
119
+ kind: 'upsert',
120
+ key: `${renderable.worldId}:${renderable.entityKey}:${materialIndex}`,
121
+ candidate: {
122
+ attached: true,
123
+ ready:
124
+ material.materialShaderId === STANDARD_TRANSMISSION_SHADER &&
125
+ material.paramSnapshot !== undefined,
126
+ transmission: transmissionValue(material),
127
+ roughness: transmissionRoughness(material),
128
+ },
129
+ });
130
+ }
131
+ }
132
+ return operations;
133
+ }
134
+
76
135
  function ownSnapshot(snapshot: RenderableSnapshot): RenderableSnapshot {
136
+ const { temporal: _temporal, ...current } = snapshot;
77
137
  return {
78
- ...snapshot,
138
+ ...current,
79
139
  transform: { ...snapshot.transform, world: new Float32Array(snapshot.transform.world) },
80
140
  ...(snapshot.localAabb === undefined
81
141
  ? {}
@@ -169,10 +229,14 @@ function worldBounds(snapshot: RenderableSnapshot): RenderSceneBounds | undefine
169
229
  */
170
230
  export class RenderScene {
171
231
  private readonly slots: Array<RenderSceneSlot | undefined> = [];
232
+ private readonly lastSubmittedSlots: Array<RenderSceneSlot | undefined> = [];
172
233
  private readonly generations: number[] = [];
173
234
  private readonly freeSlots: number[] = [];
174
235
  private readonly slotsByWorld = new Map<number, Map<number, number>>();
175
236
  private readonly slotsByMaterial = new Map<number, Set<number>>();
237
+ private readonly dirtySinceSubmitted = new Set<number>();
238
+ private lastSubmittedVisible = new Set<string>();
239
+ private submittedEpoch = 0;
176
240
  // World bounds are a pure projection of each immutable snapshot. Cache the
177
241
  // derived value by snapshot identity so repeated view queries do not redo
178
242
  // the eight-corner transform for every view in the same frame.
@@ -188,6 +252,11 @@ export class RenderScene {
188
252
  private resyncs = 0;
189
253
  private lastResyncReason: RenderSceneResyncReason | undefined;
190
254
 
255
+ /** Bounded current-scene facts for the Standard temporal producer. */
256
+ temporalContributorCount(): number {
257
+ return this.orderedSlots.length;
258
+ }
259
+
191
260
  apply(operations: readonly RenderSceneOperation[]): RenderSceneApplyResult {
192
261
  if (operations.length === 0) {
193
262
  this.noChangeFrames += 1;
@@ -253,19 +322,25 @@ export class RenderScene {
253
322
  for (const pending of pendingOrder) {
254
323
  if (pending.initial === undefined) {
255
324
  if (pending.current === undefined) continue;
256
- createdSlots.push(this.allocate(pending.current));
325
+ const createdSlot = this.allocate(pending.current);
326
+ this.dirtySinceSubmitted.add(createdSlot.slot);
327
+ createdSlots.push(createdSlot);
257
328
  created += 1;
258
329
  continue;
259
330
  }
260
331
  if (pending.current === undefined) {
332
+ this.dirtySinceSubmitted.add(pending.initial.slot);
261
333
  this.release(pending.initial);
262
334
  removedSlots.push(pending.initial);
263
335
  removed += 1;
264
336
  continue;
265
337
  }
266
338
  if (pending.removed) {
339
+ this.dirtySinceSubmitted.add(pending.initial.slot);
267
340
  this.release(pending.initial);
268
- recreatedSlots.push(this.allocate(pending.current));
341
+ const recreatedSlot = this.allocate(pending.current);
342
+ this.dirtySinceSubmitted.add(recreatedSlot.slot);
343
+ recreatedSlots.push(recreatedSlot);
269
344
  recreated += 1;
270
345
  continue;
271
346
  }
@@ -276,6 +351,7 @@ export class RenderScene {
276
351
  this.unindexMaterials(pending.initial);
277
352
  this.slots[pending.initial.slot] = updatedSlot;
278
353
  this.indexMaterials(updatedSlot);
354
+ this.dirtySinceSubmitted.add(updatedSlot.slot);
279
355
  updatedSlots.push(updatedSlot);
280
356
  updated += 1;
281
357
  }
@@ -316,6 +392,12 @@ export class RenderScene {
316
392
 
317
393
  /** Reconcile the current identity set while retaining slots for survivors. */
318
394
  reset(snapshots: readonly RenderableSnapshot[], countAsRebuild = true): void {
395
+ // A full reconciliation is a temporal cut. Survivors may keep their
396
+ // stable slot, but no prior slot is valid until this frame submits.
397
+ this.lastSubmittedSlots.length = 0;
398
+ this.lastSubmittedVisible.clear();
399
+ this.dirtySinceSubmitted.clear();
400
+ this.submittedEpoch = 0;
319
401
  const desired = new Map<string, RenderableSnapshot>();
320
402
  for (const snapshot of snapshots) {
321
403
  desired.set(identityKey(snapshot.worldId, snapshot.entityKey), snapshot);
@@ -330,7 +412,8 @@ export class RenderScene {
330
412
  for (const snapshot of desired.values()) {
331
413
  const existing = this.lookup(snapshot.worldId, snapshot.entityKey);
332
414
  if (existing === undefined) {
333
- this.allocate(snapshot);
415
+ const created = this.allocate(snapshot);
416
+ this.dirtySinceSubmitted.add(created.slot);
334
417
  continue;
335
418
  }
336
419
  const updated: RenderSceneSlot = {
@@ -340,6 +423,7 @@ export class RenderScene {
340
423
  this.unindexMaterials(existing);
341
424
  this.slots[existing.slot] = updated;
342
425
  this.indexMaterials(updated);
426
+ this.dirtySinceSubmitted.add(updated.slot);
343
427
  this.orderedSlots.push(existing.slot);
344
428
  }
345
429
 
@@ -363,6 +447,59 @@ export class RenderScene {
363
447
  return this.materialized;
364
448
  }
365
449
 
450
+ lastSubmittedSlotByIndex(slot: number): RenderSceneSlot | undefined {
451
+ return this.lastSubmittedSlots[slot];
452
+ }
453
+
454
+ temporalSnapshotBySlot(slot: number): RenderableTemporalSnapshot | undefined {
455
+ const current = this.slots[slot];
456
+ return current === undefined ? undefined : this.temporalSnapshot(current);
457
+ }
458
+
459
+ withTemporal(snapshot: RenderableSnapshot): RenderableSnapshot {
460
+ const slot = this.lookup(snapshot.worldId, snapshot.entityKey);
461
+ return slot === undefined ? snapshot : { ...snapshot, temporal: this.temporalSnapshot(slot) };
462
+ }
463
+
464
+ wasLastSubmittedVisible(slot: number, generation: number): boolean {
465
+ return this.lastSubmittedVisible.has(`${slot}:${generation}`);
466
+ }
467
+
468
+ captureSubmission(
469
+ visible: readonly Pick<RenderableSnapshot, 'worldId' | 'entityKey'>[],
470
+ ): RenderSceneSubmissionCapture {
471
+ const visibleSlots = new Set<string>();
472
+ for (const snapshot of visible) {
473
+ const slot = this.lookup(snapshot.worldId, snapshot.entityKey);
474
+ if (slot !== undefined) visibleSlots.add(`${slot.slot}:${slot.generation}`);
475
+ }
476
+ return {
477
+ revision: this.revision,
478
+ slots: [...this.dirtySinceSubmitted].map((slot) => ({
479
+ slot,
480
+ current: this.slots[slot],
481
+ })),
482
+ visible: visibleSlots,
483
+ };
484
+ }
485
+
486
+ commitSubmission(capture: RenderSceneSubmissionCapture): RenderSceneSubmissionDelta {
487
+ if (capture.revision !== this.revision) {
488
+ throw new RangeError('render scene changed while its temporal submission was active');
489
+ }
490
+ for (const update of capture.slots) {
491
+ this.lastSubmittedSlots[update.slot] = update.current;
492
+ this.dirtySinceSubmitted.delete(update.slot);
493
+ }
494
+ this.lastSubmittedVisible = new Set(capture.visible);
495
+ this.submittedEpoch += 1;
496
+ this.invalidateSnapshots();
497
+ return {
498
+ epoch: this.submittedEpoch,
499
+ slots: capture.slots.map((update) => update.slot),
500
+ };
501
+ }
502
+
366
503
  slotsSnapshot(): readonly RenderSceneSlot[] {
367
504
  if (this.slotSnapshot !== undefined) return this.slotSnapshot;
368
505
  const records: RenderSceneSlot[] = [];
@@ -522,6 +659,49 @@ export class RenderScene {
522
659
  }
523
660
  }
524
661
 
662
+ private temporalSnapshot(slot: RenderSceneSlot): RenderableTemporalSnapshot {
663
+ const submitted = this.lastSubmittedSlots[slot.slot];
664
+ const sameGeneration = submitted?.generation === slot.generation;
665
+ const wasVisible =
666
+ sameGeneration && this.lastSubmittedVisible.has(`${slot.slot}:${slot.generation}`);
667
+ const reasons: RenderableReactiveReason[] = [];
668
+ if (!sameGeneration) {
669
+ reasons.push(submitted === undefined ? 'new-slot' : 'generation-reuse');
670
+ } else if (!wasVisible) {
671
+ reasons.push('reentered');
672
+ }
673
+ if (
674
+ sameGeneration &&
675
+ submitted !== undefined &&
676
+ submitted.snapshot.assetHandle !== slot.snapshot.assetHandle
677
+ ) {
678
+ reasons.push('geometry-revision');
679
+ }
680
+ if (
681
+ sameGeneration &&
682
+ submitted !== undefined &&
683
+ submitted.snapshot.materials !== slot.snapshot.materials
684
+ ) {
685
+ reasons.push('material-revision');
686
+ }
687
+ const seedCurrent =
688
+ !sameGeneration ||
689
+ !wasVisible ||
690
+ reasons.includes('geometry-revision') ||
691
+ reasons.includes('material-revision');
692
+ const previous = seedCurrent || submitted === undefined ? slot.snapshot : submitted.snapshot;
693
+ return {
694
+ previousEpoch: seedCurrent ? undefined : this.submittedEpoch,
695
+ previousSource: seedCurrent ? 'current-seed' : 'last-submitted',
696
+ reactive: reasons.length > 0,
697
+ reactiveReasons: reasons,
698
+ previousTransform: previous.transform,
699
+ previousInstances: previous.instances,
700
+ previousSkin: previous.skin,
701
+ previousMorphWeights: previous.morph?.weights,
702
+ };
703
+ }
704
+
525
705
  private invalidateSnapshots(): void {
526
706
  this.materialized = undefined;
527
707
  this.slotSnapshot = undefined;
@@ -554,6 +734,7 @@ interface PersistentCompositionEntry {
554
734
  readonly resourceOwner: number;
555
735
  readonly projection: RenderScene;
556
736
  readonly topology: BatchTopology;
737
+ readonly transmissionDemand: PersistentTransmissionDemandProjection;
557
738
  readonly readCursors: number[];
558
739
  readonly leaseIdentities: readonly string[];
559
740
  catalogEpoch: number;
@@ -581,6 +762,7 @@ const RENDER_RELEVANT_COMPONENT_IDS = new Set([
581
762
  componentId(Skylight),
582
763
  componentId(SkyboxBackground),
583
764
  componentId(PostProcessParams),
765
+ componentId(VolumetricFog),
584
766
  ]);
585
767
 
586
768
  const NON_RENDERABLE_TRANSFORM_CONSUMERS = [
@@ -693,6 +875,9 @@ export class PersistentRenderScene {
693
875
  private gpuDevice: RhiDevice | undefined;
694
876
  private gpuStatus: 'inactive' | 'unsupported' | 'resident' | 'rebuild-pending' | 'error' =
695
877
  'inactive';
878
+ private temporalCapture:
879
+ | { readonly projection: RenderScene; readonly capture: RenderSceneSubmissionCapture }
880
+ | undefined;
696
881
  private pointsLinesInspections: readonly PointsLinesInspection[] = [];
697
882
 
698
883
  constructor(private readonly options: PersistentRenderSceneOptions = {}) {}
@@ -817,7 +1002,11 @@ export class PersistentRenderScene {
817
1002
  });
818
1003
  continue;
819
1004
  }
1005
+ // Camera snapshots are rebuilt from the current candidate frame and
1006
+ // drive culling there; moving a camera must not invalidate the
1007
+ // retained scene projection or recreate its GPU tables.
820
1008
  if (
1009
+ !world.hasComponent(entity, Camera) &&
821
1010
  NON_RENDERABLE_TRANSFORM_CONSUMERS.some((component) =>
822
1011
  world.hasComponent(entity, component),
823
1012
  )
@@ -848,6 +1037,7 @@ export class PersistentRenderScene {
848
1037
 
849
1038
  invalidate(): void {
850
1039
  this.composition = undefined;
1040
+ this.temporalCapture = undefined;
851
1041
  this.lastResyncReason = 'explicit-invalidate';
852
1042
  }
853
1043
 
@@ -864,6 +1054,7 @@ export class PersistentRenderScene {
864
1054
  ? this.composition
865
1055
  : undefined;
866
1056
  if (detachedComposition !== undefined) this.composition = undefined;
1057
+ if (detachedComposition !== undefined) this.temporalCapture = undefined;
867
1058
  if (this.gpuOwner !== world && this.gpuOwner !== detachedComposition?.token) return;
868
1059
  this.gpuScene?.dispose();
869
1060
  this.gpuScene = undefined;
@@ -896,6 +1087,7 @@ export class PersistentRenderScene {
896
1087
  this.gpuDevice = undefined;
897
1088
  this.gpuStatus = 'inactive';
898
1089
  this.composition = undefined;
1090
+ this.temporalCapture = undefined;
899
1091
  this.pointsLinesInspections = [];
900
1092
  }
901
1093
 
@@ -937,6 +1129,40 @@ export class PersistentRenderScene {
937
1129
  };
938
1130
  }
939
1131
 
1132
+ /** Publish renderer-owned previous transforms after queue submission. */
1133
+ commitTemporalFrame(): Result<void, RhiError> {
1134
+ const gpuCommit = this.gpuScene?.commitTemporalFrame();
1135
+ if (gpuCommit !== undefined && !gpuCommit.ok) return gpuCommit;
1136
+ const temporalCapture = this.temporalCapture;
1137
+ if (temporalCapture !== undefined) {
1138
+ try {
1139
+ temporalCapture.projection.commitSubmission(temporalCapture.capture);
1140
+ } catch (cause) {
1141
+ void cause;
1142
+ return err(
1143
+ new RhiError({
1144
+ code: 'internal-error',
1145
+ expected: 'render scene remains unchanged while a submitted temporal frame commits',
1146
+ hint: 'retry the temporal frame after the renderer-owned scene snapshot is stable',
1147
+ }),
1148
+ );
1149
+ }
1150
+ this.temporalCapture = undefined;
1151
+ }
1152
+ return ok(undefined);
1153
+ }
1154
+
1155
+ /** Capture current CPU scene facts; commitTemporalFrame publishes them only after submit. */
1156
+ prepareTemporalFrame(
1157
+ visible: readonly Pick<RenderableSnapshot, 'worldId' | 'entityKey'>[],
1158
+ ): void {
1159
+ const projection = this.composition?.projection;
1160
+ this.temporalCapture =
1161
+ projection === undefined
1162
+ ? undefined
1163
+ : { projection, capture: projection.captureSubmission(visible) };
1164
+ }
1165
+
940
1166
  pointsLinesSnapshots(): readonly PointsLinesRetainedSnapshot[] {
941
1167
  return this.composition?.projection.pointsLinesSnapshots() ?? [];
942
1168
  }
@@ -961,9 +1187,12 @@ export class PersistentRenderScene {
961
1187
  leases?: readonly RenderReadLease[],
962
1188
  ): ExtractedFrame {
963
1189
  const candidateFrame = buildCandidateFrame();
1190
+ this.temporalCapture = undefined;
964
1191
  this.worldEntitiesScanned = candidateFrame.renderables.length;
965
1192
  const projection = new RenderScene();
966
1193
  projection.reset(candidateFrame.renderables);
1194
+ const transmissionDemand = new PersistentTransmissionDemandProjection();
1195
+ transmissionDemand.apply(transmissionDemandOperations(candidateFrame.renderables));
967
1196
  const topology = new BatchTopology();
968
1197
  topology.rebuild(projection.slotsSnapshot());
969
1198
  const token = {};
@@ -974,6 +1203,7 @@ export class PersistentRenderScene {
974
1203
  resourceOwner: owner.resourceOwner,
975
1204
  projection,
976
1205
  topology,
1206
+ transmissionDemand,
977
1207
  readCursors:
978
1208
  leases === undefined || leases.length !== worlds.length
979
1209
  ? []
@@ -991,7 +1221,20 @@ export class PersistentRenderScene {
991
1221
  this.syncGpuOwner(token, projection, undefined, true);
992
1222
  this.fullRebuilds += 1;
993
1223
  this.lastResyncReason = 'attach';
994
- return cullPersistentFrame(candidateFrame, projection.materialize());
1224
+ const candidates = projection
1225
+ .materialize()
1226
+ .map((snapshot) => projection.withTemporal(snapshot));
1227
+ return cullPersistentFrame({ ...candidateFrame, renderables: [...candidates] }, candidates);
1228
+ }
1229
+
1230
+ /** Internal topology fact; the renderer does not expose demand as public API. */
1231
+ transmissionTopologyDemand(): TransmissionDemand {
1232
+ return (
1233
+ this.composition?.transmissionDemand.inspect() ?? {
1234
+ activeCount: 0,
1235
+ needsRoughMips: false,
1236
+ }
1237
+ );
995
1238
  }
996
1239
 
997
1240
  /**
@@ -1003,7 +1246,9 @@ export class PersistentRenderScene {
1003
1246
  buildCandidateFrame: () => ExtractedFrame,
1004
1247
  ): ExtractedFrame {
1005
1248
  const candidateFrame = buildCandidateFrame();
1006
- const candidates = entry.projection.materialize();
1249
+ const candidates = entry.projection
1250
+ .materialize()
1251
+ .map((snapshot) => entry.projection.withTemporal(snapshot));
1007
1252
  return cullPersistentFrame({ ...candidateFrame, renderables: [...candidates] }, candidates);
1008
1253
  }
1009
1254
 
@@ -0,0 +1,45 @@
1
+ import type { RhiDevice } from '@forgeax/engine-rhi';
2
+ import { rhi } from '@forgeax/engine-rhi-null';
3
+ import { describe, expect, it } from 'vitest';
4
+ import { createTaaHistoryResources, type TaaHistoryResources } from '../taa-history-resources';
5
+
6
+ async function nullDevice(): Promise<RhiDevice> {
7
+ const adapter = await rhi.requestAdapter();
8
+ if (!adapter.ok) throw adapter.error;
9
+ const device = await adapter.value.requestDevice();
10
+ if (!device.ok) throw device.error;
11
+ return device.value;
12
+ }
13
+
14
+ describe('TAA GPU history resources', () => {
15
+ it('allocates two rgba16float slots with sampled/render/copy usage', async () => {
16
+ const device = await nullDevice();
17
+ const resources = createTaaHistoryResources(device, 64, 32);
18
+ expect(resources.ok).toBe(true);
19
+ if (!resources.ok) return;
20
+ expect(resources.value.slots).toHaveLength(2);
21
+ expect(resources.value.descriptor.format).toBe('rgba16float');
22
+ expect(resources.value.descriptor.usage).toBe(0x17);
23
+ resources.value.dispose();
24
+ });
25
+
26
+ it('swaps only on commit and preserves the previous slot on abort', async () => {
27
+ const device = await nullDevice();
28
+ const resources = createTaaHistoryResources(device, 8, 8);
29
+ expect(resources.ok).toBe(true);
30
+ if (!resources.ok) return;
31
+ const state: TaaHistoryResources = resources.value;
32
+ expect(state.previousIndex).toBe(1);
33
+ expect(state.valid).toBe(false);
34
+ state.beginFrame();
35
+ state.abortFrame();
36
+ expect(state.currentIndex).toBe(0);
37
+ expect(state.valid).toBe(false);
38
+ state.beginFrame();
39
+ state.commitFrame();
40
+ expect(state.currentIndex).toBe(1);
41
+ expect(state.previousIndex).toBe(0);
42
+ expect(state.valid).toBe(true);
43
+ state.dispose();
44
+ });
45
+ });
@@ -0,0 +1,76 @@
1
+ import type { SceneDataLane, SceneDataSchemaId } from './scene-data';
2
+
3
+ export interface SceneDataCoverage {
4
+ readonly schema: SceneDataSchemaId;
5
+ readonly lane: SceneDataLane;
6
+ readonly producerId: string;
7
+ readonly complete: boolean;
8
+ readonly contributorIds: readonly string[];
9
+ readonly exactContributorIds: readonly string[];
10
+ readonly reactiveContributorIds: readonly string[];
11
+ readonly missingContributorIds: readonly string[];
12
+ readonly omittedMissingContributorCount: number;
13
+ }
14
+
15
+ export interface TemporalCoverage {
16
+ readonly width: number;
17
+ readonly height: number;
18
+ readonly bytes: number;
19
+ readonly fullScreen: true;
20
+ }
21
+
22
+ export function createTemporalCoverage(width: number, height: number): TemporalCoverage {
23
+ if (!Number.isSafeInteger(width) || width <= 0) throw new RangeError('width must be positive.');
24
+ if (!Number.isSafeInteger(height) || height <= 0)
25
+ throw new RangeError('height must be positive.');
26
+ return Object.freeze({ width, height, bytes: 32 * width * height, fullScreen: true as const });
27
+ }
28
+
29
+ export type SceneDataContributorKind = 'exact' | 'reactive';
30
+ export interface SceneDataContributor {
31
+ readonly id: string;
32
+ readonly kind: SceneDataContributorKind;
33
+ }
34
+ export function classifySceneDataCoverage(input: {
35
+ readonly contributors: readonly SceneDataContributor[];
36
+ readonly requiredContributorIds: readonly string[];
37
+ }): {
38
+ readonly exactContributorIds: readonly string[];
39
+ readonly reactiveContributorIds: readonly string[];
40
+ readonly missingContributorIds: readonly string[];
41
+ readonly omittedMissingContributorCount: number;
42
+ readonly complete: boolean;
43
+ } {
44
+ const exactContributorIds = input.contributors.filter((c) => c.kind === 'exact').map((c) => c.id);
45
+ const reactiveContributorIds = input.contributors
46
+ .filter((c) => c.kind === 'reactive')
47
+ .map((c) => c.id);
48
+ const available = new Set(input.contributors.map((c) => c.id));
49
+ const missing = input.requiredContributorIds.filter((id) => !available.has(id));
50
+ return {
51
+ exactContributorIds: Object.freeze(exactContributorIds),
52
+ reactiveContributorIds: Object.freeze(reactiveContributorIds),
53
+ missingContributorIds: Object.freeze(missing.slice(0, 32)),
54
+ omittedMissingContributorCount: Math.max(0, missing.length - 32),
55
+ complete: missing.length === 0,
56
+ };
57
+ }
58
+ export function scanSceneDataCoverage(input: {
59
+ readonly schema: SceneDataSchemaId;
60
+ readonly lane: SceneDataLane;
61
+ readonly producerId: string;
62
+ readonly contributorIds: readonly string[];
63
+ readonly requiredContributorIds: readonly string[];
64
+ }): SceneDataCoverage {
65
+ const classification = classifySceneDataCoverage({
66
+ contributors: input.contributorIds.map((id) => ({ id, kind: 'exact' as const })),
67
+ requiredContributorIds: input.requiredContributorIds,
68
+ });
69
+ return Object.freeze({
70
+ schema: input.schema,
71
+ lane: input.lane,
72
+ producerId: input.producerId,
73
+ ...classification,
74
+ contributorIds: Object.freeze([...input.contributorIds]),
75
+ });
76
+ }