@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
@@ -6,6 +6,7 @@ import type { ObservationUnavailableError, RenderError } from '../errors/render'
6
6
  import type { RenderFeature, RenderFeatureDiagnostics } from '../features/types';
7
7
  import type { MeshMaterialBindingObservation } from '../mesh-material-bindings';
8
8
  import type { FrameObservation, FrameObservationOptions } from '../record/frame';
9
+ import type { CurrentGraphTarget, GraphTargetCaptureRequest } from '../record/frame-snapshot';
9
10
  import type {
10
11
  DrawOwnerOptions,
11
12
  FrameObservationRequest,
@@ -81,6 +82,9 @@ export interface RendererLegacyHostAdapter {
81
82
  observeCurrentFrame(
82
83
  options: FrameObservationOptions,
83
84
  ): Promise<RenderResult<FrameObservation, ObservationUnavailableError>>;
85
+ /** @internal Test-only current compiled graph target diagnostic. */
86
+ getCurrentGraphTarget(name: string): CurrentGraphTarget | undefined;
87
+ requestGraphTargetCapture(request: GraphTargetCaptureRequest): void;
84
88
  onLost(listener: RendererLostListener): () => void;
85
89
  onError(listener: RendererErrorListener): () => void;
86
90
  health(): HealthSnapshot;
@@ -0,0 +1,75 @@
1
+ /** Staged frame state committed only after the renderer submit barrier. */
2
+ export interface RendererFrameTransaction<T> {
3
+ readonly candidate: T;
4
+ readonly commit: () => T;
5
+ readonly abort: () => void;
6
+ }
7
+
8
+ export function stageRendererFrame<T>(
9
+ candidate: T,
10
+ onAbort: () => void = () => undefined,
11
+ ): RendererFrameTransaction<T> {
12
+ let closed = false;
13
+ return {
14
+ candidate,
15
+ commit: () => {
16
+ if (closed) throw new Error('renderer frame transaction is closed');
17
+ closed = true;
18
+ return candidate;
19
+ },
20
+ abort: () => {
21
+ if (closed) return;
22
+ closed = true;
23
+ onAbort();
24
+ },
25
+ };
26
+ }
27
+
28
+ export type RendererFrameStage = 'build' | 'execute' | 'finish' | 'submit';
29
+
30
+ export interface RendererFrameStageFailure {
31
+ readonly stage: RendererFrameStage;
32
+ }
33
+
34
+ export type RendererFrameStageResult<T> =
35
+ | { readonly ok: true; readonly value: T }
36
+ | { readonly ok: false; readonly stage: RendererFrameStage };
37
+
38
+ export interface RendererFrameTransactionSteps<T> {
39
+ readonly build: () => RendererFrameStageResult<T>;
40
+ readonly execute: (candidate: T) => RendererFrameStageResult<void>;
41
+ readonly finish: (candidate: T) => RendererFrameStageResult<void>;
42
+ readonly submit: (candidate: T) => RendererFrameStageResult<void>;
43
+ readonly commit: (candidate: T) => void;
44
+ readonly abort?: (failure: RendererFrameStageFailure) => void;
45
+ }
46
+
47
+ /**
48
+ * Run the four renderer stages behind one commit barrier. A stage can expose
49
+ * only a structured failure; the candidate is never published until submit
50
+ * has returned success, so a failed frame cannot advance last-known-good state.
51
+ */
52
+ export function executeRendererFrameTransaction<T>(
53
+ steps: RendererFrameTransactionSteps<T>,
54
+ ):
55
+ | { readonly ok: true; readonly value: T }
56
+ | { readonly ok: false; readonly error: RendererFrameStageFailure } {
57
+ const fail = (
58
+ stage: RendererFrameStage,
59
+ ): { readonly ok: false; readonly error: RendererFrameStageFailure } => {
60
+ const error = { stage } as const;
61
+ steps.abort?.(error);
62
+ return { ok: false, error };
63
+ };
64
+
65
+ const built = steps.build();
66
+ if (!built.ok) return fail('build');
67
+ const executed = steps.execute(built.value);
68
+ if (!executed.ok) return fail('execute');
69
+ const finished = steps.finish(built.value);
70
+ if (!finished.ok) return fail('finish');
71
+ const submitted = steps.submit(built.value);
72
+ if (!submitted.ok) return fail('submit');
73
+ steps.commit(built.value);
74
+ return { ok: true, value: built.value };
75
+ }
@@ -0,0 +1,112 @@
1
+ import type { CompiledRenderGraphInfo } from '@forgeax/engine-render-graph';
2
+ import type { RhiCanvasSurfacePresentationProof, TextureFormat } from '@forgeax/engine-rhi';
3
+ import {
4
+ type RenderOutputInspection,
5
+ type RenderStandardOutputColorInspection,
6
+ STANDARD_OUTPUT_TRANSFORM_FEATURE_ID,
7
+ } from '../render-contract';
8
+
9
+ /** Inputs owned by the renderer assembly for one detached output projection. */
10
+ export interface RendererOutputInspectionInput {
11
+ readonly graph: CompiledRenderGraphInfo | undefined;
12
+ readonly surfaceAvailable: boolean;
13
+ readonly surfaceStorage: TextureFormat;
14
+ readonly surfaceDisplay: TextureFormat;
15
+ readonly surfaceProfile?: 'dual-view' | 'raw-only';
16
+ readonly rgba16floatRenderable: boolean;
17
+ readonly presentationProof?: RhiCanvasSurfacePresentationProof | undefined;
18
+ }
19
+
20
+ function isSrgbFormat(format: TextureFormat): boolean {
21
+ return format === 'rgba8unorm-srgb' || format === 'bgra8unorm-srgb';
22
+ }
23
+
24
+ function writesSurface(pass: CompiledRenderGraphInfo['passes'][number]): boolean {
25
+ return pass.accesses.some(
26
+ (access) =>
27
+ (access.resource === 'surface' || access.resource.startsWith('surface.')) &&
28
+ access.usage === 'color-attachment',
29
+ );
30
+ }
31
+
32
+ /**
33
+ * Project output facts from the committed graph and physical surface only.
34
+ * Profile fields are deliberately not consulted: a transform pass, a real
35
+ * intermediate target, and the final endpoint/domain are graph facts.
36
+ */
37
+ export function projectRendererOutputInspection(
38
+ input: RendererOutputInspectionInput,
39
+ ): RenderOutputInspection {
40
+ const graph = input.graph;
41
+ const outputTransformPass = graph?.passes.find(
42
+ (pass) => pass.name === 'output-transform' || pass.name === 'present',
43
+ );
44
+ const surfaceResource = graph?.resources.find(
45
+ (resource) => resource.kind === 'texture' && resource.label === 'surface',
46
+ );
47
+ const writesFinalSurface = graph?.passes.some(writesSurface) === true;
48
+ const surfaceDomain =
49
+ surfaceResource?.descriptor?.kind === 'texture' ? surfaceResource.descriptor.domain : undefined;
50
+ const directEncodedSurface =
51
+ writesFinalSurface && surfaceDomain === 'display-encoded' && isSrgbFormat(input.surfaceDisplay);
52
+ const displayEncoded =
53
+ input.surfaceAvailable &&
54
+ writesFinalSurface &&
55
+ (outputTransformPass !== undefined || directEncodedSurface);
56
+ const intermediate = graph?.resources.find(
57
+ (resource) =>
58
+ resource.kind === 'texture' &&
59
+ resource.label === 'standard-output-color' &&
60
+ resource.descriptor?.kind === 'texture',
61
+ );
62
+ const standardOutputColor: RenderStandardOutputColorInspection | undefined =
63
+ intermediate?.descriptor?.kind === 'texture'
64
+ ? {
65
+ format: intermediate.descriptor.format,
66
+ ...(intermediate.descriptor.domain === undefined
67
+ ? {}
68
+ : { domain: intermediate.descriptor.domain }),
69
+ width: intermediate.descriptor.width,
70
+ height: intermediate.descriptor.height,
71
+ sampleCount: intermediate.descriptor.sampleCount,
72
+ usage: intermediate.derivedUsage,
73
+ }
74
+ : undefined;
75
+ const outputReady = input.surfaceAvailable && displayEncoded;
76
+
77
+ return {
78
+ ...(outputTransformPass === undefined
79
+ ? {}
80
+ : { outputTransform: STANDARD_OUTPUT_TRANSFORM_FEATURE_ID }),
81
+ displayEncoded,
82
+ ...(intermediate?.descriptor?.kind === 'texture'
83
+ ? { intermediateFormat: intermediate.descriptor.format }
84
+ : {}),
85
+ ...(input.surfaceProfile === undefined ? {} : { surfaceProfile: input.surfaceProfile }),
86
+ graphPassNames: graph?.passes.map((pass) => pass.name) ?? [],
87
+ ...(standardOutputColor === undefined ? {} : { standardOutputColor }),
88
+ surfaceStorage: input.surfaceStorage,
89
+ surfaceDisplay: input.surfaceDisplay,
90
+ endpoint: 'surface.storage.raw',
91
+ capability: outputReady
92
+ ? input.rgba16floatRenderable
93
+ ? 'rgba16float-renderable'
94
+ : 'surface-raw-endpoint'
95
+ : 'unavailable',
96
+ ...(input.presentationProof === undefined
97
+ ? {}
98
+ : { presentationProof: input.presentationProof }),
99
+ error: outputReady
100
+ ? undefined
101
+ : {
102
+ code: 'inspection-facts-unavailable',
103
+ expected: 'a committed graph writes an encoded surface endpoint',
104
+ hint: 'draw a frame before consuming output inspection facts',
105
+ },
106
+ };
107
+ }
108
+
109
+ /** Detached inspection projection helper; live renderer objects never cross this boundary. */
110
+ export function detachRendererInspection<T extends object>(inspection: T): Readonly<T> {
111
+ return Object.freeze({ ...inspection });
112
+ }
@@ -0,0 +1,6 @@
1
+ import type { RendererState } from '../render-contract';
2
+
3
+ /** Lifecycle states that may accept a new frame operation. */
4
+ export function isRendererStateOperational(state: RendererState): boolean {
5
+ return state === 'alive';
6
+ }
@@ -0,0 +1,14 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { MotionBlur } from '../motion-blur';
3
+
4
+ describe('MotionBlur component schema', () => {
5
+ it('is a single-semantic component with bounded authoring fields', () => {
6
+ expect(MotionBlur.name).toBe('MotionBlur');
7
+ expect(MotionBlur.fields).toMatchObject({
8
+ shutterAngle: { type: 'f32', default: 180 },
9
+ maxRadiusPixels: { type: 'f32', default: 32 },
10
+ sampleCount: { type: 'f32', default: 8 },
11
+ });
12
+ expect(MotionBlur.fields).not.toHaveProperty('enabled');
13
+ });
14
+ });
@@ -1,10 +1,15 @@
1
1
  import { describe, expect, it } from 'vitest';
2
- import { Camera, DirectionalLight, MeshFilter } from '../index';
2
+ import { ANTIALIAS_TAA, Atmosphere, Camera, DirectionalLight, Fog, MeshFilter } from '../index';
3
3
 
4
4
  describe('canonical render schema owners', () => {
5
5
  it('keeps mesh, light, and camera facts on their component owners', () => {
6
6
  expect(MeshFilter.fields.assetHandle.type).toBe('shared<MeshAsset>');
7
7
  expect(DirectionalLight.fields.direction.type).toBe('array<f32, 3>');
8
8
  expect(Camera.fields.projection.default).toBe(0);
9
+ expect(Camera.fields.antialias.default).toBe(0);
10
+ expect(Camera.fields.historyVersion.default).toBe(0);
11
+ expect(ANTIALIAS_TAA).toBe(3);
12
+ expect(Atmosphere.fields.turbidity.type).toBe('f32');
13
+ expect(Fog.fields.density.type).toBe('f32');
9
14
  });
10
15
  });
@@ -0,0 +1,10 @@
1
+ import { defineComponent } from '@forgeax/engine-ecs';
2
+
3
+ /** Analytic atmosphere authoring facts; the directional light supplies the sun. */
4
+ export const Atmosphere = defineComponent('Atmosphere', {
5
+ turbidity: { type: 'f32', default: 2 },
6
+ rayleigh: { type: 'f32', default: 1 },
7
+ mieCoefficient: { type: 'f32', default: 0.005 },
8
+ mieDirectionalG: { type: 'f32', default: 0.8 },
9
+ sunAngularRadius: { type: 'f32', default: 0.004675 },
10
+ });
@@ -349,7 +349,8 @@ export const Camera = defineComponent('Camera', {
349
349
  // token's schema, which is itself derived from Camera.fields[k].type (D-A7).
350
350
  // This replaces the hand-maintained CameraDataPod interface — the field set
351
351
  // lives exclusively in the Camera component definition above.
352
- type CameraPod = ShapeOf<SchemaOf<typeof Camera>>;
352
+ export type CameraData = ShapeOf<SchemaOf<typeof Camera>>;
353
+ type CameraPod = CameraData;
353
354
 
354
355
  // ─── Camera factory functions (w13 SSOT refactoring) ─────────────────────
355
356
  //
@@ -0,0 +1,9 @@
1
+ import { defineComponent } from '@forgeax/engine-ecs';
2
+
3
+ /** Optional height-aware aerial fog, independent from environment source. */
4
+ export const Fog = defineComponent('Fog', {
5
+ color: { type: 'array<f32, 3>', default: new Float32Array([0.5, 0.5, 0.5]) },
6
+ density: { type: 'f32', default: 0.01 },
7
+ heightFalloff: { type: 'f32', default: 0 },
8
+ maxOpacity: { type: 'f32', default: 1 },
9
+ });
@@ -1,10 +1,13 @@
1
+ export * from './atmosphere';
1
2
  export * from './camera';
2
3
  export * from './directional-light';
4
+ export * from './fog';
3
5
  export { Instances, type InstancesData } from './instances';
4
6
  export { Layer } from './layer';
5
7
  export { Lines } from './lines';
6
8
  export * from './mesh-filter';
7
9
  export * from './mesh-renderer';
10
+ export { MotionBlur } from './motion-blur';
8
11
  export { PointLight } from './point-light';
9
12
  export { PointLightShadow } from './point-light-shadow';
10
13
  export {
@@ -0,0 +1,8 @@
1
+ import { defineComponent } from '@forgeax/engine-ecs';
2
+
3
+ /** Active-camera motion blur authoring data; presence enables the feature. */
4
+ export const MotionBlur = defineComponent('MotionBlur', {
5
+ shutterAngle: { type: 'f32', default: 180 },
6
+ maxRadiusPixels: { type: 'f32', default: 32 },
7
+ sampleCount: { type: 'f32', default: 8 },
8
+ });
@@ -1,5 +1,5 @@
1
1
  import type { AssetRegistry } from '@forgeax/engine-assets-runtime';
2
- import type { RhiBackendPack } from './assembly/backend-contract';
2
+ import { EngineEnvironmentError, type RhiBackendPack } from './assembly/backend-contract';
3
3
  import type { BundlerOptions } from './assembly/factory';
4
4
  import { createRenderer, exposeRenderer } from './assembly/factory';
5
5
  import type {
@@ -30,12 +30,46 @@ export interface RendererHostAssembly {
30
30
  readonly assets: AssetRegistry;
31
31
  }
32
32
 
33
+ function describeRendererInitializationFailure(error: unknown): string {
34
+ const candidate = error as unknown as {
35
+ readonly code?: unknown;
36
+ readonly hint?: unknown;
37
+ readonly detail?: unknown;
38
+ };
39
+ const detail = candidate.detail;
40
+ if (typeof detail === 'object' && detail !== null && 'compilerMessages' in detail) {
41
+ const messages = (detail as { readonly compilerMessages?: unknown }).compilerMessages;
42
+ if (Array.isArray(messages)) {
43
+ const compilerMessages = messages.map((message) => {
44
+ const value = message as {
45
+ readonly message?: unknown;
46
+ readonly type?: unknown;
47
+ readonly lineNum?: unknown;
48
+ readonly linePos?: unknown;
49
+ readonly offset?: unknown;
50
+ readonly length?: unknown;
51
+ };
52
+ return {
53
+ message: value.message,
54
+ type: value.type,
55
+ lineNum: value.lineNum,
56
+ linePos: value.linePos,
57
+ offset: value.offset,
58
+ length: value.length,
59
+ };
60
+ });
61
+ return `${String(candidate.code)}: ${String(candidate.hint)}; detail=${JSON.stringify({ compilerMessages })}`;
62
+ }
63
+ }
64
+ return `${String(candidate.code)}: ${String(candidate.hint)}; detail=${JSON.stringify(detail)}`;
65
+ }
66
+
33
67
  export async function constructRendererHost(
34
68
  canvas: unknown,
35
69
  options?: RendererOptions,
36
70
  bundler?: BundlerOptions,
37
71
  backend?: RhiBackendPack,
38
- ): Promise<RenderResult<RendererHostAssembly, RenderError>> {
72
+ ): Promise<RenderResult<RendererHostAssembly, RenderError | EngineEnvironmentError>> {
39
73
  try {
40
74
  const implementation = await createRenderer(canvas, options, bundler, backend);
41
75
  const ready = await implementation.initialization;
@@ -44,7 +78,7 @@ export async function constructRendererHost(
44
78
  ok: false,
45
79
  error: new RendererContractFailureError(
46
80
  'construct',
47
- `${ready.error.code}: ${ready.error.hint}`,
81
+ describeRendererInitializationFailure(ready.error),
48
82
  ),
49
83
  };
50
84
  }
@@ -58,6 +92,9 @@ export async function constructRendererHost(
58
92
  },
59
93
  };
60
94
  } catch (cause) {
95
+ if (cause instanceof EngineEnvironmentError) {
96
+ return { ok: false, error: cause };
97
+ }
61
98
  const detail = cause instanceof Error ? cause.message : String(cause);
62
99
  return {
63
100
  ok: false,
@@ -77,6 +77,15 @@ export class DeviceScope {
77
77
  return [...this.children];
78
78
  }
79
79
 
80
+ /** Create a renderer-owned child scope without exposing a second device owner. */
81
+ createChild(owner: string): DeviceScope {
82
+ if (this.lifecycleState !== 'active') {
83
+ throw new Error('Cannot create a child DeviceScope from an inactive scope.');
84
+ }
85
+ if (owner.length === 0) throw new TypeError('DeviceScope child owner must not be empty.');
86
+ return new DeviceScope(this.generation, owner, this);
87
+ }
88
+
80
89
  ref<T>(kind: DeviceResourceKind, value: T): ResourceRef<T> {
81
90
  const ref = new DeviceResourceRef(kind, this.owner, this.generation, value);
82
91
  this.resources.push({ ref: ref as DeviceResourceRef<unknown>, cleanup: () => undefined });
@@ -128,8 +137,13 @@ export class DeviceScope {
128
137
  return resources;
129
138
  }
130
139
 
140
+ /** Mark an active child as retiring without releasing in-flight resources. */
141
+ beginRetire(): void {
142
+ if (this.lifecycleState === 'active') this.lifecycleState = 'retiring';
143
+ }
144
+
131
145
  retire(): void {
132
- if (this.lifecycleState !== 'active') return;
146
+ if (this.lifecycleState !== 'active' && this.lifecycleState !== 'retiring') return;
133
147
  this.lifecycleState = 'retiring';
134
148
  this._clearResources();
135
149
  this.lifecycleState = 'retired';
@@ -0,0 +1,185 @@
1
+ import { err, ok, type Result } from '@forgeax/engine-types';
2
+ import { EnvironmentSourceConflictError, FogCardinalityError } from '../errors/render';
3
+ import type {
4
+ EnvironmentCandidate,
5
+ EnvironmentFrame,
6
+ EnvironmentSource,
7
+ FogCandidate,
8
+ FogFrame,
9
+ } from '../extract/environment';
10
+ import { validateAtmosphereParameters } from '../extract/environment';
11
+ import { environmentFactSignatures } from './signature';
12
+
13
+ export type { EnvironmentCandidate, EnvironmentFrame, EnvironmentSource, FogCandidate, FogFrame };
14
+
15
+ export interface SunCandidate {
16
+ readonly entityKey: number;
17
+ readonly direction: readonly [number, number, number];
18
+ readonly color: readonly [number, number, number];
19
+ readonly intensity: number;
20
+ }
21
+
22
+ export interface EnvironmentSelectionInput {
23
+ readonly environments: readonly EnvironmentCandidate[];
24
+ readonly fogs: readonly FogCandidate[];
25
+ readonly suns: readonly SunCandidate[];
26
+ readonly lane: 'direct' | 'clustered';
27
+ }
28
+
29
+ export interface EnvironmentSelectionParameterDetail {
30
+ readonly field: string;
31
+ readonly value: number;
32
+ }
33
+
34
+ export class EnvironmentSelectionParameterError extends Error {
35
+ readonly code = 'environment-selection-invalid' as const;
36
+ readonly expected: string;
37
+ readonly hint: string;
38
+ readonly detail: EnvironmentSelectionParameterDetail;
39
+
40
+ constructor(field: string, value: number, expected: string) {
41
+ super(`environment selection field ${field} is invalid`);
42
+ this.name = 'EnvironmentSelectionParameterError';
43
+ this.expected = expected;
44
+ this.hint = `set ${field} to a finite value satisfying ${expected}`;
45
+ this.detail = { field, value };
46
+ }
47
+ }
48
+
49
+ export interface SunCardinalityDetail {
50
+ readonly field: 'sun';
51
+ readonly value: number;
52
+ }
53
+
54
+ export class SunCardinalityError extends Error {
55
+ readonly code = 'sun-cardinality' as const;
56
+ readonly expected = 'atmosphere has exactly one sun owner';
57
+ readonly hint = 'add exactly one DirectionalLight sun for the atmosphere owner';
58
+ readonly detail: SunCardinalityDetail;
59
+
60
+ constructor(value: number) {
61
+ super(`atmosphere sun cardinality is ${value}`);
62
+ this.name = 'SunCardinalityError';
63
+ this.detail = { field: 'sun', value };
64
+ }
65
+ }
66
+
67
+ export interface EnvironmentSelectionErrorDetail {
68
+ readonly owners?: readonly {
69
+ readonly kind: 'image' | 'atmosphere';
70
+ readonly entityKey: number;
71
+ readonly sourceKey: string;
72
+ }[];
73
+ readonly field?: string;
74
+ readonly value?: number;
75
+ readonly count?: number;
76
+ }
77
+
78
+ export interface EnvironmentSelectionError {
79
+ readonly code:
80
+ | 'environment-source-conflict'
81
+ | 'fog-cardinality'
82
+ | 'environment-selection-invalid'
83
+ | 'atmosphere-invalid-parameter'
84
+ | 'sun-cardinality';
85
+ readonly expected: string;
86
+ readonly hint: string;
87
+ readonly detail: EnvironmentSelectionErrorDetail;
88
+ }
89
+
90
+ export interface SelectedEnvironmentFrame extends EnvironmentFrame {
91
+ readonly sun: SunCandidate | undefined;
92
+ readonly lane: 'direct' | 'clustered';
93
+ }
94
+
95
+ function freezeCandidate<T extends object>(candidate: T): T {
96
+ return Object.freeze(candidate);
97
+ }
98
+
99
+ function freezeFog(candidate: FogCandidate): FogFrame {
100
+ return Object.freeze({
101
+ ...candidate,
102
+ color: Object.freeze([...candidate.color] as unknown as FogFrame['color']),
103
+ });
104
+ }
105
+
106
+ function validFog(candidate: FogCandidate): boolean {
107
+ return (
108
+ candidate.color.every(Number.isFinite) &&
109
+ Number.isFinite(candidate.density) &&
110
+ candidate.density >= 0 &&
111
+ Number.isFinite(candidate.heightFalloff) &&
112
+ candidate.heightFalloff >= 0 &&
113
+ Number.isFinite(candidate.maxOpacity) &&
114
+ candidate.maxOpacity >= 0 &&
115
+ candidate.maxOpacity <= 1
116
+ );
117
+ }
118
+
119
+ /** Select one immutable frame fact set for both Standard lighting lanes. */
120
+ export function selectEnvironment(
121
+ input: EnvironmentSelectionInput,
122
+ ): Result<SelectedEnvironmentFrame, EnvironmentSelectionError> {
123
+ if (input.environments.length > 1) {
124
+ return err(
125
+ new EnvironmentSourceConflictError(
126
+ [...input.environments]
127
+ .sort((left, right) => left.entityKey - right.entityKey)
128
+ .map(({ kind, entityKey, sourceKey }) => ({ kind, entityKey, sourceKey })),
129
+ ),
130
+ );
131
+ }
132
+ if (input.fogs.length > 1) return err(new FogCardinalityError(input.fogs.length));
133
+ const selectedFog = input.fogs[0];
134
+ if (selectedFog !== undefined && !validFog(selectedFog)) {
135
+ const field =
136
+ !Number.isFinite(selectedFog.density) || selectedFog.density < 0
137
+ ? 'density'
138
+ : !Number.isFinite(selectedFog.heightFalloff) || selectedFog.heightFalloff < 0
139
+ ? 'heightFalloff'
140
+ : 'maxOpacity';
141
+ return err(
142
+ new EnvironmentSelectionParameterError(field, selectedFog[field], 'finite and in range'),
143
+ );
144
+ }
145
+ const selected = input.environments[0];
146
+ if (selected?.kind === 'atmosphere') {
147
+ const invalid = validateAtmosphereParameters(selected.atmosphere);
148
+ if (invalid !== undefined) return err(invalid);
149
+ }
150
+ if (selected?.kind === 'atmosphere' && input.suns.length !== 1) {
151
+ return err(new SunCardinalityError(input.suns.length));
152
+ }
153
+ const source: EnvironmentSource =
154
+ selected === undefined
155
+ ? { kind: 'none' }
156
+ : selected.kind === 'atmosphere'
157
+ ? {
158
+ kind: 'atmosphere',
159
+ entityKey: selected.entityKey,
160
+ sourceKey: selected.sourceKey,
161
+ atmosphere: Object.freeze({ ...selected.atmosphere }),
162
+ }
163
+ : {
164
+ kind: 'image',
165
+ entityKey: selected.entityKey,
166
+ sourceKey: selected.sourceKey,
167
+ };
168
+ const sun = input.suns[0] === undefined ? undefined : freezeCandidate({ ...input.suns[0] });
169
+ const fog = selectedFog === undefined ? undefined : freezeFog(selectedFog);
170
+ const signatureInput = {
171
+ environments: selected === undefined ? [] : [selected],
172
+ fogs: selectedFog === undefined ? [] : [selectedFog],
173
+ suns: input.suns,
174
+ };
175
+ const signatures = environmentFactSignatures(signatureInput);
176
+ const result = {
177
+ source: Object.freeze(source),
178
+ fog,
179
+ ...signatures,
180
+ revision: 0,
181
+ sun,
182
+ } as SelectedEnvironmentFrame;
183
+ Object.defineProperty(result, 'lane', { value: input.lane, enumerable: false });
184
+ return ok(Object.freeze(result));
185
+ }
@@ -0,0 +1,23 @@
1
+ import type { DeviceScope } from '../device/device-scope';
2
+ import type { EnvironmentFrame } from './frame';
3
+
4
+ export interface EnvironmentGeneration {
5
+ readonly signature: string;
6
+ readonly generation: number;
7
+ readonly lane: 'direct' | 'clustered';
8
+ readonly scope: DeviceScope;
9
+ readonly liveHandle: object;
10
+ readonly resourceCount: number;
11
+ readonly resourceBytes: number;
12
+ retired: boolean;
13
+ }
14
+
15
+ export interface EnvironmentGenerationFailure {
16
+ readonly failureAt?: 'prepare' | 'build' | 'execute' | 'finish' | 'submit';
17
+ }
18
+
19
+ export interface EnvironmentGenerationState {
20
+ readonly frame: EnvironmentFrame;
21
+ readonly scope: DeviceScope;
22
+ readonly generation: number;
23
+ }
@@ -0,0 +1,9 @@
1
+ import type { EnvironmentFrame } from './frame';
2
+
3
+ /** Both Standard lanes consume the same selected CPU environment facts. */
4
+ export function sharedEnvironmentFrame(
5
+ frame: EnvironmentFrame,
6
+ _lane: 'direct' | 'clustered',
7
+ ): EnvironmentFrame {
8
+ return frame;
9
+ }