@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
package/src/internal.ts CHANGED
@@ -49,4 +49,26 @@ export {
49
49
  type OcclusionRuntimeTestHooks,
50
50
  setOcclusionRuntimeTestHooks,
51
51
  } from './scene/visibility/occlusion-runtime';
52
+ export {
53
+ createSsrHistoryOwner,
54
+ SSR_HISTORY_FORMAT,
55
+ type SsrHistoryCandidate,
56
+ type SsrHistoryError,
57
+ type SsrHistoryFailureStage,
58
+ type SsrHistoryInspection,
59
+ SsrHistoryOwner,
60
+ type SsrHistoryResetReason,
61
+ type SsrHistoryResources,
62
+ type SsrHistorySlot,
63
+ type SsrHistoryState,
64
+ } from './ssr/history';
65
+ export { estimateSsrSpatialMemory } from './ssr/resources';
66
+ export {
67
+ createSsrTemporalConsumer,
68
+ type SsrTemporalCandidate,
69
+ SsrTemporalConsumer,
70
+ type SsrTemporalError,
71
+ type SsrTemporalExecutionError,
72
+ type SsrTemporalInspection,
73
+ } from './ssr/temporal';
52
74
  export { TemporalFrameCoordinator } from './temporal/frame-coordinator';
package/src/lifecycle.ts CHANGED
@@ -3,6 +3,7 @@ import type { RenderGraphError } from '@forgeax/engine-render-graph';
3
3
  import type { RhiError } from '@forgeax/engine-rhi';
4
4
  import type { SkinError } from '@forgeax/engine-skinning';
5
5
  import type { ImageError } from '@forgeax/engine-types';
6
+ import type { GpuDrivenPreparationError } from './errors/gpu-driven';
6
7
  import type { RenderError } from './errors/render';
7
8
  import type { PostProcessError } from './post-process-errors';
8
9
 
@@ -18,6 +19,7 @@ export type RendererError =
18
19
  | RenderGraphError
19
20
  | ImageError
20
21
  | RenderError
22
+ | GpuDrivenPreparationError
21
23
  | AssetRuntimeError
22
24
  | SkinError
23
25
  | PostProcessError;
