@forgeax/engine-render 0.1.7 → 0.1.19

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