@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
@@ -15,9 +15,12 @@ import type {
15
15
  PreparedGraphicsResolver,
16
16
  PreparedGraphicsResourceLease,
17
17
  } from '../prepare/prepared-graphics-resolver';
18
+ import type { SceneDataTarget } from '../temporal/scene-data';
19
+ import { createSceneDataCatalog, type SceneDataCatalog } from '../temporal/scene-data-catalog';
18
20
  import {
19
21
  freezeRenderFeaturePlan,
20
22
  type RenderFeatureLogicalTarget,
23
+ type RenderFeatureMaterialShaderBindingContract,
21
24
  type RenderFeaturePassDeclaration,
22
25
  type RenderFeaturePlan,
23
26
  type RenderFeaturePlannedFrame,
@@ -53,6 +56,7 @@ import type {
53
56
  RenderFeatureExtractContext,
54
57
  RenderFeatureHiddenEntityReport,
55
58
  RenderFeatureRecoverInput,
59
+ RenderFeatureShaderModuleMode,
56
60
  RenderFeatureStatus,
57
61
  RenderFeatureTargetHandle,
58
62
  RenderFeatureWorldVisibilitySnapshot,
@@ -102,8 +106,14 @@ export interface RenderFeatureFrameInput {
102
106
  readonly hiddenEntityReports?: readonly RenderFeatureHiddenEntityReport[];
103
107
  /** Active-pipeline logical targets available to producer-owned features. */
104
108
  readonly targets?: readonly RenderFeatureTargetHandle[];
109
+ /** Optional renderer-owned semantic catalog for the current plan generation. */
110
+ readonly sceneData?: SceneDataCatalog;
105
111
  readonly generation?: number;
106
112
  readonly caps: Readonly<RhiCaps>;
113
+ /** Renderer-owned material binding contract projection for producer plans. */
114
+ readonly materialShaderBindingContract?: (
115
+ materialShaderId: string,
116
+ ) => RenderFeatureMaterialShaderBindingContract;
107
117
  readonly createPreparedGraphicsResolver?: (
108
118
  input: RenderFeaturePreparedGraphicsResolverInput,
109
119
  ) => PreparedGraphicsResolver;
@@ -115,6 +125,8 @@ export interface RenderFeaturePreparedGraphicsResolverInput {
115
125
  readonly featureIdentity: string;
116
126
  readonly order: number;
117
127
  readonly generation: number;
128
+ /** Shader preparation policy selected by the owning feature. */
129
+ readonly shaderModuleMode?: RenderFeatureShaderModuleMode;
118
130
  readonly transaction: PreparedGraphicsTransaction;
119
131
  readonly fullscreenEffects: ReadonlyMap<string, PostProcessShaderEntry>;
120
132
  readonly lookup: (
@@ -428,7 +440,7 @@ function logicalTargets(
428
440
  ): readonly RenderFeatureLogicalTarget[] {
429
441
  return Object.freeze(
430
442
  targets.map((target) => ({
431
- name: target.kind === 'scene-color' ? 'color' : 'depth',
443
+ name: target.name ?? (target.kind === 'scene-color' ? 'color' : 'depth'),
432
444
  kind: target.kind === 'scene-color' ? ('color' as const) : ('depth' as const),
433
445
  format: target.format,
434
446
  sampleCount: target.sampleCount,
@@ -451,14 +463,17 @@ function planFailure(slot: FeatureSlot): RenderFeatureStageFailedError {
451
463
  }
452
464
 
453
465
  function targetHandle(
454
- name: string,
466
+ name: string | SceneDataTarget,
455
467
  targets: readonly RenderFeatureTargetHandle[],
456
- ): string | RenderFeatureTargetHandle | undefined {
468
+ ): string | RenderFeatureTargetHandle | SceneDataTarget | undefined {
457
469
  if (name === 'swapchain') return 'swapchain';
470
+ if (typeof name !== 'string') return name;
458
471
  return targets.find(
459
472
  (target) =>
460
- (name === 'color' && target.kind === 'scene-color') ||
461
- (name === 'depth' && target.kind === 'scene-depth'),
473
+ target.name === name ||
474
+ (target.name === undefined &&
475
+ ((name === 'color' && target.kind === 'scene-color') ||
476
+ (name === 'depth' && target.kind === 'scene-depth'))),
462
477
  );
463
478
  }
464
479
 
@@ -1169,6 +1184,7 @@ export function runRenderFeatureFrame(
1169
1184
  const gpu: RenderFeatureGpuPrepareSession | undefined = input.gpuWork?.beginFeature(
1170
1185
  identity,
1171
1186
  input.generation ?? 0,
1187
+ feature.shaderModuleMode,
1172
1188
  );
1173
1189
  const featureHiddenEntityReports: RenderFeatureHiddenEntityReport[] = [];
1174
1190
  const extractContext = {
@@ -1194,6 +1210,14 @@ export function runRenderFeatureFrame(
1194
1210
  }
1195
1211
 
1196
1212
  const targets = logicalTargets(input.targets ?? []);
1213
+ const sceneData =
1214
+ input.sceneData ??
1215
+ createSceneDataCatalog({
1216
+ featureIdentity: identity,
1217
+ generation: transaction.generation,
1218
+ planIdentity: `${identity}:${transaction.generation}`,
1219
+ rgba16floatRenderable: input.caps.rgba16floatRenderable === true,
1220
+ });
1197
1221
  const declared = invokeStage(
1198
1222
  slot,
1199
1223
  'plan',
@@ -1203,6 +1227,10 @@ export function runRenderFeatureFrame(
1203
1227
  frame: { frameNumber: input.frameNumber },
1204
1228
  generation: transaction.generation,
1205
1229
  targets,
1230
+ sceneData,
1231
+ ...(input.materialShaderBindingContract === undefined
1232
+ ? {}
1233
+ : { materialShaderBindingContract: input.materialShaderBindingContract }),
1206
1234
  }),
1207
1235
  stageEvents,
1208
1236
  errors,
@@ -1246,6 +1274,9 @@ export function runRenderFeatureFrame(
1246
1274
  featureIdentity: identity,
1247
1275
  order,
1248
1276
  generation: transaction.generation,
1277
+ ...(feature.shaderModuleMode === undefined
1278
+ ? {}
1279
+ : { shaderModuleMode: feature.shaderModuleMode }),
1249
1280
  transaction,
1250
1281
  fullscreenEffects,
1251
1282
  lookup: (reference) =>
@@ -0,0 +1,67 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { SCENE_DATA_TEMPORAL_V1_SCHEMA } from '../../../temporal/scene-data';
3
+ import { createSceneDataCatalog } from '../../../temporal/scene-data-catalog';
4
+ import { freezeRenderFeaturePlan } from '../../plan';
5
+ import { planMotionBlur } from '../motion-blur-feature';
6
+ import { DEFAULT_MOTION_BLUR_PARAMS } from '../motion-blur-params';
7
+
8
+ const caps = {
9
+ rgba16floatRenderable: true,
10
+ compute: true,
11
+ storageBuffer: true,
12
+ } as never;
13
+
14
+ describe('Motion Blur feature plan', () => {
15
+ it('declares one projected fullscreen draw with semantic reads', () => {
16
+ const catalog = createSceneDataCatalog({
17
+ featureIdentity: 'forgeax.motion-blur',
18
+ generation: 4,
19
+ planIdentity: 'forgeax.motion-blur:4',
20
+ rgba16floatRenderable: true,
21
+ });
22
+ const planned = planMotionBlur(DEFAULT_MOTION_BLUR_PARAMS, {
23
+ caps,
24
+ frame: { frameNumber: 7 },
25
+ generation: 4,
26
+ targets: [
27
+ { name: 'motion-input', kind: 'color', format: 'rgba16float', sampleCount: 1 },
28
+ { name: 'motion-output', kind: 'color', format: 'rgba16float', sampleCount: 1 },
29
+ ],
30
+ sceneData: catalog,
31
+ });
32
+ expect(planned.ok).toBe(true);
33
+ if (!planned.ok) return;
34
+ const frozen = freezeRenderFeaturePlan('forgeax.motion-blur', planned.value, [
35
+ { name: 'motion-input', kind: 'color', format: 'rgba16float', sampleCount: 1 },
36
+ { name: 'motion-output', kind: 'color', format: 'rgba16float', sampleCount: 1 },
37
+ ]);
38
+ expect(frozen.ok).toBe(true);
39
+ if (!frozen.ok) return;
40
+ const bindings = frozen.value.resources.find(
41
+ (resource) => resource.kind === 'graphics-bindings',
42
+ );
43
+ expect(bindings?.kind).toBe('graphics-bindings');
44
+ const program = frozen.value.resources.find(
45
+ (resource) => resource.kind === 'fullscreen-program',
46
+ );
47
+ expect(program?.kind).toBe('fullscreen-program');
48
+ if (program?.kind === 'fullscreen-program') {
49
+ expect(program.reads).toEqual(['scene-color', 'scene-temporal']);
50
+ expect(program.reads).not.toContainEqual({ key: 'scene-depth', sampleType: 'depth' });
51
+ }
52
+ if (bindings?.kind === 'graphics-bindings') {
53
+ expect(bindings.values).not.toHaveProperty('depth');
54
+ expect(bindings.logicalTargets).toEqual({ input: 'motion-input' });
55
+ }
56
+ expect(frozen.value.passes).toHaveLength(1);
57
+ const pass = frozen.value.passes[0];
58
+ expect(pass?.kind).toBe('raster');
59
+ if (pass?.kind !== 'raster') return;
60
+ expect(pass.draws[0]?.vertexLayout).toBe('none');
61
+ expect(pass.sampledTargets).toEqual(
62
+ expect.arrayContaining(['motion-input', catalog.require(SCENE_DATA_TEMPORAL_V1_SCHEMA)]),
63
+ );
64
+ expect(pass.sampledTargets).not.toContain('motion-depth');
65
+ expect(catalog.schema).toBe(SCENE_DATA_TEMPORAL_V1_SCHEMA);
66
+ });
67
+ });
@@ -0,0 +1,53 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import {
3
+ DEFAULT_MOTION_BLUR_PARAMS,
4
+ motionBlurTemporalDemand,
5
+ validateMotionBlurParams,
6
+ } from '../motion-blur-params';
7
+
8
+ describe('Motion Blur parameter validation', () => {
9
+ it('applies the bounded defaults', () => {
10
+ expect(validateMotionBlurParams({})).toEqual({ ok: true, value: DEFAULT_MOTION_BLUR_PARAMS });
11
+ expect(DEFAULT_MOTION_BLUR_PARAMS).toEqual({
12
+ shutterAngle: 180,
13
+ maxRadiusPixels: 32,
14
+ sampleCount: 8,
15
+ });
16
+ });
17
+
18
+ it.each([
19
+ [{ shutterAngle: 0 }, 'identity shutter'],
20
+ [{ shutterAngle: 360, maxRadiusPixels: 0, sampleCount: 4 }, 'lower and upper bounds'],
21
+ [{ shutterAngle: 12, maxRadiusPixels: 64, sampleCount: 16 }, 'valid upper bounds'],
22
+ ] as const)('accepts %s (%s)', (input, _label) => {
23
+ const result = validateMotionBlurParams(input);
24
+ expect(result.ok).toBe(true);
25
+ });
26
+
27
+ it.each([
28
+ ['shutterAngle', -0.01],
29
+ ['shutterAngle', 360.01],
30
+ ['maxRadiusPixels', -0.01],
31
+ ['maxRadiusPixels', 64.01],
32
+ ['sampleCount', 3],
33
+ ['sampleCount', 17],
34
+ ['sampleCount', 8.5],
35
+ ] as const)('returns structured failure for %s=%s', (field, value) => {
36
+ const result = validateMotionBlurParams({ [field]: value });
37
+ expect(result.ok).toBe(false);
38
+ if (!result.ok) {
39
+ expect(result.error.code).toBe('motion-blur-invalid-params');
40
+ expect(result.error.detail.field).toBe(field);
41
+ expect(result.error.expected).toContain(field);
42
+ expect(result.error.hint).toContain(field);
43
+ }
44
+ });
45
+
46
+ it('does no temporal work when omitted or shutter is zero', () => {
47
+ expect(motionBlurTemporalDemand(undefined)).toBe(false);
48
+ expect(motionBlurTemporalDemand({ shutterAngle: 0, maxRadiusPixels: 32, sampleCount: 8 })).toBe(
49
+ false,
50
+ );
51
+ expect(motionBlurTemporalDemand(DEFAULT_MOTION_BLUR_PARAMS)).toBe(true);
52
+ });
53
+ });
@@ -0,0 +1,119 @@
1
+ import type { RenderGraphBuilder, RenderGraphError } from '@forgeax/engine-render-graph';
2
+ import { err, ok, type Result } from '@forgeax/engine-types';
3
+ import type { RenderError } from '../../errors/render';
4
+ import type { RenderPipelineFrame, RenderPipelineTarget } from '../../render-pipeline';
5
+ import { SCENE_DATA_TEMPORAL_V1_SCHEMA } from '../../temporal/scene-data';
6
+ import { addTypedFullscreenPass } from '../../typed-render-graph-primitives';
7
+ import type { RenderFeaturePlan, RenderFeaturePlanContext } from '../plan';
8
+ import type { RenderFeature, RenderFeatureExtractContext } from '../types';
9
+ import {
10
+ type MotionBlurParams,
11
+ motionBlurTemporalDemand,
12
+ validateMotionBlurParams,
13
+ } from './motion-blur-params';
14
+
15
+ export const MOTION_BLUR_FEATURE_IDENTITY = 'forgeax.motion-blur';
16
+
17
+ export function addMotionBlurPass(
18
+ graph: RenderGraphBuilder<RenderPipelineFrame>,
19
+ input: RenderPipelineTarget,
20
+ temporal: RenderPipelineTarget,
21
+ output: RenderPipelineTarget,
22
+ ): Result<void, RenderGraphError> {
23
+ return addTypedFullscreenPass(graph, {
24
+ name: 'motion-blur',
25
+ shader: MOTION_BLUR_FEATURE_IDENTITY,
26
+ input,
27
+ additionalReads: [{ key: 'scene-temporal', target: temporal }],
28
+ output,
29
+ });
30
+ }
31
+
32
+ export interface MotionBlurFeatureFrame {
33
+ readonly params: MotionBlurParams | undefined;
34
+ readonly demanded: boolean;
35
+ }
36
+
37
+ export function planMotionBlur(
38
+ params: MotionBlurParams,
39
+ context: RenderFeaturePlanContext,
40
+ ): Result<RenderFeaturePlan, RenderError> {
41
+ if (!motionBlurTemporalDemand(params)) return ok({ resources: [], passes: [] });
42
+ try {
43
+ const temporal = context.sceneData.require(SCENE_DATA_TEMPORAL_V1_SCHEMA);
44
+ const outputFormat =
45
+ context.targets.find((target) => target.name === 'motion-output')?.format ?? 'rgba16float';
46
+ return ok({
47
+ resources: [
48
+ {
49
+ kind: 'fullscreen-program',
50
+ name: 'motion-blur',
51
+ source: 'forgeax::shader::motion-blur',
52
+ reads: ['scene-color', 'scene-temporal'],
53
+ params: { byteSize: 16, defaultValue: new Uint8Array(16) },
54
+ },
55
+ {
56
+ kind: 'graphics-program',
57
+ name: 'motion-blur-pipeline',
58
+ program: {
59
+ shader: MOTION_BLUR_FEATURE_IDENTITY,
60
+ vertexLayout: 'none',
61
+ colorFormats: [outputFormat],
62
+ sampleCount: 1,
63
+ },
64
+ },
65
+ {
66
+ kind: 'graphics-bindings',
67
+ name: 'motion-blur-bindings',
68
+ program: 'motion-blur-pipeline',
69
+ values: {
70
+ group: 1,
71
+ fullscreen: true,
72
+ shader: MOTION_BLUR_FEATURE_IDENTITY,
73
+ input: 'motion-input',
74
+ temporal,
75
+ },
76
+ logicalTargets: { input: 'motion-input' },
77
+ },
78
+ ],
79
+ passes: [
80
+ {
81
+ kind: 'raster',
82
+ name: 'motion-blur',
83
+ colorAttachments: [{ target: 'motion-output', loadOp: 'clear', storeOp: 'store' }],
84
+ sampledTargets: ['motion-input', temporal],
85
+ draws: [
86
+ {
87
+ program: 'motion-blur-pipeline',
88
+ bindings: ['motion-blur-bindings'],
89
+ vertexData: [],
90
+ vertexLayout: 'none',
91
+ draw: { kind: 'draw', vertexCount: 3, instanceCount: 1 },
92
+ },
93
+ ],
94
+ },
95
+ ],
96
+ });
97
+ } catch (cause) {
98
+ return err(cause as RenderError);
99
+ }
100
+ }
101
+
102
+ export function createMotionBlurFeature(
103
+ read: () => Partial<MotionBlurParams> | undefined,
104
+ ): RenderFeature<MotionBlurFeatureFrame> {
105
+ return Object.freeze({
106
+ identity: MOTION_BLUR_FEATURE_IDENTITY,
107
+ extract: (_context: RenderFeatureExtractContext) => {
108
+ const input = read();
109
+ const validated = validateMotionBlurParams(input);
110
+ if (!validated.ok) return err(validated.error as unknown as RenderError);
111
+ const params = input === undefined ? undefined : validated.value;
112
+ return ok({ params, demanded: motionBlurTemporalDemand(params) });
113
+ },
114
+ plan: (frame: MotionBlurFeatureFrame, context: RenderFeaturePlanContext) =>
115
+ frame.params === undefined
116
+ ? ok({ resources: [], passes: [] })
117
+ : planMotionBlur(frame.params, context),
118
+ });
119
+ }
@@ -0,0 +1,89 @@
1
+ import { err, ok, type Result } from '@forgeax/engine-types';
2
+
3
+ export interface MotionBlurParams {
4
+ readonly shutterAngle: number;
5
+ readonly maxRadiusPixels: number;
6
+ readonly sampleCount: number;
7
+ }
8
+
9
+ export const DEFAULT_MOTION_BLUR_PARAMS: MotionBlurParams = Object.freeze({
10
+ shutterAngle: 180,
11
+ maxRadiusPixels: 32,
12
+ sampleCount: 8,
13
+ });
14
+
15
+ export interface MotionBlurInvalidParamsDetail {
16
+ readonly field: keyof MotionBlurParams;
17
+ readonly value: unknown;
18
+ readonly min: number;
19
+ readonly max: number;
20
+ readonly integer?: boolean;
21
+ }
22
+
23
+ export class MotionBlurValidationError extends Error {
24
+ readonly code = 'motion-blur-invalid-params' as const;
25
+ readonly expected: string;
26
+ readonly hint: string;
27
+ readonly detail: MotionBlurInvalidParamsDetail;
28
+
29
+ constructor(detail: MotionBlurInvalidParamsDetail) {
30
+ const integer = detail.integer === true ? 'integer ' : '';
31
+ const expected = `${detail.field} ${integer}in [${detail.min}, ${detail.max}]`;
32
+ super(`motion-blur-invalid-params: ${expected}`);
33
+ this.name = 'MotionBlurValidationError';
34
+ this.expected = expected;
35
+ this.hint = `set ${detail.field} to an ${integer}value in [${detail.min}, ${detail.max}]`;
36
+ this.detail = detail;
37
+ }
38
+ }
39
+
40
+ function validateField(
41
+ field: keyof MotionBlurParams,
42
+ value: number,
43
+ min: number,
44
+ max: number,
45
+ integer = false,
46
+ ): MotionBlurValidationError | undefined {
47
+ if (
48
+ !Number.isFinite(value) ||
49
+ value < min ||
50
+ value > max ||
51
+ (integer && !Number.isInteger(value))
52
+ ) {
53
+ return new MotionBlurValidationError({
54
+ field,
55
+ value,
56
+ min,
57
+ max,
58
+ ...(integer ? { integer } : {}),
59
+ });
60
+ }
61
+ return undefined;
62
+ }
63
+
64
+ export function validateMotionBlurParams(
65
+ input: Partial<MotionBlurParams> | undefined,
66
+ ): Result<MotionBlurParams, MotionBlurValidationError> {
67
+ const value = input ?? {};
68
+ const shutterAngle = value.shutterAngle ?? DEFAULT_MOTION_BLUR_PARAMS.shutterAngle;
69
+ const maxRadiusPixels = value.maxRadiusPixels ?? DEFAULT_MOTION_BLUR_PARAMS.maxRadiusPixels;
70
+ const sampleCount = value.sampleCount ?? DEFAULT_MOTION_BLUR_PARAMS.sampleCount;
71
+ const shutterError = validateField('shutterAngle', shutterAngle, 0, 360);
72
+ if (shutterError !== undefined) return err(shutterError);
73
+ const radiusError = validateField('maxRadiusPixels', maxRadiusPixels, 0, 64);
74
+ if (radiusError !== undefined) return err(radiusError);
75
+ const sampleError = validateField('sampleCount', sampleCount, 4, 16, true);
76
+ if (sampleError !== undefined) return err(sampleError);
77
+ return ok(Object.freeze({ shutterAngle, maxRadiusPixels, sampleCount }));
78
+ }
79
+
80
+ export function motionBlurTemporalDemand(params: MotionBlurParams | undefined): boolean {
81
+ return params !== undefined && params.shutterAngle > 0;
82
+ }
83
+
84
+ export function resolveMotionBlurParams(
85
+ input: Partial<MotionBlurParams> | undefined,
86
+ ): Result<MotionBlurParams | undefined, MotionBlurValidationError> {
87
+ if (input === undefined) return ok(undefined);
88
+ return validateMotionBlurParams(input);
89
+ }
@@ -2,6 +2,7 @@ import type { GraphBufferAccess, GraphTextureAccess } from '@forgeax/engine-rend
2
2
  import type { RhiCaps, TextureFormat } from '@forgeax/engine-rhi';
3
3
  import { err, ok, type Result } from '@forgeax/engine-types';
4
4
  import type { RenderError } from '../errors/render';
5
+ import type { SceneDataTarget } from '../temporal/scene-data';
5
6
  import type {
6
7
  RenderFeatureGpuBufferUsage,
7
8
  RenderFeatureGpuProgramDescriptor,
@@ -10,10 +11,27 @@ import type { RenderFeaturePipelineDescriptor } from './prepared-graphics';
10
11
 
11
12
  export type RenderFeatureResourceUsage = GraphBufferAccess | GraphTextureAccess;
12
13
 
14
+ /**
15
+ * Renderer-owned binding layout contract for a material shader.
16
+ *
17
+ * Producer features use this read-only projection to describe which logical
18
+ * scene resources a custom material consumes. The render owner remains the
19
+ * source of truth for the shader source and its pipeline layout.
20
+ */
21
+ export type RenderFeatureMaterialShaderBindingContract =
22
+ | 'group-0'
23
+ | 'group-0-resource'
24
+ | 'view-only'
25
+ | 'view-and-scene-depth'
26
+ | 'render-material';
27
+
13
28
  export type RenderFeatureFullscreenRead =
14
29
  | string
15
30
  | { readonly key: string; readonly sampleType?: 'depth' };
16
31
 
32
+ /** A named graph target or an authorized semantic sampled-read target. */
33
+ export type RenderFeatureSampledTarget = string | SceneDataTarget;
34
+
17
35
  /** A cooked fullscreen shader declaration owned by a RenderFeature plan. */
18
36
  export interface RenderFeatureFullscreenProgramDeclaration {
19
37
  readonly kind: 'fullscreen-program';
@@ -32,6 +50,7 @@ export type RenderFeatureBindingValue =
32
50
  | number
33
51
  | string
34
52
  | ArrayBufferView
53
+ | SceneDataTarget
35
54
  | readonly RenderFeatureBindingValue[]
36
55
  | { readonly [name: string]: RenderFeatureBindingValue };
37
56
 
@@ -167,7 +186,7 @@ export type RenderFeaturePassDeclaration =
167
186
  readonly depthLoadOp: 'load' | 'clear';
168
187
  readonly depthStoreOp: 'store' | 'discard';
169
188
  };
170
- readonly sampledTargets?: readonly string[];
189
+ readonly sampledTargets?: readonly RenderFeatureSampledTarget[];
171
190
  readonly draws: readonly RenderFeatureDrawDeclaration[];
172
191
  };
173
192
 
@@ -193,6 +212,12 @@ export interface RenderFeaturePlanContext {
193
212
  readonly frame: { readonly frameNumber: number };
194
213
  readonly generation: number;
195
214
  readonly targets: readonly RenderFeatureLogicalTarget[];
215
+ /** Read-only semantic scene-data resolver bound to this plan generation. */
216
+ readonly sceneData: import('../temporal/scene-data-catalog').SceneDataCatalog;
217
+ /** Resolve a material shader's renderer-owned binding contract. */
218
+ readonly materialShaderBindingContract?: (
219
+ materialShaderId: string,
220
+ ) => RenderFeatureMaterialShaderBindingContract;
196
221
  }
197
222
 
198
223
  /** Frozen declaration produced for one feature in one frame. */
@@ -303,12 +328,15 @@ export function deriveRenderFeaturePassAccess(
303
328
  if (pass.depthStencilAttachment !== undefined) {
304
329
  accesses.push({
305
330
  resource: pass.depthStencilAttachment.target,
306
- usage: pass.sampledTargets?.includes(pass.depthStencilAttachment.target)
331
+ usage: pass.sampledTargets?.some(
332
+ (target) => typeof target === 'string' && target === pass.depthStencilAttachment?.target,
333
+ )
307
334
  ? 'depth-stencil-read'
308
335
  : 'depth-stencil-write',
309
336
  });
310
337
  }
311
338
  for (const target of pass.sampledTargets ?? []) {
339
+ if (typeof target !== 'string') continue;
312
340
  accesses.push({ resource: target, usage: 'sampled-read' });
313
341
  }
314
342
  for (const draw of pass.draws) {
@@ -411,7 +439,8 @@ export function freezeRenderFeaturePlan(
411
439
  pass.colorAttachments.some((attachment) => !targets.has(attachment.target)) ||
412
440
  (pass.depthStencilAttachment !== undefined &&
413
441
  !targets.has(pass.depthStencilAttachment.target)) ||
414
- pass.sampledTargets?.some((target) => !targets.has(target)) === true
442
+ pass.sampledTargets?.some((target) => typeof target === 'string' && !targets.has(target)) ===
443
+ true
415
444
  ) {
416
445
  return err(stageFailure(identity));
417
446
  }
@@ -13,6 +13,7 @@ import type {
13
13
  import { type BindGroupLayoutDescriptor, err, ok, type Result } from '@forgeax/engine-types';
14
14
  import { type RenderError, RenderFeaturePreparationFailedError } from '../errors/render';
15
15
  import type { PipelineBuilderShaderModuleFactory } from '../pipeline-builder';
16
+ import type { RenderFeatureShaderModuleMode } from './types';
16
17
 
17
18
  declare const RenderFeatureGpuProgramBrand: unique symbol;
18
19
  export interface RenderFeatureGpuProgramRef {
@@ -909,7 +910,11 @@ function createRenderFeatureGpuWorkSession(input: {
909
910
  * retains the per-feature prepared GPU state and recreates it after recovery.
910
911
  */
911
912
  export interface RenderFeatureGpuWorkOwner {
912
- beginFeature(featureIdentity: string, generation: number): RenderFeatureGpuPrepareSession;
913
+ beginFeature(
914
+ featureIdentity: string,
915
+ generation: number,
916
+ shaderModuleMode?: RenderFeatureShaderModuleMode,
917
+ ): RenderFeatureGpuPrepareSession;
913
918
  resolveBuffer(
914
919
  featureIdentity: string,
915
920
  reference: RenderFeatureGpuBufferRef,
@@ -920,27 +925,37 @@ export interface RenderFeatureGpuWorkOwner {
920
925
  export function createRenderFeatureGpuWorkOwner(input: {
921
926
  readonly getDevice: () => RhiDevice;
922
927
  readonly getShaderModuleFactory: () => PipelineBuilderShaderModuleFactory;
928
+ readonly getImmediateShaderModuleFactory?: () => PipelineBuilderShaderModuleFactory;
923
929
  }): RenderFeatureGpuWorkOwner {
924
930
  const sessions = new Map<
925
931
  string,
926
- { generation: number; session: RenderFeatureGpuPrepareSession }
932
+ {
933
+ generation: number;
934
+ shaderModuleMode: RenderFeatureShaderModuleMode;
935
+ session: RenderFeatureGpuPrepareSession;
936
+ }
927
937
  >();
928
938
 
929
939
  return {
930
- beginFeature: (featureIdentity, generation) => {
940
+ beginFeature: (featureIdentity, generation, requestedShaderModuleMode = 'validated') => {
941
+ const shaderModuleMode = requestedShaderModuleMode;
931
942
  const existing = sessions.get(featureIdentity);
932
- if (existing?.generation === generation) {
943
+ if (existing?.generation === generation && existing.shaderModuleMode === shaderModuleMode) {
933
944
  existing.session.beginFrame();
934
945
  return existing.session;
935
946
  }
936
947
  if (existing !== undefined) existing.session.dispose();
948
+ const shaderModuleFactory =
949
+ shaderModuleMode === 'immediate'
950
+ ? (input.getImmediateShaderModuleFactory?.() ?? input.getShaderModuleFactory())
951
+ : input.getShaderModuleFactory();
937
952
  const session = createRenderFeatureGpuWorkSession({
938
953
  device: input.getDevice(),
939
- shaderModuleFactory: input.getShaderModuleFactory(),
954
+ shaderModuleFactory,
940
955
  generation,
941
956
  featureIdentity,
942
957
  });
943
- sessions.set(featureIdentity, { generation, session });
958
+ sessions.set(featureIdentity, { generation, shaderModuleMode, session });
944
959
  session.beginFrame();
945
960
  return session;
946
961
  },
@@ -19,6 +19,7 @@ import {
19
19
  type RenderFeaturePreparedStateMismatchDetail,
20
20
  RenderFeaturePreparedStateMismatchError,
21
21
  } from '../errors/render';
22
+ import type { SceneDataTarget } from '../temporal/scene-data';
22
23
  import type { RenderFeatureGpuBufferRef } from './prepared-gpu-work';
23
24
  import type { RenderFeatureTargetHandle } from './targets';
24
25
  import type { PreparedKind } from './vocabulary';
@@ -234,7 +235,7 @@ export type RenderFeatureDrawRecord =
234
235
  export interface RenderFeatureGraphicsPassDescriptor {
235
236
  readonly attachments: RenderFeatureGraphicsPassAttachments;
236
237
  /** Targets sampled by shaders but not attached for writing in this pass. */
237
- readonly sampledTargets?: readonly RenderFeatureTargetHandle[];
238
+ readonly sampledTargets?: readonly (RenderFeatureTargetHandle | SceneDataTarget)[];
238
239
  readonly draws: readonly RenderFeatureDrawRecord[];
239
240
  }
240
241
 
@@ -19,6 +19,7 @@ import type {
19
19
  PreparedGraphicsResolvedResource,
20
20
  PreparedGraphicsResolvedSnapshot,
21
21
  } from '../prepare/prepared-graphics-resolver';
22
+ import type { SceneDataTarget } from '../temporal/scene-data';
22
23
  import type { RenderFeatureResolvedGpuBuffer } from './prepared-gpu-work';
23
24
  import type {
24
25
  RenderFeatureGraphicsPassDescriptor,
@@ -40,7 +41,7 @@ export interface RenderFeatureGraphTarget {
40
41
  }
41
42
 
42
43
  export type RenderFeatureGraphTargetResolver = (
43
- resource: string | RenderFeatureTargetHandle,
44
+ resource: string | RenderFeatureTargetHandle | SceneDataTarget,
44
45
  ) => RenderFeatureGraphTarget | undefined;
45
46
 
46
47
  export type RenderFeatureGraphBindingsResolution =