@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
@@ -13,6 +13,11 @@
13
13
  // SpotLight / PointLightShadow component validators (forward cross-directory
14
14
  // import, no cycle -- research Finding C2).
15
15
 
16
+ import type {
17
+ RenderSurfaceFailureDetail,
18
+ SurfaceFailureCode,
19
+ SurfaceFailureKind,
20
+ } from '@forgeax/engine-render-graph';
16
21
  import type { DeviceResourceKind, DeviceScopeReceipt } from '../device/resource-types';
17
22
  import type {
18
23
  PreparedKind,
@@ -20,6 +25,8 @@ import type {
20
25
  RenderFeatureRecovery,
21
26
  RenderFeatureStage,
22
27
  } from '../features/vocabulary';
28
+ import type { SceneDataLane, SceneDataSchemaId } from '../temporal/scene-data';
29
+ import type { TransmissionCapabilityFact } from '../transmission/backdrop';
23
30
 
24
31
  export interface LifecycleConstructionFailureDetail {
25
32
  readonly owner: string;
@@ -47,6 +54,68 @@ export class LifecycleConstructionError extends Error {
47
54
  }
48
55
  }
49
56
 
57
+ const SURFACE_FAILURE_POLICY: Readonly<
58
+ Record<SurfaceFailureCode, { readonly expected: string; readonly hint: string }>
59
+ > = {
60
+ 'surface-allocation-failed': {
61
+ expected: 'the required surface resource can be allocated with its declared format and usage',
62
+ hint: 'inspect the capability detail, release transient resources, and retry the candidate graph',
63
+ },
64
+ 'surface-attachment-failed': {
65
+ expected: 'the float target is renderable as the declared attachment',
66
+ hint: 'verify float color attachment support and retry without hiding the failure',
67
+ },
68
+ 'surface-sampled-read-failed': {
69
+ expected: 'the float target can be sampled by the next post-processing stage',
70
+ hint: 'verify sampled-read support for the declared format before rebuilding the graph',
71
+ },
72
+ 'surface-view-domain-failed': {
73
+ expected: 'surface storage and display views preserve their declared color domains',
74
+ hint: 'repair the explicit format/domain pair and retry the candidate graph',
75
+ },
76
+ 'surface-raw-endpoint-failed': {
77
+ expected: 'the surface presentation endpoint has descriptor, acquisition, and validation proof',
78
+ hint: 'run the concrete presentation probe; keep the last-known-good surface when proof is absent',
79
+ },
80
+ };
81
+
82
+ /** Render-surface failure with an exhaustive code and actionable detail. */
83
+ export class RenderSurfaceError<
84
+ Code extends SurfaceFailureCode = SurfaceFailureCode,
85
+ > extends Error {
86
+ readonly code: Code;
87
+ readonly expected: string;
88
+ readonly hint: string;
89
+ readonly detail: RenderSurfaceFailureDetail;
90
+
91
+ constructor(code: Code, detail: RenderSurfaceFailureDetail) {
92
+ const policy = SURFACE_FAILURE_POLICY[code];
93
+ if (policy === undefined) {
94
+ throw new Error(`unknown render surface failure code: ${code}`);
95
+ }
96
+ super(`[RenderSurfaceError ${code}] expected: ${policy.expected}; hint: ${policy.hint}`);
97
+ this.name = 'RenderSurfaceError';
98
+ this.code = code;
99
+ this.expected = policy.expected;
100
+ this.hint = policy.hint;
101
+ this.detail = detail;
102
+ }
103
+ }
104
+
105
+ export type { RenderSurfaceFailureDetail, SurfaceFailureCode, SurfaceFailureKind };
106
+
107
+ export type RenderSurfaceExpectedError = {
108
+ readonly [Code in SurfaceFailureCode]: RenderSurfaceError<Code>;
109
+ }[SurfaceFailureCode];
110
+
111
+ /** Construct the closed surface error from its failure-stage discriminant. */
112
+ export function createRenderSurfaceError(
113
+ kind: SurfaceFailureKind,
114
+ detail: RenderSurfaceFailureDetail,
115
+ ): RenderSurfaceExpectedError {
116
+ return new RenderSurfaceError(`surface-${kind}-failed` as SurfaceFailureCode, detail);
117
+ }
118
+
50
119
  // ── ShadowInvalidConfigError ──────────────────────────────────────────────
51
120
 
52
121
  /**
@@ -563,6 +632,36 @@ export class MaterialSkinAttrMissingError extends Error {
563
632
  }
564
633
  }
565
634
 
635
+ export interface TransmissionCapabilityMissingDetail {
636
+ readonly material: string;
637
+ readonly capability: 'transmission';
638
+ readonly stage: 'prepare' | 'record';
639
+ readonly lane: 'standard-forward';
640
+ readonly format: string;
641
+ readonly missing: readonly TransmissionCapabilityFact[];
642
+ }
643
+
644
+ export class TransmissionCapabilityMissingError extends Error {
645
+ readonly code = 'transmission-capability-missing' as const;
646
+ readonly expected = 'the renderer exposes the transmission capability for this material';
647
+ readonly hint = 'disable transmission or provide the renderer capability before drawing';
648
+ readonly detail: TransmissionCapabilityMissingDetail;
649
+
650
+ constructor(
651
+ material: string,
652
+ stage: 'prepare' | 'record',
653
+ evidence: {
654
+ readonly lane: 'standard-forward';
655
+ readonly format: string;
656
+ readonly missing: readonly TransmissionCapabilityFact[];
657
+ },
658
+ ) {
659
+ super(`transmission capability is missing for material '${material}'`);
660
+ this.name = 'TransmissionCapabilityMissingError';
661
+ this.detail = { material, capability: 'transmission', stage, ...evidence };
662
+ }
663
+ }
664
+
566
665
  // -- RenderFeature errors ---------------------------------------------------
567
666
 
568
667
  export type RenderFeatureErrorCode =
@@ -931,6 +1030,63 @@ export class ObservationUnavailableError extends Error {
931
1030
  }
932
1031
  }
933
1032
 
1033
+ export type SceneDataUnavailableReason =
1034
+ | 'capability-missing'
1035
+ | 'producer-missing'
1036
+ | 'coverage-incomplete'
1037
+ | 'renderer-recovering';
1038
+ export interface SceneDataUnavailableDetail {
1039
+ readonly featureIdentity: string;
1040
+ readonly schema: SceneDataSchemaId;
1041
+ readonly lane: SceneDataLane;
1042
+ readonly reason: SceneDataUnavailableReason;
1043
+ readonly missingContributorIds: readonly string[];
1044
+ readonly omittedMissingContributorCount: number;
1045
+ readonly recovery: 'enable-capability' | 'next-frame' | 'renderer-recover';
1046
+ }
1047
+ export class SceneDataUnavailableError extends Error {
1048
+ readonly code = 'scene-data-unavailable' as const;
1049
+ readonly expected = 'the requested semantic scene data is available for the active plan';
1050
+ readonly hint: string;
1051
+ readonly detail: SceneDataUnavailableDetail;
1052
+ constructor(detail: SceneDataUnavailableDetail) {
1053
+ const hint =
1054
+ detail.recovery === 'enable-capability'
1055
+ ? 'enable rgba16floatRenderable and retry the current frame'
1056
+ : detail.recovery === 'renderer-recover'
1057
+ ? 'wait for renderer recovery, then retry the frame'
1058
+ : 'restore the producer coverage and retry on the next frame';
1059
+ super(`scene data '${detail.schema}' unavailable for '${detail.featureIdentity}'`);
1060
+ this.name = 'SceneDataUnavailableError';
1061
+ this.hint = hint;
1062
+ this.detail = Object.freeze({
1063
+ ...detail,
1064
+ missingContributorIds: Object.freeze([...detail.missingContributorIds].slice(0, 32)),
1065
+ omittedMissingContributorCount: Math.max(
1066
+ detail.omittedMissingContributorCount,
1067
+ Math.max(0, detail.missingContributorIds.length - 32),
1068
+ ),
1069
+ });
1070
+ }
1071
+ }
1072
+
1073
+ export class TaaUnavailableError extends Error {
1074
+ readonly code = 'taa-unavailable' as const;
1075
+ readonly expected =
1076
+ 'Standard TAA has a renderable rgba16float target and a complete resolve path';
1077
+ readonly hint =
1078
+ 'enable rgba16float rendering or select none/fxaa explicitly; do not treat TAA as no-AA';
1079
+ readonly detail: {
1080
+ readonly reason: 'capability' | 'topology' | 'history';
1081
+ readonly observed?: string;
1082
+ };
1083
+ constructor(reason: 'capability' | 'topology' | 'history', observed?: string) {
1084
+ super(`taa-unavailable: ${reason}`);
1085
+ this.name = 'TaaUnavailableError';
1086
+ this.detail = observed === undefined ? { reason } : { reason, observed };
1087
+ }
1088
+ }
1089
+
934
1090
  export interface FrameReceiptStaleDetail {
935
1091
  readonly frameId: number;
936
1092
  readonly receiptGeneration: number;
@@ -970,6 +1126,126 @@ export class RendererContractFailureError extends Error {
970
1126
  }
971
1127
  }
972
1128
 
1129
+ export interface EnvironmentSourceConflictDetail {
1130
+ readonly owners: readonly {
1131
+ readonly kind: 'image' | 'atmosphere';
1132
+ readonly entityKey: number;
1133
+ readonly sourceKey: string;
1134
+ }[];
1135
+ }
1136
+
1137
+ export class EnvironmentSourceConflictError extends Error {
1138
+ readonly code = 'environment-source-conflict' as const;
1139
+ readonly expected = 'exactly one environment source owns the frame';
1140
+ readonly hint = 'remove all but one image or atmosphere environment owner';
1141
+ readonly detail: EnvironmentSourceConflictDetail;
1142
+
1143
+ constructor(owners: readonly EnvironmentSourceConflictDetail['owners'][number][]) {
1144
+ super('environment source owners conflict');
1145
+ this.name = 'EnvironmentSourceConflictError';
1146
+ this.detail = { owners: owners.map((owner) => Object.freeze({ ...owner })) };
1147
+ }
1148
+ }
1149
+
1150
+ export interface FogCardinalityDetail {
1151
+ readonly count: number;
1152
+ }
1153
+
1154
+ export class FogCardinalityError extends Error {
1155
+ readonly code = 'fog-cardinality' as const;
1156
+ readonly expected = 'zero or one Fog owner contributes to a frame';
1157
+ readonly hint = 'remove extra Fog owners so the resource owner has at most one';
1158
+ readonly detail: FogCardinalityDetail;
1159
+
1160
+ constructor(count: number) {
1161
+ super(`Fog owner cardinality is ${count}`);
1162
+ this.name = 'FogCardinalityError';
1163
+ this.detail = { count };
1164
+ }
1165
+ }
1166
+
1167
+ export interface TaaCapsInsufficientDetail {
1168
+ readonly required: readonly string[];
1169
+ readonly available: readonly string[];
1170
+ }
1171
+
1172
+ export class TaaCapsInsufficientError extends Error {
1173
+ readonly code = 'taa-caps-insufficient' as const;
1174
+ readonly expected = 'the backend exposes the capabilities required by TAA';
1175
+ readonly hint = 'select a backend with the required TAA capabilities or disable TAA on Camera';
1176
+ readonly detail: TaaCapsInsufficientDetail;
1177
+
1178
+ constructor(required: readonly string[], available: readonly string[]) {
1179
+ super('TAA capabilities are insufficient');
1180
+ this.name = 'TaaCapsInsufficientError';
1181
+ this.detail = { required: [...required], available: [...available] };
1182
+ }
1183
+ }
1184
+
1185
+ export interface EnvironmentGenerationFailedDetail {
1186
+ readonly sourceKey: string;
1187
+ readonly stage: 'prepare' | 'build' | 'execute' | 'finish' | 'submit';
1188
+ }
1189
+
1190
+ export class EnvironmentGenerationFailedError extends Error {
1191
+ readonly code = 'environment-generation-failed' as const;
1192
+ readonly expected = 'the selected environment generation completes its owner stage';
1193
+ readonly hint = 'inspect the stage and sourceKey, then retry after correcting the environment';
1194
+ readonly detail: EnvironmentGenerationFailedDetail;
1195
+
1196
+ constructor(sourceKey: string, stage: EnvironmentGenerationFailedDetail['stage']) {
1197
+ super(`environment generation failed during ${stage}`);
1198
+ this.name = 'EnvironmentGenerationFailedError';
1199
+ this.detail = { sourceKey, stage };
1200
+ }
1201
+ }
1202
+
1203
+ export interface AtmosphereInvalidParameterDetail {
1204
+ readonly field: string;
1205
+ readonly value: number;
1206
+ }
1207
+
1208
+ export interface AtmosphereParameterRange {
1209
+ readonly min: number;
1210
+ readonly max: number;
1211
+ }
1212
+
1213
+ export class AtmosphereInvalidParameterError extends Error {
1214
+ readonly code = 'atmosphere-invalid-parameter' as const;
1215
+ readonly expected: string;
1216
+ readonly hint: string;
1217
+ readonly detail: AtmosphereInvalidParameterDetail;
1218
+
1219
+ constructor(field: string, value: number, range: AtmosphereParameterRange) {
1220
+ super(`Atmosphere.${field} is invalid`);
1221
+ this.name = 'AtmosphereInvalidParameterError';
1222
+ this.detail = { field, value };
1223
+ const rangeText = Number.isFinite(range.max)
1224
+ ? `[${range.min}, ${range.max}]`
1225
+ : `>= ${range.min}`;
1226
+ this.expected = `Atmosphere.${field} must be finite and ${rangeText}`;
1227
+ this.hint = `set Atmosphere.${field} to a finite value ${rangeText}`;
1228
+ }
1229
+ }
1230
+
1231
+ export interface OwnerStageFailedDetail {
1232
+ readonly owner: 'environment' | 'temporal' | 'fog' | 'renderer';
1233
+ readonly stage: 'extract' | 'prepare' | 'record' | 'finish' | 'submit';
1234
+ }
1235
+
1236
+ export class OwnerStageFailedError extends Error {
1237
+ readonly code = 'owner-stage-failed' as const;
1238
+ readonly expected = 'the owner completes its current frame stage';
1239
+ readonly hint = 'inspect the owner and stage, keep the last-known-good frame, and retry';
1240
+ readonly detail: OwnerStageFailedDetail;
1241
+
1242
+ constructor(owner: OwnerStageFailedDetail['owner'], stage: OwnerStageFailedDetail['stage']) {
1243
+ super(`${owner} owner failed during ${stage}`);
1244
+ this.name = 'OwnerStageFailedError';
1245
+ this.detail = { owner, stage };
1246
+ }
1247
+ }
1248
+
973
1249
  export interface RendererOperationCause {
974
1250
  readonly code: string;
975
1251
  readonly expected: string;
@@ -1256,6 +1532,8 @@ export type RenderError =
1256
1532
  | FrameReceiptStaleError
1257
1533
  | RendererContractFailureError
1258
1534
  | ObservationUnavailableError
1535
+ | SceneDataUnavailableError
1536
+ | TaaUnavailableError
1259
1537
  | ShadowInvalidConfigError
1260
1538
  | EquirectProjectionFailedError
1261
1539
  | HdrpLightBudgetExceededError
@@ -1269,6 +1547,7 @@ export type RenderError =
1269
1547
  | SkinPaletteOverflowError
1270
1548
  | SkinMaterialMismatchError
1271
1549
  | MaterialSkinAttrMissingError
1550
+ | TransmissionCapabilityMissingError
1272
1551
  | RenderFeatureRegistrationConflictError
1273
1552
  | RenderFeatureStageFailedError
1274
1553
  | RenderFeatureCapabilityMissingError
@@ -1276,6 +1555,12 @@ export type RenderError =
1276
1555
  | RenderFeaturePreparationFailedError
1277
1556
  | RenderFeaturePreparedStateMismatchError
1278
1557
  | RenderFeatureDrawRecordingFailedError
1558
+ | EnvironmentSourceConflictError
1559
+ | FogCardinalityError
1560
+ | TaaCapsInsufficientError
1561
+ | EnvironmentGenerationFailedError
1562
+ | AtmosphereInvalidParameterError
1563
+ | OwnerStageFailedError
1279
1564
  | PointsLinesInvalidStyleError
1280
1565
  | PointsLinesTopologyMismatchError
1281
1566
  | PointsLinesStyleUnsupportedError
@@ -0,0 +1,78 @@
1
+ import type { EntityHandle, World } from '@forgeax/engine-ecs';
2
+ import { readRenderArrayView } from '@forgeax/engine-ecs/projection';
3
+ import { mat4, vec3 } from '@forgeax/engine-math';
4
+ import { Transform } from '@forgeax/engine-scene';
5
+ import {
6
+ antialiasFromF32,
7
+ bloomEnabledFromF32,
8
+ Camera,
9
+ cameraProjectionFromF32,
10
+ tonemapFromF32,
11
+ } from '../components/camera';
12
+ import { MotionBlur } from '../components/motion-blur';
13
+ import type { CameraSnapshot } from '../render-contract';
14
+ import { getActiveCamera, selectActiveCameraIndex } from '../systems/active-camera';
15
+
16
+ function readWorldMatrix(world: World, entity: EntityHandle): Float32Array | undefined {
17
+ const view = readRenderArrayView(world, entity, Transform, 'world');
18
+ return view === undefined ? undefined : new Float32Array(view);
19
+ }
20
+
21
+ /** Extract the selected camera once at the frame boundary. */
22
+ export function extractCameraSnapshots(world: World): CameraSnapshot[] {
23
+ const cameras: CameraSnapshot[] = [];
24
+ const cameraEntities: number[] = [];
25
+ const cameraQuery = world
26
+ .query({ read: [Camera], optional: [MotionBlur], with: [Transform] })
27
+ .unwrap();
28
+ for (const row of cameraQuery) {
29
+ const cam = row.get(Camera);
30
+ const motionBlur = row.get(MotionBlur);
31
+ const entity = row.entity as EntityHandle;
32
+ const worldMat = readWorldMatrix(world, entity);
33
+ if (worldMat === undefined) continue;
34
+ cameras.push({
35
+ entityKey: entity as number,
36
+ historyVersion: cam.historyVersion,
37
+ position: mat4.getTranslation(vec3.create(), worldMat),
38
+ world: worldMat,
39
+ fov: cam.fov,
40
+ aspect: cam.aspect,
41
+ near: cam.near,
42
+ far: cam.far,
43
+ projection: cameraProjectionFromF32(cam.projection),
44
+ orthoLeft: cam.left,
45
+ orthoRight: cam.right,
46
+ orthoBottom: cam.bottom,
47
+ orthoTop: cam.top,
48
+ tonemap: tonemapFromF32(cam.tonemap),
49
+ exposure: cam.exposure,
50
+ whitePoint: cam.whitePoint,
51
+ antialias: antialiasFromF32(cam.antialias),
52
+ bloom: bloomEnabledFromF32(cam.bloom),
53
+ bloomThreshold: cam.bloomThreshold,
54
+ bloomIntensity: cam.bloomIntensity,
55
+ bloomBlurRadius: cam.bloomBlurRadius,
56
+ clearColor: [
57
+ cam.clearColor[0] ?? 0,
58
+ cam.clearColor[1] ?? 0,
59
+ cam.clearColor[2] ?? 0,
60
+ cam.clearColor[3] ?? 1,
61
+ ],
62
+ ...(motionBlur === undefined
63
+ ? {}
64
+ : {
65
+ motionBlur: {
66
+ shutterAngle: motionBlur.shutterAngle,
67
+ maxRadiusPixels: motionBlur.maxRadiusPixels,
68
+ sampleCount: motionBlur.sampleCount,
69
+ },
70
+ }),
71
+ });
72
+ cameraEntities.push(entity as number);
73
+ }
74
+ const selected = selectActiveCameraIndex(cameraEntities, getActiveCamera(world)?.entity);
75
+ if (selected < 0) return cameras;
76
+ const camera = cameras[selected];
77
+ return camera === undefined ? cameras : [camera];
78
+ }
@@ -0,0 +1,171 @@
1
+ import type { World } from '@forgeax/engine-ecs';
2
+ import { err, ok, type Result } from '@forgeax/engine-types';
3
+ import { environmentFactSignatures } from '../environment/signature';
4
+ import {
5
+ AtmosphereInvalidParameterError,
6
+ type AtmosphereParameterRange,
7
+ EnvironmentSourceConflictError,
8
+ FogCardinalityError,
9
+ type RenderError,
10
+ } from '../errors/render';
11
+ import type { TemporalView } from '../temporal/view';
12
+
13
+ /** The retained projection's environment extraction owner. */
14
+ export interface EnvironmentExtractionContext {
15
+ readonly resourceOwner: number;
16
+ readonly world: World;
17
+ }
18
+
19
+ /** Keep environment reads at the resource-owner frame boundary. */
20
+ export function createEnvironmentExtractionContext(
21
+ world: World,
22
+ resourceOwner: number,
23
+ ): EnvironmentExtractionContext {
24
+ return Object.freeze({ world, resourceOwner });
25
+ }
26
+
27
+ export type EnvironmentCandidate =
28
+ | { readonly kind: 'image'; readonly entityKey: number; readonly sourceKey: string }
29
+ | {
30
+ readonly kind: 'atmosphere';
31
+ readonly entityKey: number;
32
+ readonly sourceKey: string;
33
+ readonly atmosphere: AtmosphereParameters;
34
+ };
35
+
36
+ export interface AtmosphereParameters {
37
+ readonly turbidity: number;
38
+ readonly rayleigh: number;
39
+ readonly mieCoefficient: number;
40
+ readonly mieDirectionalG: number;
41
+ readonly sunAngularRadius: number;
42
+ }
43
+
44
+ /** Shared CPU contract for values accepted by the atmosphere shaders. */
45
+ export const ATMOSPHERE_PARAMETER_RANGES: Readonly<
46
+ Record<keyof AtmosphereParameters, AtmosphereParameterRange>
47
+ > = Object.freeze({
48
+ turbidity: Object.freeze({ min: 1, max: 20 }),
49
+ rayleigh: Object.freeze({ min: 0, max: Number.POSITIVE_INFINITY }),
50
+ mieCoefficient: Object.freeze({ min: 0, max: Number.POSITIVE_INFINITY }),
51
+ mieDirectionalG: Object.freeze({ min: 0, max: 0.999 }),
52
+ sunAngularRadius: Object.freeze({ min: 0, max: Number.POSITIVE_INFINITY }),
53
+ });
54
+
55
+ export interface FogCandidate {
56
+ readonly entityKey: number;
57
+ readonly color: readonly [number, number, number];
58
+ readonly density: number;
59
+ readonly heightFalloff: number;
60
+ readonly maxOpacity: number;
61
+ }
62
+
63
+ export type EnvironmentSource =
64
+ | { readonly kind: 'none' }
65
+ | {
66
+ readonly kind: 'image';
67
+ readonly entityKey: number;
68
+ readonly sourceKey: string;
69
+ }
70
+ | {
71
+ readonly kind: 'atmosphere';
72
+ readonly entityKey: number;
73
+ readonly sourceKey: string;
74
+ readonly atmosphere: AtmosphereParameters;
75
+ };
76
+
77
+ export interface FogFrame extends FogCandidate {}
78
+
79
+ export interface EnvironmentFrame {
80
+ readonly source: EnvironmentSource;
81
+ /** Descriptor of the real environment resource adopted for this frame. */
82
+ readonly resourceDescriptor?: Readonly<{
83
+ readonly width: number;
84
+ readonly height: number;
85
+ readonly bytesPerPixel: number;
86
+ }>;
87
+ readonly fog: FogFrame | undefined;
88
+ readonly environmentSignature: string;
89
+ readonly fogSignature: string;
90
+ readonly signature: string;
91
+ readonly revision: number;
92
+ }
93
+
94
+ export interface FramePlan {
95
+ readonly environment: EnvironmentFrame;
96
+ readonly temporal: TemporalView;
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 freezeAtmosphere(parameters: AtmosphereParameters): AtmosphereParameters {
107
+ return Object.freeze({ ...parameters });
108
+ }
109
+
110
+ /** Return the first invalid analytic atmosphere field at the extraction boundary. */
111
+ export function validateAtmosphereParameters(
112
+ parameters: AtmosphereParameters,
113
+ ): AtmosphereInvalidParameterError | undefined {
114
+ for (const field of Object.keys(ATMOSPHERE_PARAMETER_RANGES) as (keyof AtmosphereParameters)[]) {
115
+ const value = parameters[field];
116
+ const range = ATMOSPHERE_PARAMETER_RANGES[field];
117
+ if (!Number.isFinite(value) || value < range.min || value > range.max) {
118
+ return new AtmosphereInvalidParameterError(field, value, range);
119
+ }
120
+ }
121
+ return undefined;
122
+ }
123
+
124
+ /** Select immutable environment and independent Fog facts at the frame boundary. */
125
+ export function selectEnvironmentFrame(
126
+ candidates: readonly EnvironmentCandidate[],
127
+ fogCandidates: readonly FogCandidate[],
128
+ ): Result<EnvironmentFrame, RenderError> {
129
+ if (candidates.length > 1) {
130
+ return err(
131
+ new EnvironmentSourceConflictError(
132
+ candidates.map(({ kind, entityKey, sourceKey }) => ({ kind, entityKey, sourceKey })),
133
+ ),
134
+ );
135
+ }
136
+ if (fogCandidates.length > 1) return err(new FogCardinalityError(fogCandidates.length));
137
+ const candidate = candidates[0];
138
+ if (candidate?.kind === 'atmosphere') {
139
+ const invalid = validateAtmosphereParameters(candidate.atmosphere);
140
+ if (invalid !== undefined) return err(invalid);
141
+ }
142
+ const source: EnvironmentSource =
143
+ candidate === undefined
144
+ ? { kind: 'none' }
145
+ : candidate.kind === 'atmosphere'
146
+ ? {
147
+ kind: 'atmosphere',
148
+ entityKey: candidate.entityKey,
149
+ sourceKey: candidate.sourceKey,
150
+ atmosphere: freezeAtmosphere(candidate.atmosphere),
151
+ }
152
+ : {
153
+ kind: 'image',
154
+ entityKey: candidate.entityKey,
155
+ sourceKey: candidate.sourceKey,
156
+ };
157
+ const fog = fogCandidates[0] === undefined ? undefined : freezeFog(fogCandidates[0]);
158
+ const signatures = environmentFactSignatures({
159
+ environments: candidate === undefined ? [] : [candidate],
160
+ fogs: fogCandidates,
161
+ suns: [],
162
+ });
163
+ return ok(
164
+ Object.freeze({
165
+ source: Object.freeze(source),
166
+ fog,
167
+ ...signatures,
168
+ revision: 0,
169
+ }),
170
+ );
171
+ }
@@ -1,4 +1,4 @@
1
- import { Entity, type EntityHandle, type World } from '@forgeax/engine-ecs';
1
+ import type { EntityHandle, World } from '@forgeax/engine-ecs';
2
2
  import {
3
3
  projectHierarchy,
4
4
  type SceneHierarchyDiagnostic,
@@ -45,34 +45,53 @@ export function resolveVisibility(
45
45
  world: World,
46
46
  hierarchy: SceneHierarchySnapshot = projectHierarchy(world),
47
47
  ): VisibilitySnapshot {
48
- const query = world.query({ read: [Entity], optional: [Visibility] });
48
+ // Visibility is an opt-in component. Query only the owning archetypes
49
+ // instead of walking every Entity row with an optional column; the latter
50
+ // made a World with no visibility intents pay a full-scene scan on each
51
+ // extraction. QueryRow.entity is sourced from the essential Entity column,
52
+ // so the required Visibility read retains the same handle and intent
53
+ // semantics while keeping the hot path sparse.
54
+ const query = world.query({ read: [Visibility] });
55
+ const visitVisibilityRows = (visit: (entity: EntityHandle, rawState: number) => void): void => {
56
+ if (!query.ok) return;
57
+ // Dense component spans keep the per-frame summary on typed-array reads
58
+ // instead of allocating a QueryRow facade for every visibility-bearing
59
+ // entity. Keep the row path as a defensive fallback if a future storage
60
+ // mode cannot expose spans.
61
+ const spans = query.value.spans();
62
+ if (spans.ok) {
63
+ for (const span of spans.value) {
64
+ const states = span.get(Visibility).state;
65
+ for (let index = 0; index < span.length; index += 1) {
66
+ visit(span.entities[index] as EntityHandle, states[index] ?? 0);
67
+ }
68
+ }
69
+ return;
70
+ }
71
+ for (const row of query.value) {
72
+ visit(row.entity, row.get(Visibility).state);
73
+ }
74
+ };
49
75
  let intentCount = 0;
50
76
  let hasAnyHiddenIntent = false;
51
- if (query.ok) {
52
- for (const row of query.value) {
53
- const visibility = row.get(Visibility);
54
- if (visibility === undefined) continue;
55
- intentCount += 1;
56
- if (visibility.state === VisibilityStateValue.hidden) {
57
- hasAnyHiddenIntent = true;
58
- }
77
+ visitVisibilityRows((_entity, rawState) => {
78
+ intentCount += 1;
79
+ if (rawState === VisibilityStateValue.hidden) {
80
+ hasAnyHiddenIntent = true;
59
81
  }
60
- }
82
+ });
61
83
 
62
84
  let resolveEntity: ((entity: EntityHandle) => ResolutionState | undefined) | undefined;
63
85
  let hasIntent: ((entity: EntityHandle) => boolean) | undefined;
64
86
  const ensureResolver = (): void => {
65
87
  if (resolveEntity !== undefined) return;
66
88
  const intentByEntity = new Map<EntityHandle, VisibilityState>();
67
- if (query.ok) {
68
- for (const row of query.value) {
69
- const raw = row.get(Visibility);
70
- const intent = raw === undefined ? undefined : visibilityStateFromU32(raw.state);
71
- if (intent !== undefined) {
72
- intentByEntity.set(row.entity, intent);
73
- }
89
+ visitVisibilityRows((entity, rawState) => {
90
+ const intent = visibilityStateFromU32(rawState);
91
+ if (intent !== undefined) {
92
+ intentByEntity.set(entity, intent);
74
93
  }
75
- }
94
+ });
76
95
  hasIntent = (entity: EntityHandle): boolean => intentByEntity.has(entity);
77
96
  const resolved = new Map<EntityHandle, ResolutionState>();
78
97
  const resolving = new Set<EntityHandle>();