@@ -0,0 +1,194 @@
1
+ import {
2
+ type MaterialShaderArtifactReceipt,
3
+ STANDARD_PIPELINE_PARAM_SCHEMA,
4
+ } from '@forgeax/engine-shader';
5
+ import { derive, type ParamSchemaEntry, type UboFieldLayout } from '@forgeax/engine-types';
6
+ import { GPU_SCENE_LAYOUTS } from './gpu-scene-schema';
7
+ import type { MaterialSnapshot } from './render-system-extract';
8
+
9
+ const ROW = GPU_SCENE_LAYOUTS.material;
10
+ const STANDARD_PIPELINE_DERIVED = derive(STANDARD_PIPELINE_PARAM_SCHEMA);
11
+
12
+ function isNumericValue(value: unknown): value is number | readonly number[] {
13
+ return typeof value === 'number' || Array.isArray(value);
14
+ }
15
+
16
+ function numericFallback(
17
+ name: string,
18
+ material: MaterialSnapshot,
19
+ ): number | readonly number[] | undefined {
20
+ switch (name) {
21
+ case 'baseColor':
22
+ return [
23
+ material.baseColor[0] ?? 0,
24
+ material.baseColor[1] ?? 0,
25
+ material.baseColor[2] ?? 0,
26
+ 1,
27
+ ];
28
+ case 'metallic':
29
+ return material.metallic;
30
+ case 'roughness':
31
+ return material.roughness;
32
+ case 'emissive':
33
+ return material.emissive ?? [0, 0, 0];
34
+ case 'emissiveIntensity':
35
+ return material.emissiveIntensity ?? 0;
36
+ case 'occlusionStrength':
37
+ return material.occlusionStrength ?? 1;
38
+ case 'normalScale':
39
+ return material.normalScale ?? 1;
40
+ case 'specularColor':
41
+ return material.specularColor ?? [1, 1, 1];
42
+ default:
43
+ return undefined;
44
+ }
45
+ }
46
+
47
+ function numericValue(
48
+ name: string,
49
+ material: MaterialSnapshot,
50
+ schema: readonly ParamSchemaEntry[],
51
+ allowStandardFallback = false,
52
+ ): number | readonly number[] | undefined {
53
+ const snapshotValue = material.paramSnapshot?.[name];
54
+ if (isNumericValue(snapshotValue)) return snapshotValue;
55
+ if (allowStandardFallback) {
56
+ const materialValue = numericFallback(name, material);
57
+ if (materialValue !== undefined) return materialValue;
58
+ }
59
+ const defaultValue = schema.find((entry) => entry.name === name)?.default;
60
+ if (isNumericValue(defaultValue)) return defaultValue;
61
+ return undefined;
62
+ }
63
+
64
+ function writeScalar(view: DataView, member: UboFieldLayout, value: number): void {
65
+ switch (member.type) {
66
+ case 'f32':
67
+ case 'vec2':
68
+ case 'vec3':
69
+ case 'vec4':
70
+ case 'color':
71
+ view.setFloat32(member.offset, value, true);
72
+ return;
73
+ case 'i32':
74
+ view.setInt32(member.offset, value, true);
75
+ return;
76
+ case 'u32':
77
+ view.setUint32(member.offset, value, true);
78
+ return;
79
+ }
80
+ }
81
+
82
+ function writeNumeric(
83
+ view: DataView,
84
+ member: UboFieldLayout,
85
+ value: number | readonly number[] | undefined,
86
+ ): void {
87
+ if (member.type === 'f32' || member.type === 'i32' || member.type === 'u32') {
88
+ writeScalar(view, member, typeof value === 'number' ? value : (value?.[0] ?? 0));
89
+ return;
90
+ }
91
+ const values = Array.isArray(value) ? value : [];
92
+ const count = member.type === 'vec2' ? 2 : member.type === 'vec3' ? 3 : 4;
93
+ for (let index = 0; index < count; index += 1) {
94
+ writeScalar(
95
+ view,
96
+ { ...member, offset: member.offset + index * 4, type: 'f32' },
97
+ values[index] ?? 0,
98
+ );
99
+ }
100
+ }
101
+
102
+ function writeVec4(view: DataView, offset: number, values: readonly number[]): void {
103
+ for (let index = 0; index < 4; index += 1) {
104
+ view.setFloat32(offset + index * 4, values[index] ?? 0, true);
105
+ }
106
+ }
107
+
108
+ function validateReceipt(receipt: MaterialShaderArtifactReceipt): void {
109
+ const expectedFields = ROW.fields
110
+ .filter((field) => !field.name.startsWith('_gpuDrivenPadding'))
111
+ .map((field) => field.name);
112
+ if (
113
+ receipt.materialRow.byteLength !== ROW.stride ||
114
+ receipt.materialRow.fields.length !== expectedFields.length ||
115
+ receipt.materialRow.fields.some((field, index) => field !== expectedFields[index])
116
+ ) {
117
+ throw new RangeError(
118
+ `Standard PBR material row receipt must match the ${ROW.stride}-byte canonical ABI`,
119
+ );
120
+ }
121
+ }
122
+
123
+ /** Pack the producer receipt's numeric Standard PBR row into the GPU Scene table. */
124
+ export function packStandardPbrMaterialRow(
125
+ receipt: MaterialShaderArtifactReceipt,
126
+ material: MaterialSnapshot,
127
+ ): Uint8Array {
128
+ validateReceipt(receipt);
129
+ const payload = new Uint8Array(ROW.stride);
130
+ const view = new DataView(payload.buffer);
131
+ for (const member of STANDARD_PIPELINE_DERIVED.numericMembers) {
132
+ writeNumeric(
133
+ view,
134
+ member,
135
+ numericValue(member.name, material, STANDARD_PIPELINE_PARAM_SCHEMA, true),
136
+ );
137
+ }
138
+ for (const record of STANDARD_PIPELINE_DERIVED.coordinateRecords) {
139
+ const coordinates = material.textureCoordinates?.get(record.parameter);
140
+ const transform = coordinates?.transform;
141
+ writeVec4(view, record.offset, [
142
+ transform?.offset?.[0] ?? 0,
143
+ transform?.offset?.[1] ?? 0,
144
+ transform?.scale?.[0] ?? 1,
145
+ transform?.scale?.[1] ?? 1,
146
+ ]);
147
+ writeVec4(view, record.offset + 16, [
148
+ coordinates?.set ?? 0,
149
+ transform?.rotation ?? 0,
150
+ coordinates?.physicalUvScale?.[0] ?? 1,
151
+ coordinates?.physicalUvScale?.[1] ?? 1,
152
+ ]);
153
+ }
154
+ return payload;
155
+ }
156
+
157
+ /**
158
+ * Pack any producer-owned numeric/coordinate schema into the shared GPU Scene
159
+ * row page. Resource handles are intentionally absent: the scene-index shader
160
+ * reads texture/sampler bindings from the ordinary material group while this
161
+ * row carries only the values its generated `MaterialParameters` struct owns.
162
+ * `undefined` means the schema exceeds the page and must remain outside the
163
+ * capable lane.
164
+ */
165
+ export function packMaterialProgramRow(
166
+ schema: readonly ParamSchemaEntry[],
167
+ material: MaterialSnapshot,
168
+ rowStride = ROW.stride,
169
+ ): Uint8Array | undefined {
170
+ const derived = derive(schema);
171
+ if (derived.totalBytes > rowStride || rowStride < 16 || rowStride % 16 !== 0) return undefined;
172
+ const payload = new Uint8Array(rowStride);
173
+ const view = new DataView(payload.buffer);
174
+ for (const member of derived.numericMembers) {
175
+ writeNumeric(view, member, numericValue(member.name, material, schema));
176
+ }
177
+ for (const record of derived.coordinateRecords) {
178
+ const coordinates = material.textureCoordinates?.get(record.parameter);
179
+ const transform = coordinates?.transform;
180
+ writeVec4(view, record.offset, [
181
+ transform?.offset?.[0] ?? 0,
182
+ transform?.offset?.[1] ?? 0,
183
+ transform?.scale?.[0] ?? 1,
184
+ transform?.scale?.[1] ?? 1,
185
+ ]);
186
+ writeVec4(view, record.offset + 16, [
187
+ coordinates?.set ?? 0,
188
+ transform?.rotation ?? 0,
189
+ coordinates?.physicalUvScale?.[0] ?? 1,
190
+ coordinates?.physicalUvScale?.[1] ?? 1,
191
+ ]);
192
+ }
193
+ return payload;
194
+ }
package/src/materials.ts CHANGED
@@ -21,6 +21,36 @@ export type MaterialTransmissionValidationReason =
21
21
  | 'blend'
