@forgeax/engine-render 0.1.32 → 0.1.34

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 (624) hide show
  1. package/README.md +1374 -142
  2. package/dist/assembly/analytic-fog-registration.d.ts +3 -0
  3. package/dist/assembly/analytic-fog-registration.d.ts.map +1 -0
  4. package/dist/assembly/backend-contract.d.ts +2 -0
  5. package/dist/assembly/backend-contract.d.ts.map +1 -1
  6. package/dist/assembly/barrel-distortion-inspection.d.ts +3 -0
  7. package/dist/assembly/barrel-distortion-inspection.d.ts.map +1 -0
  8. package/dist/assembly/canvas-draw-guard.d.ts +3 -0
  9. package/dist/assembly/canvas-draw-guard.d.ts.map +1 -0
  10. package/dist/assembly/cloud-shadow-entry.d.ts +4 -0
  11. package/dist/assembly/cloud-shadow-entry.d.ts.map +1 -0
  12. package/dist/assembly/dynamic-geometry-host.d.ts +4 -1
  13. package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
  14. package/dist/assembly/dynamic-geometry-runtime.d.ts +1 -1
  15. package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -1
  16. package/dist/assembly/factory.d.ts +1 -1
  17. package/dist/assembly/factory.d.ts.map +1 -1
  18. package/dist/assembly/fxaa-registration.d.ts +4 -0
  19. package/dist/assembly/fxaa-registration.d.ts.map +1 -0
  20. package/dist/assembly/host-contract.d.ts +3 -3
  21. package/dist/assembly/host-contract.d.ts.map +1 -1
  22. package/dist/assembly/lod-observation.d.ts +4 -0
  23. package/dist/assembly/lod-observation.d.ts.map +1 -0
  24. package/dist/assembly/material/assembly.d.ts.map +1 -1
  25. package/dist/assembly/material/pipeline-helpers.d.ts +5 -0
  26. package/dist/assembly/material/pipeline-helpers.d.ts.map +1 -1
  27. package/dist/assembly/material-shader-policy.d.ts +16 -2
  28. package/dist/assembly/material-shader-policy.d.ts.map +1 -1
  29. package/dist/assembly/material-shader-prewarm.d.ts.map +1 -1
  30. package/dist/assembly/motion-blur-registration.d.ts +3 -0
  31. package/dist/assembly/motion-blur-registration.d.ts.map +1 -0
  32. package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -1
  33. package/dist/assembly/recovery/renderer-recover.d.ts +2 -0
  34. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  35. package/dist/assembly/render-feature-post-processes.d.ts +6 -0
  36. package/dist/assembly/render-feature-post-processes.d.ts.map +1 -0
  37. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  38. package/dist/assembly/renderer-feature-inspection.d.ts +1 -1
  39. package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -1
  40. package/dist/assembly/renderer-frame-transaction.d.ts +12 -0
  41. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  42. package/dist/assembly/renderer-inspection.d.ts +11 -0
  43. package/dist/assembly/renderer-inspection.d.ts.map +1 -1
  44. package/dist/assembly/temporal-post-process-prewarm.d.ts +13 -0
  45. package/dist/assembly/temporal-post-process-prewarm.d.ts.map +1 -0
  46. package/dist/assembly/webgpu-pbr-ready.d.ts +1 -0
  47. package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -1
  48. package/dist/assembly/webgpu-ready-contract.d.ts +4 -3
  49. package/dist/assembly/webgpu-ready-contract.d.ts.map +1 -1
  50. package/dist/assembly/webgpu-ready-per-pass.d.ts +39 -0
  51. package/dist/assembly/webgpu-ready-per-pass.d.ts.map +1 -0
  52. package/dist/assembly/webgpu-ready.d.ts +2 -2
  53. package/dist/assembly/webgpu-ready.d.ts.map +1 -1
  54. package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -1
  55. package/dist/assembly/webgpu-renderer-observation-owner.d.ts +35 -0
  56. package/dist/assembly/webgpu-renderer-observation-owner.d.ts.map +1 -0
  57. package/dist/assembly/webgpu-renderer.d.ts +1 -1
  58. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  59. package/dist/authoring.mjs +1 -1
  60. package/dist/barrel-distortion.d.ts +47 -0
  61. package/dist/barrel-distortion.d.ts.map +1 -0
  62. package/dist/bloom-admission.d.ts +13 -0
  63. package/dist/bloom-admission.d.ts.map +1 -0
  64. package/dist/{chunk-PA5DRJNI.mjs → chunk-ELJFJ2BU.mjs} +2 -2
  65. package/dist/chunk-ELJFJ2BU.mjs.map +1 -0
  66. package/dist/{chunk-JCIRYQ4V.mjs → chunk-HEB564WF.mjs} +10 -4
  67. package/dist/chunk-HEB564WF.mjs.map +1 -0
  68. package/dist/{chunk-JRIPCMYC.mjs → chunk-MKDIT2EM.mjs} +1584 -375
  69. package/dist/chunk-MKDIT2EM.mjs.map +1 -0
  70. package/dist/{chunk-S665NJNF.mjs → chunk-OCDLEI6I.mjs} +3 -3
  71. package/dist/{chunk-S665NJNF.mjs.map → chunk-OCDLEI6I.mjs.map} +1 -1
  72. package/dist/chunk-ODZWR6JQ.mjs +4927 -0
  73. package/dist/chunk-ODZWR6JQ.mjs.map +1 -0
  74. package/dist/{chunk-DRR7D3KX.mjs → chunk-SHFUFJ5N.mjs} +192 -18
  75. package/dist/chunk-SHFUFJ5N.mjs.map +1 -0
  76. package/dist/{chunk-4NNZQCL3.mjs → chunk-UI5SFODX.mjs} +223 -277
  77. package/dist/chunk-UI5SFODX.mjs.map +1 -0
  78. package/dist/{chunk-GWCEMDVR.mjs → chunk-UINHLCZA.mjs} +787 -80
  79. package/dist/chunk-UINHLCZA.mjs.map +1 -0
  80. package/dist/{chunk-6TFBXLRJ.mjs → chunk-WEX45HKH.mjs} +222 -337
  81. package/dist/chunk-WEX45HKH.mjs.map +1 -0
  82. package/dist/cloud/density.d.ts +55 -0
  83. package/dist/cloud/density.d.ts.map +1 -0
  84. package/dist/cloud/extract.d.ts +25 -0
  85. package/dist/cloud/extract.d.ts.map +1 -0
  86. package/dist/cloud/feature.d.ts +57 -0
  87. package/dist/cloud/feature.d.ts.map +1 -0
  88. package/dist/cloud/frame-context.d.ts +8 -0
  89. package/dist/cloud/frame-context.d.ts.map +1 -0
  90. package/dist/cloud/inspection.d.ts +59 -0
  91. package/dist/cloud/inspection.d.ts.map +1 -0
  92. package/dist/cloud/optics.d.ts +56 -0
  93. package/dist/cloud/optics.d.ts.map +1 -0
  94. package/dist/cloud/parameters.d.ts +73 -0
  95. package/dist/cloud/parameters.d.ts.map +1 -0
  96. package/dist/cloud/resources.d.ts +60 -0
  97. package/dist/cloud/resources.d.ts.map +1 -0
  98. package/dist/cloud/shadow.d.ts +42 -0
  99. package/dist/cloud/shadow.d.ts.map +1 -0
  100. package/dist/cloud/temporal.d.ts +74 -0
  101. package/dist/cloud/temporal.d.ts.map +1 -0
  102. package/dist/components/atmosphere.d.ts +2 -0
  103. package/dist/components/atmosphere.d.ts.map +1 -1
  104. package/dist/components/barrel-distortion.d.ts +13 -0
  105. package/dist/components/barrel-distortion.d.ts.map +1 -0
  106. package/dist/components/camera.d.ts +20 -4
  107. package/dist/components/camera.d.ts.map +1 -1
  108. package/dist/components/cloud-layer.d.ts +29 -0
  109. package/dist/components/cloud-layer.d.ts.map +1 -0
  110. package/dist/components/index.d.ts +2 -0
  111. package/dist/components/index.d.ts.map +1 -1
  112. package/dist/components/instances.d.ts +20 -6
  113. package/dist/components/instances.d.ts.map +1 -1
  114. package/dist/components/mesh-filter.d.ts +6 -5
  115. package/dist/components/mesh-filter.d.ts.map +1 -1
  116. package/dist/components/motion-blur.d.ts +1 -0
  117. package/dist/components/motion-blur.d.ts.map +1 -1
  118. package/dist/construct-renderer.d.ts +1 -1
  119. package/dist/construct-renderer.d.ts.map +1 -1
  120. package/dist/construct-renderer.mjs +9751 -3528
  121. package/dist/construct-renderer.mjs.map +1 -1
  122. package/dist/device/gpu-residency.d.ts +6 -0
  123. package/dist/device/gpu-residency.d.ts.map +1 -1
  124. package/dist/dynamic-geometry.d.ts +5 -1
  125. package/dist/dynamic-geometry.d.ts.map +1 -1
  126. package/dist/environment/analytic-fog.d.ts +6 -0
  127. package/dist/environment/analytic-fog.d.ts.map +1 -0
  128. package/dist/errors/cloud.d.ts +59 -0
  129. package/dist/errors/cloud.d.ts.map +1 -0
  130. package/dist/errors/render.d.ts +23 -5
  131. package/dist/errors/render.d.ts.map +1 -1
  132. package/dist/examples/single-layer-medium-surface.d.ts +47 -0
  133. package/dist/examples/single-layer-medium-surface.d.ts.map +1 -0
  134. package/dist/extract/camera.d.ts.map +1 -1
  135. package/dist/extract/contracts.d.ts +12 -1
  136. package/dist/extract/contracts.d.ts.map +1 -1
  137. package/dist/extract/environment.d.ts +2 -0
  138. package/dist/extract/environment.d.ts.map +1 -1
  139. package/dist/features/barrel-distortion.d.ts +29 -0
  140. package/dist/features/barrel-distortion.d.ts.map +1 -0
  141. package/dist/features/error-reporting.d.ts +17 -0
  142. package/dist/features/error-reporting.d.ts.map +1 -0
  143. package/dist/features/host.d.ts +15 -0
  144. package/dist/features/host.d.ts.map +1 -1
  145. package/dist/features/motion-blur/motion-blur-feature.d.ts +20 -2
  146. package/dist/features/motion-blur/motion-blur-feature.d.ts.map +1 -1
  147. package/dist/features/motion-blur/motion-blur-params.d.ts +21 -0
  148. package/dist/features/motion-blur/motion-blur-params.d.ts.map +1 -1
  149. package/dist/features/motion-blur/motion-blur-runtime.d.ts +54 -0
  150. package/dist/features/motion-blur/motion-blur-runtime.d.ts.map +1 -0
  151. package/dist/features/plan.d.ts +15 -4
  152. package/dist/features/plan.d.ts.map +1 -1
  153. package/dist/features/prepared-gpu-work.d.ts +9 -5
  154. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  155. package/dist/features/render-graph-compute.d.ts.map +1 -1
  156. package/dist/features/render-graph-contribution.d.ts +5 -0
  157. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  158. package/dist/features/render-graph-raster.d.ts +1 -0
  159. package/dist/features/render-graph-raster.d.ts.map +1 -1
  160. package/dist/features/targets.d.ts +2 -0
  161. package/dist/features/targets.d.ts.map +1 -1
  162. package/dist/features/types.d.ts +44 -0
  163. package/dist/features/types.d.ts.map +1 -1
  164. package/dist/fullscreen-post-process-pass.d.ts +15 -7
  165. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  166. package/dist/gpu-dirty-ranges.d.ts +11 -0
  167. package/dist/gpu-dirty-ranges.d.ts.map +1 -0
  168. package/dist/gpu-driven/batch-topology.d.ts +17 -0
  169. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  170. package/dist/gpu-driven/material-artifacts.d.ts +6 -0
  171. package/dist/gpu-driven/material-artifacts.d.ts.map +1 -1
  172. package/dist/gpu-driven/prepared-draw.d.ts +7 -0
  173. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  174. package/dist/gpu-driven/production-raster-material.d.ts +178 -0
  175. package/dist/gpu-driven/production-raster-material.d.ts.map +1 -0
  176. package/dist/gpu-driven/production-raster.d.ts +50 -4
  177. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  178. package/dist/gpu-driven/resource-allocation.d.ts +31 -0
  179. package/dist/gpu-driven/resource-allocation.d.ts.map +1 -0
  180. package/dist/gpu-driven/shadow-ownership.d.ts +14 -0
  181. package/dist/gpu-driven/shadow-ownership.d.ts.map +1 -0
  182. package/dist/gpu-driven/view-gpu.d.ts +35 -2
  183. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  184. package/dist/gpu-scene.d.ts +11 -1
  185. package/dist/gpu-scene.d.ts.map +1 -1
  186. package/dist/hdrp-buffers.d.ts +2 -2
  187. package/dist/hdrp-buffers.d.ts.map +1 -1
  188. package/dist/ibl/skylight-bind-group.d.ts +10 -1
  189. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  190. package/dist/index.d.ts +31 -8
  191. package/dist/index.d.ts.map +1 -1
  192. package/dist/index.mjs +258 -8
  193. package/dist/index.mjs.map +1 -1
  194. package/dist/inspection-types.d.ts +178 -3
  195. package/dist/inspection-types.d.ts.map +1 -1
  196. package/dist/instance-buffer-cache.d.ts +4 -4
  197. package/dist/instance-buffer-cache.d.ts.map +1 -1
  198. package/dist/instances.d.ts +49 -94
  199. package/dist/instances.d.ts.map +1 -1
  200. package/dist/internal.mjs +7 -7
  201. package/dist/pbr-pipeline.d.ts +19 -1
  202. package/dist/pbr-pipeline.d.ts.map +1 -1
  203. package/dist/pipeline/single-layer-medium-passes.d.ts +73 -0
  204. package/dist/pipeline/single-layer-medium-passes.d.ts.map +1 -0
  205. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  206. package/dist/pipeline/standard-output/graph.d.ts.map +1 -1
  207. package/dist/pipeline/standard-output/types.d.ts +4 -2
  208. package/dist/pipeline/standard-output/types.d.ts.map +1 -1
  209. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  210. package/dist/pipeline/standard-post.d.ts +28 -19
  211. package/dist/pipeline/standard-post.d.ts.map +1 -1
  212. package/dist/pipeline-builder.d.ts +1 -1
  213. package/dist/pipeline-builder.d.ts.map +1 -1
  214. package/dist/pipeline-spec.d.ts +2 -2
  215. package/dist/plugin.d.ts.map +1 -1
  216. package/dist/prepare/prepared-graphics-resolver.d.ts +2 -0
  217. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  218. package/dist/record/barrel-distortion-frame.d.ts +15 -0
  219. package/dist/record/barrel-distortion-frame.d.ts.map +1 -0
  220. package/dist/record/dynamic-geometry-consumption.d.ts +10 -2
  221. package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -1
  222. package/dist/record/fold-buckets.d.ts +95 -0
  223. package/dist/record/fold-buckets.d.ts.map +1 -0
  224. package/dist/record/fold-instance-buffer.d.ts +6 -0
  225. package/dist/record/fold-instance-buffer.d.ts.map +1 -0
  226. package/dist/record/frame-lighting.d.ts +1 -0
  227. package/dist/record/frame-lighting.d.ts.map +1 -1
  228. package/dist/record/frame-snapshot.d.ts +40 -3
  229. package/dist/record/frame-snapshot.d.ts.map +1 -1
  230. package/dist/record/frame-targets.d.ts.map +1 -1
  231. package/dist/record/frame.d.ts +14 -62
  232. package/dist/record/frame.d.ts.map +1 -1
  233. package/dist/record/gpu-draw-receipts.d.ts +11 -0
  234. package/dist/record/gpu-draw-receipts.d.ts.map +1 -0
  235. package/dist/record/gpu-timing.d.ts +8 -0
  236. package/dist/record/gpu-timing.d.ts.map +1 -1
  237. package/dist/record/main-pass-geometry.d.ts +21 -5
  238. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  239. package/dist/record/main-pass-material.d.ts +7 -1
  240. package/dist/record/main-pass-material.d.ts.map +1 -1
  241. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  242. package/dist/record/main-pass.d.ts +13 -2
  243. package/dist/record/main-pass.d.ts.map +1 -1
  244. package/dist/record/mesh-ssbo.d.ts +6 -5
  245. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  246. package/dist/record/motion-blur-receipt.d.ts +11 -0
  247. package/dist/record/motion-blur-receipt.d.ts.map +1 -0
  248. package/dist/record/probe-blend-buffer.d.ts +16 -0
  249. package/dist/record/probe-blend-buffer.d.ts.map +1 -0
  250. package/dist/record/recovery-pipeline.d.ts.map +1 -1
  251. package/dist/record/render-context.d.ts +34 -31
  252. package/dist/record/render-context.d.ts.map +1 -1
  253. package/dist/record/shadow-pass.d.ts +2 -0
  254. package/dist/record/shadow-pass.d.ts.map +1 -1
  255. package/dist/record/skybox-post-pass.d.ts +6 -4
  256. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  257. package/dist/record/typed-frame-graph.d.ts +22 -2
  258. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  259. package/dist/record/view-ubo.d.ts +11 -3
  260. package/dist/record/view-ubo.d.ts.map +1 -1
  261. package/dist/record/volume-params.d.ts +9 -0
  262. package/dist/record/volume-params.d.ts.map +1 -0
  263. package/dist/recovery/render-system-candidate.d.ts +10 -0
  264. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  265. package/dist/reflection/record-owner.d.ts.map +1 -1
  266. package/dist/render-contract.d.ts +66 -8
  267. package/dist/render-contract.d.ts.map +1 -1
  268. package/dist/render-graph-primitives.d.ts.map +1 -1
  269. package/dist/render-pipeline.d.ts +106 -3
  270. package/dist/render-pipeline.d.ts.map +1 -1
  271. package/dist/render-system-extract-tail.d.ts +3 -2
  272. package/dist/render-system-extract-tail.d.ts.map +1 -1
  273. package/dist/render-system-extract.d.ts +24 -10
  274. package/dist/render-system-extract.d.ts.map +1 -1
  275. package/dist/render-system-presentation.d.ts +23 -0
  276. package/dist/render-system-presentation.d.ts.map +1 -0
  277. package/dist/render-system-producer-roots.d.ts +10 -0
  278. package/dist/render-system-producer-roots.d.ts.map +1 -0
  279. package/dist/render-system-residency.d.ts +12 -0
  280. package/dist/render-system-residency.d.ts.map +1 -0
  281. package/dist/render-system.d.ts +26 -15
  282. package/dist/render-system.d.ts.map +1 -1
  283. package/dist/scene/probe-blend.d.ts +27 -0
  284. package/dist/scene/probe-blend.d.ts.map +1 -1
  285. package/dist/scene/render-scene.d.ts +14 -5
  286. package/dist/scene/render-scene.d.ts.map +1 -1
  287. package/dist/ssao-buffers.d.ts +9 -0
  288. package/dist/ssao-buffers.d.ts.map +1 -1
  289. package/dist/surface/dynamic-input.d.ts +133 -0
  290. package/dist/surface/dynamic-input.d.ts.map +1 -0
  291. package/dist/surface/gpu-driven.d.ts +41 -0
  292. package/dist/surface/gpu-driven.d.ts.map +1 -0
  293. package/dist/surface/submission-observation.d.ts +136 -0
  294. package/dist/surface/submission-observation.d.ts.map +1 -0
  295. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  296. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  297. package/dist/temporal/frame.d.ts +7 -0
  298. package/dist/temporal/frame.d.ts.map +1 -1
  299. package/dist/temporal/gpu.d.ts +13 -1
  300. package/dist/temporal/gpu.d.ts.map +1 -1
  301. package/dist/temporal/index.mjs +5 -5
  302. package/dist/temporal/inspection.d.ts.map +1 -1
  303. package/dist/temporal/standard-scene-data.d.ts.map +1 -1
  304. package/dist/temporal/target-coverage-attachment.d.ts.map +1 -1
  305. package/dist/temporal/view.d.ts +6 -1
  306. package/dist/temporal/view.d.ts.map +1 -1
  307. package/dist/transmission/single-layer-medium.d.ts +89 -0
  308. package/dist/transmission/single-layer-medium.d.ts.map +1 -0
  309. package/dist/typed-render-graph-primitives.d.ts +24 -9
  310. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  311. package/dist/volume/component.d.ts +9 -5
  312. package/dist/volume/component.d.ts.map +1 -1
  313. package/dist/volume/extract.d.ts +1 -1
  314. package/dist/volume/extract.d.ts.map +1 -1
  315. package/dist/volume/inspection.d.ts +2 -0
  316. package/dist/volume/inspection.d.ts.map +1 -1
  317. package/dist/volume/passes.d.ts +4 -1
  318. package/dist/volume/passes.d.ts.map +1 -1
  319. package/dist/volume/resources.d.ts.map +1 -1
  320. package/dist/volume/temporal.d.ts +3 -1
  321. package/dist/volume/temporal.d.ts.map +1 -1
  322. package/package.json +22 -21
  323. package/src/__tests__/analytic-fog-graph.unit.test.ts +199 -0
  324. package/src/__tests__/analytic-fog-optics.unit.test.ts +38 -0
  325. package/src/__tests__/atmosphere-daylight.dawn.test.ts +72 -0
  326. package/src/__tests__/barrel-distortion-lkg.integration.test.ts +353 -0
  327. package/src/__tests__/barrel-distortion.dawn.test.ts +41 -0
  328. package/src/__tests__/barrel-distortion.unit.test.ts +364 -0
  329. package/src/__tests__/bloom-exact-zero.unit.test.ts +112 -18
  330. package/src/__tests__/bloom-lifecycle.integration.test.ts +17 -4
  331. package/src/__tests__/construct-renderer-identity.unit.test.ts +49 -0
  332. package/src/__tests__/detached-recovery-graph.unit.test.ts +277 -0
  333. package/src/__tests__/device-loss-fanout.unit.test.ts +36 -1
  334. package/src/__tests__/docs-gate-green.unit.test.ts +112 -1
  335. package/src/__tests__/dynamic-resolution-plugin.integration.test.ts +20 -0
  336. package/src/__tests__/environment-fog-lanes.integration.test.ts +14 -0
  337. package/src/__tests__/environment-selection.unit.test.ts +12 -0
  338. package/src/__tests__/factory-contract.integration.test.ts +626 -113
  339. package/src/__tests__/feature-depth-input.dawn.test.ts +129 -2
  340. package/src/__tests__/frame-camera-selection.unit.test.ts +39 -1
  341. package/src/__tests__/frame-plan-contract.unit.test.ts +2 -0
  342. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +14 -3
  343. package/src/__tests__/gpu-dirty-ranges.unit.test.ts +22 -0
  344. package/src/__tests__/gpu-driven-baseline.characterization.test.ts +16 -3
  345. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +12 -0
  346. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +2 -1
  347. package/src/__tests__/gpu-driven-material-artifacts.unit.test.ts +143 -0
  348. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +2 -2
  349. package/src/__tests__/gpu-driven-production.integration.test.ts +482 -3
  350. package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +7 -6
  351. package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +1 -1
  352. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +103 -4
  353. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +18 -2
  354. package/src/__tests__/gpu-driven-view.browser.test.ts +5 -8
  355. package/src/__tests__/gpu-driven-view.dawn.test.ts +6 -2
  356. package/src/__tests__/gpu-driven-view.unit.test.ts +1 -1
  357. package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +1 -0
  358. package/src/__tests__/gpu-pass-timing.browser.test.ts +6 -4
  359. package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +1 -0
  360. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +12 -0
  361. package/src/__tests__/gpu-scene.unit.test.ts +210 -9
  362. package/src/__tests__/instance-allocation-failure.unit.test.ts +57 -0
  363. package/src/__tests__/instances-culling.integration.test.ts +10 -36
  364. package/src/__tests__/instances-store.unit.test.ts +105 -238
  365. package/src/__tests__/instances-world-ownership.integration.test.ts +62 -0
  366. package/src/__tests__/main-pass-material-medium-selection.unit.test.ts +146 -0
  367. package/src/__tests__/material-shader-prewarm.unit.test.ts +59 -0
  368. package/src/__tests__/material-snapshot-mutation.integration.test.ts +39 -1
  369. package/src/__tests__/mesh-submission-lifetime.unit.test.ts +31 -0
  370. package/src/__tests__/morph-culling-reentry.dawn.test.ts +5 -5
  371. package/src/__tests__/morph-visual-evidence.integration.test.ts +8 -7
  372. package/src/__tests__/motion-blur-compute.dawn.test.ts +589 -0
  373. package/src/__tests__/motion-blur.pixel.integration.test.ts +2 -2
  374. package/src/__tests__/nineslice-handle-surface.unit.test.ts +4 -4
  375. package/src/__tests__/pbr-view-layout.unit.test.ts +9 -0
  376. package/src/__tests__/physical-clearcoat.integration.test.ts +58 -0
  377. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +21 -0
  378. package/src/__tests__/prepared-graphics-capability.unit.test.ts +66 -2
  379. package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +86 -0
  380. package/src/__tests__/probe-bindings.unit.test.ts +582 -1
  381. package/src/__tests__/probe-scene-dirty.integration.test.ts +28 -1
  382. package/src/__tests__/public-surface.test-d.ts +8 -0
  383. package/src/__tests__/receipt-observation-retirement.unit.test.ts +65 -0
  384. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +69 -0
  385. package/src/__tests__/render-error-code-owner.test-d.ts +9 -0
  386. package/src/__tests__/render-feature-diagnostics.unit.test.ts +15 -2
  387. package/src/__tests__/render-feature-error-reporting.unit.test.ts +44 -0
  388. package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +10 -1
  389. package/src/__tests__/render-feature-retry.unit.test.ts +12 -1
  390. package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +23 -0
  391. package/src/__tests__/render-scene-mixed-updates.integration.test.ts +145 -19
  392. package/src/__tests__/render-scene-projection.unit.test.ts +36 -11
  393. package/src/__tests__/render-scene-temporal-retry.unit.test.ts +37 -6
  394. package/src/__tests__/render-target-probe-soak.perf.test.ts +2 -2
  395. package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +3 -3
  396. package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +5 -2
  397. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +41 -7
  398. package/src/__tests__/renderer-frame-generation-fence.integration.test.ts +16 -0
  399. package/src/__tests__/renderer-frame-transaction.integration.test.ts +33 -11
  400. package/src/__tests__/resource-allocation.unit.test.ts +123 -0
  401. package/src/__tests__/shader-manifest-fixture.ts +4 -4
  402. package/src/__tests__/single-layer-medium-passes.unit.test.ts +275 -0
  403. package/src/__tests__/skin-motion-regression.unit.test.ts +70 -1
  404. package/src/__tests__/skin-palette-recycling.dawn.test.ts +97 -0
  405. package/src/__tests__/skinned-shadow-caster.test.ts +17 -0
  406. package/src/__tests__/ssr-carrier-public-contract.unit.test.ts +21 -0
  407. package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +4 -4
  408. package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +2 -2
  409. package/src/__tests__/ssr-gpu-dispatch.ts +1 -1
  410. package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +6 -2
  411. package/src/__tests__/standard-lighting-write.unit.test.ts +2 -1
  412. package/src/__tests__/standard-output-chain-contract.unit.test.ts +28 -0
  413. package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +46 -1
  414. package/src/__tests__/standard-pipeline.dawn.test.ts +1 -1
  415. package/src/__tests__/standard-pipeline.integration.test.ts +200 -9
  416. package/src/__tests__/surface-dynamic-buffer-lifecycle.unit.test.ts +506 -0
  417. package/src/__tests__/surface-submission-observation.unit.test.ts +812 -0
  418. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +32 -0
  419. package/src/__tests__/temporal-performance.integration.test.ts +3 -3
  420. package/src/__tests__/temporal-reset-matrix.unit.test.ts +10 -0
  421. package/src/__tests__/temporal-view.unit.test.ts +2 -1
  422. package/src/__tests__/typed-pipeline-topology.unit.test.ts +20 -4
  423. package/src/__tests__/visibility-instances.integration.test.ts +7 -19
  424. package/src/__tests__/visibility-producer-matrix.integration.test.ts +9 -20
  425. package/src/__tests__/volume-optics-oracle.unit.test.ts +7 -3
  426. package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +189 -15
  427. package/src/__tests__/volumetric-fog-errors.unit.test.ts +4 -3
  428. package/src/__tests__/volumetric-fog-multiple.unit.test.ts +55 -0
  429. package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +1 -1
  430. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +558 -68
  431. package/src/__tests__/volumetric-fog-temporal.unit.test.ts +27 -0
  432. package/src/__tests__/volumetric-fog-topology.unit.test.ts +23 -5
  433. package/src/assembly/analytic-fog-registration.ts +14 -0
  434. package/src/assembly/backend-contract.ts +30 -0
  435. package/src/assembly/barrel-distortion-inspection.ts +22 -0
  436. package/src/assembly/canvas-draw-guard.ts +11 -0
  437. package/src/assembly/cloud-shadow-entry.ts +22 -0
  438. package/src/assembly/dynamic-geometry-host.ts +65 -37
  439. package/src/assembly/dynamic-geometry-runtime.ts +7 -1
  440. package/src/assembly/factory.ts +2 -30
  441. package/src/assembly/fxaa-registration.ts +17 -0
  442. package/src/assembly/host-contract.ts +3 -3
  443. package/src/assembly/lod-observation.ts +12 -0
  444. package/src/assembly/material/assembly.ts +25 -13
  445. package/src/assembly/material/pipeline-helpers.ts +53 -12
  446. package/src/assembly/material-shader-policy.ts +55 -0
  447. package/src/assembly/material-shader-prewarm.ts +21 -10
  448. package/src/assembly/motion-blur-registration.ts +17 -0
  449. package/src/assembly/recovery/device-loss-fanout.ts +13 -0
  450. package/src/assembly/recovery/renderer-recover.ts +41 -18
  451. package/src/assembly/render-feature-post-processes.ts +54 -0
  452. package/src/assembly/renderer-facade.ts +6 -1
  453. package/src/assembly/renderer-feature-inspection.ts +8 -2
  454. package/src/assembly/renderer-frame-transaction.ts +23 -0
  455. package/src/assembly/renderer-inspection.ts +28 -0
  456. package/src/assembly/skin-palette-owner.ts +1 -1
  457. package/src/assembly/temporal-post-process-prewarm.ts +40 -0
  458. package/src/assembly/webgpu-pbr-ready.ts +9 -1
  459. package/src/assembly/webgpu-ready-contract.ts +8 -3
  460. package/src/assembly/webgpu-ready-per-pass.ts +104 -0
  461. package/src/assembly/webgpu-ready.ts +296 -306
  462. package/src/assembly/webgpu-renderer-bootstrap.ts +0 -12
  463. package/src/assembly/webgpu-renderer-observation-owner.ts +222 -0
  464. package/src/assembly/webgpu-renderer.ts +228 -281
  465. package/src/assembly/webgpu-vertex-layouts.ts +1 -1
  466. package/src/barrel-distortion.ts +247 -0
  467. package/src/bloom-admission.ts +21 -0
  468. package/src/cloud/__tests__/cloud-density-parity.dawn.test.ts +173 -0
  469. package/src/cloud/__tests__/cloud-layer-framebuffer-y.dawn.test.ts +265 -0
  470. package/src/cloud/__tests__/cloud-layer.browser.test.ts +432 -0
  471. package/src/cloud/__tests__/cloud-layer.unit.test.ts +634 -0
  472. package/src/cloud/density.ts +600 -0
  473. package/src/cloud/extract.ts +110 -0
  474. package/src/cloud/feature.ts +1810 -0
  475. package/src/cloud/frame-context.ts +42 -0
  476. package/src/cloud/inspection.ts +130 -0
  477. package/src/cloud/optics.ts +285 -0
  478. package/src/cloud/parameters.ts +255 -0
  479. package/src/cloud/resources.ts +122 -0
  480. package/src/cloud/shadow.ts +167 -0
  481. package/src/cloud/temporal.ts +226 -0
  482. package/src/components/__tests__/motion-blur.unit.test.ts +1 -0
  483. package/src/components/atmosphere.ts +4 -0
  484. package/src/components/barrel-distortion.ts +46 -0
  485. package/src/components/camera.ts +66 -10
  486. package/src/components/cloud-layer.ts +47 -0
  487. package/src/components/index.ts +2 -0
  488. package/src/components/instances.ts +18 -45
  489. package/src/components/mesh-filter.ts +11 -9
  490. package/src/components/motion-blur.ts +1 -0
  491. package/src/components/sprite-instances.ts +1 -1
  492. package/src/construct-renderer.ts +1 -1
  493. package/src/device/gpu-residency.ts +56 -12
  494. package/src/dynamic-geometry.ts +12 -1
  495. package/src/environment/analytic-fog.ts +44 -0
  496. package/src/environment/background.ts +2 -2
  497. package/src/errors/cloud.ts +103 -0
  498. package/src/errors/render.ts +58 -8
  499. package/src/examples/single-layer-medium-surface.ts +59 -0
  500. package/src/extract/camera.ts +35 -8
  501. package/src/extract/contracts.ts +12 -0
  502. package/src/extract/environment.ts +4 -0
  503. package/src/features/barrel-distortion.ts +172 -0
  504. package/src/features/error-reporting.ts +98 -0
  505. package/src/features/host.ts +138 -24
  506. package/src/features/motion-blur/__tests__/motion-blur-feature.unit.test.ts +111 -1
  507. package/src/features/motion-blur/__tests__/motion-blur-params.unit.test.ts +58 -3
  508. package/src/features/motion-blur/motion-blur-feature.ts +1519 -15
  509. package/src/features/motion-blur/motion-blur-params.ts +70 -2
  510. package/src/features/motion-blur/motion-blur-runtime.ts +176 -0
  511. package/src/features/plan.ts +33 -8
  512. package/src/features/prepared-gpu-work.ts +86 -35
  513. package/src/features/render-graph-compute.ts +13 -5
  514. package/src/features/render-graph-contribution.ts +11 -0
  515. package/src/features/render-graph-raster.ts +45 -3
  516. package/src/features/targets.ts +66 -0
  517. package/src/features/types.ts +47 -0
  518. package/src/fullscreen-post-process-pass.ts +41 -9
  519. package/src/gpu-dirty-ranges.ts +48 -0
  520. package/src/gpu-driven/batch-topology.ts +53 -0
  521. package/src/gpu-driven/material-artifacts.ts +35 -32
  522. package/src/gpu-driven/prepared-draw.ts +27 -14
  523. package/src/gpu-driven/production-raster-material.ts +1894 -0
  524. package/src/gpu-driven/production-raster.ts +904 -787
  525. package/src/gpu-driven/resource-allocation.ts +142 -0
  526. package/src/gpu-driven/shadow-ownership.ts +71 -0
  527. package/src/gpu-driven/view-gpu.ts +181 -10
  528. package/src/gpu-scene.ts +259 -101
  529. package/src/hdrp-buffers.ts +4 -3
  530. package/src/ibl/skylight-bind-group.ts +49 -7
  531. package/src/index.ts +228 -9
  532. package/src/inspection-types.ts +222 -2
  533. package/src/instance-buffer-cache.ts +4 -4
  534. package/src/instances.ts +151 -492
  535. package/src/pbr-pipeline.ts +219 -13
  536. package/src/pipeline/single-layer-medium-passes.ts +267 -0
  537. package/src/pipeline/standard-forward-lane.ts +313 -57
  538. package/src/pipeline/standard-output/graph.ts +8 -2
  539. package/src/pipeline/standard-output/types.ts +12 -1
  540. package/src/pipeline/standard-pipeline.ts +291 -18
  541. package/src/pipeline/standard-post.ts +397 -102
  542. package/src/pipeline-builder.ts +1 -1
  543. package/src/pipeline-spec.ts +5 -5
  544. package/src/plugin.ts +4 -0
  545. package/src/points-lines/__tests__/points-lines.bench.ts +17 -8
  546. package/src/points-lines/__tests__/view-ubo.unit.test.ts +2 -1
  547. package/src/prepare/prepared-graphics-resolver.ts +2 -0
  548. package/src/record/__tests__/main-pass-geometry.unit.test.ts +30 -0
  549. package/src/record/__tests__/sprite-material-abi.unit.test.ts +1 -1
  550. package/src/record/__tests__/temporal-payload.unit.test.ts +3 -2
  551. package/src/record/__tests__/transparent-group2-selection.unit.test.ts +11 -0
  552. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +1 -0
  553. package/src/record/__tests__/view-ubo-layout.unit.test.ts +4 -3
  554. package/src/record/barrel-distortion-frame.ts +110 -0
  555. package/src/record/dynamic-geometry-consumption.ts +39 -9
  556. package/src/record/fold-buckets.ts +852 -0
  557. package/src/record/fold-instance-buffer.ts +51 -0
  558. package/src/record/frame-lighting.ts +36 -2
  559. package/src/record/frame-snapshot.ts +44 -4
  560. package/src/record/frame-targets.ts +10 -6
  561. package/src/record/frame.ts +373 -1099
  562. package/src/record/gpu-draw-receipts.ts +38 -0
  563. package/src/record/gpu-timing.ts +48 -5
  564. package/src/record/main-pass-geometry.ts +281 -83
  565. package/src/record/main-pass-material.ts +66 -4
  566. package/src/record/main-pass-sprite-draws.ts +13 -66
  567. package/src/record/main-pass.ts +156 -20
  568. package/src/record/mesh-ssbo.ts +43 -6
  569. package/src/record/motion-blur-receipt.ts +91 -0
  570. package/src/record/probe-blend-buffer.ts +180 -0
  571. package/src/record/recovery-pipeline.ts +35 -3
  572. package/src/record/render-context.ts +51 -31
  573. package/src/record/shadow-pass.ts +36 -2
  574. package/src/record/skybox-post-pass.ts +150 -200
  575. package/src/record/typed-frame-graph.ts +824 -44
  576. package/src/record/view-ubo.ts +26 -3
  577. package/src/record/volume-params.ts +225 -0
  578. package/src/recovery/render-system-candidate.ts +257 -52
  579. package/src/reflection/record-owner.ts +7 -3
  580. package/src/render-contract.ts +71 -8
  581. package/src/render-graph-primitives.ts +7 -1
  582. package/src/render-pipeline.ts +136 -1
  583. package/src/render-system-extract-tail.ts +72 -60
  584. package/src/render-system-extract.ts +117 -87
  585. package/src/render-system-presentation.ts +56 -0
  586. package/src/render-system-producer-roots.ts +96 -0
  587. package/src/render-system-residency.ts +159 -0
  588. package/src/render-system.ts +601 -482
  589. package/src/scene/probe-blend.ts +96 -4
  590. package/src/scene/render-scene.ts +431 -281
  591. package/src/ssao-buffers.ts +95 -2
  592. package/src/surface/__tests__/dynamic-input.unit.test.ts +374 -0
  593. package/src/surface/__tests__/gpu-driven.unit.test.ts +87 -0
  594. package/src/surface/dynamic-input.ts +658 -0
  595. package/src/surface/gpu-driven.ts +147 -0
  596. package/src/surface/submission-observation.ts +517 -0
  597. package/src/systems/skin-palette-allocator.ts +4 -1
  598. package/src/temporal/__tests__/temporal-frame-transaction.unit.test.ts +36 -0
  599. package/src/temporal/frame-coordinator.ts +8 -1
  600. package/src/temporal/frame.ts +20 -0
  601. package/src/temporal/gpu.ts +101 -17
  602. package/src/temporal/inspection.ts +7 -1
  603. package/src/temporal/standard-scene-data.ts +5 -0
  604. package/src/temporal/target-coverage-attachment.ts +4 -0
  605. package/src/temporal/view.ts +13 -2
  606. package/src/transmission/__tests__/single-layer-medium.unit.test.ts +149 -0
  607. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +12 -11
  608. package/src/transmission/single-layer-medium.ts +322 -0
  609. package/src/typed-render-graph-primitives.ts +191 -50
  610. package/src/volume/component.ts +10 -10
  611. package/src/volume/extract.ts +11 -5
  612. package/src/volume/inspection.ts +3 -0
  613. package/src/volume/passes.ts +95 -8
  614. package/src/volume/resources.ts +2 -1
  615. package/src/volume/temporal.ts +11 -0
  616. package/dist/chunk-4NNZQCL3.mjs.map +0 -1
  617. package/dist/chunk-6TFBXLRJ.mjs.map +0 -1
  618. package/dist/chunk-DRR7D3KX.mjs.map +0 -1
  619. package/dist/chunk-GWCEMDVR.mjs.map +0 -1
  620. package/dist/chunk-JCIRYQ4V.mjs.map +0 -1
  621. package/dist/chunk-JRIPCMYC.mjs.map +0 -1
  622. package/dist/chunk-LULCA3OF.mjs +0 -1713
  623. package/dist/chunk-LULCA3OF.mjs.map +0 -1
  624. package/dist/chunk-PA5DRJNI.mjs.map +0 -1
