@forgeax/engine-render 0.1.4 → 0.1.6

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 (918) hide show
  1. package/README.md +130 -641
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +2 -0
  4. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +1 -0
  5. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +2 -0
  6. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +1 -0
  7. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +2 -0
  8. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +1 -0
  9. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +1 -1
  10. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +6 -0
  11. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +1 -1
  12. package/dist/{gpu-driven/view-reference.d.ts → __tests__/gpu-driven-view-reference.d.ts} +4 -4
  13. package/dist/__tests__/gpu-driven-view-reference.d.ts.map +1 -0
  14. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +1 -1
  15. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +2 -0
  16. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +1 -0
  17. package/dist/__tests__/morph-feature-plan.unit.test.d.ts +2 -0
  18. package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +1 -0
  19. package/dist/__tests__/render-feature-plan.test-d.d.ts +2 -0
  20. package/dist/__tests__/render-feature-plan.test-d.d.ts.map +1 -0
  21. package/dist/__tests__/render-feature-plan.unit.test.d.ts +2 -0
  22. package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +1 -0
  23. package/dist/__tests__/ssao-config.unit.test.d.ts +2 -0
  24. package/dist/__tests__/ssao-config.unit.test.d.ts.map +1 -0
  25. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +2 -0
  26. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +1 -0
  27. package/dist/__tests__/standard-descriptors.test-d.d.ts +2 -0
  28. package/dist/__tests__/standard-descriptors.test-d.d.ts.map +1 -0
  29. package/dist/__tests__/standard-pipeline.dawn.test.d.ts +2 -0
  30. package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +1 -0
  31. package/dist/__tests__/standard-pipeline.integration.test.d.ts +2 -0
  32. package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +1 -0
  33. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +2 -0
  34. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +1 -0
  35. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +2 -0
  36. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +1 -0
  37. package/dist/{renderer/backend-selection.d.ts → assembly/backend-contract.d.ts} +15 -4
  38. package/dist/assembly/backend-contract.d.ts.map +1 -0
  39. package/dist/assembly/factory.d.ts +207 -0
  40. package/dist/assembly/factory.d.ts.map +1 -0
  41. package/dist/assembly/host-contract.d.ts +84 -0
  42. package/dist/assembly/host-contract.d.ts.map +1 -0
  43. package/dist/{renderer → assembly}/material/assembly.d.ts +0 -1
  44. package/dist/{renderer → assembly}/material/assembly.d.ts.map +1 -1
  45. package/dist/assembly/material/pipeline-projection.d.ts +30 -0
  46. package/dist/assembly/material/pipeline-projection.d.ts.map +1 -0
  47. package/dist/authoring.d.ts +10 -11
  48. package/dist/authoring.d.ts.map +1 -1
  49. package/dist/authoring.mjs +25 -3
  50. package/dist/authoring.mjs.map +1 -1
  51. package/dist/chunk-CQXZC5XI.mjs +182 -0
  52. package/dist/chunk-CQXZC5XI.mjs.map +1 -0
  53. package/dist/chunk-QC4VW3XJ.mjs +79 -0
  54. package/dist/chunk-QC4VW3XJ.mjs.map +1 -0
  55. package/dist/chunk-SCRSAK5B.mjs +480 -0
  56. package/dist/chunk-SCRSAK5B.mjs.map +1 -0
  57. package/dist/components/__tests__/schema-contract.unit.test.d.ts +2 -0
  58. package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +1 -0
  59. package/dist/components/glyph-text.d.ts +1 -1
  60. package/dist/components/glyph-text.d.ts.map +1 -1
  61. package/dist/components/index.d.ts +2 -2
  62. package/dist/components/index.d.ts.map +1 -1
  63. package/dist/components/instances.d.ts +1 -1
  64. package/dist/components/instances.d.ts.map +1 -1
  65. package/dist/components/light-helpers.d.ts +1 -1
  66. package/dist/components/light-helpers.d.ts.map +1 -1
  67. package/dist/components/mesh-filter.d.ts +7 -7
  68. package/dist/components/mesh-filter.d.ts.map +1 -1
  69. package/dist/components/scene-instance.d.ts +11 -11
  70. package/dist/components/skybox-background.d.ts +56 -0
  71. package/dist/components/skybox-background.d.ts.map +1 -0
  72. package/dist/components/skylight.d.ts +55 -0
  73. package/dist/components/skylight.d.ts.map +1 -0
  74. package/dist/components/sprite-animation.d.ts +2 -3
  75. package/dist/components/sprite-animation.d.ts.map +1 -1
  76. package/dist/components/sprite-instances.d.ts +1 -1
  77. package/dist/components/sprite-playback-mode.d.ts +6 -1
  78. package/dist/components/sprite-playback-mode.d.ts.map +1 -1
  79. package/dist/components/sprite-region-override.d.ts +2 -3
  80. package/dist/components/sprite-region-override.d.ts.map +1 -1
  81. package/dist/components/tile-layer.d.ts +5 -0
  82. package/dist/components/tile-layer.d.ts.map +1 -1
  83. package/dist/construct-renderer.d.ts +18 -1
  84. package/dist/construct-renderer.d.ts.map +1 -1
  85. package/dist/construct-renderer.mjs +27008 -4
  86. package/dist/construct-renderer.mjs.map +1 -1
  87. package/dist/debug-draw-glue.d.ts +2 -53
  88. package/dist/debug-draw-glue.d.ts.map +1 -1
  89. package/dist/device/device-scope.d.ts +83 -0
  90. package/dist/device/device-scope.d.ts.map +1 -0
  91. package/dist/{gpu-resource-store.d.ts → device/gpu-residency.d.ts} +91 -48
  92. package/dist/device/gpu-residency.d.ts.map +1 -0
  93. package/dist/device/resource-types.d.ts +8 -0
  94. package/dist/device/resource-types.d.ts.map +1 -0
  95. package/dist/engine-metrics.d.ts +2 -2
  96. package/dist/engine-metrics.d.ts.map +1 -1
  97. package/dist/errors/recover.d.ts +28 -1
  98. package/dist/errors/recover.d.ts.map +1 -1
  99. package/dist/errors/render.d.ts +249 -258
  100. package/dist/errors/render.d.ts.map +1 -1
  101. package/dist/features/fullscreen.d.ts +19 -0
  102. package/dist/features/fullscreen.d.ts.map +1 -0
  103. package/dist/features/host.d.ts +32 -26
  104. package/dist/features/host.d.ts.map +1 -1
  105. package/dist/features/morph/morph-feature.d.ts +39 -5
  106. package/dist/features/morph/morph-feature.d.ts.map +1 -1
  107. package/dist/features/plan.d.ts +182 -0
  108. package/dist/features/plan.d.ts.map +1 -0
  109. package/dist/features/prepared-gpu-work.d.ts +21 -17
  110. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  111. package/dist/features/prepared-graphics-store.d.ts +2 -1
  112. package/dist/features/prepared-graphics-store.d.ts.map +1 -1
  113. package/dist/features/prepared-graphics.d.ts +11 -21
  114. package/dist/features/prepared-graphics.d.ts.map +1 -1
  115. package/dist/features/render-graph-compute.d.ts +2 -2
  116. package/dist/features/render-graph-compute.d.ts.map +1 -1
  117. package/dist/features/render-graph-contribution.d.ts +4 -7
  118. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  119. package/dist/features/render-graph-raster.d.ts +2 -2
  120. package/dist/features/render-graph-raster.d.ts.map +1 -1
  121. package/dist/features/render-graph-resources.d.ts +6 -6
  122. package/dist/features/render-graph-resources.d.ts.map +1 -1
  123. package/dist/features/targets.d.ts +5 -5
  124. package/dist/features/targets.d.ts.map +1 -1
  125. package/dist/features/types.d.ts +11 -190
  126. package/dist/features/types.d.ts.map +1 -1
  127. package/dist/features/vocabulary.d.ts +14 -0
  128. package/dist/features/vocabulary.d.ts.map +1 -0
  129. package/dist/fullscreen-post-process-pass.d.ts +4 -25
  130. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  131. package/dist/glyph-text-layout-system.d.ts +3 -2
  132. package/dist/glyph-text-layout-system.d.ts.map +1 -1
  133. package/dist/gpu-driven/batch-topology.d.ts +6 -75
  134. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  135. package/dist/gpu-driven/production-raster.d.ts +13 -112
  136. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  137. package/dist/gpu-driven/view-gpu.d.ts +10 -66
  138. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  139. package/dist/gpu-resource.d.ts +3 -3
  140. package/dist/gpu-scene-schema.d.ts +1 -94
  141. package/dist/gpu-scene-schema.d.ts.map +1 -1
  142. package/dist/gpu-scene.d.ts +7 -33
  143. package/dist/gpu-scene.d.ts.map +1 -1
  144. package/dist/hdrp-buffers.d.ts +3 -53
  145. package/dist/hdrp-buffers.d.ts.map +1 -1
  146. package/dist/ibl/IblPipelineCache.d.ts +74 -180
  147. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  148. package/dist/ibl/skylight-bind-group.d.ts +1 -1
  149. package/dist/index.d.ts +13 -43
  150. package/dist/index.d.ts.map +1 -1
  151. package/dist/index.mjs +165 -3
  152. package/dist/index.mjs.map +1 -1
  153. package/dist/inspection-types.d.ts +69 -0
  154. package/dist/inspection-types.d.ts.map +1 -0
  155. package/dist/instance-buffer-cache.d.ts +1 -4
  156. package/dist/instance-buffer-cache.d.ts.map +1 -1
  157. package/dist/internal.d.ts +1 -73
  158. package/dist/internal.d.ts.map +1 -1
  159. package/dist/internal.mjs +1 -43
  160. package/dist/internal.mjs.map +1 -1
  161. package/dist/lifecycle.d.ts +36 -2
  162. package/dist/lifecycle.d.ts.map +1 -1
  163. package/dist/materials.d.ts +0 -3
  164. package/dist/materials.d.ts.map +1 -1
  165. package/dist/mesh-material-bindings.d.ts +0 -1
  166. package/dist/mesh-material-bindings.d.ts.map +1 -1
  167. package/dist/pbr-pipeline.d.ts +75 -29
  168. package/dist/pbr-pipeline.d.ts.map +1 -1
  169. package/dist/pipeline/standard-forward-lane.d.ts +5 -0
  170. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -0
  171. package/dist/pipeline/standard-pipeline.d.ts +31 -0
  172. package/dist/pipeline/standard-pipeline.d.ts.map +1 -0
  173. package/dist/pipeline/standard-profile.d.ts +40 -0
  174. package/dist/pipeline/standard-profile.d.ts.map +1 -0
  175. package/dist/pipeline-builder.d.ts +3 -3
  176. package/dist/pipeline-builder.d.ts.map +1 -1
  177. package/dist/pipeline-spec-types.d.ts +24 -0
  178. package/dist/pipeline-spec-types.d.ts.map +1 -0
  179. package/dist/pipeline-spec.d.ts +16 -155
  180. package/dist/pipeline-spec.d.ts.map +1 -1
  181. package/dist/plugin.d.ts +1 -14
  182. package/dist/plugin.d.ts.map +1 -1
  183. package/dist/post-process-errors.d.ts +18 -18
  184. package/dist/post-process-errors.d.ts.map +1 -1
  185. package/dist/prepare/prepared-graphics-resolver.d.ts +2 -5
  186. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  187. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +2 -0
  188. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +1 -0
  189. package/dist/record/frame-lighting.d.ts +7 -73
  190. package/dist/record/frame-lighting.d.ts.map +1 -1
  191. package/dist/record/frame-snapshot.d.ts +44 -44
  192. package/dist/record/frame-snapshot.d.ts.map +1 -1
  193. package/dist/record/frame-targets.d.ts +5 -38
  194. package/dist/record/frame-targets.d.ts.map +1 -1
  195. package/dist/record/frame.d.ts +64 -52
  196. package/dist/record/frame.d.ts.map +1 -1
  197. package/dist/record/helpers.d.ts +3 -2
  198. package/dist/record/helpers.d.ts.map +1 -1
  199. package/dist/record/main-pass-geometry.d.ts +5 -4
  200. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  201. package/dist/record/main-pass-material.d.ts +90 -59
  202. package/dist/record/main-pass-material.d.ts.map +1 -1
  203. package/dist/record/main-pass-sprite-draws.d.ts +28 -3
  204. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  205. package/dist/record/main-pass.d.ts +1 -1
  206. package/dist/record/main-pass.d.ts.map +1 -1
  207. package/dist/record/mesh-ssbo.d.ts +276 -3
  208. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  209. package/dist/record/render-context.d.ts +235 -0
  210. package/dist/record/render-context.d.ts.map +1 -0
  211. package/dist/record/shadow-pass.d.ts +15 -88
  212. package/dist/record/shadow-pass.d.ts.map +1 -1
  213. package/dist/record/skybox-post-pass.d.ts +1 -1
  214. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  215. package/dist/record/typed-frame-graph.d.ts +29 -7
  216. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  217. package/dist/record/view-ubo.d.ts +3 -3
  218. package/dist/record/view-ubo.d.ts.map +1 -1
  219. package/dist/render-contract.d.ts +416 -0
  220. package/dist/render-contract.d.ts.map +1 -0
  221. package/dist/render-data.d.ts.map +1 -1
  222. package/dist/render-graph-primitives.d.ts +14 -362
  223. package/dist/render-graph-primitives.d.ts.map +1 -1
  224. package/dist/render-pipeline.d.ts +25 -64
  225. package/dist/render-pipeline.d.ts.map +1 -1
  226. package/dist/render-system-extract.d.ts +107 -338
  227. package/dist/render-system-extract.d.ts.map +1 -1
  228. package/dist/render-system.d.ts +21 -713
  229. package/dist/render-system.d.ts.map +1 -1
  230. package/dist/scene/render-scene-types.d.ts +58 -0
  231. package/dist/scene/render-scene-types.d.ts.map +1 -0
  232. package/dist/scene/render-scene.d.ts +105 -0
  233. package/dist/scene/render-scene.d.ts.map +1 -0
  234. package/dist/scene-instances/post-spawn-resolve-joints.d.ts +2 -5
  235. package/dist/scene-instances/post-spawn-resolve-joints.d.ts.map +1 -1
  236. package/dist/ssao-buffers.d.ts +22 -3
  237. package/dist/ssao-buffers.d.ts.map +1 -1
  238. package/dist/systems/skin-palette-allocator.d.ts +2 -4
  239. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  240. package/dist/systems/skin-palette-types.d.ts +14 -0
  241. package/dist/systems/skin-palette-types.d.ts.map +1 -0
  242. package/dist/systems/transparent-sort-config.d.ts +23 -2
  243. package/dist/systems/transparent-sort-config.d.ts.map +1 -1
  244. package/dist/tilemap-chunk-extract-system.d.ts +4 -3
  245. package/dist/tilemap-chunk-extract-system.d.ts.map +1 -1
  246. package/dist/typed-render-graph-primitives.d.ts +2 -4
  247. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  248. package/dist/typed-shadow-passes.d.ts +3 -3
  249. package/dist/typed-shadow-passes.d.ts.map +1 -1
  250. package/package.json +23 -23
  251. package/src/__tests__/backend-selection-rhi-capture.test-d.ts +1 -1
  252. package/src/__tests__/callback-inference.test-d.ts +6 -3
  253. package/src/__tests__/cluster-grid-default-surface.unit.test.ts +7 -4
  254. package/src/__tests__/construct-renderer-identity.unit.test.ts +15 -2
  255. package/src/__tests__/device-scope-lifecycle.unit.test.ts +151 -0
  256. package/src/__tests__/device-scope-stale-matrix.unit.test.ts +42 -0
  257. package/src/__tests__/direct-extract-consumer-contract.test-d.ts +8 -19
  258. package/src/__tests__/direct-light-snapshot.unit.test.ts +3 -13
  259. package/src/__tests__/factory-contract.integration.test.ts +158 -209
  260. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +1 -4
  261. package/src/__tests__/frame-observation.contract.test.ts +17 -8
  262. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +32 -0
  263. package/src/__tests__/glyph-text-layout-recovery.unit.test.ts +6 -11
  264. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +9 -16
  265. package/src/__tests__/gpu-driven-production.integration.test.ts +32 -205
  266. package/src/__tests__/gpu-driven-scaling.unit.test.ts +4 -7
  267. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +87 -8
  268. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +170 -8
  269. package/src/{gpu-driven/view-reference.ts → __tests__/gpu-driven-view-reference.ts} +4 -3
  270. package/src/__tests__/gpu-driven-view.browser.test.ts +12 -1
  271. package/src/__tests__/gpu-driven-view.dawn.test.ts +12 -1
  272. package/src/__tests__/gpu-driven-view.unit.test.ts +11 -267
  273. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +3 -3
  274. package/src/__tests__/gpu-scene-render-graph-gpu.ts +2 -3
  275. package/src/__tests__/gpu-scene.dawn.test.ts +2 -6
  276. package/src/__tests__/gpu-scene.unit.test.ts +10 -24
  277. package/src/__tests__/ibl/face-uniforms.unit.test.ts +46 -0
  278. package/src/__tests__/infinite-grid-no-vertex-probe.unit.test.ts +34 -66
  279. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +14 -5
  280. package/src/__tests__/light-buffer-layout.unit.test.ts +4 -49
  281. package/src/__tests__/material-cooked-projection.unit.test.ts +2 -51
  282. package/src/__tests__/material-snapshot-mutation.integration.test.ts +10 -15
  283. package/src/__tests__/material-static-dynamic-route.unit.test.ts +4 -23
  284. package/src/__tests__/material-stride-surface.unit.test.ts +2 -2
  285. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +7 -8
  286. package/src/__tests__/morph-culling-reentry.dawn.test.ts +29 -38
  287. package/src/__tests__/morph-feature-gpu-work.integration.test.ts +45 -43
  288. package/src/__tests__/morph-feature-plan.unit.test.ts +53 -0
  289. package/src/__tests__/morph-visual-evidence.integration.test.ts +47 -33
  290. package/src/__tests__/nineslice-handle-surface.unit.test.ts +11 -6
  291. package/src/__tests__/post-process-error-policy-owner.unit.test.ts +6 -13
  292. package/src/__tests__/prepared-graphics-capability.unit.test.ts +6 -81
  293. package/src/__tests__/prepared-graphics-generation.unit.test.ts +3 -17
  294. package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +6 -74
  295. package/src/__tests__/prepared-graphics-resolver.unit.test.ts +1 -3
  296. package/src/__tests__/prepared-graphics-snapshot.unit.test.ts +2 -2
  297. package/src/__tests__/profiler-default-off.test.ts +1 -1
  298. package/src/__tests__/profiler-phase-catalog.test.ts +2 -2
  299. package/src/__tests__/profiler-phase-integration.test.ts +5 -13
  300. package/src/__tests__/profiler-phase-token.test.ts +3 -8
  301. package/src/__tests__/public-surface.test-d.ts +65 -3
  302. package/src/__tests__/recover-error-policy-owner.unit.test.ts +1 -21
  303. package/src/__tests__/render-error-code-owner.test-d.ts +18 -23
  304. package/src/__tests__/render-error-detail-ssot.test-d.ts +0 -95
  305. package/src/__tests__/render-error-exhaustive.test-d.ts +8 -1
  306. package/src/__tests__/render-feature-assembly.test-d.ts +8 -16
  307. package/src/__tests__/render-feature-context.test-d.ts +16 -40
  308. package/src/__tests__/render-feature-contract.test-d.ts +9 -18
  309. package/src/__tests__/render-feature-diagnostics.unit.test.ts +6 -8
  310. package/src/__tests__/render-feature-docs.unit.test.ts +8 -7
  311. package/src/__tests__/render-feature-gpu-work.integration.test.ts +14 -75
  312. package/src/__tests__/render-feature-plan.test-d.ts +161 -0
  313. package/src/__tests__/render-feature-plan.unit.test.ts +170 -0
  314. package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +8 -19
  315. package/src/__tests__/render-feature-prepared-errors.test-d.ts +3 -6
  316. package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +10 -71
  317. package/src/__tests__/render-feature-prepared-graphics-isolation.unit.test.ts +11 -61
  318. package/src/__tests__/render-feature-prepared-graphics-negative.test-d.ts +20 -43
  319. package/src/__tests__/render-feature-prepared-graphics.test-d.ts +56 -78
  320. package/src/__tests__/render-feature-public-surface.test-d.ts +6 -24
  321. package/src/__tests__/render-feature-retry.unit.test.ts +7 -48
  322. package/src/__tests__/render-feature-scheduling.unit.test.ts +15 -27
  323. package/src/__tests__/render-feature-stage-failed-policy-owner.unit.test.ts +0 -9
  324. package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +19 -109
  325. package/src/__tests__/render-feature-visibility-context.test-d.ts +1 -6
  326. package/src/__tests__/render-feature-visibility-context.unit.test.ts +1 -2
  327. package/src/__tests__/render-feature-zero-work.unit.test.ts +14 -20
  328. package/src/__tests__/render-scene-projection.unit.test.ts +73 -111
  329. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +44 -95
  330. package/src/__tests__/renderer-lifecycle.integration.test.ts +49 -1
  331. package/src/__tests__/shader-stage-surface.unit.test.ts +14 -9
  332. package/src/__tests__/ssao-config.unit.test.ts +36 -0
  333. package/src/__tests__/ssao-kernel-surface.unit.test.ts +4 -5
  334. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +28 -0
  335. package/src/__tests__/standard-descriptors.test-d.ts +22 -0
  336. package/src/__tests__/standard-pipeline.dawn.test.ts +61 -0
  337. package/src/__tests__/standard-pipeline.integration.test.ts +124 -0
  338. package/src/__tests__/standard-profile-oracle.unit.test.ts +62 -0
  339. package/src/__tests__/surface-configuration.unit.test.ts +1 -2
  340. package/src/__tests__/texture-usage-surface.unit.test.ts +3 -6
  341. package/src/__tests__/typed-pipeline-topology.unit.test.ts +40 -206
  342. package/src/__tests__/urp-pipeline-targets.unit.test.ts +1 -11
  343. package/src/__tests__/urp-pipeline.unit.test.ts +2 -2
  344. package/src/__tests__/vertex-color-pipeline.unit.test.ts +10 -2
  345. package/src/__tests__/vertex-layout-consumer.unit.test.ts +1 -1
  346. package/src/__tests__/visibility-diagnostics.integration.test.ts +7 -11
  347. package/src/__tests__/visibility-extract.integration.test.ts +20 -11
  348. package/src/__tests__/visibility-extract.perf.test.ts +66 -32
  349. package/src/__tests__/visibility-feature-dedup.integration.test.ts +2 -4
  350. package/src/__tests__/visibility-hidden-report.unit.test.ts +1 -2
  351. package/src/__tests__/visibility-instances.integration.test.ts +7 -11
  352. package/src/__tests__/visibility-multi-world.integration.test.ts +38 -6
  353. package/src/__tests__/visibility-producer-matrix.integration.test.ts +18 -41
  354. package/src/__tests__/visibility-public-surface.test-d.ts +10 -9
  355. package/src/__tests__/visibility-resolver.unit.test.ts +2 -1
  356. package/src/__tests__/visibility-resource-short-circuit.unit.test.ts +80 -0
  357. package/src/__tests__/visibility-snapshot-contract.unit.test.ts +2 -1
  358. package/src/__tests__/vocabulary.unit.test.ts +1 -1
  359. package/src/assembly/backend-contract.ts +57 -0
  360. package/src/{renderer/renderer-factory.ts → assembly/factory.ts} +1663 -2690
  361. package/src/assembly/host-contract.ts +101 -0
  362. package/src/{renderer → assembly}/material/assembly.ts +0 -2
  363. package/src/assembly/material/pipeline-projection.ts +63 -0
  364. package/src/authoring.ts +14 -22
  365. package/src/components/__tests__/schema-contract.unit.test.ts +10 -0
  366. package/src/components/glyph-text.ts +3 -2
  367. package/src/components/index.ts +7 -9
  368. package/src/components/instances.ts +4 -5
  369. package/src/components/light-helpers.ts +1 -1
  370. package/src/components/mesh-filter.ts +11 -10
  371. package/src/components/post-process-params.ts +3 -3
  372. package/src/components/scene-instance.ts +12 -12
  373. package/src/components/skybox-background.ts +103 -0
  374. package/src/components/{environment.ts → skylight.ts} +2 -110
  375. package/src/components/sprite-animation.ts +3 -4
  376. package/src/components/sprite-instances.ts +2 -2
  377. package/src/components/sprite-playback-mode.ts +7 -1
  378. package/src/components/sprite-region-override.ts +2 -3
  379. package/src/components/tile-layer.ts +8 -2
  380. package/src/construct-renderer.ts +67 -4
  381. package/src/debug-draw-glue.ts +8 -129
  382. package/src/device/device-scope.ts +306 -0
  383. package/src/{gpu-resource-store.ts → device/gpu-residency.ts} +540 -639
  384. package/src/device/resource-types.ts +20 -0
  385. package/src/engine-metrics.ts +12 -19
  386. package/src/errors/recover.ts +45 -3
  387. package/src/errors/render.ts +357 -460
  388. package/src/features/fullscreen.ts +46 -0
  389. package/src/features/host.ts +575 -309
  390. package/src/features/morph/morph-feature.ts +195 -105
  391. package/src/features/plan.ts +447 -0
  392. package/src/features/prepared-gpu-work.ts +72 -15
  393. package/src/features/prepared-graphics-store.ts +20 -6
  394. package/src/features/prepared-graphics.ts +12 -71
  395. package/src/features/render-graph-compute.ts +14 -5
  396. package/src/features/render-graph-contribution.ts +43 -63
  397. package/src/features/render-graph-raster.ts +11 -6
  398. package/src/features/render-graph-resources.ts +25 -23
  399. package/src/features/targets.ts +8 -21
  400. package/src/features/types.ts +39 -227
  401. package/src/features/vocabulary.ts +24 -0
  402. package/src/fullscreen-post-process-pass.ts +14 -57
  403. package/src/glyph-text-layout-system.ts +70 -96
  404. package/src/gpu-driven/batch-topology.ts +24 -202
  405. package/src/gpu-driven/production-raster.ts +93 -1108
  406. package/src/gpu-driven/view-gpu.ts +46 -192
  407. package/src/gpu-resource.ts +4 -4
  408. package/src/gpu-scene-schema.ts +11 -99
  409. package/src/gpu-scene.ts +231 -364
  410. package/src/hdrp-buffers.ts +12 -221
  411. package/src/ibl/IblPipelineCache.ts +471 -711
  412. package/src/ibl/skylight-bind-group.ts +4 -4
  413. package/src/index.ts +58 -217
  414. package/src/inspection-types.ts +76 -0
  415. package/src/instance-buffer-cache.ts +1 -29
  416. package/src/internal.ts +6 -85
  417. package/src/lifecycle.ts +64 -19
  418. package/src/materials.ts +7 -29
  419. package/src/mesh-material-bindings.ts +0 -1
  420. package/src/pbr-pipeline.ts +434 -53
  421. package/src/{urp-pipeline.ts → pipeline/standard-forward-lane.ts} +38 -149
  422. package/src/{hdrp-pipeline.ts → pipeline/standard-pipeline.ts} +221 -191
  423. package/src/pipeline/standard-profile.ts +65 -0
  424. package/src/pipeline-builder.ts +60 -64
  425. package/src/pipeline-spec-types.ts +28 -0
  426. package/src/pipeline-spec.ts +72 -609
  427. package/src/plugin.ts +3 -75
  428. package/src/post-process-errors.ts +31 -33
  429. package/src/prepare/prepared-graphics-resolver.ts +5 -4
  430. package/src/record/__tests__/material-slot-plan.unit.test.ts +1 -33
  431. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +41 -0
  432. package/src/record/__tests__/video-texture-view.unit.test.ts +1 -1
  433. package/src/record/frame-lighting.ts +74 -195
  434. package/src/record/frame-snapshot.ts +45 -60
  435. package/src/record/frame-targets.ts +8 -243
  436. package/src/record/frame.ts +509 -796
  437. package/src/record/helpers.ts +6 -11
  438. package/src/record/main-pass-geometry.ts +106 -147
  439. package/src/record/main-pass-material.ts +517 -190
  440. package/src/record/main-pass-sprite-draws.ts +198 -117
  441. package/src/record/main-pass.ts +162 -143
  442. package/src/record/mesh-ssbo.ts +517 -38
  443. package/src/record/render-context.ts +364 -0
  444. package/src/record/shadow-pass.ts +138 -1838
  445. package/src/record/skybox-post-pass.ts +12 -14
  446. package/src/record/typed-frame-graph.ts +215 -254
  447. package/src/record/view-ubo.ts +6 -37
  448. package/src/render-contract.ts +571 -0
  449. package/src/render-data.ts +3 -3
  450. package/src/render-graph-primitives.ts +76 -851
  451. package/src/render-pipeline.ts +104 -188
  452. package/src/render-system-extract.ts +1048 -1729
  453. package/src/render-system.ts +330 -1957
  454. package/src/scene/render-scene-types.ts +64 -0
  455. package/src/scene/render-scene.ts +1032 -0
  456. package/src/scene-instances/post-spawn-resolve-joints.ts +4 -7
  457. package/src/ssao-buffers.ts +167 -8
  458. package/src/systems/skin-palette-allocator.ts +21 -64
  459. package/src/systems/skin-palette-types.ts +14 -0
  460. package/src/systems/transparent-sort-config.ts +25 -3
  461. package/src/tilemap-chunk-extract-system.ts +53 -70
  462. package/src/typed-render-graph-primitives.ts +35 -24
  463. package/src/typed-shadow-passes.ts +26 -56
  464. package/dist/__tests__/analytic-sky-contract.test.d.ts +0 -2
  465. package/dist/__tests__/analytic-sky-contract.test.d.ts.map +0 -1
  466. package/dist/__tests__/analytic-sky-falsify.test.d.ts +0 -2
  467. package/dist/__tests__/analytic-sky-falsify.test.d.ts.map +0 -1
  468. package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts +0 -2
  469. package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts.map +0 -1
  470. package/dist/__tests__/backend-selection.integration.test.d.ts +0 -2
  471. package/dist/__tests__/backend-selection.integration.test.d.ts.map +0 -1
  472. package/dist/__tests__/camera-temporal.test-d.d.ts +0 -2
  473. package/dist/__tests__/camera-temporal.test-d.d.ts.map +0 -1
  474. package/dist/__tests__/camera-temporal.test.d.ts +0 -2
  475. package/dist/__tests__/camera-temporal.test.d.ts.map +0 -1
  476. package/dist/__tests__/directional-shadow-probe-atlas-layout.unit.test.d.ts +0 -2
  477. package/dist/__tests__/directional-shadow-probe-atlas-layout.unit.test.d.ts.map +0 -1
  478. package/dist/__tests__/environment-inspection.test.d.ts +0 -2
  479. package/dist/__tests__/environment-inspection.test.d.ts.map +0 -1
  480. package/dist/__tests__/fog-ai-user.fixture.d.ts +0 -2
  481. package/dist/__tests__/fog-ai-user.fixture.d.ts.map +0 -1
  482. package/dist/__tests__/fog-custom-render-feature.fixture.d.ts +0 -16
  483. package/dist/__tests__/fog-custom-render-feature.fixture.d.ts.map +0 -1
  484. package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts +0 -2
  485. package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts.map +0 -1
  486. package/dist/__tests__/fog-inspection.integration.test.d.ts +0 -2
  487. package/dist/__tests__/fog-inspection.integration.test.d.ts.map +0 -1
  488. package/dist/__tests__/fog-owner-state.integration.test.d.ts +0 -2
  489. package/dist/__tests__/fog-owner-state.integration.test.d.ts.map +0 -1
  490. package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts +0 -2
  491. package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts.map +0 -1
  492. package/dist/__tests__/fog-public-surface.integration.test.d.ts +0 -2
  493. package/dist/__tests__/fog-public-surface.integration.test.d.ts.map +0 -1
  494. package/dist/__tests__/fog-ray-contract.integration.test.d.ts +0 -2
  495. package/dist/__tests__/fog-ray-contract.integration.test.d.ts.map +0 -1
  496. package/dist/__tests__/fog-source-absence.integration.test.d.ts +0 -2
  497. package/dist/__tests__/fog-source-absence.integration.test.d.ts.map +0 -1
  498. package/dist/__tests__/fog-temporal.integration.test.d.ts +0 -2
  499. package/dist/__tests__/fog-temporal.integration.test.d.ts.map +0 -1
  500. package/dist/__tests__/frame-chain.unit.test.d.ts +0 -2
  501. package/dist/__tests__/frame-chain.unit.test.d.ts.map +0 -1
  502. package/dist/__tests__/gpu-scene-field-type-owner.test-d.d.ts +0 -2
  503. package/dist/__tests__/gpu-scene-field-type-owner.test-d.d.ts.map +0 -1
  504. package/dist/__tests__/hdrp-pipeline.unit.test.d.ts +0 -2
  505. package/dist/__tests__/hdrp-pipeline.unit.test.d.ts.map +0 -1
  506. package/dist/__tests__/ibl/ibl-fallback.unit.test.d.ts +0 -2
  507. package/dist/__tests__/ibl/ibl-fallback.unit.test.d.ts.map +0 -1
  508. package/dist/__tests__/material-derived-error-stop-draw.integration.test.d.ts +0 -2
  509. package/dist/__tests__/material-derived-error-stop-draw.integration.test.d.ts.map +0 -1
  510. package/dist/__tests__/material-derived-payload.integration.test.d.ts +0 -2
  511. package/dist/__tests__/material-derived-payload.integration.test.d.ts.map +0 -1
  512. package/dist/__tests__/materials.unit.test.d.ts +0 -2
  513. package/dist/__tests__/materials.unit.test.d.ts.map +0 -1
  514. package/dist/__tests__/param-schema-projection-census.unit.test.d.ts +0 -2
  515. package/dist/__tests__/param-schema-projection-census.unit.test.d.ts.map +0 -1
  516. package/dist/__tests__/persistent-render-scene.unit.test.d.ts +0 -2
  517. package/dist/__tests__/persistent-render-scene.unit.test.d.ts.map +0 -1
  518. package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts +0 -2
  519. package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts.map +0 -1
  520. package/dist/__tests__/pipeline-pass-trace.test.d.ts +0 -2
  521. package/dist/__tests__/pipeline-pass-trace.test.d.ts.map +0 -1
  522. package/dist/__tests__/pipeline-stage-owner.test-d.d.ts +0 -2
  523. package/dist/__tests__/pipeline-stage-owner.test-d.d.ts.map +0 -1
  524. package/dist/__tests__/plugin.test.d.ts +0 -2
  525. package/dist/__tests__/plugin.test.d.ts.map +0 -1
  526. package/dist/__tests__/prepared-graphics-backend-matrix.unit.test.d.ts +0 -2
  527. package/dist/__tests__/prepared-graphics-backend-matrix.unit.test.d.ts.map +0 -1
  528. package/dist/__tests__/prepared-graphics-resolver-recording.unit.test.d.ts +0 -2
  529. package/dist/__tests__/prepared-graphics-resolver-recording.unit.test.d.ts.map +0 -1
  530. package/dist/__tests__/public-pipeline-id.test-d.d.ts +0 -2
  531. package/dist/__tests__/public-pipeline-id.test-d.d.ts.map +0 -1
  532. package/dist/__tests__/render-dispatch-membership.unit.test.d.ts +0 -2
  533. package/dist/__tests__/render-dispatch-membership.unit.test.d.ts.map +0 -1
  534. package/dist/__tests__/render-feature-construction.unit.test.d.ts +0 -2
  535. package/dist/__tests__/render-feature-construction.unit.test.d.ts.map +0 -1
  536. package/dist/__tests__/render-feature-error-code-owner.test-d.d.ts +0 -2
  537. package/dist/__tests__/render-feature-error-code-owner.test-d.d.ts.map +0 -1
  538. package/dist/__tests__/render-feature-gpu-buffer-usage-owner.test-d.d.ts +0 -2
  539. package/dist/__tests__/render-feature-gpu-buffer-usage-owner.test-d.d.ts.map +0 -1
  540. package/dist/__tests__/render-feature-graph.integration.test.d.ts +0 -2
  541. package/dist/__tests__/render-feature-graph.integration.test.d.ts.map +0 -1
  542. package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts +0 -2
  543. package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts.map +0 -1
  544. package/dist/__tests__/render-feature-order.unit.test.d.ts +0 -2
  545. package/dist/__tests__/render-feature-order.unit.test.d.ts.map +0 -1
  546. package/dist/__tests__/render-feature-prepared-graphics-recording.unit.test.d.ts +0 -2
  547. package/dist/__tests__/render-feature-prepared-graphics-recording.unit.test.d.ts.map +0 -1
  548. package/dist/__tests__/render-feature-staging.unit.test.d.ts +0 -2
  549. package/dist/__tests__/render-feature-staging.unit.test.d.ts.map +0 -1
  550. package/dist/__tests__/renderer-render-scene-public.test-d.d.ts +0 -2
  551. package/dist/__tests__/renderer-render-scene-public.test-d.d.ts.map +0 -1
  552. package/dist/__tests__/scene-temporal-coverage.unit.test.d.ts +0 -2
  553. package/dist/__tests__/scene-temporal-coverage.unit.test.d.ts.map +0 -1
  554. package/dist/__tests__/sun-snapshot-consumers.test.d.ts +0 -2
  555. package/dist/__tests__/sun-snapshot-consumers.test.d.ts.map +0 -1
  556. package/dist/__tests__/surface-backend-kind-owner.test-d.d.ts +0 -2
  557. package/dist/__tests__/surface-backend-kind-owner.test-d.d.ts.map +0 -1
  558. package/dist/__tests__/taa-history-store.unit.test.d.ts +0 -2
  559. package/dist/__tests__/taa-history-store.unit.test.d.ts.map +0 -1
  560. package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts +0 -2
  561. package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts.map +0 -1
  562. package/dist/__tests__/temporal-inspection.unit.test.d.ts +0 -2
  563. package/dist/__tests__/temporal-inspection.unit.test.d.ts.map +0 -1
  564. package/dist/assets/__tests__/asset-decoders.unit.test.d.ts +0 -2
  565. package/dist/assets/__tests__/asset-decoders.unit.test.d.ts.map +0 -1
  566. package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts +0 -2
  567. package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts.map +0 -1
  568. package/dist/assets/__tests__/render-asset-port.unit.test.d.ts +0 -2
  569. package/dist/assets/__tests__/render-asset-port.unit.test.d.ts.map +0 -1
  570. package/dist/assets/__tests__/resolve-render-asset.unit.test.d.ts +0 -2
  571. package/dist/assets/__tests__/resolve-render-asset.unit.test.d.ts.map +0 -1
  572. package/dist/chunk-DJIMFYX6.mjs +0 -1439
  573. package/dist/chunk-DJIMFYX6.mjs.map +0 -1
  574. package/dist/chunk-F2SIOCRM.mjs +0 -7423
  575. package/dist/chunk-F2SIOCRM.mjs.map +0 -1
  576. package/dist/chunk-JMSB7AR4.mjs +0 -3
  577. package/dist/chunk-JMSB7AR4.mjs.map +0 -1
  578. package/dist/chunk-KHI6K4C6.mjs +0 -659
  579. package/dist/chunk-KHI6K4C6.mjs.map +0 -1
  580. package/dist/chunk-PORZOL2V.mjs +0 -569
  581. package/dist/chunk-PORZOL2V.mjs.map +0 -1
  582. package/dist/chunk-UOJGMDGP.mjs +0 -29913
  583. package/dist/chunk-UOJGMDGP.mjs.map +0 -1
  584. package/dist/components/__tests__/atmosphere-red.test.d.ts +0 -2
  585. package/dist/components/__tests__/atmosphere-red.test.d.ts.map +0 -1
  586. package/dist/components/__tests__/atmosphere.test.d.ts +0 -2
  587. package/dist/components/__tests__/atmosphere.test.d.ts.map +0 -1
  588. package/dist/components/__tests__/fog.test-d.d.ts +0 -2
  589. package/dist/components/__tests__/fog.test-d.d.ts.map +0 -1
  590. package/dist/components/__tests__/fog.test.d.ts +0 -2
  591. package/dist/components/__tests__/fog.test.d.ts.map +0 -1
  592. package/dist/components/atmosphere.d.ts +0 -18
  593. package/dist/components/atmosphere.d.ts.map +0 -1
  594. package/dist/components/environment.d.ts +0 -115
  595. package/dist/components/environment.d.ts.map +0 -1
  596. package/dist/deferred-lighting.d.ts +0 -13
  597. package/dist/deferred-lighting.d.ts.map +0 -1
  598. package/dist/dynamic-texture-store.d.ts +0 -42
  599. package/dist/dynamic-texture-store.d.ts.map +0 -1
  600. package/dist/environment/__tests__/failure-injection.test.d.ts +0 -2
  601. package/dist/environment/__tests__/failure-injection.test.d.ts.map +0 -1
  602. package/dist/environment/__tests__/generation-red.test.d.ts +0 -2
  603. package/dist/environment/__tests__/generation-red.test.d.ts.map +0 -1
  604. package/dist/environment/__tests__/generation.test.d.ts +0 -2
  605. package/dist/environment/__tests__/generation.test.d.ts.map +0 -1
  606. package/dist/environment/__tests__/graph-transaction.test.d.ts +0 -2
  607. package/dist/environment/__tests__/graph-transaction.test.d.ts.map +0 -1
  608. package/dist/environment/__tests__/inspection-red.test.d.ts +0 -2
  609. package/dist/environment/__tests__/inspection-red.test.d.ts.map +0 -1
  610. package/dist/environment/__tests__/lifecycle-evidence.test.d.ts +0 -2
  611. package/dist/environment/__tests__/lifecycle-evidence.test.d.ts.map +0 -1
  612. package/dist/environment/__tests__/pipeline-topology.test.d.ts +0 -2
  613. package/dist/environment/__tests__/pipeline-topology.test.d.ts.map +0 -1
  614. package/dist/environment/__tests__/readiness.test.d.ts +0 -2
  615. package/dist/environment/__tests__/readiness.test.d.ts.map +0 -1
  616. package/dist/environment/__tests__/recovery.test.d.ts +0 -2
  617. package/dist/environment/__tests__/recovery.test.d.ts.map +0 -1
  618. package/dist/environment/__tests__/resize-dispose.test.d.ts +0 -2
  619. package/dist/environment/__tests__/resize-dispose.test.d.ts.map +0 -1
  620. package/dist/environment/__tests__/signature-red.test.d.ts +0 -2
  621. package/dist/environment/__tests__/signature-red.test.d.ts.map +0 -1
  622. package/dist/environment/__tests__/signature.test.d.ts +0 -2
  623. package/dist/environment/__tests__/signature.test.d.ts.map +0 -1
  624. package/dist/environment/descriptors.d.ts +0 -2
  625. package/dist/environment/descriptors.d.ts.map +0 -1
  626. package/dist/environment/extracted-environment.d.ts +0 -53
  627. package/dist/environment/extracted-environment.d.ts.map +0 -1
  628. package/dist/environment/generation.d.ts +0 -62
  629. package/dist/environment/generation.d.ts.map +0 -1
  630. package/dist/environment/gpu-bundle.d.ts +0 -23
  631. package/dist/environment/gpu-bundle.d.ts.map +0 -1
  632. package/dist/environment/graph.d.ts +0 -108
  633. package/dist/environment/graph.d.ts.map +0 -1
  634. package/dist/environment/inspection.d.ts +0 -48
  635. package/dist/environment/inspection.d.ts.map +0 -1
  636. package/dist/environment/lifecycle.d.ts +0 -22
  637. package/dist/environment/lifecycle.d.ts.map +0 -1
  638. package/dist/environment/readiness.d.ts +0 -29
  639. package/dist/environment/readiness.d.ts.map +0 -1
  640. package/dist/environment/signature.d.ts +0 -70
  641. package/dist/environment/signature.d.ts.map +0 -1
  642. package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts +0 -2
  643. package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts.map +0 -1
  644. package/dist/extract/__tests__/environment-source.test.d.ts +0 -2
  645. package/dist/extract/__tests__/environment-source.test.d.ts.map +0 -1
  646. package/dist/extract/__tests__/schema-readers.unit.test.d.ts +0 -2
  647. package/dist/extract/__tests__/schema-readers.unit.test.d.ts.map +0 -1
  648. package/dist/extract/directional-csm.d.ts +0 -129
  649. package/dist/extract/directional-csm.d.ts.map +0 -1
  650. package/dist/extract/index.d.ts +0 -5
  651. package/dist/extract/index.d.ts.map +0 -1
  652. package/dist/extract/material-interface.d.ts +0 -56
  653. package/dist/extract/material-interface.d.ts.map +0 -1
  654. package/dist/extract/schema-readers.d.ts +0 -20
  655. package/dist/extract/schema-readers.d.ts.map +0 -1
  656. package/dist/features/graph-contribution.d.ts +0 -64
  657. package/dist/features/graph-contribution.d.ts.map +0 -1
  658. package/dist/features/index.d.ts +0 -21
  659. package/dist/features/index.d.ts.map +0 -1
  660. package/dist/features/morph/index.d.ts +0 -3
  661. package/dist/features/morph/index.d.ts.map +0 -1
  662. package/dist/features/morph/morph-bounds.d.ts +0 -42
  663. package/dist/features/morph/morph-bounds.d.ts.map +0 -1
  664. package/dist/features/scene-temporal.d.ts +0 -45
  665. package/dist/features/scene-temporal.d.ts.map +0 -1
  666. package/dist/features/taa-resolve.d.ts +0 -21
  667. package/dist/features/taa-resolve.d.ts.map +0 -1
  668. package/dist/frame-chain.d.ts +0 -14
  669. package/dist/frame-chain.d.ts.map +0 -1
  670. package/dist/gpu-driven/view-reference.d.ts.map +0 -1
  671. package/dist/gpu-resource-store.d.ts.map +0 -1
  672. package/dist/hdrp-cluster-membership.d.ts +0 -2
  673. package/dist/hdrp-cluster-membership.d.ts.map +0 -1
  674. package/dist/hdrp-pipeline.d.ts +0 -36
  675. package/dist/hdrp-pipeline.d.ts.map +0 -1
  676. package/dist/ibl/cubemap-projection.d.ts +0 -23
  677. package/dist/ibl/cubemap-projection.d.ts.map +0 -1
  678. package/dist/ibl/face-uniforms.d.ts +0 -65
  679. package/dist/ibl/face-uniforms.d.ts.map +0 -1
  680. package/dist/mesh-update-errors.d.ts +0 -71
  681. package/dist/mesh-update-errors.d.ts.map +0 -1
  682. package/dist/mipmap-generator.d.ts +0 -39
  683. package/dist/mipmap-generator.d.ts.map +0 -1
  684. package/dist/param-schema-projection-census.d.ts +0 -18
  685. package/dist/param-schema-projection-census.d.ts.map +0 -1
  686. package/dist/persistent-render-scene.d.ts +0 -158
  687. package/dist/persistent-render-scene.d.ts.map +0 -1
  688. package/dist/pipeline/index.d.ts +0 -11
  689. package/dist/pipeline/index.d.ts.map +0 -1
  690. package/dist/pipeline-errors.d.ts +0 -110
  691. package/dist/pipeline-errors.d.ts.map +0 -1
  692. package/dist/prepare/__tests__/schema-readers.unit.test.d.ts +0 -2
  693. package/dist/prepare/__tests__/schema-readers.unit.test.d.ts.map +0 -1
  694. package/dist/prepare/index.d.ts +0 -4
  695. package/dist/prepare/index.d.ts.map +0 -1
  696. package/dist/prepare/schema-readers.d.ts +0 -11
  697. package/dist/prepare/schema-readers.d.ts.map +0 -1
  698. package/dist/record/__tests__/environment-record.test.d.ts +0 -2
  699. package/dist/record/__tests__/environment-record.test.d.ts.map +0 -1
  700. package/dist/record/__tests__/frame-targets.unit.test.d.ts +0 -2
  701. package/dist/record/__tests__/frame-targets.unit.test.d.ts.map +0 -1
  702. package/dist/record/__tests__/membership-timing.unit.test.d.ts +0 -2
  703. package/dist/record/__tests__/membership-timing.unit.test.d.ts.map +0 -1
  704. package/dist/record/__tests__/render-submission.integration.test.d.ts +0 -2
  705. package/dist/record/__tests__/render-submission.integration.test.d.ts.map +0 -1
  706. package/dist/record/__tests__/render-submission.perf.test.d.ts +0 -2
  707. package/dist/record/__tests__/render-submission.perf.test.d.ts.map +0 -1
  708. package/dist/record/__tests__/shadow-submit-mode.unit.test.d.ts +0 -2
  709. package/dist/record/__tests__/shadow-submit-mode.unit.test.d.ts.map +0 -1
  710. package/dist/record/__tests__/view-ubo-layout.unit.test.d.ts +0 -2
  711. package/dist/record/__tests__/view-ubo-layout.unit.test.d.ts.map +0 -1
  712. package/dist/record/frame-observation.d.ts +0 -38
  713. package/dist/record/frame-observation.d.ts.map +0 -1
  714. package/dist/record/index.d.ts +0 -15
  715. package/dist/record/index.d.ts.map +0 -1
  716. package/dist/record/main-pass-skin.d.ts +0 -46
  717. package/dist/record/main-pass-skin.d.ts.map +0 -1
  718. package/dist/record/main-pass-sprite.d.ts +0 -69
  719. package/dist/record/main-pass-sprite.d.ts.map +0 -1
  720. package/dist/record/material-payload.d.ts +0 -43
  721. package/dist/record/material-payload.d.ts.map +0 -1
  722. package/dist/record/material-slot-plan.d.ts +0 -26
  723. package/dist/record/material-slot-plan.d.ts.map +0 -1
  724. package/dist/record/membership-timing.d.ts +0 -232
  725. package/dist/record/membership-timing.d.ts.map +0 -1
  726. package/dist/record/shadow-caster-uniform.d.ts +0 -8
  727. package/dist/record/shadow-caster-uniform.d.ts.map +0 -1
  728. package/dist/record/shadow-submit-mode.d.ts +0 -66
  729. package/dist/record/shadow-submit-mode.d.ts.map +0 -1
  730. package/dist/render-dispatch-membership.d.ts +0 -47
  731. package/dist/render-dispatch-membership.d.ts.map +0 -1
  732. package/dist/render-pipeline-context.d.ts +0 -289
  733. package/dist/render-pipeline-context.d.ts.map +0 -1
  734. package/dist/render-pipeline-target.d.ts +0 -16
  735. package/dist/render-pipeline-target.d.ts.map +0 -1
  736. package/dist/render-scene-projection.d.ts +0 -174
  737. package/dist/render-scene-projection.d.ts.map +0 -1
  738. package/dist/render-system-fold.d.ts +0 -266
  739. package/dist/render-system-fold.d.ts.map +0 -1
  740. package/dist/renderer/asset-service.d.ts +0 -10
  741. package/dist/renderer/asset-service.d.ts.map +0 -1
  742. package/dist/renderer/backend-selection.d.ts.map +0 -1
  743. package/dist/renderer/environment-classify.d.ts +0 -6
  744. package/dist/renderer/environment-classify.d.ts.map +0 -1
  745. package/dist/renderer/environment-error.d.ts +0 -13
  746. package/dist/renderer/environment-error.d.ts.map +0 -1
  747. package/dist/renderer/material/pipeline-projection.d.ts +0 -91
  748. package/dist/renderer/material/pipeline-projection.d.ts.map +0 -1
  749. package/dist/renderer/renderer-factory.d.ts +0 -289
  750. package/dist/renderer/renderer-factory.d.ts.map +0 -1
  751. package/dist/renderer.d.ts +0 -771
  752. package/dist/renderer.d.ts.map +0 -1
  753. package/dist/scene-utils/collect-subtree.d.ts +0 -11
  754. package/dist/scene-utils/collect-subtree.d.ts.map +0 -1
  755. package/dist/ssao-data.d.ts +0 -34
  756. package/dist/ssao-data.d.ts.map +0 -1
  757. package/dist/surface-format.d.ts +0 -10
  758. package/dist/surface-format.d.ts.map +0 -1
  759. package/dist/taa-history-store.d.ts +0 -88
  760. package/dist/taa-history-store.d.ts.map +0 -1
  761. package/dist/temporal-coverage.d.ts +0 -35
  762. package/dist/temporal-coverage.d.ts.map +0 -1
  763. package/dist/temporal-frame-transaction.d.ts +0 -92
  764. package/dist/temporal-frame-transaction.d.ts.map +0 -1
  765. package/dist/temporal-inspection.d.ts +0 -57
  766. package/dist/temporal-inspection.d.ts.map +0 -1
  767. package/dist/temporal-view.d.ts +0 -43
  768. package/dist/temporal-view.d.ts.map +0 -1
  769. package/dist/tilemap/resolve-tileset-runtime.d.ts +0 -23
  770. package/dist/tilemap/resolve-tileset-runtime.d.ts.map +0 -1
  771. package/dist/urp-pipeline.d.ts +0 -4
  772. package/dist/urp-pipeline.d.ts.map +0 -1
  773. package/src/__tests__/analytic-sky-contract.test.ts +0 -27
  774. package/src/__tests__/analytic-sky-falsify-carriers.mjs +0 -43
  775. package/src/__tests__/analytic-sky-falsify.test.ts +0 -94
  776. package/src/__tests__/assets-runtime-handoff.integration.test.ts +0 -36
  777. package/src/__tests__/backend-selection.integration.test.ts +0 -11
  778. package/src/__tests__/camera-temporal.test-d.ts +0 -8
  779. package/src/__tests__/camera-temporal.test.ts +0 -188
  780. package/src/__tests__/directional-shadow-probe-atlas-layout.unit.test.ts +0 -18
  781. package/src/__tests__/environment-inspection.test.ts +0 -45
  782. package/src/__tests__/fog-ai-user.fixture.ts +0 -350
  783. package/src/__tests__/fog-custom-render-feature.fixture.ts +0 -33
  784. package/src/__tests__/fog-custom-render-feature.integration.test.ts +0 -76
  785. package/src/__tests__/fog-inspection.integration.test.ts +0 -127
  786. package/src/__tests__/fog-owner-state.integration.test.ts +0 -112
  787. package/src/__tests__/fog-pipeline-topology.integration.test.ts +0 -93
  788. package/src/__tests__/fog-public-surface.integration.test.ts +0 -60
  789. package/src/__tests__/fog-ray-contract.integration.test.ts +0 -73
  790. package/src/__tests__/fog-source-absence.integration.test.ts +0 -51
  791. package/src/__tests__/fog-temporal.integration.test.ts +0 -115
  792. package/src/__tests__/frame-chain.unit.test.ts +0 -26
  793. package/src/__tests__/gpu-scene-field-type-owner.test-d.ts +0 -27
  794. package/src/__tests__/hdrp-pipeline.unit.test.ts +0 -100
  795. package/src/__tests__/ibl/ibl-fallback.unit.test.ts +0 -23
  796. package/src/__tests__/material-derived-error-stop-draw.integration.test.ts +0 -69
  797. package/src/__tests__/material-derived-payload.integration.test.ts +0 -164
  798. package/src/__tests__/materials.unit.test.ts +0 -25
  799. package/src/__tests__/param-schema-projection-census.unit.test.ts +0 -40
  800. package/src/__tests__/persistent-render-scene.unit.test.ts +0 -1311
  801. package/src/__tests__/pipeline-error-policy-owner.unit.test.ts +0 -167
  802. package/src/__tests__/pipeline-pass-trace.test.ts +0 -92
  803. package/src/__tests__/pipeline-stage-owner.test-d.ts +0 -13
  804. package/src/__tests__/plugin.test.ts +0 -25
  805. package/src/__tests__/prepared-graphics-backend-matrix.unit.test.ts +0 -129
  806. package/src/__tests__/prepared-graphics-resolver-recording.unit.test.ts +0 -180
  807. package/src/__tests__/public-pipeline-id.test-d.ts +0 -6
  808. package/src/__tests__/render-dispatch-membership.unit.test.ts +0 -117
  809. package/src/__tests__/render-feature-construction.unit.test.ts +0 -124
  810. package/src/__tests__/render-feature-error-code-owner.test-d.ts +0 -27
  811. package/src/__tests__/render-feature-gpu-buffer-usage-owner.test-d.ts +0 -46
  812. package/src/__tests__/render-feature-graph.integration.test.ts +0 -205
  813. package/src/__tests__/render-feature-graphics-staging.unit.test.ts +0 -200
  814. package/src/__tests__/render-feature-order.unit.test.ts +0 -66
  815. package/src/__tests__/render-feature-prepared-graphics-recording.unit.test.ts +0 -107
  816. package/src/__tests__/render-feature-staging.unit.test.ts +0 -94
  817. package/src/__tests__/renderer-render-scene-public.test-d.ts +0 -27
  818. package/src/__tests__/scene-temporal-coverage.unit.test.ts +0 -259
  819. package/src/__tests__/sun-snapshot-consumers.test.ts +0 -35
  820. package/src/__tests__/surface-backend-kind-owner.test-d.ts +0 -42
  821. package/src/__tests__/taa-history-store.unit.test.ts +0 -196
  822. package/src/__tests__/temporal-frame-transaction.integration.test.ts +0 -537
  823. package/src/__tests__/temporal-inspection.unit.test.ts +0 -138
  824. package/src/assets/__tests__/asset-decoders.unit.test.ts +0 -92
  825. package/src/assets/__tests__/mipmap-generator.unit.test.ts +0 -52
  826. package/src/assets/__tests__/render-asset-port.unit.test.ts +0 -54
  827. package/src/assets/__tests__/resolve-render-asset.unit.test.ts +0 -47
  828. package/src/components/__tests__/atmosphere-red.test.ts +0 -51
  829. package/src/components/__tests__/atmosphere.test.ts +0 -79
  830. package/src/components/__tests__/fog.test-d.ts +0 -49
  831. package/src/components/__tests__/fog.test.ts +0 -60
  832. package/src/components/atmosphere.ts +0 -64
  833. package/src/deferred-lighting.ts +0 -92
  834. package/src/dynamic-texture-store.ts +0 -111
  835. package/src/environment/README.md +0 -76
  836. package/src/environment/__tests__/failure-injection.test.ts +0 -50
  837. package/src/environment/__tests__/generation-red.test.ts +0 -64
  838. package/src/environment/__tests__/generation.test.ts +0 -37
  839. package/src/environment/__tests__/graph-transaction.test.ts +0 -85
  840. package/src/environment/__tests__/inspection-red.test.ts +0 -53
  841. package/src/environment/__tests__/lifecycle-evidence.test.ts +0 -40
  842. package/src/environment/__tests__/pipeline-topology.test.ts +0 -33
  843. package/src/environment/__tests__/readiness.test.ts +0 -42
  844. package/src/environment/__tests__/recovery.test.ts +0 -62
  845. package/src/environment/__tests__/resize-dispose.test.ts +0 -30
  846. package/src/environment/__tests__/signature-red.test.ts +0 -45
  847. package/src/environment/__tests__/signature.test.ts +0 -60
  848. package/src/environment/descriptors.ts +0 -7
  849. package/src/environment/extracted-environment.ts +0 -239
  850. package/src/environment/generation.ts +0 -158
  851. package/src/environment/gpu-bundle.ts +0 -144
  852. package/src/environment/graph.ts +0 -588
  853. package/src/environment/inspection.ts +0 -107
  854. package/src/environment/lifecycle.ts +0 -124
  855. package/src/environment/readiness.ts +0 -76
  856. package/src/environment/signature.ts +0 -185
  857. package/src/extract/__tests__/directional-csm-domain.unit.test.ts +0 -391
  858. package/src/extract/__tests__/environment-source.test.ts +0 -105
  859. package/src/extract/__tests__/schema-readers.unit.test.ts +0 -16
  860. package/src/extract/directional-csm.ts +0 -959
  861. package/src/extract/index.ts +0 -10
  862. package/src/extract/material-interface.ts +0 -604
  863. package/src/extract/schema-readers.ts +0 -27
  864. package/src/features/graph-contribution.ts +0 -577
  865. package/src/features/index.ts +0 -100
  866. package/src/features/morph/index.ts +0 -24
  867. package/src/features/morph/morph-bounds.ts +0 -123
  868. package/src/features/scene-temporal.ts +0 -274
  869. package/src/features/taa-resolve.ts +0 -244
  870. package/src/frame-chain.ts +0 -21
  871. package/src/hdrp-cluster-membership.ts +0 -70
  872. package/src/ibl/cubemap-projection.ts +0 -60
  873. package/src/ibl/face-uniforms.ts +0 -150
  874. package/src/mesh-update-errors.ts +0 -113
  875. package/src/mipmap-generator.ts +0 -244
  876. package/src/param-schema-projection-census.ts +0 -73
  877. package/src/persistent-render-scene.ts +0 -1752
  878. package/src/pipeline/index.ts +0 -40
  879. package/src/pipeline-errors.ts +0 -172
  880. package/src/prepare/__tests__/schema-readers.unit.test.ts +0 -16
  881. package/src/prepare/index.ts +0 -8
  882. package/src/prepare/schema-readers.ts +0 -20
  883. package/src/record/__tests__/environment-record.test.ts +0 -35
  884. package/src/record/__tests__/frame-targets.unit.test.ts +0 -54
  885. package/src/record/__tests__/membership-timing.unit.test.ts +0 -524
  886. package/src/record/__tests__/render-submission.integration.test.ts +0 -76
  887. package/src/record/__tests__/render-submission.perf.test.ts +0 -141
  888. package/src/record/__tests__/shadow-submit-mode.unit.test.ts +0 -88
  889. package/src/record/__tests__/view-ubo-layout.unit.test.ts +0 -101
  890. package/src/record/frame-observation.ts +0 -122
  891. package/src/record/index.ts +0 -15
  892. package/src/record/main-pass-skin.ts +0 -51
  893. package/src/record/main-pass-sprite.ts +0 -166
  894. package/src/record/material-payload.ts +0 -292
  895. package/src/record/material-slot-plan.ts +0 -68
  896. package/src/record/membership-timing.ts +0 -1012
  897. package/src/record/shadow-caster-uniform.ts +0 -37
  898. package/src/record/shadow-submit-mode.ts +0 -277
  899. package/src/render-dispatch-membership.ts +0 -155
  900. package/src/render-pipeline-context.ts +0 -332
  901. package/src/render-pipeline-target.ts +0 -96
  902. package/src/render-scene-projection.ts +0 -1738
  903. package/src/render-system-fold.ts +0 -531
  904. package/src/renderer/asset-service.ts +0 -32
  905. package/src/renderer/backend-selection.ts +0 -121
  906. package/src/renderer/environment-classify.ts +0 -30
  907. package/src/renderer/environment-error.ts +0 -19
  908. package/src/renderer/material/pipeline-projection.ts +0 -140
  909. package/src/renderer.ts +0 -940
  910. package/src/scene-utils/collect-subtree.ts +0 -40
  911. package/src/ssao-data.ts +0 -106
  912. package/src/surface-format.ts +0 -37
  913. package/src/taa-history-store.ts +0 -429
  914. package/src/temporal-coverage.ts +0 -106
  915. package/src/temporal-frame-transaction.ts +0 -301
  916. package/src/temporal-inspection.ts +0 -194
  917. package/src/temporal-view.ts +0 -174
  918. package/src/tilemap/resolve-tileset-runtime.ts +0 -72