22
22
  | 'depth-write';
23
23
 
24
+ export type MaterialAuthoringValidationReason = 'non-finite' | 'range';
25
+
26
+ /** Structured authoring failure for a built-in Standard material parameter. */
27
+ export class MaterialAuthoringContractError extends Error {
28
+ readonly code = 'material-authoring-contract-invalid' as const;
29
+ readonly expected =
30
+ 'Standard material authoring values are finite and within their declared ranges';
31
+ readonly hint =
32
+ 'repair the named Standard material parameter alphaCutoff before publishing the material';
33
+ readonly detail: {
34
+ readonly code: 'material-authoring-contract-invalid';
35
+ readonly material: 'Standard';
36
+ readonly parameter: 'alphaCutoff';
37
+ readonly reason: MaterialAuthoringValidationReason;
38
+ readonly actual?: unknown;
39
+ };
40
+
41
+ constructor(reason: MaterialAuthoringValidationReason, actual?: unknown) {
42
+ super(`Materials.standard: alphaCutoff violates the authoring contract (${reason})`);
43
+ this.name = 'MaterialAuthoringContractError';
44
+ this.detail = {
45
+ code: 'material-authoring-contract-invalid',
46
+ material: 'Standard',
47
+ parameter: 'alphaCutoff',
48
+ reason,
49
+ ...(actual === undefined ? {} : { actual }),
50
+ };
51
+ }
52
+ }
53
+
24
54
  /** Structured authoring failure for the Standard transmission contract. */
