@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
@@ -1,3 +1,4 @@
1
+ import { transmissionBackdropAvailable } from '../assembly/device-feature-admission';
1
2
  import { getOrCreateIblCache } from '../ibl/IblPipelineCache';
2
3
  import type { _InternalRenderPipelineContext } from './render-context';
3
4
  // @forgeax/engine-runtime - RenderSystem record stage: main-pass-material.
@@ -23,6 +24,7 @@ import {
23
24
  DEFAULT_MSDF_TEXT_PARAM_SCHEMA,
24
25
  DEFAULT_SPRITE_PARAM_SCHEMA,
25
26
  DEFAULT_UNLIT_PARAM_SCHEMA,
27
+ STANDARD_PHYSICAL_TEXTURE_FIELDS,
26
28
  STANDARD_PIPELINE_PARAM_SCHEMA,
27
29
  } from '@forgeax/engine-shader';
28
30
  import type {
@@ -51,7 +53,7 @@ import {
51
53
  physicalTextureFields,
52
54
  } from '../pbr-pipeline';
53
55
  import { deriveTextureExtent } from '../render-data';
54
- import type { MaterialSnapshot } from '../render-system-extract';
56
+ import type { MaterialSnapshot, SkylightSnapshot } from '../render-system-extract';
55
57
  import type { RenderTargetTextureSource } from '../targets/contracts';
56
58
  import {
57
59
  type RenderTargetMaterialSourceBinding,
@@ -548,6 +550,44 @@ function materialUboFloatView(payload: MaterialUboPayload): Float32Array {
548
550
  : new Float32Array(payload);
549
551
  }
550
552
 
553
+ function materialUboDataView(payload: MaterialUboPayload): DataView {
554
+ if (payload instanceof Float32Array || payload instanceof Uint8Array) {
555
+ return new DataView(payload.buffer, payload.byteOffset, payload.byteLength);
556
+ }
557
+ return new DataView(payload);
558
+ }
559
+
560
+ /** Write one schema value with the scalar type's actual WGSL bit encoding. */
561
+ function writeNumericParamValue(
562
+ view: DataView,
563
+ entry: { readonly offset: number; readonly size: number; readonly type: string },
564
+ value: number | readonly number[],
565
+ ): void {
566
+ const values = typeof value === 'number' ? [value] : value;
567
+ const width = entry.size / 4;
568
+ const writeCount = Math.min(values.length, width);
569
+ for (let index = 0; index < writeCount; index += 1) {
570
+ const component = values[index];
571
+ if (typeof component !== 'number') continue;
572
+ const byteOffset = entry.offset + index * 4;
573
+ switch (entry.type) {
574
+ case 'i32':
575
+ view.setInt32(byteOffset, component, true);
576
+ break;
577
+ case 'u32':
578
+ view.setUint32(byteOffset, component, true);
579
+ break;
580
+ case 'f32':
581
+ case 'vec2':
582
+ case 'vec3':
583
+ case 'vec4':
584
+ case 'color':
585
+ view.setFloat32(byteOffset, component, true);
586
+ break;
587
+ }
588
+ }
589
+ }
590
+
551
591
  export function applyMaterialTextureUvScales(
552
592
  payload: MaterialUboPayload,
553
593
  material: MaterialSnapshot,
@@ -745,7 +785,7 @@ export function writePbrMaterialUboPayload(
745
785
  );
746
786
  }
747
787
  buf.fill(0);
748
- const f32 = materialUboFloatView(buf);
788
+ const dataView = materialUboDataView(buf);
749
789
  const schema =
750
790
  material.materialParamSchema === undefined || material.materialParamSchema.length === 0
751
791
  ? STANDARD_PIPELINE_PARAM_SCHEMA
@@ -782,15 +822,10 @@ export function writePbrMaterialUboPayload(
782
822
  const value =
783
823
  snapshot?.[entry.name] ??
784
824
  fallback(entry.name, schema.find((item) => item.name === entry.name) ?? entry);
785
- const offset = entry.offset / 4;
786
- const width = entry.size / 4;
787
825
  if (typeof value === 'number') {
788
- f32[offset] = value;
826
+ writeNumericParamValue(dataView, entry, value);
789
827
  } else if (Array.isArray(value)) {
790
- for (let index = 0; index < Math.min(width, value.length); index += 1) {
791
- const component = value[index];
792
- if (typeof component === 'number') f32[offset + index] = component;
793
- }
828
+ writeNumericParamValue(dataView, entry, value);
794
829
  }
795
830
  }
796
831
  }
@@ -839,28 +874,18 @@ export function applyParamSnapshotToUbo(
839
874
  ): void {
840
875
  if (paramSchema === undefined) return;
841
876
  if (paramSnapshot === undefined) return;
842
- const f32 = materialUboFloatView(payload);
877
+ const dataView = materialUboDataView(payload);
843
878
  const { uboLayout } = derivedParamSchema(paramSchema);
844
879
  for (const entry of uboLayout.entries) {
845
880
  const value = paramSnapshot[entry.name];
846
881
  if (value === undefined) continue;
847
- const f32Offset = entry.offset / 4;
848
- const f32Width = entry.size / 4;
849
882
  if (typeof value === 'number') {
850
- // Scalar f32 / i32 / u32 -- single-slot write. (i32 / u32 still arrive
851
- // as a JS number; the GPU side reads the four bytes as the declared
852
- // type, so an f32 write is the correct bit pattern when the caller
853
- // already produced an integer value.)
854
- if (f32Width >= 1) f32[f32Offset] = value;
883
+ writeNumericParamValue(dataView, entry, value);
855
884
  continue;
856
885
  }
857
886
  if (Array.isArray(value)) {
858
887
  const arr = value as readonly number[];
859
- const writeCount = Math.min(arr.length, f32Width);
860
- for (let i = 0; i < writeCount; i++) {
861
- const v = arr[i];
862
- if (typeof v === 'number') f32[f32Offset + i] = v;
863
- }
888
+ writeNumericParamValue(dataView, entry, arr);
864
889
  }
865
890
  // string values (texture GUIDs) belong to texture bindings, not the
866
891
  // UBO; derive's uboLayout.entries already strips non-numeric schema
@@ -869,6 +894,31 @@ export function applyParamSnapshotToUbo(
869
894
  }
870
895
  }
871
896
 
897
+ /**
898
+ * Seed a schema-driven UBO with the defaults declared by its numeric contract.
899
+ *
900
+ * Prepared graphics (VFX and other feature-owned materials) do not pass
901
+ * through the extracted `MaterialSnapshot` writer, so their payload starts as
902
+ * zeroed storage. Applying the schema defaults first keeps that path
903
+ * byte-compatible with the ordinary material writer while preserving the
904
+ * snapshot writer's intentional overlay semantics.
905
+ */
906
+ export function applyParamSchemaDefaultsToUbo(
907
+ payload: MaterialUboPayload,
908
+ paramSchema: readonly ParamSchemaEntry[] | undefined,
909
+ ): void {
910
+ if (paramSchema === undefined) return;
911
+ const defaults: Record<string, number | readonly number[]> = {};
912
+ for (const entry of derivedParamSchema(paramSchema).uboLayout.entries) {
913
+ const schemaEntry = paramSchema.find((candidate) => candidate.name === entry.name);
914
+ const value = schemaEntry?.default;
915
+ if (typeof value === 'number' || Array.isArray(value)) {
916
+ defaults[entry.name] = value as number | readonly number[];
917
+ }
918
+ }
919
+ applyParamSnapshotToUbo(payload, paramSchema, defaults);
920
+ }
921
+
872
922
  /**
873
923
  * feat-20260704 M3/w19: shared per-submesh material bind-group assembly, hoisted
874
924
  * from the `buildPerSubmeshMaterialBg` closure inside recordMainPass so both the
@@ -898,10 +948,12 @@ export interface PerSubmeshMaterialBgDeps {
898
948
  readonly resolveReflectionProbeResources?: (
899
949
  materialWorld: World,
900
950
  entityKey: number,
901
- ) => SkylightBindGroupResources | undefined;
951
+ ) => { readonly resources: SkylightBindGroupResources; readonly probeIndex: number } | undefined;
902
952
  readonly materialBgShared: Map<string, WeakMap<object, unknown>>;
903
953
  /** Cross-frame final BG reuse keyed by the stable source material handle. */
904
954
  readonly materialBgAssemblyCache: Map<string, MaterialBgAssemblyCacheEntry>;
955
+ /** Producer-owned numeric scene rows consumed by scene-index PBR draws. */
956
+ readonly sceneMaterialBuffer?: Buffer;
905
957
  /** Active transmission backdrop; undefined/null means layout placeholder. */
906
958
  readonly transmissionBackdropView?: TextureView | null;
907
959
  readonly bindGroupCounts: BindGroupCounts;
@@ -956,6 +1008,7 @@ export function isMaterialBgAssemblyCacheHit(
956
1008
  skylightResources: SkylightBindGroupResources,
957
1009
  materialResourceEpoch: number,
958
1010
  transmissionBackdropView?: TextureView | null,
1011
+ sceneMaterialBuffer?: Buffer,
959
1012
  ): cached is MaterialBgAssemblyCacheEntry {
960
1013
  if (transmissionBackdropView != null) return false;
961
1014
  return (
@@ -963,9 +1016,11 @@ export function isMaterialBgAssemblyCacheHit(
963
1016
  cached.materialResourceEpoch === materialResourceEpoch &&
964
1017
  cached.materialBgl === materialBgl &&
965
1018
  cached.materialBuffer === materialBuffer &&
1019
+ cached.sceneMaterialBuffer === sceneMaterialBuffer &&
966
1020
  cached.skylightResources.irradianceView === skylightResources.irradianceView &&
967
1021
  cached.skylightResources.irradianceSampler === skylightResources.irradianceSampler &&
968
1022
  cached.skylightResources.prefilterView === skylightResources.prefilterView &&
1023
+ cached.skylightResources.skylightPrefilterView === skylightResources.skylightPrefilterView &&
969
1024
  cached.skylightResources.prefilterSampler === skylightResources.prefilterSampler &&
970
1025
  cached.skylightResources.brdfLutView === skylightResources.brdfLutView &&
971
1026
  cached.skylightResources.brdfLutSampler === skylightResources.brdfLutSampler &&
@@ -995,13 +1050,13 @@ export function buildPerSubmeshMaterialBg(
995
1050
  bindGroupCounts,
996
1051
  frameState,
997
1052
  } = deps;
998
- const effectiveSkylightResources =
999
- resolveReflectionProbeResources?.(materialWorld, entityKey) ?? skylightResources;
1053
+ const selectedProbe = resolveReflectionProbeResources?.(materialWorld, entityKey);
1054
+ const effectiveSkylightResources = selectedProbe?.resources ?? skylightResources;
1000
1055
  const smMaterialHandle = submeshMaterial.materialHandle;
1001
1056
  const materialCacheKey =
1002
1057
  smMaterialHandle === undefined
1003
1058
  ? undefined
1004
- : `${materialWorld.identity}:${smMaterialHandle}:${materialShaderId ?? ''}`;
1059
+ : `${materialWorld.identity}:${smMaterialHandle}:${materialShaderId ?? ''}:${selectedProbe?.probeIndex ?? 'sky'}`;
1005
1060
  const smHasVideoFields = (submeshMaterial.videoTextureFields?.size ?? 0) > 0;
1006
1061
  const smShaderId = materialShaderId;
1007
1062
  // The cooked shader schema owns the resource ABI. A material snapshot may
@@ -1028,6 +1083,9 @@ export function buildPerSubmeshMaterialBg(
1028
1083
  ? BUILTIN_USER_REGION_TEXTURE_FIELDS
1029
1084
  : userRegionTextureFieldOrder(smSchema).filter((field) => !physicalFields.includes(field));
1030
1085
  const hasActiveTransmissionBackdrop = transmissionBackdropView != null;
1086
+ const sceneMaterialBuffer = runtime.device.caps.storageBuffer
1087
+ ? (deps.sceneMaterialBuffer ?? pipelineState.meshStorageBuffer.buffer)
1088
+ : undefined;
1031
1089
  const diagnosticsEnabled = materialDiagnosticsEnabled();
1032
1090
  if (smMaterialHandle !== undefined && !smHasVideoFields && !hasActiveTransmissionBackdrop) {
1033
1091
  const cached =
@@ -1041,6 +1099,7 @@ export function buildPerSubmeshMaterialBg(
1041
1099
  effectiveSkylightResources,
1042
1100
  store.materialResourceEpoch,
1043
1101
  transmissionBackdropView,
1102
+ sceneMaterialBuffer,
1044
1103
  )
1045
1104
  ) {
1046
1105
  if (diagnosticsEnabled) {
@@ -1051,31 +1110,34 @@ export function buildPerSubmeshMaterialBg(
1051
1110
  [
1052
1111
  {
1053
1112
  binding: 1 + smUserRegionFields.length * 2,
1054
- resource: { kind: 'textureView', value: skylightResources.irradianceView },
1113
+ resource: { kind: 'textureView', value: effectiveSkylightResources.irradianceView },
1055
1114
  },
1056
1115
  {
1057
1116
  binding: 2 + smUserRegionFields.length * 2,
1058
- resource: { kind: 'sampler', value: skylightResources.irradianceSampler },
1117
+ resource: { kind: 'sampler', value: effectiveSkylightResources.irradianceSampler },
1059
1118
  },
1060
1119
  {
1061
1120
  binding: 3 + smUserRegionFields.length * 2,
1062
- resource: { kind: 'textureView', value: skylightResources.prefilterView },
1121
+ resource: { kind: 'textureView', value: effectiveSkylightResources.prefilterView },
1063
1122
  },
1064
1123
  {
1065
1124
  binding: 4 + smUserRegionFields.length * 2,
1066
- resource: { kind: 'sampler', value: skylightResources.prefilterSampler },
1125
+ resource: { kind: 'sampler', value: effectiveSkylightResources.prefilterSampler },
1067
1126
  },
1068
1127
  {
1069
1128
  binding: 5 + smUserRegionFields.length * 2,
1070
- resource: { kind: 'textureView', value: skylightResources.brdfLutView },
1129
+ resource: { kind: 'textureView', value: effectiveSkylightResources.brdfLutView },
1071
1130
  },
1072
1131
  {
1073
1132
  binding: 6 + smUserRegionFields.length * 2,
1074
- resource: { kind: 'sampler', value: skylightResources.brdfLutSampler },
1133
+ resource: { kind: 'sampler', value: effectiveSkylightResources.brdfLutSampler },
1075
1134
  },
1076
1135
  {
1077
1136
  binding: 7 + smUserRegionFields.length * 2,
1078
- resource: { kind: 'buffer', value: { buffer: skylightResources.intensityBuffer } },
1137
+ resource: {
1138
+ kind: 'buffer',
1139
+ value: { buffer: effectiveSkylightResources.intensityBuffer },
1140
+ },
1079
1141
  },
1080
1142
  ],
1081
1143
  1 + smUserRegionFields.length * 2,
@@ -1194,7 +1256,9 @@ export function buildPerSubmeshMaterialBg(
1194
1256
  }
1195
1257
  }
1196
1258
  physicalTextureInjections.push({
1197
- slot,
1259
+ slot: STANDARD_PHYSICAL_TEXTURE_FIELDS.indexOf(
1260
+ field as (typeof STANDARD_PHYSICAL_TEXTURE_FIELDS)[number],
1261
+ ),
1198
1262
  sampler: smSamplerForField(field),
1199
1263
  view,
1200
1264
  });
@@ -1210,12 +1274,33 @@ export function buildPerSubmeshMaterialBg(
1210
1274
  const smMergedEntries = assembleMaterialWithSkylightEntries(
1211
1275
  smBaseEntries,
1212
1276
  effectiveSkylightResources,
1213
- {
1214
- sampler: transmissionSampler,
1215
- ...(transmissionBackdropView === undefined ? {} : { backdropView: transmissionBackdropView }),
1216
- } satisfies TransmissionBindGroupResources,
1277
+ transmissionBackdropAvailable(runtime.device.limits.maxSampledTexturesPerShaderStage)
1278
+ ? ({
1279
+ sampler: transmissionSampler,
1280
+ ...(transmissionBackdropView === undefined
1281
+ ? {}
1282
+ : { backdropView: transmissionBackdropView }),
1283
+ } satisfies TransmissionBindGroupResources)
1284
+ : null,
1217
1285
  physicalTextureInjections,
1218
1286
  );
1287
+ // Storage-capable devices share one Standard material BGL with the
1288
+ // scene-index GPU lane. Even direct draws need a complete entry for
1289
+ // binding(46), although their shader does not read the scene table. Reuse
1290
+ // the storage-backed mesh table as a neutral placeholder until a
1291
+ // producer-owned GPU scene table is available; GPU-driven draws replace it
1292
+ // with `deps.sceneMaterialBuffer`.
1293
+ if (runtime.device.caps.storageBuffer) {
1294
+ smMergedEntries.push({
1295
+ binding: 46,
1296
+ resource: {
1297
+ kind: 'buffer' as const,
1298
+ value: {
1299
+ buffer: deps.sceneMaterialBuffer ?? pipelineState.meshStorageBuffer.buffer,
1300
+ },
1301
+ },
1302
+ });
1303
+ }
1219
1304
  const createBindGroup = (): BindGroup => {
1220
1305
  const result = runtime.device.createBindGroup({
1221
1306
  label: 'pbr-material-skylight-bg',
@@ -1291,6 +1376,7 @@ export function buildPerSubmeshMaterialBg(
1291
1376
  materialResourceEpoch: store.materialResourceEpoch,
1292
1377
  materialBgl: smMaterialBgl,
1293
1378
  materialBuffer: pipelineState.materialUniformBuffer.buffer,
1379
+ ...(sceneMaterialBuffer === undefined ? {} : { sceneMaterialBuffer }),
1294
1380
  skylightResources: effectiveSkylightResources,
1295
1381
  bindGroup: smBindGroup,
1296
1382
  });
@@ -1302,8 +1388,21 @@ export function buildPerSubmeshMaterialBg(
1302
1388
  const ZERO_SKYLIGHT_PAYLOAD = new Float32Array([0, 0, 0, 0, 0, 0, 0, 1]);
1303
1389
 
1304
1390
  /** The same scene resources back material bindings in depth and color passes. */
1305
- export function prepareMaterialSkylight(c: _InternalRenderPipelineContext) {
1306
- const { runtime, pipelineState, skylight, skylightCount } = c;
1391
+ /**
1392
+ * Resolve the renderer-owned Skylight bundle for both ordinary geometry and
1393
+ * prepared RenderFeature materials. Feature preparation runs before the
1394
+ * main pass is encoded, so it cannot rely on the geometry pass to initialize
1395
+ * the intensity buffer or to select the current IBL views. Keeping this
1396
+ * small argument-based helper as the single resolver makes the two paths use
1397
+ * identical resources while retaining the existing frame-local write.
1398
+ */
1399
+ export function resolveMaterialSkylight(
1400
+ runtime: Pick<RenderSystemRuntime, 'device' | 'deviceScope'>,
1401
+ pipelineState: Pick<PipelineState, 'skylightFallback'>,
1402
+ skylight: SkylightSnapshot | undefined,
1403
+ skylightCount: number,
1404
+ environmentIbl?: _InternalRenderPipelineContext['environmentIbl'],
1405
+ ) {
1307
1406
  const skylightFallback = pipelineState.skylightFallback;
1308
1407
  if (skylightFallback === null) {
1309
1408
  throw new RhiError({
@@ -1356,6 +1455,13 @@ export function prepareMaterialSkylight(c: _InternalRenderPipelineContext) {
1356
1455
  };
1357
1456
  }
1358
1457
  }
1458
+ if (environmentIbl !== undefined && skylight !== undefined && skylight.equirectHandle === 0) {
1459
+ activeViews = {
1460
+ irr: environmentIbl.irradiance,
1461
+ pref: environmentIbl.prefilter,
1462
+ brdf: activeViews?.brdf ?? skylightFallback.brdfLutView,
1463
+ };
1464
+ }
1359
1465
  const skylightResources =
1360
1466
  activeViews !== undefined
1361
1467
  ? {
@@ -1378,3 +1484,14 @@ export function prepareMaterialSkylight(c: _InternalRenderPipelineContext) {
1378
1484
  };
1379
1485
  return { skylightResources, activeViews };
1380
1486
  }
1487
+
1488
+ /** The same scene resources back material bindings in depth and color passes. */
1489
+ export function prepareMaterialSkylight(c: _InternalRenderPipelineContext) {
1490
+ return resolveMaterialSkylight(
1491
+ c.runtime,
1492
+ c.pipelineState,
1493
+ c.skylight,
1494
+ c.skylightCount,
1495
+ c.environmentIbl,
1496
+ );
1497
+ }
@@ -5,24 +5,18 @@
5
5
  import type { World } from '@forgeax/engine-ecs';
6
6
  import {
7
7
  type BindGroup,
8
- type BindGroupEntry,
9
8
  type Buffer,
10
9
  type RenderPipeline,
11
10
  RhiError,
12
11
  type RhiRenderPassEncoder,
13
- type TextureView,
14
12
  } from '@forgeax/engine-rhi';
15
- import type { Handle, MaterialRenderState } from '@forgeax/engine-types';
13
+ import type { MaterialRenderState } from '@forgeax/engine-types';
16
14
  import { GpuBuffer } from '../gpu-resource';
17
15
  import {
18
16
  GPU_BUFFER_USAGE_COPY_DST,
19
17
  GPU_BUFFER_USAGE_STORAGE,
20
18
  GPU_BUFFER_USAGE_UNIFORM,
21
19
  } from '../gpu-usage';
22
- import {
23
- assembleMaterialWithSkylightEntries,
24
- type SkylightBindGroupResources,
25
- } from '../ibl/skylight-bind-group';
26
20
  import type { InstanceBufferCacheEntry } from '../instance-buffer-cache';
27
21
  import { SPRITE_PREMULTIPLIED_ALPHA_BLEND } from '../materials';
28
22
  import { SPRITE_PASS_PER_INSTANCE_REGION_VARIANT_SET } from '../pbr-pipeline';
@@ -35,67 +29,15 @@ import type {
35
29
  import { worldEntityKey } from './frame-snapshot';
36
30
  import { recordGeometryDraws, resolveGeometryInstancesBindGroup } from './main-pass-geometry';
37
31
  import {
38
- BUILTIN_USER_REGION_TEXTURE_FIELDS,
39
- defaultViewForUserRegionField,
40
- residentTextureView,
41
- } from './main-pass-material';
42
- import {
43
- extractEntryResourceHandle,
44
- getOrCreatePerEntity,
45
32
  MAX_UNIFORM_INSTANCES,
46
33
  MESH_PER_ENTITY_STRIDE,
47
34
  packInstanceStorageBuffer,
48
35
  } from './mesh-ssbo';
49
36
  import type { _InternalRenderPipelineContext } from './render-context';
50
- import { MATERIAL_PER_ENTITY_STRIDE, STANDARD_PBR_UBO_SIZE } from './render-context';
37
+ import { MATERIAL_PER_ENTITY_STRIDE } from './render-context';
51
38
 
52
39
  export type { SpriteInstancesSnapshot };
53
40
 
54
- /**
55
- * Build the sprite material's Standard user-region from the shared field-order
56
- * owner. The sprite shader uses the same Standard material bind-group layout;
57
- * keeping this projection derived from the shared list prevents IBL injection
58
- * from moving ahead of newly added material texture pairs.
59
- */
60
- export function buildSpritePassBaseMaterialEntries(
61
- pipelineState: _InternalRenderPipelineContext['pipelineState'],
62
- spriteTexView: TextureView,
63
- ): BindGroupEntry[] {
64
- const entries: BindGroupEntry[] = [
65
- {
66
- binding: 0,
67
- resource: {
68
- kind: 'buffer' as const,
69
- value: {
70
- buffer: pipelineState.materialUniformBuffer.buffer,
71
- offset: 0,
72
- size: STANDARD_PBR_UBO_SIZE,
73
- },
74
- },
75
- },
76
- ];
77
- for (const [index, field] of BUILTIN_USER_REGION_TEXTURE_FIELDS.entries()) {
78
- const view =
79
- field === 'baseColorTexture'
80
- ? spriteTexView
81
- : defaultViewForUserRegionField(field, pipelineState);
82
- entries.push(
83
- {
84
- binding: 1 + index * 2,
85
- resource: {
86
- kind: 'sampler' as const,
87
- value: index === 0 ? pipelineState.nearestSampler : pipelineState.defaultSampler,
88
- },
89
- },
90
- {
91
- binding: 2 + index * 2,
92
- resource: { kind: 'textureView' as const, value: view },
93
- },
94
- );
95
- }
96
- return entries;
97
- }
98
-
99
41
  /**
100
42
  * Build the interleaved sprite instance payload consumed by this record owner.
101
43
  * The extract stage validates the two packed arrays before they reach this
@@ -204,7 +146,6 @@ export function recordSpritePass(
204
146
  materialWorld: World,
205
147
  materialShaderId?: string,
206
148
  ) => BindGroup,
207
- skylightResources: SkylightBindGroupResources,
208
149
  graphPass?: RhiRenderPassEncoder,
209
150
  selectedDispatch?: readonly DispatchEntry[],
210
151
  ): boolean {
@@ -405,7 +346,7 @@ export function recordSpritePass(
405
346
  c,
406
347
  spritePass,
407
348
  matchedIndices,
408
- skylightResources,
349
+ resolveMaterialBindGroup,
409
350
  spritePH,
410
351
  spritePH_withRegion,
411
352
  spriteLitPH,
@@ -509,7 +450,12 @@ function recordSpriteEntityDraws(
509
450
  c: _InternalRenderPipelineContext,
510
451
  spritePass: RhiRenderPassEncoder,
511
452
  matchedIndices: Set<number> | null,
512
- skylightResources: SkylightBindGroupResources,
453
+ resolveMaterialBindGroup: (
454
+ materialSlot: number,
455
+ material: MaterialSnapshot,
456
+ entityKey: number,
457
+ materialWorld: World,
458
+ ) => BindGroup,
513
459
  spritePH: RenderPipeline | null,
514
460
  spritePH_withRegion: RenderPipeline | null,
515
461
  spriteLitPH: RenderPipeline | null,
@@ -518,10 +464,8 @@ function recordSpriteEntityDraws(
518
464
  const {
519
465
  runtime,
520
466
  world,
521
- store,
522
467
  pipelineState,
523
468
  frameState,
524
- bindGroupCounts,
525
469
  validatedOrdered,
526
470
  meshBindGroup,
527
471
  foldDispatchPlan,
@@ -853,48 +797,13 @@ function recordSpriteEntityDraws(
853
797
 
854
798
  const materialSlot = materialSlotIndices[i]?.[0] ?? 0;
855
799
 
856
- // Per-entity sprite material bind group: same standard PBR user-region
857
- // layout as in the geometry pass sprite branch + Skylight merged entries
858
- // the geometry pass sprite branch + Skylight merged entries (same
859
- // skylightResources in scope from above). Texture view is resolved
860
- // from the sprite material's baseColorTexture handle.
861
- const spriteTexHandle = spriteEntry.source.material.baseColorTexture as
862
- | Handle<'TextureAsset', 'shared'>
863
- | undefined;
864
- let spriteTexView = pipelineState.defaultWhiteTextureView;
865
- if (spriteTexHandle !== undefined) {
866
- const tv = residentTextureView(spriteEntry.world ?? world, store, runtime, spriteTexHandle);
867
- if (tv !== undefined) spriteTexView = tv as never;
868
- }
869
- const spritePassBaseMaterialEntries = buildSpritePassBaseMaterialEntries(
870
- pipelineState,
871
- spriteTexView,
872
- );
873
- const spritePassMergedEntries = assembleMaterialWithSkylightEntries(
874
- spritePassBaseMaterialEntries,
875
- skylightResources,
876
- );
877
-
878
- // Sprite-pass material BG cache: keyed on shader id (shared across all
879
- // sprite entities) so entities using the same atlas texture share one
880
- // BindGroup instead of creating one per entity (O5 fix — inner WeakMap
881
- // chain naturally deduplicates by GPU resource object identity, so two
882
- // entities with different atlases still get distinct BGs).
883
- const spritePassBg: BindGroup = getOrCreatePerEntity(
884
- frameState.materialBgShared,
885
- 'forgeax::sprite',
886
- spritePassMergedEntries.map((e) => extractEntryResourceHandle(e)),
887
- 'sprite-pass-material',
888
- () => {
889
- const result = runtime.device.createBindGroup({
890
- label: 'sprite-pass-material-bg',
891
- layout: pipelineState.materialBindGroupLayout,
892
- entries: spritePassMergedEntries,
893
- });
894
- if (!result.ok) throw result.error;
895
- return result.value;
896
- },
897
- bindGroupCounts,
800
+ // The same material owner serves HDR and linear-LDR draws. Do not
801
+ // replace authored samplers, texture sources or cooked layouts here.
802
+ const spritePassBg = resolveMaterialBindGroup(
803
+ materialSlot,
804
+ spriteEntry.source.material,
805
+ spriteEntry.source.entityKey,
806
+ spriteEntry.world ?? world,
898
807
  );
899
808
 
900
809
  spritePass.setBindGroup(1, spritePassBg, [materialSlot * MATERIAL_PER_ENTITY_STRIDE]);