@@ -1,597 +1,62 @@
1
- // @forgeax/engine-runtime - public render-graph primitives
2
- // (feat-20260604-resource-owning-render-graph-and-fullscreen-postpr M3 / w19).
1
+ // @forgeax/engine-render - low-level record/encode graph primitives.
3
2
  //
4
- // These factory functions are the AI-user-facing public vocabulary for assembling
5
- // a render pipeline's per-frame graph. The urp pipeline (the engine
6
- // builtin) and any custom pipeline use the SAME functions — the dogfood proof
7
- // (AC-12 / AC-18). The internal recordXxxPass closures that do the actual GPU
8
- // recording are package-private (no longer exported from
9
- // `render-system-record.ts`); they are referenced here as the implementation
10
- // detail of addScenePass / addFullscreenPass etc., satisfying plan-strategy D-5
11
- // "per-entity logic stays as the addScenePass implementation detail; do NOT
12
- // migrate it into the render-graph package (that would pollute its RHI-pure
13
- // boundary)".
3
+ // Standard owns pass topology through typed-render-graph-primitives. This module
4
+ // retains the RHI-facing record helpers used by that typed graph: SSAO record
5
+ // closures, fullscreen dispatch, depth resolution, and encoding.
14
6
  //
15
- // API surface (the only nouns/verbs a pipeline author touches):
16
- // - addColorTarget(name, desc) — allocate a graph-owned RT (M1)
17
- // - addColorTargetAlias(name, src) — fold a logical key onto an existing RT
18
- // - addScenePass(g, name, opts) — render the ECS scene into a colour target
19
- // - addShadowPass(g, name, opts) — render shadow casters into a depth target
20
- // - addSkyboxPass(g, name, opts) — render the skybox cube into a colour target
21
- // - addBloomPasses(g, opts) — bloom bright + 2 blur + composite chain
22
- // - addSsaoPasses(g, opts) — SSAO calc + blur chain (feat-20260612-hdrp-ssao)
23
- // - addTonemapPass(g, name, opts) — HDR -> LDR tonemap
24
- // - addFullscreenPass(g, name, opts) — generic fullscreen post-process
25
- //
26
- // PIPELINE ROLE: urp-pipeline.buildGraph composes these in the
27
- // canonical 9-pass order; a custom pipeline picks any subset / order.
28
- //
29
- // ─── EXTENSION-POINT MAP (F-5 doc-clarify) ───────────────────────────────
30
- //
31
- // Of the eight primitives above, EXACTLY ONE is an AI-user extension point;
32
- // the other seven are engine-built-ins that DO NOT accept user-supplied
33
- // execute closures.
34
- //
35
- // addScenePass | engine-built-in | execute = recordMainPass (private)
36
- // addShadowPass | engine-built-in | execute = recordShadowPass (private)
37
- // addSkyboxPass | engine-built-in | execute = recordSkyboxPass (private)
38
- // addBloomPasses | engine-built-in | execute = 4× private record* closures
39
- // addSsaoPasses | engine-built-in | execute = 2× private record* closures
40
- // addTonemapPass | engine-built-in | execute = dispatchFullscreenPass('forgeax::tonemap')
41
- // addColorTarget | engine-built-in (resource decl)
42
- // addColorTargetAlias | engine-built-in (resource decl)
43
- // addFullscreenPass | EXTENSION POINT (the only one)
44
- //
45
- // AI users wanting to add a CUSTOM SCENE pass (a per-entity geometry walk
46
- // with their own shading model) write `graph.addPass(name, {reads, writes,
47
- // execute: theirOwnClosure})` directly through the `@forgeax/engine-render-graph`
48
- // `RenderGraph` API. addScenePass is intentionally NOT a customisation
49
- // hook — it is the engine's urp main pass, full stop.
50
- //
51
- // AI users wanting to add a FULLSCREEN POST-PROCESS pass (e.g. a custom
52
- // vignette, chromatic aberration, color grading LUT) take the two-step
53
- // extension idiom:
54
- //
55
- // // 1. Register the shader's WGSL source under a unique id (engine
56
- // // builtins use `forgeax::` prefix; AI users use `<package>::<id>`).
57
- // // Same-id re-register THROWS (programmer error, fail-fast).
58
- // renderer.postProcess.register('mypkg::vignette', {
59
- // source: vignetteWGSL, // composed WGSL fragment stage
60
- // params: { byteSize: 16, defaultValue: ... }, // optional UBO
61
- // reads: ['hdrComposited'], // optional graph resource keys
62
- // });
63
- //
64
- // // 2. Reference the registered id from a custom pipeline's buildGraph.
65
- // // The dispatcher looks the id up via runtime.lookupPostProcess;
66
- // // a stale id THROWS PostProcessError{code:'post-process-not-found'}
67
- // // inside the per-frame execute closure (charter P3 fail-fast).
68
- // addFullscreenPass(graph, 'vignette', {
69
- // program: { module: 'mypkg::vignette' },
70
- // color: 'rt', // graph-owned scratch target
71
- // reads: ['hdrComposited'],
72
- // });
73
- //
74
- // The `'fxaa'` id is the engine-built-in special case: dispatcher delegates
75
- // to `recordFxaaPass`, which samples graph-owned LDR and writes the surface.
76
- // `addFullscreenPass(g, 'fxaa', ...)` is the
77
- // canonical engine call site (used by urp-pipeline.buildGraph),
78
- // not an AI user customisation lever.
79
-
7
+ // Public graph assembly does not depend on legacy add* wrappers.
80
8
  import { mat4 } from '@forgeax/engine-math';
