@forgeax/engine-render 0.1.28 → 0.1.30

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 (768) hide show
  1. package/README.md +856 -126
  2. package/dist/assembly/atmosphere-shader-prewarm.d.ts +6 -0
  3. package/dist/assembly/atmosphere-shader-prewarm.d.ts.map +1 -0
  4. package/dist/assembly/device-feature-admission.d.ts +4 -3
  5. package/dist/assembly/device-feature-admission.d.ts.map +1 -1
  6. package/dist/assembly/dynamic-geometry-host.d.ts +27 -0
  7. package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
  8. package/dist/assembly/dynamic-geometry-runtime.d.ts +20 -0
  9. package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -0
  10. package/dist/assembly/factory.d.ts +3 -1
  11. package/dist/assembly/factory.d.ts.map +1 -1
  12. package/dist/assembly/gpu-driven-owner.d.ts +10 -0
  13. package/dist/assembly/gpu-driven-owner.d.ts.map +1 -0
  14. package/dist/assembly/host-contract.d.ts +14 -0
  15. package/dist/assembly/host-contract.d.ts.map +1 -1
  16. package/dist/assembly/material/assembly.d.ts +31 -1
  17. package/dist/assembly/material/assembly.d.ts.map +1 -1
  18. package/dist/assembly/material/pipeline-helpers.d.ts +24 -0
  19. package/dist/assembly/material/pipeline-helpers.d.ts.map +1 -0
  20. package/dist/assembly/material-shader-policy.d.ts +3 -1
  21. package/dist/assembly/material-shader-policy.d.ts.map +1 -1
  22. package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -1
  23. package/dist/assembly/recovery/failure-location.d.ts +12 -0
  24. package/dist/assembly/recovery/failure-location.d.ts.map +1 -0
  25. package/dist/assembly/recovery/recovery-attempt.d.ts +1 -6
  26. package/dist/assembly/recovery/recovery-attempt.d.ts.map +1 -1
  27. package/dist/assembly/recovery/renderer-recover.d.ts +7 -4
  28. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  29. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  30. package/dist/assembly/renderer-feature-inspection.d.ts +5 -0
  31. package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -0
  32. package/dist/assembly/renderer-frame-transaction.d.ts +19 -0
  33. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  34. package/dist/assembly/renderer-helpers.d.ts +3 -0
  35. package/dist/assembly/renderer-helpers.d.ts.map +1 -1
  36. package/dist/assembly/renderer-inspection.d.ts +4 -0
  37. package/dist/assembly/renderer-inspection.d.ts.map +1 -1
  38. package/dist/assembly/shader-prewarm-policy.d.ts +7 -1
  39. package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -1
  40. package/dist/assembly/skin-palette-owner.d.ts +8 -0
  41. package/dist/assembly/skin-palette-owner.d.ts.map +1 -0
  42. package/dist/assembly/ssr-shader-prewarm.d.ts +6 -0
  43. package/dist/assembly/ssr-shader-prewarm.d.ts.map +1 -0
  44. package/dist/assembly/webgpu-device-loss.d.ts +15 -0
  45. package/dist/assembly/webgpu-device-loss.d.ts.map +1 -0
  46. package/dist/assembly/webgpu-pbr-ready.d.ts +38 -0
  47. package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -0
  48. package/dist/assembly/webgpu-ready-mipmap.d.ts +11 -0
  49. package/dist/assembly/webgpu-ready-mipmap.d.ts.map +1 -0
  50. package/dist/assembly/webgpu-ready.d.ts +7 -3
  51. package/dist/assembly/webgpu-ready.d.ts.map +1 -1
  52. package/dist/assembly/webgpu-renderer-bootstrap.d.ts +10 -0
  53. package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -0
  54. package/dist/assembly/webgpu-renderer-contract.d.ts +62 -0
  55. package/dist/assembly/webgpu-renderer-contract.d.ts.map +1 -0
  56. package/dist/assembly/webgpu-renderer-guards.d.ts +9 -0
  57. package/dist/assembly/webgpu-renderer-guards.d.ts.map +1 -0
  58. package/dist/assembly/webgpu-renderer-observation.d.ts +6 -0
  59. package/dist/assembly/webgpu-renderer-observation.d.ts.map +1 -0
  60. package/dist/assembly/webgpu-renderer-recovery-failure.d.ts +12 -0
  61. package/dist/assembly/webgpu-renderer-recovery-failure.d.ts.map +1 -0
  62. package/dist/assembly/webgpu-renderer.d.ts +7 -141
  63. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  64. package/dist/assembly/webgpu-vertex-layouts.d.ts +28 -84
  65. package/dist/assembly/webgpu-vertex-layouts.d.ts.map +1 -1
  66. package/dist/authoring.mjs +2 -2
  67. package/dist/capture/scene-projection.d.ts +41 -0
  68. package/dist/capture/scene-projection.d.ts.map +1 -0
  69. package/dist/{chunk-J52NMQKR.mjs → chunk-7MQ3XBSP.mjs} +1098 -844
  70. package/dist/chunk-7MQ3XBSP.mjs.map +1 -0
  71. package/dist/{chunk-GF523LHF.mjs → chunk-BLXGONR2.mjs} +30 -12
  72. package/dist/chunk-BLXGONR2.mjs.map +1 -0
  73. package/dist/{chunk-VSL23LZE.mjs → chunk-C3DDSXYK.mjs} +1188 -463
  74. package/dist/chunk-C3DDSXYK.mjs.map +1 -0
  75. package/dist/{chunk-IQMKJLNU.mjs → chunk-FUUO4UND.mjs} +443 -30
  76. package/dist/chunk-FUUO4UND.mjs.map +1 -0
  77. package/dist/{chunk-J6KACNOH.mjs → chunk-JRBDO2KB.mjs} +617 -7
  78. package/dist/chunk-JRBDO2KB.mjs.map +1 -0
  79. package/dist/{chunk-GE3SDD72.mjs → chunk-MDQJPY3T.mjs} +20 -40
  80. package/dist/chunk-MDQJPY3T.mjs.map +1 -0
  81. package/dist/{chunk-MYJ5RPJO.mjs → chunk-NO4WZCAH.mjs} +3 -3
  82. package/dist/chunk-NO4WZCAH.mjs.map +1 -0
  83. package/dist/{chunk-RBDBZ5R7.mjs → chunk-PA5DRJNI.mjs} +2 -2
  84. package/dist/chunk-PA5DRJNI.mjs.map +1 -0
  85. package/dist/{chunk-MBU4ZVE7.mjs → chunk-PSEQ6QPH.mjs} +4655 -892
  86. package/dist/chunk-PSEQ6QPH.mjs.map +1 -0
  87. package/dist/{chunk-JAASCMXA.mjs → chunk-S5UE2T5P.mjs} +289 -41
  88. package/dist/chunk-S5UE2T5P.mjs.map +1 -0
  89. package/dist/components/camera.d.ts +62 -2
  90. package/dist/components/camera.d.ts.map +1 -1
  91. package/dist/components/directional-light.d.ts +2 -2
  92. package/dist/components/dynamic-resolution.d.ts +15 -0
  93. package/dist/components/dynamic-resolution.d.ts.map +1 -0
  94. package/dist/components/index.d.ts +2 -0
  95. package/dist/components/index.d.ts.map +1 -1
  96. package/dist/components/instances.d.ts +6 -20
  97. package/dist/components/instances.d.ts.map +1 -1
  98. package/dist/components/light-helpers.d.ts.map +1 -1
  99. package/dist/components/reflection-probe.d.ts +1 -0
  100. package/dist/components/reflection-probe.d.ts.map +1 -1
  101. package/dist/components/scene-instance.d.ts +2 -1
  102. package/dist/components/scene-instance.d.ts.map +1 -1
  103. package/dist/components/screen-space-reflection.d.ts +14 -0
  104. package/dist/components/screen-space-reflection.d.ts.map +1 -0
  105. package/dist/components/skylight.d.ts +4 -1
  106. package/dist/components/skylight.d.ts.map +1 -1
  107. package/dist/construct-renderer.mjs +14809 -7570
  108. package/dist/construct-renderer.mjs.map +1 -1
  109. package/dist/device/device-scope.d.ts +2 -0
  110. package/dist/device/device-scope.d.ts.map +1 -1
  111. package/dist/device/gpu-residency.d.ts +3 -14
  112. package/dist/device/gpu-residency.d.ts.map +1 -1
  113. package/dist/dynamic-geometry.d.ts.map +1 -1
  114. package/dist/environment/background.d.ts +7 -0
  115. package/dist/environment/background.d.ts.map +1 -0
  116. package/dist/environment/ibl.d.ts +11 -0
  117. package/dist/environment/ibl.d.ts.map +1 -0
  118. package/dist/environment/storage.d.ts +14 -0
  119. package/dist/environment/storage.d.ts.map +1 -0
  120. package/dist/errors/gpu-driven.d.ts +6 -3
  121. package/dist/errors/gpu-driven.d.ts.map +1 -1
  122. package/dist/errors/render.d.ts +41 -4
  123. package/dist/errors/render.d.ts.map +1 -1
  124. package/dist/extract/camera.d.ts.map +1 -1
  125. package/dist/extract/contracts.d.ts +7 -0
  126. package/dist/extract/contracts.d.ts.map +1 -1
  127. package/dist/extract/gpu-driven.d.ts +50 -3
  128. package/dist/extract/gpu-driven.d.ts.map +1 -1
  129. package/dist/features/host.d.ts +23 -1
  130. package/dist/features/host.d.ts.map +1 -1
  131. package/dist/features/noise-texture.d.ts +17 -0
  132. package/dist/features/noise-texture.d.ts.map +1 -0
  133. package/dist/features/plan.d.ts +83 -2
  134. package/dist/features/plan.d.ts.map +1 -1
  135. package/dist/features/prepared-gpu-work.d.ts +37 -4
  136. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  137. package/dist/features/prepared-graphics-store.d.ts.map +1 -1
  138. package/dist/features/prepared-graphics.d.ts +5 -0
  139. package/dist/features/prepared-graphics.d.ts.map +1 -1
  140. package/dist/features/render-graph-compute.d.ts +5 -3
  141. package/dist/features/render-graph-compute.d.ts.map +1 -1
  142. package/dist/features/render-graph-contribution.d.ts +11 -3
  143. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  144. package/dist/features/render-graph-raster.d.ts +19 -3
  145. package/dist/features/render-graph-raster.d.ts.map +1 -1
  146. package/dist/features/types.d.ts +11 -0
  147. package/dist/features/types.d.ts.map +1 -1
  148. package/dist/fullscreen-post-process-pass.d.ts +2 -0
  149. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  150. package/dist/gpu-driven/batch-topology.d.ts +34 -1
  151. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  152. package/dist/gpu-driven/material-artifacts.d.ts +24 -0
  153. package/dist/gpu-driven/material-artifacts.d.ts.map +1 -0
  154. package/dist/gpu-driven/material-bindings.d.ts +7 -0
  155. package/dist/gpu-driven/material-bindings.d.ts.map +1 -0
  156. package/dist/gpu-driven/pbr-program.d.ts +10 -0
  157. package/dist/gpu-driven/pbr-program.d.ts.map +1 -0
  158. package/dist/gpu-driven/prepared-draw.d.ts +2 -0
  159. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  160. package/dist/gpu-driven/production-raster.d.ts +169 -27
  161. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  162. package/dist/gpu-driven/shadow-views.d.ts +126 -0
  163. package/dist/gpu-driven/shadow-views.d.ts.map +1 -0
  164. package/dist/gpu-driven/view-gpu.d.ts +18 -2
  165. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  166. package/dist/gpu-resource.d.ts +5 -2
  167. package/dist/gpu-resource.d.ts.map +1 -1
  168. package/dist/gpu-scene-schema.d.ts +2 -8
  169. package/dist/gpu-scene-schema.d.ts.map +1 -1
  170. package/dist/gpu-scene.d.ts +14 -0
  171. package/dist/gpu-scene.d.ts.map +1 -1
  172. package/dist/gpu-texture-usage.d.ts +1 -0
  173. package/dist/gpu-texture-usage.d.ts.map +1 -1
  174. package/dist/hdrp-buffers.d.ts +9 -0
  175. package/dist/hdrp-buffers.d.ts.map +1 -1
  176. package/dist/ibl/IblPipelineCache.d.ts +2 -0
  177. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  178. package/dist/ibl/frame-resources.d.ts +8 -0
  179. package/dist/ibl/frame-resources.d.ts.map +1 -0
  180. package/dist/ibl/skylight-bind-group.d.ts +3 -1
  181. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  182. package/dist/index.d.ts +87 -75
  183. package/dist/index.d.ts.map +1 -1
  184. package/dist/index.mjs +10 -8
  185. package/dist/index.mjs.map +1 -1
  186. package/dist/inspection-types.d.ts +180 -1
  187. package/dist/inspection-types.d.ts.map +1 -1
  188. package/dist/instances-derived-bounds.d.ts +11 -0
  189. package/dist/instances-derived-bounds.d.ts.map +1 -1
  190. package/dist/instances.d.ts +89 -44
  191. package/dist/instances.d.ts.map +1 -1
  192. package/dist/internal.d.ts +3 -0
  193. package/dist/internal.d.ts.map +1 -1
  194. package/dist/internal.mjs +117 -9
  195. package/dist/internal.mjs.map +1 -1
  196. package/dist/lifecycle.d.ts +2 -1
  197. package/dist/lifecycle.d.ts.map +1 -1
  198. package/dist/material-row.d.ts +15 -0
  199. package/dist/material-row.d.ts.map +1 -0
  200. package/dist/materials.d.ts +15 -0
  201. package/dist/materials.d.ts.map +1 -1
  202. package/dist/pbr-pipeline.d.ts +23 -5
  203. package/dist/pbr-pipeline.d.ts.map +1 -1
  204. package/dist/pipeline/render-extent.d.ts +51 -0
  205. package/dist/pipeline/render-extent.d.ts.map +1 -0
  206. package/dist/pipeline/standard-build-context.d.ts +7 -0
  207. package/dist/pipeline/standard-build-context.d.ts.map +1 -0
  208. package/dist/pipeline/standard-forward-lane.d.ts +3 -2
  209. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  210. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts +12 -0
  211. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts.map +1 -0
  212. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts +70 -0
  213. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts.map +1 -0
  214. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts +75 -0
  215. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts.map +1 -0
  216. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts +111 -0
  217. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts.map +1 -0
  218. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts +16 -0
  219. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts.map +1 -0
  220. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts +14 -0
  221. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts.map +1 -0
  222. package/dist/pipeline/standard-output/auto-exposure/state.d.ts +46 -0
  223. package/dist/pipeline/standard-output/auto-exposure/state.d.ts.map +1 -0
  224. package/dist/pipeline/standard-output/color-transform.d.ts +27 -0
  225. package/dist/pipeline/standard-output/color-transform.d.ts.map +1 -0
  226. package/dist/pipeline/standard-output/graph.d.ts +15 -0
  227. package/dist/pipeline/standard-output/graph.d.ts.map +1 -0
  228. package/dist/pipeline/standard-output/lut-admission.d.ts +29 -0
  229. package/dist/pipeline/standard-output/lut-admission.d.ts.map +1 -0
  230. package/dist/pipeline/standard-output/lut-gpu.d.ts +48 -0
  231. package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -0
  232. package/dist/pipeline/standard-output/lut-state.d.ts +68 -0
  233. package/dist/pipeline/standard-output/lut-state.d.ts.map +1 -0
  234. package/dist/pipeline/standard-output/resources.d.ts +10 -0
  235. package/dist/pipeline/standard-output/resources.d.ts.map +1 -0
  236. package/dist/pipeline/standard-output/types.d.ts +39 -0
  237. package/dist/pipeline/standard-output/types.d.ts.map +1 -0
  238. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  239. package/dist/pipeline/standard-post.d.ts +2 -2
  240. package/dist/pipeline/standard-post.d.ts.map +1 -1
  241. package/dist/pipeline/standard-profile.d.ts +2 -1
  242. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  243. package/dist/pipeline-builder.d.ts +5 -2
  244. package/dist/pipeline-builder.d.ts.map +1 -1
  245. package/dist/pipeline-spec-types.d.ts +4 -0
  246. package/dist/pipeline-spec-types.d.ts.map +1 -1
  247. package/dist/pipeline-spec.d.ts +1 -9
  248. package/dist/pipeline-spec.d.ts.map +1 -1
  249. package/dist/plugin.d.ts.map +1 -1
  250. package/dist/points-lines/standard-owner.d.ts +1 -1
  251. package/dist/points-lines/standard-owner.d.ts.map +1 -1
  252. package/dist/post-process-errors.d.ts +9 -2
  253. package/dist/post-process-errors.d.ts.map +1 -1
  254. package/dist/prepare/extended-lighting/resources.d.ts +3 -3
  255. package/dist/prepare/prepared-graphics-resolver.d.ts +6 -1
  256. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  257. package/dist/record/dynamic-geometry-consumption.d.ts +15 -0
  258. package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -0
  259. package/dist/record/frame-lighting.d.ts +3 -3
  260. package/dist/record/frame-lighting.d.ts.map +1 -1
  261. package/dist/record/frame-snapshot.d.ts +109 -13
  262. package/dist/record/frame-snapshot.d.ts.map +1 -1
  263. package/dist/record/frame-targets.d.ts.map +1 -1
  264. package/dist/record/frame.d.ts +41 -5
  265. package/dist/record/frame.d.ts.map +1 -1
  266. package/dist/record/main-pass-geometry.d.ts +13 -9
  267. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  268. package/dist/record/main-pass-material.d.ts +43 -3
  269. package/dist/record/main-pass-material.d.ts.map +1 -1
  270. package/dist/record/main-pass-sprite-draws.d.ts +2 -10
  271. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  272. package/dist/record/main-pass.d.ts +14 -2
  273. package/dist/record/main-pass.d.ts.map +1 -1
  274. package/dist/record/mesh-ssbo.d.ts +15 -6
  275. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  276. package/dist/record/prepared-material-bindings.d.ts +19 -0
  277. package/dist/record/prepared-material-bindings.d.ts.map +1 -0
  278. package/dist/record/recovery-pipeline.d.ts +1 -0
  279. package/dist/record/recovery-pipeline.d.ts.map +1 -1
  280. package/dist/record/render-context.d.ts +101 -22
  281. package/dist/record/render-context.d.ts.map +1 -1
  282. package/dist/record/shadow-pass.d.ts +62 -7
  283. package/dist/record/shadow-pass.d.ts.map +1 -1
  284. package/dist/record/skybox-post-pass.d.ts +1 -1
  285. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  286. package/dist/record/typed-frame-graph.d.ts +39 -8
  287. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  288. package/dist/record/view-ubo.d.ts +1 -0
  289. package/dist/record/view-ubo.d.ts.map +1 -1
  290. package/dist/recovery/render-system-candidate.d.ts +10 -2
  291. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  292. package/dist/recovery/render-system-roots.d.ts +11 -0
  293. package/dist/recovery/render-system-roots.d.ts.map +1 -0
  294. package/dist/recovery/types.d.ts +76 -0
  295. package/dist/recovery/types.d.ts.map +1 -0
  296. package/dist/reflection/background.d.ts +14 -0
  297. package/dist/reflection/background.d.ts.map +1 -0
  298. package/dist/reflection/filter.d.ts.map +1 -1
  299. package/dist/reflection/projection.d.ts +1 -0
  300. package/dist/reflection/projection.d.ts.map +1 -1
  301. package/dist/reflection/record-owner.d.ts +4 -4
  302. package/dist/reflection/record-owner.d.ts.map +1 -1
  303. package/dist/render-contract.d.ts +211 -53
  304. package/dist/render-contract.d.ts.map +1 -1
  305. package/dist/render-graph-primitives.d.ts +1 -0
  306. package/dist/render-graph-primitives.d.ts.map +1 -1
  307. package/dist/render-pipeline.d.ts +81 -6
  308. package/dist/render-pipeline.d.ts.map +1 -1
  309. package/dist/render-system-extract-tail.d.ts +15 -6
  310. package/dist/render-system-extract-tail.d.ts.map +1 -1
  311. package/dist/render-system-extract.d.ts +128 -41
  312. package/dist/render-system-extract.d.ts.map +1 -1
  313. package/dist/render-system-projections.d.ts +22 -0
  314. package/dist/render-system-projections.d.ts.map +1 -0
  315. package/dist/render-system.d.ts +27 -77
  316. package/dist/render-system.d.ts.map +1 -1
  317. package/dist/scene/render-scene-types.d.ts +14 -7
  318. package/dist/scene/render-scene-types.d.ts.map +1 -1
  319. package/dist/scene/render-scene.d.ts +31 -11
  320. package/dist/scene/render-scene.d.ts.map +1 -1
  321. package/dist/scene/shadow-visibility.d.ts +5 -0
  322. package/dist/scene/shadow-visibility.d.ts.map +1 -0
  323. package/dist/ssao-config.d.ts +8 -6
  324. package/dist/ssao-config.d.ts.map +1 -1
  325. package/dist/ssr/admission.d.ts +70 -1
  326. package/dist/ssr/admission.d.ts.map +1 -1
  327. package/dist/ssr/compose.d.ts +13 -0
  328. package/dist/ssr/compose.d.ts.map +1 -0
  329. package/dist/ssr/errors.d.ts +35 -0
  330. package/dist/ssr/errors.d.ts.map +1 -1
  331. package/dist/ssr/graph.d.ts +60 -0
  332. package/dist/ssr/graph.d.ts.map +1 -0
  333. package/dist/ssr/history.d.ts +97 -0
  334. package/dist/ssr/history.d.ts.map +1 -0
  335. package/dist/ssr/hiz.d.ts +37 -0
  336. package/dist/ssr/hiz.d.ts.map +1 -0
  337. package/dist/ssr/inspection.d.ts +42 -0
  338. package/dist/ssr/inspection.d.ts.map +1 -0
  339. package/dist/ssr/resources.d.ts +58 -0
  340. package/dist/ssr/resources.d.ts.map +1 -0
  341. package/dist/ssr/temporal.d.ts +38 -0
  342. package/dist/ssr/temporal.d.ts.map +1 -0
  343. package/dist/systems/skin-palette-allocator.d.ts +32 -10
  344. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  345. package/dist/systems/skin-palette-types.d.ts +15 -0
  346. package/dist/systems/skin-palette-types.d.ts.map +1 -1
  347. package/dist/systems/transparent-dispatch.d.ts +9 -0
  348. package/dist/systems/transparent-dispatch.d.ts.map +1 -0
  349. package/dist/targets/material-source.d.ts +7 -0
  350. package/dist/targets/material-source.d.ts.map +1 -1
  351. package/dist/temporal/frame-coordinator.d.ts +7 -0
  352. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  353. package/dist/temporal/gpu.d.ts +8 -0
  354. package/dist/temporal/gpu.d.ts.map +1 -1
  355. package/dist/temporal/history.d.ts.map +1 -1
  356. package/dist/temporal/index.mjs +6 -6
  357. package/dist/temporal/inspection.d.ts.map +1 -1
  358. package/dist/temporal/standard-scene-data.d.ts +4 -2
  359. package/dist/temporal/standard-scene-data.d.ts.map +1 -1
  360. package/dist/temporal/target-coverage-attachment.d.ts +15 -0
  361. package/dist/temporal/target-coverage-attachment.d.ts.map +1 -0
  362. package/dist/temporal/temporal-view.d.ts +6 -0
  363. package/dist/temporal/temporal-view.d.ts.map +1 -1
  364. package/dist/temporal/view.d.ts +6 -0
  365. package/dist/temporal/view.d.ts.map +1 -1
  366. package/dist/typed-render-graph-primitives.d.ts +41 -1
  367. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  368. package/dist/typed-shadow-passes.d.ts +3 -1
  369. package/dist/typed-shadow-passes.d.ts.map +1 -1
  370. package/dist/volume/component.d.ts +1 -0
  371. package/dist/volume/component.d.ts.map +1 -1
  372. package/dist/volume/temporal.d.ts +6 -0
  373. package/dist/volume/temporal.d.ts.map +1 -1
  374. package/package.json +21 -20
  375. package/src/__tests__/auto-exposure-gpu-evidence.ts +291 -0
  376. package/src/__tests__/auto-exposure-inspection.unit.test.ts +80 -0
  377. package/src/__tests__/auto-exposure-transaction.integration.test.ts +99 -0
  378. package/src/__tests__/auto-exposure.browser.test.ts +33 -0
  379. package/src/__tests__/auto-exposure.dawn.test.ts +33 -0
  380. package/src/__tests__/capture-scene-projection.unit.test.ts +24 -0
  381. package/src/__tests__/detached-inspection.integration.test.ts +5 -0
  382. package/src/__tests__/device-feature-admission.unit.test.ts +15 -24
  383. package/src/__tests__/device-loss-fanout.unit.test.ts +43 -0
  384. package/src/__tests__/device-scope-lifecycle.unit.test.ts +18 -0
  385. package/src/__tests__/device-scope-stale-matrix.unit.test.ts +18 -0
  386. package/src/__tests__/docs-gate-green.unit.test.ts +3 -3
  387. package/src/__tests__/dynamic-geometry-batch.unit.test.ts +157 -0
  388. package/src/__tests__/dynamic-geometry.unit.test.ts +36 -0
  389. package/src/__tests__/dynamic-resolution-plugin.integration.test.ts +81 -0
  390. package/src/__tests__/factory-contract.integration.test.ts +231 -9
  391. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +19 -0
  392. package/src/__tests__/feature-depth-input.dawn.test.ts +121 -0
  393. package/src/__tests__/feature-noise.unit.test.ts +38 -0
  394. package/src/__tests__/fixtures/taa-resolve-pinned-baseline.wgsl +301 -0
  395. package/src/__tests__/frame-camera-selection.unit.test.ts +131 -0
  396. package/src/__tests__/frame-observation.contract.test.ts +21 -0
  397. package/src/__tests__/frame-plan-contract.unit.test.ts +24 -0
  398. package/src/__tests__/frame-targets.unit.test.ts +24 -0
  399. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +3 -0
  400. package/src/__tests__/gpu-driven-baseline.characterization.test.ts +79 -0
  401. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +307 -7
  402. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +122 -142
  403. package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +10 -1
  404. package/src/__tests__/gpu-driven-lod-cache.unit.test.ts +261 -0
  405. package/src/__tests__/gpu-driven-mesh-world-identity.unit.test.ts +346 -0
  406. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +1422 -0
  407. package/src/__tests__/gpu-driven-pbr.integration.test.ts +21 -0
  408. package/src/__tests__/gpu-driven-production-fixture.ts +96 -0
  409. package/src/__tests__/gpu-driven-production.integration.test.ts +1076 -106
  410. package/src/__tests__/gpu-driven-scaling.unit.test.ts +1 -3
  411. package/src/__tests__/gpu-driven-shadow-views.browser.test.ts +63 -0
  412. package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +294 -0
  413. package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +97 -0
  414. package/src/__tests__/gpu-driven-shadow-views.unit.test.ts +168 -0
  415. package/src/__tests__/gpu-driven-skin-contract.test-d.ts +11 -0
  416. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +72 -20
  417. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +30 -9
  418. package/src/__tests__/gpu-driven-view.unit.test.ts +160 -52
  419. package/src/__tests__/gpu-pass-timing-browser-runner.ts +15 -0
  420. package/src/__tests__/gpu-pass-timing.browser.test.ts +20 -2
  421. package/src/__tests__/gpu-resource-scope.unit.test.ts +71 -0
  422. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +42 -0
  423. package/src/__tests__/gpu-scene-render-graph-gpu.ts +19 -5
  424. package/src/__tests__/gpu-scene.dawn.test.ts +40 -13
  425. package/src/__tests__/gpu-scene.unit.test.ts +613 -33
  426. package/src/__tests__/instances-culling.integration.test.ts +36 -10
  427. package/src/__tests__/instances-derived-bounds.unit.test.ts +54 -0
  428. package/src/__tests__/instances-store.unit.test.ts +242 -39
  429. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +6 -0
  430. package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +13 -16
  431. package/src/__tests__/lut-lkg-transaction.integration.test.ts +122 -0
  432. package/src/__tests__/material-contract-inventory.unit.test.ts +5 -6
  433. package/src/__tests__/material-dispatch-shader-id.unit.test.ts +51 -0
  434. package/src/__tests__/material-lane-selection.unit.test.ts +60 -0
  435. package/src/__tests__/material-numeric-upload.unit.test.ts +53 -0
  436. package/src/__tests__/material-texture-handles.unit.test.ts +18 -0
  437. package/src/__tests__/material-texture-source.unit.test.ts +87 -0
  438. package/src/__tests__/materials-authoring-validation.unit.test.ts +41 -0
  439. package/src/__tests__/materials-standard-contract.unit.test.ts +57 -3
  440. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +4 -0
  441. package/src/__tests__/mesh-submission-lifetime.unit.test.ts +8 -0
  442. package/src/__tests__/morph-neutral-admission.unit.test.ts +19 -0
  443. package/src/__tests__/normal-fallback.dawn.test.ts +122 -0
  444. package/src/__tests__/particle-material-input-layout.unit.test.ts +104 -0
  445. package/src/__tests__/physical-clearcoat.integration.test.ts +42 -3
  446. package/src/__tests__/pipeline-texture-specialization.unit.test.ts +138 -0
  447. package/src/__tests__/point-shadow-inspection.unit.test.ts +2 -0
  448. package/src/__tests__/post-process-error-policy-owner.unit.test.ts +6 -5
  449. package/src/__tests__/prepared-gpu-driven-pbr-contract.test-d.ts +31 -0
  450. package/src/__tests__/prepared-gpu-driven-pbr-contract.unit.test.ts +39 -0
  451. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +251 -9
  452. package/src/__tests__/prepared-graphics-capability.unit.test.ts +21 -0
  453. package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +6 -2
  454. package/src/__tests__/profiler-phase-catalog.test.ts +5 -0
  455. package/src/__tests__/public-surface.test-d.ts +3 -0
  456. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +30 -12
  457. package/src/__tests__/reflection-fallback-async-publication.unit.test.ts +171 -0
  458. package/src/__tests__/reflection-probe-authoring.unit.test.ts +12 -10
  459. package/src/__tests__/reflection-probe-box.dawn.test.ts +71 -0
  460. package/src/__tests__/reflection-probe-filter.unit.test.ts +9 -0
  461. package/src/__tests__/reflection-probe-orientation.dawn.test.ts +294 -0
  462. package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +5 -14
  463. package/src/__tests__/reflection-probe-updates.unit.test.ts +129 -0
  464. package/src/__tests__/render-error-code-owner.test-d.ts +7 -0
  465. package/src/__tests__/render-error-detail-ssot.test-d.ts +27 -1
  466. package/src/__tests__/render-error-exhaustive.test-d.ts +15 -0
  467. package/src/__tests__/render-extent.unit.test.ts +63 -0
  468. package/src/__tests__/render-feature-gpu-work.integration.test.ts +285 -2
  469. package/src/__tests__/render-feature-plan.unit.test.ts +245 -0
  470. package/src/__tests__/render-feature-shadow-order.unit.test.ts +228 -0
  471. package/src/__tests__/render-feature-zero-work.unit.test.ts +35 -1
  472. package/src/__tests__/render-graph-fallback.integration.test.ts +2 -2
  473. package/src/__tests__/render-owner-cohesion.unit.test.ts +55 -0
  474. package/src/__tests__/render-scene-mixed-updates.integration.test.ts +426 -0
  475. package/src/__tests__/render-scene-projection.unit.test.ts +915 -23
  476. package/src/__tests__/render-scene-resource-updates.integration.test.ts +214 -0
  477. package/src/__tests__/render-scene-skin-lifecycle.integration.test.ts +173 -0
  478. package/src/__tests__/render-scene-temporal-retry.unit.test.ts +133 -0
  479. package/src/__tests__/render-target-material-source.test-d.ts +27 -3
  480. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +233 -9
  481. package/src/__tests__/renderer-frame-transaction.integration.test.ts +923 -5
  482. package/src/__tests__/shader-manifest-fixture.ts +45 -0
  483. package/src/__tests__/skin-motion-regression.unit.test.ts +0 -33
  484. package/src/__tests__/skin-palette-persistent.integration.test.ts +28 -0
  485. package/src/__tests__/skin-palette-persistent.unit.test.ts +247 -0
  486. package/src/__tests__/skinned-shadow-caster.test.ts +125 -14
  487. package/src/__tests__/specular-environment-scale.dawn.test.ts +158 -0
  488. package/src/__tests__/ssao-config.unit.test.ts +7 -0
  489. package/src/__tests__/ssao-surface.dawn.test.ts +252 -0
  490. package/src/__tests__/ssr-admission-matrix.integration.test.ts +7 -1
  491. package/src/__tests__/ssr-confidence-compose.unit.test.ts +84 -0
  492. package/src/__tests__/ssr-coordinate-oracle.unit.test.ts +28 -0
  493. package/src/__tests__/ssr-cube-silhouette.dawn.test.ts +270 -0
  494. package/src/__tests__/ssr-format-probe-gating.integration.test.ts +82 -0
  495. package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +99 -0
  496. package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +116 -0
  497. package/src/__tests__/ssr-gpu-dispatch.ts +951 -0
  498. package/src/__tests__/ssr-graph-topology.unit.test.ts +104 -0
  499. package/src/__tests__/ssr-history-filter.dawn.test.ts +198 -0
  500. package/src/__tests__/ssr-hit-color.dawn.test.ts +273 -0
  501. package/src/__tests__/ssr-hiz-odd-reduction.dawn.test.ts +569 -0
  502. package/src/__tests__/ssr-hiz-rescue.dawn.test.ts +279 -0
  503. package/src/__tests__/ssr-hiz.browser.test.ts +150 -0
  504. package/src/__tests__/ssr-hiz.dawn.test.ts +150 -0
  505. package/src/__tests__/ssr-hiz.unit.test.ts +56 -0
  506. package/src/__tests__/ssr-inspection.unit.test.ts +105 -0
  507. package/src/__tests__/ssr-memory-budget.unit.test.ts +45 -0
  508. package/src/__tests__/ssr-performance-sequence-aggregation.unit.test.ts +15 -0
  509. package/src/__tests__/ssr-public-surface.test-d.ts +37 -0
  510. package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +387 -0
  511. package/src/__tests__/ssr-reflection-mip-reducer.dawn.test.ts +309 -0
  512. package/src/__tests__/ssr-reprojection-probe.ts +90 -0
  513. package/src/__tests__/ssr-roughness-mip.dawn.test.ts +163 -0
  514. package/src/__tests__/ssr-shader-prewarm.unit.test.ts +59 -0
  515. package/src/__tests__/ssr-spatial.integration.test.ts +141 -0
  516. package/src/__tests__/ssr-stable-lattice.dawn.test.ts +475 -0
  517. package/src/__tests__/ssr-temporal-history.unit.test.ts +202 -0
  518. package/src/__tests__/ssr-texel-crossing.dawn.test.ts +448 -0
  519. package/src/__tests__/ssr-zero-work.integration.test.ts +87 -0
  520. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +84 -12
  521. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +29 -0
  522. package/src/__tests__/standard-output-chain-contract.unit.test.ts +99 -0
  523. package/src/__tests__/standard-output-chain.integration.test.ts +73 -0
  524. package/src/__tests__/standard-output-gpu-evidence.ts +205 -0
  525. package/src/__tests__/standard-output.browser.test.ts +15 -0
  526. package/src/__tests__/standard-output.dawn.test.ts +15 -0
  527. package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +275 -0
  528. package/src/__tests__/standard-pipeline.integration.test.ts +320 -3
  529. package/src/__tests__/standard-profile-oracle.unit.test.ts +49 -0
  530. package/src/__tests__/standard-surface-lighting.unit.test.ts +41 -0
  531. package/src/__tests__/standard-texture-specialization.dawn.test.ts +141 -0
  532. package/src/__tests__/surface-adjacent-regressions.integration.test.ts +6 -3
  533. package/src/__tests__/taa-coverage-edge.dawn.test.ts +199 -0
  534. package/src/__tests__/taa-history-clipping.dawn.test.ts +328 -0
  535. package/src/__tests__/taa-neighborhood-equivalence.dawn.test.ts +782 -0
  536. package/src/__tests__/taa-stability-feedback.browser.test.ts +23 -0
  537. package/src/__tests__/taa-stability-feedback.dawn.test.ts +68 -0
  538. package/src/__tests__/taa-stability-feedback.ts +342 -0
  539. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +49 -7
  540. package/src/__tests__/temporal-reset-matrix.unit.test.ts +9 -0
  541. package/src/__tests__/temporal-transaction.integration.test.ts +28 -0
  542. package/src/__tests__/temporal-view.unit.test.ts +17 -0
  543. package/src/__tests__/texture-usage-surface.unit.test.ts +4 -2
  544. package/src/__tests__/transmission-prewarm.unit.test.ts +57 -0
  545. package/src/__tests__/typed-pipeline-topology.unit.test.ts +109 -4
  546. package/src/__tests__/typed-scene-pass-material-cache.integration.test.ts +126 -0
  547. package/src/__tests__/vertex-layouts-ssot.unit.test.ts +47 -0
  548. package/src/__tests__/visibility-extract.perf.test.ts +20 -8
  549. package/src/__tests__/visibility-instances.integration.test.ts +19 -7
  550. package/src/__tests__/visibility-producer-matrix.integration.test.ts +20 -9
  551. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +62 -13
  552. package/src/__tests__/volumetric-fog-topology.unit.test.ts +7 -7
  553. package/src/assembly/atmosphere-shader-prewarm.ts +39 -0
  554. package/src/assembly/device-feature-admission.ts +9 -4
  555. package/src/assembly/dynamic-geometry-host.ts +284 -163
  556. package/src/assembly/dynamic-geometry-runtime.ts +71 -0
  557. package/src/assembly/factory.ts +4 -0
  558. package/src/assembly/gpu-driven-owner.ts +29 -0
  559. package/src/assembly/host-contract.ts +19 -0
  560. package/src/assembly/material/assembly.ts +383 -1
  561. package/src/assembly/material/pipeline-helpers.ts +100 -0
  562. package/src/assembly/material-shader-policy.ts +110 -46
  563. package/src/assembly/recovery/device-loss-fanout.ts +5 -0
  564. package/src/assembly/recovery/failure-location.ts +62 -0
  565. package/src/assembly/recovery/recovery-attempt.ts +2 -29
  566. package/src/assembly/recovery/renderer-recover.ts +16 -17
  567. package/src/assembly/renderer-facade.ts +34 -1
  568. package/src/assembly/renderer-feature-inspection.ts +13 -0
  569. package/src/assembly/renderer-frame-transaction.ts +63 -0
  570. package/src/assembly/renderer-helpers.ts +26 -0
  571. package/src/assembly/renderer-inspection.ts +6 -0
  572. package/src/assembly/shader-prewarm-policy.ts +46 -1
  573. package/src/assembly/skin-palette-owner.ts +21 -0
  574. package/src/assembly/ssr-shader-prewarm.ts +41 -0
  575. package/src/assembly/webgpu-device-loss.ts +75 -0
  576. package/src/assembly/webgpu-pbr-ready.ts +232 -0
  577. package/src/assembly/webgpu-ready-mipmap.ts +26 -0
  578. package/src/assembly/webgpu-ready.ts +161 -131
  579. package/src/assembly/webgpu-renderer-bootstrap.ts +85 -0
  580. package/src/assembly/webgpu-renderer-contract.ts +69 -0
  581. package/src/assembly/webgpu-renderer-guards.ts +32 -0
  582. package/src/assembly/webgpu-renderer-observation.ts +43 -0
  583. package/src/assembly/webgpu-renderer-recovery-failure.ts +62 -0
  584. package/src/assembly/webgpu-renderer.ts +744 -730
  585. package/src/assembly/webgpu-vertex-layouts.ts +233 -87
  586. package/src/capture/scene-projection.ts +37 -0
  587. package/src/components/__tests__/camera-exposure.contract.unit.test.ts +153 -0
  588. package/src/components/__tests__/dynamic-resolution-schema.unit.test.ts +65 -0
  589. package/src/components/__tests__/light-radius.integration.test.ts +59 -0
  590. package/src/components/camera.ts +287 -7
  591. package/src/components/directional-light.ts +3 -3
  592. package/src/components/dynamic-resolution.ts +67 -0
  593. package/src/components/index.ts +2 -0
  594. package/src/components/instances.ts +45 -18
  595. package/src/components/light-helpers.ts +6 -1
  596. package/src/components/reflection-probe.ts +1 -0
  597. package/src/components/scene-instance.ts +2 -1
  598. package/src/components/screen-space-reflection.ts +21 -0
  599. package/src/components/skylight.ts +4 -1
  600. package/src/components/sprite-animation.ts +2 -2
  601. package/src/components/sprite-instances.ts +1 -1
  602. package/src/device/device-scope.ts +13 -7
  603. package/src/device/gpu-residency.ts +45 -42
  604. package/src/dynamic-geometry.ts +13 -8
  605. package/src/environment/background.ts +281 -0
  606. package/src/environment/ibl.ts +211 -0
  607. package/src/environment/storage.ts +63 -0
  608. package/src/errors/gpu-driven.ts +49 -8
  609. package/src/errors/render.ts +91 -3
  610. package/src/extract/camera.ts +37 -1
  611. package/src/extract/contracts.ts +10 -0
  612. package/src/extract/gpu-driven.ts +240 -10
  613. package/src/features/host.ts +237 -19
  614. package/src/features/noise-texture.ts +91 -0
  615. package/src/features/plan.ts +553 -24
  616. package/src/features/prepared-gpu-work.ts +631 -49
  617. package/src/features/prepared-graphics-store.ts +31 -0
  618. package/src/features/prepared-graphics.ts +5 -0
  619. package/src/features/render-graph-compute.ts +41 -8
  620. package/src/features/render-graph-contribution.ts +141 -3
  621. package/src/features/render-graph-raster.ts +143 -30
  622. package/src/features/types.ts +11 -0
  623. package/src/fullscreen-post-process-pass.ts +3 -0
  624. package/src/gpu-driven/batch-topology.ts +452 -108
  625. package/src/gpu-driven/material-artifacts.ts +179 -0
  626. package/src/gpu-driven/material-bindings.ts +41 -0
  627. package/src/gpu-driven/pbr-program.ts +31 -0
  628. package/src/gpu-driven/prepared-draw.ts +42 -6
  629. package/src/gpu-driven/production-raster.ts +2806 -716
  630. package/src/gpu-driven/shadow-views.ts +539 -0
  631. package/src/gpu-driven/view-gpu.ts +188 -41
  632. package/src/gpu-resource.ts +21 -2
  633. package/src/gpu-scene-schema.ts +61 -11
  634. package/src/gpu-scene.ts +197 -99
  635. package/src/gpu-texture-usage.ts +1 -0
  636. package/src/hdrp-buffers.ts +141 -36
  637. package/src/ibl/IblPipelineCache.ts +5 -0
  638. package/src/ibl/frame-resources.ts +38 -0
  639. package/src/ibl/skylight-bind-group.ts +32 -21
  640. package/src/index.ts +194 -75
  641. package/src/inspection-types.ts +207 -1
  642. package/src/instances-derived-bounds.ts +258 -34
  643. package/src/instances.ts +459 -150
  644. package/src/internal.ts +22 -0
  645. package/src/lifecycle.ts +2 -0
  646. package/src/material-row.ts +194 -0
  647. package/src/materials.ts +44 -8
  648. package/src/pbr-pipeline.ts +172 -19
  649. package/src/pipeline/render-extent.ts +111 -0
  650. package/src/pipeline/standard-build-context.ts +7 -0
  651. package/src/pipeline/standard-forward-lane.ts +74 -29
  652. package/src/pipeline/standard-output/__tests__/lut-admission.unit.test.ts +103 -0
  653. package/src/pipeline/standard-output/auto-exposure/__tests__/capability.unit.test.ts +40 -0
  654. package/src/pipeline/standard-output/auto-exposure/__tests__/gpu.contract.unit.test.ts +125 -0
  655. package/src/pipeline/standard-output/auto-exposure/__tests__/graph.contract.unit.test.ts +94 -0
  656. package/src/pipeline/standard-output/auto-exposure/__tests__/oracle.test.ts +108 -0
  657. package/src/pipeline/standard-output/auto-exposure/__tests__/preset.test.ts +26 -0
  658. package/src/pipeline/standard-output/auto-exposure/capability.ts +38 -0
  659. package/src/pipeline/standard-output/auto-exposure/gpu.ts +567 -0
  660. package/src/pipeline/standard-output/auto-exposure/graph.ts +221 -0
  661. package/src/pipeline/standard-output/auto-exposure/inspection.ts +231 -0
  662. package/src/pipeline/standard-output/auto-exposure/oracle.ts +291 -0
  663. package/src/pipeline/standard-output/auto-exposure/preset.ts +28 -0
  664. package/src/pipeline/standard-output/auto-exposure/state.ts +156 -0
  665. package/src/pipeline/standard-output/color-transform.ts +124 -0
  666. package/src/pipeline/standard-output/graph.ts +139 -0
  667. package/src/pipeline/standard-output/lut-admission.ts +121 -0
  668. package/src/pipeline/standard-output/lut-gpu.ts +399 -0
  669. package/src/pipeline/standard-output/lut-state.ts +176 -0
  670. package/src/pipeline/standard-output/resources.ts +121 -0
  671. package/src/pipeline/standard-output/types.ts +58 -0
  672. package/src/pipeline/standard-pipeline.ts +232 -70
  673. package/src/pipeline/standard-post.ts +190 -27
  674. package/src/pipeline/standard-profile.ts +2 -1
  675. package/src/pipeline-builder.ts +28 -9
  676. package/src/pipeline-spec-types.ts +4 -0
  677. package/src/pipeline-spec.ts +37 -29
  678. package/src/plugin.ts +4 -0
  679. package/src/points-lines/standard-owner.ts +6 -14
  680. package/src/post-process-errors.ts +26 -18
  681. package/src/prepare/__tests__/extended-lighting-capability.unit.test.ts +2 -2
  682. package/src/prepare/extended-lighting/resources.ts +3 -3
  683. package/src/prepare/prepared-graphics-resolver.ts +9 -2
  684. package/src/record/__tests__/main-pass-geometry.unit.test.ts +68 -0
  685. package/src/record/__tests__/material-bg-cache.unit.test.ts +45 -0
  686. package/src/record/__tests__/material-slot-plan.unit.test.ts +57 -0
  687. package/src/record/__tests__/mesh-ssbo.unit.test.ts +40 -1
  688. package/src/record/__tests__/recovery-pipeline.unit.test.ts +20 -1
  689. package/src/record/__tests__/sprite-material-abi.unit.test.ts +41 -6
  690. package/src/record/__tests__/temporal-payload.unit.test.ts +2 -0
  691. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +45 -0
  692. package/src/record/__tests__/view-ubo-layout.unit.test.ts +5 -0
  693. package/src/record/dynamic-geometry-consumption.ts +59 -0
  694. package/src/record/frame-lighting.ts +15 -12
  695. package/src/record/frame-snapshot.ts +146 -34
  696. package/src/record/frame-targets.ts +9 -0
  697. package/src/record/frame.ts +838 -170
  698. package/src/record/main-pass-geometry.ts +209 -103
  699. package/src/record/main-pass-material.ts +157 -40
  700. package/src/record/main-pass-sprite-draws.ts +16 -107
  701. package/src/record/main-pass.ts +141 -12
  702. package/src/record/material-uniforms.ts +1 -1
  703. package/src/record/mesh-ssbo.ts +59 -15
  704. package/src/record/prepared-material-bindings.ts +238 -0
  705. package/src/record/recovery-pipeline.ts +69 -90
  706. package/src/record/render-context.ts +123 -24
  707. package/src/record/shadow-pass.ts +1389 -230
  708. package/src/record/skybox-post-pass.ts +14 -3
  709. package/src/record/typed-frame-graph.ts +1064 -47
  710. package/src/record/view-ubo.ts +12 -1
  711. package/src/recovery/render-system-candidate.ts +135 -68
  712. package/src/recovery/render-system-roots.ts +113 -0
  713. package/src/recovery/types.ts +77 -0
  714. package/src/reflection/background.ts +151 -0
  715. package/src/reflection/filter.ts +3 -0
  716. package/src/reflection/projection.ts +16 -6
  717. package/src/reflection/record-owner.ts +308 -140
  718. package/src/render-contract.ts +237 -49
  719. package/src/render-graph-primitives.ts +34 -5
  720. package/src/render-pipeline.ts +90 -2
  721. package/src/render-system-extract-tail.ts +431 -162
  722. package/src/render-system-extract.ts +478 -119
  723. package/src/render-system-projections.ts +241 -0
  724. package/src/render-system.ts +715 -828
  725. package/src/scene/render-scene-types.ts +13 -4
  726. package/src/scene/render-scene.ts +577 -355
  727. package/src/scene/shadow-visibility.ts +21 -0
  728. package/src/ssao-config.ts +25 -8
  729. package/src/ssr/admission.ts +380 -14
  730. package/src/ssr/compose.ts +144 -0
  731. package/src/ssr/errors.ts +48 -0
  732. package/src/ssr/graph.ts +797 -0
  733. package/src/ssr/history.ts +436 -0
  734. package/src/ssr/hiz.ts +124 -0
  735. package/src/ssr/inspection.ts +124 -0
  736. package/src/ssr/resources.ts +202 -0
  737. package/src/ssr/temporal.ts +164 -0
  738. package/src/systems/skin-palette-allocator.ts +495 -148
  739. package/src/systems/skin-palette-types.ts +17 -0
  740. package/src/systems/transparent-dispatch.ts +90 -0
  741. package/src/targets/material-source.ts +34 -0
  742. package/src/temporal/coverage.ts +1 -1
  743. package/src/temporal/frame-coordinator.ts +23 -2
  744. package/src/temporal/gpu.ts +79 -12
  745. package/src/temporal/history.ts +3 -1
  746. package/src/temporal/inspection.ts +2 -1
  747. package/src/temporal/standard-scene-data.ts +10 -2
  748. package/src/temporal/target-coverage-attachment.ts +72 -0
  749. package/src/temporal/temporal-view.ts +11 -2
  750. package/src/temporal/view.ts +12 -2
  751. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +219 -139
  752. package/src/typed-render-graph-primitives.ts +304 -74
  753. package/src/typed-shadow-passes.ts +122 -12
  754. package/src/volume/component.ts +1 -0
  755. package/src/volume/passes.ts +3 -3
  756. package/src/volume/temporal.ts +10 -0
  757. package/dist/chunk-GE3SDD72.mjs.map +0 -1
  758. package/dist/chunk-GF523LHF.mjs.map +0 -1
  759. package/dist/chunk-IQMKJLNU.mjs.map +0 -1
  760. package/dist/chunk-J52NMQKR.mjs.map +0 -1
  761. package/dist/chunk-J6KACNOH.mjs.map +0 -1
  762. package/dist/chunk-JAASCMXA.mjs.map +0 -1
  763. package/dist/chunk-MBU4ZVE7.mjs.map +0 -1
  764. package/dist/chunk-MYJ5RPJO.mjs.map +0 -1
  765. package/dist/chunk-RBDBZ5R7.mjs.map +0 -1
  766. package/dist/chunk-VSL23LZE.mjs.map +0 -1
  767. package/src/__tests__/instances-world-ownership.integration.test.ts +0 -62
  768. package/src/scene/__tests__/changed-block-summary.candidate.test.ts +0 -36
