@forgeax/engine-render 0.1.7 → 0.1.20

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 (777) 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 +26 -5
  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-4XINDLAY.mjs +9404 -0
  18. package/dist/chunk-4XINDLAY.mjs.map +1 -0
  19. package/dist/chunk-CDTWTHZR.mjs +752 -0
  20. package/dist/chunk-CDTWTHZR.mjs.map +1 -0
  21. package/dist/chunk-FJ6P52EE.mjs +46 -0
  22. package/dist/chunk-FJ6P52EE.mjs.map +1 -0
  23. package/dist/chunk-JDWARUOI.mjs +44 -0
  24. package/dist/chunk-JDWARUOI.mjs.map +1 -0
  25. package/dist/chunk-M2MP4ZOU.mjs +73 -0
  26. package/dist/chunk-M2MP4ZOU.mjs.map +1 -0
  27. package/dist/chunk-PCHBPYML.mjs +385 -0
  28. package/dist/chunk-PCHBPYML.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-YEJIUW7D.mjs → chunk-TBQJOK2L.mjs} +356 -543
  32. package/dist/chunk-TBQJOK2L.mjs.map +1 -0
  33. package/dist/{chunk-CQXZC5XI.mjs → chunk-VFPLTKCU.mjs} +79 -69
  34. package/dist/chunk-VFPLTKCU.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/light-helpers.d.ts.map +1 -1
  44. package/dist/components/motion-blur.d.ts +7 -0
  45. package/dist/components/motion-blur.d.ts.map +1 -0
  46. package/dist/components/spot-light.d.ts +12 -0
  47. package/dist/components/spot-light.d.ts.map +1 -1
  48. package/dist/construct-renderer.d.ts +2 -2
  49. package/dist/construct-renderer.d.ts.map +1 -1
  50. package/dist/construct-renderer.mjs +11146 -14507
  51. package/dist/construct-renderer.mjs.map +1 -1
  52. package/dist/device/device-scope.d.ts +4 -0
  53. package/dist/device/device-scope.d.ts.map +1 -1
  54. package/dist/device/gpu-residency.d.ts +19 -2
  55. package/dist/device/gpu-residency.d.ts.map +1 -1
  56. package/dist/environment/frame.d.ts +60 -0
  57. package/dist/environment/frame.d.ts.map +1 -0
  58. package/dist/environment/generation.d.ts +21 -0
  59. package/dist/environment/generation.d.ts.map +1 -0
  60. package/dist/environment/graph.d.ts +4 -0
  61. package/dist/environment/graph.d.ts.map +1 -0
  62. package/dist/environment/inspection.d.ts +48 -0
  63. package/dist/environment/inspection.d.ts.map +1 -0
  64. package/dist/environment/lifecycle.d.ts +39 -0
  65. package/dist/environment/lifecycle.d.ts.map +1 -0
  66. package/dist/environment/signature.d.ts +25 -0
  67. package/dist/environment/signature.d.ts.map +1 -0
  68. package/dist/errors/render.d.ts +204 -1
  69. package/dist/errors/render.d.ts.map +1 -1
  70. package/dist/extract/camera.d.ts +5 -0
  71. package/dist/extract/camera.d.ts.map +1 -0
  72. package/dist/extract/environment.d.ts +74 -0
  73. package/dist/extract/environment.d.ts.map +1 -0
  74. package/dist/extract/visibility.d.ts +1 -1
  75. package/dist/extract/visibility.d.ts.map +1 -1
  76. package/dist/features/host.d.ts +9 -2
  77. package/dist/features/host.d.ts.map +1 -1
  78. package/dist/features/motion-blur/motion-blur-feature.d.ts +16 -0
  79. package/dist/features/motion-blur/motion-blur-feature.d.ts.map +1 -0
  80. package/dist/features/motion-blur/motion-blur-params.d.ts +25 -0
  81. package/dist/features/motion-blur/motion-blur-params.d.ts.map +1 -0
  82. package/dist/features/plan.d.ts +17 -2
  83. package/dist/features/plan.d.ts.map +1 -1
  84. package/dist/features/prepared-gpu-work.d.ts +3 -1
  85. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  86. package/dist/features/prepared-graphics.d.ts +2 -1
  87. package/dist/features/prepared-graphics.d.ts.map +1 -1
  88. package/dist/features/render-graph-raster.d.ts +2 -1
  89. package/dist/features/render-graph-raster.d.ts.map +1 -1
  90. package/dist/features/targets.d.ts +3 -0
  91. package/dist/features/targets.d.ts.map +1 -1
  92. package/dist/features/types.d.ts +12 -0
  93. package/dist/features/types.d.ts.map +1 -1
  94. package/dist/fullscreen-post-process-pass.d.ts +7 -1
  95. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  96. package/dist/gpu-scene.d.ts +2 -0
  97. package/dist/gpu-scene.d.ts.map +1 -1
  98. package/dist/gpu-usage.d.ts +2 -0
  99. package/dist/gpu-usage.d.ts.map +1 -1
  100. package/dist/ibl/skylight-bind-group.d.ts +5 -6
  101. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  102. package/dist/index.d.ts +24 -7
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.mjs +6 -4
  105. package/dist/index.mjs.map +1 -1
  106. package/dist/inspection-types.d.ts +43 -1
  107. package/dist/inspection-types.d.ts.map +1 -1
  108. package/dist/internal.d.ts +2 -0
  109. package/dist/internal.d.ts.map +1 -1
  110. package/dist/internal.mjs +2 -0
  111. package/dist/light-buffer-layout.d.ts +20 -12
  112. package/dist/light-buffer-layout.d.ts.map +1 -1
  113. package/dist/materials.d.ts +22 -0
  114. package/dist/materials.d.ts.map +1 -1
  115. package/dist/pbr-pipeline.d.ts +16 -9
  116. package/dist/pbr-pipeline.d.ts.map +1 -1
  117. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  118. package/dist/pipeline/standard-pipeline.d.ts +3 -0
  119. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  120. package/dist/pipeline/standard-post.d.ts +48 -0
  121. package/dist/pipeline/standard-post.d.ts.map +1 -0
  122. package/dist/pipeline/standard-profile.d.ts +12 -2
  123. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  124. package/dist/pipeline-builder.d.ts +18 -0
  125. package/dist/pipeline-builder.d.ts.map +1 -1
  126. package/dist/pipeline-spec.d.ts.map +1 -1
  127. package/dist/plugin.d.ts.map +1 -1
  128. package/dist/record/frame-lighting.d.ts +2 -0
  129. package/dist/record/frame-lighting.d.ts.map +1 -1
  130. package/dist/record/frame-snapshot.d.ts +137 -6
  131. package/dist/record/frame-snapshot.d.ts.map +1 -1
  132. package/dist/record/frame-targets.d.ts.map +1 -1
  133. package/dist/record/frame.d.ts +6 -3
  134. package/dist/record/frame.d.ts.map +1 -1
  135. package/dist/record/gpu-timing.d.ts +32 -0
  136. package/dist/record/gpu-timing.d.ts.map +1 -0
  137. package/dist/record/main-pass-geometry.d.ts +11 -0
  138. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  139. package/dist/record/main-pass-material.d.ts +9 -6
  140. package/dist/record/main-pass-material.d.ts.map +1 -1
  141. package/dist/record/main-pass-sprite-draws.d.ts +8 -1
  142. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  143. package/dist/record/main-pass.d.ts +2 -0
  144. package/dist/record/main-pass.d.ts.map +1 -1
  145. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  146. package/dist/record/render-context.d.ts +81 -19
  147. package/dist/record/render-context.d.ts.map +1 -1
  148. package/dist/record/shadow-pass.d.ts.map +1 -1
  149. package/dist/record/skybox-post-pass.d.ts +1 -11
  150. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  151. package/dist/record/typed-frame-graph.d.ts +36 -4
  152. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  153. package/dist/record/view-ubo.d.ts +4 -1
  154. package/dist/record/view-ubo.d.ts.map +1 -1
  155. package/dist/render-contract.d.ts +157 -8
  156. package/dist/render-contract.d.ts.map +1 -1
  157. package/dist/render-data.d.ts +10 -6
  158. package/dist/render-data.d.ts.map +1 -1
  159. package/dist/render-graph-primitives.d.ts.map +1 -1
  160. package/dist/render-pipeline.d.ts +86 -6
  161. package/dist/render-pipeline.d.ts.map +1 -1
  162. package/dist/render-system-extract.d.ts +84 -8
  163. package/dist/render-system-extract.d.ts.map +1 -1
  164. package/dist/render-system.d.ts +30 -5
  165. package/dist/render-system.d.ts.map +1 -1
  166. package/dist/renderer-inspect.d.ts +29 -0
  167. package/dist/renderer-inspect.d.ts.map +1 -0
  168. package/dist/scene/render-scene.d.ts +36 -2
  169. package/dist/scene/render-scene.d.ts.map +1 -1
  170. package/dist/temporal/coverage.d.ts +42 -0
  171. package/dist/temporal/coverage.d.ts.map +1 -0
  172. package/dist/temporal/frame-coordinator.d.ts +99 -0
  173. package/dist/temporal/frame-coordinator.d.ts.map +1 -0
  174. package/dist/temporal/frame.d.ts +44 -0
  175. package/dist/temporal/frame.d.ts.map +1 -0
  176. package/dist/temporal/gpu.d.ts +39 -0
  177. package/dist/temporal/gpu.d.ts.map +1 -0
  178. package/dist/temporal/history.d.ts +37 -0
  179. package/dist/temporal/history.d.ts.map +1 -0
  180. package/dist/temporal/index.d.ts +7 -0
  181. package/dist/temporal/index.d.ts.map +1 -0
  182. package/dist/temporal/index.mjs +8 -0
  183. package/dist/temporal/index.mjs.map +1 -0
  184. package/dist/temporal/inspection.d.ts +36 -0
  185. package/dist/temporal/inspection.d.ts.map +1 -0
  186. package/dist/temporal/scene-data-catalog.d.ts +48 -0
  187. package/dist/temporal/scene-data-catalog.d.ts.map +1 -0
  188. package/dist/temporal/scene-data.d.ts +43 -0
  189. package/dist/temporal/scene-data.d.ts.map +1 -0
  190. package/dist/temporal/standard-scene-data.d.ts +61 -0
  191. package/dist/temporal/standard-scene-data.d.ts.map +1 -0
  192. package/dist/temporal/taa-history-resources.d.ts +22 -0
  193. package/dist/temporal/taa-history-resources.d.ts.map +1 -0
  194. package/dist/temporal/taa-history-store.d.ts +27 -0
  195. package/dist/temporal/taa-history-store.d.ts.map +1 -0
  196. package/dist/temporal/taa-resolve.d.ts +15 -0
  197. package/dist/temporal/taa-resolve.d.ts.map +1 -0
  198. package/dist/temporal/temporal-view.d.ts +40 -0
  199. package/dist/temporal/temporal-view.d.ts.map +1 -0
  200. package/dist/temporal/transaction.d.ts +9 -0
  201. package/dist/temporal/transaction.d.ts.map +1 -0
  202. package/dist/temporal/view.d.ts +56 -0
  203. package/dist/temporal/view.d.ts.map +1 -0
  204. package/dist/transmission/backdrop.d.ts +147 -0
  205. package/dist/transmission/backdrop.d.ts.map +1 -0
  206. package/dist/transmission/inspection.d.ts +57 -0
  207. package/dist/transmission/inspection.d.ts.map +1 -0
  208. package/dist/transmission/oracle.d.ts +42 -0
  209. package/dist/transmission/oracle.d.ts.map +1 -0
  210. package/dist/transmission/projection.d.ts +37 -0
  211. package/dist/transmission/projection.d.ts.map +1 -0
  212. package/dist/typed-render-graph-primitives.d.ts +30 -2
  213. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  214. package/dist/typed-shadow-atlas.d.ts +10 -0
  215. package/dist/typed-shadow-atlas.d.ts.map +1 -0
  216. package/dist/typed-shadow-passes.d.ts.map +1 -1
  217. package/dist/volume/capability.d.ts +57 -0
  218. package/dist/volume/capability.d.ts.map +1 -0
  219. package/dist/volume/component.d.ts +61 -0
  220. package/dist/volume/component.d.ts.map +1 -0
  221. package/dist/volume/extract.d.ts +11 -0
  222. package/dist/volume/extract.d.ts.map +1 -0
  223. package/dist/volume/inspection.d.ts +38 -0
  224. package/dist/volume/inspection.d.ts.map +1 -0
  225. package/dist/volume/passes.d.ts +38 -0
  226. package/dist/volume/passes.d.ts.map +1 -0
  227. package/dist/volume/recovery.d.ts +38 -0
  228. package/dist/volume/recovery.d.ts.map +1 -0
  229. package/dist/volume/resources.d.ts +57 -0
  230. package/dist/volume/resources.d.ts.map +1 -0
  231. package/dist/volume/temporal.d.ts +35 -0
  232. package/dist/volume/temporal.d.ts.map +1 -0
  233. package/package.json +24 -19
  234. package/src/__tests__/ai-user-cold-start.integration.test.ts +59 -0
  235. package/src/__tests__/ai-user-public-surface.test-d.ts +45 -0
  236. package/src/__tests__/bloom-exact-zero.unit.test.ts +202 -0
  237. package/src/__tests__/bloom-lifecycle.integration.test.ts +125 -0
  238. package/src/__tests__/construct-renderer-identity.unit.test.ts +4 -3
  239. package/src/__tests__/detached-inspection.integration.test.ts +177 -0
  240. package/src/__tests__/environment-fog-lanes.integration.test.ts +219 -0
  241. package/src/__tests__/environment-generation.integration.test.ts +141 -0
  242. package/src/__tests__/environment-selection.unit.test.ts +245 -0
  243. package/src/__tests__/factory-contract.integration.test.ts +1380 -9
  244. package/src/__tests__/frame-plan-contract.unit.test.ts +90 -0
  245. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +7 -0
  246. package/src/__tests__/gpu-driven-production.integration.test.ts +74 -22
  247. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +37 -0
  248. package/src/__tests__/gpu-scene.unit.test.ts +10 -0
  249. package/src/__tests__/injection-kind-owner.test-d.ts +2 -1
  250. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +14 -14
  251. package/src/__tests__/material-contract-inventory.unit.test.ts +62 -0
  252. package/src/__tests__/material-cooked-projection.unit.test.ts +18 -146
  253. package/src/__tests__/materials-transmission-validation.unit.test.ts +36 -0
  254. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +1 -1
  255. package/src/__tests__/morph-feature-plan.unit.test.ts +7 -0
  256. package/src/__tests__/motion-blur.pixel.integration.test.ts +121 -0
  257. package/src/__tests__/public-surface.test-d.ts +15 -1
  258. package/src/__tests__/render-error-code-owner.test-d.ts +14 -0
  259. package/src/__tests__/render-error-detail-ssot.test-d.ts +11 -2
  260. package/src/__tests__/render-error-exhaustive.test-d.ts +3 -0
  261. package/src/__tests__/render-feature-errors.unit.test.ts +33 -3
  262. package/src/__tests__/render-feature-gpu-work.integration.test.ts +44 -0
  263. package/src/__tests__/render-feature-plan.test-d.ts +22 -89
  264. package/src/__tests__/render-scene-projection.unit.test.ts +28 -0
  265. package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +26 -0
  266. package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +21 -0
  267. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +423 -1
  268. package/src/__tests__/renderer-frame-transaction.integration.test.ts +405 -0
  269. package/src/__tests__/renderer-lifecycle.integration.test.ts +22 -0
  270. package/src/__tests__/scene-data-catalog.unit.test.ts +59 -0
  271. package/src/__tests__/scene-data-consumer.integration.test.ts +67 -0
  272. package/src/__tests__/scene-data-contract.test-d.ts +35 -0
  273. package/src/__tests__/scene-data-inspection.unit.test.ts +41 -0
  274. package/src/__tests__/scene-data-public-surface.test-d.ts +34 -0
  275. package/src/__tests__/shader-manifest-fixture.ts +111 -0
  276. package/src/__tests__/skinned-shadow-caster.test.ts +123 -0
  277. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +24 -3
  278. package/src/__tests__/standard-pipeline.dawn.test.ts +15 -0
  279. package/src/__tests__/standard-pipeline.integration.test.ts +543 -1
  280. package/src/__tests__/standard-profile-oracle.unit.test.ts +12 -2
  281. package/src/__tests__/standard-temporal-producer.integration.test.ts +35 -0
  282. package/src/__tests__/surface-configuration.unit.test.ts +211 -12
  283. package/src/__tests__/taa-transaction.integration.test.ts +30 -0
  284. package/src/__tests__/temporal-admission.integration.test.ts +40 -0
  285. package/src/__tests__/temporal-coverage.unit.test.ts +35 -0
  286. package/src/__tests__/temporal-demand.unit.test.ts +44 -0
  287. package/src/__tests__/temporal-frame-coordinator.unit.test.ts +64 -0
  288. package/src/__tests__/temporal-graph-topology.unit.test.ts +51 -0
  289. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +170 -0
  290. package/src/__tests__/temporal-performance.integration.test.ts +615 -0
  291. package/src/__tests__/temporal-reset-matrix.unit.test.ts +97 -0
  292. package/src/__tests__/temporal-transaction.integration.test.ts +60 -0
  293. package/src/__tests__/temporal-view.unit.test.ts +152 -0
  294. package/src/__tests__/transmission-prewarm.unit.test.ts +93 -0
  295. package/src/__tests__/typed-pipeline-topology.unit.test.ts +230 -1
  296. package/src/__tests__/urp-pipeline-targets.unit.test.ts +25 -1
  297. package/src/__tests__/urp-pipeline.unit.test.ts +4 -3
  298. package/src/__tests__/visibility-extract.integration.test.ts +27 -1
  299. package/src/__tests__/visibility-producer-matrix.integration.test.ts +10 -0
  300. package/src/__tests__/volume-optics-oracle.unit.test.ts +85 -0
  301. package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +655 -0
  302. package/src/__tests__/volumetric-fog-component.unit.test.ts +71 -0
  303. package/src/__tests__/volumetric-fog-composite-stage-readback.dawn.test.ts +376 -0
  304. package/src/__tests__/volumetric-fog-errors.unit.test.ts +51 -0
  305. package/src/__tests__/volumetric-fog-inspection.unit.test.ts +77 -0
  306. package/src/__tests__/volumetric-fog-light-capability.unit.test.ts +19 -0
  307. package/src/__tests__/volumetric-fog-light-consumers.integration.test.ts +18 -0
  308. package/src/__tests__/volumetric-fog-light-errors.unit.test.ts +17 -0
  309. package/src/__tests__/volumetric-fog-light-topology.unit.test.ts +21 -0
  310. package/src/__tests__/volumetric-fog-light-transaction.integration.test.ts +53 -0
  311. package/src/__tests__/volumetric-fog-m9-watcher.integration.test.ts +27 -0
  312. package/src/__tests__/volumetric-fog-point-light-owner.integration.test.ts +44 -0
  313. package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +49 -0
  314. package/src/__tests__/volumetric-fog-point-spot-contract.unit.test.ts +28 -0
  315. package/src/__tests__/volumetric-fog-point-spot-lkg.integration.test.ts +65 -0
  316. package/src/__tests__/volumetric-fog-point-spot-selection.integration.test.ts +49 -0
  317. package/src/__tests__/volumetric-fog-point-spot-temporal.unit.test.ts +55 -0
  318. package/src/__tests__/volumetric-fog-projector-contract.unit.test.ts +22 -0
  319. package/src/__tests__/volumetric-fog-projector-inspection.unit.test.ts +12 -0
  320. package/src/__tests__/volumetric-fog-projector-surface-volume.integration.test.ts +11 -0
  321. package/src/__tests__/volumetric-fog-projector-transaction.integration.test.ts +26 -0
  322. package/src/__tests__/volumetric-fog-recovery.integration.test.ts +47 -0
  323. package/src/__tests__/volumetric-fog-selected-light-resolution.integration.test.ts +63 -0
  324. package/src/__tests__/volumetric-fog-spot-closure.integration.test.ts +26 -0
  325. package/src/__tests__/volumetric-fog-spot-contract.test-d.ts +21 -0
  326. package/src/__tests__/volumetric-fog-spot-contract.unit.test.ts +27 -0
  327. package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +14 -0
  328. package/src/__tests__/volumetric-fog-spot-optics.integration.test.ts +29 -0
  329. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +550 -0
  330. package/src/__tests__/volumetric-fog-temporal-selected-light.unit.test.ts +33 -0
  331. package/src/__tests__/volumetric-fog-temporal.unit.test.ts +45 -0
  332. package/src/__tests__/volumetric-fog-topology.unit.test.ts +237 -0
  333. package/src/__tests__/volumetric-fog-transparent.integration.test.ts +27 -0
  334. package/src/assembly/backend-contract.ts +47 -1
  335. package/src/assembly/factory.ts +1480 -505
  336. package/src/assembly/host-contract.ts +4 -0
  337. package/src/assembly/renderer-frame-transaction.ts +75 -0
  338. package/src/assembly/renderer-inspection.ts +112 -0
  339. package/src/assembly/renderer-lifecycle.ts +6 -0
  340. package/src/components/__tests__/motion-blur.unit.test.ts +14 -0
  341. package/src/components/__tests__/schema-contract.unit.test.ts +6 -1
  342. package/src/components/atmosphere.ts +10 -0
  343. package/src/components/camera.ts +2 -1
  344. package/src/components/fog.ts +9 -0
  345. package/src/components/index.ts +3 -0
  346. package/src/components/light-helpers.ts +4 -0
  347. package/src/components/motion-blur.ts +8 -0
  348. package/src/components/spot-light.ts +22 -3
  349. package/src/construct-renderer.ts +40 -3
  350. package/src/device/device-scope.ts +15 -1
  351. package/src/device/gpu-residency.ts +168 -58
  352. package/src/environment/frame.ts +185 -0
  353. package/src/environment/generation.ts +23 -0
  354. package/src/environment/graph.ts +9 -0
  355. package/src/environment/inspection.ts +87 -0
  356. package/src/environment/lifecycle.ts +250 -0
  357. package/src/environment/signature.ts +55 -0
  358. package/src/errors/render.ts +404 -1
  359. package/src/extract/camera.ts +78 -0
  360. package/src/extract/environment.ts +171 -0
  361. package/src/extract/visibility.ts +38 -19
  362. package/src/features/host.ts +36 -5
  363. package/src/features/motion-blur/__tests__/motion-blur-feature.unit.test.ts +67 -0
  364. package/src/features/motion-blur/__tests__/motion-blur-params.unit.test.ts +53 -0
  365. package/src/features/motion-blur/motion-blur-feature.ts +119 -0
  366. package/src/features/motion-blur/motion-blur-params.ts +89 -0
  367. package/src/features/plan.ts +32 -3
  368. package/src/features/prepared-gpu-work.ts +21 -6
  369. package/src/features/prepared-graphics.ts +2 -1
  370. package/src/features/render-graph-raster.ts +2 -1
  371. package/src/features/targets.ts +24 -2
  372. package/src/features/types.ts +13 -0
  373. package/src/fullscreen-post-process-pass.ts +34 -4
  374. package/src/gpu-scene.ts +24 -0
  375. package/src/gpu-usage.ts +2 -0
  376. package/src/ibl/skylight-bind-group.ts +30 -38
  377. package/src/index.ts +104 -7
  378. package/src/inspection-types.ts +48 -0
  379. package/src/internal.ts +5 -0
  380. package/src/light-buffer-layout.ts +59 -26
  381. package/src/materials.ts +119 -24
  382. package/src/pbr-pipeline.ts +91 -29
  383. package/src/pipeline/standard-forward-lane.ts +178 -101
  384. package/src/pipeline/standard-pipeline.ts +176 -105
  385. package/src/pipeline/standard-post.ts +373 -0
  386. package/src/pipeline/standard-profile.ts +26 -3
  387. package/src/pipeline-builder.ts +102 -12
  388. package/src/pipeline-spec.ts +9 -0
  389. package/src/plugin.ts +2 -0
  390. package/src/record/__tests__/fullscreen-temporal-routing.unit.test.ts +25 -0
  391. package/src/record/__tests__/main-pass-geometry.unit.test.ts +47 -0
  392. package/src/record/__tests__/material-bg-cache.unit.test.ts +12 -1
  393. package/src/record/__tests__/material-pipeline-pending-cache.unit.test.ts +22 -0
  394. package/src/record/__tests__/sprite-material-abi.unit.test.ts +75 -0
  395. package/src/record/__tests__/standard-pbr-ubo-layout.unit.test.ts +67 -0
  396. package/src/record/__tests__/temporal-payload.unit.test.ts +164 -0
  397. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +127 -0
  398. package/src/record/frame-lighting.ts +103 -89
  399. package/src/record/frame-snapshot.ts +170 -6
  400. package/src/record/frame-targets.ts +21 -8
  401. package/src/record/frame.ts +1014 -7
  402. package/src/record/gpu-timing.ts +224 -0
  403. package/src/record/main-pass-geometry.ts +86 -40
  404. package/src/record/main-pass-material.ts +120 -68
  405. package/src/record/main-pass-sprite-draws.ts +78 -101
  406. package/src/record/main-pass.ts +77 -4
  407. package/src/record/mesh-ssbo.ts +22 -3
  408. package/src/record/render-context.ts +194 -23
  409. package/src/record/shadow-pass.ts +197 -58
  410. package/src/record/skybox-post-pass.ts +97 -41
  411. package/src/record/typed-frame-graph.ts +704 -30
  412. package/src/record/view-ubo.ts +52 -4
  413. package/src/render-contract.ts +181 -6
  414. package/src/render-data.ts +50 -22
  415. package/src/render-graph-primitives.ts +18 -1
  416. package/src/render-pipeline.ts +144 -27
  417. package/src/render-system-extract.ts +522 -72
  418. package/src/render-system.ts +561 -41
  419. package/src/renderer-inspect.ts +66 -0
  420. package/src/scene/render-scene.ts +252 -7
  421. package/src/temporal/__tests__/taa-history-resources.unit.test.ts +45 -0
  422. package/src/temporal/coverage.ts +76 -0
  423. package/src/temporal/frame-coordinator.ts +311 -0
  424. package/src/temporal/frame.ts +128 -0
  425. package/src/temporal/gpu.ts +287 -0
  426. package/src/temporal/history.ts +92 -0
  427. package/src/temporal/index.ts +6 -0
  428. package/src/temporal/inspection.ts +97 -0
  429. package/src/temporal/scene-data-catalog.ts +200 -0
  430. package/src/temporal/scene-data.ts +149 -0
  431. package/src/temporal/standard-scene-data.ts +182 -0
  432. package/src/temporal/taa-history-resources.ts +128 -0
  433. package/src/temporal/taa-history-store.ts +79 -0
  434. package/src/temporal/taa-resolve.ts +34 -0
  435. package/src/temporal/temporal-view.ts +169 -0
  436. package/src/temporal/transaction.ts +17 -0
  437. package/src/temporal/view.ts +161 -0
  438. package/src/transmission/__tests__/capability.unit.test.ts +83 -0
  439. package/src/transmission/__tests__/composition.integration.test.ts +161 -0
  440. package/src/transmission/__tests__/inspection.unit.test.ts +241 -0
  441. package/src/transmission/__tests__/lifecycle.integration.test.ts +96 -0
  442. package/src/transmission/__tests__/oracle.unit.test.ts +131 -0
  443. package/src/transmission/__tests__/projection.unit.test.ts +71 -0
  444. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +437 -0
  445. package/src/transmission/__tests__/transmission-backdrop-topology.unit.test.ts +109 -0
  446. package/src/transmission/__tests__/transmission-backdrop.dawn.test.ts +105 -0
  447. package/src/transmission/backdrop.ts +572 -0
  448. package/src/transmission/inspection.ts +190 -0
  449. package/src/transmission/oracle.ts +141 -0
  450. package/src/transmission/projection.ts +83 -0
  451. package/src/typed-render-graph-primitives.ts +194 -11
  452. package/src/typed-shadow-atlas.ts +17 -0
  453. package/src/typed-shadow-passes.ts +6 -5
  454. package/src/volume/capability.ts +173 -0
  455. package/src/volume/component.ts +110 -0
  456. package/src/volume/extract.ts +21 -0
  457. package/src/volume/inspection.ts +78 -0
  458. package/src/volume/passes.ts +680 -0
  459. package/src/volume/recovery.ts +86 -0
  460. package/src/volume/resources.ts +236 -0
  461. package/src/volume/temporal.ts +89 -0
  462. package/dist/__tests__/authoring-path.unit.test.d.ts +0 -2
  463. package/dist/__tests__/authoring-path.unit.test.d.ts.map +0 -1
  464. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts +0 -2
  465. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts.map +0 -1
  466. package/dist/__tests__/callback-inference.test-d.d.ts +0 -2
  467. package/dist/__tests__/callback-inference.test-d.d.ts.map +0 -1
  468. package/dist/__tests__/cluster-binner.test.d.ts +0 -2
  469. package/dist/__tests__/cluster-binner.test.d.ts.map +0 -1
  470. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts +0 -2
  471. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts.map +0 -1
  472. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts +0 -2
  473. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts.map +0 -1
  474. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +0 -2
  475. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +0 -1
  476. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +0 -2
  477. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +0 -1
  478. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts +0 -2
  479. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts.map +0 -1
  480. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts +0 -2
  481. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts.map +0 -1
  482. package/dist/__tests__/factory-contract.integration.test.d.ts +0 -2
  483. package/dist/__tests__/factory-contract.integration.test.d.ts.map +0 -1
  484. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts +0 -2
  485. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts.map +0 -1
  486. package/dist/__tests__/frame-observation.contract.test.d.ts +0 -2
  487. package/dist/__tests__/frame-observation.contract.test.d.ts.map +0 -1
  488. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +0 -2
  489. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +0 -1
  490. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts +0 -2
  491. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts.map +0 -1
  492. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts +0 -6
  493. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +0 -1
  494. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts +0 -2
  495. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts.map +0 -1
  496. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts +0 -2
  497. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts.map +0 -1
  498. package/dist/__tests__/gpu-driven-production.integration.test.d.ts +0 -2
  499. package/dist/__tests__/gpu-driven-production.integration.test.d.ts.map +0 -1
  500. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts +0 -2
  501. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts.map +0 -1
  502. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +0 -18
  503. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +0 -1
  504. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts +0 -2
  505. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts.map +0 -1
  506. package/dist/__tests__/gpu-driven-view-reference.d.ts +0 -15
  507. package/dist/__tests__/gpu-driven-view-reference.d.ts.map +0 -1
  508. package/dist/__tests__/gpu-driven-view.browser.test.d.ts +0 -2
  509. package/dist/__tests__/gpu-driven-view.browser.test.d.ts.map +0 -1
  510. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts +0 -2
  511. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts.map +0 -1
  512. package/dist/__tests__/gpu-driven-view.unit.test.d.ts +0 -2
  513. package/dist/__tests__/gpu-driven-view.unit.test.d.ts.map +0 -1
  514. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts +0 -2
  515. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts.map +0 -1
  516. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts +0 -7
  517. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +0 -1
  518. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts +0 -2
  519. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts.map +0 -1
  520. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts +0 -2
  521. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts.map +0 -1
  522. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts +0 -2
  523. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts.map +0 -1
  524. package/dist/__tests__/gpu-scene.dawn.test.d.ts +0 -2
  525. package/dist/__tests__/gpu-scene.dawn.test.d.ts.map +0 -1
  526. package/dist/__tests__/gpu-scene.unit.test.d.ts +0 -2
  527. package/dist/__tests__/gpu-scene.unit.test.d.ts.map +0 -1
  528. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +0 -2
  529. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +0 -1
  530. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts +0 -2
  531. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts.map +0 -1
  532. package/dist/__tests__/injection-kind-owner.test-d.d.ts +0 -2
  533. package/dist/__tests__/injection-kind-owner.test-d.d.ts.map +0 -1
  534. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts +0 -2
  535. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts.map +0 -1
  536. package/dist/__tests__/light-buffer-layout.unit.test.d.ts +0 -2
  537. package/dist/__tests__/light-buffer-layout.unit.test.d.ts.map +0 -1
  538. package/dist/__tests__/material-contract-inventory.unit.test.d.ts +0 -2
  539. package/dist/__tests__/material-contract-inventory.unit.test.d.ts.map +0 -1
  540. package/dist/__tests__/material-cooked-projection.unit.test.d.ts +0 -2
  541. package/dist/__tests__/material-cooked-projection.unit.test.d.ts.map +0 -1
  542. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts +0 -2
  543. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts.map +0 -1
  544. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts +0 -2
  545. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts.map +0 -1
  546. package/dist/__tests__/material-stride-surface.unit.test.d.ts +0 -2
  547. package/dist/__tests__/material-stride-surface.unit.test.d.ts.map +0 -1
  548. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts +0 -2
  549. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts.map +0 -1
  550. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts +0 -2
  551. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts.map +0 -1
  552. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts +0 -2
  553. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts.map +0 -1
  554. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts +0 -2
  555. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts.map +0 -1
  556. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts +0 -2
  557. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts.map +0 -1
  558. package/dist/__tests__/morph-feature-plan.unit.test.d.ts +0 -2
  559. package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +0 -1
  560. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts +0 -2
  561. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts.map +0 -1
  562. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts +0 -2
  563. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts.map +0 -1
  564. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts +0 -2
  565. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts.map +0 -1
  566. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts +0 -2
  567. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts.map +0 -1
  568. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts +0 -2
  569. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts.map +0 -1
  570. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts +0 -2
  571. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts.map +0 -1
  572. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts +0 -2
  573. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts.map +0 -1
  574. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts +0 -2
  575. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts.map +0 -1
  576. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts +0 -2
  577. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts.map +0 -1
  578. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts +0 -2
  579. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts.map +0 -1
  580. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts +0 -2
  581. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts.map +0 -1
  582. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts +0 -2
  583. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts.map +0 -1
  584. package/dist/__tests__/profiler-default-off.test.d.ts +0 -2
  585. package/dist/__tests__/profiler-default-off.test.d.ts.map +0 -1
  586. package/dist/__tests__/profiler-phase-catalog.test.d.ts +0 -2
  587. package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +0 -1
  588. package/dist/__tests__/profiler-phase-integration.test.d.ts +0 -2
  589. package/dist/__tests__/profiler-phase-integration.test.d.ts.map +0 -1
  590. package/dist/__tests__/profiler-phase-token.test.d.ts +0 -2
  591. package/dist/__tests__/profiler-phase-token.test.d.ts.map +0 -1
  592. package/dist/__tests__/public-surface.test-d.d.ts +0 -2
  593. package/dist/__tests__/public-surface.test-d.d.ts.map +0 -1
  594. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts +0 -2
  595. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts.map +0 -1
  596. package/dist/__tests__/render-error-code-owner.test-d.d.ts +0 -2
  597. package/dist/__tests__/render-error-code-owner.test-d.d.ts.map +0 -1
  598. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts +0 -2
  599. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts.map +0 -1
  600. package/dist/__tests__/render-error-exhaustive.test-d.d.ts +0 -2
  601. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +0 -1
  602. package/dist/__tests__/render-feature-assembly.test-d.d.ts +0 -2
  603. package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +0 -1
  604. package/dist/__tests__/render-feature-context.test-d.d.ts +0 -2
  605. package/dist/__tests__/render-feature-context.test-d.d.ts.map +0 -1
  606. package/dist/__tests__/render-feature-contract.test-d.d.ts +0 -2
  607. package/dist/__tests__/render-feature-contract.test-d.d.ts.map +0 -1
  608. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts +0 -2
  609. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts.map +0 -1
  610. package/dist/__tests__/render-feature-docs.unit.test.d.ts +0 -2
  611. package/dist/__tests__/render-feature-docs.unit.test.d.ts.map +0 -1
  612. package/dist/__tests__/render-feature-errors.unit.test.d.ts +0 -2
  613. package/dist/__tests__/render-feature-errors.unit.test.d.ts.map +0 -1
  614. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts +0 -2
  615. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts.map +0 -1
  616. package/dist/__tests__/render-feature-plan.test-d.d.ts +0 -2
  617. package/dist/__tests__/render-feature-plan.test-d.d.ts.map +0 -1
  618. package/dist/__tests__/render-feature-plan.unit.test.d.ts +0 -2
  619. package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +0 -1
  620. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts +0 -2
  621. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts.map +0 -1
  622. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts +0 -2
  623. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts.map +0 -1
  624. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +0 -2
  625. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +0 -1
  626. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts +0 -2
  627. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts.map +0 -1
  628. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts +0 -2
  629. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts.map +0 -1
  630. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts +0 -2
  631. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts.map +0 -1
  632. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts +0 -2
  633. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts.map +0 -1
  634. package/dist/__tests__/render-feature-public-surface.test-d.d.ts +0 -2
  635. package/dist/__tests__/render-feature-public-surface.test-d.d.ts.map +0 -1
  636. package/dist/__tests__/render-feature-retry.unit.test.d.ts +0 -2
  637. package/dist/__tests__/render-feature-retry.unit.test.d.ts.map +0 -1
  638. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts +0 -2
  639. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts.map +0 -1
  640. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts +0 -2
  641. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts.map +0 -1
  642. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts +0 -2
  643. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts.map +0 -1
  644. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts +0 -2
  645. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts.map +0 -1
  646. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts +0 -2
  647. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts.map +0 -1
  648. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts +0 -2
  649. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts.map +0 -1
  650. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts +0 -7
  651. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts.map +0 -1
  652. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts +0 -2
  653. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts.map +0 -1
  654. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts +0 -2
  655. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts.map +0 -1
  656. package/dist/__tests__/render-graph-hzb-gpu.d.ts +0 -7
  657. package/dist/__tests__/render-graph-hzb-gpu.d.ts.map +0 -1
  658. package/dist/__tests__/render-graph-hzb.browser.test.d.ts +0 -2
  659. package/dist/__tests__/render-graph-hzb.browser.test.d.ts.map +0 -1
  660. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts +0 -2
  661. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts.map +0 -1
  662. package/dist/__tests__/render-graph-primitives.unit.test.d.ts +0 -2
  663. package/dist/__tests__/render-graph-primitives.unit.test.d.ts.map +0 -1
  664. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts +0 -12
  665. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts.map +0 -1
  666. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts +0 -2
  667. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts.map +0 -1
  668. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts +0 -2
  669. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts.map +0 -1
  670. package/dist/__tests__/render-scene-projection.unit.test.d.ts +0 -2
  671. package/dist/__tests__/render-scene-projection.unit.test.d.ts.map +0 -1
  672. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts +0 -2
  673. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts.map +0 -1
  674. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +0 -2
  675. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +0 -1
  676. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts +0 -2
  677. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts.map +0 -1
  678. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts +0 -2
  679. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts.map +0 -1
  680. package/dist/__tests__/shader-stage-surface.unit.test.d.ts +0 -2
  681. package/dist/__tests__/shader-stage-surface.unit.test.d.ts.map +0 -1
  682. package/dist/__tests__/ssao-config.unit.test.d.ts +0 -2
  683. package/dist/__tests__/ssao-config.unit.test.d.ts.map +0 -1
  684. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts +0 -2
  685. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts.map +0 -1
  686. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +0 -2
  687. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +0 -1
  688. package/dist/__tests__/standard-descriptors.test-d.d.ts +0 -2
  689. package/dist/__tests__/standard-descriptors.test-d.d.ts.map +0 -1
  690. package/dist/__tests__/standard-pipeline.dawn.test.d.ts +0 -2
  691. package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +0 -1
  692. package/dist/__tests__/standard-pipeline.integration.test.d.ts +0 -2
  693. package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +0 -1
  694. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +0 -2
  695. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +0 -1
  696. package/dist/__tests__/surface-configuration.unit.test.d.ts +0 -2
  697. package/dist/__tests__/surface-configuration.unit.test.d.ts.map +0 -1
  698. package/dist/__tests__/texture-usage-surface.unit.test.d.ts +0 -2
  699. package/dist/__tests__/texture-usage-surface.unit.test.d.ts.map +0 -1
  700. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts +0 -2
  701. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts.map +0 -1
  702. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts +0 -2
  703. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts.map +0 -1
  704. package/dist/__tests__/urp-pipeline.unit.test.d.ts +0 -2
  705. package/dist/__tests__/urp-pipeline.unit.test.d.ts.map +0 -1
  706. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts +0 -2
  707. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts.map +0 -1
  708. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts +0 -2
  709. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts.map +0 -1
  710. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts +0 -2
  711. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts.map +0 -1
  712. package/dist/__tests__/visibility-extract.integration.test.d.ts +0 -2
  713. package/dist/__tests__/visibility-extract.integration.test.d.ts.map +0 -1
  714. package/dist/__tests__/visibility-extract.perf.test.d.ts +0 -2
  715. package/dist/__tests__/visibility-extract.perf.test.d.ts.map +0 -1
  716. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts +0 -2
  717. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts.map +0 -1
  718. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts +0 -2
  719. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts.map +0 -1
  720. package/dist/__tests__/visibility-instances.integration.test.d.ts +0 -2
  721. package/dist/__tests__/visibility-instances.integration.test.d.ts.map +0 -1
  722. package/dist/__tests__/visibility-multi-world.integration.test.d.ts +0 -2
  723. package/dist/__tests__/visibility-multi-world.integration.test.d.ts.map +0 -1
  724. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts +0 -2
  725. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts.map +0 -1
  726. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts +0 -2
  727. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts.map +0 -1
  728. package/dist/__tests__/visibility-public-surface.test-d.d.ts +0 -2
  729. package/dist/__tests__/visibility-public-surface.test-d.d.ts.map +0 -1
  730. package/dist/__tests__/visibility-resolver.unit.test.d.ts +0 -2
  731. package/dist/__tests__/visibility-resolver.unit.test.d.ts.map +0 -1
  732. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +0 -2
  733. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +0 -1
  734. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts +0 -2
  735. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts.map +0 -1
  736. package/dist/__tests__/vocabulary.unit.test.d.ts +0 -2
  737. package/dist/__tests__/vocabulary.unit.test.d.ts.map +0 -1
  738. package/dist/chunk-CQXZC5XI.mjs.map +0 -1
  739. package/dist/chunk-HCOGPHKS.mjs +0 -93
  740. package/dist/chunk-HCOGPHKS.mjs.map +0 -1
  741. package/dist/chunk-YEJIUW7D.mjs.map +0 -1
  742. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts +0 -2
  743. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts.map +0 -1
  744. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts +0 -2
  745. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts.map +0 -1
  746. package/dist/components/__tests__/schema-contract.unit.test.d.ts +0 -2
  747. package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +0 -1
  748. package/dist/components/__tests__/schema-parity.unit.test.d.ts +0 -2
  749. package/dist/components/__tests__/schema-parity.unit.test.d.ts.map +0 -1
  750. package/dist/components/__tests__/visibility-schema.unit.test.d.ts +0 -2
  751. package/dist/components/__tests__/visibility-schema.unit.test.d.ts.map +0 -1
  752. package/dist/points-lines/__tests__/bounds.unit.test.d.ts +0 -2
  753. package/dist/points-lines/__tests__/bounds.unit.test.d.ts.map +0 -1
  754. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts +0 -2
  755. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts.map +0 -1
  756. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts +0 -2
  757. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts.map +0 -1
  758. package/dist/points-lines/__tests__/inspection.unit.test.d.ts +0 -2
  759. package/dist/points-lines/__tests__/inspection.unit.test.d.ts.map +0 -1
  760. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts +0 -2
  761. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts.map +0 -1
  762. package/dist/points-lines/__tests__/points-lines.bench.d.ts +0 -2
  763. package/dist/points-lines/__tests__/points-lines.bench.d.ts.map +0 -1
  764. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts +0 -2
  765. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts.map +0 -1
  766. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts +0 -2
  767. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts.map +0 -1
  768. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts +0 -2
  769. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts.map +0 -1
  770. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts +0 -2
  771. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts.map +0 -1
  772. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts +0 -2
  773. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts.map +0 -1
  774. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +0 -2
  775. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +0 -1
  776. package/dist/record/__tests__/video-texture-view.unit.test.d.ts +0 -2
  777. package/dist/record/__tests__/video-texture-view.unit.test.d.ts.map +0 -1