81
- import type { RenderGraph, ResolveContext } from '@forgeax/engine-render-graph';
82
- import {
83
- type Buffer,
84
- RhiError,
85
- type RhiRenderPassEncoder,
86
- type Sampler,
87
- type TextureView,
9
+ import type { ResolveContext } from '@forgeax/engine-render-graph';
10
+ import type {
11
+ Buffer,
12
+ RhiRenderPassEncoder,
13
+ Sampler,
14
+ Texture,
15
+ TextureFormat,
16
+ TextureView,
88
17
  } from '@forgeax/engine-rhi';
89
- import type { PassSelector } from '@forgeax/engine-types';
90
18
  import {
91
19
  buildFullscreenPostProcessPass,
92
20
  createFullscreenBindGroup,
93
21
  entryHasDepthRead,
94
22
  } from './fullscreen-post-process-pass';
95
- import { getOrCreateSsaoFallbackTexture } from './hdrp-buffers';
96
23
  import { buildBeginRenderPassDescriptor } from './pipeline-spec';
97
24
  import { PostProcessError } from './post-process-errors';
98
- import {
99
- computeProjectionMatrix,
100
- computeViewMatrix,
101
- getOrCreateFromChain,
102
- recordBloomBlurHPass,
103
- recordBloomBlurVPass,
104
- recordBloomBrightPass,
105
- recordBloomCompositePass,
106
- recordFxaaPass,
107
- recordMainPass,
108
- recordPointShadowPass,
109
- recordShadowPass,
110
- recordSkyboxPass,
111
- recordSpotShadowPass,
112
- } from './record';
113
- import type {
114
- _InternalRenderPipelineContext,
115
- RenderPipelineContext,
116
- } from './render-pipeline-context';
117
- import { getOrCreateSsaoBuffers } from './ssao-buffers';
118
- import {
119
- getSsaoParameters,
120
- type ResolvedSsaoParameters,
121
- resolveSsaoParameters,
122
- } from './ssao-config';
123
-
124
- /**
125
- * Selects which passes of a material asset are rendered by addScenePass / addShadowPass.
126
- *
127
- * An empty selector `{}` matches every pass. The selector is pipeline-specific:
128
- * the built-in URP uses `{ LightMode: ['Forward'] }` / `{ LightMode: ['ShadowCaster'] }`;
129
- * a custom pipeline can define its own tag keys and values.
130
- *
131
- * Matching rule: every key in the selector must exist in the pass's `tags` and the
132
- * pass's tag value must be in the selector's value list.
133
- */
134
-
135
- export interface AddScenePassOptions {
136
- /** Graph colour target to write (declared via g.addColorTarget). */
137
- readonly color: string;
138
- /** Graph depth target to write (declared via g.addColorTarget). */
139
- readonly depth: string;
140
- /**
141
- * Optional single-sample resolve target for a multisample colour target.
142
- * When `_routeFromOpts` is true and the active camera has MSAA enabled,
143
- * `recordMainPass` resolves `color` into this graph-owned target before a
144
- * downstream fullscreen pass samples it. Pass `null` to explicitly disable
145
- * the default resolve in a custom-pipeline falsifier; omit it for
146
- * single-sample scenes or to preserve the URP-owned resolve.
147
- */
148
- readonly resolve?: string | null | undefined;
149
- /** Resource keys this pass samples (typically 'shadowDepth' + an upstream colour). */
150
- readonly reads?: readonly string[] | undefined;
151
- /**
152
- * Pass selector — a pipeline-specific filter for which material passes are
153
- * rendered. An empty selector `{}` matches every pass. The built-in URP uses
154
- * `{ LightMode: ['Forward'] }`; a custom pipeline defines its own tag keys.
155
- */
156
- readonly selector: PassSelector;
157
- /**
158
- * @internal — feat-20260609 framebuffers demo M5 / T-12-a opt-in flag.
159
- *
160
- * When `true`, the pass execute closure resolves `opts.color` / `opts.depth`
161
- * through the graph's resolveCtx and overrides the recordMainPass ctx so
162
- * the geometry pass renders into those graph-owned views. When `false` (or
163
- * unset, the default), recordMainPass picks the per-frame
164
- * `geometryColorView` / `geometryDepthView` set by recordFrame's URP
165
- * state-machine — this preserves byte-equivalence for urp-pipeline,
166
- * which encodes its own MSAA / LDR-no-MSAA / HDR routing in recordFrame
167
- * (where opts.color is a logical ordering token, not the physical write
168
- * target).
169
- *
170
- * AI-user-defined custom pipelines declaring their own offscreen RT (the
171
- * AC-11 "render scene to graph-owned colour + depth" contract) MUST set
172
- * this flag to opt out of the URP state-machine and route opts.color
173
- * directly. A future feat that migrates urp-pipeline off the recordFrame
174
- * state-machine flips the default and removes this flag.
175
- */
176
- readonly _routeFromOpts?: boolean | undefined;
177
- }
178
-
179
- /**
180
- * AC-11: render the ECS scene into a graph-owned colour + depth target.
181
- *
182
- * Adds a graph pass that, when executed, walks the per-frame validated
183
- * renderable list and dispatches geometry into `opts.color` (with `opts.depth`
184
- * as the depth attachment). The implementation detail (4-BGL chain, per-entity
185
- * material UBO packing, pipeline cache lookup, MSAA variant selection) is
186
- * package-private (`recordMainPass`); plan-strategy D-5 keeps it inside runtime
187
- * so the render-graph package stays RHI-pure.
188
- *
189
- * The `reads` array threads dependency edges into the graph (so shadow ->
190
- * skybox -> main is expressed in declaration order). The two writes are `opts.color`
191
- * and `opts.depth`.
192
- */
193
- export function addScenePass(
194
- graph: RenderGraph<RenderPipelineContext>,
195
- name: string,
196
- opts: AddScenePassOptions,
197
- ): void {
198
- graph.addPass(name, {
199
- reads: opts.reads ?? [],
200
- writes: [
201
- opts.color,
202
- opts.depth,
203
- ...(opts.resolve === undefined || opts.resolve === null ? [] : [opts.resolve]),
204
- ],
205
- // feat-20260609 framebuffers demo M5 / T-12-a: route opts.color/opts.depth
206
- // through the resolveCtx and override the geometry view fields on the ctx
207
- // handed to recordMainPass when the caller is a non-URP custom pipeline.
208
- // Without this routing, recordMainPass picks `c.geometryColorView` whose
209
- // default (set by recordFrame) is the swap-chain `view`, only re-routed
210
- // onto graph-owned targets via the URP state-machine
211
- // (tonemapActive -> 'hdrColor' / msaaActive -> 'msaaColor' / etc.).
212
- //
213
- // URP byte-equivalence: urp-pipeline passes opts.color values that are
214
- // logical ordering tokens whose actual physical view is selected per
215
- // frame by recordFrame's state-machine (e.g. opts.color='hdrColor' but
216
- // recordFrame may select hdrColorMsaa, msaaColor, or the swap-chain
217
- // depending on tonemap+MSAA flags). Overriding from opts.color would
218
- // drop those MSAA-specific / LDR-swap-chain RT picks. The discriminator
219
- // is: URP keeps its state-machine because urp-pipeline does NOT pass
220
- // `_routeFromOpts: true`; a non-URP custom pipeline declaring its own
221
- // graph-owned RT opts in via the internal flag below.
222
- //
223
- // feat-20260609 selector: opts.selector is forwarded to recordMainPass for
224
- // pass-tag filtering (e.g. URP's `{ LightMode: ['Forward'] }`).
225
- execute: (ctx: RenderPipelineContext, resolveCtx?: ResolveContext) => {
226
- const internalCtx = ctx as _InternalRenderPipelineContext;
227
- if (!opts._routeFromOpts) {
228
- recordMainPass(internalCtx, opts.selector);
229
- return;
230
- }
231
- const colorView = resolveCtx?.resolve(opts.color) as TextureView | undefined;
232
- const depthView = resolveCtx?.resolve(opts.depth) as TextureView | undefined;
233
- const resolveView =
234
- opts.resolve === undefined
235
- ? undefined
236
- : opts.resolve === null
237
- ? null
238
- : (resolveCtx?.resolve(opts.resolve) as TextureView | undefined);
239
- const overridden: _InternalRenderPipelineContext = {
240
- ...internalCtx,
241
- geometryColorView: colorView ?? internalCtx.geometryColorView,
242
- geometryDepthView: depthView ?? internalCtx.geometryDepthView,
243
- ...(resolveView !== undefined ? { geometryColorResolveView: resolveView } : {}),
244
- };
245
- recordMainPass(overridden, opts.selector);
246
- },
247
- });
248
- }
249
-
250
- export interface AddShadowPassOptions {
251
- /** Graph depth target to write (declared via g.addColorTarget with depth format). */
252
- readonly depth: string;
253
- /**
254
- * Pass selector — a pipeline-specific filter for which material passes are
255
- * rendered as shadow casters. The built-in URP uses
256
- * `{ LightMode: ['ShadowCaster'] }`.
257
- */
258
- readonly selector: PassSelector;
259
- /**
260
- * Optional viewport for the shadow render pass. When set, the pass calls
261
- * `setViewport(x, y, w, h, 0, 1)` before dispatch so the depth rasterization
262
- * is clipped to the given sub-rectangle of the depth target. Undefined
263
- * preserves the pre-CSM behavior (full-RT viewport). Used by the cascaded
264
- * shadow map atlas: each cascade pass writes to one tile.
265
- *
266
- * @example viewport: { x: 0, y: 0, w: 2048, h: 2048 }
267
- */
268
- readonly viewport?:
269
- | { readonly x: number; readonly y: number; readonly w: number; readonly h: number }
270
- | undefined;
271
- /**
272
- * Cascade index this pass renders into (0..3). The runtime writes the
273
- * value to `shadowCasterCascadeBuffer` immediately before submit; the
274
- * shadow_caster vertex shader reads it to pick the matching
275
- * `view.lightViewProj_X`. Defaults to 0 when unset (preserves the
276
- * single-cascade pre-CSM behaviour for any caller still calling
277
- * addShadowPass without the field; the URP per-cascade loop sets it
278
- * explicitly).
279
- *
280
- * @example cascadeIndex: 0 // first cascade (lightViewProj_A)
281
- */
282
- readonly cascadeIndex?: number;
283
- }
284
-
285
- /**
286
- * Render shadow casters into a depth-only graph target. Implementation detail:
287
- * `recordShadowPass` (package-private) iterates DirectionalLight + caster
288
- * renderables under their light-view + light-proj and writes the depth-32-float
289
- * target consumed by `addScenePass.reads`.
290
- */
291
- export function addShadowPass(
292
- graph: RenderGraph<RenderPipelineContext>,
293
- name: string,
294
- opts: AddShadowPassOptions,
295
- ): void {
296
- const cascadeIndex = opts.cascadeIndex ?? 0;
297
- graph.addPass(name, {
298
- reads: [],
299
- writes: [opts.depth],
300
- execute: (c: RenderPipelineContext) =>
301
- recordShadowPass(
302
- c as Parameters<typeof recordShadowPass>[0],
303
- opts.selector,
304
- opts.viewport,
305
- cascadeIndex,
306
- ),
307
- });
308
- }
309
-
310
- /**
311
- * feat-20260612-point-light-shadows-urp-hdrp M3 / T-M3-4 (plan-strategy §D-1
312
- * + AC-04 + AC-09). Render the 6 x N point-light shadow caster passes into
313
- * the cube_array atlas owned by `frameState.pointShadowAtlas`. Implementation
314
- * detail: `recordPointShadowPass` (package-private) iterates
315
- * `frameState.pointShadowSnapshots` and emits one independent render pass
316
- * per (layer, face), opening / submitting each on its own command encoder
317
- * (RD-4 manual barrier between depth-write and the URP forward pass's
318
- * cube_array sample).
319
- *
320
- * Resource model: the cube_array atlas is a runtime-owned resource (NOT a
321
- * graph color target) because its size is `4 * 6 * faceSize^2` and per-face
322
- * 2D views must be created with explicit `baseArrayLayer` indexing — the
323
- * existing `addColorTarget` vocabulary is single-attachment-only. The pass
324
- * therefore declares no `writes` (the dependency between this pass and the
325
- * URP forward pass is enforced by the `addScenePass.reads` order — both
326
- * sample shadowAtlas, and graph declaration order keeps shadow before
327
- * forward). A future render-graph extension may model the cube_array as a
328
- * first-class resource; for now the manual command-encoder boundary is the
329
- * synchronization point.
330
- *
331
- * AC-09 zero-shadow zero-pass: the URP `buildGraph` gates the call to
332
- * `addPointShadowPass` on `frameState.pointShadowSnapshots.length > 0` so
333
- * the graph itself never declares the pass when no PointLightShadow exists.
334
- * `recordPointShadowPass` re-checks at execute time as defence in depth.
335
- */
336
- export function addPointShadowPass(graph: RenderGraph<RenderPipelineContext>, name: string): void {
337
- graph.addPass(name, {
338
- reads: [],
339
- writes: [],
340
- execute: recordPointShadowPass as (c: RenderPipelineContext) => void,
341
- });
342
- }
343
-
344
- export interface AddSpotShadowPassOptions {
345
- /** Graph depth target (depth32float 2x2 tile atlas) the spot casters write. */
346
- readonly depth: string;
347
- }
348
-
349
- /**
350
- * feat-20260625-spot-light-shadow-mapping M2 / w9 + w11 (D-1 + D-2). Render the
351
- * spot-light shadow caster passes into the graph-owned `spotShadowDepth` atlas
352
- * (a single 2D depth32float texture of 2x2 tiles — NOT a 2d-array). One graph
353
- * pass NODE; the execute closure (`recordSpotShadowPass`) loops the per-frame
354
- * `frameState.spotShadowSnapshots`, rendering each castShadow spot's perspective
355
- * depth into its tile (viewport keyed on `shadowAtlasTile`) with first-tile
356
- * clear / rest load (independent of the directional cascadeIndex; D-2). Unlike
357
- * `addPointShadowPass` the spot atlas IS a graph color target, so the pass
358
- * declares `writes: [opts.depth]` — `addScenePass.reads` lists the same key to
359
- * order spot-shadow -> main. The single-node-with-internal-loop shape keeps the
360
- * memoized graph from rebuilding on spot-count drift (AC-03 zero-spot scenes
361
- * record zero passes via the early-return inside recordSpotShadowPass).
362
- */
363
- export function addSpotShadowPass(
364
- graph: RenderGraph<RenderPipelineContext>,
365
- name: string,
366
- opts: AddSpotShadowPassOptions,
367
- ): void {
368
- graph.addPass(name, {
369
- reads: [],
370
- writes: [opts.depth],
371
- execute: recordSpotShadowPass as (c: RenderPipelineContext) => void,
372
- });
373
- }
374
-
375
- export interface AddSkyboxPassOptions {
376
- /** Graph colour target the skybox writes (typically the same target the scene pass writes). */
377
- readonly color: string;
378
- }
379
-
380
- /**
381
- * Render a skybox cube into the declared colour target. Implementation detail:
382
- * `recordSkyboxPass` (package-private) emits a single cube draw with a
383
- * skybox-view matrix derived from the camera. Writes `opts.color` so the
384
- * scene pass can declare it under `reads` to enforce skybox -> main order.
385
- */
386
- export function addSkyboxPass(
387
- graph: RenderGraph<RenderPipelineContext>,
388
- name: string,
389
- opts: AddSkyboxPassOptions,
390
- ): void {
391
- graph.addPass(name, {
392
- reads: [],
393
- writes: [opts.color],
394
- execute: recordSkyboxPass as (c: RenderPipelineContext) => void,
395
- });
396
- }
397
-
398
- export interface AddBloomPassesOptions {
399
- /** HDR colour target the bright-extract reads + the composite reads back. */
400
- readonly hdrColor: string;
401
- /** Logical key the composite WRITES (typically an alias of hdrColor). */
402
- readonly hdrComposited: string;
403
- /** Half-res bright target. */
404
- readonly bright: string;
405
- /** Half-res H blur target. */
406
- readonly blurH: string;
407
- /** Half-res V blur target. */
408
- readonly blurV: string;
409
- }
410
-
411
- /**
412
- * Wire the 4-pass bloom chain (bright -> blur-h -> blur-v -> composite). All
413
- * intermediate targets are half-resolution; the composite reads hdrColor +
414
- * blurV and writes the alias `hdrComposited` (declared via
415
- * `g.addColorTargetAlias` to fold onto the actual hdrColor texture, KB-1).
416
- */
417
- export function addBloomPasses(
418
- graph: RenderGraph<RenderPipelineContext>,
419
- opts: AddBloomPassesOptions,
420
- ): void {
421
- graph.addPass('bloom-bright', {
422
- reads: [opts.hdrColor],
423
- writes: [opts.bright],
424
- colorConnections: [{ source: opts.hdrColor, destination: opts.bright }],
425
- execute: recordBloomBrightPass as (c: RenderPipelineContext) => void,
426
- });
427
- graph.addPass('bloom-blur-h', {
428
- reads: [opts.bright],
429
- writes: [opts.blurH],
430
- colorConnections: [{ source: opts.bright, destination: opts.blurH }],
431
- execute: recordBloomBlurHPass as (c: RenderPipelineContext) => void,
432
- });
433
- graph.addPass('bloom-blur-v', {
434
- reads: [opts.blurH],
435
- writes: [opts.blurV],
436
- colorConnections: [{ source: opts.blurH, destination: opts.blurV }],
437
- execute: recordBloomBlurVPass as (c: RenderPipelineContext) => void,
438
- });
439
- graph.addPass('bloom-composite', {
440
- reads: [opts.hdrColor, opts.blurV],
441
- writes: [opts.hdrComposited],
442
- colorConnections: [
443
- { source: opts.hdrColor, destination: opts.hdrComposited },
444
- { source: opts.blurV, destination: opts.hdrComposited },
445
- ],
446
- execute: recordBloomCompositePass as (c: RenderPipelineContext) => void,
447
- });
448
- }
449
-
450
- /**
451
- * feat-20260612-hdrp-ssao M3 / w15: SSAO pass parameters.
452
- *
453
- * Defaults: radius=0.5, bias=0.025, intensity=1.0.
454
- * Non-positive radius or negative bias triggers fail-fast PostProcessError
455
- * inside the per-frame record closure (w16 boundary impl).
456
- */
457
- export interface AddSsaoPassesParams {
458
- /** SSAO sample radius in view-space units (default 0.5). */
459
- readonly radius?: number | undefined;
460
- /** SSAO depth bias to avoid self-occlusion (default 0.025). */
461
- readonly bias?: number | undefined;
462
- /** SSAO intensity blend factor (default 1.0). */
463
- readonly intensity?: number | undefined;
464
- }
465
-
466
- export type { ResolvedSsaoParameters, SsaoParameterConfig } from './ssao-config';
467
-
468
- /**
469
- * Options for `addSsaoPasses` (plan-strategy D-5, D-2).
470
- *
471
- * The caller (hdrp-pipeline.buildGraph) declares the color targets
472
- * (ssaoRaw / ssaoBlurred as half-swapchain r8unorm) and passes their
473
- * graph resource keys here. `gbuf0` and `hdrDepth` are g-buffer
474
- * resources declared by the pipeline.
475
- */
476
- export interface AddSsaoPassesOptions {
477
- /** G-buffer RT0 (normal.rgb + roughness.a), rgba16float, swapchain. */
478
- readonly gbuf0: string;
479
- /** Hardware depth target, depth24plus-stencil8, swapchain. */
480
- readonly hdrDepth: string;
481
- /** SSAO calc output: half-res r8unorm transient target. */
482
- readonly ssaoRaw: string;
483
- /** SSAO blur output: half-res r8unorm transient target. */
484
- readonly ssaoBlurred: string;
485
- /** SSAO parameters (radius, bias, intensity). */
486
- readonly params?: AddSsaoPassesParams | undefined;
487
- /** Pipeline context for lazy SSAO buffer resolution. */
488
- readonly ctx: RenderPipelineContext;
489
- }
490
-
491
- /**
492
- * Wire the 2-pass SSAO chain (calc -> blur) into the render graph.
493
- *
494
- * plan-strategy D-2: exactly 2 pass (ssao-calc + ssao-blur).
495
- * plan-strategy D-4: g-buffer missing -> graph-level skip.
496
- * plan-strategy D-5: signature matches addBloomPasses pattern.
497
- *
498
- * ssao-calc: reads gbuf0 + hdrDepth + ssao-noise + ssao-kernel + ssao-uniform,
499
- * writes ssaoRaw (half-res r8unorm).
500
- * ssao-blur: reads ssaoRaw, writes ssaoBlurred (half-res r8unorm).
501
- *
502
- * Fail-fast: when SSAO buffers are unavailable (g-buffer not declared or
503
- * kernel/noise generation fails), the
504
- * function returns without wiring any pass nodes (graph-level skip).
505
- * Param validation happens in the record closure (w16 boundary impl).
506
- */
507
- export function addSsaoPasses(
508
- graph: RenderGraph<RenderPipelineContext>,
509
- opts: AddSsaoPassesOptions,
510
- ): void {
511
- const ctx = opts.ctx as _InternalRenderPipelineContext;
512
-
513
- // plan-strategy D-4: g-buffer missing -> graph-level skip.
514
- // Check that gbuf0 + hdrDepth are declared as graph color targets.
515
- const resources = graph.listResources();
516
- const hasGbuf0 = resources.some((r) => r.key === opts.gbuf0);
517
- const hasHdrDepth = resources.some((r) => r.key === opts.hdrDepth);
518
- if (!hasGbuf0 || !hasHdrDepth) {
519
- return;
520
- }
25
+ import { computeProjectionMatrix, computeViewMatrix } from './record/helpers';
26
+ import { getOrCreateFromChain } from './record/mesh-ssbo';
27
+ import type { _InternalRenderPipelineContext } from './record/render-context';
28
+ import { recordFxaaPass } from './record/skybox-post-pass';
29
+ import type { RenderPipelineContext } from './render-contract';
30
+ import { getOrCreateSsaoBuffers, getOrCreateSsaoFallbackTexture } from './ssao-buffers';
31
+ import { getSsaoParameters } from './ssao-config';
32
+
33
+ type DepthResolutionContext = Pick<_InternalRenderPipelineContext, 'runtime'> & {
34
+ readonly frameState: {
35
+ readonly perFrameGraph?: {
36
+ readonly getColorTargetTexture: (key: string) => Texture | undefined;
37
+ } | null;
38
+ };
39
+ };
40
+
41
+ type RenderGraphRecordContext = _InternalRenderPipelineContext & {
42
+ readonly frameState: _InternalRenderPipelineContext['frameState'] & {
43
+ readonly perFrameGraph?: {
44
+ readonly getColorTargetDescriptor: (
45
+ key: string,
46
+ ) => { readonly format: TextureFormat } | undefined;
47
+ readonly getColorTargetView: (key: string) => TextureView | undefined;
48
+ readonly getColorTargetTexture: (key: string) => Texture | undefined;
49
+ } | null;
50
+ };
51
+ };
521
52
 
522
- // Check SSAO buffers are available (allocation only; the kernel is a UBO so
523
- // this path is valid on WebGL2).
524
- const ssaoBufs = getOrCreateSsaoBuffers(ctx.runtime);
525
- if (ssaoBufs === null) {
526
- return;
53
+ function requireRenderGraphRecordContext(ctx: RenderPipelineContext): RenderGraphRecordContext {
54
+ if (!('frameState' in ctx) || !('bindGroupCounts' in ctx) || !('geometryDepthKey' in ctx)) {
55
+ throw new Error('typed render graph frame lacks the built-in record context');
527
56
  }
528
-
529
- // Validate parameters (fail-fast on illegal values).
530
- const params = resolveSsaoParameters(opts.params);
531
- if (!params.ok) throw params.error;
532
-
533
- // Pass 1: SSAO calculation — fullscreen pass that samples g-buffer
534
- // RT0 + depth, computes 64-sample hemisphere occlusion, writes
535
- // single-channel R8 result to half-resolution target.
536
- // Kernel SSBO / noise texture / uniform UBO are runtime-owned
537
- // (getOrCreateSsaoBuffers) and bound at record time, not
538
- // through the graph resource system.
539
- graph.addPass('ssao-calc', {
540
- reads: [opts.gbuf0, opts.hdrDepth],
541
- writes: [opts.ssaoRaw],
542
- execute: (_c: RenderPipelineContext, resolveCtx?: ResolveContext) => {
543
- const internalCtx = _c as _InternalRenderPipelineContext;
544
- recordSsaoCalcPass(
545
- internalCtx,
546
- resolveCtx,
547
- opts.ssaoRaw,
548
- opts.gbuf0,
549
- opts.hdrDepth,
550
- undefined,
551
- undefined,
552
- params.value,
553
- );
554
- },
555
- });
556
-
557
- // Pass 2: SSAO blur — fullscreen pass that reads the half-res R8
558
- // ssaoRaw texture, applies a 4x4 box blur (16 taps), writes the
559
- // blurred result to ssaoBlurred.
560
- //
561
- // M8 / w38: gbuf0 + hdrDepth declared as reads even though the blur
562
- // shader does not sample them. Reason: the SSAO BGL is shared with the
563
- // calc pass (9 entries 0-8); WebGPU requires every BGL slot to carry a
564
- // valid resource, so the blur bind group must bind real gbuffer_normal +
565
- // hdr_depth views at slots 4 + 5 — declaring them as graph reads is the
566
- // mechanism that makes resolveCtx return their views here.
567
- graph.addPass('ssao-blur', {
568
- reads: [opts.ssaoRaw, opts.gbuf0, opts.hdrDepth],
569
- writes: [opts.ssaoBlurred],
570
- execute: (_c: RenderPipelineContext, resolveCtx?: ResolveContext) => {
571
- const internalCtx = _c as _InternalRenderPipelineContext;
572
- recordSsaoBlurPass(
573
- internalCtx,
574
- resolveCtx,
575
- opts.ssaoBlurred,
576
- opts.ssaoRaw,
577
- opts.gbuf0,
578
- opts.hdrDepth,
579
- );
580
- },
581
- });
57
+ return ctx as RenderGraphRecordContext;
582
58
  }
583
59
 
584
- /**
585
- * Lazy-allocate the three constant SSAO record companions the first time the
586
- * calc / blur closure runs: a filtering sampler (binding 3 + 8), a
587
- * non-filtering depth sampler (binding 6, paired with hdr_depth — WebGPU
588
- * validation rejects depth + filtering), and a 1x1 r8unorm fallback view bound
589
- * at ssaoRaw (binding 7) in the calc pass (the calc shader never samples
590
- * ssaoRaw, but the BGL still requires a valid view).
591
- *
592
- * Returns null if any underlying allocation fires a structured error onto
593
- * runtime.errorRegistry; the caller then skips the pass.
594
- */
595
60
  /**
596
61
  * Resolve a depth-only view of a graph color target by key.
597
62
  *
@@ -606,18 +71,12 @@ export function addSsaoPasses(
606
71
  * or creation fires a structured error
607
72
  */
608
73
  export function resolveDepthOnlyView(
609
- internals: _InternalRenderPipelineContext,
74
+ internals: DepthResolutionContext,
610
75
  key: string,
611
76
  label: string,
612
77
  preferredKey?: string | null,
613
78
  ): TextureView | null {
614
- const graph = (
615
- internals.frameState as unknown as {
616
- readonly perFrameGraph?: {
617
- getColorTargetTexture(key: string): unknown;
618
- } | null;
619
- }
620
- ).perFrameGraph;
79
+ const graph = internals.frameState.perFrameGraph;
621
80
  if (graph === null || graph === undefined) return null;
622
81
  const preferredTexture =
623
82
  preferredKey === null || preferredKey === undefined
@@ -650,7 +109,7 @@ export function resolveDepthOnlyView(
650
109
  * untouched (OOS-4).
651
110
  */
652
111
  function resolveHdrDepthDepthOnlyView(
653
- internals: _InternalRenderPipelineContext,
112
+ internals: DepthResolutionContext,
654
113
  hdrDepthKey: string,
655
114
  ): TextureView | null {
656
115
  return resolveDepthOnlyView(internals, hdrDepthKey, 'ssao-hdr-depth-only-view');
@@ -727,19 +186,16 @@ function ensureSsaoRecordCompanions(internals: _InternalRenderPipelineContext):
727
186
  }
728
187
 
729
188
  /**
730
- * Pack the 256B SSAO uniform payload from the camera + config.ssao.intensity.
189
+ * Pack the 256B SSAO uniform payload from the camera + config.ssao.
731
190
  *
732
191
  * Layout (plan-strategy D-1 + D-C):
733
192
  * floats [0..15] view mat4
734
193
  * floats [16..31] projection mat4
735
194
  * floats [32..47] inverseProjection mat4
736
- * floats [48..51] intensityPad vec4 (x=intensity, yzw=0 padding)
195
+ * floats [48..51] intensityPad vec4 (x=intensity, y=radius, z=bias)
737
196
  * floats [52..63] trailing zero-pad to round to 256B / 64f UBO alignment.
738
197
  */
739
- function buildSsaoUniformPayload(
740
- internals: _InternalRenderPipelineContext,
741
- parameters?: ResolvedSsaoParameters,
742
- ): Float32Array {
198
+ function buildSsaoUniformPayload(internals: _InternalRenderPipelineContext): Float32Array {
743
199
  const { camera, frameState } = internals;
744
200
  const sProj = computeProjectionMatrix(camera);
745
201
  const sView = computeViewMatrix(camera);
@@ -747,19 +203,17 @@ function buildSsaoUniformPayload(
747
203
  mat4.invert(invProj, sProj);
748
204
 
749
205
  const out = new Float32Array(64);
750
- out.set(sView as unknown as Float32Array, 0);
751
- out.set(sProj as unknown as Float32Array, 16);
752
- out.set(invProj as unknown as Float32Array, 32);
206
+ out.set(sView, 0);
207
+ out.set(sProj, 16);
208
+ out.set(invProj, 32);
753
209
 
754
210
  const ssaoConfig = frameState.installedPipelineConfig?.ssao;
755
- const resolved =
756
- parameters ??
757
- getSsaoParameters(
758
- ssaoConfig !== undefined && ssaoConfig.enabled === true ? ssaoConfig : undefined,
759
- );
760
- out[48] = resolved.intensity;
761
- out[49] = resolved.radius;
762
- out[50] = resolved.bias;
211
+ const parameters = getSsaoParameters(
212
+ ssaoConfig !== undefined && ssaoConfig.enabled === true ? ssaoConfig : undefined,
213
+ );
214
+ out[48] = parameters.intensity;
215
+ out[49] = parameters.radius;
216
+ out[50] = parameters.bias;
763
217
  return out;
764
218
  }
765
219
 
@@ -798,7 +252,6 @@ export function recordSsaoCalcPass(
798
252
  hdrDepthKey?: string,
799
253
  graphPass?: RhiRenderPassEncoder,
800
254
  graphViews?: SsaoCalcPassViews,
801
- parameters?: ResolvedSsaoParameters,
802
255
  ): void {
803
256
  const { runtime, pipelineState, encoder } = _c;
804
257
  const pp = pipelineState.perPassResources;
@@ -854,7 +307,7 @@ export function recordSsaoCalcPass(
854
307
 
855
308
  // Per-frame uniform write (D-C: view+proj+invProj+intensity at one queue
856
309
  // call). 256 B Float32Array (64 f32) lands in ssao_uniform UBO offset 0.
857
- const payload = buildSsaoUniformPayload(_c, parameters);
310
+ const payload = buildSsaoUniformPayload(_c);
858
311
  const writeRes = runtime.device.queue.writeBuffer(ssaoBufs.uniformBuffer, 0, payload);
859
312
  if (!writeRes.ok) {
860
313
  runtime.errorRegistry.fire(writeRes.error);
@@ -872,7 +325,7 @@ export function recordSsaoCalcPass(
872
325
  const ssaoBgl = pp.ssaoBgl;
873
326
  const bindGroup = getOrCreateFromChain(
874
327
  _c.frameState.postProcessBgCache,
875
- [gbuf0View as unknown as object, hdrDepthPooledView as unknown as object],
328
+ [gbuf0View, hdrDepthPooledView],
876
329
  'ssao-calc',
877
330
  () => {
878
331
  const bgRes = runtime.device.createBindGroup({
@@ -996,7 +449,7 @@ export function recordSsaoBlurPass(
996
449
  // the calc pass): WebGPU requires every BGL slot carry a valid resource
997
450
  // even when the active fragment entry does not statically reference it.
998
451
  // gbuf0 + hdr_depth views are resolved from the graph; they must exist
999
- // because addSsaoPasses declares them as `reads` on the blur node.
452
+ // because the typed SSAO graph declares them as reads on the blur node.
1000
453
  if (gbuf0View === undefined || hdrDepthView === null || hdrDepthPooledView === undefined) return;
1001
454
  // Identity-cached bind group keyed on the graph-pooled ssaoRaw + gbuf0 +
1002
455
  // hdrDepth views (all retire + reallocate on resize). Replaces the prior
@@ -1004,11 +457,7 @@ export function recordSsaoBlurPass(
1004
457
  const ssaoBgl = pp.ssaoBgl;
1005
458
  const bindGroup = getOrCreateFromChain(
1006
459
  _c.frameState.postProcessBgCache,
1007
- [
1008
- ssaoRawView as unknown as object,
1009
- gbuf0View as unknown as object,
1010
- hdrDepthPooledView as unknown as object,
1011
- ],
460
+ [ssaoRawView, gbuf0View, hdrDepthPooledView],
1012
461
  'ssao-blur',
1013
462
  () => {
1014
463
  const bgRes = runtime.device.createBindGroup({
@@ -1050,199 +499,6 @@ export function recordSsaoBlurPass(
1050
499
  if (graphPass === undefined) pass.end();
1051
500
  }
1052
501
 
1053
- export interface AddTonemapPassOptions {
1054
- /** Logical HDR resource tonemap reads when bloom is on (the bloom composite output). */
1055
- readonly hdrComposited: string;
1056
- /**
1057
- * Logical HDR resource tonemap reads when bloom is OFF (the bloom composite
1058
- * pass is gated off and never writes hdrComposited). Defaults to
1059
- * `hdrComposited` for pipelines where the two are the same texture (e.g.
1060
- * HDRP passes `hdrColor` for both). URP passes `hdrColor` here so that with
1061
- * bloom off, tonemap reads the main-rendered scene directly instead of an
1062
- * unwritten hdrComposited target (bug-20260625).
1063
- */
1064
- readonly hdrColorWhenBloomOff?: string;
1065
- /** Logical LDR output; defaults to the swap-chain. */
1066
- readonly color?: string;
1067
- /** Run the final linear-LDR -> display-encoded output without tone mapping. */
1068
- readonly outputOnly?: boolean;
1069
- }
1070
-
1071
- /**
1072
- * Reserved post-process id for the engine built-in tonemap (feat-20260621 M-A3
1073
- * / D-5). Registered at boot via `postProcess.register(TONEMAP_POST_PROCESS_ID,
1074
- * { source, params })`; the extract stage bridges `Camera.exposure / whitePoint
1075
- * / tonemap` onto the params channel under this key (render-system-extract.ts).
1076
- */
1077
- export const TONEMAP_POST_PROCESS_ID = 'forgeax::tonemap';
1078
-
1079
- /**
1080
- * HDR -> LDR tonemap fullscreen pass. feat-20260621 M-A3 (D-5): the built-in
1081
- * tonemap now flows through the SAME unified fullscreen post-process channel as
1082
- * any custom post-process — registered at boot via `postProcess.register(
1083
- * 'forgeax::tonemap', { source, params })`, its exposure/whitePoint/mode bridged
1084
- * onto the per-frame params channel by the extract stage, and dispatched here
1085
- * through `dispatchFullscreenPass`. This wrapper preserves two behaviours the
1086
- * generic `addFullscreenPass` lacks:
1087
- * - the per-frame `tonemapActive` gate (`camera.tonemap === 'none'` ->
1088
- * zero-overhead skip), and
1089
- * - graceful degradation (charter §9) on the empty-manifest path: when
1090
- * `forgeax::tonemap` was never registered (Camera-only world, no manifest)
1091
- * fire a structured `shader-compile-failed` instead of letting the
1092
- * dispatcher throw `post-process-not-found`.
1093
- * The output is a graph resource when FXAA is active, otherwise the reserved
1094
- * `'swapchain'` key resolves to the current surface view.
1095
- */
1096
- export function addTonemapPass(
1097
- graph: RenderGraph<RenderPipelineContext>,
1098
- name: string,
1099
- opts: AddTonemapPassOptions,
1100
- ): void {
1101
- // Declare both potential read sources so validation preserves tonemap after
1102
- // BOTH the composite writer (hdrComposited) and the main writer (hdrColor),
1103
- // regardless of which one the dispatch resolves at record time. resolveCtx
1104
- // exposes every compiled texture, so the runtime pick below always resolves.
1105
- const hdrColorWhenBloomOff = opts.hdrColorWhenBloomOff ?? opts.hdrComposited;
1106
- const tonemapReads =
1107
- hdrColorWhenBloomOff === opts.hdrComposited
1108
- ? [opts.hdrComposited]
1109
- : [opts.hdrComposited, hdrColorWhenBloomOff];
1110
- graph.addPass(name, {
1111
- reads: tonemapReads,
1112
- writes: [opts.color ?? 'swapchain'],
1113
- ...(opts.color !== undefined && opts.color !== 'swapchain'
1114
- ? {
1115
- colorConnections: [
1116
- {
1117
- source: hdrColorWhenBloomOff,
1118
- destination: opts.color,
1119
- conversion: { kind: 'tone-map' as const },
1120
- },
1121
- ],
1122
- }
1123
- : {}),
1124
- execute: (ctx: RenderPipelineContext, resolveCtx?: ResolveContext) => {
1125
- // Tonemap mode `none` still needs the final output encode when the scene
1126
- // was rendered into the graph-owned linear-LDR target.
1127
- if (ctx.camera.tonemap === 'none' && opts.outputOnly !== true) return;
1128
- const registered = ctx.runtime.lookupPostProcess?.(TONEMAP_POST_PROCESS_ID);
1129
- if (registered === undefined) {
1130
- ctx.runtime.errorRegistry.fire(
1131
- new RhiError({
1132
- code: 'shader-compile-failed',
1133
- expected:
1134
- 'manifest entries include pbr.wgsl + unlit.wgsl + tonemap.wgsl (engine SSOT triple)',
1135
- hint: 'verify @forgeax/engine-vite-plugin-shader emits manifest.json with the 3 engine entries; check vite plugin engineEntries option',
1136
- }),
1137
- );
1138
- return;
1139
- }
1140
- // Pick the read source by bloom state: when bloom is on the composite
1141
- // pass wrote hdrComposited; when off it was gated and never ran, so read
1142
- // the main-rendered hdrColor instead (bug-20260625). Same texture for
1143
- // pipelines that pass identical keys (e.g. HDRP).
1144
- const src =
1145
- opts.outputOnly === true
1146
- ? hdrColorWhenBloomOff
1147
- : ctx.camera.bloom === 'on'
1148
- ? opts.hdrComposited
1149
- : hdrColorWhenBloomOff;
1150
- dispatchFullscreenPass(
1151
- ctx,
1152
- name,
1153
- TONEMAP_POST_PROCESS_ID,
1154
- opts.color ?? 'swapchain',
1155
- [src],
1156
- resolveCtx,
1157
- false,
1158
- opts.outputOnly === true,
1159
- );
1160
- },
1161
- });
1162
- }
1163
-
1164
- export interface AddFullscreenPassOptions {
1165
- /**
1166
- * Registered post-process shader id (via renderer.postProcess.register). The
1167
- * built-in `'fxaa'` id is a hardwired dispatcher branch; any other id is an
1168
- * AI-user effect whose WGSL declares `vs_main` + `fs_main` and samples the
1169
- * input at `@group(1) @binding(0)` texture + `@binding(1)` sampler. With
1170
- * `compositeOverSwapchain` this is how an effect layers over URP's final image
1171
- * (see RenderPipelineAsset.config.postEffects).
1172
- */
1173
- readonly shader: string;
1174
- /** Graph resource key the pass writes (intermediate scratch RT for FXAA / the composite scratch). */
1175
- readonly color: string;
1176
- /** Graph resource keys the pass samples. Empty = use the current surface view. */
1177
- readonly reads?: readonly string[] | undefined;
1178
- /**
1179
- * feat-20260621 M4': composite-over-swap-chain mode. When true, the pass
1180
- * copies the CURRENT swap-chain into the `color` scratch target (so the effect
1181
- * samples the already-composited final image), samples that scratch, then
1182
- * writes the result back into the swap-chain through its non-srgb storage view
1183
- * (R-COLORSPACE: the swap-chain is already sRGB-encoded, so writing through the
1184
- * srgb view would double-encode). This is the generalisation of the built-in
1185
- * `'fxaa'` copy idiom to AI-user effects — the mechanism that lets a built-in
1186
- * pipeline layer a registered effect on top of its final image WITHOUT
1187
- * replacing the pipeline (and dropping its shadow / tonemap passes). `color`
1188
- * MUST be a `graph.addColorTarget` declared with the swap-chain storage format
1189
- * + COPY_DST | TEXTURE_BINDING usage (it is both copy dst and sampled input);
1190
- * `reads` stays empty.
1191
- *
1192
- * WebGPU backend only: the mid-frame swap-chain copy + non-srgb storage-view
1193
- * write are not supported on the WebGL2 fallback swap-chain (no COPY_SRC, no
1194
- * non-srgb reinterpret view) — the same constraint `recordFxaaPass` carries.
1195
- */
1196
- readonly compositeOverSwapchain?: boolean | undefined;
1197
- }
1198
-
1199
- /**
1200
- * AC-06 / AC-07: declare a generic fullscreen post-process pass. The shader is
1201
- * looked up from `renderer.postProcess.register(shader, …)`; the primitive
1202
- * builds the input-texture BGL + sampler + pipeline + ping-pong wiring. For
1203
- * the FXAA case the implementation detail is `recordFxaaPass`
1204
- * (package-private), which owns the graph-input-to-surface-output attachment
1205
- * route.
1206
- *
1207
- * If `opts.reads` is empty the pass uses the current surface view (default).
1208
- * Post-processes that read a graph-owned texture
1209
- * (e.g. tonemap rebuilt as a fullscreen pass, OOS-3) will declare reads
1210
- * explicitly.
1211
- *
1212
- * F-3 topology refactor (2026-06-08): the FXAA path now flows through this
1213
- * dispatcher (`addFullscreenPass(g, 'fxaa', ...)` -> `dispatchFullscreenPass` ->
1214
- * `recordFxaaPass`). The two-branch dispatcher is the load-bearing AC-09
1215
- * "FXAA refactored as the first post-process instance" claim: at the
1216
- * topology layer FXAA is a special-cased shader id; at the record layer
1217
- * recordFxaaPass owns the backend-aware output attachment. The
1218
- * dispatcher is extracted as a named function (`dispatchFullscreenPass`)
1219
- * so an AI user reading the per-pass execute closure sees a single call
1220
- * site — the if/else fan-out is in one place, not duplicated across
1221
- * future fullscreen passes.
1222
- */
1223
- export function addFullscreenPass(
1224
- graph: RenderGraph<RenderPipelineContext>,
1225
- name: string,
1226
- opts: AddFullscreenPassOptions,
1227
- ): void {
1228
- const reads = opts.reads ?? [];
1229
- graph.addPass(name, {
1230
- reads,
1231
- writes: [opts.color],
1232
- execute: (ctx: RenderPipelineContext, resolveCtx?: ResolveContext) => {
1233
- dispatchFullscreenPass(
1234
- ctx,
1235
- name,
1236
- opts.shader,
1237
- opts.color,
1238
- reads,
1239
- resolveCtx,
1240
- opts.compositeOverSwapchain ?? false,
1241
- );
1242
- },
1243
- });
1244
- }
1245
-
1246
502
  /**
1247
503
  * F-3 fix-up + feat-20260609 M1 / T-3 patch: per-frame fullscreen-post-process
1248
504
  * dispatcher.
@@ -1255,9 +511,9 @@ export function addFullscreenPass(
1255
511
  * body is intentionally unchanged across this refactor to preserve the
1256
512
  * AC-09 dualPassDiff=1069 (hello-fxaa) / 768 (learn-render-4-10-MSAA)
1257
513
  * byte-equivalence with the pre-feat baseline.
1258
- * - any other id (AI-user path): the M1 patch wires `reads[0]` through the
514
+ * - every other id (AI-user path): the M1 patch wires `reads[0]` through the
1259
515
  * render-graph `resolveCtx` so the bind group samples the upstream
1260
- * graph-owned color target (e.g. `addScenePass` writes `'offscreenColor'`,
516
+ * graph-owned color target (e.g. the typed scene pass writes `'offscreenColor'`,
1261
517
  * a custom post-process pass declares `reads: ['offscreenColor']`).
1262
518
  * Failure modes (charter P3 fail-fast):
1263
519
  * - `lookupPostProcess(shader) === undefined` -> throw
@@ -1277,7 +533,7 @@ export function addFullscreenPass(
1277
533
  * fullscreen-triangle vertex shader.
1278
534
  *
1279
535
  * Extracted from the addPass execute closure so the topology fan-out is in
1280
- * one named place; an AI user reading addFullscreenPass sees the single
536
+ * one named place; the typed graph has a single
1281
537
  * call site, and future post-process branches (e.g. tonemap migrated onto
1282
538
  * this dispatcher per OOS-3) extend this function rather than the addPass
1283
539
  * inline closure.
@@ -1302,7 +558,7 @@ function dispatchFullscreenPass(
1302
558
  detail: { readsKey: reads[0] ?? 'ldrColor', passName: name },
1303
559
  });
1304
560
  }
1305
- recordFxaaPass(ctx as unknown as _InternalRenderPipelineContext, resolveCtx, graphPass);
561
+ recordFxaaPass(requireRenderGraphRecordContext(ctx), resolveCtx, graphPass);
1306
562
  return;
1307
563
  }
1308
564
  const lookup = ctx.runtime.lookupPostProcess;
@@ -1313,7 +569,6 @@ function dispatchFullscreenPass(
1313
569
  detail: { id: shader },
1314
570
  });
1315
571
  }
1316
-
1317
572
  // feat-20260621 M4' composite-over-swap-chain: copy the current swap-chain
1318
573
  // into the `color` scratch target BEFORE sampling, so the effect reads the
1319
574
  // already-composited final image (shadows + tonemap + fxaa). Generalises the
@@ -1378,7 +633,7 @@ function dispatchFullscreenPass(
1378
633
  let depthTexView: TextureView | null = graphDepthView ?? null;
1379
634
  let depthSampler: Sampler | null = null;
1380
635
  if (entry.reads && entry.reads.length > 0) {
1381
- const internals = ctx as unknown as _InternalRenderPipelineContext;
636
+ const internals = requireRenderGraphRecordContext(ctx);
1382
637
  for (const read of entry.reads) {
1383
638
  if (typeof read !== 'string' && read.sampleType === 'depth') {
1384
639
  const depthKey = read.key;
@@ -1399,20 +654,6 @@ function dispatchFullscreenPass(
1399
654
  }
1400
655
  }
1401
656
 
1402
- const gbufferReadKeys = (entry.reads ?? [])
1403
- .map((read) => (typeof read === 'string' ? read : read.key))
1404
- .filter((key) => key === 'gbuffer-normal-roughness' || key === 'gbuffer-emissive-ao');
1405
- const gbufferViews = gbufferReadKeys.map((key) => {
1406
- const resolved = resolveCtx?.resolve(key);
1407
- if (resolved === undefined) {
1408
- throw new PostProcessError({
1409
- code: 'fullscreen-input-not-found',
1410
- detail: { readsKey: key, passName: name },
1411
- });
1412
- }
1413
- return resolved as TextureView;
1414
- });
1415
-
1416
657
  // feat-20260621 M4' composite-over-swap-chain write target: the swap-chain's
1417
658
  // NON-srgb storage view (R-COLORSPACE — the scratch holds an already-sRGB-
1418
659
  // encoded copy, so writing through the srgb view would double-encode; mirrors
@@ -1424,7 +665,7 @@ function dispatchFullscreenPass(
1424
665
  // the swap-chain path uses the backend-selected surface view format.
1425
666
  let writeFormat = ctx.pipelineState?.colorAttachmentFormat ?? 'rgba8unorm-srgb';
1426
667
  if (graphPass !== undefined) {
1427
- writeView = (resolveCtx?.resolve(color) as TextureView | undefined) ?? ctx.view;
668
+ writeView = ctx.view;
1428
669
  writeFormat = graphOutputFormat ?? writeFormat;
1429
670
  } else if (rawSwapchainOutput && color === 'swapchain') {
1430
671
  const rawViewRes = ctx.runtime.device.createTextureView(ctx.currentTexture, {});
@@ -1443,17 +684,7 @@ function dispatchFullscreenPass(
1443
684
  writeView = storageViewRes.value;
1444
685
  writeFormat = ctx.pipelineState?.format ?? 'rgba8unorm';
1445
686
  } else {
1446
- const internalCtx = ctx as unknown as Partial<_InternalRenderPipelineContext>;
1447
- const legacyGraph = (
1448
- internalCtx.frameState as unknown as
1449
- | {
1450
- readonly perFrameGraph?: {
1451
- getColorTargetDescriptor(key: string): { readonly format: string } | undefined;
1452
- getColorTargetView(key: string): TextureView | undefined;
1453
- } | null;
1454
- }
1455
- | undefined
1456
- )?.perFrameGraph;
687
+ const legacyGraph = requireRenderGraphRecordContext(ctx).frameState.perFrameGraph;
1457
688
  const graphColorFormat = legacyGraph?.getColorTargetDescriptor(color)?.format;
1458
689
  if (graphColorFormat !== undefined) writeFormat = graphColorFormat;
1459
690
  const resolvedColor = (resolveCtx?.resolve(color) as TextureView | undefined) ?? null;
@@ -1502,15 +733,13 @@ function dispatchFullscreenPass(
1502
733
  paramsBuffer,
1503
734
  depthTexView,
1504
735
  depthSampler,
1505
- gbufferViews[0] ?? null,
1506
- gbufferViews[1] ?? null,
1507
736
  );
1508
737
  if (bindGroup === null) return;
1509
738
 
1510
739
  // Pipeline source-of-truth (M4 / T-10-a, solving M1 CONCERN-1):
1511
740
  // RenderSystemRuntime.getPostProcessPipeline is the sync wrapper over the
1512
741
  // shared shader-module adapter (1-frame warmup). First frame after
1513
- // postProcess.register: shader compile is in flight -> returns null -> we
742
+ // fullscreen effect registration: shader compile is in flight -> returns null -> we
1514
743
  // skip the pass for that frame. Second frame onward: cached pipeline is
1515
744
  // returned synchronously.
1516
745
  //
@@ -1521,9 +750,11 @@ function dispatchFullscreenPass(
1521
750
  // tonemap -> FXAA), while preserving the native surface storage/sRGB split.
1522
751
  const lookupPipeline = ctx.runtime.getPostProcessPipeline;
1523
752
  if (lookupPipeline === undefined) return;
1524
- const postColorFormat = writeFormat as unknown as GPUTextureFormat;
753
+ const postColorFormat = writeFormat;
1525
754
  const pipeline = lookupPipeline(shader, built.bindGroupLayout, postColorFormat);
1526
- if (pipeline === null) return;
755
+ if (pipeline === null) {
756
+ return;
757
+ }
1527
758
  const handle = built.createHandle(name, pipeline, paramsBuffer);
1528
759
 
1529
760
  // Open a render pass writing into the resolved color target. Fullscreen
@@ -1537,7 +768,7 @@ function dispatchFullscreenPass(
1537
768
  ctx.encoder.beginRenderPass(
1538
769
  buildBeginRenderPassDescriptor(
1539
770
  {
1540
- colorFormats: [writeFormat as unknown as GPUTextureFormat],
771
+ colorFormats: [writeFormat],
1541
772
  depthFormat: undefined,
1542
773
  sampleCount: 1,
1543
774
  },
@@ -1545,12 +776,6 @@ function dispatchFullscreenPass(
1545
776
  'post-process',
1546
777
  ) as never,
1547
778
  );
1548
- if (
1549
- /@group\(0\)\s*@binding\(0\)\s*var<uniform>\s+view\b/.test(entry.source) &&
1550
- ctx.viewBindGroup
1551
- ) {
1552
- pass.setBindGroup(0, ctx.viewBindGroup);
1553
- }
1554
779
  pass.setBindGroup(1, bindGroup);
1555
780
  handle.draw(pass, inputView);
1556
781
  if (graphPass === undefined) pass.end();