@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
@@ -62,7 +62,7 @@ export class DeviceScope {
62
62
  readonly owner: string;
63
63
  readonly parent: DeviceScope | undefined;
64
64
  private lifecycleState: DeviceScopeState = 'active';
65
- private readonly resources: OwnedResource[] = [];
65
+ private readonly resources = new Map<ResourceRef<unknown>, OwnedResource>();
66
66
  private readonly children: DeviceScope[] = [];
67
67
 
68
68
  private constructor(generation: number, owner: string, parent?: DeviceScope) {
@@ -99,7 +99,7 @@ export class DeviceScope {
99
99
 
100
100
  ref<T>(kind: DeviceResourceKind, value: T): ResourceRef<T> {
101
101
  const ref = new DeviceResourceRef(kind, this.owner, this.generation, value);
102
- this.resources.push({ ref: ref as DeviceResourceRef<unknown>, cleanup: () => undefined });
102
+ this.resources.set(ref, { ref, cleanup: () => undefined });
103
103
  return ref;
104
104
  }
105
105
 
@@ -116,7 +116,7 @@ export class DeviceScope {
116
116
  }
117
117
 
118
118
  resourceDelta(): number {
119
- return this.resources.length;
119
+ return this.resources.size;
120
120
  }
121
121
 
122
122
  /** @internal */
@@ -126,16 +126,22 @@ export class DeviceScope {
126
126
  cleanup: (value: T) => void | Promise<void>,
127
127
  ): ResourceRef<T> {
128
128
  const ref = new DeviceResourceRef(kind, this.owner, this.generation, value);
129
- this.resources.push({
130
- ref: ref as DeviceResourceRef<unknown>,
129
+ this.resources.set(ref, {
130
+ ref,
131
131
  cleanup: idempotentCleanup(cleanup) as (resource: unknown) => void | Promise<void>,
132
132
  });
133
133
  return ref;
134
134
  }
135
135
 
136
+ /** @internal Remove ownership only after the resource's cleanup succeeded. */
137
+ _release(ref: ResourceRef<unknown>): void {
138
+ this.resources.delete(ref);
139
+ }
140
+
136
141
  /** @internal */
137
142
  _clearResources(): OwnedResource[] {
138
- const resources = this.resources.splice(0);
143
+ const resources = [...this.resources.values()];
144
+ this.resources.clear();
139
145
  for (const resource of resources.reverse()) {
140
146
  try {
141
147
  const pending = resource.cleanup(resource.ref.value);
@@ -214,7 +220,7 @@ export class DeviceScope {
214
220
  return {
215
221
  owner: this.owner,
216
222
  generation: this.generation,
217
- resourceCount: this.resources.length,
223
+ resourceCount: this.resources.size,
218
224
  };
219
225
  }
220
226
  }
@@ -38,10 +38,7 @@ import {
38
38
  prepareMipmaps,
39
39
  } from '@forgeax/engine-assets-runtime';
40
40
  import type { World } from '@forgeax/engine-ecs';
41
- import {
42
- PROCEDURAL_FLOATS_PER_VERTEX,
43
- type VertexLayoutProjection,
44
- } from '@forgeax/engine-geometry';
41
+ import { deriveVertexCount, type VertexLayoutProjection } from '@forgeax/engine-geometry';
45
42
  import { halfFloat } from '@forgeax/engine-math';
46
43
  import {
47
44
  type Buffer,
@@ -101,7 +98,6 @@ import {
101
98
  runIblPrecompute,
102
99
  } from '../ibl/IblPipelineCache';
103
100
  import type { RhiErrorListenerRegistry } from '../lifecycle';
104
- import type { RecoveryColdWorkGuard } from '../record/render-context';
105
101
  import {
106
102
  type CubeRenderData,
107
103
  deriveRenderDataCubemap,
@@ -187,6 +183,7 @@ export function writePrefilterUniforms(
187
183
  roughness: number,
188
184
  mipFaceSize: number,
189
185
  sourceMipLevelCount = 1,
186
+ sourceSpace: 'image' | 'camera' = 'image',
190
187
  ): Result<void, RhiError> {
191
188
  if (subPassIdx < 0 || subPassIdx >= PREFILTER_SUBPASS_COUNT) {
192
189
  return invalidUniformInput(
@@ -200,7 +197,12 @@ export function writePrefilterUniforms(
200
197
  `writePrefilterUniforms received sourceMipLevelCount=${sourceMipLevelCount}`,
201
198
  );
202
199
  }
203
- const payload = new Float32Array([roughness, mipFaceSize, sourceMipLevelCount, 0]);
200
+ const payload = new Float32Array([
201
+ roughness,
202
+ mipFaceSize,
203
+ sourceMipLevelCount,
204
+ sourceSpace === 'camera' ? 1 : 0,
205
+ ]);
204
206
  return device.queue.writeBuffer(buffer, subPassIdx * DYNAMIC_OFFSET_STRIDE, payload);
205
207
  }
206
208
 
@@ -208,6 +210,7 @@ export function writeAllPrefilterUniforms(
208
210
  device: FaceUniformsDevice,
209
211
  buffer: Buffer,
210
212
  sourceMipLevelCount = 1,
213
+ sourceSpace: 'image' | 'camera' = 'image',
211
214
  ): Result<void, RhiError> {
212
215
  for (let mip = 0; mip < PREFILTER_MIP_LEVELS; mip++) {
213
216
  const roughness = mip / (PREFILTER_MIP_LEVELS - 1);
@@ -220,6 +223,7 @@ export function writeAllPrefilterUniforms(
220
223
  roughness,
221
224
  mipFaceSize,
222
225
  sourceMipLevelCount,
226
+ sourceSpace,
223
227
  );
224
228
  if (!result.ok) return result;
225
229
  }
@@ -372,6 +376,23 @@ function packMeshLodGeometry(
372
376
  }
373
377
  lowerData.push(projected.value);
374
378
  }
379
+ if (
380
+ deriveVertexCount(root.vertices, rootData.layoutProjection) === undefined ||
381
+ lowerMeshes.some((mesh, index) => {
382
+ const data = lowerData[index];
383
+ return (
384
+ data === undefined || deriveVertexCount(mesh.vertices, data.layoutProjection) === undefined
385
+ );
386
+ })
387
+ ) {
388
+ return err(
389
+ new RhiError({
390
+ code: 'asset-not-registered',
391
+ expected: 'every MeshAsset LOD vertex byte length to match its layout projection stride',
392
+ hint: 'reimport the LOD chain so interleaved vertex bytes match attributes',
393
+ }),
394
+ );
395
+ }
375
396
  if (
376
397
  lowerData.some(
377
398
  (data) =>
@@ -479,14 +500,6 @@ export interface MeshGpuHandles {
479
500
  readonly iboBytes: number;
480
501
  readonly indexCount: number;
481
502
  readonly indexFormat: 'uint16' | 'uint32';
482
- /**
483
- * Vertex stride discriminator (feat-20260611). `'12F'` = 48 B
484
- * (position+normal+uv+tangent); `'18F'` = 72 B (12F + skinIndex(uint16x4) +
485
- * skinWeight(float32x4)). Mirrors `MeshRenderData.layout` in render-data.ts
486
- * and `MeshRenderData.layout` -- the residency and render-data layout
487
- * fields are the same union and move together.
488
- */
489
- readonly layout: '12F' | '18F';
490
503
  /** Geometry-owned vertex layout projection used by every GPU consumer. */
491
504
  readonly layoutProjection: VertexLayoutProjection;
492
505
  /**
@@ -497,7 +510,7 @@ export interface MeshGpuHandles {
497
510
  * MeshRenderData.uvSetCount.
498
511
  */
499
512
  readonly uvSetCount: number;
500
- /** Vertex count uses 18F for skin or the geometry-owned canonical base stride. */
513
+ /** Vertex count derived from the geometry-owned layout projection. */
501
514
  readonly vertexCount: number;
502
515
  /** True when `MeshAsset.indices` is present (indexed draw path). */
503
516
  readonly indexed: boolean;
@@ -547,7 +560,6 @@ export class GpuResidencyCache {
547
560
  // Hardware-probe caps injected at `configureGpuDevice`; guards the HDR cubemap
548
561
  // path (_uploadCubemapFromEquirect) when `rgba16floatRenderable` is false.
549
562
  private caps: RhiCaps | undefined = undefined;
550
- private recoveryColdWorkGuard: RecoveryColdWorkGuard | undefined;
551
563
  private deviceEpoch = 0;
552
564
  private textureGeneration = 0;
553
565
 
@@ -657,9 +669,6 @@ export class GpuResidencyCache {
657
669
  }
658
670
 
659
671
  /** Arm the first-published-frame assertion on this generation's store. */
660
- setRecoveryColdWorkGuard(guard: RecoveryColdWorkGuard | undefined): void {
661
- this.recoveryColdWorkGuard = guard;
662
- }
663
672
 
664
673
  /**
665
674
  * Wrap a raw RHI Buffer handle into a GpuBuffer. The wrapper holds a
@@ -676,11 +685,7 @@ export class GpuResidencyCache {
676
685
  if (device === undefined) {
677
686
  throw new Error('GpuResidencyCache.wrapBuf called before configureGpuDevice');
678
687
  }
679
- const resource = new GpuBuffer(device, rawHandle);
680
- this.deviceScope?._adopt('buffer', resource, (value: GpuBuffer) => {
681
- if (!value.isDestroyed) value.destroy();
682
- });
683
- return resource;
688
+ return new GpuBuffer(device, rawHandle, this.deviceScope);
684
689
  }
685
690
 
686
691
  /** Wrap a raw RHI Texture handle into a GpuTexture (mirror of wrapBuf). */
@@ -689,11 +694,7 @@ export class GpuResidencyCache {
689
694
  if (device === undefined) {
690
695
  throw new Error('GpuResidencyCache.wrapTex called before configureGpuDevice');
691
696
  }
692
- const resource = new GpuTexture(device, rawHandle);
693
- this.deviceScope?._adopt('texture', resource, (value: GpuTexture) => {
694
- if (!value.isDestroyed) value.destroy();
695
- });
696
- return resource;
697
+ return new GpuTexture(device, rawHandle, this.deviceScope);
697
698
  }
698
699
 
699
700
  /**
@@ -1023,7 +1024,6 @@ export class GpuResidencyCache {
1023
1024
  const key = this.worldKey(handleSlot(handle), worldId);
1024
1025
  const existing = this.samplerGpuHandles.get(key);
1025
1026
  if (existing !== undefined) return ok(existing);
1026
- this.recoveryColdWorkGuard?.noteUploadColdWork();
1027
1027
  const device = this.gpuDevice;
1028
1028
  if (device === undefined) {
1029
1029
  return err(
@@ -1159,7 +1159,6 @@ export class GpuResidencyCache {
1159
1159
  const key = this.worldKey(id, worldId);
1160
1160
  const existing = this.meshGpuHandles.get(key);
1161
1161
  if (existing !== undefined) return ok(existing);
1162
- this.recoveryColdWorkGuard?.noteUploadColdWork();
1163
1162
  const projected = deriveRenderDataMesh(pod);
1164
1163
  if (!projected.ok) return projected;
1165
1164
  return this.uploadMeshById(key, pod, projected.value, lodMeshes);
@@ -1168,7 +1167,6 @@ export class GpuResidencyCache {
1168
1167
  const texKey = this.worldKey(id, worldId);
1169
1168
  const existing = this.textureGpuHandles.get(texKey);
1170
1169
  if (existing !== undefined) return ok(existing);
1171
- this.recoveryColdWorkGuard?.noteUploadColdWork();
1172
1170
  const projected = deriveRenderDataTexture(pod);
1173
1171
  if (!projected.ok) return projected;
1174
1172
  const decoded: DecodedImage = decodedFromTexture(pod);
@@ -2010,6 +2008,16 @@ export class GpuResidencyCache {
2010
2008
  );
2011
2009
  }
2012
2010
 
2011
+ const vertexCount = deriveVertexCount(mesh.vertices, renderData.layoutProjection);
2012
+ if (vertexCount === undefined) {
2013
+ return err(
2014
+ new RhiError({
2015
+ code: 'asset-not-registered',
2016
+ expected: 'MeshAsset.vertices byteLength to be divisible by its layout projection stride',
2017
+ hint: 'reimport the mesh so the interleaved vertex bytes match attributes',
2018
+ }),
2019
+ );
2020
+ }
2013
2021
  const packed = packMeshLodGeometry(mesh, renderData, lodMeshes);
2014
2022
  if (!packed.ok) return packed;
2015
2023
  const { vertices, indices, lodRanges } = packed.value;
@@ -2068,14 +2076,9 @@ export class GpuResidencyCache {
2068
2076
  iboBytes: indices === undefined ? 0 : indexBytes,
2069
2077
  indexCount: mesh.indices === undefined ? 0 : mesh.indices.length,
2070
2078
  indexFormat: indices instanceof Uint32Array ? 'uint32' : 'uint16',
2071
- layout: renderData.layoutProjection.attributes.some(
2072
- (attribute) => attribute.key === 'skinIndex' || attribute.key === 'skinWeight',
2073
- )
2074
- ? '18F'
2075
- : '12F',
2076
2079
  layoutProjection: renderData.layoutProjection,
2077
2080
  uvSetCount: 1 + extraUvSets,
2078
- vertexCount: mesh.vertices.byteLength / renderData.layoutProjection.arrayStride,
2081
+ vertexCount,
2079
2082
  indexed: mesh.indices !== undefined,
2080
2083
  topology: renderData.submeshes[0]?.topology ?? 'triangle-list',
2081
2084
  submeshes: renderData.submeshes,
@@ -2102,6 +2105,8 @@ export class GpuResidencyCache {
2102
2105
  if (entry === undefined) return;
2103
2106
 
2104
2107
  const newVertexBytes = newVertices.byteLength;
2108
+ const newVertexCount = deriveVertexCount(newVertices, entry.layoutProjection);
2109
+ if (newVertexCount === undefined) return;
2105
2110
  const indexBytesUnpadded = newIndices.byteLength;
2106
2111
  const newIndexBytes = ((indexBytesUnpadded + 3) >> 2) << 2;
2107
2112
 
@@ -2131,10 +2136,9 @@ export class GpuResidencyCache {
2131
2136
  iboBytes: entry.iboBytes,
2132
2137
  indexCount: newIndices.length,
2133
2138
  indexFormat: 'uint16',
2134
- layout: '12F',
2135
2139
  layoutProjection: entry.layoutProjection,
2136
2140
  uvSetCount: entry.uvSetCount,
2137
- vertexCount: newVertices.length / PROCEDURAL_FLOATS_PER_VERTEX,
2141
+ vertexCount: newVertexCount,
2138
2142
  indexed: true,
2139
2143
  topology: entry.topology,
2140
2144
  submeshes: nextSubmeshes,
@@ -2175,10 +2179,9 @@ export class GpuResidencyCache {
2175
2179
  iboBytes: newIndexBytes,
2176
2180
  indexCount: newIndices.length,
2177
2181
  indexFormat: 'uint16',
2178
- layout: '12F',
2179
2182
  layoutProjection: entry.layoutProjection,
2180
2183
  uvSetCount: entry.uvSetCount,
2181
- vertexCount: newVertices.length / PROCEDURAL_FLOATS_PER_VERTEX,
2184
+ vertexCount: newVertexCount,
2182
2185
  indexed: true,
2183
2186
  topology: entry.topology,
2184
2187
  submeshes: nextSubmeshes,
@@ -199,13 +199,11 @@ function cloneCandidate(candidate: DynamicGeometryCandidate): DynamicGeometryCan
199
199
 
200
200
  function validateMesh(mesh: MeshAsset): string | undefined {
201
201
  if (mesh.kind !== 'mesh') return 'MeshAsset.kind must be mesh';
202
- if (
203
- !(mesh.vertices instanceof Float32Array) ||
204
- mesh.vertices.length === 0 ||
205
- mesh.vertices.length % 3 !== 0
206
- ) {
207
- return 'MeshAsset.vertices must be a non-empty Float32Array with xyz triples';
202
+ if (!(mesh.vertices instanceof Float32Array) || mesh.vertices.length === 0) {
203
+ return 'MeshAsset.vertices must be a non-empty Float32Array';
208
204
  }
205
+ // vertices may be interleaved. Attribute layout validation belongs to the
206
+ // mesh producer/residency path; this gate must not assume an xyz-only stride.
209
207
  if (
210
208
  mesh.indices !== undefined &&
211
209
  !(mesh.indices instanceof Uint16Array || mesh.indices instanceof Uint32Array)
@@ -214,8 +212,15 @@ function validateMesh(mesh: MeshAsset): string | undefined {
214
212
  }
215
213
  if (mesh.submeshes.length === 0)
216
214
  return 'MeshAsset.submeshes must contain at least one topology range';
217
- if (mesh.materialSlots.length < mesh.submeshes.length) {
218
- return 'MeshAsset.materialSlots must cover every submesh';
215
+ if (
216
+ mesh.submeshes.some(
217
+ (submesh) =>
218
+ !Number.isSafeInteger(submesh.materialSlot) ||
219
+ submesh.materialSlot < 0 ||
220
+ submesh.materialSlot >= mesh.materialSlots.length,
221
+ )
222
+ ) {
223
+ return 'MeshAsset.materialSlots must cover every referenced materialSlot';
219
224
  }
220
225
  if (mesh.vertices.some((value) => !Number.isFinite(value)))
221
226
  return 'MeshAsset.vertices must be finite';
@@ -0,0 +1,281 @@
1
+ import type { RenderGraphBuilder, RenderGraphError } from '@forgeax/engine-render-graph';
2
+ import type { BindGroup, BindGroupLayout, RenderPipeline, Sampler } from '@forgeax/engine-rhi';
3
+ import { RhiError } from '@forgeax/engine-rhi';
4
+ import type { Result } from '@forgeax/engine-types';
5
+ import type { _InternalRenderPipelineContext } from '../record/render-context';
6
+ import { VIEW_UNIFORM_BYTES } from '../record/view-ubo';
7
+ import type { RenderPipelineFrame, RenderPipelineTarget } from '../render-pipeline';
8
+ import { addAtmosphereIbl, type GraphEnvironment } from './ibl';
9
+ import { atmosphereStorage } from './storage';
10
+
11
+ const CUBE_SIZE = 128;
12
+
13
+ /** One device-owned sky cube feeds the graph background; the sun disc is added only there. */
14
+ export function addAtmosphereBackground(
15
+ graph: RenderGraphBuilder<RenderPipelineFrame>,
16
+ color: RenderPipelineTarget,
17
+ ): Result<GraphEnvironment, RenderGraphError> {
18
+ const cube = graph.importTexture(
19
+ 'atmosphere-sky',
20
+ {
21
+ format: 'rgba16float',
22
+ size: { width: CUBE_SIZE, height: CUBE_SIZE, depthOrArrayLayers: 6 },
23
+ usage: 0x14,
24
+ },
25
+ (frame) => atmosphereStorage(frame).sky,
26
+ );
27
+ if (!cube.ok) return cube;
28
+ const cubeView = graph.view(cube.value, { dimension: 'cube', arrayLayerCount: 6 });
29
+ if (!cubeView.ok) return cubeView;
30
+ const params = graph.importBuffer(
31
+ 'atmosphere-params',
32
+ { size: 64, usage: 0x48 },
33
+ (frame) => atmosphereStorage(frame).params,
34
+ );
35
+ if (!params.ok) return params;
36
+ const vertices = graph.importBuffer(
37
+ 'atmosphere-face-vertices',
38
+ { size: 6 * 3 * 3 * 4, usage: 0x28 },
39
+ (frame) => atmosphereStorage(frame).vertices,
40
+ );
41
+ if (!vertices.ok) return vertices;
42
+ const view = graph.importBuffer(
43
+ 'atmosphere-view',
44
+ { size: VIEW_UNIFORM_BYTES, usage: 0x40 | 0x08 },
45
+ (frame) => (frame as _InternalRenderPipelineContext).pipelineState.viewUniformBuffer,
46
+ );
47
+ if (!view.ok) return view;
48
+ let state:
49
+ | {
50
+ cubePipeline: RenderPipeline;
51
+ cubeLayout: BindGroupLayout;
52
+ backgroundPipeline: RenderPipeline;
53
+ backgroundLayout: BindGroupLayout;
54
+ sampler: Sampler;
55
+ cubeGroup?: BindGroup;
56
+ backgroundGroup?: BindGroup;
57
+ }
58
+ | undefined;
59
+ const frameOf = (frame: RenderPipelineFrame) => frame as _InternalRenderPipelineContext;
60
+ const dirty = (frame: RenderPipelineFrame) =>
61
+ frameOf(frame).frameState.environmentFrame?.environmentSignature !==
62
+ atmosphereStorage(frame).submittedSignature;
63
+ const upload = graph.addCopyPass('atmosphere-prepare', {
64
+ accesses: [
65
+ { resource: params.value, usage: 'copy-dst' },
66
+ { resource: vertices.value, usage: 'copy-dst' },
67
+ ],
68
+ executeIf: dirty,
69
+ encode: ({ frame, resources }) => {
70
+ const environment = frameOf(frame).frameState.environmentFrame;
71
+ const sun = environment?.sun;
72
+ if (environment?.source.kind !== 'atmosphere' || sun === undefined) {
73
+ throw new RhiError({
74
+ code: 'webgpu-runtime-error',
75
+ expected: 'selected Atmosphere frame carries its directional sun',
76
+ hint: 'publish the validated resource-owner environment frame before graph recording',
77
+ });
78
+ }
79
+ const settings = environment.source.atmosphere;
80
+ const values = new Float32Array([
81
+ ...sun.direction,
82
+ sun.intensity,
83
+ ...sun.color,
84
+ 0,
85
+ settings.turbidity,
86
+ settings.rayleigh,
87
+ settings.mieCoefficient,
88
+ settings.mieDirectionalG,
89
+ settings.sunAngularRadius,
90
+ settings.sunAngularRadius > 0 ? 1 : 0,
91
+ 0,
92
+ 0,
93
+ ]);
94
+ frame.runtime.device.queue
95
+ .writeBuffer(resources.buffer(params.value).unwrap(), 0, values)
96
+ .unwrap();
97
+ const triangles = new Float32Array(6 * 9);
98
+ for (let face = 0; face < 6; face += 1) {
99
+ triangles.set([-1, -1, face + 1, 3, -1, face + 1, -1, 3, face + 1], face * 9);
100
+ }
101
+ frame.runtime.device.queue
102
+ .writeBuffer(resources.buffer(vertices.value).unwrap(), 0, triangles)
103
+ .unwrap();
104
+ },
105
+ });
106
+ if (!upload.ok) return upload;
107
+ const ensureState = (frame: RenderPipelineFrame) => {
108
+ if (state !== undefined) return state;
109
+ const sources = frame.atmosphereShaders;
110
+ const factory = frame.runtime.shaderModuleFactory;
111
+ if (sources === undefined || factory === undefined) {
112
+ throw new RhiError({
113
+ code: 'shader-compile-failed',
114
+ expected: 'shader manifest includes the Atmosphere cube and background programs',
115
+ hint: 'rebuild the Engine shader manifest with the package-owned Atmosphere entries',
116
+ });
117
+ }
118
+ const device = frame.runtime.device;
119
+ const cubeModule = factory
120
+ .createShaderModule({ code: sources.cube, label: 'atmosphere_cube' })
121
+ .unwrap();
122
+ const backgroundModule = factory
123
+ .createShaderModule({ code: sources.background, label: 'atmosphere_background' })
124
+ .unwrap();
125
+ const cubeLayout = device
126
+ .createBindGroupLayout({
127
+ entries: [{ binding: 0, visibility: 2, buffer: { type: 'uniform', minBindingSize: 64 } }],
128
+ })
129
+ .unwrap();
130
+ const backgroundLayout = device
131
+ .createBindGroupLayout({
132
+ entries: [
133
+ { binding: 0, visibility: 2, texture: { sampleType: 'float', viewDimension: 'cube' } },
134
+ { binding: 1, visibility: 2, sampler: { type: 'filtering' } },
135
+ {
136
+ binding: 2,
137
+ visibility: 2,
138
+ buffer: { type: 'uniform', minBindingSize: VIEW_UNIFORM_BYTES },
139
+ },
140
+ { binding: 3, visibility: 2, buffer: { type: 'uniform', minBindingSize: 64 } },
141
+ ],
142
+ })
143
+ .unwrap();
144
+ const cubePipeline = device
145
+ .createRenderPipeline({
146
+ label: 'atmosphere_cube',
147
+ layout: device.createPipelineLayout({ bindGroupLayouts: [cubeLayout] }).unwrap(),
148
+ vertex: {
149
+ module: cubeModule,
150
+ entryPoint: 'atmosphere_cubemap_vs',
151
+ buffers: [
152
+ {
153
+ arrayStride: 12,
154
+ attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x3' }],
155
+ },
156
+ ],
157
+ },
158
+ fragment: {
159
+ module: cubeModule,
160
+ entryPoint: 'atmosphere_cubemap_fs',
161
+ targets: [{ format: 'rgba16float' }],
162
+ },
163
+ primitive: { topology: 'triangle-list', cullMode: 'none' },
164
+ })
165
+ .unwrap();
166
+ const backgroundPipeline = device
167
+ .createRenderPipeline({
168
+ label: 'atmosphere_background',
169
+ layout: device.createPipelineLayout({ bindGroupLayouts: [backgroundLayout] }).unwrap(),
170
+ vertex: { module: backgroundModule, entryPoint: 'atmosphere_background_vs', buffers: [] },
171
+ fragment: {
172
+ module: backgroundModule,
173
+ entryPoint: 'atmosphere_background_fs',
174
+ targets: [{ format: color.format }],
175
+ },
176
+ primitive: { topology: 'triangle-list', cullMode: 'none' },
177
+ multisample: { count: color.sampleCount },
178
+ })
179
+ .unwrap();
180
+ const sampler = device
181
+ .createSampler({ minFilter: 'linear', magFilter: 'linear', mipmapFilter: 'linear' })
182
+ .unwrap();
183
+ state = { cubePipeline, cubeLayout, backgroundPipeline, backgroundLayout, sampler };
184
+ return state;
185
+ };
186
+ for (let face = 0; face < 6; face += 1) {
187
+ const faceView = graph.view(cube.value, {
188
+ dimension: '2d',
189
+ baseArrayLayer: face,
190
+ arrayLayerCount: 1,
191
+ });
192
+ if (!faceView.ok) return faceView;
193
+ const pass = graph.addRasterPass(`atmosphere-cube-${face}`, {
194
+ accesses: [
195
+ { resource: faceView.value, usage: 'color-attachment' },
196
+ { resource: params.value, usage: 'uniform-read' },
197
+ { resource: vertices.value, usage: 'vertex-read' },
198
+ ],
199
+ colorAttachments: [{ view: faceView.value, loadOp: 'clear', storeOp: 'store' }],
200
+ executeIf: dirty,
201
+ encode: ({ pass, frame, resources }) => {
202
+ const current = ensureState(frame);
203
+ current.cubeGroup ??= frame.runtime.device
204
+ .createBindGroup({
205
+ layout: current.cubeLayout,
206
+ entries: [
207
+ {
208
+ binding: 0,
209
+ resource: {
210
+ kind: 'buffer',
211
+ value: { buffer: resources.buffer(params.value).unwrap(), size: 64 },
212
+ },
213
+ },
214
+ ],
215
+ })
216
+ .unwrap();
217
+ pass.setPipeline(current.cubePipeline);
218
+ pass.setBindGroup(0, current.cubeGroup);
219
+ pass.setVertexBuffer(0, resources.buffer(vertices.value).unwrap());
220
+ pass.draw(3, 1, face * 3, 0);
221
+ if (face === 5) {
222
+ const signature = frameOf(frame).frameState.environmentFrame?.environmentSignature;
223
+ frameOf(frame).frameState.pendingAtmospherePublish = () => {
224
+ atmosphereStorage(frame).submittedSignature = signature;
225
+ };
226
+ }
227
+ },
228
+ });
229
+ if (!pass.ok) return pass;
230
+ }
231
+ const ibl = addAtmosphereIbl(graph, cubeView.value, vertices.value, dirty);
232
+ if (!ibl.ok) return ibl;
233
+ const background = graph.addRasterPass('atmosphere-background', {
234
+ accesses: [
235
+ { resource: cubeView.value, usage: 'sampled-read' },
236
+ { resource: params.value, usage: 'uniform-read' },
237
+ { resource: view.value, usage: 'uniform-read' },
238
+ { resource: color.view, usage: 'color-attachment' },
239
+ ],
240
+ // Initialize scene radiance before opaque and transparent draws. Geometry
241
+ // uses the normal scene depth authority, so alpha blending sees the sky
242
+ // and no later background pass can overwrite a transparent foreground.
243
+ colorAttachments: [{ view: color.view, loadOp: 'clear', storeOp: 'store' }],
244
+ encode: ({ pass, frame, resources }) => {
245
+ const current = ensureState(frame);
246
+ current.backgroundGroup ??= frame.runtime.device
247
+ .createBindGroup({
248
+ layout: current.backgroundLayout,
249
+ entries: [
250
+ {
251
+ binding: 0,
252
+ resource: {
253
+ kind: 'textureView',
254
+ value: resources.textureView(cubeView.value).unwrap(),
255
+ },
256
+ },
257
+ { binding: 1, resource: { kind: 'sampler', value: current.sampler } },
258
+ {
259
+ binding: 2,
260
+ resource: {
261
+ kind: 'buffer',
262
+ value: { buffer: resources.buffer(view.value).unwrap(), size: VIEW_UNIFORM_BYTES },
263
+ },
264
+ },
265
+ {
266
+ binding: 3,
267
+ resource: {
268
+ kind: 'buffer',
269
+ value: { buffer: resources.buffer(params.value).unwrap(), size: 64 },
270
+ },
271
+ },
272
+ ],
273
+ })
274
+ .unwrap();
275
+ pass.setPipeline(current.backgroundPipeline);
276
+ pass.setBindGroup(0, current.backgroundGroup);
277
+ pass.draw(3);
278
+ },
279
+ });
280
+ return background.ok ? ibl : background;
281
+ }