@@ -6,9 +6,16 @@ import {
6
6
  RenderGraphError,
7
7
  } from '@forgeax/engine-render-graph';
8
8
  import { err, ok, type Result } from '@forgeax/engine-types';
9
+ import { CLOUD_LAYER_FEATURE_IDENTITY } from '../cloud/feature';
9
10
  import { addAtmosphereBackground } from '../environment/background';
10
11
  import { SceneDataUnavailableError, StandardProfileInvalidError } from '../errors/render';
11
12
  import type { FramePlan } from '../extract/environment';
13
+ import { BARREL_DISTORTION_FEATURE_IDENTITY } from '../features/barrel-distortion';
14
+ import {
15
+ GPU_TEXTURE_USAGE_COPY_SRC,
16
+ GPU_TEXTURE_USAGE_RENDER_ATTACHMENT,
17
+ GPU_TEXTURE_USAGE_TEXTURE_BINDING,
18
+ } from '../gpu-texture-usage';
12
19
  import { GPU_BUFFER_USAGE_COPY_DST, GPU_BUFFER_USAGE_UNIFORM } from '../gpu-usage';
13
20
  import { DEFERRED_COLOR_FORMATS } from '../pipeline-spec';
14
21
  import { VIEW_UNIFORM_BYTES } from '../record/view-ubo';