25
55
  export class MaterialTransmissionContractError extends Error {
26
56
  readonly code = 'material-transmission-contract-invalid' as const;
@@ -195,11 +225,6 @@ function standardParameters(
195
225
  'occlusionStrength',
196
226
  'alphaCutoff',
197
227
  'normalScale',
198
- 'baseColorTexture',
199
- 'metallicRoughnessTexture',
200
- 'normalTexture',
201
- 'emissiveTexture',
202
- 'occlusionTexture',
203
228
  'specular',
204
229
  'specularColor',
205
230
  // IOR is part of the always-present dielectric F0 contract. The
@@ -224,12 +249,20 @@ function standardParameters(
224
249
  'thickness',
225
250
  'attenuationColor',
226
251
  'attenuationDistance',
227
- 'transmissionTexture',
228
- 'thicknessTexture',
229
252
  ]) {
230
253
  baseNames.add(name);
231
254
  }
232
255
  }
256
+ // A texture declaration selects its compiled sampling path. Loading state
257
+ // does not: an authored but not-yet-resident slot still needs its fallback.
258
+ for (const parameter of DEFAULT_STANDARD_PBR_PARAM_SCHEMA) {
259
+ if (
260
+ parameter.type === 'texture2d' &&
261
+ opts[parameter.name as keyof StandardOpts] !== undefined
262
+ ) {
263
+ baseNames.add(parameter.name);
264
+ }
265
+ }
233
266
  // All Standard fields come from one root schema. Physical fields are
234
267
  // projected by the authored option membership above; appending a second
235
268
  // physical schema would create a parallel ABI authority.
@@ -487,8 +520,11 @@ function standardDefault(opts: DefaultStandardOptions): MaterialAsset {
487
520
  `Materials.standard: occlusionStrength must be in [0, 1], got ${occlusionStrength}`,
488
521
  );
489
522
  }
523
+ if (opts.alphaCutoff !== undefined && !Number.isFinite(opts.alphaCutoff)) {
524
+ throw new MaterialAuthoringContractError('non-finite', opts.alphaCutoff);
525
+ }
490
526
  if (opts.alphaCutoff !== undefined && (opts.alphaCutoff < 0 || opts.alphaCutoff > 1)) {
491
- throw new Error(`Materials.standard: alphaCutoff must be in [0, 1], got ${opts.alphaCutoff}`);
527
+ throw new MaterialAuthoringContractError('range', opts.alphaCutoff);
492
528
  }
493
529
  validateChannel('metallicChannel', opts.metallicChannel);
494
530
  validateChannel('roughnessChannel', opts.roughnessChannel);
@@ -34,6 +34,7 @@ import type {
34
34
  } from '@forgeax/engine-rhi';
35
35
  import {
36
36
  type ShaderCatalog,
37
+ STANDARD_PHYSICAL_TEXTURE_FIELDS,
37
38
  STANDARD_PIPELINE_PARAM_SCHEMA,
38
39
  standardPhysicalTextureFields,
39
40
  } from '@forgeax/engine-shader';
