@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,373 @@
1
+ import type { CompiledRenderGraphInfo, GraphTextureDescriptor } from '@forgeax/engine-render-graph';
2
+ import { RenderGraphError } from '@forgeax/engine-render-graph';
3
+ import { err, ok, type Result } from '@forgeax/engine-types';
4
+ import { addTypedDebugOverlayPass } from '../debug-draw-glue';
5
+ import { SceneDataUnavailableError } from '../errors/render';
6
+ import { addMotionBlurPass } from '../features/motion-blur/motion-blur-feature';
7
+ import { GPU_TEXTURE_USAGE_COPY_SRC } from '../gpu-texture-usage';
8
+ import type {
9
+ RenderPipelineBuildContext,
10
+ RenderPipelineBuildError,
11
+ RenderPipelineFrame,
12
+ RenderPipelineTopology,
13
+ } from '../render-pipeline';
14
+ import { createRenderPipelineTarget, type RenderPipelineTarget } from '../render-pipeline';
15
+ import {
16
+ addTypedBloomPasses,
17
+ addTypedCompositePostEffects,
18
+ addTypedFullscreenPass,
19
+ addTypedOutputTransformPass,
20
+ addTypedTemporalResolvePass,
21
+ TYPED_BLOOM_PASS_NAMES,
22
+ type TypedTemporalResolveTargets,
23
+ } from '../typed-render-graph-primitives';
24
+
25
+ interface StandardPostSurface {
26
+ readonly display?: RenderPipelineTarget;
27
+ readonly storage: RenderPipelineTarget;
28
+ }
29
+
30
+ /** One authored Bloom contract drives declaration and compiled-graph validation. */
31
+ export const STANDARD_BLOOM_TARGET_SPEC = {
32
+ composited: { label: 'bloom-composited', format: 'rgba16float', size: 'surface' },
33
+ bright: { label: 'bloom-bright', format: 'rgba16float', size: 'half-surface' },
34
+ blurH: { label: 'bloom-blur-h', format: 'rgba16float', size: 'half-surface' },
35
+ blurV: { label: 'bloom-blur-v', format: 'rgba16float', size: 'half-surface' },
36
+ } as const satisfies Record<
37
+ 'composited' | 'bright' | 'blurH' | 'blurV',
38
+ Pick<GraphTextureDescriptor, 'format' | 'size'> & { readonly label: string }
39
+ >;
40
+
41
+ export interface StandardBloomGraphInspection {
42
+ readonly status: 'empty' | 'valid' | 'invalid';
43
+ readonly targetCount: number;
44
+ readonly targetBytes: number;
45
+ readonly passCount: number;
46
+ }
47
+
48
+ const emptyBloomGraphInspection = (): StandardBloomGraphInspection => ({
49
+ status: 'empty',
50
+ targetCount: 0,
51
+ targetBytes: 0,
52
+ passCount: 0,
53
+ });
54
+
55
+ const invalidBloomGraphInspection = (): StandardBloomGraphInspection => ({
56
+ status: 'invalid',
57
+ targetCount: 0,
58
+ targetBytes: 0,
59
+ passCount: 0,
60
+ });
61
+
62
+ function textureBytes(
63
+ resource: CompiledRenderGraphInfo['resources'][number],
64
+ expected: (typeof STANDARD_BLOOM_TARGET_SPEC)[keyof typeof STANDARD_BLOOM_TARGET_SPEC],
65
+ ): number {
66
+ const descriptor = resource.descriptor;
67
+ if (
68
+ descriptor === undefined ||
69
+ descriptor.kind !== 'texture' ||
70
+ descriptor.format !== expected.format ||
71
+ !('size' in descriptor) ||
72
+ descriptor.size !== expected.size
73
+ )
74
+ return 0;
75
+ const texelBytes = 8;
76
+ let bytes = 0;
77
+ for (let level = 0; level < descriptor.mipLevelCount; level += 1) {
78
+ bytes +=
79
+ Math.max(1, descriptor.width >> level) *
80
+ Math.max(1, descriptor.height >> level) *
81
+ descriptor.depthOrArrayLayers *
82
+ texelBytes;
83
+ }
84
+ return bytes * descriptor.sampleCount;
85
+ }
86
+
87
+ /** Derive Bloom target/pass facts solely from the compiled Standard graph. */
88
+ export function inspectStandardBloomGraph(
89
+ graph: CompiledRenderGraphInfo | undefined,
90
+ ): StandardBloomGraphInspection {
91
+ if (graph === undefined) return emptyBloomGraphInspection();
92
+ type BloomTargetSpec =
93
+ (typeof STANDARD_BLOOM_TARGET_SPEC)[keyof typeof STANDARD_BLOOM_TARGET_SPEC];
94
+ const targetSpec = new Map<string, BloomTargetSpec>(
95
+ Object.values(STANDARD_BLOOM_TARGET_SPEC).map((entry) => [entry.label, entry] as const),
96
+ );
97
+ const targets = graph.resources.flatMap((resource) => {
98
+ const expected = targetSpec.get(resource.label);
99
+ return expected === undefined ? [] : [{ resource, expected }];
100
+ });
101
+ const passNames = new Set<string>(Object.values(TYPED_BLOOM_PASS_NAMES));
102
+ const passes = graph.passes.filter((pass) => passNames.has(pass.name));
103
+ if (targets.length === 0 && passes.length === 0) return emptyBloomGraphInspection();
104
+ const completeTargetSet =
105
+ targets.length === Object.values(STANDARD_BLOOM_TARGET_SPEC).length &&
106
+ targets.every(({ resource, expected }) => textureBytes(resource, expected) > 0);
107
+ const completePassSet = passes.length === Object.values(TYPED_BLOOM_PASS_NAMES).length;
108
+ if (!completeTargetSet || !completePassSet) {
109
+ return invalidBloomGraphInspection();
110
+ }
111
+ return {
112
+ status: 'valid',
113
+ targetCount: targets.length,
114
+ targetBytes: targets.reduce(
115
+ (bytes, target) => bytes + textureBytes(target.resource, target.expected),
116
+ 0,
117
+ ),
118
+ passCount: passes.length,
119
+ };
120
+ }
121
+
122
+ function target(
123
+ context: RenderPipelineBuildContext<RenderPipelineFrame>,
124
+ label: string,
125
+ descriptor: GraphTextureDescriptor,
126
+ ): Result<RenderPipelineTarget, RenderGraphError> {
127
+ return createRenderPipelineTarget(context.graph, label, descriptor);
128
+ }
129
+
130
+ function missingTemporalContributor(
131
+ topology: RenderPipelineTopology,
132
+ contributorId: string,
133
+ ): SceneDataUnavailableError {
134
+ return new SceneDataUnavailableError({
135
+ featureIdentity: 'forgeax::standard',
136
+ schema: 'forgeax::scene-data::temporal-v1',
137
+ lane: topology.lane.compute ? (topology.standardProfile?.lighting ?? 'direct') : 'cpu-webgl2',
138
+ reason: 'producer-missing',
139
+ missingContributorIds: [contributorId],
140
+ omittedMissingContributorCount: 0,
141
+ recovery: 'renderer-recover',
142
+ });
143
+ }
144
+
145
+ /**
146
+ * Build the one Standard post chain shared by direct and clustered lighting.
147
+ * Bloom is admitted before any Bloom target is declared, keeping the disabled
148
+ * path exact-zero while preserving the existing half-resolution four-pass
149
+ * implementation for the enabled path.
150
+ */
151
+ export function addStandardPost(
152
+ context: RenderPipelineBuildContext<RenderPipelineFrame>,
153
+ topology: RenderPipelineTopology,
154
+ scene: RenderPipelineTarget,
155
+ depth: RenderPipelineTarget,
156
+ surface: StandardPostSurface,
157
+ sceneTemporal?: RenderPipelineTarget,
158
+ ): Result<void, RenderPipelineBuildError> {
159
+ const clearOnly = topology.clearOnly === true;
160
+ const hdr =
161
+ !clearOnly && (topology.camera.tonemap !== 'none' || topology.camera.antialias === 'taa');
162
+ // Bloom is an HDR-domain effect and its recorders intentionally no-op when
163
+ // tone mapping is disabled. Keep the graph in the same no-op state for the
164
+ // TAA + tonemap:none combination; otherwise the declared Bloom composite is
165
+ // left clear and the following Output Transform presents a black frame.
166
+ const bloomActive = hdr && topology.camera.bloom === 'on' && topology.camera.tonemap !== 'none';
167
+ const fxaa = !clearOnly && topology.camera.antialias === 'fxaa';
168
+ const msaa = !clearOnly && topology.camera.antialias === 'msaa' && topology.lane.multisample;
169
+ const linearLdr = !clearOnly && ((!hdr && topology.lane.storageBuffer) || fxaa || msaa);
170
+ const rawOnly = !clearOnly && topology.surface.profile?.kind === 'raw-only';
171
+ const motionBlur = !clearOnly && topology.temporal?.motionBlur === true;
172
+ const postEffects = clearOnly ? [] : (topology.config?.postEffects ?? []);
173
+ const rawOnlyPostInput =
174
+ rawOnly && topology.lane.storageBuffer && postEffects.length > 0
175
+ ? target(context, 'standard-post-effects-input', {
176
+ format: 'rgba16float',
177
+ size: 'surface',
178
+ usage: GPU_TEXTURE_USAGE_COPY_SRC,
179
+ domain: 'display-encoded',
180
+ })
181
+ : undefined;
182
+ if (rawOnlyPostInput !== undefined && !rawOnlyPostInput.ok) return rawOnlyPostInput;
183
+ // Every Standard route terminates at the same encoded raw storage endpoint.
184
+ // The raw-only profile has no alternate display view, so its debug overlay
185
+ // and optional post effects are kept in graph-owned float targets until the
186
+ // single Output Transform performs the first 8-bit quantization.
187
+ const finalPresent = surface.storage;
188
+ let postInput = scene;
189
+
190
+ if (topology.camera.antialias === 'taa') {
191
+ if (sceneTemporal === undefined) {
192
+ return err(missingTemporalContributor(topology, 'forgeax::standard::scene-data'));
193
+ }
194
+ const history = context.taaHistory;
195
+ if (history === undefined) {
196
+ return err(missingTemporalContributor(topology, 'forgeax::standard::taa-history'));
197
+ }
198
+ const resolveTargets: TypedTemporalResolveTargets = {
199
+ scene,
200
+ depth,
201
+ currentTemporal: sceneTemporal,
202
+ historyColor: history.previousColor,
203
+ historyTemporal: history.previousTemporal,
204
+ writeColor: history.currentColor,
205
+ writeTemporal: history.currentTemporal,
206
+ };
207
+ const resolve = addTypedTemporalResolvePass(context.graph, resolveTargets);
208
+ if (!resolve.ok) return resolve;
209
+ postInput = history.currentColor;
210
+ }
211
+
212
+ // Feature projection and the built-in fallback share one target contract.
213
+ // The projection runs after TAA so Motion Blur consumes the resolved color,
214
+ // then both paths feed the same linear float target into Bloom/Output.
215
+ if (!clearOnly) {
216
+ const featureTargets = [
217
+ {
218
+ kind: 'scene-color' as const,
219
+ texture: scene.texture,
220
+ view: scene.view,
221
+ format: scene.format,
222
+ sampleCount: scene.sampleCount,
223
+ },
224
+ {
225
+ kind: 'scene-depth' as const,
226
+ texture: depth.texture,
227
+ view: depth.view,
228
+ format: depth.format,
229
+ sampleCount: depth.sampleCount,
230
+ },
231
+ ];
232
+ if (motionBlur) {
233
+ if (sceneTemporal === undefined) {
234
+ return err(
235
+ new Error('Motion Blur requires the Standard scene-data producer') as RenderGraphError,
236
+ );
237
+ }
238
+ const blurred = target(context, 'motion-blurred-color', {
239
+ format: 'rgba16float',
240
+ size: 'surface',
241
+ domain: hdr ? 'linear-hdr' : 'linear-ldr',
242
+ });
243
+ if (!blurred.ok) return blurred;
244
+ const features = context.contributeFeatures(featureTargets, [sceneTemporal], {
245
+ 'motion-input': postInput,
246
+ 'motion-output': blurred.value,
247
+ });
248
+ if (!features.ok) return features;
249
+ if (context.hasFeature?.('forgeax.motion-blur') === true) {
250
+ postInput = blurred.value;
251
+ } else {
252
+ const fallback = addMotionBlurPass(context.graph, postInput, sceneTemporal, blurred.value);
253
+ if (!fallback.ok) return fallback;
254
+ postInput = blurred.value;
255
+ }
256
+ } else {
257
+ const features = context.contributeFeatures(
258
+ featureTargets,
259
+ sceneTemporal === undefined ? [] : [sceneTemporal],
260
+ );
261
+ if (!features.ok) return features;
262
+ }
263
+ }
264
+
265
+ if (bloomActive) {
266
+ const composited = target(
267
+ context,
268
+ STANDARD_BLOOM_TARGET_SPEC.composited.label,
269
+ STANDARD_BLOOM_TARGET_SPEC.composited,
270
+ );
271
+ if (!composited.ok) return composited;
272
+ const bright = target(
273
+ context,
274
+ STANDARD_BLOOM_TARGET_SPEC.bright.label,
275
+ STANDARD_BLOOM_TARGET_SPEC.bright,
276
+ );
277
+ if (!bright.ok) return bright;
278
+ const blurH = target(
279
+ context,
280
+ STANDARD_BLOOM_TARGET_SPEC.blurH.label,
281
+ STANDARD_BLOOM_TARGET_SPEC.blurH,
282
+ );
283
+ if (!blurH.ok) return blurH;
284
+ const blurV = target(
285
+ context,
286
+ STANDARD_BLOOM_TARGET_SPEC.blurV.label,
287
+ STANDARD_BLOOM_TARGET_SPEC.blurV,
288
+ );
289
+ if (!blurV.ok) return blurV;
290
+ const bloom = addTypedBloomPasses(context.graph, {
291
+ scene: postInput,
292
+ composited: composited.value,
293
+ bright: bright.value,
294
+ blurH: blurH.value,
295
+ blurV: blurV.value,
296
+ });
297
+ if (!bloom.ok) return bloom;
298
+ postInput = composited.value;
299
+ }
300
+
301
+ if (rawOnly) {
302
+ const overlay = addTypedDebugOverlayPass(context.graph, postInput);
303
+ if (!overlay.ok) return overlay;
304
+ }
305
+
306
+ if (hdr || linearLdr || fxaa || rawOnly || motionBlur) {
307
+ if (fxaa) {
308
+ const output = target(context, 'standard-output-color', {
309
+ format: 'rgba16float',
310
+ size: 'surface',
311
+ usage: GPU_TEXTURE_USAGE_COPY_SRC,
312
+ domain: 'display-encoded',
313
+ });
314
+ if (!output.ok) return output;
315
+ const outputTransform = addTypedOutputTransformPass(context.graph, postInput, output.value);
316
+ if (!outputTransform.ok) return outputTransform;
317
+ const aa = addTypedFullscreenPass(context.graph, {
318
+ name: 'fxaa',
319
+ shader: 'fxaa',
320
+ input: output.value,
321
+ output: rawOnlyPostInput !== undefined ? rawOnlyPostInput.value : finalPresent,
322
+ });
323
+ if (!aa.ok) return aa;
324
+ } else if (rawOnlyPostInput !== undefined) {
325
+ const transformed = addTypedOutputTransformPass(
326
+ context.graph,
327
+ postInput,
328
+ rawOnlyPostInput.value,
329
+ );
330
+ if (!transformed.ok) return transformed;
331
+ } else if (rawOnly || linearLdr) {
332
+ const transformed = addTypedOutputTransformPass(context.graph, postInput, finalPresent);
333
+ if (!transformed.ok) return transformed;
334
+ } else {
335
+ const outputTransform = addTypedOutputTransformPass(context.graph, postInput, finalPresent);
336
+ if (!outputTransform.ok) return outputTransform;
337
+ }
338
+ }
339
+
340
+ if (topology.lane.storageBuffer && postEffects.length > 0) {
341
+ const postInputTarget = rawOnly
342
+ ? rawOnlyPostInput?.value
343
+ : (surface.display ?? surface.storage);
344
+ if (postInputTarget === undefined) {
345
+ return err(
346
+ new RenderGraphError({
347
+ code: 'resource-descriptor-invalid',
348
+ expected: 'raw-only post effects have a graph-owned encoded input target',
349
+ hint: 'retain the candidate LKG when the post-effect input target cannot be declared',
350
+ detail: {
351
+ resourceLabel: 'standard-post-effects-input',
352
+ field: 'descriptor',
353
+ expected: 'rgba16float display-encoded target',
354
+ actual: 'absent',
355
+ },
356
+ }),
357
+ );
358
+ }
359
+ const effects = addTypedCompositePostEffects(
360
+ context.graph,
361
+ postEffects,
362
+ postInputTarget,
363
+ surface.storage,
364
+ depth,
365
+ topology.surface,
366
+ );
367
+ if (!effects.ok) return effects;
368
+ }
369
+
370
+ return rawOnly
371
+ ? ok(undefined)
372
+ : addTypedDebugOverlayPass(context.graph, surface.display ?? surface.storage);
373
+ }
@@ -20,7 +20,22 @@ export type StandardTone =
20
20
  | 'reinhard'
