@forgeax/engine-render 0.1.6 → 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 (713) hide show
  1. package/README.md +279 -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 +19 -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/material/assembly.d.ts.map +1 -1
  10. package/dist/assembly/renderer-frame-transaction.d.ts +39 -0
  11. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -0
  12. package/dist/assembly/renderer-inspection.d.ts +22 -0
  13. package/dist/assembly/renderer-inspection.d.ts.map +1 -0
  14. package/dist/assembly/renderer-lifecycle.d.ts +4 -0
  15. package/dist/assembly/renderer-lifecycle.d.ts.map +1 -0
  16. package/dist/authoring.d.ts +1 -0
  17. package/dist/authoring.d.ts.map +1 -1
  18. package/dist/authoring.mjs +4 -2
  19. package/dist/authoring.mjs.map +1 -1
  20. package/dist/chunk-FJ6P52EE.mjs +46 -0
  21. package/dist/chunk-FJ6P52EE.mjs.map +1 -0
  22. package/dist/chunk-IPXCABEP.mjs +73 -0
  23. package/dist/chunk-IPXCABEP.mjs.map +1 -0
  24. package/dist/chunk-JDWARUOI.mjs +44 -0
  25. package/dist/chunk-JDWARUOI.mjs.map +1 -0
  26. package/dist/chunk-LOSO4CTV.mjs +901 -0
  27. package/dist/chunk-LOSO4CTV.mjs.map +1 -0
  28. package/dist/chunk-PCHBPYML.mjs +385 -0
  29. package/dist/chunk-PCHBPYML.mjs.map +1 -0
  30. package/dist/chunk-RJRUS55L.mjs +9323 -0
  31. package/dist/chunk-RJRUS55L.mjs.map +1 -0
  32. package/dist/{chunk-QC4VW3XJ.mjs → chunk-RXZ3RGOU.mjs} +4 -30
  33. package/dist/chunk-RXZ3RGOU.mjs.map +1 -0
  34. package/dist/{chunk-CQXZC5XI.mjs → chunk-VFPLTKCU.mjs} +79 -69
  35. package/dist/chunk-VFPLTKCU.mjs.map +1 -0
  36. package/dist/{chunk-SCRSAK5B.mjs → chunk-YTQ5C7YQ.mjs} +231 -127
  37. package/dist/chunk-YTQ5C7YQ.mjs.map +1 -0
  38. package/dist/components/atmosphere.d.ts +9 -0
  39. package/dist/components/atmosphere.d.ts.map +1 -0
  40. package/dist/components/camera.d.ts +2 -1
  41. package/dist/components/camera.d.ts.map +1 -1
  42. package/dist/components/fog.d.ts +8 -0
  43. package/dist/components/fog.d.ts.map +1 -0
  44. package/dist/components/index.d.ts +5 -0
  45. package/dist/components/index.d.ts.map +1 -1
  46. package/dist/components/lines.d.ts +5 -0
  47. package/dist/components/lines.d.ts.map +1 -0
  48. package/dist/components/motion-blur.d.ts +7 -0
  49. package/dist/components/motion-blur.d.ts.map +1 -0
  50. package/dist/components/points.d.ts +15 -0
  51. package/dist/components/points.d.ts.map +1 -0
  52. package/dist/construct-renderer.d.ts +2 -2
  53. package/dist/construct-renderer.d.ts.map +1 -1
  54. package/dist/construct-renderer.mjs +11419 -16442
  55. package/dist/construct-renderer.mjs.map +1 -1
  56. package/dist/device/device-scope.d.ts +4 -0
  57. package/dist/device/device-scope.d.ts.map +1 -1
  58. package/dist/environment/frame.d.ts +60 -0
  59. package/dist/environment/frame.d.ts.map +1 -0
  60. package/dist/environment/generation.d.ts +21 -0
  61. package/dist/environment/generation.d.ts.map +1 -0
  62. package/dist/environment/graph.d.ts +4 -0
  63. package/dist/environment/graph.d.ts.map +1 -0
  64. package/dist/environment/inspection.d.ts +48 -0
  65. package/dist/environment/inspection.d.ts.map +1 -0
  66. package/dist/environment/lifecycle.d.ts +39 -0
  67. package/dist/environment/lifecycle.d.ts.map +1 -0
  68. package/dist/environment/signature.d.ts +25 -0
  69. package/dist/environment/signature.d.ts.map +1 -0
  70. package/dist/errors/render.d.ts +217 -1
  71. package/dist/errors/render.d.ts.map +1 -1
  72. package/dist/extract/camera.d.ts +5 -0
  73. package/dist/extract/camera.d.ts.map +1 -0
  74. package/dist/extract/environment.d.ts +74 -0
  75. package/dist/extract/environment.d.ts.map +1 -0
  76. package/dist/extract/visibility.d.ts +1 -1
  77. package/dist/extract/visibility.d.ts.map +1 -1
  78. package/dist/features/host.d.ts +9 -2
  79. package/dist/features/host.d.ts.map +1 -1
  80. package/dist/features/motion-blur/motion-blur-feature.d.ts +16 -0
  81. package/dist/features/motion-blur/motion-blur-feature.d.ts.map +1 -0
  82. package/dist/features/motion-blur/motion-blur-params.d.ts +25 -0
  83. package/dist/features/motion-blur/motion-blur-params.d.ts.map +1 -0
  84. package/dist/features/plan.d.ts +17 -2
  85. package/dist/features/plan.d.ts.map +1 -1
  86. package/dist/features/prepared-gpu-work.d.ts +3 -1
  87. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  88. package/dist/features/prepared-graphics.d.ts +2 -1
  89. package/dist/features/prepared-graphics.d.ts.map +1 -1
  90. package/dist/features/render-graph-raster.d.ts +7 -2
  91. package/dist/features/render-graph-raster.d.ts.map +1 -1
  92. package/dist/features/targets.d.ts +3 -0
  93. package/dist/features/targets.d.ts.map +1 -1
  94. package/dist/features/types.d.ts +12 -0
  95. package/dist/features/types.d.ts.map +1 -1
  96. package/dist/fullscreen-post-process-pass.d.ts +7 -1
  97. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  98. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  99. package/dist/gpu-scene.d.ts +2 -0
  100. package/dist/gpu-scene.d.ts.map +1 -1
  101. package/dist/ibl/skylight-bind-group.d.ts +5 -6
  102. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  103. package/dist/index.d.ts +21 -6
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.mjs +8 -4
  106. package/dist/index.mjs.map +1 -1
  107. package/dist/inspection-types.d.ts +46 -1
  108. package/dist/inspection-types.d.ts.map +1 -1
  109. package/dist/internal.d.ts +2 -0
  110. package/dist/internal.d.ts.map +1 -1
  111. package/dist/internal.mjs +2 -0
  112. package/dist/materials.d.ts +22 -0
  113. package/dist/materials.d.ts.map +1 -1
  114. package/dist/pbr-pipeline.d.ts +12 -6
  115. package/dist/pbr-pipeline.d.ts.map +1 -1
  116. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  117. package/dist/pipeline/standard-pipeline.d.ts +3 -0
  118. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  119. package/dist/pipeline/standard-post.d.ts +48 -0
  120. package/dist/pipeline/standard-post.d.ts.map +1 -0
  121. package/dist/pipeline/standard-profile.d.ts +3 -6
  122. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  123. package/dist/pipeline-builder.d.ts +18 -0
  124. package/dist/pipeline-builder.d.ts.map +1 -1
  125. package/dist/pipeline-spec.d.ts.map +1 -1
  126. package/dist/plugin.d.ts.map +1 -1
  127. package/dist/points-lines/admission.d.ts +36 -0
  128. package/dist/points-lines/admission.d.ts.map +1 -0
  129. package/dist/points-lines/bounds.d.ts +8 -0
  130. package/dist/points-lines/bounds.d.ts.map +1 -0
  131. package/dist/points-lines/expansion-cache.d.ts +28 -0
  132. package/dist/points-lines/expansion-cache.d.ts.map +1 -0
  133. package/dist/points-lines/inspection.d.ts +53 -0
  134. package/dist/points-lines/inspection.d.ts.map +1 -0
  135. package/dist/points-lines/prepare.d.ts +67 -0
  136. package/dist/points-lines/prepare.d.ts.map +1 -0
  137. package/dist/points-lines/record.d.ts +60 -0
  138. package/dist/points-lines/record.d.ts.map +1 -0
  139. package/dist/points-lines/snapshot.d.ts +49 -0
  140. package/dist/points-lines/snapshot.d.ts.map +1 -0
  141. package/dist/record/frame-lighting.d.ts.map +1 -1
  142. package/dist/record/frame-snapshot.d.ts +100 -5
  143. package/dist/record/frame-snapshot.d.ts.map +1 -1
  144. package/dist/record/frame-targets.d.ts.map +1 -1
  145. package/dist/record/frame.d.ts +4 -2
  146. package/dist/record/frame.d.ts.map +1 -1
  147. package/dist/record/main-pass-geometry.d.ts +18 -0
  148. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  149. package/dist/record/main-pass-material.d.ts +8 -5
  150. package/dist/record/main-pass-material.d.ts.map +1 -1
  151. package/dist/record/main-pass-sprite-draws.d.ts +8 -1
  152. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  153. package/dist/record/main-pass.d.ts +2 -0
  154. package/dist/record/main-pass.d.ts.map +1 -1
  155. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  156. package/dist/record/render-context.d.ts +93 -18
  157. package/dist/record/render-context.d.ts.map +1 -1
  158. package/dist/record/shadow-pass.d.ts.map +1 -1
  159. package/dist/record/skybox-post-pass.d.ts +1 -11
  160. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  161. package/dist/record/typed-frame-graph.d.ts +26 -2
  162. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  163. package/dist/record/view-ubo.d.ts +10 -1
  164. package/dist/record/view-ubo.d.ts.map +1 -1
  165. package/dist/render-contract.d.ts +102 -10
  166. package/dist/render-contract.d.ts.map +1 -1
  167. package/dist/render-graph-primitives.d.ts.map +1 -1
  168. package/dist/render-pipeline.d.ts +50 -6
  169. package/dist/render-pipeline.d.ts.map +1 -1
  170. package/dist/render-system-extract.d.ts +32 -5
  171. package/dist/render-system-extract.d.ts.map +1 -1
  172. package/dist/render-system.d.ts +27 -5
  173. package/dist/render-system.d.ts.map +1 -1
  174. package/dist/scene/render-scene-types.d.ts +3 -0
  175. package/dist/scene/render-scene-types.d.ts.map +1 -1
  176. package/dist/scene/render-scene.d.ts +43 -2
  177. package/dist/scene/render-scene.d.ts.map +1 -1
  178. package/dist/temporal/coverage.d.ts +42 -0
  179. package/dist/temporal/coverage.d.ts.map +1 -0
  180. package/dist/temporal/frame-coordinator.d.ts +99 -0
  181. package/dist/temporal/frame-coordinator.d.ts.map +1 -0
  182. package/dist/temporal/gpu.d.ts +39 -0
  183. package/dist/temporal/gpu.d.ts.map +1 -0
  184. package/dist/temporal/history.d.ts +37 -0
  185. package/dist/temporal/history.d.ts.map +1 -0
  186. package/dist/temporal/index.d.ts +7 -0
  187. package/dist/temporal/index.d.ts.map +1 -0
  188. package/dist/temporal/index.mjs +8 -0
  189. package/dist/temporal/index.mjs.map +1 -0
  190. package/dist/temporal/inspection.d.ts +36 -0
  191. package/dist/temporal/inspection.d.ts.map +1 -0
  192. package/dist/temporal/scene-data-catalog.d.ts +48 -0
  193. package/dist/temporal/scene-data-catalog.d.ts.map +1 -0
  194. package/dist/temporal/scene-data.d.ts +43 -0
  195. package/dist/temporal/scene-data.d.ts.map +1 -0
  196. package/dist/temporal/standard-scene-data.d.ts +61 -0
  197. package/dist/temporal/standard-scene-data.d.ts.map +1 -0
  198. package/dist/temporal/taa-history-resources.d.ts +22 -0
  199. package/dist/temporal/taa-history-resources.d.ts.map +1 -0
  200. package/dist/temporal/taa-history-store.d.ts +27 -0
  201. package/dist/temporal/taa-history-store.d.ts.map +1 -0
  202. package/dist/temporal/taa-resolve.d.ts +15 -0
  203. package/dist/temporal/taa-resolve.d.ts.map +1 -0
  204. package/dist/temporal/temporal-view.d.ts +40 -0
  205. package/dist/temporal/temporal-view.d.ts.map +1 -0
  206. package/dist/temporal/transaction.d.ts +9 -0
  207. package/dist/temporal/transaction.d.ts.map +1 -0
  208. package/dist/temporal/view.d.ts +56 -0
  209. package/dist/temporal/view.d.ts.map +1 -0
  210. package/dist/transmission/backdrop.d.ts +147 -0
  211. package/dist/transmission/backdrop.d.ts.map +1 -0
  212. package/dist/transmission/inspection.d.ts +57 -0
  213. package/dist/transmission/inspection.d.ts.map +1 -0
  214. package/dist/transmission/oracle.d.ts +42 -0
  215. package/dist/transmission/oracle.d.ts.map +1 -0
  216. package/dist/transmission/projection.d.ts +37 -0
  217. package/dist/transmission/projection.d.ts.map +1 -0
  218. package/dist/typed-render-graph-primitives.d.ts +25 -2
  219. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  220. package/package.json +24 -19
  221. package/src/__tests__/ai-user-cold-start.integration.test.ts +59 -0
  222. package/src/__tests__/ai-user-public-surface.test-d.ts +45 -0
  223. package/src/__tests__/authoring-path.unit.test.ts +9 -0
  224. package/src/__tests__/bloom-exact-zero.unit.test.ts +202 -0
  225. package/src/__tests__/bloom-lifecycle.integration.test.ts +125 -0
  226. package/src/__tests__/construct-renderer-identity.unit.test.ts +4 -3
  227. package/src/__tests__/detached-inspection.integration.test.ts +177 -0
  228. package/src/__tests__/environment-fog-lanes.integration.test.ts +219 -0
  229. package/src/__tests__/environment-generation.integration.test.ts +141 -0
  230. package/src/__tests__/environment-selection.unit.test.ts +245 -0
  231. package/src/__tests__/factory-contract.integration.test.ts +1380 -9
  232. package/src/__tests__/frame-plan-contract.unit.test.ts +90 -0
  233. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +7 -0
  234. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +12 -2
  235. package/src/__tests__/gpu-driven-production.integration.test.ts +74 -22
  236. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +37 -0
  237. package/src/__tests__/gpu-scene.unit.test.ts +10 -0
  238. package/src/__tests__/injection-kind-owner.test-d.ts +2 -1
  239. package/src/__tests__/material-contract-inventory.unit.test.ts +62 -0
  240. package/src/__tests__/material-cooked-projection.unit.test.ts +18 -124
  241. package/src/__tests__/material-static-dynamic-route.unit.test.ts +28 -28
  242. package/src/__tests__/materials-transmission-validation.unit.test.ts +36 -0
  243. package/src/__tests__/morph-feature-plan.unit.test.ts +7 -0
  244. package/src/__tests__/motion-blur.pixel.integration.test.ts +121 -0
  245. package/src/__tests__/public-surface.test-d.ts +15 -1
  246. package/src/__tests__/render-error-code-owner.test-d.ts +15 -0
  247. package/src/__tests__/render-error-detail-ssot.test-d.ts +11 -2
  248. package/src/__tests__/render-error-exhaustive.test-d.ts +22 -0
  249. package/src/__tests__/render-feature-errors.unit.test.ts +33 -3
  250. package/src/__tests__/render-feature-gpu-work.integration.test.ts +44 -0
  251. package/src/__tests__/render-feature-plan.test-d.ts +22 -89
  252. package/src/__tests__/render-scene-projection.unit.test.ts +28 -0
  253. package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +26 -0
  254. package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +21 -0
  255. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +433 -1
  256. package/src/__tests__/renderer-frame-transaction.integration.test.ts +405 -0
  257. package/src/__tests__/renderer-lifecycle.integration.test.ts +22 -0
  258. package/src/__tests__/scene-data-catalog.unit.test.ts +59 -0
  259. package/src/__tests__/scene-data-consumer.integration.test.ts +67 -0
  260. package/src/__tests__/scene-data-contract.test-d.ts +35 -0
  261. package/src/__tests__/scene-data-inspection.unit.test.ts +41 -0
  262. package/src/__tests__/scene-data-public-surface.test-d.ts +34 -0
  263. package/src/__tests__/shader-manifest-fixture.ts +111 -0
  264. package/src/__tests__/skinned-shadow-caster.test.ts +102 -0
  265. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +24 -3
  266. package/src/__tests__/standard-pipeline.dawn.test.ts +15 -0
  267. package/src/__tests__/standard-pipeline.integration.test.ts +543 -1
  268. package/src/__tests__/standard-profile-oracle.unit.test.ts +10 -2
  269. package/src/__tests__/standard-temporal-producer.integration.test.ts +35 -0
  270. package/src/__tests__/surface-configuration.unit.test.ts +211 -12
  271. package/src/__tests__/taa-transaction.integration.test.ts +30 -0
  272. package/src/__tests__/temporal-admission.integration.test.ts +40 -0
  273. package/src/__tests__/temporal-coverage.unit.test.ts +35 -0
  274. package/src/__tests__/temporal-demand.unit.test.ts +44 -0
  275. package/src/__tests__/temporal-frame-coordinator.unit.test.ts +64 -0
  276. package/src/__tests__/temporal-graph-topology.unit.test.ts +51 -0
  277. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +170 -0
  278. package/src/__tests__/temporal-performance.integration.test.ts +615 -0
  279. package/src/__tests__/temporal-reset-matrix.unit.test.ts +97 -0
  280. package/src/__tests__/temporal-transaction.integration.test.ts +60 -0
  281. package/src/__tests__/temporal-view.unit.test.ts +152 -0
  282. package/src/__tests__/transmission-prewarm.unit.test.ts +93 -0
  283. package/src/__tests__/typed-pipeline-topology.unit.test.ts +230 -1
  284. package/src/__tests__/urp-pipeline-targets.unit.test.ts +25 -1
  285. package/src/__tests__/urp-pipeline.unit.test.ts +4 -3
  286. package/src/__tests__/visibility-extract.integration.test.ts +27 -1
  287. package/src/__tests__/visibility-producer-matrix.integration.test.ts +10 -0
  288. package/src/assembly/backend-contract.ts +47 -1
  289. package/src/assembly/factory.ts +1295 -507
  290. package/src/assembly/host-contract.ts +4 -0
  291. package/src/assembly/material/assembly.ts +2 -5
  292. package/src/assembly/renderer-frame-transaction.ts +75 -0
  293. package/src/assembly/renderer-inspection.ts +112 -0
  294. package/src/assembly/renderer-lifecycle.ts +6 -0
  295. package/src/authoring.ts +1 -0
  296. package/src/components/__tests__/motion-blur.unit.test.ts +14 -0
  297. package/src/components/__tests__/points-lines-admission.unit.test.ts +219 -0
  298. package/src/components/__tests__/points-lines-schema.unit.test.ts +56 -0
  299. package/src/components/__tests__/schema-contract.unit.test.ts +6 -1
  300. package/src/components/atmosphere.ts +10 -0
  301. package/src/components/camera.ts +2 -1
  302. package/src/components/fog.ts +9 -0
  303. package/src/components/index.ts +10 -0
  304. package/src/components/lines.ts +18 -0
  305. package/src/components/motion-blur.ts +8 -0
  306. package/src/components/points.ts +40 -0
  307. package/src/construct-renderer.ts +40 -3
  308. package/src/device/device-scope.ts +15 -1
  309. package/src/environment/frame.ts +185 -0
  310. package/src/environment/generation.ts +23 -0
  311. package/src/environment/graph.ts +9 -0
  312. package/src/environment/inspection.ts +87 -0
  313. package/src/environment/lifecycle.ts +250 -0
  314. package/src/environment/signature.ts +55 -0
  315. package/src/errors/render.ts +429 -1
  316. package/src/extract/camera.ts +78 -0
  317. package/src/extract/environment.ts +171 -0
  318. package/src/extract/visibility.ts +38 -19
  319. package/src/features/host.ts +36 -5
  320. package/src/features/motion-blur/__tests__/motion-blur-feature.unit.test.ts +67 -0
  321. package/src/features/motion-blur/__tests__/motion-blur-params.unit.test.ts +53 -0
  322. package/src/features/motion-blur/motion-blur-feature.ts +119 -0
  323. package/src/features/motion-blur/motion-blur-params.ts +89 -0
  324. package/src/features/plan.ts +32 -3
  325. package/src/features/prepared-gpu-work.ts +21 -6
  326. package/src/features/prepared-graphics.ts +2 -1
  327. package/src/features/render-graph-raster.ts +24 -4
  328. package/src/features/targets.ts +24 -2
  329. package/src/features/types.ts +13 -0
  330. package/src/fullscreen-post-process-pass.ts +34 -4
  331. package/src/gpu-driven/production-raster.ts +6 -1
  332. package/src/gpu-scene.ts +24 -0
  333. package/src/ibl/skylight-bind-group.ts +30 -38
  334. package/src/index.ts +83 -6
  335. package/src/inspection-types.ts +52 -0
  336. package/src/internal.ts +5 -0
  337. package/src/materials.ts +119 -24
  338. package/src/pbr-pipeline.ts +66 -20
  339. package/src/pipeline/standard-forward-lane.ts +158 -101
  340. package/src/pipeline/standard-pipeline.ts +156 -105
  341. package/src/pipeline/standard-post.ts +373 -0
  342. package/src/pipeline/standard-profile.ts +11 -11
  343. package/src/pipeline-builder.ts +102 -12
  344. package/src/pipeline-spec.ts +9 -0
  345. package/src/plugin.ts +6 -0
  346. package/src/points-lines/__tests__/bounds.unit.test.ts +21 -0
  347. package/src/points-lines/__tests__/cache-recovery.unit.test.ts +157 -0
  348. package/src/points-lines/__tests__/inspection-lanes.integration.test.ts +146 -0
  349. package/src/points-lines/__tests__/inspection.unit.test.ts +173 -0
  350. package/src/points-lines/__tests__/lane-structural.integration.test.ts +122 -0
  351. package/src/points-lines/__tests__/points-lines.bench.ts +400 -0
  352. package/src/points-lines/__tests__/raster-lane.integration.test.ts +44 -0
  353. package/src/points-lines/__tests__/snapshot.unit.test.ts +101 -0
  354. package/src/points-lines/__tests__/view-ubo.unit.test.ts +73 -0
  355. package/src/points-lines/admission.ts +238 -0
  356. package/src/points-lines/bounds.ts +23 -0
  357. package/src/points-lines/expansion-cache.ts +215 -0
  358. package/src/points-lines/inspection.ts +97 -0
  359. package/src/points-lines/prepare.ts +177 -0
  360. package/src/points-lines/record.ts +125 -0
  361. package/src/points-lines/snapshot.ts +130 -0
  362. package/src/record/__tests__/fullscreen-temporal-routing.unit.test.ts +25 -0
  363. package/src/record/__tests__/main-pass-geometry.unit.test.ts +47 -0
  364. package/src/record/__tests__/material-bg-cache.unit.test.ts +12 -1
  365. package/src/record/__tests__/material-pipeline-pending-cache.unit.test.ts +22 -0
  366. package/src/record/__tests__/sprite-material-abi.unit.test.ts +75 -0
  367. package/src/record/__tests__/standard-pbr-ubo-layout.unit.test.ts +67 -0
  368. package/src/record/__tests__/temporal-payload.unit.test.ts +164 -0
  369. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +127 -0
  370. package/src/record/frame-lighting.ts +14 -2
  371. package/src/record/frame-snapshot.ts +129 -5
  372. package/src/record/frame-targets.ts +15 -6
  373. package/src/record/frame.ts +119 -4
  374. package/src/record/main-pass-geometry.ts +178 -40
  375. package/src/record/main-pass-material.ts +114 -66
  376. package/src/record/main-pass-sprite-draws.ts +79 -102
  377. package/src/record/main-pass.ts +83 -7
  378. package/src/record/mesh-ssbo.ts +22 -3
  379. package/src/record/render-context.ts +209 -23
  380. package/src/record/shadow-pass.ts +129 -28
  381. package/src/record/skybox-post-pass.ts +99 -42
  382. package/src/record/typed-frame-graph.ts +582 -42
  383. package/src/record/view-ubo.ts +99 -4
  384. package/src/render-contract.ts +121 -7
  385. package/src/render-graph-primitives.ts +18 -1
  386. package/src/render-pipeline.ts +100 -27
  387. package/src/render-system-extract.ts +264 -77
  388. package/src/render-system.ts +786 -43
  389. package/src/scene/render-scene-types.ts +3 -0
  390. package/src/scene/render-scene.ts +307 -9
  391. package/src/temporal/__tests__/taa-history-resources.unit.test.ts +45 -0
  392. package/src/temporal/coverage.ts +76 -0
  393. package/src/temporal/frame-coordinator.ts +311 -0
  394. package/src/temporal/gpu.ts +287 -0
  395. package/src/temporal/history.ts +92 -0
  396. package/src/temporal/index.ts +6 -0
  397. package/src/temporal/inspection.ts +97 -0
  398. package/src/temporal/scene-data-catalog.ts +200 -0
  399. package/src/temporal/scene-data.ts +149 -0
  400. package/src/temporal/standard-scene-data.ts +182 -0
  401. package/src/temporal/taa-history-resources.ts +128 -0
  402. package/src/temporal/taa-history-store.ts +79 -0
  403. package/src/temporal/taa-resolve.ts +34 -0
  404. package/src/temporal/temporal-view.ts +169 -0
  405. package/src/temporal/transaction.ts +17 -0
  406. package/src/temporal/view.ts +161 -0
  407. package/src/transmission/__tests__/capability.unit.test.ts +83 -0
  408. package/src/transmission/__tests__/composition.integration.test.ts +161 -0
  409. package/src/transmission/__tests__/inspection.unit.test.ts +241 -0
  410. package/src/transmission/__tests__/lifecycle.integration.test.ts +96 -0
  411. package/src/transmission/__tests__/oracle.unit.test.ts +131 -0
  412. package/src/transmission/__tests__/projection.unit.test.ts +71 -0
  413. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +438 -0
  414. package/src/transmission/__tests__/transmission-backdrop-topology.unit.test.ts +109 -0
  415. package/src/transmission/__tests__/transmission-backdrop.dawn.test.ts +105 -0
  416. package/src/transmission/backdrop.ts +572 -0
  417. package/src/transmission/inspection.ts +190 -0
  418. package/src/transmission/oracle.ts +141 -0
  419. package/src/transmission/projection.ts +83 -0
  420. package/src/typed-render-graph-primitives.ts +162 -9
  421. package/dist/__tests__/authoring-path.unit.test.d.ts +0 -2
  422. package/dist/__tests__/authoring-path.unit.test.d.ts.map +0 -1
  423. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts +0 -2
  424. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts.map +0 -1
  425. package/dist/__tests__/callback-inference.test-d.d.ts +0 -2
  426. package/dist/__tests__/callback-inference.test-d.d.ts.map +0 -1
  427. package/dist/__tests__/cluster-binner.test.d.ts +0 -2
  428. package/dist/__tests__/cluster-binner.test.d.ts.map +0 -1
  429. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts +0 -2
  430. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts.map +0 -1
  431. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts +0 -2
  432. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts.map +0 -1
  433. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +0 -2
  434. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +0 -1
  435. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +0 -2
  436. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +0 -1
  437. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts +0 -2
  438. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts.map +0 -1
  439. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts +0 -2
  440. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts.map +0 -1
  441. package/dist/__tests__/factory-contract.integration.test.d.ts +0 -2
  442. package/dist/__tests__/factory-contract.integration.test.d.ts.map +0 -1
  443. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts +0 -2
  444. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts.map +0 -1
  445. package/dist/__tests__/frame-observation.contract.test.d.ts +0 -2
  446. package/dist/__tests__/frame-observation.contract.test.d.ts.map +0 -1
  447. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +0 -2
  448. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +0 -1
  449. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts +0 -2
  450. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts.map +0 -1
  451. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts +0 -6
  452. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +0 -1
  453. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts +0 -2
  454. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts.map +0 -1
  455. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts +0 -2
  456. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts.map +0 -1
  457. package/dist/__tests__/gpu-driven-production.integration.test.d.ts +0 -2
  458. package/dist/__tests__/gpu-driven-production.integration.test.d.ts.map +0 -1
  459. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts +0 -2
  460. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts.map +0 -1
  461. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +0 -18
  462. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +0 -1
  463. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts +0 -2
  464. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts.map +0 -1
  465. package/dist/__tests__/gpu-driven-view-reference.d.ts +0 -15
  466. package/dist/__tests__/gpu-driven-view-reference.d.ts.map +0 -1
  467. package/dist/__tests__/gpu-driven-view.browser.test.d.ts +0 -2
  468. package/dist/__tests__/gpu-driven-view.browser.test.d.ts.map +0 -1
  469. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts +0 -2
  470. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts.map +0 -1
  471. package/dist/__tests__/gpu-driven-view.unit.test.d.ts +0 -2
  472. package/dist/__tests__/gpu-driven-view.unit.test.d.ts.map +0 -1
  473. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts +0 -2
  474. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts.map +0 -1
  475. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts +0 -7
  476. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +0 -1
  477. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts +0 -2
  478. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts.map +0 -1
  479. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts +0 -2
  480. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts.map +0 -1
  481. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts +0 -2
  482. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts.map +0 -1
  483. package/dist/__tests__/gpu-scene.dawn.test.d.ts +0 -2
  484. package/dist/__tests__/gpu-scene.dawn.test.d.ts.map +0 -1
  485. package/dist/__tests__/gpu-scene.unit.test.d.ts +0 -2
  486. package/dist/__tests__/gpu-scene.unit.test.d.ts.map +0 -1
  487. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +0 -2
  488. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +0 -1
  489. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts +0 -2
  490. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts.map +0 -1
  491. package/dist/__tests__/injection-kind-owner.test-d.d.ts +0 -2
  492. package/dist/__tests__/injection-kind-owner.test-d.d.ts.map +0 -1
  493. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts +0 -2
  494. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts.map +0 -1
  495. package/dist/__tests__/light-buffer-layout.unit.test.d.ts +0 -2
  496. package/dist/__tests__/light-buffer-layout.unit.test.d.ts.map +0 -1
  497. package/dist/__tests__/material-contract-inventory.unit.test.d.ts +0 -2
  498. package/dist/__tests__/material-contract-inventory.unit.test.d.ts.map +0 -1
  499. package/dist/__tests__/material-cooked-projection.unit.test.d.ts +0 -2
  500. package/dist/__tests__/material-cooked-projection.unit.test.d.ts.map +0 -1
  501. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts +0 -2
  502. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts.map +0 -1
  503. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts +0 -2
  504. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts.map +0 -1
  505. package/dist/__tests__/material-stride-surface.unit.test.d.ts +0 -2
  506. package/dist/__tests__/material-stride-surface.unit.test.d.ts.map +0 -1
  507. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts +0 -2
  508. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts.map +0 -1
  509. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts +0 -2
  510. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts.map +0 -1
  511. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts +0 -2
  512. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts.map +0 -1
  513. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts +0 -2
  514. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts.map +0 -1
  515. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts +0 -2
  516. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts.map +0 -1
  517. package/dist/__tests__/morph-feature-plan.unit.test.d.ts +0 -2
  518. package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +0 -1
  519. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts +0 -2
  520. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts.map +0 -1
  521. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts +0 -2
  522. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts.map +0 -1
  523. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts +0 -2
  524. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts.map +0 -1
  525. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts +0 -2
  526. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts.map +0 -1
  527. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts +0 -2
  528. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts.map +0 -1
  529. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts +0 -2
  530. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts.map +0 -1
  531. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts +0 -2
  532. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts.map +0 -1
  533. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts +0 -2
  534. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts.map +0 -1
  535. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts +0 -2
  536. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts.map +0 -1
  537. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts +0 -2
  538. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts.map +0 -1
  539. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts +0 -2
  540. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts.map +0 -1
  541. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts +0 -2
  542. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts.map +0 -1
  543. package/dist/__tests__/profiler-default-off.test.d.ts +0 -2
  544. package/dist/__tests__/profiler-default-off.test.d.ts.map +0 -1
  545. package/dist/__tests__/profiler-phase-catalog.test.d.ts +0 -2
  546. package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +0 -1
  547. package/dist/__tests__/profiler-phase-integration.test.d.ts +0 -2
  548. package/dist/__tests__/profiler-phase-integration.test.d.ts.map +0 -1
  549. package/dist/__tests__/profiler-phase-token.test.d.ts +0 -2
  550. package/dist/__tests__/profiler-phase-token.test.d.ts.map +0 -1
  551. package/dist/__tests__/public-surface.test-d.d.ts +0 -2
  552. package/dist/__tests__/public-surface.test-d.d.ts.map +0 -1
  553. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts +0 -2
  554. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts.map +0 -1
  555. package/dist/__tests__/render-error-code-owner.test-d.d.ts +0 -2
  556. package/dist/__tests__/render-error-code-owner.test-d.d.ts.map +0 -1
  557. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts +0 -2
  558. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts.map +0 -1
  559. package/dist/__tests__/render-error-exhaustive.test-d.d.ts +0 -2
  560. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +0 -1
  561. package/dist/__tests__/render-feature-assembly.test-d.d.ts +0 -2
  562. package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +0 -1
  563. package/dist/__tests__/render-feature-context.test-d.d.ts +0 -2
  564. package/dist/__tests__/render-feature-context.test-d.d.ts.map +0 -1
  565. package/dist/__tests__/render-feature-contract.test-d.d.ts +0 -2
  566. package/dist/__tests__/render-feature-contract.test-d.d.ts.map +0 -1
  567. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts +0 -2
  568. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts.map +0 -1
  569. package/dist/__tests__/render-feature-docs.unit.test.d.ts +0 -2
  570. package/dist/__tests__/render-feature-docs.unit.test.d.ts.map +0 -1
  571. package/dist/__tests__/render-feature-errors.unit.test.d.ts +0 -2
  572. package/dist/__tests__/render-feature-errors.unit.test.d.ts.map +0 -1
  573. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts +0 -2
  574. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts.map +0 -1
  575. package/dist/__tests__/render-feature-plan.test-d.d.ts +0 -2
  576. package/dist/__tests__/render-feature-plan.test-d.d.ts.map +0 -1
  577. package/dist/__tests__/render-feature-plan.unit.test.d.ts +0 -2
  578. package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +0 -1
  579. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts +0 -2
  580. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts.map +0 -1
  581. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts +0 -2
  582. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts.map +0 -1
  583. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +0 -2
  584. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +0 -1
  585. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts +0 -2
  586. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts.map +0 -1
  587. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts +0 -2
  588. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts.map +0 -1
  589. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts +0 -2
  590. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts.map +0 -1
  591. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts +0 -2
  592. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts.map +0 -1
  593. package/dist/__tests__/render-feature-public-surface.test-d.d.ts +0 -2
  594. package/dist/__tests__/render-feature-public-surface.test-d.d.ts.map +0 -1
  595. package/dist/__tests__/render-feature-retry.unit.test.d.ts +0 -2
  596. package/dist/__tests__/render-feature-retry.unit.test.d.ts.map +0 -1
  597. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts +0 -2
  598. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts.map +0 -1
  599. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts +0 -2
  600. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts.map +0 -1
  601. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts +0 -2
  602. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts.map +0 -1
  603. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts +0 -2
  604. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts.map +0 -1
  605. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts +0 -2
  606. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts.map +0 -1
  607. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts +0 -2
  608. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts.map +0 -1
  609. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts +0 -7
  610. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts.map +0 -1
  611. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts +0 -2
  612. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts.map +0 -1
  613. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts +0 -2
  614. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts.map +0 -1
  615. package/dist/__tests__/render-graph-hzb-gpu.d.ts +0 -7
  616. package/dist/__tests__/render-graph-hzb-gpu.d.ts.map +0 -1
  617. package/dist/__tests__/render-graph-hzb.browser.test.d.ts +0 -2
  618. package/dist/__tests__/render-graph-hzb.browser.test.d.ts.map +0 -1
  619. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts +0 -2
  620. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts.map +0 -1
  621. package/dist/__tests__/render-graph-primitives.unit.test.d.ts +0 -2
  622. package/dist/__tests__/render-graph-primitives.unit.test.d.ts.map +0 -1
  623. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts +0 -12
  624. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts.map +0 -1
  625. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts +0 -2
  626. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts.map +0 -1
  627. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts +0 -2
  628. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts.map +0 -1
  629. package/dist/__tests__/render-scene-projection.unit.test.d.ts +0 -2
  630. package/dist/__tests__/render-scene-projection.unit.test.d.ts.map +0 -1
  631. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts +0 -2
  632. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts.map +0 -1
  633. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +0 -2
  634. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +0 -1
  635. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts +0 -2
  636. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts.map +0 -1
  637. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts +0 -2
  638. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts.map +0 -1
  639. package/dist/__tests__/shader-stage-surface.unit.test.d.ts +0 -2
  640. package/dist/__tests__/shader-stage-surface.unit.test.d.ts.map +0 -1
  641. package/dist/__tests__/ssao-config.unit.test.d.ts +0 -2
  642. package/dist/__tests__/ssao-config.unit.test.d.ts.map +0 -1
  643. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts +0 -2
  644. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts.map +0 -1
  645. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +0 -2
  646. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +0 -1
  647. package/dist/__tests__/standard-descriptors.test-d.d.ts +0 -2
  648. package/dist/__tests__/standard-descriptors.test-d.d.ts.map +0 -1
  649. package/dist/__tests__/standard-pipeline.dawn.test.d.ts +0 -2
  650. package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +0 -1
  651. package/dist/__tests__/standard-pipeline.integration.test.d.ts +0 -2
  652. package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +0 -1
  653. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +0 -2
  654. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +0 -1
  655. package/dist/__tests__/surface-configuration.unit.test.d.ts +0 -2
  656. package/dist/__tests__/surface-configuration.unit.test.d.ts.map +0 -1
  657. package/dist/__tests__/texture-usage-surface.unit.test.d.ts +0 -2
  658. package/dist/__tests__/texture-usage-surface.unit.test.d.ts.map +0 -1
  659. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts +0 -2
  660. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts.map +0 -1
  661. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts +0 -2
  662. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts.map +0 -1
  663. package/dist/__tests__/urp-pipeline.unit.test.d.ts +0 -2
  664. package/dist/__tests__/urp-pipeline.unit.test.d.ts.map +0 -1
  665. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts +0 -2
  666. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts.map +0 -1
  667. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts +0 -2
  668. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts.map +0 -1
  669. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts +0 -2
  670. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts.map +0 -1
  671. package/dist/__tests__/visibility-extract.integration.test.d.ts +0 -2
  672. package/dist/__tests__/visibility-extract.integration.test.d.ts.map +0 -1
  673. package/dist/__tests__/visibility-extract.perf.test.d.ts +0 -2
  674. package/dist/__tests__/visibility-extract.perf.test.d.ts.map +0 -1
  675. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts +0 -2
  676. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts.map +0 -1
  677. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts +0 -2
  678. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts.map +0 -1
  679. package/dist/__tests__/visibility-instances.integration.test.d.ts +0 -2
  680. package/dist/__tests__/visibility-instances.integration.test.d.ts.map +0 -1
  681. package/dist/__tests__/visibility-multi-world.integration.test.d.ts +0 -2
  682. package/dist/__tests__/visibility-multi-world.integration.test.d.ts.map +0 -1
  683. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts +0 -2
  684. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts.map +0 -1
  685. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts +0 -2
  686. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts.map +0 -1
  687. package/dist/__tests__/visibility-public-surface.test-d.d.ts +0 -2
  688. package/dist/__tests__/visibility-public-surface.test-d.d.ts.map +0 -1
  689. package/dist/__tests__/visibility-resolver.unit.test.d.ts +0 -2
  690. package/dist/__tests__/visibility-resolver.unit.test.d.ts.map +0 -1
  691. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +0 -2
  692. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +0 -1
  693. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts +0 -2
  694. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts.map +0 -1
  695. package/dist/__tests__/vocabulary.unit.test.d.ts +0 -2
  696. package/dist/__tests__/vocabulary.unit.test.d.ts.map +0 -1
  697. package/dist/chunk-CQXZC5XI.mjs.map +0 -1
  698. package/dist/chunk-QC4VW3XJ.mjs.map +0 -1
  699. package/dist/chunk-SCRSAK5B.mjs.map +0 -1
  700. package/dist/components/__tests__/schema-contract.unit.test.d.ts +0 -2
  701. package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +0 -1
  702. package/dist/components/__tests__/schema-parity.unit.test.d.ts +0 -2
  703. package/dist/components/__tests__/schema-parity.unit.test.d.ts.map +0 -1
  704. package/dist/components/__tests__/visibility-schema.unit.test.d.ts +0 -2
  705. package/dist/components/__tests__/visibility-schema.unit.test.d.ts.map +0 -1
  706. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts +0 -2
  707. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts.map +0 -1
  708. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts +0 -2
  709. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts.map +0 -1
  710. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +0 -2
  711. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +0 -1
  712. package/dist/record/__tests__/video-texture-view.unit.test.d.ts +0 -2
  713. package/dist/record/__tests__/video-texture-view.unit.test.d.ts.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import type { RenderSceneResyncReason } from '../inspection-types';