@@ -11,10 +11,17 @@ import type {
11
11
  RenderFeaturePreparedRef,
12
12
  RenderFeatureVertexDataDescriptor,
13
13
  } from './prepared-graphics';
14
+ import { RENDER_FEATURE_VERTEX_LAYOUTS } from './prepared-graphics';
14
15
  import type { RenderFeatureTargetHandle } from './targets';
15
16
 
16
17
  export type PreparedGraphicsKind = Exclude<PreparedKind, 'attachment'>;
17
18
 
19
+ const PARTICLE_MATERIAL_INPUT_LAYOUTS: ReadonlySet<string> = new Set([
20
+ RENDER_FEATURE_VERTEX_LAYOUTS.billboardMaterialInputInstance,
21
+ RENDER_FEATURE_VERTEX_LAYOUTS.topologySegmentMaterialInputInstance,
22
+ RENDER_FEATURE_VERTEX_LAYOUTS.meshGeometryMaterialInputInstance,
23
+ ]);
24
+
18
25
  export type PreparedGraphicsRequestByKind = {
19
26
  pipeline: RenderFeaturePipelineDescriptor;
20
27
  bindings: RenderFeatureBindingsDescriptor;
@@ -185,6 +192,9 @@ function normalizeDescriptor(
185
192
  kind,
186
193
  shader: pipeline.shader,
187
194
  vertexLayout: pipeline.vertexLayout,
195
+ ...(pipeline.particleInputLanes === undefined
196
+ ? {}
197
+ : { particleInputLanes: pipeline.particleInputLanes }),
188
198
  colorFormats: Object.freeze([...pipeline.colorFormats]),
189
199
  ...(pipeline.depthFormat === undefined ? {} : { depthFormat: pipeline.depthFormat }),
190
200
  ...(pipeline.sampleCount === undefined ? {} : { sampleCount: pipeline.sampleCount }),
@@ -263,6 +273,27 @@ class PreparedGraphicsTransactionImpl implements PreparedGraphicsTransaction {
263
273
  name: string,
264
274
  request: PreparedGraphicsRequestByKind[Kind] | PreparedGraphicsSignature,
265
275
  ): Result<RenderFeaturePreparedRef<Kind>, RenderError> {
276
+ if (kind === 'pipeline' && !('signature' in request)) {
277
+ const pipeline = request as RenderFeaturePipelineDescriptor;
278
+ const lanes = pipeline.particleInputLanes;
279
+ const usesParticleMaterialInputs = PARTICLE_MATERIAL_INPUT_LAYOUTS.has(pipeline.vertexLayout);
280
+ const validLanes =
281
+ typeof lanes === 'number' && Number.isInteger(lanes) && lanes >= 1 && lanes <= 4;
282
+ if (
283
+ (usesParticleMaterialInputs && !validLanes) ||
284
+ (!usesParticleMaterialInputs && lanes !== undefined)
285
+ ) {
286
+ return err(
287
+ preparationFailure(
288
+ this.featureIdentity,
289
+ this.generation,
290
+ kind,
291
+ name,
292
+ 'particle-input-lanes-require-material-input-layout-and-1-through-4-lanes',
293
+ ),
294
+ );
295
+ }
296
+ }
266
297
  const normalized = normalizeDescriptor(kind, request);
267
298
  if (this.aborted || this.committed || name.length === 0 || normalized.signature.length === 0) {
268
299
  return err(
@@ -31,8 +31,11 @@ export type { PreparedKind } from './vocabulary';
31
31
  export const RENDER_FEATURE_VERTEX_LAYOUTS = Object.freeze({
32
32
  positionSizeColorInstance: 'position-size-color-instance',
33
33
  billboardMaterialInstance: 'billboard-material-instance',
34
+ billboardMaterialInputInstance: 'billboard-material-input-instance',
34
35
  topologySegmentInstance: 'topology-segment-instance',
36
+ topologySegmentMaterialInputInstance: 'topology-segment-material-input-instance',
35
37
  meshGeometryMaterialInstance: 'mesh-geometry-material-instance',
38
+ meshGeometryMaterialInputInstance: 'mesh-geometry-material-input-instance',
36
39
  } as const);
37
40
 
38
41
  /**
@@ -51,6 +54,8 @@ export interface RenderFeaturePreparedRef<Kind extends PreparedKind = PreparedKi
51
54
  export interface RenderFeaturePipelineDescriptor {
52
55
  readonly shader: string;
53
56
  readonly vertexLayout: string;
57
+ /** Number of vec4 lanes in the material-input instance layout (1 through 4). */
58
+ readonly particleInputLanes?: number;
54
59
  readonly colorFormats: readonly TextureFormat[];
55
60
  readonly depthFormat?: TextureFormat;
56
61
  /** Sample count of the target this pipeline will draw into. */
@@ -3,17 +3,23 @@ import type {
3
3
  RenderGraphError,
4
4
  RenderGraphFrame,
5
5
  } from '@forgeax/engine-render-graph';
6
- import type { Result } from '@forgeax/engine-types';
7
- import { type RenderError, RenderFeatureDrawRecordingFailedError } from '../errors/render';
6
+ import { err, type Result } from '@forgeax/engine-types';
7
+ import {
8
+ type RenderError,
9
+ RenderFeatureDrawRecordingFailedError,
10
+ RenderFeatureStageFailedError,
11
+ } from '../errors/render';
8
12
  import {
9
13
  encodeRenderFeatureGpuComputePass,
10
14
  type RenderFeatureResolvedGpuComputePass,
11
15
  } from './prepared-gpu-work';
16
+ import type { RenderFeatureGraphTargetResolver } from './render-graph-raster';
12
17
  import {
13
18
  createRenderFeatureGraphBufferState,
14
19
  importRenderFeatureGraphBuffer,
15
20
  type RenderFeatureGraphBufferState,
16
21
  } from './render-graph-resources';
22
+ import type { RenderFeatureTargetHandle } from './targets';
17
23
 
18
24
  export class RenderFeatureComputeGraphProjection<FrameCtx extends RenderGraphFrame> {
19
25
  private readonly resources: RenderFeatureGraphBufferState;
@@ -22,6 +28,7 @@ export class RenderFeatureComputeGraphProjection<FrameCtx extends RenderGraphFra
22
28
  private readonly builder: RenderGraphBuilder<FrameCtx>,
23
29
  resources?: RenderFeatureGraphBufferState,
24
30
  private readonly reportError?: (error: RenderError) => void,
31
+ private readonly resolveTarget?: RenderFeatureGraphTargetResolver,
25
32
  ) {
26
33
  this.resources = resources ?? createRenderFeatureGraphBufferState();
27
34
  }
@@ -31,8 +38,26 @@ export class RenderFeatureComputeGraphProjection<FrameCtx extends RenderGraphFra
31
38
  featureIdentity: string,
32
39
  order: number,
33
40
  work: RenderFeatureResolvedGpuComputePass,
34
- ): Result<void, RenderGraphError> {
41
+ ): Result<void, RenderGraphError | RenderError> {
35
42
  const accesses = [];
43
+ const targets = new Map<
44
+ RenderFeatureTargetHandle,
45
+ NonNullable<ReturnType<RenderFeatureGraphTargetResolver>>
46
+ >();
47
+ for (const handle of work.sampledTargets ?? []) {
48
+ let target = this.resolveTarget?.(handle);
49
+ if (target === undefined)
50
+ return err(
51
+ new RenderFeatureStageFailedError(featureIdentity, order, 'record', 'renderer-recover'),
52
+ );
53
+ if (handle.kind === 'scene-depth') {
54
+ const view = this.builder.view(target.texture, { aspect: 'depth-only' });
55
+ if (!view.ok) return view;
56
+ target = { ...target, view: view.value };
57
+ }
58
+ targets.set(handle, target);
59
+ accesses.push({ resource: target.view, usage: 'sampled-read' as const });
60
+ }
36
61
  for (const resource of work.buffers) {
37
62
  const imported = importRenderFeatureGraphBuffer(
38
63
  this.builder,
@@ -45,11 +70,17 @@ export class RenderFeatureComputeGraphProjection<FrameCtx extends RenderGraphFra
45
70
  }
46
71
  return this.builder.addComputePass(name, {
47
72
  accesses,
48
- encode: ({ pass }) => {
73
+ encode: ({ pass, resources }) => {
49
74
  try {
50
- encodeRenderFeatureGpuComputePass(pass, work);
75
+ encodeRenderFeatureGpuComputePass(pass, work, (name) => {
76
+ const target = targets.get(name);
77
+ if (target === undefined) throw new Error(`Missing sampled graph target: ${name}`);
78
+ const view = resources.textureView(target.view);
79
+ if (!view.ok) throw view.error;
80
+ return view.value;
81
+ });
51
82
  } catch (failure) {
52
- this.reportError?.(
83
+ const error =
53
84
  failure instanceof Error && typeof (failure as Partial<RenderError>).code === 'string'
54
85
  ? (failure as RenderError)
55
86
  : new RenderFeatureDrawRecordingFailedError(
@@ -60,8 +91,10 @@ export class RenderFeatureComputeGraphProjection<FrameCtx extends RenderGraphFra
60
91
  'backend-recording-failed',
61
92
  failure instanceof Error ? failure.message : String(failure),
62
93
  'renderer-recover',
63
- ),
64
- );
94
+ );
95
+ this.reportError?.(error);
96
+ // A partially encoded intent is not a submitted transaction.
97
+ throw error;
65
98
  }
66
99
  },
67
100
  });
@@ -1,19 +1,136 @@
1
1
  import type {
2
+ GraphAccess,
3
+ GraphBufferAccess,
2
4
  RenderGraphBuilder,
3
5
  RenderGraphError,
4
6
  RenderGraphFrame,
5
7
  } from '@forgeax/engine-render-graph';
8
+ import type { Buffer } from '@forgeax/engine-rhi';
6
9
  import { err, ok, type Result } from '@forgeax/engine-types';
7
10
  import { type RenderError, RenderFeatureStageFailedError } from '../errors/render';
8
- import type { RenderFeaturePlanExecution } from './host';
11
+ import type { RenderFeaturePlanExecution, RenderFeaturePlanExecutionPass } from './host';
9
12
  import { RenderFeatureComputeGraphProjection } from './render-graph-compute';
10
13
  import {
11
14
  type RenderFeatureGraphBindingsResolver,
12
15
  type RenderFeatureGraphTargetResolver,
16
+ type RenderFeatureLightingResolver,
13
17
  RenderFeatureRasterGraphProjection,
18
+ type RenderFeatureShadowDraws,
19
+ resolveRenderFeatureDrawBuffers,
14
20
  } from './render-graph-raster';
15
21
  import { createRenderFeatureGraphBufferState } from './render-graph-resources';
16
22
 
23
+ export function createRenderFeatureProjectionState() {
24
+ return {
25
+ buffers: createRenderFeatureGraphBufferState(),
26
+ projected: new Set<RenderFeaturePlanExecutionPass>(),
27
+ };
28
+ }
29
+
30
+ function writesBuffer(access: GraphBufferAccess): boolean {
31
+ switch (access) {
32
+ case 'storage-write':
33
+ case 'storage-read-write':
34
+ case 'copy-dst':
35
+ return true;
36
+ case 'uniform-read':
37
+ case 'storage-read':
38
+ case 'indirect-read':
39
+ case 'vertex-read':
40
+ case 'index-read':
41
+ case 'copy-src':
42
+ return false;
43
+ }
44
+ }
45
+
46
+ export function projectRenderFeatureShadows<FrameCtx extends RenderGraphFrame>(
47
+ builder: RenderGraphBuilder<FrameCtx>,
48
+ executions: readonly RenderFeaturePlanExecution[],
49
+ state: ReturnType<typeof createRenderFeatureProjectionState>,
50
+ ): Result<RenderFeatureShadowDraws<FrameCtx> | undefined, RenderGraphError | RenderError> {
51
+ if (!executions.some((execution) => execution.passes.some((pass) => pass.shadowCaster)))
52
+ return ok(undefined);
53
+ const compute = new RenderFeatureComputeGraphProjection(builder, state.buffers);
54
+ const raster = new RenderFeatureRasterGraphProjection(
55
+ builder,
56
+ () => undefined,
57
+ undefined,
58
+ state.buffers,
59
+ );
60
+ const draws: RenderFeatureShadowDraws<FrameCtx>[] = [];
61
+ // Hoist only work that can cross earlier deferred work without changing its
62
+ // buffer observations. Physical identity catches aliases across features too.
63
+ const deferredAccesses = new Set<Buffer>();
64
+ const deferredWrites = new Set<Buffer>();
65
+ for (const execution of executions) {
66
+ for (const pass of execution.passes) {
67
+ if (pass.graphics !== undefined && pass.resolvedGraphics !== undefined) {
68
+ const inputs = resolveRenderFeatureDrawBuffers(
69
+ execution.featureIdentity,
70
+ execution.order,
71
+ pass.graphics,
72
+ pass.resolvedGraphics,
73
+ );
74
+ if (!inputs.ok) return inputs;
75
+ for (const group of Object.values(inputs.value)) {
76
+ for (const resource of group.values()) deferredAccesses.add(resource.buffer);
77
+ }
78
+ }
79
+ if (pass.shadowCaster) {
80
+ if (
81
+ pass.graphics === undefined ||
82
+ pass.graphicsState === undefined ||
83
+ pass.resolvedGraphics === undefined
84
+ )
85
+ return err(
86
+ new RenderFeatureStageFailedError(
87
+ execution.featureIdentity,
88
+ execution.order,
89
+ 'plan',
90
+ 'next-frame',
91
+ ),
92
+ );
93
+ const prepared = raster.prepareShadowDraws(
94
+ pass.name,
95
+ execution.featureIdentity,
96
+ execution.order,
97
+ pass.graphics,
98
+ pass.graphicsState,
99
+ pass.resolvedGraphics,
100
+ );
101
+ if (!prepared.ok) return prepared;
102
+ draws.push(prepared.value);
103
+ state.projected.add(pass);
104
+ continue;
105
+ }
106
+ const work = pass.resolvedGpuCompute;
107
+ if (work === undefined) continue;
108
+ const canRunEarly =
109
+ (work.sampledTargets?.length ?? 0) === 0 &&
110
+ work.buffers.every(
111
+ ({ buffer, access }) =>
112
+ !deferredWrites.has(buffer) && (!writesBuffer(access) || !deferredAccesses.has(buffer)),
113
+ );
114
+ if (canRunEarly) {
115
+ const added = compute.addPass(pass.name, execution.featureIdentity, execution.order, work);
116
+ if (!added.ok) return added;
117
+ state.projected.add(pass);
118
+ } else {
119
+ for (const { buffer, access } of work.buffers) {
120
+ deferredAccesses.add(buffer);
121
+ if (writesBuffer(access)) deferredWrites.add(buffer);
122
+ }
123
+ }
124
+ }
125
+ }
126
+ return ok({
127
+ accesses: draws.flatMap((draw) => [...draw.accesses]),
128
+ encode: (pass, frame, resources, view) => {
129
+ for (const draw of draws) draw.encode(pass, frame, resources, view);
130
+ },
131
+ });
132
+ }
133
+
17
134
  /** Project the host-owned plan execution directly into the one typed graph. */
18
135
  export function projectRenderFeaturePlans<FrameCtx extends RenderGraphFrame>(
19
136
  builder: RenderGraphBuilder<FrameCtx>,
@@ -22,19 +139,40 @@ export function projectRenderFeaturePlans<FrameCtx extends RenderGraphFrame>(
22
139
  readonly resolveTarget: RenderFeatureGraphTargetResolver;
23
140
  readonly resolveBindings?: RenderFeatureGraphBindingsResolver<FrameCtx> | undefined;
24
141
  readonly reportError?: ((error: RenderError) => void) | undefined;
142
+ readonly resolveStandardLighting?: RenderFeatureLightingResolver<FrameCtx> | undefined;
143
+ readonly standardSurfaceAccesses?: readonly GraphAccess[] | undefined;
144
+ readonly state?: ReturnType<typeof createRenderFeatureProjectionState>;
25
145
  },
26
146
  ): Result<void, RenderGraphError | RenderError> {
27
- const buffers = createRenderFeatureGraphBufferState();
28
- const compute = new RenderFeatureComputeGraphProjection(builder, buffers, options.reportError);
147
+ const state = options.state ?? createRenderFeatureProjectionState();
148
+ const buffers = state.buffers;
149
+ const compute = new RenderFeatureComputeGraphProjection(
150
+ builder,
151
+ buffers,
152
+ options.reportError,
153
+ options.resolveTarget,
154
+ );
29
155
  const raster = new RenderFeatureRasterGraphProjection(
30
156
  builder,
31
157
  options.resolveTarget,
32
158
  options.resolveBindings,
33
159
  buffers,
34
160
  options.reportError,
161
+ options.resolveStandardLighting,
162
+ options.standardSurfaceAccesses,
35
163
  );
36
164
  for (const execution of executions) {
37
165
  for (const pass of execution.passes) {
166
+ if (state.projected.has(pass)) continue;
167
+ if (pass.shadowCaster)
168
+ return err(
169
+ new RenderFeatureStageFailedError(
170
+ execution.featureIdentity,
171
+ execution.order,
172
+ 'plan',
173
+ 'next-frame',
174
+ ),
175
+ );
38
176
  if (pass.resolvedGpuCompute !== undefined) {
39
177
  const added = compute.addPass(
40
178
  pass.name,
@@ -1,4 +1,5 @@
1
1
  import type {
2
+ GraphAccess,
2
3
  GraphBuffer,
3
4
  GraphResourceResolver,
4
5
  GraphTexture,
@@ -8,7 +9,7 @@ import type {
8
9
  RenderGraphError,
9
10
  RenderGraphFrame,
10
11
  } from '@forgeax/engine-render-graph';
11
- import type { BindGroup, RhiRenderPassEncoder } from '@forgeax/engine-rhi';
12
+ import type { BindGroup, RenderPipeline, RhiRenderPassEncoder } from '@forgeax/engine-rhi';
12
13
  import { err, ok, type Result } from '@forgeax/engine-types';
13
14
  import {
14
15
  type RenderError,
@@ -58,6 +59,22 @@ export type RenderFeatureGraphBindingsResolver<FrameCtx extends RenderGraphFrame
58
59
  readonly resolveTarget: RenderFeatureGraphTargetResolver;
59
60
  }) => RenderFeatureGraphBindingsResolution | undefined;
60
61
 
62
+ export type RenderFeatureLightingResolver<FrameCtx extends RenderGraphFrame> = (
63
+ frame: FrameCtx,
64
+ pipeline: RenderPipeline,
65
+ ) => BindGroup | undefined;
66
+
67
+ /** Prepared draws embedded by the owning pipeline into its light-view passes. */
68
+ export interface RenderFeatureShadowDraws<FrameCtx extends RenderGraphFrame> {
69
+ readonly accesses: readonly GraphAccess[];
70
+ encode(
71
+ pass: RhiRenderPassEncoder,
72
+ frame: FrameCtx,
73
+ resources: GraphResourceResolver,
74
+ view: BindGroup,
75
+ ): void;
76
+ }
77
+
61
78
  interface ResolvedDrawBuffers {
62
79
  readonly vertex: ReadonlyMap<object, GraphBuffer>;
63
80
  readonly index: ReadonlyMap<object, GraphBuffer>;
@@ -75,6 +92,51 @@ function resolved(
75
92
  return snapshot.resolve(reference);
76
93
  }
77
94
 
95
+ /** Physical draw inputs shared by readiness ordering and graph imports. */
96
+ export function resolveRenderFeatureDrawBuffers(
97
+ featureIdentity: string,
98
+ order: number,
99
+ descriptor: RenderFeatureGraphicsPassDescriptor,
100
+ snapshot: PreparedGraphicsResolvedSnapshot,
101
+ ): Result<
102
+ {
103
+ vertex: Map<object, RenderFeatureResolvedGpuBuffer>;
104
+ index: Map<object, RenderFeatureResolvedGpuBuffer>;
105
+ indirect: Map<object, RenderFeatureResolvedGpuBuffer>;
106
+ },
107
+ RenderError
108
+ > {
109
+ const vertex = new Map<object, RenderFeatureResolvedGpuBuffer>();
110
+ const index = new Map<object, RenderFeatureResolvedGpuBuffer>();
111
+ const indirect = new Map<object, RenderFeatureResolvedGpuBuffer>();
112
+ for (const draw of descriptor.draws) {
113
+ for (const binding of draw.vertexData) {
114
+ const resource = resolved(snapshot, binding.resource);
115
+ if (resource?.kind !== 'vertex-data') return err(missing(featureIdentity, order));
116
+ vertex.set(binding.resource, {
117
+ buffer: resource.handle,
118
+ size: resource.size,
119
+ physicalUsage: resource.physicalUsage,
120
+ });
121
+ }
122
+ if (draw.indexData !== undefined) {
123
+ const resource = resolved(snapshot, draw.indexData.resource);
124
+ if (resource?.kind !== 'index-data') return err(missing(featureIdentity, order));
125
+ index.set(draw.indexData.resource, {
126
+ buffer: resource.handle,
127
+ size: resource.size,
128
+ physicalUsage: resource.physicalUsage,
129
+ });
130
+ }
131
+ if (draw.kind === 'draw-indirect' || draw.kind === 'draw-indexed-indirect') {
132
+ const resource = snapshot.resolveGpuBuffer?.(draw.command.buffer);
133
+ if (resource === undefined) return err(missing(featureIdentity, order));
134
+ indirect.set(draw.command.buffer, resource);
135
+ }
136
+ }
137
+ return ok({ vertex, index, indirect });
138
+ }
139
+
78
140
  export class RenderFeatureRasterGraphProjection<FrameCtx extends RenderGraphFrame> {
79
141
  private readonly buffers: RenderFeatureGraphBufferState;
80
142
 
@@ -84,10 +146,55 @@ export class RenderFeatureRasterGraphProjection<FrameCtx extends RenderGraphFram
84
146
  private readonly resolveBindings?: RenderFeatureGraphBindingsResolver<FrameCtx>,
85
147
  buffers?: RenderFeatureGraphBufferState,
86
148
  private readonly reportError?: (error: RenderError) => void,
149
+ private readonly resolveStandardLighting?: RenderFeatureLightingResolver<FrameCtx>,
150
+ private readonly standardSurfaceAccesses: readonly GraphAccess[] = [],
87
151
  ) {
88
152
  this.buffers = buffers ?? createRenderFeatureGraphBufferState();
89
153
  }
90
154
 
155
+ prepareShadowDraws(
156
+ name: string,
157
+ featureIdentity: string,
158
+ order: number,
159
+ descriptor: RenderFeatureGraphicsPassDescriptor,
160
+ state: RenderFeaturePreparedGraphicsState,
161
+ snapshot: PreparedGraphicsResolvedSnapshot,
162
+ ): Result<RenderFeatureShadowDraws<FrameCtx>, RenderGraphError | RenderError> {
163
+ const validated = validateRenderFeatureGraphicsPass(featureIdentity, descriptor, state);
164
+ if (!validated.ok) return validated;
165
+ const imported = this.importDrawBuffers(name, featureIdentity, order, descriptor, snapshot);
166
+ if (!imported.ok) return imported;
167
+ const accesses: GraphAccess[] = [
168
+ ...[...imported.value.vertex.values()].map((resource) => ({
169
+ resource,
170
+ usage: 'vertex-read' as const,
171
+ })),
172
+ ...[...imported.value.index.values()].map((resource) => ({
173
+ resource,
174
+ usage: 'index-read' as const,
175
+ })),
176
+ ...[...imported.value.indirect.values()].map((resource) => ({
177
+ resource,
178
+ usage: 'indirect-read' as const,
179
+ })),
180
+ ];
181
+ return ok({
182
+ accesses,
183
+ encode: (pass, frame, resources, view) =>
184
+ this.encode(
185
+ featureIdentity,
186
+ order,
187
+ descriptor,
188
+ snapshot,
189
+ imported.value,
190
+ pass,
191
+ frame,
192
+ resources,
193
+ view,
194
+ ),
195
+ });
196
+ }
197
+
91
198
  addPass(
92
199
  name: string,
93
200
  featureIdentity: string,
@@ -100,11 +207,21 @@ export class RenderFeatureRasterGraphProjection<FrameCtx extends RenderGraphFram
100
207
  if (!validated.ok) return validated;
101
208
 
102
209
  const accesses = [];
210
+ if (
211
+ descriptor.draws.some((draw) => {
212
+ const pipeline = resolved(snapshot, draw.pipeline);
213
+ return pipeline?.kind === 'pipeline' && pipeline.standardLighting === true;
214
+ })
215
+ )
216
+ accesses.push(...this.standardSurfaceAccesses);
103
217
  const colors = [];
104
218
  for (const attachment of descriptor.attachments.colors) {
105
219
  const target = this.resolveTarget(attachment.resource);
106
220
  if (target === undefined) return err(missing(featureIdentity, order));
107
221
  accesses.push({ resource: target.view, usage: 'color-attachment' } as const);
222
+ if (target.resolveTarget !== undefined) {
223
+ accesses.push({ resource: target.resolveTarget, usage: 'color-attachment' } as const);
224
+ }
108
225
  colors.push({
109
226
  view: target.view,
110
227
  ...(target.resolveTarget === undefined ? {} : { resolveTarget: target.resolveTarget }),
@@ -175,7 +292,7 @@ export class RenderFeatureRasterGraphProjection<FrameCtx extends RenderGraphFram
175
292
  resources,
176
293
  );
177
294
  } catch (failure) {
178
- this.reportError?.(
295
+ const error =
179
296
  failure instanceof Error && typeof (failure as Partial<RenderError>).code === 'string'
180
297
  ? (failure as RenderError)
181
298
  : new RenderFeatureDrawRecordingFailedError(
@@ -186,8 +303,10 @@ export class RenderFeatureRasterGraphProjection<FrameCtx extends RenderGraphFram
186
303
  'backend-recording-failed',
187
304
  failure instanceof Error ? failure.message : String(failure),
188
305
  'renderer-recover',
189
- ),
190
- );
306
+ );
307
+ this.reportError?.(error);
308
+ // A partially encoded intent is not a submitted transaction.
309
+ throw error;
191
310
  }
192
311
  },
193
312
  });
@@ -215,31 +334,15 @@ export class RenderFeatureRasterGraphProjection<FrameCtx extends RenderGraphFram
215
334
  return ok(undefined);
216
335
  };
217
336
 
218
- for (const draw of descriptor.draws) {
219
- for (const binding of draw.vertexData) {
220
- const resource = resolved(snapshot, binding.resource);
221
- if (resource?.kind !== 'vertex-data') return err(missing(featureIdentity, order));
222
- const added = add(vertex, binding.resource as object, {
223
- buffer: resource.handle,
224
- size: resource.size,
225
- physicalUsage: resource.physicalUsage,
226
- });
227
- if (!added.ok) return added;
228
- }
229
- if (draw.indexData !== undefined) {
230
- const resource = resolved(snapshot, draw.indexData.resource);
231
- if (resource?.kind !== 'index-data') return err(missing(featureIdentity, order));
232
- const added = add(index, draw.indexData.resource as object, {
233
- buffer: resource.handle,
234
- size: resource.size,
235
- physicalUsage: resource.physicalUsage,
236
- });
237
- if (!added.ok) return added;
238
- }
239
- if (draw.kind === 'draw-indirect' || draw.kind === 'draw-indexed-indirect') {
240
- const resource = snapshot.resolveGpuBuffer?.(draw.command.buffer);
241
- if (resource === undefined) return err(missing(featureIdentity, order));
242
- const added = add(indirect, draw.command.buffer as object, resource);
337
+ const inputs = resolveRenderFeatureDrawBuffers(featureIdentity, order, descriptor, snapshot);
338
+ if (!inputs.ok) return inputs;
339
+ for (const [source, destination] of [
340
+ [inputs.value.vertex, vertex],
341
+ [inputs.value.index, index],
342
+ [inputs.value.indirect, indirect],
343
+ ] as const) {
344
+ for (const [key, resource] of source) {
345
+ const added = add(destination, key, resource);
243
346
  if (!added.ok) return added;
244
347
  }
245
348
  }
@@ -255,14 +358,25 @@ export class RenderFeatureRasterGraphProjection<FrameCtx extends RenderGraphFram
255
358
  pass: RhiRenderPassEncoder,
256
359
  frame: FrameCtx,
257
360
  resources: GraphResourceResolver,
361
+ shadowView?: BindGroup,
258
362
  ): void {
259
363
  for (const draw of descriptor.draws) {
260
364
  const pipeline = resolved(snapshot, draw.pipeline);
261
365
  if (pipeline?.kind !== 'pipeline') throw missing(featureIdentity, order);
262
366
  pass.setPipeline(pipeline.handle);
367
+ if (pipeline.standardLighting === true) {
368
+ const lighting = this.resolveStandardLighting?.(frame, pipeline.handle);
369
+ if (lighting === undefined) throw missing(featureIdentity, order);
370
+ pass.setBindGroup(2, lighting);
371
+ }
263
372
  for (const [group, reference] of draw.bindings.entries()) {
264
373
  const binding = resolved(snapshot, reference);
265
374
  if (binding?.kind !== 'bindings') throw missing(featureIdentity, order);
375
+ const targetGroup = binding.descriptor?.values.group ?? group;
376
+ if (shadowView !== undefined && targetGroup === 0) {
377
+ pass.setBindGroup(0, shadowView, [0, 0]);
378
+ continue;
379
+ }
266
380
  const resolvedBindings =
267
381
  binding.handle ??
268
382
  this.resolveBindings?.({ frame, binding, resources, resolveTarget: this.resolveTarget });
@@ -273,7 +387,6 @@ export class RenderFeatureRasterGraphProjection<FrameCtx extends RenderGraphFram
273
387
  ? resolvedBindings.handle
274
388
  : resolvedBindings;
275
389
  if (handle === undefined) throw missing(featureIdentity, order);
276
- const targetGroup = binding.descriptor?.values.group ?? group;
277
390
  const dynamicOffsets =
278
391
  resolvedBindings !== undefined &&
279
392
  typeof resolvedBindings === 'object' &&
@@ -110,6 +110,17 @@ export interface RenderFeature<FrameData> {
110
110
  }[];
111
111
  extract(context: RenderFeatureExtractContext): Result<FrameData, RenderError>;
112
112
  plan(data: FrameData, context: RenderFeaturePlanContext): Result<RenderFeaturePlan, RenderError>;
113
+ /**
114
+ * Consume frame-owned producer state only after the compiled graph reached
115
+ * queue submission. The host invokes this callback at most once for the
116
+ * extracted frame and never during declarative planning.
117
+ */
118
+ onFrameSubmitted?(data: FrameData): void;
119
+ /**
120
+ * Discard frame-owned producer state when graph admission or submission is
121
+ * rejected. This is the symmetric recovery path for onFrameSubmitted.
122
+ */
123
+ onFrameAborted?(data: FrameData): void;
113
124
  }
114
125
 
115
126
  export interface RenderFeatureRecoverInput {
@@ -81,6 +81,8 @@ export type PostProcessReadSampleType = 'depth';
81
81
  export interface PostProcessShaderEntry {
82
82
  /** Composed WGSL source for the fragment stage (post-naga_oil). */
83
83
  readonly source: string;
84
+ /** Fragment entry point selected by the typed graph; defaults to `fs_main`. */
85
+ readonly fragmentEntryPoint?: string | undefined;
84
86
  /**
85
87
  * Params UBO schema. When undefined, the generic shader has no uniform buffer
86
88
  * and the BGL degrades to 2 entries (texture@0 + sampler@1). When present, the
@@ -134,6 +136,7 @@ export function postProcessShaderModuleLabel(identity: string, source: string):
134
136
  export function postProcessShaderEntrySignature(entry: PostProcessShaderEntry): string {
135
137
  return JSON.stringify({
136
138
  source: entry.source,
139
+ fragmentEntryPoint: entry.fragmentEntryPoint,
137
140
  params:
138
141
  entry.params === undefined
139
142
  ? undefined