@@ -16,12 +23,14 @@ import type {
16
23
  RenderPipeline,
17
24
  RenderPipelineBuildContext,
18
25
  RenderPipelineFrame,
26
+ RenderPipelineSurfaceMediumPair,
19
27
  RenderPipelineTopology,
20
28
  } from '../render-pipeline';
21
29
  import {
22
30
  createRenderPipelineTarget,
23
31
  importRenderPipelineSurface,
24
32
  type RenderPipelineTarget,
33
+ renderPipelineCloudHistoryTargets,
25
34
  } from '../render-pipeline';
26
35
  import { addSsrCompositionPass } from '../ssr/compose';
27
36
  import { addSsrSpatialPasses } from '../ssr/graph';
@@ -48,6 +57,10 @@ import {
48
57
  import { addTypedShadowPasses } from '../typed-shadow-passes';
49
58
  import { addAuthoredVolumetricFogPasses } from '../volume/passes';
50
59
  import { renderExtentSize } from './render-extent';
60
+ import {
61
+ addSingleLayerMediumPasses,
62
+ addSingleLayerMediumRawDepthProducer,
63
+ } from './single-layer-medium-passes';
51
64
  import type { StandardPipelineBuildContext } from './standard-build-context';
52
65
  import { buildStandardForwardLane } from './standard-forward-lane';
53
66
  import {
@@ -172,6 +185,10 @@ function buildStandardDeferredLane(
172
185
  if (!surface.ok) return surface;
173
186
  const internalSize =
174
187
  topology.extent === undefined ? 'surface' : renderExtentSize(topology.extent, 'internal');
188
+ const internalCopySize =
189
+ topology.extent === undefined
190
+ ? { width: topology.surface.width, height: topology.surface.height }
191
+ : renderExtentSize(topology.extent, 'internal');
175
192
  const buffers = importStandardClusterBuffers(graph, lighting);
176
193
  if (!buffers.ok) return buffers;
177
194
  const membership =
@@ -217,6 +234,28 @@ function buildStandardDeferredLane(
217
234
  if (!gbuffer2.ok) return gbuffer2;
218
235
  const scene = target(graph, 'hdrp-scene-color', { format: 'rgba16float', size: internalSize });
219
236
  if (!scene.ok) return scene;
237
+ const mediumTargets =
238
+ topology.singleLayerMedium === true
239
+ ? (() => {
240
+ const nearestLayer = target(graph, 'single-layer-medium-nearest-layer', {
241
+ format: scene.value.format,
242
+ size: internalSize,
243
+ // The color pass samples this target with a `texture_2d`; keep
244
+ // it single-sample even when a future deferred path is MSAA.
245
+ sampleCount: 1,
246
+ domain: 'linear-ldr',
247
+ });
248
+ if (!nearestLayer.ok) return nearestLayer;
249
+ const nearestDepth = target(graph, 'single-layer-medium-nearest-depth', {
250
+ format: 'depth24plus-stencil8',
251
+ size: internalSize,
252
+ sampleCount: 1,
253
+ });
254
+ if (!nearestDepth.ok) return nearestDepth;
255
+ return ok({ nearestLayer: nearestLayer.value, nearestDepth: nearestDepth.value });
256
+ })()
257
+ : ok(undefined);
258
+ if (!mediumTargets.ok) return mediumTargets;
220
259
  const reflectionFallback =
221
260
  topology.reflectionFallback?.enabled === true || topology.ssr?.status === 'admitted'
222
261
  ? target(graph, 'reflection-fallback-linear-hdr', {
@@ -270,6 +309,11 @@ function buildStandardDeferredLane(
270
309
  colorTargets: [gbuffer0.value, gbuffer1.value, gbuffer2.value],
271
310
  depth: depth.value,
272
311
  selector: { LightMode: ['Deferred'] },
312
+ // The G-buffer only admits opaque Standard materials. Medium Surface
313
+ // programs have no Deferred entry and acquire raw depth in their later
314
+ // paired color pass; filtering here also avoids assembling their bind
315
+ // groups before that producer exists.
316
+ recordMode: 'opaque',
273
317
  passKind: 'deferred',
274
318
  clearColor: [0, 0, 0, 0],
275
319
  });
@@ -301,6 +345,85 @@ function buildStandardDeferredLane(
301
345
  if (!skybox.ok) return skybox;
302
346
  }
303
347
 
348
+ const featureRasterWork =
349
+ context.hasFeatureRasterWork?.(CLOUD_LAYER_FEATURE_IDENTITY, 'scene') === true;
350
+ const cloudScene = featureRasterWork
351
+ ? target(graph, 'cloud-layer-scene-color', {
352
+ format: scene.value.format,
353
+ size: internalSize,
354
+ sampleCount: 1,
355
+ domain: 'linear-hdr',
356
+ usage:
357
+ GPU_TEXTURE_USAGE_COPY_SRC |
358
+ GPU_TEXTURE_USAGE_RENDER_ATTACHMENT |
359
+ GPU_TEXTURE_USAGE_TEXTURE_BINDING,
360
+ })
361
+ : ok(undefined);
362
+ if (!cloudScene.ok) return cloudScene;
363
+ const cloudShadow =
364
+ featureRasterWork && context.cloudShadowResolution !== undefined
365
+ ? target(graph, 'cloud-layer-shadow', {
366
+ format: 'rgba16float',
367
+ size: {
368
+ width: context.cloudShadowResolution,
369
+ height: context.cloudShadowResolution,
370
+ depthOrArrayLayers: 1,
371
+ },
372
+ sampleCount: 1,
373
+ domain: 'linear-hdr',
374
+ usage:
375
+ GPU_TEXTURE_USAGE_COPY_SRC |
376
+ GPU_TEXTURE_USAGE_RENDER_ATTACHMENT |
377
+ GPU_TEXTURE_USAGE_TEXTURE_BINDING,
378
+ })
379
+ : ok(undefined);
380
+ if (!cloudShadow.ok) return cloudShadow;
381
+ const featureTargets = [
382
+ {
383
+ name: 'linear-hdr',
384
+ kind: 'scene-color',
385
+ texture: scene.value.texture,
386
+ view: scene.value.view,
387
+ format: scene.value.format,
388
+ sampleCount: 1,
389
+ },
390
+ {
391
+ kind: 'scene-depth',
392
+ texture: depth.value.texture,
393
+ view: depth.value.view,
394
+ format: depth.value.format,
395
+ sampleCount: 1,
396
+ },
397
+ ...(cloudShadow.value === undefined
398
+ ? []
399
+ : [
400
+ {
401
+ name: 'cloud-shadow',
402
+ kind: 'scene-color' as const,
403
+ texture: cloudShadow.value.texture,
404
+ view: cloudShadow.value.view,
405
+ format: cloudShadow.value.format,
406
+ sampleCount: 1 as const,
407
+ },
408
+ ]),
409
+ ...(context.cloudHistory === undefined
410
+ ? []
411
+ : renderPipelineCloudHistoryTargets(context.cloudHistory)),
412
+ ] as const;
413
+ // Cloud density and its spatial shadow must be produced before the opaque
414
+ // receiver pass. The composite is projected separately below, after the
415
+ // receiver has populated the scene target; declaration order is execution
416
+ // order for the typed graph.
417
+ const shadowFeatures = context.contributeFeatures(
418
+ featureTargets,
419
+ [],
420
+ cloudShadow.value === undefined ? {} : { 'cloud-shadow': cloudShadow.value },
421
+ [],
422
+ 'scene',
423
+ ['cloud-layer-density-cache', 'cloud-layer-shadow'],
424
+ );
425
+ if (!shadowFeatures.ok) return shadowFeatures;
426
+
304
427
  // The lighting lane is the deferred Standard receiver. It deliberately
305
428
  // selects Forward passes for the same material handles that wrote the
306
429
  // G-buffer. Membership must not select the Deferred program/entries: those
@@ -329,14 +452,18 @@ function buildStandardDeferredLane(
329
452
  ...(shadows.value.directional === undefined ? [] : [shadows.value.directional]),
330
453
  shadows.value.spot,
331
454
  ...(shadows.value.point === undefined ? [] : [shadows.value.point]),
455
+ ...(cloudShadow.value === undefined ? [] : [cloudShadow.value]),
332
456
  ...(ssao === undefined ? [] : [ssao]),
333
457
  ],
334
458
  ...(shadows.value.directional === undefined
335
459
  ? {}
336
460
  : { directionalShadow: shadows.value.directional }),
337
461
  spotShadow: shadows.value.spot,
462
+ cloudShadow: cloudShadow.value,
338
463
  ...(ssao === undefined ? {} : { ssao }),
339
464
  ...(gpuDriven.value === undefined ? {} : { gpuDriven: gpuDriven.value }),
465
+ ...(gpuDriven.value === undefined ? {} : { gpuDrivenFilter: 'deferred-opaque' as const }),
466
+ ...(topology.singleLayerMedium === true ? { recordMode: 'opaque' as const } : {}),
340
467
  passKind: 'forward',
341
468
  extraAccesses: buffers.value === null ? [] : standardClusterReadAccesses(buffers.value),
342
469
  });
@@ -359,7 +486,7 @@ function buildStandardDeferredLane(
359
486
  if (!coverage.ok) return coverage;
360
487
  }
361
488
 
362
- const sceneOutput: RenderPipelineTarget = scene.value;
489
+ let sceneOutput: RenderPipelineTarget = scene.value;
363
490
  let secondaryReactivity: GraphTextureView | undefined;
364
491
  if (topology.ssr !== undefined) {
365
492
  const ssrView =
@@ -420,10 +547,18 @@ function buildStandardDeferredLane(
420
547
  }
421
548
 
422
549
  const transmissionDemand = transmissionDemandForTopology(topology);
550
+ const backdropDemand = {
551
+ activeCount: transmissionDemand.activeCount + (topology.singleLayerMedium === true ? 1 : 0),
552
+ needsRoughMips: transmissionDemand.needsRoughMips,
553
+ };
423
554
  const transmissionActive = resolveTransmissionBackdropTopology({
424
555
  demand: transmissionDemand,
425
556
  sourceSampleCount: scene.value.sampleCount,
426
557
  }).active;
558
+ const backdropActive = resolveTransmissionBackdropTopology({
559
+ demand: backdropDemand,
560
+ sourceSampleCount: scene.value.sampleCount,
561
+ }).active;
427
562
  const forwardExtraAccesses: GraphAccess[] =
428
563
  buffers.value === null ? [] : [...standardClusterReadAccesses(buffers.value)];
429
564
 
@@ -442,35 +577,158 @@ function buildStandardDeferredLane(
442
577
  ...(shadows.value.directional === undefined ? [] : [shadows.value.directional]),
443
578
  shadows.value.spot,
444
579
  ...(shadows.value.point === undefined ? [] : [shadows.value.point]),
580
+ ...(cloudShadow.value === undefined ? [] : [cloudShadow.value]),
445
581
  ...(ssao === undefined ? [] : [ssao]),
446
582
  ],
447
583
  ...(shadows.value.directional === undefined
448
584
  ? {}
449
585
  : { directionalShadow: shadows.value.directional }),
450
586
  spotShadow: shadows.value.spot,
587
+ cloudShadow: cloudShadow.value,
451
588
  ...(ssao === undefined ? {} : { ssao }),
452
589
  ...(gpuDriven.value === undefined ? {} : { gpuDriven: gpuDriven.value }),
453
590
  passKind: 'forward',
454
591
  excludeSelector: { LightMode: ['Deferred'] },
455
- ...(transmissionActive ? { recordMode: 'opaque' as const } : {}),
592
+ // Keep the deferred opaque lane separate from Surface medium passes.
593
+ recordMode: 'opaque' as const,
594
+ ...(gpuDriven.value === undefined ? {} : { gpuDrivenFilter: 'forward-only-opaque' as const }),
456
595
  ...(context.occlusion === undefined ? {} : { occlusion: context.occlusion }),
457
596
  extraAccesses: forwardExtraAccesses,
458
597
  });
459
598
  if (!forward.ok) return forward;
460
599
 
600
+ if (cloudScene.value !== undefined) {
601
+ const compositeFeatures = context.contributeFeatures(
602
+ featureTargets,
603
+ [],
604
+ {
605
+ 'motion-input': scene.value,
606
+ 'motion-output': cloudScene.value,
607
+ ...(cloudShadow.value === undefined ? {} : { 'cloud-shadow': cloudShadow.value }),
608
+ ...(context.cloudHistory === undefined
609
+ ? {}
610
+ : {
611
+ 'cloud-history-radiance-current': context.cloudHistory.currentRadiance,
612
+ 'cloud-history-radiance-previous': context.cloudHistory.previousRadiance,
613
+ 'cloud-history-transmittance-current': context.cloudHistory.currentTransmittance,
614
+ 'cloud-history-transmittance-previous': context.cloudHistory.previousTransmittance,
615
+ 'cloud-history-depth-current': context.cloudHistory.currentDepth,
616
+ 'cloud-history-depth-previous': context.cloudHistory.previousDepth,
617
+ }),
618
+ },
619
+ forwardExtraAccesses,
620
+ 'scene',
621
+ // One half-resolution transport MRT produces radiance, transmittance and
622
+ // representative depth; the full-resolution resolve consumes that same
623
+ // frame and advances the ping-pong history on submit.
624
+ ['cloud-layer-transport', 'cloud-layer-resolve'],
625
+ );
626
+ if (!compositeFeatures.ok) return compositeFeatures;
627
+ }
628
+
629
+ if (cloudScene.value !== undefined) sceneOutput = cloudScene.value;
630
+
461
631
  const transmission = addTransmissionBackdropPasses({
462
632
  graph,
463
633
  source: sceneOutput,
464
- demand: transmissionDemand,
465
- copySize: { width: topology.surface.width, height: topology.surface.height },
634
+ demand: backdropDemand,
635
+ copySize: internalCopySize,
466
636
  encodeRoughMip: context.encodeTransmissionMip,
467
637
  includeConsumerPasses: false,
468
638
  });
469
639
  if (!transmission.ok) return transmission;
470
- if (transmission.value.topology.active) {
471
- const transmissionPass = addTypedScenePass(graph, {
640
+ if (topology.singleLayerMedium === true) {
641
+ const nearestTargets = mediumTargets.value;
642
+ const backdrop = transmission.value.backdrop?.view;
643
+ if (nearestTargets === undefined || backdrop === undefined) {
644
+ return err(
645
+ new RenderGraphError({
646
+ code: 'resource-descriptor-invalid',
647
+ expected: 'single-layer medium graph has nearest targets and an opaque backdrop',
648
+ hint: 'keep the shared transmission backdrop copy ahead of the Surface passes',
649
+ detail: {
650
+ resourceLabel: 'single-layer-medium',
651
+ field: 'backdrop',
652
+ expected: 'resolved graph texture view',
653
+ actual: 'missing',
654
+ },
655
+ }),
656
+ );
657
+ }
658
+ const rawDepth = addSingleLayerMediumRawDepthProducer({
659
+ graph,
660
+ sourceColor: sceneOutput,
661
+ sourceDepth: depth.value,
662
+ size: internalSize,
663
+ });
664
+ if (!rawDepth.ok) return rawDepth;
665
+ // Standard owns this producer fact. Deferred depth is single-sample, so
666
+ // the independent r32float copy is available to both medium passes.
667
+ const surfacePair: RenderPipelineSurfaceMediumPair = {
668
+ opaqueColor: backdrop,
669
+ rawDepth: { status: 'available', view: rawDepth.value.view },
670
+ };
671
+ const mediumPasses = addSingleLayerMediumPasses({
672
+ graph,
673
+ size: internalSize,
674
+ ...nearestTargets,
675
+ color: sceneOutput,
676
+ depth: depth.value,
677
+ sampled: [
678
+ gbuffer0.value,
679
+ gbuffer1.value,
680
+ gbuffer2.value,
681
+ ...(shadows.value.directional === undefined ? [] : [shadows.value.directional]),
682
+ shadows.value.spot,
683
+ ...(shadows.value.point === undefined ? [] : [shadows.value.point]),
684
+ ...(cloudShadow.value === undefined ? [] : [cloudShadow.value]),
685
+ ...(ssao === undefined ? [] : [ssao]),
686
+ ],
687
+ directionalShadow: shadows.value.directional,
688
+ spotShadow: shadows.value.spot,
689
+ cloudShadow: cloudShadow.value,
690
+ ssao,
691
+ extraAccesses: forwardExtraAccesses,
692
+ surfacePair,
693
+ ...(gpuDriven.value === undefined ? {} : { gpuDriven: gpuDriven.value }),
694
+ });
695
+ if (!mediumPasses.ok) return mediumPasses;
696
+ }
697
+ if (backdropActive) {
698
+ if (transmissionActive) {
699
+ const transmissionPass = addTypedScenePass(graph, {
700
+ environment: atmosphere.value,
701
+ name: 'transmission-forward',
702
+ color: sceneOutput,
703
+ depth: depth.value,
704
+ selector: { LightMode: ['Forward'] },
705
+ colorLoadOp: 'load',
706
+ depthLoadOp: 'load',
707
+ sampled: [
708
+ gbuffer0.value,
709
+ gbuffer1.value,
710
+ gbuffer2.value,
711
+ ...(shadows.value.directional === undefined ? [] : [shadows.value.directional]),
712
+ shadows.value.spot,
713
+ ...(shadows.value.point === undefined ? [] : [shadows.value.point]),
714
+ ...(ssao === undefined ? [] : [ssao]),
715
+ ],
716
+ directionalShadow: shadows.value.directional,
717
+ spotShadow: shadows.value.spot,
718
+ ...(ssao === undefined ? {} : { ssao }),
719
+ passKind: 'forward',
720
+ recordMode: 'transmission',
721
+ // Inject the complete backdrop view so the Standard shader can select
722
+ // the producer's optional roughness mip level. mipViews[0] is only the
723
+ // copy destination view and intentionally exposes one level.
724
+ transmissionBackdrop: transmission.value.backdrop?.view,
725
+ extraAccesses: forwardExtraAccesses,
726
+ });
727
+ if (!transmissionPass.ok) return transmissionPass;
728
+ }
729
+ const transparentPass = addTypedScenePass(graph, {
472
730
  environment: atmosphere.value,
473
- name: 'transmission-forward',
731
+ name: 'transparent',
474
732
  color: sceneOutput,
475
733
  depth: depth.value,
476
734
  selector: { LightMode: ['Forward'] },
@@ -483,21 +741,25 @@ function buildStandardDeferredLane(
483
741
  ...(shadows.value.directional === undefined ? [] : [shadows.value.directional]),
484
742
  shadows.value.spot,
485
743
  ...(shadows.value.point === undefined ? [] : [shadows.value.point]),
744
+ ...(cloudShadow.value === undefined ? [] : [cloudShadow.value]),
486
745
  ...(ssao === undefined ? [] : [ssao]),
487
746
  ],
488
747
  directionalShadow: shadows.value.directional,
489
748
  spotShadow: shadows.value.spot,
749
+ cloudShadow: cloudShadow.value,
490
750
  ...(ssao === undefined ? {} : { ssao }),
491
751
  passKind: 'forward',
492
- recordMode: 'transmission',
493
- // Inject the complete backdrop view so the Standard shader can select
494
- // the producer's optional roughness mip level. mipViews[0] is only the
495
- // copy destination view and intentionally exposes one level.
496
- transmissionBackdrop: transmission.value.backdrop?.view,
752
+ recordMode: 'transparent',
753
+ transparentDepthWrite: true,
497
754
  extraAccesses: forwardExtraAccesses,
498
755
  });
499
- if (!transmissionPass.ok) return transmissionPass;
500
-
756
+ if (!transparentPass.ok) return transparentPass;
757
+ }
758
+ if (backdropActive) {
759
+ const temporal = addTransmissionBackdropTemporalPass(graph, sceneOutput);
760
+ if (!temporal.ok) return temporal;
761
+ }
762
+ if (!transmission.value.topology.active) {
501
763
  const transparentPass = addTypedScenePass(graph, {
502
764
  environment: atmosphere.value,
503
765
  name: 'transparent',
@@ -513,18 +775,19 @@ function buildStandardDeferredLane(
513
775
  ...(shadows.value.directional === undefined ? [] : [shadows.value.directional]),
514
776
  shadows.value.spot,
515
777
  ...(shadows.value.point === undefined ? [] : [shadows.value.point]),
778
+ ...(cloudShadow.value === undefined ? [] : [cloudShadow.value]),
516
779
  ...(ssao === undefined ? [] : [ssao]),
517
780
  ],
518
781
  directionalShadow: shadows.value.directional,
519
782
  spotShadow: shadows.value.spot,
783
+ cloudShadow: cloudShadow.value,
520
784
  ...(ssao === undefined ? {} : { ssao }),
521
785
  passKind: 'forward',
522
786
  recordMode: 'transparent',
787
+ transparentDepthWrite: true,
523
788
  extraAccesses: forwardExtraAccesses,
524
789
  });
525
790
  if (!transparentPass.ok) return transparentPass;
526
- const temporal = addTransmissionBackdropTemporalPass(graph, sceneOutput);
527
- if (!temporal.ok) return temporal;
528
791
  }
529
792
  if (topology.volumetricFog?.enabled === true) {
530
793
  const depthSample = graph.view(depth.value.texture, {
@@ -541,11 +804,15 @@ function buildStandardDeferredLane(
541
804
  shadows.value.directional?.view,
542
805
  shadows.value.spot.view,
543
806
  buffers.value,
807
+ cloudShadow.value?.view,
544
808
  );
545
809
  if (!volume.ok) return volume;
546
810
  }
547
811
  // The volume-composite pass remains in linear HDR before tone mapping.
548
812
 
813
+ // Generic post features consume the final deferred scene target after cloud
814
+ // and volume producers. Keep the same clustered, shadow, and SSAO reads that
815
+ // the Standard receiver exposes to feature-owned lighting passes.
549
816
  const features = context.contributeFeatures(
550
817
  [
551
818
  {
@@ -561,18 +828,24 @@ function buildStandardDeferredLane(
561
828
  texture: depth.value.texture,
562
829
  view: depth.value.view,
563
830
  format: depth.value.format,
564
- sampleCount: 1,
831
+ sampleCount: depth.value.sampleCount,
565
832
  },
566
833
  ],
567
834
  [],
568
835
  {},
569
836
  [
570
837
  ...forwardExtraAccesses,
571
- ...[shadows.value.directional, shadows.value.spot, shadows.value.point].flatMap((target) =>
838
+ ...[
839
+ shadows.value.directional,
840
+ shadows.value.spot,
841
+ shadows.value.point,
842
+ cloudShadow.value,
843
+ ].flatMap((target) =>
572
844
  target === undefined ? [] : [{ resource: target.view, usage: 'sampled-read' as const }],
573
845
  ),
574
846
  ...(ssao === undefined ? [] : [{ resource: ssao.view, usage: 'sampled-read' as const }]),
575
847
  ],
848
+ { exclude: [BARREL_DISTORTION_FEATURE_IDENTITY] },
576
849
  );
577
850
  if (!features.ok) return features;
578
851
  const observation = addTypedFrameObservationPass(graph, sceneOutput, 'forgeax::standard');