21
21
  | 'reinhard-extended';
22
22
  export type StandardAntialias = 'none' | 'fxaa' | 'msaa';
23
- export type StandardPostStage = 'transparent-blend' | 'bloom' | 'tone' | 'fxaa' | 'output';
23
+ export const STANDARD_POST_STAGE_NAMES = [
24
+ 'transparent-blend',
25
+ 'bloom',
26
+ 'output-transform',
27
+ 'fxaa',
28
+ 'post-effect',
29
+ 'present',
30
+ ] as const;
31
+ export type StandardPostStage = (typeof STANDARD_POST_STAGE_NAMES)[number];
32
+ export type StandardVolumetricFogQuality = 'low' | 'high';
33
+
34
+ export interface StandardVolumetricFogProfile {
35
+ readonly quality: StandardVolumetricFogQuality;
36
+ readonly depth: 48 | 64;
37
+ readonly tileSize: 4 | 16;
38
+ }
24
39
 
25
40
  export interface StandardProfile {
26
41
  readonly pipelineId: typeof STANDARD_PIPELINE_ID;
@@ -34,8 +49,10 @@ export interface StandardProfile {
34
49
  readonly tone: StandardTone;
35
50
  readonly antialias: StandardAntialias;
36
51
  readonly sky: boolean;
52
+ /** Renderer-owned 1080p volume profile; tile width/height remain surface-derived. */
53
+ readonly volumetricFog?: StandardVolumetricFogProfile | undefined;
37
54
  readonly fallback: StandardFallbackLane;
38
- readonly postStages: readonly ['transparent-blend', 'bloom', 'tone', 'fxaa', 'output'];
55
+ readonly postStages: typeof STANDARD_POST_STAGE_NAMES;
39
56
  }
40
57
 
41
58
  export const DEFAULT_STANDARD_PROFILE: StandardProfile = Object.freeze({
@@ -51,9 +68,15 @@ export const DEFAULT_STANDARD_PROFILE: StandardProfile = Object.freeze({
51
68
  antialias: 'fxaa',
52
69
  sky: true,
53
70
  fallback: 'native',
54
- postStages: ['transparent-blend', 'bloom', 'tone', 'fxaa', 'output'] as const,
71
+ postStages: STANDARD_POST_STAGE_NAMES,
55
72
  });
56
73
 
74
+ export function resolveVolumetricFogProfile(
75
+ profile: Pick<StandardProfile, 'volumetricFog'>,
76
+ ): StandardVolumetricFogProfile {
77
+ return profile.volumetricFog ?? { quality: 'high', depth: 64, tileSize: 4 };
78
+ }
79
+
57
80
  export type StandardLane = StandardLightingLane | 'cpu-webgl2';
58
81
 
59
82
  export function resolveStandardLane(
@@ -43,6 +43,7 @@
43
43
 
44
44
  import {
45
45
  err,
46
+ ok,
46
47
  type PipelineLayout,
47
48
  type RenderPipeline,
48
49
  type RenderPipelineDescriptor,
@@ -130,6 +131,8 @@ export interface PipelineBuilderContext {
130
131
  * feat).
131
132
  */
132
133
  readonly vertexBuffers: readonly GPUVertexBufferLayout[];
134
+ /** Explicit layout family selected by the renderer assembly. */
135
+ readonly layoutKind?: 'pbr-skin' | undefined;
133
136
  /** Pipeline label (for GPU debug captures); defaults to `pbr-pipeline-${id}`. */
134
137
  readonly label?: string | undefined;
135
138
  /**
@@ -150,6 +153,81 @@ export interface PipelineBuilderContext {
150
153
  * `moduleLabel` so two `#define` prefixes do not collide on one module.
151
154
  */
152
155
  readonly moduleLabel?: string | undefined;
156
+ /** Device facts used to reject a temporal PSO before it reaches submit. */
157
+ readonly capabilities?: {
158
+ readonly storageBuffer: boolean;
159
+ readonly rgba16floatRenderable: boolean;
160
+ };
161
+ }
162
+
163
+ /**
164
+ * Validate the temporal material contract at the PSO creation boundary.
165
+ *
166
+ * Downlevel WebGL2 implementations can accept a pipeline whose shader/layout
167
+ * pair is invalid and report the failure only when the command buffer is
168
+ * submitted. The temporal producer is the one material path where this is
169
+ * especially damaging: the invalid handle is cached and every frame then
170
+ * fails. Keep this check beside descriptor construction so the caller gets a
171
+ * structured shader failure before a handle is cached.
172
+ */
173
+ export function validateTemporalPipelineContract(
174
+ source: string,
175
+ ctx: Pick<PipelineBuilderContext, 'colorFormat' | 'depthFormat' | 'capabilities'>,
176
+ ): Result<void, RhiError> {
177
+ if (!source.includes('fn vs_temporal') || !source.includes('fn fs_temporal')) {
178
+ return err(
179
+ new RhiError({
180
+ code: 'shader-compile-failed',
181
+ expected: 'temporal material source declares vs_temporal and fs_temporal entry points',
182
+ hint: 'compile the temporal material variant that owns the temporal producer ABI',
183
+ }),
184
+ );
185
+ }
186
+ if (ctx.colorFormat !== 'rgba16float') {
187
+ return err(
188
+ new RhiError({
189
+ code: 'shader-compile-failed',
190
+ expected: 'temporal material target format is rgba16float',
191
+ hint: `temporal producer received color format ${ctx.colorFormat}; use its physical rgba16float target`,
192
+ }),
193
+ );
194
+ }
195
+ if (ctx.depthFormat === undefined) {
196
+ return err(
197
+ new RhiError({
198
+ code: 'shader-compile-failed',
199
+ expected: 'temporal material pipeline has a depth format',
200
+ hint: 'provide the shared scene depth attachment for the temporal producer',
201
+ }),
202
+ );
203
+ }
204
+ const capabilities = ctx.capabilities;
205
+ if (capabilities !== undefined) {
206
+ const sourceUsesStorageBuffer = /var\s*<\s*storage(?:\s*,|\s*>)/u.test(source);
207
+ if (sourceUsesStorageBuffer !== capabilities.storageBuffer) {
208
+ return err(
209
+ new RhiError({
210
+ code: 'shader-compile-failed',
211
+ expected: `temporal shader storage-buffer variant matches device capability (${capabilities.storageBuffer})`,
212
+ hint: 'resolve the material variant against the active WebGL2/native capability before creating the PSO',
213
+ }),
214
+ );
215
+ }
216
+ if (!capabilities.rgba16floatRenderable) {
217
+ return err(
218
+ new RhiError({
219
+ code: 'shader-compile-failed',
220
+ expected: 'rgba16float temporal target is renderable on the active device',
221
+ hint: 'preserve the structured capability refusal instead of creating a deferred-invalid PSO',
222
+ }),
223
+ );
224
+ }
225
+ }
226
+ return ok(undefined);
227
+ }
228
+
229
+ function pipelineCreationHint(error: RhiError): string {
230
+ return `inspect compiler messages on the shader module; verify pipeline layout matches shader bindings (cause: ${error.code}; underlying hint: ${error.hint}; raw: ${error.message})`;
153
231
  }
154
232
 
155
233
  /**
@@ -194,8 +272,10 @@ export function buildPipelineForMaterialShader(
194
272
  sampleCount: number = 1,
195
273
  ): Result<RenderPipeline, RhiError> {
196
274
  const label = ctx.label ?? `pbr-pipeline-${id}`;
197
- const vsEntry = vertexEntry ?? 'vs_main';
198
- const fsEntry = fragmentEntry ?? (passKind === 'deferred' ? 'fs_gbuffer' : 'fs_main');
275
+ const vsEntry = vertexEntry ?? (passKind === 'temporal' ? 'vs_temporal' : 'vs_main');
276
+ const fsEntry =
277
+ fragmentEntry ??
278
+ (passKind === 'temporal' ? 'fs_temporal' : passKind === 'deferred' ? 'fs_gbuffer' : 'fs_main');
199
279
 
200
280
  let source = entry.source;
201
281
  if (defines !== undefined && Object.keys(defines).length > 0) {
@@ -226,6 +306,11 @@ export function buildPipelineForMaterialShader(
226
306
  }
227
307
  const shaderModule = moduleResult.value;
228
308
 
309
+ if (passKind === 'temporal') {
310
+ const temporalContract = validateTemporalPipelineContract(source, ctx);
311
+ if (!temporalContract.ok) return temporalContract;
312
+ }
313
+
229
314
  // feat-20260609 M4 / R3-fixup: shadow-caster branch.
230
315
  // The shadow render pass beginRenderPass desc is `{ colorAttachments: [],
231
316
  // depthStencilAttachment: { format: 'depth32float', ... } }` (see
@@ -235,8 +320,10 @@ export function buildPipelineForMaterialShader(
235
320
  // compatible with [RenderPassEncoder]". Ground truth descriptor was the
236
321
  // hardcoded shadowCasterPipeline removed in T-009 (commit 6416e9de~);
237
322
  // this branch reconstructs that exact shape via the lazy cache path.
238
- // Vertex layout is position-only (12-float stride, shaderLocation 0 vec3)
239
- // the shadow_caster.wgsl vs_main reads only @location(0) position.
323
+ // The ordinary shadow variant reads only position from the canonical 12F
324
+ // layout. The skinned variant additionally reads JOINTS_0 / WEIGHTS_0;
325
+ // both layouts come from the same geometry projection used by the main
326
+ // pass, so shadow rendering cannot silently reinterpret an 18F stream.
240
327
  if (colorFormatsForPassKind(passKind, ctx.colorFormat).length === 0) {
241
328
  // bug-20260619-csm RC-3 (AC-10): a material may supply a custom
242
329
  // ShadowCaster pass shader that carries a fragment stage (e.g. an
@@ -255,12 +342,15 @@ export function buildPipelineForMaterialShader(
255
342
  vertex: {
256
343
  module: shaderModule,
257
344
  entryPoint: vsEntry,
258
- buffers: [
259
- {
260
- arrayStride: 12 * 4,
261
- attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x3' as const }],
262
- },
263
- ],
345
+ buffers:
346
+ ctx.layoutKind === 'pbr-skin'
347
+ ? [...ctx.vertexBuffers]
348
+ : [
349
+ {
350
+ arrayStride: 12 * 4,
351
+ attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x3' as const }],
352
+ },
353
+ ],
264
354
  },
265
355
  // Vertex-only depth pass writes `fragment: undefined` (GPU derives
266
356
  // depth from gl_Position.z). A custom ShadowCaster shader with a
@@ -295,7 +385,7 @@ export function buildPipelineForMaterialShader(
295
385
  new RhiError({
296
386
  code: 'shader-compile-failed',
297
387
  expected: `shadow-caster pipeline for material shader '${id}' builds successfully`,
298
- hint: `inspect compiler messages on the shader module; verify pipeline layout matches shader bindings (cause: ${shadowPipelineResult.error.code})`,
388
+ hint: pipelineCreationHint(shadowPipelineResult.error),
299
389
  }),
300
390
  );
301
391
  }
@@ -374,7 +464,7 @@ export function buildPipelineForMaterialShader(
374
464
  new RhiError({
375
465
  code: 'shader-compile-failed',
376
466
  expected: `pipeline for material shader '${id}' builds successfully`,
377
- hint: `inspect compiler messages on the shader module; verify pipeline layout matches shader bindings (cause: ${pipelineResult.error.code})`,
467
+ hint: pipelineCreationHint(pipelineResult.error),
378
468
  }),
379
469
  );
380
470
  }
@@ -513,6 +513,15 @@ export const passKindPolicyTable: Readonly<Record<string, PassKindAttachmentPoli
513
513
  },
514
514
  defaultDepthOps: { loadOp: 'clear', storeOp: 'store', clearValue: 1 },
515
515
  },
516
+ temporal: {
517
+ shape: 'color-and-depth',
518
+ defaultColorOps: {
519
+ loadOp: 'clear',
520
+ storeOp: 'store',
521
+ clearValue: { r: 0, g: 0, b: -1, a: 1 },
522
+ },
523
+ defaultDepthOps: { loadOp: 'clear', storeOp: 'store', clearValue: 1 },
524
+ },
516
525
  'shadow-caster': {
517
526
  shape: 'depth-only',
518
527
  defaultColorOps: undefined,
package/src/plugin.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { Component, World } from '@forgeax/engine-ecs';
2
2
  import type { Plugin } from '@forgeax/engine-plugin';
3
+ import { Atmosphere } from './components/atmosphere';
3
4
  import { Camera } from './components/camera';
4
5
  import { DirectionalLight } from './components/directional-light';
5
6
  import { Instances } from './components/instances';
@@ -24,6 +25,7 @@ import { Tilemap } from './components/tilemap';
24
25
  import { Visibility } from './components/visibility';
25
26
 
26
27
  const RENDER_COMPONENTS: readonly Component[] = [
28
+ Atmosphere,
27
29
  Camera,
28
30
  DirectionalLight,
29
31
  Instances,
@@ -0,0 +1,25 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { isTemporalFullscreenBinding } from '../../fullscreen-post-process-pass';
3
+ import { shouldUseTemporalFrameTransaction } from '../typed-frame-graph';
4
+
5
+ describe('fullscreen temporal routing', () => {
6
+ it('keeps ordinary fullscreen bindings on the non-temporal path', () => {
7
+ expect(isTemporalFullscreenBinding({ fullscreen: true, shader: 'forgeax.fxaa' })).toBe(false);
8
+ expect(isTemporalFullscreenBinding({ fullscreen: true, shader: 'forgeax.tonemap' })).toBe(
9
+ false,
10
+ );
11
+ expect(isTemporalFullscreenBinding({ fullscreen: true, shader: 'forgeax.motion-blur' })).toBe(
12
+ true,
13
+ );
14
+ expect(
15
+ isTemporalFullscreenBinding({ fullscreen: true, temporal: { kind: 'scene-data' } }),
16
+ ).toBe(true);
17
+ });
18
+
19
+ it('opens the coordinator only for TAA frames', () => {
20
+ expect(shouldUseTemporalFrameTransaction('none')).toBe(false);
21
+ expect(shouldUseTemporalFrameTransaction('fxaa')).toBe(false);
22
+ expect(shouldUseTemporalFrameTransaction('msaa')).toBe(false);
23
+ expect(shouldUseTemporalFrameTransaction('taa')).toBe(true);
24
+ });
25
+ });