@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,680 @@
1
+ import type {
2
+ GraphBuffer,
3
+ GraphTextureView,
4
+ RenderGraphBuilder,
5
+ RenderGraphError,
6
+ } from '@forgeax/engine-render-graph';
7
+ import type {
8
+ BindGroup,
9
+ BindGroupLayout,
10
+ Buffer,
11
+ ComputePipeline,
12
+ RenderPipeline,
13
+ Sampler,
14
+ TextureView,
15
+ } from '@forgeax/engine-rhi';
16
+ import { RhiError } from '@forgeax/engine-rhi';
17
+ import { ok, type Result } from '@forgeax/engine-types';
18
+ import { GPU_TEXTURE_USAGE_TEXTURE_BINDING } from '../gpu-texture-usage';
19
+ import {
20
+ GPU_BUFFER_USAGE_COPY_DST,
21
+ GPU_BUFFER_USAGE_STORAGE,
22
+ GPU_BUFFER_USAGE_UNIFORM,
23
+ } from '../gpu-usage';
24
+ import {
25
+ LIGHT_ARRAY_HEADER_BYTES,
26
+ LIGHT_ARRAY_MAX_SLOTS,
27
+ SPOT_LIGHT_STD430_BYTES,
28
+ } from '../light-buffer-layout';
29
+ import { VIEW_UNIFORM_BYTES } from '../record/view-ubo';
30
+ import type { VolumetricFogFrameContext, VolumetricFogShaderSources } from '../render-contract';
31
+ import type {
32
+ RenderPipelineFrame,
33
+ RenderPipelineTarget,
34
+ RenderPipelineTopology,
35
+ } from '../render-pipeline';
36
+ import type { VolumetricFogResources } from './resources';
37
+ import {
38
+ createVolumetricFogResources,
39
+ VOLUME_FROXEL_FORMAT,
40
+ VOLUME_HISTORY_FORMAT,
41
+ VOLUME_PACKING_Z,
42
+ VOLUME_RESOLVED_FORMAT,
43
+ } from './resources';
44
+ import type { VolumeProjectorTuple } from './temporal';
45
+
46
+ export const VOLUMETRIC_FOG_PASS_ORDER = [
47
+ 'volume-inject',
48
+ 'volume-integrate',
49
+ 'volume-temporal',
50
+ 'volume-composite',
51
+ ] as const;
52
+ export interface VolumetricFogTopology {
53
+ readonly passes: readonly string[];
54
+ readonly resources: readonly string[];
55
+ readonly colorInput: 'linear-hdr';
56
+ readonly depthInput: 'scene-depth';
57
+ readonly lightKind?: 'directional' | 'point' | 'spot';
58
+ readonly lightEntity?: number;
59
+ readonly lightRevision?: number;
60
+ readonly projector?: Pick<VolumeProjectorTuple, 'guid' | 'generation' | 'revision'>;
61
+ }
62
+ export function volumetricFogTopology(
63
+ enabled: boolean,
64
+ selectedLight?: {
65
+ readonly lightKind: 'directional' | 'point' | 'spot';
66
+ readonly lightEntity: number;
67
+ readonly lightRevision: number;
68
+ },
69
+ ): VolumetricFogTopology {
70
+ return enabled
71
+ ? {
72
+ passes: [...VOLUMETRIC_FOG_PASS_ORDER],
73
+ resources: [
74
+ 'volume-froxel',
75
+ 'volume-resolved-current',
76
+ 'volume-history',
77
+ 'volume-temporal',
78
+ ],
79
+ colorInput: 'linear-hdr',
80
+ depthInput: 'scene-depth',
81
+ ...(selectedLight ?? {}),
82
+ }
83
+ : { passes: [], resources: [], colorInput: 'linear-hdr', depthInput: 'scene-depth' };
84
+ }
85
+ export interface VolumetricFogPassInputs {
86
+ readonly resources: VolumetricFogResources;
87
+ readonly linearHdr: RenderPipelineTarget;
88
+ readonly sceneDepth: GraphTextureView;
89
+ readonly density: GraphTextureView;
90
+ readonly params: GraphBuffer;
91
+ readonly view: GraphBuffer;
92
+ readonly directionalShadow: GraphTextureView;
93
+ readonly spotShadow: GraphTextureView;
94
+ readonly pointLights: GraphBuffer;
95
+ readonly spotLights: GraphBuffer;
96
+ readonly selectedLightKind: 'directional' | 'point' | 'spot';
97
+ readonly projector?: GraphTextureView;
98
+ }
99
+ function pipelineError(stage: string): RhiError {
100
+ return new RhiError({
101
+ code: 'rhi-not-available',
102
+ expected: `volumetric fog ${stage} pipeline to be available`,
103
+ hint: 'construct the renderer through a backend pack with shader module support',
104
+ });
105
+ }
106
+ function shaderSource(frame: RenderPipelineFrame, stage: keyof VolumetricFogShaderSources): string {
107
+ const source = frame.volumetricFogShaders?.[stage];
108
+ if (source === undefined) throw pipelineError(`${stage} shader source`);
109
+ return source;
110
+ }
111
+ interface ComputeState {
112
+ readonly pipeline: ComputePipeline;
113
+ readonly layout: BindGroupLayout;
114
+ }
115
+ function computeState(
116
+ frame: RenderPipelineFrame,
117
+ source: string,
118
+ label: string,
119
+ entries: readonly unknown[],
120
+ entryPoint = label,
121
+ ): ComputeState {
122
+ const factory = frame.runtime.shaderModuleFactory;
123
+ if (factory === undefined) throw pipelineError(label);
124
+ const module = factory.createShaderModule({ code: source, label });
125
+ if (!module.ok) throw module.error;
126
+ const layout = frame.runtime.device.createBindGroupLayout({ entries: entries as never });
127
+ if (!layout.ok) throw layout.error;
128
+ const pipelineLayout = frame.runtime.device.createPipelineLayout({
129
+ label: `${label}.layout`,
130
+ bindGroupLayouts: [layout.value],
131
+ });
132
+ if (!pipelineLayout.ok) throw pipelineLayout.error;
133
+ const pipeline = frame.runtime.device.createComputePipeline({
134
+ label,
135
+ layout: pipelineLayout.value,
136
+ compute: { module: module.value, entryPoint },
137
+ });
138
+ if (!pipeline.ok) throw pipeline.error;
139
+ return { pipeline: pipeline.value, layout: layout.value };
140
+ }
141
+ type VolumeBinding =
142
+ | {
143
+ readonly binding: number;
144
+ readonly resource: { readonly kind: 'textureView'; readonly value: TextureView };
145
+ }
146
+ | {
147
+ readonly binding: number;
148
+ readonly resource: { readonly kind: 'sampler'; readonly value: Sampler };
149
+ }
150
+ | {
151
+ readonly binding: number;
152
+ readonly resource: { readonly kind: 'buffer'; readonly value: { readonly buffer: Buffer } };
153
+ };
154
+ function volumeBindGroup(
155
+ frame: RenderPipelineFrame,
156
+ layout: BindGroupLayout,
157
+ entries: readonly VolumeBinding[],
158
+ ): BindGroup {
159
+ const group = frame.runtime.device.createBindGroup({ layout, entries });
160
+ if (!group.ok) throw group.error;
161
+ return group.value;
162
+ }
163
+ type ImportedVolumeInputs = Omit<VolumetricFogPassInputs, 'resources'>;
164
+ function importVolumeInputs(
165
+ graph: RenderGraphBuilder<RenderPipelineFrame>,
166
+ topology: RenderPipelineTopology,
167
+ linearHdr: RenderPipelineTarget,
168
+ sceneDepth: GraphTextureView,
169
+ directionalShadow: GraphTextureView,
170
+ spotShadow: GraphTextureView,
171
+ selectedLightKind: 'directional' | 'point' | 'spot' | undefined,
172
+ ): Result<ImportedVolumeInputs | undefined, RenderGraphError> {
173
+ const volume = topology.volumetricFog;
174
+ if (volume?.enabled !== true || volume.format === undefined || volume.extent === undefined)
175
+ return ok(undefined);
176
+ const texture = graph.importTexture(
177
+ 'volume-density',
178
+ {
179
+ format: volume.format,
180
+ size: {
181
+ width: volume.extent.width,
182
+ height: volume.extent.height,
183
+ depthOrArrayLayers: volume.extent.depth,
184
+ },
185
+ dimension: '3d',
186
+ usage: GPU_TEXTURE_USAGE_TEXTURE_BINDING,
187
+ },
188
+ (frame) => {
189
+ const context = frame.volumetricFog as VolumetricFogFrameContext | undefined;
190
+ if (context === undefined) throw pipelineError('density residency');
191
+ return context.densityTexture;
192
+ },
193
+ );
194
+ if (!texture.ok) return texture;
195
+ const density = graph.importView(
196
+ texture.value,
197
+ { label: 'volume-density.view', dimension: '3d' },
198
+ (frame) => {
199
+ const context = frame.volumetricFog as VolumetricFogFrameContext | undefined;
200
+ if (context === undefined) throw pipelineError('density view residency');
201
+ return context.densityView;
202
+ },
203
+ );
204
+ if (!density.ok) return density;
205
+ const params = graph.importBuffer(
206
+ 'volume-params',
207
+ { size: 128, usage: GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST },
208
+ (frame) => {
209
+ const context = frame.volumetricFog as VolumetricFogFrameContext | undefined;
210
+ if (context === undefined) throw pipelineError('parameter residency');
211
+ return context.paramsBuffer;
212
+ },
213
+ );
214
+ if (!params.ok) return params;
215
+ const view = graph.importBuffer(
216
+ 'volume-view',
217
+ { size: VIEW_UNIFORM_BYTES, usage: GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST },
218
+ (frame) => frame.pipelineState.viewUniformBuffer,
219
+ );
220
+ if (!view.ok) return view;
221
+ const spotLights = graph.importBuffer(
222
+ 'volume-spot-lights',
223
+ {
224
+ size: LIGHT_ARRAY_HEADER_BYTES + LIGHT_ARRAY_MAX_SLOTS * SPOT_LIGHT_STD430_BYTES,
225
+ usage: GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST,
226
+ },
227
+ (frame) => frame.pipelineState.spotLightsBuffer,
228
+ );
229
+ if (!spotLights.ok) return spotLights;
230
+ const pointLights = graph.importBuffer(
231
+ 'volume-point-lights',
232
+ { size: 16 + 4 * 32, usage: GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST },
233
+ (frame) => frame.pipelineState.pointLightsBuffer,
234
+ );
235
+ if (!pointLights.ok) return pointLights;
236
+ let projector: GraphTextureView | undefined;
237
+ if (volume.projector !== undefined) {
238
+ const projectorTexture = graph.importTexture(
239
+ 'spot-projector',
240
+ {
241
+ format: 'rgba8unorm-srgb',
242
+ size: { width: 128, height: 128, depthOrArrayLayers: 1 },
243
+ dimension: '2d',
244
+ usage: GPU_TEXTURE_USAGE_TEXTURE_BINDING,
245
+ },
246
+ (frame) => {
247
+ const context = frame.volumetricFog as VolumetricFogFrameContext | undefined;
248
+ if (context?.projectorTexture === undefined) throw pipelineError('projector residency');
249
+ return context.projectorTexture;
250
+ },
251
+ );
252
+ if (!projectorTexture.ok) return projectorTexture;
253
+ const projectorView = graph.importView(
254
+ projectorTexture.value,
255
+ { label: 'spot-projector.view', dimension: '2d' },
256
+ (frame) => {
257
+ const context = frame.volumetricFog as VolumetricFogFrameContext | undefined;
258
+ if (context?.projectorView === undefined) throw pipelineError('projector view residency');
259
+ return context.projectorView;
260
+ },
261
+ );
262
+ if (!projectorView.ok) return projectorView;
263
+ projector = projectorView.value;
264
+ }
265
+ return ok({
266
+ linearHdr,
267
+ sceneDepth,
268
+ density: density.value,
269
+ params: params.value,
270
+ view: view.value,
271
+ directionalShadow,
272
+ spotShadow,
273
+ pointLights: pointLights.value,
274
+ spotLights: spotLights.value,
275
+ selectedLightKind: selectedLightKind ?? 'directional',
276
+ ...(projector === undefined ? {} : { projector }),
277
+ });
278
+ }
279
+ export function addAuthoredVolumetricFogPasses(
280
+ graph: RenderGraphBuilder<RenderPipelineFrame>,
281
+ topology: RenderPipelineTopology,
282
+ linearHdr: RenderPipelineTarget,
283
+ sceneDepth: GraphTextureView,
284
+ directionalShadow: GraphTextureView,
285
+ spotShadow: GraphTextureView,
286
+ ): Result<void, RenderGraphError> {
287
+ // A paired Point+Spot volume stores the Spot shadow lane as well. The
288
+ // topology's primary light remains PointLight for radiance selection, but
289
+ // injection must import the spot atlas so the packed visibility can be
290
+ // applied only to the spot term during integration.
291
+ const shadowLightKind =
292
+ topology.volumetricFog?.spotLightEntity === undefined
293
+ ? topology.volumetricFog?.lightKind
294
+ : 'spot';
295
+ const imported = importVolumeInputs(
296
+ graph,
297
+ topology,
298
+ linearHdr,
299
+ sceneDepth,
300
+ directionalShadow,
301
+ spotShadow,
302
+ shadowLightKind,
303
+ );
304
+ if (!imported.ok) return imported;
305
+ if (imported.value === undefined) return ok(undefined);
306
+ const resources = createVolumetricFogResources(
307
+ graph,
308
+ topology.volumetricFog?.froxelExtent ?? { width: 64, height: 64, depth: 64 },
309
+ topology.volumetricFog?.resolvedExtent,
310
+ );
311
+ if (!resources.ok) return resources;
312
+ return addVolumetricFogPasses(graph, { ...imported.value, resources: resources.value });
313
+ }
314
+ export function addVolumetricFogPasses(
315
+ graph: RenderGraphBuilder<RenderPipelineFrame>,
316
+ inputs: VolumetricFogPassInputs,
317
+ ): Result<void, RenderGraphError> {
318
+ const dispatchX = Math.ceil(inputs.resources.extent.width / 8);
319
+ const dispatchY = Math.ceil(inputs.resources.extent.height / 8);
320
+ const packedLayers = Math.ceil(inputs.resources.extent.depth / VOLUME_PACKING_Z);
321
+ const resolvedDispatchX = Math.ceil(inputs.resources.resolvedExtent.width / 8);
322
+ const resolvedDispatchY = Math.ceil(inputs.resources.resolvedExtent.height / 8);
323
+ let inject: ComputeState | undefined;
324
+ let integrate: ComputeState | undefined;
325
+ let temporal: ComputeState | undefined;
326
+ let composite: RenderPipeline | undefined;
327
+ let compositeLayout: BindGroupLayout | undefined;
328
+ const injected = graph.addComputePass('volume-inject', {
329
+ accesses: [
330
+ { resource: inputs.params, usage: 'uniform-read' },
331
+ { resource: inputs.view, usage: 'uniform-read' },
332
+ {
333
+ resource:
334
+ inputs.selectedLightKind === 'spot' ? inputs.spotShadow : inputs.directionalShadow,
335
+ usage: 'sampled-read',
336
+ },
337
+ { resource: inputs.spotLights, usage: 'storage-read' },
338
+ { resource: inputs.pointLights, usage: 'storage-read' },
339
+ ...(inputs.projector === undefined
340
+ ? []
341
+ : [{ resource: inputs.projector, usage: 'sampled-read' as const }]),
342
+ { resource: inputs.resources.froxelView, usage: 'storage-write' },
343
+ ],
344
+ encode: ({ pass, frame, resources }) => {
345
+ inject ??= computeState(frame, shaderSource(frame, 'inject'), 'volume_inject', [
346
+ { binding: 0, visibility: 4, buffer: { type: 'uniform' } },
347
+ { binding: 3, visibility: 4, texture: { sampleType: 'depth', viewDimension: '2d' } },
348
+ { binding: 4, visibility: 4, sampler: { type: 'comparison' } },
349
+ { binding: 5, visibility: 4, buffer: { type: 'uniform' } },
350
+ {
351
+ binding: 6,
352
+ visibility: 4,
353
+ storageTexture: {
354
+ access: 'write-only',
355
+ format: VOLUME_FROXEL_FORMAT,
356
+ viewDimension: '2d-array',
357
+ },
358
+ },
359
+ { binding: 7, visibility: 4, buffer: { type: 'read-only-storage' } },
360
+ { binding: 8, visibility: 4, buffer: { type: 'read-only-storage' } },
361
+ ]);
362
+ const shadow = resources.textureView(
363
+ inputs.selectedLightKind === 'spot' ? inputs.spotShadow : inputs.directionalShadow,
364
+ );
365
+ const params = resources.buffer(inputs.params);
366
+ const view = resources.buffer(inputs.view);
367
+ const spotLights = resources.buffer(inputs.spotLights);
368
+ const pointLights = resources.buffer(inputs.pointLights);
369
+ const froxel = resources.textureView(inputs.resources.froxelView);
370
+ if (!shadow.ok) throw shadow.error;
371
+ if (!params.ok) throw params.error;
372
+ if (!view.ok) throw view.error;
373
+ if (!spotLights.ok) throw spotLights.error;
374
+ if (!pointLights.ok) throw pointLights.error;
375
+ if (!froxel.ok) throw froxel.error;
376
+ const shadowSampler = frame.runtime.device.createSampler({ compare: 'less' });
377
+ if (!shadowSampler.ok) throw shadowSampler.error;
378
+ const bindings = volumeBindGroup(frame, inject.layout, [
379
+ { binding: 0, resource: { kind: 'buffer', value: { buffer: view.value } } },
380
+ { binding: 3, resource: { kind: 'textureView', value: shadow.value as never } },
381
+ { binding: 4, resource: { kind: 'sampler', value: shadowSampler.value } },
382
+ { binding: 5, resource: { kind: 'buffer', value: { buffer: params.value } } },
383
+ { binding: 6, resource: { kind: 'textureView', value: froxel.value as never } },
384
+ { binding: 7, resource: { kind: 'buffer', value: { buffer: spotLights.value } } },
385
+ { binding: 8, resource: { kind: 'buffer', value: { buffer: pointLights.value } } },
386
+ ]);
387
+ pass.setPipeline(inject.pipeline);
388
+ pass.setBindGroup(0, bindings);
389
+ pass.dispatchWorkgroups(dispatchX, dispatchY, packedLayers);
390
+ },
391
+ });
392
+ if (!injected.ok) return injected;
393
+ const integratePass = graph.addComputePass('volume-integrate', {
394
+ accesses: [
395
+ { resource: inputs.resources.froxelView, usage: 'sampled-read' },
396
+ { resource: inputs.sceneDepth, usage: 'sampled-read' },
397
+ { resource: inputs.density, usage: 'sampled-read' },
398
+ { resource: inputs.resources.resolvedView, usage: 'storage-write' },
399
+ { resource: inputs.resources.historyView, usage: 'storage-write' },
400
+ { resource: inputs.resources.temporalView, usage: 'storage-write' },
401
+ { resource: inputs.params, usage: 'uniform-read' },
402
+ { resource: inputs.view, usage: 'uniform-read' },
403
+ { resource: inputs.spotLights, usage: 'storage-read' },
404
+ { resource: inputs.pointLights, usage: 'storage-read' },
405
+ ...(inputs.projector === undefined
406
+ ? []
407
+ : [{ resource: inputs.projector, usage: 'sampled-read' as const }]),
408
+ ],
409
+ encode: ({ pass, frame, resources }) => {
410
+ integrate ??= computeState(frame, shaderSource(frame, 'integrate'), 'volume_integrate', [
411
+ { binding: 0, visibility: 4, texture: { sampleType: 'float', viewDimension: '2d-array' } },
412
+ { binding: 1, visibility: 4, texture: { sampleType: 'depth', viewDimension: '2d' } },
413
+ {
414
+ binding: 2,
415
+ visibility: 4,
416
+ storageTexture: {
417
+ access: 'write-only',
418
+ format: VOLUME_RESOLVED_FORMAT,
419
+ viewDimension: '2d',
420
+ },
421
+ },
422
+ { binding: 3, visibility: 4, buffer: { type: 'uniform' } },
423
+ { binding: 4, visibility: 4, buffer: { type: 'uniform' } },
424
+ { binding: 5, visibility: 4, sampler: { type: 'filtering' } },
425
+ { binding: 6, visibility: 4, texture: { sampleType: 'float', viewDimension: '3d' } },
426
+ { binding: 7, visibility: 4, sampler: { type: 'filtering' } },
427
+ {
428
+ binding: 8,
429
+ visibility: 4,
430
+ storageTexture: {
431
+ access: 'write-only',
432
+ format: VOLUME_HISTORY_FORMAT,
433
+ viewDimension: '2d',
434
+ },
435
+ },
436
+ {
437
+ binding: 9,
438
+ visibility: 4,
439
+ storageTexture: {
440
+ access: 'write-only',
441
+ format: VOLUME_HISTORY_FORMAT,
442
+ viewDimension: '2d',
443
+ },
444
+ },
445
+ { binding: 10, visibility: 4, buffer: { type: 'read-only-storage' } },
446
+ { binding: 11, visibility: 4, buffer: { type: 'read-only-storage' } },
447
+ { binding: 12, visibility: 4, texture: { sampleType: 'float', viewDimension: '2d' } },
448
+ { binding: 13, visibility: 4, sampler: { type: 'filtering' } },
449
+ ]);
450
+ const froxel = resources.textureView(inputs.resources.froxelView);
451
+ const depth = resources.textureView(inputs.sceneDepth);
452
+ const density = resources.textureView(inputs.density);
453
+ const resolved = resources.textureView(inputs.resources.resolvedView);
454
+ const historySeed = resources.textureView(inputs.resources.historyView);
455
+ const temporalSeed = resources.textureView(inputs.resources.temporalView);
456
+ const params = resources.buffer(inputs.params);
457
+ const view = resources.buffer(inputs.view);
458
+ const spotLights = resources.buffer(inputs.spotLights);
459
+ const pointLights = resources.buffer(inputs.pointLights);
460
+ const projector =
461
+ inputs.projector === undefined ? undefined : resources.textureView(inputs.projector);
462
+ if (!froxel.ok) throw froxel.error;
463
+ if (!depth.ok) throw depth.error;
464
+ if (!density.ok) throw density.error;
465
+ if (!resolved.ok) throw resolved.error;
466
+ if (!historySeed.ok) throw historySeed.error;
467
+ if (!temporalSeed.ok) throw temporalSeed.error;
468
+ if (!params.ok) throw params.error;
469
+ if (!view.ok) throw view.error;
470
+ if (!spotLights.ok) throw spotLights.error;
471
+ if (!pointLights.ok) throw pointLights.error;
472
+ if (projector !== undefined && !projector.ok) throw projector.error;
473
+ const sampler = frame.runtime.device.createSampler({
474
+ minFilter: 'linear',
475
+ magFilter: 'linear',
476
+ });
477
+ if (!sampler.ok) throw sampler.error;
478
+ const densitySampler = frame.runtime.device.createSampler({
479
+ minFilter: 'linear',
480
+ magFilter: 'linear',
481
+ addressModeU: 'repeat',
482
+ addressModeV: 'repeat',
483
+ addressModeW: 'repeat',
484
+ });
485
+ if (!densitySampler.ok) throw densitySampler.error;
486
+ const bindings = volumeBindGroup(frame, integrate.layout, [
487
+ { binding: 0, resource: { kind: 'textureView', value: froxel.value as never } },
488
+ { binding: 1, resource: { kind: 'textureView', value: depth.value as never } },
489
+ { binding: 2, resource: { kind: 'textureView', value: resolved.value as never } },
490
+ { binding: 3, resource: { kind: 'buffer', value: { buffer: params.value } } },
491
+ { binding: 4, resource: { kind: 'buffer', value: { buffer: view.value } } },
492
+ { binding: 5, resource: { kind: 'sampler', value: sampler.value } },
493
+ { binding: 6, resource: { kind: 'textureView', value: density.value as never } },
494
+ { binding: 7, resource: { kind: 'sampler', value: densitySampler.value } },
495
+ { binding: 8, resource: { kind: 'textureView', value: historySeed.value as never } },
496
+ { binding: 9, resource: { kind: 'textureView', value: temporalSeed.value as never } },
497
+ { binding: 10, resource: { kind: 'buffer', value: { buffer: spotLights.value } } },
498
+ { binding: 11, resource: { kind: 'buffer', value: { buffer: pointLights.value } } },
499
+ {
500
+ binding: 12,
501
+ resource: {
502
+ kind: 'textureView',
503
+ value:
504
+ projector === undefined
505
+ ? frame.pipelineState.defaultWhiteTextureView
506
+ : (projector.value as never),
507
+ },
508
+ },
509
+ {
510
+ binding: 13,
511
+ resource: {
512
+ kind: 'sampler',
513
+ value: frame.volumetricFog?.projectorSampler ?? frame.pipelineState.defaultSampler,
514
+ },
515
+ },
516
+ ]);
517
+ pass.setPipeline(integrate.pipeline);
518
+ pass.setBindGroup(0, bindings);
519
+ pass.dispatchWorkgroups(resolvedDispatchX, resolvedDispatchY, 1);
520
+ },
521
+ });
522
+ if (!integratePass.ok) return integratePass;
523
+ const temporalPass = graph.addComputePass('volume-temporal', {
524
+ accesses: [
525
+ { resource: inputs.resources.resolvedView, usage: 'sampled-read' },
526
+ { resource: inputs.resources.historyView, usage: 'sampled-storage-read-write' },
527
+ { resource: inputs.resources.temporalView, usage: 'sampled-storage-read-write' },
528
+ { resource: inputs.params, usage: 'uniform-read' },
529
+ { resource: inputs.view, usage: 'uniform-read' },
530
+ ],
531
+ encode: ({ pass, frame, resources }) => {
532
+ temporal ??= computeState(frame, shaderSource(frame, 'temporal'), 'volume_temporal', [
533
+ { binding: 0, visibility: 4, texture: { sampleType: 'float', viewDimension: '2d' } },
534
+ { binding: 1, visibility: 4, texture: { sampleType: 'float', viewDimension: '2d' } },
535
+ {
536
+ binding: 2,
537
+ visibility: 4,
538
+ storageTexture: {
539
+ access: 'write-only',
540
+ format: VOLUME_HISTORY_FORMAT,
541
+ viewDimension: '2d',
542
+ },
543
+ },
544
+ { binding: 3, visibility: 4, buffer: { type: 'uniform' } },
545
+ { binding: 4, visibility: 4, buffer: { type: 'uniform' } },
546
+ ]);
547
+ const current = resources.textureView(inputs.resources.resolvedView);
548
+ const history = resources.textureView(
549
+ frame.volumetricFog?.historyReadSlot === 0
550
+ ? inputs.resources.historyView
551
+ : inputs.resources.temporalView,
552
+ );
553
+ const pending = resources.textureView(
554
+ frame.volumetricFog?.historyWriteSlot === 0
555
+ ? inputs.resources.historyView
556
+ : inputs.resources.temporalView,
557
+ );
558
+ const params = resources.buffer(inputs.params);
559
+ const view = resources.buffer(inputs.view);
560
+ if (!current.ok) throw current.error;
561
+ if (!history.ok) throw history.error;
562
+ if (!pending.ok) throw pending.error;
563
+ if (!params.ok) throw params.error;
564
+ if (!view.ok) throw view.error;
565
+ const bindings = volumeBindGroup(frame, temporal.layout, [
566
+ { binding: 0, resource: { kind: 'textureView', value: current.value as never } },
567
+ { binding: 1, resource: { kind: 'textureView', value: history.value as never } },
568
+ { binding: 2, resource: { kind: 'textureView', value: pending.value as never } },
569
+ { binding: 3, resource: { kind: 'buffer', value: { buffer: params.value } } },
570
+ { binding: 4, resource: { kind: 'buffer', value: { buffer: view.value } } },
571
+ ]);
572
+ pass.setPipeline(temporal.pipeline);
573
+ pass.setBindGroup(0, bindings);
574
+ pass.dispatchWorkgroups(resolvedDispatchX, resolvedDispatchY, 1);
575
+ },
576
+ });
577
+ if (!temporalPass.ok) return temporalPass;
578
+ return graph.addRasterPass('volume-composite', {
579
+ accesses: [
580
+ { resource: inputs.resources.historyView, usage: 'sampled-read' },
581
+ { resource: inputs.resources.temporalView, usage: 'sampled-read' },
582
+ { resource: inputs.sceneDepth, usage: 'sampled-read' },
583
+ { resource: inputs.view, usage: 'uniform-read' },
584
+ { resource: inputs.linearHdr.view, usage: 'color-attachment' },
585
+ ],
586
+ colorAttachments: [
587
+ {
588
+ view: inputs.linearHdr.view,
589
+ loadOp: 'load',
590
+ storeOp: 'store',
591
+ clearValue: { r: 0, g: 0, b: 0, a: 1 },
592
+ },
593
+ ],
594
+ encode: ({ pass, frame, resources }) => {
595
+ composite ??= (() => {
596
+ const factory = frame.runtime.shaderModuleFactory;
597
+ if (factory === undefined) throw pipelineError('volume_composite');
598
+ const module = factory.createShaderModule({
599
+ code: shaderSource(frame, 'composite'),
600
+ label: 'volume_composite',
601
+ });
602
+ if (!module.ok) throw module.error;
603
+ const layout = frame.runtime.device.createBindGroupLayout({
604
+ label: 'volume_composite.bind-group-layout',
605
+ entries: [
606
+ {
607
+ binding: 0,
608
+ visibility: 2 | 1,
609
+ texture: { sampleType: 'float', viewDimension: '2d' },
610
+ },
611
+ { binding: 1, visibility: 2 | 1, sampler: { type: 'filtering' } },
612
+ {
613
+ binding: 2,
614
+ visibility: 2 | 1,
615
+ texture: { sampleType: 'depth', viewDimension: '2d' },
616
+ },
617
+ { binding: 3, visibility: 2 | 1, buffer: { type: 'uniform' } },
618
+ ],
619
+ });
620
+ if (!layout.ok) throw layout.error;
621
+ const pipelineLayout = frame.runtime.device.createPipelineLayout({
622
+ label: 'volume_composite.layout',
623
+ bindGroupLayouts: [layout.value],
624
+ });
625
+ if (!pipelineLayout.ok) throw pipelineLayout.error;
626
+ const created = frame.runtime.device.createRenderPipeline({
627
+ label: 'volume_composite',
628
+ layout: pipelineLayout.value,
629
+ vertex: { module: module.value, entryPoint: 'volume_vs', buffers: [] },
630
+ fragment: {
631
+ module: module.value,
632
+ entryPoint: 'volume_fs',
633
+ targets: [
634
+ {
635
+ format: inputs.linearHdr.format,
636
+ blend: {
637
+ color: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },
638
+ alpha: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },
639
+ },
640
+ },
641
+ ],
642
+ },
643
+ primitive: { topology: 'triangle-list' },
644
+ });
645
+ if (!created.ok) throw created.error;
646
+ compositeLayout = layout.value;
647
+ return created.value;
648
+ })();
649
+ const resolved = resources.textureView(
650
+ frame.volumetricFog?.historyWriteSlot === 0
651
+ ? inputs.resources.historyView
652
+ : inputs.resources.temporalView,
653
+ );
654
+ const depth = resources.textureView(inputs.sceneDepth);
655
+ const view = resources.buffer(inputs.view);
656
+ if (!resolved.ok) throw resolved.error;
657
+ if (!depth.ok) throw depth.error;
658
+ if (!view.ok) throw view.error;
659
+ const sampler = frame.runtime.device.createSampler({
660
+ label: 'volume_composite.sampler',
661
+ minFilter: 'linear',
662
+ magFilter: 'linear',
663
+ });
664
+ if (!sampler.ok) throw sampler.error;
665
+ const bindings = frame.runtime.device.createBindGroup({
666
+ layout: compositeLayout as BindGroupLayout,
667
+ entries: [
668
+ { binding: 0, resource: { kind: 'textureView', value: resolved.value as never } },
669
+ { binding: 1, resource: { kind: 'sampler', value: sampler.value } },
670
+ { binding: 2, resource: { kind: 'textureView', value: depth.value as never } },
671
+ { binding: 3, resource: { kind: 'buffer', value: { buffer: view.value } } },
672
+ ],
673
+ });
674
+ if (!bindings.ok) throw bindings.error;
675
+ pass.setPipeline(composite);
676
+ pass.setBindGroup(0, bindings.value);
677
+ pass.draw(3);
678
+ },
679
+ });
680
+ }