@@ -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 =
@@ -12,6 +12,8 @@ export type RenderFeatureTargetKind = 'scene-color' | 'scene-depth';
12
12
  * internal graph key.
13
13
  */
14
14
  export interface RenderFeatureTargetHandle {
15
+ /** Stable alias used when a pipeline exposes more than one color role. */
16
+ readonly name?: string;
15
17
  readonly kind: RenderFeatureTargetKind;
16
18
  readonly format: TextureFormat;
17
19
  readonly sampleCount: 1 | 4;
@@ -19,6 +21,7 @@ export interface RenderFeatureTargetHandle {
19
21
  }
20
22
 
21
23
  export interface RenderFeatureTargetInput {
24
+ readonly name?: string;
22
25
  readonly kind: RenderFeatureTargetKind;
23
26
  readonly format: TextureFormat;
24
27
  readonly sampleCount: 1 | 4;
@@ -54,17 +57,36 @@ export function resolveStandardRenderFeatureTargets(input: {
54
57
  readonly colorAttachmentFormat: TextureFormat;
55
58
  }): readonly RenderFeatureTargetHandle[] {
56
59
  const sampleCount: 1 | 4 = input.antialias === 'msaa' && input.multisample ? 4 : 1;
57
- const linearLdr = input.tonemap === 'none' && input.storageBuffer;
60
+ const linearLdr =
61
+ (input.tonemap === 'none' && input.storageBuffer) ||
62
+ input.antialias === 'fxaa' ||
63
+ (input.antialias === 'msaa' && input.multisample);
64
+ const colorFormat =
65
+ input.tonemap !== 'none' || linearLdr ? 'rgba16float' : input.colorAttachmentFormat;
58
66
  return [
59
67
  createRenderFeatureTarget({
68
+ name: 'color',
60
69
  kind: 'scene-color',
61
- format: input.tonemap !== 'none' || linearLdr ? 'rgba16float' : input.colorAttachmentFormat,
70
+ format: colorFormat,
62
71
  sampleCount,
63
72
  }),
64
73
  createRenderFeatureTarget({
74
+ name: 'depth',
65
75
  kind: 'scene-depth',
66
76
  format: 'depth24plus-stencil8',
67
77
  sampleCount,
68
78
  }),
79
+ createRenderFeatureTarget({
80
+ name: 'motion-input',
81
+ kind: 'scene-color',
82
+ format: colorFormat,
83
+ sampleCount,
84
+ }),
85
+ createRenderFeatureTarget({
86
+ name: 'motion-output',
87
+ kind: 'scene-color',
88
+ format: colorFormat,
89
+ sampleCount: 1,
90
+ }),
69
91
  ];
70
92
  }
@@ -42,6 +42,17 @@ export type {
42
42
  /** Closed lifecycle states exposed by the feature host. */
43
43
  export type RenderFeatureStatus = 'active' | 'failed' | 'disabled' | 'disposed';
44
44
 
45
+ /**
46
+ * Shader preparation policy for feature-owned GPU programs.
47
+ *
48
+ * `validated` waits for the backend's diagnostic-rich shader preparation before
49
+ * exposing a module to the render graph. `immediate` is reserved for generated
50
+ * feature programs that must hand a WebGPU module to pipeline creation without
51
+ * serialising first-use on `getCompilationInfo()`; pipeline creation remains
52
+ * the validation boundary for that mode.
53
+ */
54
+ export type RenderFeatureShaderModuleMode = 'validated' | 'immediate';
55
+
45
56
  export interface RenderFeatureResourceHandle {
46
57
  readonly __renderFeatureResource: unique symbol;
47
58
  }
@@ -79,6 +90,8 @@ export interface RenderFeatureExtractContext {
79
90
  export interface RenderFeature<FrameData> {
80
91
  readonly identity: string;
81
92
  readonly requiredCapabilities?: readonly RenderFeatureCapabilityKey[];
93
+ /** Optional feature-owned shader preparation policy; defaults to `validated`. */
94
+ readonly shaderModuleMode?: RenderFeatureShaderModuleMode;
82
95
  /**
83
96
  * Material shader identifiers whose modules must be ready before the first
84
97
  * frame. The renderer resolves these against the loaded manifest and seeds
@@ -23,6 +23,7 @@ import type {
23
23
  Sampler,
24
24
  TextureView,
25
25
  } from '@forgeax/engine-rhi';
26
+ import { GPU_SHADER_STAGE_FRAGMENT } from './gpu-stage';
26
27
  import type { BglKind } from './pipeline-spec';
27
28
  import { buildBindGroupLayoutDescriptor, type PipelineSpec } from './pipeline-spec';
28
29
 
@@ -103,6 +104,15 @@ export interface PostProcessShaderEntry {
103
104
  readonly reads?: readonly (string | PostProcessReadEntry)[] | undefined;
104
105
  }
105
106
 
107
+ /** Whether a feature binding opts into the temporal multi-read contract. */
108
+ export function isTemporalFullscreenBinding(values: Readonly<Record<string, unknown>>): boolean {
109
+ return (
110
+ values.temporal !== undefined ||
111
+ values.shader === 'forgeax.taa-resolve' ||
112
+ values.shader === 'forgeax.motion-blur'
113
+ );
114
+ }
115
+
106
116
  /**
107
117
  * Structured read entry for a post-process shader.
108
118
  *
@@ -252,6 +262,7 @@ export function buildFullscreenPostProcessPass(
252
262
  bindGroupLayout: BindGroupLayout;
253
263
  sampler: Sampler | null;
254
264
  depthSampler: Sampler | null;
265
+ extraColorBindings: readonly number[];
255
266
  createHandle: (
256
267
  name: string,
257
268
  pipeline: unknown,
@@ -279,11 +290,20 @@ export function buildFullscreenPostProcessPass(
279
290
  : entry.params !== undefined
280
291
  ? 'fullscreen-post-with-params'
281
292
  : 'fullscreen-post';
282
- const bglRes = device.createBindGroupLayout(
283
- buildBindGroupLayoutDescriptor(FULLSCREEN_DEFAULT_SPEC, {
284
- kind: bglKind,
285
- }),
293
+ const descriptor = buildBindGroupLayoutDescriptor(FULLSCREEN_DEFAULT_SPEC, { kind: bglKind });
294
+ const colorReads = (entry.reads ?? []).filter(
295
+ (read) => typeof read === 'string' || read.sampleType !== 'depth',
286
296
  );
297
+ const extraColorCount = Math.max(0, colorReads.length - 1);
298
+ const firstExtraBinding = hasDepth ? 5 : entry.params === undefined ? 2 : 3;
299
+ for (let index = 0; index < extraColorCount; index += 1) {
300
+ descriptor.entries.push({
301
+ binding: firstExtraBinding + index,
302
+ visibility: GPU_SHADER_STAGE_FRAGMENT,
303
+ texture: { sampleType: 'float', viewDimension: '2d' },
304
+ });
305
+ }
306
+ const bglRes = device.createBindGroupLayout(descriptor);
287
307
  if (!bglRes.ok) {
288
308
  ctx.errorRegistry.fire(bglRes.error);
289
309
  return null;
@@ -297,6 +317,9 @@ export function buildFullscreenPostProcessPass(
297
317
  bindGroupLayout: bglRes.value,
298
318
  sampler,
299
319
  depthSampler,
320
+ extraColorBindings: Object.freeze(
321
+ Array.from({ length: extraColorCount }, (_, index) => firstExtraBinding + index),
322
+ ),
300
323
  createHandle: (name, pipeline, paramsBuffer) => ({
301
324
  name,
302
325
  paramsBuffer,
@@ -334,6 +357,7 @@ export function createFullscreenBindGroup(
334
357
  paramsBuffer?: Buffer | null,
335
358
  depthTexView?: TextureView | null,
336
359
  depthSampler?: Sampler | null,
360
+ additionalViews: readonly { readonly binding: number; readonly view: TextureView }[] = [],
337
361
  ): BindGroup | null {
338
362
  const entries: { binding: number; resource: { kind: string; value: unknown } }[] = [
339
363
  { binding: 0, resource: { kind: 'textureView', value: inputView } },
@@ -353,6 +377,12 @@ export function createFullscreenBindGroup(
353
377
  entries.push({ binding: 3, resource: { kind: 'textureView', value: depthTexView } });
354
378
  entries.push({ binding: 4, resource: { kind: 'sampler', value: depthSampler } });
355
379
  }
380
+ for (const additional of additionalViews) {
381
+ entries.push({
382
+ binding: additional.binding,
383
+ resource: { kind: 'textureView', value: additional.view },
384
+ });
385
+ }
356
386
  const res = device.createBindGroup({
357
387
  label: 'fullscreen-post-process-bg',
358
388
  layout: bgl,
package/src/gpu-scene.ts CHANGED
@@ -294,6 +294,30 @@ export class GpuScene {
294
294
  });
295
295
  }
296
296
 
297
+ /** Publish current transforms as previous only after a successful submit. */
298
+ commitTemporalFrame(): Result<void, RhiError> {
299
+ const nextTransform = this.tableBytes.transform.slice(0);
300
+ const next = new Uint8Array(nextTransform);
301
+ const current = new Uint8Array(this.tableBytes.transform);
302
+ const currentOffset = offset(TRANSFORM, 'currentWorld');
303
+ const previousOffset = offset(TRANSFORM, 'previousWorld');
304
+ for (let index = 0; index < this.capacity; index += 1) {
305
+ next.set(
306
+ current.subarray(
307
+ index * TRANSFORM.stride + currentOffset,
308
+ index * TRANSFORM.stride + currentOffset + 64,
309
+ ),
310
+ index * TRANSFORM.stride + previousOffset,
311
+ );
312
+ }
313
+ const uploaded = this.device.queue.writeBuffer(this.buffers.transform, 0, next);
314
+ if (!uploaded.ok) return uploaded;
315
+ this.tableBytes.transform = nextTransform;
316
+ this.uploadRanges += 1;
317
+ this.uploadBytes += next.byteLength;
318
+ return ok(undefined);
319
+ }
320
+
297
321
  rebuild(slots: readonly RenderSceneSlot[]): Result<GpuSceneSyncResult, RhiError> {
298
322
  this.allocations.clear();
299
323
  this.instances.reset();
package/src/gpu-usage.ts CHANGED
@@ -12,3 +12,5 @@ export const GPU_BUFFER_USAGE_UNIFORM = 0x40;
12
12
  export const GPU_BUFFER_USAGE_STORAGE = 0x80;
13
13
  export const GPU_BUFFER_USAGE_INDIRECT = 0x100;
14
14
  export const GPU_BUFFER_USAGE_MAP_READ = 0x01;
15
+ /** GPUBufferUsage.QUERY_RESOLVE, used by optional timestamp captures. */
16
+ export const GPU_BUFFER_USAGE_QUERY_RESOLVE = 0x200;
@@ -1,5 +1,6 @@
1
1
  // skylight-bind-group.ts -- Skylight resources merged into @group(1) PBR
2
- // material BGL (binding 7..13) + fallback identity resource bundle.
2
+ // material BGL (binding 7..13) + fallback identity resource bundle. The
3
+ // complete Standard material group appends transmission entries.
3
4
  //
4
5
  // Plan-strategy D-5 (round-4 REVISED): the round-2 stand-alone @group(4)
5
6
  // Skylight BindGroupLayout collided with WebGPU's default maxBindGroups=4
@@ -18,9 +19,10 @@
18
19
  // (createRenderer) is responsible for passing the result to
19
20
  // `device.createBindGroupLayout`.
20
21
  // - assembleMaterialWithSkylightEntries(materialEntries, skylightResources):
21
- // given the existing 7 material BindGroupEntry values + a skylight
22
- // resource bundle (active or fallback), returns the merged 14-entry
23
- // array suitable for `device.createBindGroup`. Charter P5 minimal
22
+ // given the existing material BindGroupEntry values + a skylight
23
+ // resource bundle (active or fallback), returns the merged material
24
+ // array with the engine-owned transmission pair at the end, suitable for
25
+ // `device.createBindGroup`. Charter P5 minimal
24
26
  // surface: this helper does NOT allocate samplers/textures itself.
25
27
  // - createSkylightFallback(device, queue): allocate a 1x1 white
26
28
  // irradiance/prefilter cube pair + a 1x1 BRDF approximation + intensity=0 uniform
@@ -232,22 +234,20 @@ export function mergeSkylightIntoMaterialBgl(
232
234
  * call site, same layout shape -- charter P4 + F1 (AI users do not need
233
235
  * a `if (hasSkylight)` branch when writing demos).
234
236
  */
235
- export interface EmissiveAoBindGroupResources {
236
- readonly emissiveSampler: Sampler;
237
- readonly emissiveView: TextureView;
238
- readonly occlusionSampler: Sampler;
239
- readonly occlusionView: TextureView;
237
+ /** Engine-owned material transmission injection resources. */
238
+ export interface TransmissionBindGroupResources {
239
+ readonly sampler: Sampler;
240
+ readonly backdropView?: TextureView | null;
240
241
  }
241
242
 
242
- // Lightmap (emissive + occlusion sampler/texture pair x 2) injection start
243
- // is computed from the assembled list length on each push — no hardcoded
244
- // 14-slot literal. After 7 material + 7 skylight entries are pushed below,
245
- // the lightmap binding land naturally at start = 14 (D-6 / w15).
243
+ // Lightmap (emissive + occlusion sampler/texture pair x 2) and transmission
244
+ // injection starts are computed from the assembled list length on each push —
245
+ // no hardcoded binding literals.
246
246
 
247
247
  export function assembleMaterialWithSkylightEntries(
248
248
  materialEntries: readonly BindGroupEntry[],
249
249
  skylight: SkylightBindGroupResources,
250
- emissiveAo?: EmissiveAoBindGroupResources | undefined,
250
+ transmission?: TransmissionBindGroupResources | undefined,
251
251
  ): BindGroupEntry[] {
252
252
  // IBL injection start = end of the user-region. The user-region IS
253
253
  // `materialEntries` (UBO binding 0 + N sampler/texture pairs), so its length
@@ -287,30 +287,22 @@ export function assembleMaterialWithSkylightEntries(
287
287
  resource: { kind: 'buffer', value: { buffer: skylight.intensityBuffer } },
288
288
  },
289
289
  ];
290
- if (emissiveAo !== undefined) {
291
- // Lightmap injection start = current accumulated length
292
- // (post material + skylight). Mirrors the appendInjection contract
293
- // in pbr-pipeline.ts (D-6).
294
- const lightmapStart = result.length;
295
- result.push(
296
- {
297
- binding: lightmapStart,
298
- resource: { kind: 'sampler', value: emissiveAo.emissiveSampler },
299
- },
300
- {
301
- binding: lightmapStart + 1,
302
- resource: { kind: 'textureView', value: emissiveAo.emissiveView },
303
- },
304
- {
305
- binding: lightmapStart + 2,
306
- resource: { kind: 'sampler', value: emissiveAo.occlusionSampler },
307
- },
308
- {
309
- binding: lightmapStart + 3,
310
- resource: { kind: 'textureView', value: emissiveAo.occlusionView },
311
- },
312
- );
313
- }
290
+ // Transmission injection is always present after IBL. Non-transmission
291
+ // variants bind the existing Skylight resources as layout-only placeholders;
292
+ // they are not a functional fallback and are never sampled by those shaders.
293
+ const transmissionSampler = transmission?.sampler ?? skylight.irradianceSampler;
294
+ const transmissionView = transmission?.backdropView ?? skylight.brdfLutView;
295
+ const transmissionStart = result.length;
296
+ result.push(
297
+ {
298
+ binding: transmissionStart,
299
+ resource: { kind: 'sampler', value: transmissionSampler },
300
+ },
301
+ {
302
+ binding: transmissionStart + 1,
303
+ resource: { kind: 'textureView', value: transmissionView },
304
+ },
305
+ );
314
306
  return result;
315
307
  }
316
308