2
+ import type { PointsLinesRetainedSnapshot } from '../points-lines/snapshot';
2
3
  import type { RenderableSnapshot } from '../render-system-extract';
3
4
 
4
5
  export type { RenderSceneResyncReason } from '../inspection-types';
@@ -23,6 +24,8 @@ export interface RenderSceneRecord extends RenderSceneIdentity {
23
24
 
24
25
  export interface RenderSceneSlot extends RenderSceneRecord {
25
26
  readonly snapshot: RenderableSnapshot;
27
+ /** Optional detached projection carried with the retained render slot. */
28
+ readonly pointsLines?: PointsLinesRetainedSnapshot;
26
29
  }
27
30
 
28
31
  export interface RenderSceneApplyResult {
@@ -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,
@@ -29,13 +30,23 @@ import {
29
30
  } from '../gpu-driven/batch-topology';
30
31
  import { GpuScene } from '../gpu-scene';
31
32
  import type { PersistentRenderSceneInspection } from '../inspection-types';
33
+ import type { PointsLinesInspection } from '../points-lines/inspection';
34
+ import type { PointsLinesRetainedSnapshot } from '../points-lines/snapshot';
32
35
  import type { CameraSnapshot } from '../render-contract';
33
36
  import type {
34
37
  DispatchEntry,
35
38
  ExtractedFrame,
39
+ MaterialSnapshot,
36
40
  MaterialSnapshotCachesByWorld,
41
+ RenderableReactiveReason,
37
42
  RenderableSnapshot,
43
+ RenderableTemporalSnapshot,
38
44
  } from '../render-system-extract';
45
+ import {
46
+ PersistentTransmissionDemandProjection,
47
+ type TransmissionDemand,
48
+ type TransmissionDemandOperation,
49
+ } from '../transmission/projection';
39
50
  import type {
40
51
  RenderSceneApplyResult,
41
52
  RenderSceneBounds,
@@ -67,13 +78,63 @@ interface PendingIdentity {
67
78
  removed: boolean;
68
79
  }
69
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
+
70
95
  function identityKey(worldId: number, entityKey: number): string {
71
96
  return `${worldId}:${entityKey}`;
72
97
  }
73
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
+
74
134
  function ownSnapshot(snapshot: RenderableSnapshot): RenderableSnapshot {
135
+ const { temporal: _temporal, ...current } = snapshot;
75
136
  return {
76
- ...snapshot,
137
+ ...current,
77
138
  transform: { ...snapshot.transform, world: new Float32Array(snapshot.transform.world) },
78
139
  ...(snapshot.localAabb === undefined
79
140
  ? {}
@@ -95,6 +156,21 @@ function ownSnapshot(snapshot: RenderableSnapshot): RenderableSnapshot {
95
156
  regions: new Float32Array(snapshot.spriteInstances.regions),
96
157
  },
97
158
  }),
159
+ ...(snapshot.pointsLines === undefined
160
+ ? {}
161
+ : { pointsLines: ownPointsLinesSnapshot(snapshot.pointsLines) }),
162
+ };
163
+ }
164
+
165
+ function ownPointsLinesSnapshot(
166
+ snapshot: PointsLinesRetainedSnapshot,
167
+ ): PointsLinesRetainedSnapshot {
168
+ return {
169
+ ...snapshot,
170
+ style: snapshot.style === undefined ? undefined : { ...snapshot.style },
171
+ sourceBounds: new Float32Array(snapshot.sourceBounds),
172
+ viewport: { ...snapshot.viewport },
173
+ projection: new Float32Array(snapshot.projection),
98
174
  };
99
175
  }
100
176
 
@@ -152,10 +228,18 @@ function worldBounds(snapshot: RenderableSnapshot): RenderSceneBounds | undefine
152
228
  */
153
229
  export class RenderScene {
154
230
  private readonly slots: Array<RenderSceneSlot | undefined> = [];
231
+ private readonly lastSubmittedSlots: Array<RenderSceneSlot | undefined> = [];
155
232
  private readonly generations: number[] = [];
156
233
  private readonly freeSlots: number[] = [];
157
234
  private readonly slotsByWorld = new Map<number, Map<number, number>>();
158
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;
239
+ // World bounds are a pure projection of each immutable snapshot. Cache the
240
+ // derived value by snapshot identity so repeated view queries do not redo
241
+ // the eight-corner transform for every view in the same frame.
242
+ private readonly worldBoundsCache = new WeakMap<RenderableSnapshot, RenderSceneBounds | null>();
159
243
  private orderedSlots: number[] = [];
160
244
  private materialized: readonly RenderableSnapshot[] | undefined;
161
245
  private slotSnapshot: readonly RenderSceneSlot[] | undefined;
@@ -167,6 +251,11 @@ export class RenderScene {
167
251
  private resyncs = 0;
168
252
  private lastResyncReason: RenderSceneResyncReason | undefined;
169
253
 
254
+ /** Bounded current-scene facts for the Standard temporal producer. */
255
+ temporalContributorCount(): number {
256
+ return this.orderedSlots.length;
257
+ }
258
+
170
259
  apply(operations: readonly RenderSceneOperation[]): RenderSceneApplyResult {
171
260
  if (operations.length === 0) {
172
261
  this.noChangeFrames += 1;
@@ -232,19 +321,25 @@ export class RenderScene {
232
321
  for (const pending of pendingOrder) {
233
322
  if (pending.initial === undefined) {
234
323
  if (pending.current === undefined) continue;
235
- createdSlots.push(this.allocate(pending.current));
324
+ const createdSlot = this.allocate(pending.current);
325
+ this.dirtySinceSubmitted.add(createdSlot.slot);
326
+ createdSlots.push(createdSlot);
236
327
  created += 1;
237
328
  continue;
238
329
  }
239
330
  if (pending.current === undefined) {
331
+ this.dirtySinceSubmitted.add(pending.initial.slot);
240
332
  this.release(pending.initial);
241
333
  removedSlots.push(pending.initial);
242
334
  removed += 1;
243
335
  continue;
244
336
  }
245
337
  if (pending.removed) {
338
+ this.dirtySinceSubmitted.add(pending.initial.slot);
246
339
  this.release(pending.initial);
247
- recreatedSlots.push(this.allocate(pending.current));
340
+ const recreatedSlot = this.allocate(pending.current);
341
+ this.dirtySinceSubmitted.add(recreatedSlot.slot);
342
+ recreatedSlots.push(recreatedSlot);
248
343
  recreated += 1;
249
344
  continue;
250
345
  }
@@ -255,6 +350,7 @@ export class RenderScene {
255
350
  this.unindexMaterials(pending.initial);
256
351
  this.slots[pending.initial.slot] = updatedSlot;
257
352
  this.indexMaterials(updatedSlot);
353
+ this.dirtySinceSubmitted.add(updatedSlot.slot);
258
354
  updatedSlots.push(updatedSlot);
259
355
  updated += 1;
260
356
  }
@@ -295,6 +391,12 @@ export class RenderScene {
295
391
 
296
392
  /** Reconcile the current identity set while retaining slots for survivors. */
297
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;
298
400
  const desired = new Map<string, RenderableSnapshot>();
299
401
  for (const snapshot of snapshots) {
300
402
  desired.set(identityKey(snapshot.worldId, snapshot.entityKey), snapshot);
@@ -309,7 +411,8 @@ export class RenderScene {
309
411
  for (const snapshot of desired.values()) {
310
412
  const existing = this.lookup(snapshot.worldId, snapshot.entityKey);
311
413
  if (existing === undefined) {
312
- this.allocate(snapshot);
414
+ const created = this.allocate(snapshot);
415
+ this.dirtySinceSubmitted.add(created.slot);
313
416
  continue;
314
417
  }
315
418
  const updated: RenderSceneSlot = {
@@ -319,6 +422,7 @@ export class RenderScene {
319
422
  this.unindexMaterials(existing);
320
423
  this.slots[existing.slot] = updated;
321
424
  this.indexMaterials(updated);
425
+ this.dirtySinceSubmitted.add(updated.slot);
322
426
  this.orderedSlots.push(existing.slot);
323
427
  }
324
428
 
@@ -342,6 +446,59 @@ export class RenderScene {
342
446
  return this.materialized;
343
447
  }
344
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
+
345
502
  slotsSnapshot(): readonly RenderSceneSlot[] {
346
503
  if (this.slotSnapshot !== undefined) return this.slotSnapshot;
347
504
  const records: RenderSceneSlot[] = [];
@@ -365,6 +522,18 @@ export class RenderScene {
365
522
  return this.lookup(worldId, entityKey)?.snapshot;
366
523
  }
367
524
 
525
+ pointsLinesSnapshots(): readonly PointsLinesRetainedSnapshot[] {
526
+ const snapshots: PointsLinesRetainedSnapshot[] = [];
527
+ for (const slot of this.orderedSlots) {
528
+ const record = this.slots[slot];
529
+ const snapshot = record?.snapshot.pointsLines;
530
+ if (record !== undefined && snapshot !== undefined) {
531
+ snapshots.push(ownPointsLinesSnapshot({ ...snapshot, worldId: record.worldId }));
532
+ }
533
+ }
534
+ return Object.freeze(snapshots);
535
+ }
536
+
368
537
  slotsForMaterial(materialHandle: number): readonly RenderSceneSlot[] {
369
538
  const slots = this.slotsByMaterial.get(materialHandle);
370
539
  if (slots === undefined) return [];
@@ -381,8 +550,14 @@ export class RenderScene {
381
550
  for (const slot of this.orderedSlots) {
382
551
  const record = this.slots[slot];
383
552
  if (record === undefined) continue;
384
- const candidate = worldBounds(record.snapshot);
385
- if (candidate !== undefined && intersects(candidate, bounds)) records.push(record);
553
+ const snapshot = record.snapshot;
554
+ let candidate = this.worldBoundsCache.get(snapshot);
555
+ if (candidate === undefined && !this.worldBoundsCache.has(snapshot)) {
556
+ candidate = worldBounds(snapshot) ?? null;
557
+ this.worldBoundsCache.set(snapshot, candidate);
558
+ }
559
+ if (candidate === null || candidate === undefined) continue;
560
+ if (intersects(candidate, bounds)) records.push(record);
386
561
  }
387
562
  return records;
388
563
  }
@@ -483,6 +658,49 @@ export class RenderScene {
483
658
  }
484
659
  }
485
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
+
486
704
  private invalidateSnapshots(): void {
487
705
  this.materialized = undefined;
488
706
  this.slotSnapshot = undefined;
@@ -515,6 +733,7 @@ interface PersistentCompositionEntry {
515
733
  readonly resourceOwner: number;
516
734
  readonly projection: RenderScene;
517
735
  readonly topology: BatchTopology;
736
+ readonly transmissionDemand: PersistentTransmissionDemandProjection;
518
737
  readonly readCursors: number[];
519
738
  readonly leaseIdentities: readonly string[];
520
739
  catalogEpoch: number;
@@ -654,6 +873,10 @@ export class PersistentRenderScene {
654
873
  private gpuDevice: RhiDevice | undefined;
655
874
  private gpuStatus: 'inactive' | 'unsupported' | 'resident' | 'rebuild-pending' | 'error' =
656
875
  'inactive';
876
+ private temporalCapture:
877
+ | { readonly projection: RenderScene; readonly capture: RenderSceneSubmissionCapture }
878
+ | undefined;
879
+ private pointsLinesInspections: readonly PointsLinesInspection[] = [];
657
880
 
658
881
  constructor(private readonly options: PersistentRenderSceneOptions = {}) {}
659
882
 
@@ -777,7 +1000,11 @@ export class PersistentRenderScene {
777
1000
  });
778
1001
  continue;
779
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.
780
1006
  if (
1007
+ !world.hasComponent(entity, Camera) &&
781
1008
  NON_RENDERABLE_TRANSFORM_CONSUMERS.some((component) =>
782
1009
  world.hasComponent(entity, component),
783
1010
  )
@@ -808,6 +1035,7 @@ export class PersistentRenderScene {
808
1035
 
809
1036
  invalidate(): void {
810
1037
  this.composition = undefined;
1038
+ this.temporalCapture = undefined;
811
1039
  this.lastResyncReason = 'explicit-invalidate';
812
1040
  }
813
1041
 
@@ -824,6 +1052,7 @@ export class PersistentRenderScene {
824
1052
  ? this.composition
825
1053
  : undefined;
826
1054
  if (detachedComposition !== undefined) this.composition = undefined;
1055
+ if (detachedComposition !== undefined) this.temporalCapture = undefined;
827
1056
  if (this.gpuOwner !== world && this.gpuOwner !== detachedComposition?.token) return;
828
1057
  this.gpuScene?.dispose();
829
1058
  this.gpuScene = undefined;
@@ -841,6 +1070,14 @@ export class PersistentRenderScene {
841
1070
  this.gpuStatus = this.options.getDevice === undefined ? 'inactive' : 'rebuild-pending';
842
1071
  }
843
1072
 
1073
+ setPointsLinesInspections(inspections: readonly PointsLinesInspection[]): void {
1074
+ this.pointsLinesInspections = inspections.map((inspection) => ({
1075
+ ...inspection,
1076
+ cache: { ...inspection.cache },
1077
+ ...(inspection.refusal === undefined ? {} : { refusal: { ...inspection.refusal } }),
1078
+ }));
1079
+ }
1080
+
844
1081
  dispose(): void {
845
1082
  this.gpuScene?.dispose();
846
1083
  this.gpuScene = undefined;
@@ -848,10 +1085,13 @@ export class PersistentRenderScene {
848
1085
  this.gpuDevice = undefined;
849
1086
  this.gpuStatus = 'inactive';
850
1087
  this.composition = undefined;
1088
+ this.temporalCapture = undefined;
1089
+ this.pointsLinesInspections = [];
851
1090
  }
852
1091
 
853
1092
  inspect(): PersistentRenderSceneInspection {
854
1093
  const entry = this.composition;
1094
+ const pointsLines = this.pointsLinesInspections;
855
1095
  return {
856
1096
  worldEntitiesScanned: this.worldEntitiesScanned,
857
1097
  fullRebuilds: this.fullRebuilds,
@@ -871,6 +1111,7 @@ export class PersistentRenderScene {
871
1111
  ineligible: 0,
872
1112
  } satisfies BatchTopologyInspection),
873
1113
  gpu: this.inspectGpu(),
1114
+ pointsLines,
874
1115
  };
875
1116
  }
876
1117
 
@@ -886,6 +1127,44 @@ export class PersistentRenderScene {
886
1127
  };
887
1128
  }
888
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
+
1164
+ pointsLinesSnapshots(): readonly PointsLinesRetainedSnapshot[] {
1165
+ return this.composition?.projection.pointsLinesSnapshots() ?? [];
1166
+ }
1167
+
889
1168
  private inspectGpu(): PersistentGpuSceneInspection {
890
1169
  if (this.gpuStatus === 'resident' && this.gpuScene !== undefined) {
891
1170
  return { status: 'resident', ...this.gpuScene.inspect() };
@@ -906,9 +1185,12 @@ export class PersistentRenderScene {
906
1185
  leases?: readonly RenderReadLease[],
907
1186
  ): ExtractedFrame {
908
1187
  const candidateFrame = buildCandidateFrame();
1188
+ this.temporalCapture = undefined;
909
1189
  this.worldEntitiesScanned = candidateFrame.renderables.length;
910
1190
  const projection = new RenderScene();
911
1191
  projection.reset(candidateFrame.renderables);
1192
+ const transmissionDemand = new PersistentTransmissionDemandProjection();
1193
+ transmissionDemand.apply(transmissionDemandOperations(candidateFrame.renderables));
912
1194
  const topology = new BatchTopology();
913
1195
  topology.rebuild(projection.slotsSnapshot());
914
1196
  const token = {};
@@ -919,6 +1201,7 @@ export class PersistentRenderScene {
919
1201
  resourceOwner: owner.resourceOwner,
920
1202
  projection,
921
1203
  topology,
1204
+ transmissionDemand,
922
1205
  readCursors:
923
1206
  leases === undefined || leases.length !== worlds.length
924
1207
  ? []
@@ -936,7 +1219,20 @@ export class PersistentRenderScene {
936
1219
  this.syncGpuOwner(token, projection, undefined, true);
937
1220
  this.fullRebuilds += 1;
938
1221
  this.lastResyncReason = 'attach';
939
- 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
+ );
940
1236
  }
941
1237
 
942
1238
  /**
@@ -948,7 +1244,9 @@ export class PersistentRenderScene {
948
1244
  buildCandidateFrame: () => ExtractedFrame,
949
1245
  ): ExtractedFrame {
950
1246
  const candidateFrame = buildCandidateFrame();
951
- const candidates = entry.projection.materialize();
1247
+ const candidates = entry.projection
1248
+ .materialize()
1249
+ .map((snapshot) => entry.projection.withTemporal(snapshot));
952
1250
  return cullPersistentFrame({ ...candidateFrame, renderables: [...candidates] }, candidates);
953
1251
  }
954
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
+ }