@@ -154,7 +155,7 @@ export function buildPbrMaterialUserRegionEntries(
154
155
  // Project the engine-owned entry shape into the DOM WebGPU descriptor. Omit
155
156
  // absent optional members so exactOptionalPropertyTypes remains true at the
156
157
  // boundary instead of leaking an `undefined` property into the descriptor.
157
- const entries = derived.bglEntries.map(
158
+ let entries = derived.bglEntries.map(
158
159
  (entry): GPUBindGroupLayoutEntry => ({
159
160
  binding: entry.binding,
160
161
  visibility: entry.visibility,
@@ -164,9 +165,11 @@ export function buildPbrMaterialUserRegionEntries(
164
165
  ...(entry.storageTexture === undefined ? {} : { storageTexture: entry.storageTexture }),
165
166
  }),
166
167
  );
167
- // Patch binding 0 (the material UBO) to the dynamic-offset, vertex-visible
168
- // material-UBO contract. derive() emits binding 0 as the first numeric run's
169
- // merged UBO; an empty schema has no binding-0 UBO and needs no patch.
168
+ // The record path always owns one dynamic material-UBO slot, even when an
169
+ // authored shader declares no numeric parameters (an empty paramSchema).
170
+ // Reserve that slot here so the IBL/transmission injection starts at the
171
+ // same binding used by `buildPerSubmeshMaterialBg`; otherwise binding 0 in
172
+ // the layout is a cube texture while the record path submits a UBO.
170
173
  const ubo = entries[0];
171
174
  if (ubo !== undefined && ubo.binding === 0 && ubo.buffer?.type === 'uniform') {
172
175
  entries[0] = {
@@ -174,6 +177,15 @@ export function buildPbrMaterialUserRegionEntries(
174
177
  visibility: GPU_SHADER_STAGE_VERTEX | GPU_SHADER_STAGE_FRAGMENT,
175
178
  buffer: { type: 'uniform', hasDynamicOffset: true },
176
179
  };
180
+ } else {
181
+ entries = [
182
+ {
183
+ binding: 0,
184
+ visibility: GPU_SHADER_STAGE_VERTEX | GPU_SHADER_STAGE_FRAGMENT,
185
+ buffer: { type: 'uniform', hasDynamicOffset: true },
186
+ },
187
+ ...entries.map((entry) => ({ ...entry, binding: entry.binding + 1 })),
188
+ ];
177
189
  }
178
190
  return entries;
179
191
  }
@@ -351,16 +363,22 @@ export function physicalTextureFields(paramSchema: readonly ParamSchemaEntry[]):
351
363
  }
352
364
 
353
365
  export function appendTextureInjection(
354
- bgl: readonly GPUBindGroupLayoutEntry[],
366
+ _bgl: readonly GPUBindGroupLayoutEntry[],
355
367
  fields: readonly string[],
356
368
  ): GPUBindGroupLayoutEntry[] {
357
- const start = bgl.length;
358
369
  const fieldSet = new Set(fields);
370
+ // Physical resources use the Standard root's fixed slots (26 + canonical
371
+ // index * 2). Do not compact an authored subset: the shader template and
372
+ // scene-index receipt share these canonical bindings, while gaps simply
373
+ // represent physical axes omitted by the selected root contract.
359
374
  return standardPhysicalTextureFields(
360
- fields.map((name) => ({ name, type: 'texture2d' as const })),
361
- ).flatMap((field, index) => {
375
+ STANDARD_PIPELINE_PARAM_SCHEMA.concat(
376
+ fields.map((name) => ({ name, type: 'texture2d' as const })),
377
+ ),
378
+ ).flatMap((field) => {
362
379
  if (!fieldSet.has(field)) return [];
363
- const binding = start + index * 2;
380
+ const canonicalIndex = STANDARD_PHYSICAL_TEXTURE_FIELDS.indexOf(field);
381
+ const binding = 26 + canonicalIndex * 2;
364
382
  return [
365
383
  {
366
384
  binding,
@@ -426,6 +444,8 @@ export interface PbrCaps {
426
444
  readonly probeBlend?: boolean;
427
445
  /** Whether the device can carry the optional SpotLight projector texture. */
428
446
  readonly projectorAvailable?: boolean;
447
+ /** Omit unused backdrop slots on minimum-limit devices; physical slots stay fixed. */
448
+ readonly transmissionBackdrop?: boolean;
429
449
  }
430
450
 
431
451
  /**
@@ -441,7 +461,7 @@ export interface PbrCaps {
441
461
  * fragment-only). feat-20260612-point-light-shadows-urp-hdrp Round-2 F-1.
442
462
  * binding 6 = point shadow params UBO (`array<vec4<f32>, 4>`, 64 B;
443
463
  * fragment-only). One lane per shadow-casting point light slot
444
- * (shadowAtlasLayer in [0, 4)) carrying `(near, far, 1/(far-near), 0)`.
464
+ * (shadowAtlasLayer in [0, 4)) carrying `(near, far, depthBias, normalBias)`.
445
465
  * binding 7 = shadowCasterCascade UBO (16 B; vertex + fragment). Per-pass
446
466
  * cascade-index uniform consumed exclusively by `shadow_caster.wgsl` to
447
467
  * pick `view.lightViewProj_X` for the cascade currently being rasterized
@@ -506,7 +526,7 @@ export function buildPbrViewBglEntries(caps: PbrCaps): GPUBindGroupLayoutEntry[]
506
526
  // feat-20260612-point-light-shadows-urp-hdrp Round-2 F-1: point shadow
507
527
  // params UBO. Carries `array<vec4<f32>, 4>` = 64 B with one lane per
508
528
  // shadow-casting point light slot (shadowAtlasLayer in [0, 4)). Each
509
- // lane stores `(near, far, 1/(far-near), 0)` so the fragment-shader
529
+ // lane stores `(near, far, depthBias, normalBias)` so the fragment-shader
510
530
  // depth-ref reconstruction (lighting-punctual.wgsl evalPointShadowed)
511
531
  // can avoid sampling DirectLightSlot for the URP path. The shared
512
532
  // DirectLightSlot metadata remains the identity owner, so binding 6 is
@@ -648,7 +668,10 @@ export function buildPbrPipelineLayouts(
648
668
  // The transmission start binding is computed from the post-Skylight BGL
649
669
  // length (= 22 for the canonical Standard schema) by appendInjection.
650
670
  const materialBglRes = device.createBindGroupLayout(
651
- buildBindGroupLayoutDescriptor(BGL_ONLY_SPEC_STUB, { kind: 'pbr-material-merged' }),
671
+ buildBindGroupLayoutDescriptor(BGL_ONLY_SPEC_STUB, {
672
+ kind: 'pbr-material-merged',
673
+ caps,
674
+ }),
652
675
  );
653
676
  if (!materialBglRes.ok) throw materialBglRes.error;
654
677
 
@@ -751,10 +774,26 @@ export function isStandardPbrSkinMaterialShader(shaderId: string | undefined): b
751
774
  );
752
775
  }
753
776
 
754
- export function shadowCasterVariantSet(storageBuffer: boolean, skinned: boolean): string {
777
+ export function shadowCasterVariantSet(
778
+ storageBuffer: boolean,
779
+ skinned: boolean,
780
+ gpuDrivenSceneIndex = false,
781
+ alphaMask = false,
782
+ vertexColorAvailable = false,
783
+ ): string {
755
784
  const skinningDisabled = !skinned;
756
- if (storageBuffer && skinningDisabled) return '';
757
- return `SKINNING_DISABLED=${String(skinningDisabled)}+STORAGE_BUFFER_AVAILABLE=${String(storageBuffer)}`;
785
+ const defines: Record<string, boolean> = {
786
+ ALPHA_MASK: alphaMask,
787
+ GPU_DRIVEN_SCENE_INDEX_AVAILABLE: gpuDrivenSceneIndex,
788
+ GPU_DRIVEN_SCENE_INDEX_EXPLICIT: false,
789
+ SKINNING_DISABLED: skinningDisabled,
790
+ STORAGE_BUFFER_AVAILABLE: storageBuffer,
791
+ };
792
+ if (vertexColorAvailable) defines.VERTEX_COLOR_AVAILABLE = true;
793
+ return Object.entries(defines)
794
+ .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
795
+ .map(([name, value]) => `${name}=${String(value)}`)
796
+ .join('+');
758
797
  }
759
798
 
760
799
  export function isSkinnedShadowCasterVariant(
@@ -894,6 +933,65 @@ export function buildPbrSkinLayouts(
894
933
  };
895
934
  }
896
935
 
936
+ /**
937
+ * Build the dedicated slot-3 layout used by scene-index GPU-driven draws.
938
+ *
939
+ * Direct material draws deliberately keep `pbr-instances-bgl` at binding(0),
940
+ * and ProbeBlend deliberately owns binding(1). The scene-index stream is
941
+ * therefore a separate BGL at binding(2), rather than an optional entry added
942
+ * to the direct layout. This keeps every bind group complete for its shader
943
+ * and prevents a direct draw from having to bind a dummy visible stream.
944
+ */
945
+ export function buildGpuDrivenPbrInstancesBindGroupLayout(
946
+ device: PbrPipelineDevice,
947
+ caps: PbrCaps,
948
+ ): BindGroupLayout {
949
+ if (!caps.storageBuffer) {
950
+ throw new Error('GPU-driven PBR instances layout requires storage-buffer capability');
951
+ }
952
+ const result = device.createBindGroupLayout(
953
+ buildBindGroupLayoutDescriptor(BGL_ONLY_SPEC_STUB, {
954
+ kind: 'pbr-gpu-driven-instances',
955
+ caps,
956
+ }),
957
+ );
958
+ if (!result.ok) throw result.error;
959
+ return result.value;
960
+ }
961
+
962
+ /** Build the four-slot rigid scene-index pipeline layout. */
963
+ export function buildGpuDrivenPbrPipelineLayout(
964
+ device: PbrPipelineDevice,
965
+ pbr: PbrPipelineLayoutBundle,
966
+ gpuDrivenInstancesBgl: BindGroupLayout,
967
+ ): PipelineLayout {
968
+ const result = device.createPipelineLayout({
969
+ label: 'pbr-gpu-driven-pl',
970
+ bindGroupLayouts: [pbr.viewBgl, pbr.materialBgl, pbr.meshArrayBgl, gpuDrivenInstancesBgl],
971
+ });
972
+ if (!result.ok) throw result.error;
973
+ return result.value;
974
+ }
975
+
976
+ /** Build the four-slot skinned scene-index pipeline layout. */
977
+ export function buildGpuDrivenPbrSkinPipelineLayout(
978
+ device: PbrPipelineDevice,
979
+ pbrSkin: PbrPipelineLayoutBundle,
980
+ gpuDrivenInstancesBgl: BindGroupLayout,
981
+ ): PipelineLayout {
982
+ const result = device.createPipelineLayout({
983
+ label: 'pbr-skin-gpu-driven-pl',
984
+ bindGroupLayouts: [
985
+ pbrSkin.viewBgl,
986
+ pbrSkin.materialBgl,
987
+ pbrSkin.meshArrayBgl,
988
+ gpuDrivenInstancesBgl,
989
+ ],
990
+ });
991
+ if (!result.ok) throw result.error;
992
+ return result.value;
993
+ }
994
+
897
995
  /** Project the canonical group(2) resources for a PBR skin draw. */
898
996
  export function createPbrSkinMeshBindGroupEntries(
899
997
  meshBuffer: Buffer,
@@ -1064,7 +1162,9 @@ export const SPRITE_PASS_PER_INSTANCE_REGION_VARIANT_SET = '';
1064
1162
  * (directional 3/4, point 5/6, cascade 7, spot atlas 8; the former
1065
1163
  * spot lightViewProj matrices moved into the View UBO)
1066
1164
  * - `'pbr-mesh-array'` — 1 entry: per-entity mesh SSBO (dynamic-offset)
1067
- * - `'pbr-instances'` — 1 entry: per-instance SSBO (no dynamic-offset)
1165
+ * - `'pbr-instances'` — 2 entries: per-instance SSBO plus the compact
1166
+ * visible-item index stream (the second entry is used only by the
1167
+ * scene-index vertex entry and shares the frame's instance bind group)
1068
1168
  * - `'pbr-skin-mesh-array'` — 3 entries: meshes + current/previous palette
1069
1169
  * 3. Attachment-driven (fullscreen post-process):
1070
1170
  * - `'fullscreen-post'` — 2 entries: input texture + sampler. The texture
@@ -1084,6 +1184,7 @@ export type BglKind =
1084
1184
  | 'pbr-material-merged'
1085
1185
  | 'pbr-mesh-array'
1086
1186
  | 'pbr-instances'
1187
+ | 'pbr-gpu-driven-instances'
1087
1188
  | 'pbr-skin-mesh-array'
1088
1189
  | 'unlit-material'
1089
1190
  | 'hdrp-7-slot'
@@ -1318,6 +1419,41 @@ export function buildBindGroupLayoutDescriptor(
1318
1419
  ),
1319
1420
  };
1320
1421
  }
1422
+ case 'pbr-gpu-driven-instances': {
1423
+ const caps = options.caps ?? { storageBuffer: true };
1424
+ const meshBufType: GPUBufferBindingType = caps.storageBuffer
1425
+ ? 'read-only-storage'
1426
+ : 'uniform';
1427
+ // GPU-driven scene-index draws use a physically distinct slot-3 layout.
1428
+ // The ordinary instances BGL intentionally stays one-entry for direct
1429
+ // draws, while ProbeBlend owns binding(1). Keep the compact visible
1430
+ // `(meshRow, materialRow)` stream at binding(2) so a future probe-enabled
1431
+ // GPU variant can coexist without colliding with the probe record.
1432
+ return {
1433
+ label: 'pbr-gpu-driven-instances-bgl',
1434
+ entries: [
1435
+ {
1436
+ binding: 0,
1437
+ visibility: GPU_SHADER_STAGE_VERTEX | GPU_SHADER_STAGE_FRAGMENT,
1438
+ buffer: { type: meshBufType, hasDynamicOffset: false },
1439
+ },
1440
+ {
1441
+ // ShadowCaster's scene-index entry still reads the visible row
1442
+ // through binding(1). Keep this alias in the dedicated layout so
1443
+ // the shared visible bind group can serve both the Standard PBR
1444
+ // (binding(2)) and depth-only shadow (binding(1)) consumers.
1445
+ binding: 1,
1446
+ visibility: GPU_SHADER_STAGE_VERTEX,
1447
+ buffer: { type: meshBufType, hasDynamicOffset: false },
1448
+ },
1449
+ {
1450
+ binding: 2,
1451
+ visibility: GPU_SHADER_STAGE_VERTEX,
1452
+ buffer: { type: meshBufType, hasDynamicOffset: false },
1453
+ },
1454
+ ],
1455
+ };
1456
+ }
1321
1457
  case 'pbr-skin-mesh-array': {
1322
1458
  const caps = options.caps ?? { storageBuffer: true };
1323
1459
  const meshBufType: GPUBufferBindingType = caps.storageBuffer
@@ -1328,7 +1464,7 @@ export function buildBindGroupLayoutDescriptor(
1328
1464
  entries: [
1329
1465
  {
1330
1466
  binding: 0,
1331
- visibility: GPU_SHADER_STAGE_VERTEX,
1467
+ visibility: GPU_SHADER_STAGE_VERTEX | GPU_SHADER_STAGE_FRAGMENT,
1332
1468
  buffer: { type: meshBufType, hasDynamicOffset: true },
1333
1469
  },
1334
1470
  {
@@ -1369,12 +1505,29 @@ export function buildBindGroupLayoutDescriptor(
1369
1505
  const afterIbl = [...userRegion, ...appendInjection(userRegion, 'ibl')];
1370
1506
  const afterTransmission = [...afterIbl, ...appendInjection(afterIbl, 'transmission')];
1371
1507
  const merged = [
1372
- ...afterTransmission,
1508
+ ...(options.caps?.transmissionBackdrop === false ? afterIbl : afterTransmission),
1373
1509
  ...appendTextureInjection(afterTransmission, physicalFields),
1374
1510
  ];
1511
+ // Scene-index Standard variants consume one producer-owned material row
1512
+ // after the complete fixed physical range. Keeping it at binding 46
1513
+ // prevents any authored physical subset from aliasing the row.
1514
+ if (options.caps?.storageBuffer ?? true) {
1515
+ merged.push({
1516
+ binding: 46,
1517
+ visibility: GPU_SHADER_STAGE_VERTEX | GPU_SHADER_STAGE_FRAGMENT,
1518
+ buffer: { type: 'read-only-storage', hasDynamicOffset: false },
1519
+ });
1520
+ }
1375
1521
  return {
1376
1522
  label: 'pbr-material-skylight-bgl',
1377
- entries: merged,
1523
+ entries: [
1524
+ ...merged,
1525
+ {
1526
+ binding: 47,
1527
+ visibility: GPU_SHADER_STAGE_FRAGMENT,
1528
+ texture: { sampleType: 'float', viewDimension: 'cube' },
1529
+ },
1530
+ ],
1378
1531
  };
1379
1532
  }
1380
1533
  case 'unlit-material': {