@forgeax/engine-render 0.1.27 → 0.1.29

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 (655) hide show
  1. package/README.md +842 -124
  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/dynamic-geometry-host.d.ts +52 -0
  5. package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -0
  6. package/dist/assembly/dynamic-geometry-runtime.d.ts +20 -0
  7. package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -0
  8. package/dist/assembly/factory.d.ts +3 -1
  9. package/dist/assembly/factory.d.ts.map +1 -1
  10. package/dist/assembly/gpu-driven-owner.d.ts +10 -0
  11. package/dist/assembly/gpu-driven-owner.d.ts.map +1 -0
  12. package/dist/assembly/host-contract.d.ts +19 -0
  13. package/dist/assembly/host-contract.d.ts.map +1 -1
  14. package/dist/assembly/material/assembly.d.ts +7 -0
  15. package/dist/assembly/material/assembly.d.ts.map +1 -1
  16. package/dist/assembly/material-shader-policy.d.ts +3 -1
  17. package/dist/assembly/material-shader-policy.d.ts.map +1 -1
  18. package/dist/assembly/recovery/failure-location.d.ts +12 -0
  19. package/dist/assembly/recovery/failure-location.d.ts.map +1 -0
  20. package/dist/assembly/recovery/renderer-recover.d.ts +6 -4
  21. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  22. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  23. package/dist/assembly/renderer-feature-inspection.d.ts +5 -0
  24. package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -0
  25. package/dist/assembly/renderer-frame-transaction.d.ts +19 -0
  26. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  27. package/dist/assembly/renderer-helpers.d.ts +3 -0
  28. package/dist/assembly/renderer-helpers.d.ts.map +1 -1
  29. package/dist/assembly/renderer-inspection.d.ts +4 -0
  30. package/dist/assembly/renderer-inspection.d.ts.map +1 -1
  31. package/dist/assembly/shader-prewarm-policy.d.ts +6 -0
  32. package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -1
  33. package/dist/assembly/skin-palette-owner.d.ts +8 -0
  34. package/dist/assembly/skin-palette-owner.d.ts.map +1 -0
  35. package/dist/assembly/ssr-shader-prewarm.d.ts +6 -0
  36. package/dist/assembly/ssr-shader-prewarm.d.ts.map +1 -0
  37. package/dist/assembly/webgpu-device-loss.d.ts +15 -0
  38. package/dist/assembly/webgpu-device-loss.d.ts.map +1 -0
  39. package/dist/assembly/webgpu-pbr-ready.d.ts +38 -0
  40. package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -0
  41. package/dist/assembly/webgpu-ready-mipmap.d.ts +11 -0
  42. package/dist/assembly/webgpu-ready-mipmap.d.ts.map +1 -0
  43. package/dist/assembly/webgpu-ready.d.ts +7 -3
  44. package/dist/assembly/webgpu-ready.d.ts.map +1 -1
  45. package/dist/assembly/webgpu-renderer-bootstrap.d.ts +10 -0
  46. package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -0
  47. package/dist/assembly/webgpu-renderer-contract.d.ts +62 -0
  48. package/dist/assembly/webgpu-renderer-contract.d.ts.map +1 -0
  49. package/dist/assembly/webgpu-renderer-guards.d.ts +9 -0
  50. package/dist/assembly/webgpu-renderer-guards.d.ts.map +1 -0
  51. package/dist/assembly/webgpu-renderer-observation.d.ts +6 -0
  52. package/dist/assembly/webgpu-renderer-observation.d.ts.map +1 -0
  53. package/dist/assembly/webgpu-renderer-recovery-failure.d.ts +12 -0
  54. package/dist/assembly/webgpu-renderer-recovery-failure.d.ts.map +1 -0
  55. package/dist/assembly/webgpu-renderer.d.ts +7 -141
  56. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  57. package/dist/assembly/webgpu-vertex-layouts.d.ts +28 -84
  58. package/dist/assembly/webgpu-vertex-layouts.d.ts.map +1 -1
  59. package/dist/authoring.mjs +3 -3
  60. package/dist/{chunk-ADHHVYLW.mjs → chunk-33XZFTQU.mjs} +245 -39
  61. package/dist/chunk-33XZFTQU.mjs.map +1 -0
  62. package/dist/{chunk-GF523LHF.mjs → chunk-BLXGONR2.mjs} +30 -12
  63. package/dist/chunk-BLXGONR2.mjs.map +1 -0
  64. package/dist/{chunk-KM2NOX2I.mjs → chunk-BQVQOQJH.mjs} +958 -254
  65. package/dist/chunk-BQVQOQJH.mjs.map +1 -0
  66. package/dist/{chunk-HKXTW355.mjs → chunk-BTWH7BP4.mjs} +386 -17
  67. package/dist/chunk-BTWH7BP4.mjs.map +1 -0
  68. package/dist/{chunk-TMIASV2N.mjs → chunk-FUODTTIA.mjs} +3934 -676
  69. package/dist/chunk-FUODTTIA.mjs.map +1 -0
  70. package/dist/{chunk-FJ6P52EE.mjs → chunk-ILQ5MEZF.mjs} +3 -17
  71. package/dist/chunk-ILQ5MEZF.mjs.map +1 -0
  72. package/dist/{chunk-E34VL5VI.mjs → chunk-JQTSEI3Z.mjs} +3 -3
  73. package/dist/{chunk-E34VL5VI.mjs.map → chunk-JQTSEI3Z.mjs.map} +1 -1
  74. package/dist/{chunk-GE3SDD72.mjs → chunk-NICXSHAT.mjs} +16 -38
  75. package/dist/chunk-NICXSHAT.mjs.map +1 -0
  76. package/dist/{chunk-ZZ4YQ474.mjs → chunk-NRNXBLIJ.mjs} +577 -7
  77. package/dist/chunk-NRNXBLIJ.mjs.map +1 -0
  78. package/dist/{chunk-JDWARUOI.mjs → chunk-PA5DRJNI.mjs} +17 -3
  79. package/dist/chunk-PA5DRJNI.mjs.map +1 -0
  80. package/dist/{chunk-XDP6XE5V.mjs → chunk-S4DNKQYQ.mjs} +1118 -446
  81. package/dist/chunk-S4DNKQYQ.mjs.map +1 -0
  82. package/dist/components/camera.d.ts +62 -2
  83. package/dist/components/camera.d.ts.map +1 -1
  84. package/dist/components/index.d.ts +1 -0
  85. package/dist/components/index.d.ts.map +1 -1
  86. package/dist/components/instances.d.ts +6 -20
  87. package/dist/components/instances.d.ts.map +1 -1
  88. package/dist/components/scene-instance.d.ts +2 -1
  89. package/dist/components/scene-instance.d.ts.map +1 -1
  90. package/dist/components/screen-space-reflection.d.ts +14 -0
  91. package/dist/components/screen-space-reflection.d.ts.map +1 -0
  92. package/dist/construct-renderer.mjs +13805 -7186
  93. package/dist/construct-renderer.mjs.map +1 -1
  94. package/dist/device/gpu-residency.d.ts +11 -17
  95. package/dist/device/gpu-residency.d.ts.map +1 -1
  96. package/dist/device/mesh-residency-lifetime.d.ts +21 -0
  97. package/dist/device/mesh-residency-lifetime.d.ts.map +1 -0
  98. package/dist/dynamic-geometry.d.ts +125 -0
  99. package/dist/dynamic-geometry.d.ts.map +1 -0
  100. package/dist/environment/background.d.ts +6 -0
  101. package/dist/environment/background.d.ts.map +1 -0
  102. package/dist/errors/gpu-driven.d.ts +6 -3
  103. package/dist/errors/gpu-driven.d.ts.map +1 -1
  104. package/dist/errors/render.d.ts +7 -4
  105. package/dist/errors/render.d.ts.map +1 -1
  106. package/dist/extract/camera.d.ts.map +1 -1
  107. package/dist/extract/gpu-driven.d.ts +33 -3
  108. package/dist/extract/gpu-driven.d.ts.map +1 -1
  109. package/dist/features/host.d.ts +23 -1
  110. package/dist/features/host.d.ts.map +1 -1
  111. package/dist/features/noise-texture.d.ts +17 -0
  112. package/dist/features/noise-texture.d.ts.map +1 -0
  113. package/dist/features/plan.d.ts +83 -2
  114. package/dist/features/plan.d.ts.map +1 -1
  115. package/dist/features/prepared-gpu-work.d.ts +37 -4
  116. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  117. package/dist/features/prepared-graphics-store.d.ts.map +1 -1
  118. package/dist/features/prepared-graphics.d.ts +5 -0
  119. package/dist/features/prepared-graphics.d.ts.map +1 -1
  120. package/dist/features/render-graph-compute.d.ts +5 -3
  121. package/dist/features/render-graph-compute.d.ts.map +1 -1
  122. package/dist/features/render-graph-contribution.d.ts +11 -3
  123. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  124. package/dist/features/render-graph-raster.d.ts +19 -3
  125. package/dist/features/render-graph-raster.d.ts.map +1 -1
  126. package/dist/features/types.d.ts +11 -0
  127. package/dist/features/types.d.ts.map +1 -1
  128. package/dist/fullscreen-post-process-pass.d.ts +2 -0
  129. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  130. package/dist/gpu-driven/batch-topology.d.ts +34 -1
  131. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  132. package/dist/gpu-driven/pbr-program.d.ts +10 -0
  133. package/dist/gpu-driven/pbr-program.d.ts.map +1 -0
  134. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  135. package/dist/gpu-driven/production-raster.d.ts +144 -23
  136. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  137. package/dist/gpu-driven/shadow-views.d.ts +126 -0
  138. package/dist/gpu-driven/shadow-views.d.ts.map +1 -0
  139. package/dist/gpu-driven/view-gpu.d.ts +18 -2
  140. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  141. package/dist/gpu-scene-schema.d.ts +2 -8
  142. package/dist/gpu-scene-schema.d.ts.map +1 -1
  143. package/dist/gpu-scene.d.ts +14 -0
  144. package/dist/gpu-scene.d.ts.map +1 -1
  145. package/dist/gpu-texture-usage.d.ts +1 -0
  146. package/dist/gpu-texture-usage.d.ts.map +1 -1
  147. package/dist/hdrp-buffers.d.ts +6 -0
  148. package/dist/hdrp-buffers.d.ts.map +1 -1
  149. package/dist/ibl/frame-resources.d.ts +8 -0
  150. package/dist/ibl/frame-resources.d.ts.map +1 -0
  151. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  152. package/dist/index.d.ts +21 -8
  153. package/dist/index.d.ts.map +1 -1
  154. package/dist/index.mjs +8 -7
  155. package/dist/index.mjs.map +1 -1
  156. package/dist/inspection-types.d.ts +164 -0
  157. package/dist/inspection-types.d.ts.map +1 -1
  158. package/dist/instances-derived-bounds.d.ts +11 -0
  159. package/dist/instances-derived-bounds.d.ts.map +1 -1
  160. package/dist/instances.d.ts +89 -44
  161. package/dist/instances.d.ts.map +1 -1
  162. package/dist/internal.d.ts +3 -0
  163. package/dist/internal.d.ts.map +1 -1
  164. package/dist/internal.mjs +118 -10
  165. package/dist/internal.mjs.map +1 -1
  166. package/dist/lifecycle.d.ts +2 -1
  167. package/dist/lifecycle.d.ts.map +1 -1
  168. package/dist/material-row.d.ts +5 -0
  169. package/dist/material-row.d.ts.map +1 -0
  170. package/dist/materials.d.ts +15 -0
  171. package/dist/materials.d.ts.map +1 -1
  172. package/dist/pbr-pipeline.d.ts +21 -5
  173. package/dist/pbr-pipeline.d.ts.map +1 -1
  174. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  175. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts +12 -0
  176. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts.map +1 -0
  177. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts +70 -0
  178. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts.map +1 -0
  179. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts +75 -0
  180. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts.map +1 -0
  181. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts +111 -0
  182. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts.map +1 -0
  183. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts +16 -0
  184. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts.map +1 -0
  185. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts +14 -0
  186. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts.map +1 -0
  187. package/dist/pipeline/standard-output/auto-exposure/state.d.ts +46 -0
  188. package/dist/pipeline/standard-output/auto-exposure/state.d.ts.map +1 -0
  189. package/dist/pipeline/standard-output/color-transform.d.ts +27 -0
  190. package/dist/pipeline/standard-output/color-transform.d.ts.map +1 -0
  191. package/dist/pipeline/standard-output/graph.d.ts +15 -0
  192. package/dist/pipeline/standard-output/graph.d.ts.map +1 -0
  193. package/dist/pipeline/standard-output/lut-admission.d.ts +29 -0
  194. package/dist/pipeline/standard-output/lut-admission.d.ts.map +1 -0
  195. package/dist/pipeline/standard-output/lut-gpu.d.ts +48 -0
  196. package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -0
  197. package/dist/pipeline/standard-output/lut-state.d.ts +68 -0
  198. package/dist/pipeline/standard-output/lut-state.d.ts.map +1 -0
  199. package/dist/pipeline/standard-output/resources.d.ts +10 -0
  200. package/dist/pipeline/standard-output/resources.d.ts.map +1 -0
  201. package/dist/pipeline/standard-output/types.d.ts +39 -0
  202. package/dist/pipeline/standard-output/types.d.ts.map +1 -0
  203. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  204. package/dist/pipeline/standard-post.d.ts +2 -2
  205. package/dist/pipeline/standard-post.d.ts.map +1 -1
  206. package/dist/pipeline-builder.d.ts +2 -1
  207. package/dist/pipeline-builder.d.ts.map +1 -1
  208. package/dist/pipeline-spec-types.d.ts +4 -0
  209. package/dist/pipeline-spec-types.d.ts.map +1 -1
  210. package/dist/pipeline-spec.d.ts +1 -9
  211. package/dist/pipeline-spec.d.ts.map +1 -1
  212. package/dist/points-lines/standard-owner.d.ts +1 -1
  213. package/dist/points-lines/standard-owner.d.ts.map +1 -1
  214. package/dist/prepare/prepared-graphics-resolver.d.ts +6 -1
  215. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  216. package/dist/record/dynamic-geometry-consumption.d.ts +15 -0
  217. package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -0
  218. package/dist/record/frame-lighting.d.ts +3 -3
  219. package/dist/record/frame-lighting.d.ts.map +1 -1
  220. package/dist/record/frame-snapshot.d.ts +106 -5
  221. package/dist/record/frame-snapshot.d.ts.map +1 -1
  222. package/dist/record/frame-targets.d.ts.map +1 -1
  223. package/dist/record/frame.d.ts +39 -4
  224. package/dist/record/frame.d.ts.map +1 -1
  225. package/dist/record/main-pass-geometry.d.ts +7 -8
  226. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  227. package/dist/record/main-pass-material.d.ts +38 -1
  228. package/dist/record/main-pass-material.d.ts.map +1 -1
  229. package/dist/record/main-pass-sprite-draws.d.ts +2 -10
  230. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  231. package/dist/record/main-pass.d.ts +12 -2
  232. package/dist/record/main-pass.d.ts.map +1 -1
  233. package/dist/record/mesh-ssbo.d.ts +15 -6
  234. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  235. package/dist/record/prepared-material-bindings.d.ts +19 -0
  236. package/dist/record/prepared-material-bindings.d.ts.map +1 -0
  237. package/dist/record/recovery-pipeline.d.ts +2 -9
  238. package/dist/record/recovery-pipeline.d.ts.map +1 -1
  239. package/dist/record/render-context.d.ts +76 -26
  240. package/dist/record/render-context.d.ts.map +1 -1
  241. package/dist/record/shadow-pass.d.ts +62 -7
  242. package/dist/record/shadow-pass.d.ts.map +1 -1
  243. package/dist/record/skybox-post-pass.d.ts +1 -1
  244. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  245. package/dist/record/typed-frame-graph.d.ts +35 -7
  246. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  247. package/dist/record/view-ubo.d.ts +1 -0
  248. package/dist/record/view-ubo.d.ts.map +1 -1
  249. package/dist/recovery/render-system-candidate.d.ts +10 -2
  250. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  251. package/dist/recovery/render-system-roots.d.ts +11 -0
  252. package/dist/recovery/render-system-roots.d.ts.map +1 -0
  253. package/dist/recovery/types.d.ts +76 -0
  254. package/dist/recovery/types.d.ts.map +1 -0
  255. package/dist/reflection/record-owner.d.ts +0 -2
  256. package/dist/reflection/record-owner.d.ts.map +1 -1
  257. package/dist/render-contract.d.ts +185 -30
  258. package/dist/render-contract.d.ts.map +1 -1
  259. package/dist/render-graph-primitives.d.ts +1 -0
  260. package/dist/render-graph-primitives.d.ts.map +1 -1
  261. package/dist/render-pipeline.d.ts +64 -5
  262. package/dist/render-pipeline.d.ts.map +1 -1
  263. package/dist/render-system-extract-tail.d.ts +7 -5
  264. package/dist/render-system-extract-tail.d.ts.map +1 -1
  265. package/dist/render-system-extract.d.ts +101 -41
  266. package/dist/render-system-extract.d.ts.map +1 -1
  267. package/dist/render-system-projections.d.ts +22 -0
  268. package/dist/render-system-projections.d.ts.map +1 -0
  269. package/dist/render-system.d.ts +34 -77
  270. package/dist/render-system.d.ts.map +1 -1
  271. package/dist/scene/render-scene-types.d.ts +14 -7
  272. package/dist/scene/render-scene-types.d.ts.map +1 -1
  273. package/dist/scene/render-scene.d.ts +29 -11
  274. package/dist/scene/render-scene.d.ts.map +1 -1
  275. package/dist/scene/shadow-visibility.d.ts +5 -0
  276. package/dist/scene/shadow-visibility.d.ts.map +1 -0
  277. package/dist/ssr/admission.d.ts +70 -1
  278. package/dist/ssr/admission.d.ts.map +1 -1
  279. package/dist/ssr/compose.d.ts +13 -0
  280. package/dist/ssr/compose.d.ts.map +1 -0
  281. package/dist/ssr/errors.d.ts +35 -0
  282. package/dist/ssr/errors.d.ts.map +1 -1
  283. package/dist/ssr/graph.d.ts +60 -0
  284. package/dist/ssr/graph.d.ts.map +1 -0
  285. package/dist/ssr/history.d.ts +97 -0
  286. package/dist/ssr/history.d.ts.map +1 -0
  287. package/dist/ssr/hiz.d.ts +37 -0
  288. package/dist/ssr/hiz.d.ts.map +1 -0
  289. package/dist/ssr/inspection.d.ts +42 -0
  290. package/dist/ssr/inspection.d.ts.map +1 -0
  291. package/dist/ssr/resources.d.ts +58 -0
  292. package/dist/ssr/resources.d.ts.map +1 -0
  293. package/dist/ssr/temporal.d.ts +38 -0
  294. package/dist/ssr/temporal.d.ts.map +1 -0
  295. package/dist/systems/skin-palette-allocator.d.ts +32 -10
  296. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  297. package/dist/systems/skin-palette-types.d.ts +15 -0
  298. package/dist/systems/skin-palette-types.d.ts.map +1 -1
  299. package/dist/systems/transparent-dispatch.d.ts +9 -0
  300. package/dist/systems/transparent-dispatch.d.ts.map +1 -0
  301. package/dist/targets/material-source.d.ts +7 -0
  302. package/dist/targets/material-source.d.ts.map +1 -1
  303. package/dist/temporal/frame-coordinator.d.ts +7 -0
  304. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  305. package/dist/temporal/gpu.d.ts +8 -0
  306. package/dist/temporal/gpu.d.ts.map +1 -1
  307. package/dist/temporal/history.d.ts.map +1 -1
  308. package/dist/temporal/index.mjs +6 -6
  309. package/dist/temporal/inspection.d.ts.map +1 -1
  310. package/dist/temporal/standard-scene-data.d.ts +2 -1
  311. package/dist/temporal/standard-scene-data.d.ts.map +1 -1
  312. package/dist/temporal/temporal-view.d.ts +2 -0
  313. package/dist/temporal/temporal-view.d.ts.map +1 -1
  314. package/dist/typed-render-graph-primitives.d.ts +35 -1
  315. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  316. package/dist/typed-shadow-passes.d.ts +3 -1
  317. package/dist/typed-shadow-passes.d.ts.map +1 -1
  318. package/dist/volume/temporal.d.ts +6 -0
  319. package/dist/volume/temporal.d.ts.map +1 -1
  320. package/package.json +21 -20
  321. package/src/__tests__/auto-exposure-gpu-evidence.ts +291 -0
  322. package/src/__tests__/auto-exposure-inspection.unit.test.ts +80 -0
  323. package/src/__tests__/auto-exposure-transaction.integration.test.ts +99 -0
  324. package/src/__tests__/auto-exposure.browser.test.ts +33 -0
  325. package/src/__tests__/auto-exposure.dawn.test.ts +33 -0
  326. package/src/__tests__/detached-inspection.integration.test.ts +5 -0
  327. package/src/__tests__/device-scope-lifecycle.unit.test.ts +18 -0
  328. package/src/__tests__/device-scope-stale-matrix.unit.test.ts +18 -0
  329. package/src/__tests__/docs-gate-green.unit.test.ts +3 -3
  330. package/src/__tests__/dynamic-geometry-host.unit.test.ts +1123 -0
  331. package/src/__tests__/dynamic-geometry.unit.test.ts +233 -0
  332. package/src/__tests__/factory-contract.integration.test.ts +73 -22
  333. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +19 -0
  334. package/src/__tests__/feature-depth-input.dawn.test.ts +121 -0
  335. package/src/__tests__/feature-noise.unit.test.ts +38 -0
  336. package/src/__tests__/fixtures/taa-resolve-pinned-baseline.wgsl +301 -0
  337. package/src/__tests__/frame-camera-selection.unit.test.ts +131 -0
  338. package/src/__tests__/frame-plan-contract.unit.test.ts +24 -0
  339. package/src/__tests__/frame-targets.unit.test.ts +24 -0
  340. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +3 -0
  341. package/src/__tests__/gpu-driven-baseline.characterization.test.ts +79 -0
  342. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +287 -6
  343. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +122 -142
  344. package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +10 -1
  345. package/src/__tests__/gpu-driven-lod-cache.unit.test.ts +264 -0
  346. package/src/__tests__/gpu-driven-mesh-world-identity.unit.test.ts +349 -0
  347. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +1417 -0
  348. package/src/__tests__/gpu-driven-pbr.integration.test.ts +21 -0
  349. package/src/__tests__/gpu-driven-production-fixture.ts +96 -0
  350. package/src/__tests__/gpu-driven-production.integration.test.ts +1075 -93
  351. package/src/__tests__/gpu-driven-scaling.unit.test.ts +1 -3
  352. package/src/__tests__/gpu-driven-shadow-views.browser.test.ts +63 -0
  353. package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +294 -0
  354. package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +97 -0
  355. package/src/__tests__/gpu-driven-shadow-views.unit.test.ts +168 -0
  356. package/src/__tests__/gpu-driven-skin-contract.test-d.ts +11 -0
  357. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +72 -20
  358. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +30 -9
  359. package/src/__tests__/gpu-driven-view.unit.test.ts +159 -52
  360. package/src/__tests__/gpu-pass-timing.browser.test.ts +6 -1
  361. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +42 -0
  362. package/src/__tests__/gpu-scene-render-graph-gpu.ts +19 -5
  363. package/src/__tests__/gpu-scene.dawn.test.ts +40 -13
  364. package/src/__tests__/gpu-scene.unit.test.ts +559 -33
  365. package/src/__tests__/instances-culling.integration.test.ts +36 -10
  366. package/src/__tests__/instances-derived-bounds.unit.test.ts +54 -0
  367. package/src/__tests__/instances-store.unit.test.ts +242 -39
  368. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +6 -0
  369. package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +13 -16
  370. package/src/__tests__/lut-lkg-transaction.integration.test.ts +122 -0
  371. package/src/__tests__/material-contract-inventory.unit.test.ts +5 -6
  372. package/src/__tests__/material-dispatch-shader-id.unit.test.ts +51 -0
  373. package/src/__tests__/material-lane-selection.unit.test.ts +60 -0
  374. package/src/__tests__/material-numeric-upload.unit.test.ts +53 -0
  375. package/src/__tests__/material-texture-handles.unit.test.ts +18 -0
  376. package/src/__tests__/material-texture-source.unit.test.ts +87 -0
  377. package/src/__tests__/materials-authoring-validation.unit.test.ts +41 -0
  378. package/src/__tests__/materials-standard-contract.unit.test.ts +52 -2
  379. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +4 -0
  380. package/src/__tests__/mesh-submission-lifetime.unit.test.ts +53 -0
  381. package/src/__tests__/normal-fallback.dawn.test.ts +122 -0
  382. package/src/__tests__/particle-material-input-layout.unit.test.ts +104 -0
  383. package/src/__tests__/physical-clearcoat.integration.test.ts +37 -3
  384. package/src/__tests__/pipeline-texture-specialization.unit.test.ts +138 -0
  385. package/src/__tests__/point-shadow-inspection.unit.test.ts +2 -0
  386. package/src/__tests__/prepared-gpu-driven-pbr-contract.test-d.ts +31 -0
  387. package/src/__tests__/prepared-gpu-driven-pbr-contract.unit.test.ts +39 -0
  388. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +35 -4
  389. package/src/__tests__/prepared-graphics-capability.unit.test.ts +21 -0
  390. package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +6 -2
  391. package/src/__tests__/profiler-phase-catalog.test.ts +5 -0
  392. package/src/__tests__/public-surface.test-d.ts +3 -0
  393. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +30 -12
  394. package/src/__tests__/reflection-fallback-async-publication.unit.test.ts +104 -0
  395. package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +2 -1
  396. package/src/__tests__/render-error-code-owner.test-d.ts +4 -0
  397. package/src/__tests__/render-error-detail-ssot.test-d.ts +22 -0
  398. package/src/__tests__/render-error-exhaustive.test-d.ts +15 -0
  399. package/src/__tests__/render-feature-gpu-work.integration.test.ts +285 -2
  400. package/src/__tests__/render-feature-plan.unit.test.ts +245 -0
  401. package/src/__tests__/render-feature-shadow-order.unit.test.ts +228 -0
  402. package/src/__tests__/render-feature-zero-work.unit.test.ts +35 -1
  403. package/src/__tests__/render-graph-fallback.integration.test.ts +2 -2
  404. package/src/__tests__/render-owner-cohesion.unit.test.ts +55 -0
  405. package/src/__tests__/render-scene-mixed-updates.integration.test.ts +426 -0
  406. package/src/__tests__/render-scene-projection.unit.test.ts +914 -23
  407. package/src/__tests__/render-scene-resource-updates.integration.test.ts +214 -0
  408. package/src/__tests__/render-scene-skin-lifecycle.integration.test.ts +173 -0
  409. package/src/__tests__/render-scene-temporal-retry.unit.test.ts +133 -0
  410. package/src/__tests__/render-target-material-source.test-d.ts +27 -3
  411. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +61 -1
  412. package/src/__tests__/renderer-frame-transaction.integration.test.ts +923 -5
  413. package/src/__tests__/shader-manifest-fixture.ts +39 -0
  414. package/src/__tests__/skin-motion-regression.unit.test.ts +0 -33
  415. package/src/__tests__/skin-palette-persistent.integration.test.ts +28 -0
  416. package/src/__tests__/skin-palette-persistent.unit.test.ts +247 -0
  417. package/src/__tests__/skinned-shadow-caster.test.ts +118 -14
  418. package/src/__tests__/specular-environment-scale.dawn.test.ts +156 -0
  419. package/src/__tests__/ssr-admission-matrix.integration.test.ts +7 -1
  420. package/src/__tests__/ssr-confidence-compose.unit.test.ts +84 -0
  421. package/src/__tests__/ssr-coordinate-oracle.unit.test.ts +28 -0
  422. package/src/__tests__/ssr-format-probe-gating.integration.test.ts +82 -0
  423. package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +91 -0
  424. package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +112 -0
  425. package/src/__tests__/ssr-gpu-dispatch.ts +946 -0
  426. package/src/__tests__/ssr-graph-topology.unit.test.ts +104 -0
  427. package/src/__tests__/ssr-history-filter.dawn.test.ts +198 -0
  428. package/src/__tests__/ssr-hit-color.dawn.test.ts +273 -0
  429. package/src/__tests__/ssr-hiz-odd-reduction.dawn.test.ts +569 -0
  430. package/src/__tests__/ssr-hiz-rescue.dawn.test.ts +279 -0
  431. package/src/__tests__/ssr-hiz.browser.test.ts +150 -0
  432. package/src/__tests__/ssr-hiz.dawn.test.ts +150 -0
  433. package/src/__tests__/ssr-hiz.unit.test.ts +56 -0
  434. package/src/__tests__/ssr-inspection.unit.test.ts +105 -0
  435. package/src/__tests__/ssr-memory-budget.unit.test.ts +45 -0
  436. package/src/__tests__/ssr-performance-sequence-aggregation.unit.test.ts +15 -0
  437. package/src/__tests__/ssr-public-surface.test-d.ts +37 -0
  438. package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +387 -0
  439. package/src/__tests__/ssr-reflection-mip-reducer.dawn.test.ts +309 -0
  440. package/src/__tests__/ssr-reprojection-probe.ts +90 -0
  441. package/src/__tests__/ssr-roughness-mip.dawn.test.ts +163 -0
  442. package/src/__tests__/ssr-shader-prewarm.unit.test.ts +59 -0
  443. package/src/__tests__/ssr-spatial.integration.test.ts +141 -0
  444. package/src/__tests__/ssr-stable-lattice.dawn.test.ts +475 -0
  445. package/src/__tests__/ssr-temporal-history.unit.test.ts +202 -0
  446. package/src/__tests__/ssr-texel-crossing.dawn.test.ts +448 -0
  447. package/src/__tests__/ssr-zero-work.integration.test.ts +87 -0
  448. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +44 -12
  449. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +29 -0
  450. package/src/__tests__/standard-output-chain-contract.unit.test.ts +99 -0
  451. package/src/__tests__/standard-output-chain.integration.test.ts +73 -0
  452. package/src/__tests__/standard-output-gpu-evidence.ts +205 -0
  453. package/src/__tests__/standard-output.browser.test.ts +15 -0
  454. package/src/__tests__/standard-output.dawn.test.ts +15 -0
  455. package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +38 -0
  456. package/src/__tests__/standard-pipeline.integration.test.ts +320 -3
  457. package/src/__tests__/standard-profile-oracle.unit.test.ts +22 -0
  458. package/src/__tests__/standard-surface-lighting.unit.test.ts +41 -0
  459. package/src/__tests__/standard-texture-specialization.dawn.test.ts +141 -0
  460. package/src/__tests__/surface-adjacent-regressions.integration.test.ts +6 -3
  461. package/src/__tests__/taa-coverage-edge.dawn.test.ts +193 -0
  462. package/src/__tests__/taa-history-clipping.dawn.test.ts +328 -0
  463. package/src/__tests__/taa-neighborhood-equivalence.dawn.test.ts +778 -0
  464. package/src/__tests__/taa-stability-feedback.browser.test.ts +23 -0
  465. package/src/__tests__/taa-stability-feedback.dawn.test.ts +68 -0
  466. package/src/__tests__/taa-stability-feedback.ts +341 -0
  467. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +49 -7
  468. package/src/__tests__/temporal-reset-matrix.unit.test.ts +9 -0
  469. package/src/__tests__/temporal-transaction.integration.test.ts +28 -0
  470. package/src/__tests__/texture-usage-surface.unit.test.ts +4 -2
  471. package/src/__tests__/typed-pipeline-topology.unit.test.ts +109 -4
  472. package/src/__tests__/typed-scene-pass-material-cache.integration.test.ts +126 -0
  473. package/src/__tests__/vertex-layouts-ssot.unit.test.ts +47 -0
  474. package/src/__tests__/visibility-extract.perf.test.ts +20 -8
  475. package/src/__tests__/visibility-instances.integration.test.ts +19 -7
  476. package/src/__tests__/visibility-producer-matrix.integration.test.ts +20 -9
  477. package/src/assembly/atmosphere-shader-prewarm.ts +38 -0
  478. package/src/assembly/dynamic-geometry-host.ts +887 -0
  479. package/src/assembly/dynamic-geometry-runtime.ts +71 -0
  480. package/src/assembly/factory.ts +4 -0
  481. package/src/assembly/gpu-driven-owner.ts +29 -0
  482. package/src/assembly/host-contract.ts +36 -0
  483. package/src/assembly/material/assembly.ts +38 -0
  484. package/src/assembly/material-shader-policy.ts +71 -28
  485. package/src/assembly/recovery/failure-location.ts +62 -0
  486. package/src/assembly/recovery/renderer-recover.ts +19 -17
  487. package/src/assembly/renderer-facade.ts +29 -0
  488. package/src/assembly/renderer-feature-inspection.ts +13 -0
  489. package/src/assembly/renderer-frame-transaction.ts +63 -0
  490. package/src/assembly/renderer-helpers.ts +26 -0
  491. package/src/assembly/renderer-inspection.ts +6 -0
  492. package/src/assembly/shader-prewarm-policy.ts +32 -0
  493. package/src/assembly/skin-palette-owner.ts +21 -0
  494. package/src/assembly/ssr-shader-prewarm.ts +41 -0
  495. package/src/assembly/webgpu-device-loss.ts +75 -0
  496. package/src/assembly/webgpu-pbr-ready.ts +232 -0
  497. package/src/assembly/webgpu-ready-mipmap.ts +26 -0
  498. package/src/assembly/webgpu-ready.ts +142 -121
  499. package/src/assembly/webgpu-renderer-bootstrap.ts +85 -0
  500. package/src/assembly/webgpu-renderer-contract.ts +69 -0
  501. package/src/assembly/webgpu-renderer-guards.ts +32 -0
  502. package/src/assembly/webgpu-renderer-observation.ts +43 -0
  503. package/src/assembly/webgpu-renderer-recovery-failure.ts +62 -0
  504. package/src/assembly/webgpu-renderer.ts +675 -614
  505. package/src/assembly/webgpu-vertex-layouts.ts +233 -87
  506. package/src/components/__tests__/camera-exposure.contract.unit.test.ts +153 -0
  507. package/src/components/camera.ts +287 -7
  508. package/src/components/index.ts +1 -0
  509. package/src/components/instances.ts +45 -18
  510. package/src/components/scene-instance.ts +2 -1
  511. package/src/components/screen-space-reflection.ts +21 -0
  512. package/src/components/sprite-animation.ts +3 -3
  513. package/src/components/sprite-instances.ts +1 -1
  514. package/src/device/gpu-residency.ts +96 -93
  515. package/src/device/mesh-residency-lifetime.ts +73 -0
  516. package/src/dynamic-geometry.ts +736 -0
  517. package/src/environment/background.ts +263 -0
  518. package/src/errors/gpu-driven.ts +39 -5
  519. package/src/errors/render.ts +27 -3
  520. package/src/extract/camera.ts +26 -1
  521. package/src/extract/gpu-driven.ts +185 -10
  522. package/src/features/host.ts +237 -19
  523. package/src/features/noise-texture.ts +91 -0
  524. package/src/features/plan.ts +553 -24
  525. package/src/features/prepared-gpu-work.ts +631 -49
  526. package/src/features/prepared-graphics-store.ts +31 -0
  527. package/src/features/prepared-graphics.ts +5 -0
  528. package/src/features/render-graph-compute.ts +41 -8
  529. package/src/features/render-graph-contribution.ts +141 -3
  530. package/src/features/render-graph-raster.ts +143 -30
  531. package/src/features/types.ts +11 -0
  532. package/src/fullscreen-post-process-pass.ts +3 -0
  533. package/src/gpu-driven/batch-topology.ts +424 -102
  534. package/src/gpu-driven/pbr-program.ts +31 -0
  535. package/src/gpu-driven/prepared-draw.ts +29 -4
  536. package/src/gpu-driven/production-raster.ts +2267 -694
  537. package/src/gpu-driven/shadow-views.ts +539 -0
  538. package/src/gpu-driven/view-gpu.ts +188 -41
  539. package/src/gpu-scene-schema.ts +52 -11
  540. package/src/gpu-scene.ts +186 -99
  541. package/src/gpu-texture-usage.ts +1 -0
  542. package/src/hdrp-buffers.ts +72 -36
  543. package/src/ibl/frame-resources.ts +38 -0
  544. package/src/ibl/skylight-bind-group.ts +5 -4
  545. package/src/index.ts +125 -1
  546. package/src/inspection-types.ts +191 -0
  547. package/src/instances-derived-bounds.ts +258 -34
  548. package/src/instances.ts +459 -150
  549. package/src/internal.ts +22 -0
  550. package/src/lifecycle.ts +2 -0
  551. package/src/material-row.ts +145 -0
  552. package/src/materials.ts +44 -8
  553. package/src/pbr-pipeline.ts +159 -17
  554. package/src/pipeline/standard-forward-lane.ts +52 -24
  555. package/src/pipeline/standard-output/__tests__/lut-admission.unit.test.ts +103 -0
  556. package/src/pipeline/standard-output/auto-exposure/__tests__/capability.unit.test.ts +40 -0
  557. package/src/pipeline/standard-output/auto-exposure/__tests__/gpu.contract.unit.test.ts +125 -0
  558. package/src/pipeline/standard-output/auto-exposure/__tests__/graph.contract.unit.test.ts +94 -0
  559. package/src/pipeline/standard-output/auto-exposure/__tests__/oracle.test.ts +108 -0
  560. package/src/pipeline/standard-output/auto-exposure/__tests__/preset.test.ts +26 -0
  561. package/src/pipeline/standard-output/auto-exposure/capability.ts +38 -0
  562. package/src/pipeline/standard-output/auto-exposure/gpu.ts +567 -0
  563. package/src/pipeline/standard-output/auto-exposure/graph.ts +221 -0
  564. package/src/pipeline/standard-output/auto-exposure/inspection.ts +231 -0
  565. package/src/pipeline/standard-output/auto-exposure/oracle.ts +291 -0
  566. package/src/pipeline/standard-output/auto-exposure/preset.ts +28 -0
  567. package/src/pipeline/standard-output/auto-exposure/state.ts +156 -0
  568. package/src/pipeline/standard-output/color-transform.ts +124 -0
  569. package/src/pipeline/standard-output/graph.ts +139 -0
  570. package/src/pipeline/standard-output/lut-admission.ts +121 -0
  571. package/src/pipeline/standard-output/lut-gpu.ts +399 -0
  572. package/src/pipeline/standard-output/lut-state.ts +176 -0
  573. package/src/pipeline/standard-output/resources.ts +121 -0
  574. package/src/pipeline/standard-output/types.ts +58 -0
  575. package/src/pipeline/standard-pipeline.ts +192 -59
  576. package/src/pipeline/standard-post.ts +186 -27
  577. package/src/pipeline-builder.ts +16 -6
  578. package/src/pipeline-spec-types.ts +4 -0
  579. package/src/pipeline-spec.ts +37 -29
  580. package/src/points-lines/standard-owner.ts +6 -14
  581. package/src/prepare/prepared-graphics-resolver.ts +9 -2
  582. package/src/record/__tests__/material-slot-plan.unit.test.ts +48 -0
  583. package/src/record/__tests__/mesh-ssbo.unit.test.ts +40 -1
  584. package/src/record/__tests__/recovery-pipeline.unit.test.ts +2 -29
  585. package/src/record/__tests__/sprite-material-abi.unit.test.ts +36 -5
  586. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +45 -0
  587. package/src/record/__tests__/view-ubo-layout.unit.test.ts +5 -0
  588. package/src/record/dynamic-geometry-consumption.ts +59 -0
  589. package/src/record/frame-lighting.ts +12 -11
  590. package/src/record/frame-snapshot.ts +133 -23
  591. package/src/record/frame-targets.ts +9 -0
  592. package/src/record/frame.ts +727 -133
  593. package/src/record/main-pass-geometry.ts +162 -98
  594. package/src/record/main-pass-material.ts +115 -26
  595. package/src/record/main-pass-sprite-draws.ts +18 -107
  596. package/src/record/main-pass.ts +78 -8
  597. package/src/record/material-uniforms.ts +1 -1
  598. package/src/record/mesh-ssbo.ts +59 -15
  599. package/src/record/prepared-material-bindings.ts +234 -0
  600. package/src/record/recovery-pipeline.ts +59 -136
  601. package/src/record/render-context.ts +92 -22
  602. package/src/record/shadow-pass.ts +1231 -209
  603. package/src/record/skybox-post-pass.ts +14 -3
  604. package/src/record/typed-frame-graph.ts +1006 -53
  605. package/src/record/view-ubo.ts +11 -0
  606. package/src/recovery/render-system-candidate.ts +90 -66
  607. package/src/recovery/render-system-roots.ts +113 -0
  608. package/src/recovery/types.ts +77 -0
  609. package/src/reflection/record-owner.ts +26 -54
  610. package/src/render-contract.ts +219 -25
  611. package/src/render-graph-primitives.ts +6 -2
  612. package/src/render-pipeline.ts +70 -1
  613. package/src/render-system-extract-tail.ts +409 -160
  614. package/src/render-system-extract.ts +376 -102
  615. package/src/render-system-projections.ts +241 -0
  616. package/src/render-system.ts +692 -791
  617. package/src/scene/render-scene-types.ts +13 -4
  618. package/src/scene/render-scene.ts +569 -355
  619. package/src/scene/shadow-visibility.ts +21 -0
  620. package/src/ssr/admission.ts +380 -14
  621. package/src/ssr/compose.ts +144 -0
  622. package/src/ssr/errors.ts +48 -0
  623. package/src/ssr/graph.ts +777 -0
  624. package/src/ssr/history.ts +436 -0
  625. package/src/ssr/hiz.ts +124 -0
  626. package/src/ssr/inspection.ts +124 -0
  627. package/src/ssr/resources.ts +202 -0
  628. package/src/ssr/temporal.ts +164 -0
  629. package/src/systems/skin-palette-allocator.ts +495 -148
  630. package/src/systems/skin-palette-types.ts +17 -0
  631. package/src/systems/transparent-dispatch.ts +90 -0
  632. package/src/targets/material-source.ts +34 -0
  633. package/src/temporal/coverage.ts +1 -1
  634. package/src/temporal/frame-coordinator.ts +23 -2
  635. package/src/temporal/gpu.ts +74 -12
  636. package/src/temporal/history.ts +3 -1
  637. package/src/temporal/inspection.ts +2 -1
  638. package/src/temporal/standard-scene-data.ts +3 -1
  639. package/src/temporal/temporal-view.ts +3 -0
  640. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +204 -139
  641. package/src/typed-render-graph-primitives.ts +266 -74
  642. package/src/typed-shadow-passes.ts +122 -12
  643. package/src/volume/temporal.ts +10 -0
  644. package/dist/chunk-ADHHVYLW.mjs.map +0 -1
  645. package/dist/chunk-FJ6P52EE.mjs.map +0 -1
  646. package/dist/chunk-GE3SDD72.mjs.map +0 -1
  647. package/dist/chunk-GF523LHF.mjs.map +0 -1
  648. package/dist/chunk-HKXTW355.mjs.map +0 -1
  649. package/dist/chunk-JDWARUOI.mjs.map +0 -1
  650. package/dist/chunk-KM2NOX2I.mjs.map +0 -1
  651. package/dist/chunk-TMIASV2N.mjs.map +0 -1
  652. package/dist/chunk-XDP6XE5V.mjs.map +0 -1
  653. package/dist/chunk-ZZ4YQ474.mjs.map +0 -1
  654. package/src/__tests__/instances-world-ownership.integration.test.ts +0 -62
  655. package/src/scene/__tests__/changed-block-summary.candidate.test.ts +0 -36
@@ -23,6 +23,7 @@ import {
23
23
  DEFAULT_MSDF_TEXT_PARAM_SCHEMA,
24
24
  DEFAULT_SPRITE_PARAM_SCHEMA,
25
25
  DEFAULT_UNLIT_PARAM_SCHEMA,
26
+ STANDARD_PHYSICAL_TEXTURE_FIELDS,
26
27
  STANDARD_PIPELINE_PARAM_SCHEMA,
27
28
  } from '@forgeax/engine-shader';
28
29
  import type {
@@ -51,7 +52,7 @@ import {
51
52
  physicalTextureFields,
52
53
  } from '../pbr-pipeline';
53
54
  import { deriveTextureExtent } from '../render-data';
54
- import type { MaterialSnapshot } from '../render-system-extract';
55
+ import type { MaterialSnapshot, SkylightSnapshot } from '../render-system-extract';
55
56
  import type { RenderTargetTextureSource } from '../targets/contracts';
56
57
  import {
57
58
  type RenderTargetMaterialSourceBinding,
@@ -548,6 +549,44 @@ function materialUboFloatView(payload: MaterialUboPayload): Float32Array {
548
549
  : new Float32Array(payload);
549
550
  }
550
551
 
552
+ function materialUboDataView(payload: MaterialUboPayload): DataView {
553
+ if (payload instanceof Float32Array || payload instanceof Uint8Array) {
554
+ return new DataView(payload.buffer, payload.byteOffset, payload.byteLength);
555
+ }
556
+ return new DataView(payload);
557
+ }
558
+
559
+ /** Write one schema value with the scalar type's actual WGSL bit encoding. */
560
+ function writeNumericParamValue(
561
+ view: DataView,
562
+ entry: { readonly offset: number; readonly size: number; readonly type: string },
563
+ value: number | readonly number[],
564
+ ): void {
565
+ const values = typeof value === 'number' ? [value] : value;
566
+ const width = entry.size / 4;
567
+ const writeCount = Math.min(values.length, width);
568
+ for (let index = 0; index < writeCount; index += 1) {
569
+ const component = values[index];
570
+ if (typeof component !== 'number') continue;
571
+ const byteOffset = entry.offset + index * 4;
572
+ switch (entry.type) {
573
+ case 'i32':
574
+ view.setInt32(byteOffset, component, true);
575
+ break;
576
+ case 'u32':
577
+ view.setUint32(byteOffset, component, true);
578
+ break;
579
+ case 'f32':
580
+ case 'vec2':
581
+ case 'vec3':
582
+ case 'vec4':
583
+ case 'color':
584
+ view.setFloat32(byteOffset, component, true);
585
+ break;
586
+ }
587
+ }
588
+ }
589
+
551
590
  export function applyMaterialTextureUvScales(
552
591
  payload: MaterialUboPayload,
553
592
  material: MaterialSnapshot,
@@ -745,7 +784,7 @@ export function writePbrMaterialUboPayload(
745
784
  );
746
785
  }
747
786
  buf.fill(0);
748
- const f32 = materialUboFloatView(buf);
787
+ const dataView = materialUboDataView(buf);
749
788
  const schema =
750
789
  material.materialParamSchema === undefined || material.materialParamSchema.length === 0
751
790
  ? STANDARD_PIPELINE_PARAM_SCHEMA
@@ -782,15 +821,10 @@ export function writePbrMaterialUboPayload(
782
821
  const value =
783
822
  snapshot?.[entry.name] ??
784
823
  fallback(entry.name, schema.find((item) => item.name === entry.name) ?? entry);
785
- const offset = entry.offset / 4;
786
- const width = entry.size / 4;
787
824
  if (typeof value === 'number') {
788
- f32[offset] = value;
825
+ writeNumericParamValue(dataView, entry, value);
789
826
  } 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
- }
827
+ writeNumericParamValue(dataView, entry, value);
794
828
  }
795
829
  }
796
830
  }
@@ -839,28 +873,18 @@ export function applyParamSnapshotToUbo(
839
873
  ): void {
840
874
  if (paramSchema === undefined) return;
841
875
  if (paramSnapshot === undefined) return;
842
- const f32 = materialUboFloatView(payload);
876
+ const dataView = materialUboDataView(payload);
843
877
  const { uboLayout } = derivedParamSchema(paramSchema);
844
878
  for (const entry of uboLayout.entries) {
845
879
  const value = paramSnapshot[entry.name];
846
880
  if (value === undefined) continue;
847
- const f32Offset = entry.offset / 4;
848
- const f32Width = entry.size / 4;
849
881
  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;
882
+ writeNumericParamValue(dataView, entry, value);
855
883
  continue;
856
884
  }
857
885
  if (Array.isArray(value)) {
858
886
  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
- }
887
+ writeNumericParamValue(dataView, entry, arr);
864
888
  }
865
889
  // string values (texture GUIDs) belong to texture bindings, not the
866
890
  // UBO; derive's uboLayout.entries already strips non-numeric schema
@@ -869,6 +893,31 @@ export function applyParamSnapshotToUbo(
869
893
  }
870
894
  }
871
895
 
896
+ /**
897
+ * Seed a schema-driven UBO with the defaults declared by its numeric contract.
898
+ *
899
+ * Prepared graphics (VFX and other feature-owned materials) do not pass
900
+ * through the extracted `MaterialSnapshot` writer, so their payload starts as
901
+ * zeroed storage. Applying the schema defaults first keeps that path
902
+ * byte-compatible with the ordinary material writer while preserving the
903
+ * snapshot writer's intentional overlay semantics.
904
+ */
905
+ export function applyParamSchemaDefaultsToUbo(
906
+ payload: MaterialUboPayload,
907
+ paramSchema: readonly ParamSchemaEntry[] | undefined,
908
+ ): void {
909
+ if (paramSchema === undefined) return;
910
+ const defaults: Record<string, number | readonly number[]> = {};
911
+ for (const entry of derivedParamSchema(paramSchema).uboLayout.entries) {
912
+ const schemaEntry = paramSchema.find((candidate) => candidate.name === entry.name);
913
+ const value = schemaEntry?.default;
914
+ if (typeof value === 'number' || Array.isArray(value)) {
915
+ defaults[entry.name] = value as number | readonly number[];
916
+ }
917
+ }
918
+ applyParamSnapshotToUbo(payload, paramSchema, defaults);
919
+ }
920
+
872
921
  /**
873
922
  * feat-20260704 M3/w19: shared per-submesh material bind-group assembly, hoisted
874
923
  * from the `buildPerSubmeshMaterialBg` closure inside recordMainPass so both the
@@ -902,6 +951,8 @@ export interface PerSubmeshMaterialBgDeps {
902
951
  readonly materialBgShared: Map<string, WeakMap<object, unknown>>;
903
952
  /** Cross-frame final BG reuse keyed by the stable source material handle. */
904
953
  readonly materialBgAssemblyCache: Map<string, MaterialBgAssemblyCacheEntry>;
954
+ /** Producer-owned numeric scene rows consumed by scene-index PBR draws. */
955
+ readonly sceneMaterialBuffer?: Buffer;
905
956
  /** Active transmission backdrop; undefined/null means layout placeholder. */
906
957
  readonly transmissionBackdropView?: TextureView | null;
907
958
  readonly bindGroupCounts: BindGroupCounts;
@@ -1041,7 +1092,8 @@ export function buildPerSubmeshMaterialBg(
1041
1092
  effectiveSkylightResources,
1042
1093
  store.materialResourceEpoch,
1043
1094
  transmissionBackdropView,
1044
- )
1095
+ ) &&
1096
+ deps.sceneMaterialBuffer === undefined
1045
1097
  ) {
1046
1098
  if (diagnosticsEnabled) {
1047
1099
  recordIblMaterialBinding(
@@ -1194,7 +1246,9 @@ export function buildPerSubmeshMaterialBg(
1194
1246
  }
1195
1247
  }
1196
1248
  physicalTextureInjections.push({
1197
- slot,
1249
+ slot: STANDARD_PHYSICAL_TEXTURE_FIELDS.indexOf(
1250
+ field as (typeof STANDARD_PHYSICAL_TEXTURE_FIELDS)[number],
1251
+ ),
1198
1252
  sampler: smSamplerForField(field),
1199
1253
  view,
1200
1254
  });
@@ -1216,6 +1270,23 @@ export function buildPerSubmeshMaterialBg(
1216
1270
  } satisfies TransmissionBindGroupResources,
1217
1271
  physicalTextureInjections,
1218
1272
  );
1273
+ // Storage-capable devices share one Standard material BGL with the
1274
+ // scene-index GPU lane. Even direct draws need a complete entry for
1275
+ // binding(46), although their shader does not read the scene table. Reuse
1276
+ // the storage-backed mesh table as a neutral placeholder until a
1277
+ // producer-owned GPU scene table is available; GPU-driven draws replace it
1278
+ // with `deps.sceneMaterialBuffer`.
1279
+ if (runtime.device.caps.storageBuffer) {
1280
+ smMergedEntries.push({
1281
+ binding: 46,
1282
+ resource: {
1283
+ kind: 'buffer' as const,
1284
+ value: {
1285
+ buffer: deps.sceneMaterialBuffer ?? pipelineState.meshStorageBuffer.buffer,
1286
+ },
1287
+ },
1288
+ });
1289
+ }
1219
1290
  const createBindGroup = (): BindGroup => {
1220
1291
  const result = runtime.device.createBindGroup({
1221
1292
  label: 'pbr-material-skylight-bg',
@@ -1283,6 +1354,7 @@ export function buildPerSubmeshMaterialBg(
1283
1354
  smMaterialHandle !== undefined &&
1284
1355
  !smHasVideoFields &&
1285
1356
  materialResourcesResident &&
1357
+ deps.sceneMaterialBuffer === undefined &&
1286
1358
  !hasActiveTransmissionBackdrop
1287
1359
  ) {
1288
1360
  if (materialCacheKey !== undefined) {
@@ -1302,8 +1374,20 @@ export function buildPerSubmeshMaterialBg(
1302
1374
  const ZERO_SKYLIGHT_PAYLOAD = new Float32Array([0, 0, 0, 0, 0, 0, 0, 1]);
1303
1375
 
1304
1376
  /** 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;
1377
+ /**
1378
+ * Resolve the renderer-owned Skylight bundle for both ordinary geometry and
1379
+ * prepared RenderFeature materials. Feature preparation runs before the
1380
+ * main pass is encoded, so it cannot rely on the geometry pass to initialize
1381
+ * the intensity buffer or to select the current IBL views. Keeping this
1382
+ * small argument-based helper as the single resolver makes the two paths use
1383
+ * identical resources while retaining the existing frame-local write.
1384
+ */
1385
+ export function resolveMaterialSkylight(
1386
+ runtime: Pick<RenderSystemRuntime, 'device' | 'deviceScope'>,
1387
+ pipelineState: Pick<PipelineState, 'skylightFallback'>,
1388
+ skylight: SkylightSnapshot | undefined,
1389
+ skylightCount: number,
1390
+ ) {
1307
1391
  const skylightFallback = pipelineState.skylightFallback;
1308
1392
  if (skylightFallback === null) {
1309
1393
  throw new RhiError({
@@ -1378,3 +1462,8 @@ export function prepareMaterialSkylight(c: _InternalRenderPipelineContext) {
1378
1462
  };
1379
1463
  return { skylightResources, activeViews };
1380
1464
  }
1465
+
1466
+ /** The same scene resources back material bindings in depth and color passes. */
1467
+ export function prepareMaterialSkylight(c: _InternalRenderPipelineContext) {
1468
+ return resolveMaterialSkylight(c.runtime, c.pipelineState, c.skylight, c.skylightCount);
1469
+ }
@@ -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,
@@ -737,6 +681,7 @@ function recordSpriteEntityDraws(
737
681
  );
738
682
  spritePass.setBindGroup(3, spriteInstBg);
739
683
  spritePass.drawIndexed(spriteEntry.mesh.indexCount, spriteInstanceCount, 0, 0, 0);
684
+ c.onRenderableDraw?.(spriteEntry);
740
685
  continue;
741
686
  }
742
687
  spriteBufUsage = GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST;
@@ -852,53 +797,19 @@ function recordSpriteEntityDraws(
852
797
 
853
798
  const materialSlot = materialSlotIndices[i]?.[0] ?? 0;
854
799
 
855
- // Per-entity sprite material bind group: same standard PBR user-region
856
- // layout as in the geometry pass sprite branch + Skylight merged entries
857
- // the geometry pass sprite branch + Skylight merged entries (same
858
- // skylightResources in scope from above). Texture view is resolved
859
- // from the sprite material's baseColorTexture handle.
860
- const spriteTexHandle = spriteEntry.source.material.baseColorTexture as
861
- | Handle<'TextureAsset', 'shared'>
862
- | undefined;
863
- let spriteTexView = pipelineState.defaultWhiteTextureView;
864
- if (spriteTexHandle !== undefined) {
865
- const tv = residentTextureView(spriteEntry.world ?? world, store, runtime, spriteTexHandle);
866
- if (tv !== undefined) spriteTexView = tv as never;
867
- }
868
- const spritePassBaseMaterialEntries = buildSpritePassBaseMaterialEntries(
869
- pipelineState,
870
- spriteTexView,
871
- );
872
- const spritePassMergedEntries = assembleMaterialWithSkylightEntries(
873
- spritePassBaseMaterialEntries,
874
- skylightResources,
875
- );
876
-
877
- // Sprite-pass material BG cache: keyed on shader id (shared across all
878
- // sprite entities) so entities using the same atlas texture share one
879
- // BindGroup instead of creating one per entity (O5 fix — inner WeakMap
880
- // chain naturally deduplicates by GPU resource object identity, so two
881
- // entities with different atlases still get distinct BGs).
882
- const spritePassBg: BindGroup = getOrCreatePerEntity(
883
- frameState.materialBgShared,
884
- 'forgeax::sprite',
885
- spritePassMergedEntries.map((e) => extractEntryResourceHandle(e)),
886
- 'sprite-pass-material',
887
- () => {
888
- const result = runtime.device.createBindGroup({
889
- label: 'sprite-pass-material-bg',
890
- layout: pipelineState.materialBindGroupLayout,
891
- entries: spritePassMergedEntries,
892
- });
893
- if (!result.ok) throw result.error;
894
- return result.value;
895
- },
896
- 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,
897
807
  );
898
808
 
899
809
  spritePass.setBindGroup(1, spritePassBg, [materialSlot * MATERIAL_PER_ENTITY_STRIDE]);
900
810
  spritePass.setBindGroup(3, spriteInstancesBg);
901
811
  spritePass.drawIndexed(spriteEntry.mesh.indexCount, spriteInstanceCount, 0, 0, 0);
812
+ c.onRenderableDraw?.(spriteEntry);
902
813
  }
903
814
  }
904
815
 
@@ -1,5 +1,6 @@
1
1
  import type { World } from '@forgeax/engine-ecs';
2
2
  import { probeVideoHighPerfUpload } from '@forgeax/engine-graphics-extras';
3
+ import type { GraphResourceResolver } from '@forgeax/engine-render-graph';
3
4
  import {
4
5
  type BindGroup,
5
6
  RhiError,
@@ -14,9 +15,13 @@ import { buildBeginRenderPassDescriptor, standardTopologyBindGroupReady } from '
14
15
  import { POINTS_LINES_MATERIAL_SHADER_ID } from '../points-lines/record';
15
16
  import type { ReflectionProbeSelectionResult } from '../reflection/projection';
16
17
  import type { RenderRecordPhase } from '../render-contract';
18
+ import type {
19
+ GpuDrivenStandardPbrFrameResources,
20
+ RenderPipelineGpuDrivenProjection,
21
+ } from '../render-pipeline';
17
22
  import type { MaterialSnapshot } from '../render-system-extract';
18
23
  import { resolveReflectionProbeBinding } from './frame-lighting';
19
- import { getOpaqueResourceIdentity } from './frame-snapshot';
24
+ import { getOpaqueResourceIdentity, worldEntityKey } from './frame-snapshot';
20
25
  import { recordGeometryDraws } from './main-pass-geometry';
21
26
  import {
22
27
  buildPerSubmeshMaterialBg as buildPerSubmeshMaterialBgImpl,
@@ -57,7 +62,15 @@ export type MainPassOptions = {
57
62
  readonly passKind?: PassKind;
58
63
  readonly clearColor?: readonly [number, number, number, number];
59
64
  readonly recordMode?: 'opaque' | 'transmission' | 'transparent';
65
+ /** Exclude material/pass pairs already consumed by an earlier graph lane. */
66
+ readonly excludeSelector?: PassSelector;
67
+ /** Require the same material to contribute to another graph lane. */
68
+ readonly includeSelector?: PassSelector;
60
69
  readonly transmissionBackdropView?: TextureView | null;
70
+ readonly gpuDriven?: {
71
+ readonly projection: RenderPipelineGpuDrivenProjection;
72
+ readonly resources: GraphResourceResolver;
73
+ };
61
74
  };
62
75
 
63
76
  function isTransmissionMaterial(material: MaterialSnapshot): boolean {
@@ -117,7 +130,7 @@ export function recordMainPass(
117
130
  selector?: PassSelector,
118
131
  options?: MainPassOptions,
119
132
  graphPass?: RhiRenderPassEncoder,
120
- ): void {
133
+ ): GpuDrivenStandardPbrFrameResources | undefined {
121
134
  const {
122
135
  runtime,
123
136
  world,
@@ -143,6 +156,8 @@ export function recordMainPass(
143
156
  materialSlots,
144
157
  materialSlotOwners,
145
158
  materialSlotCount,
159
+ gpuDrivenStandardPbrFrameResources,
160
+ gpuDrivenSceneMaterialBuffer,
146
161
  } = c;
147
162
  // bug-20260615 M3 / m3-1: sampleCount is threaded through every
148
163
  // getMaterialShaderPipeline call site so the cache key / builder
@@ -280,7 +295,14 @@ export function recordMainPass(
280
295
  const matchedIndices =
281
296
  selector !== undefined ? buildMatchedRenderableIndices(dispatch, selector) : null;
282
297
  const selectorMatchedMaterials =
283
- selector !== undefined ? buildMatchedMaterialHandlesByRenderable(dispatch, selector) : null;
298
+ selector !== undefined
299
+ ? buildMatchedMaterialHandlesByRenderable(
300
+ dispatch,
301
+ selector,
302
+ options?.excludeSelector,
303
+ options?.includeSelector,
304
+ )
305
+ : null;
284
306
  const matchedMaterials = matchedMaterialsForRecordMode(c, selectorMatchedMaterials, recordMode);
285
307
  const selectedDispatch =
286
308
  dispatch.length === 0
@@ -488,6 +510,14 @@ export function recordMainPass(
488
510
  materialBgAssemblyCache: c.materialBgAssemblyCache,
489
511
  frameState,
490
512
  bindGroupCounts,
513
+ ...(gpuDrivenStandardPbrFrameResources?.sceneMaterialBuffer === undefined &&
514
+ gpuDrivenSceneMaterialBuffer === undefined
515
+ ? {}
516
+ : {
517
+ sceneMaterialBuffer:
518
+ gpuDrivenStandardPbrFrameResources?.sceneMaterialBuffer ??
519
+ gpuDrivenSceneMaterialBuffer,
520
+ }),
491
521
  ...(transmissionBackdropView === undefined ? {} : { transmissionBackdropView }),
492
522
  };
493
523
  const buildPerSubmeshMaterialBg = (
@@ -503,7 +533,6 @@ export function recordMainPass(
503
533
  materialWorld,
504
534
  materialShaderId,
505
535
  );
506
-
507
536
  // Static material resources are a property of the frame-local material
508
537
  // slot, not of each submesh draw. Resolve them once here so the geometry
509
538
  // loop only selects a prepared binding. Video fields remain entity-bound:
@@ -513,7 +542,7 @@ export function recordMainPass(
513
542
  for (let materialSlot = 0; materialSlot < materialSlotCount; materialSlot += 1) {
514
543
  const material = materialSlots[materialSlot];
515
544
  if (material === undefined || (material.videoTextureFields?.size ?? 0) > 0) continue;
516
- const owner = validatedOrdered[materialSlotOwners[materialSlot] ?? -1];
545
+ const owner = materialSlotOwners[materialSlot];
517
546
  if (owner === undefined) continue;
518
547
  preparedMaterialBindGroups[materialSlot] = buildPerSubmeshMaterialBg(
519
548
  material,
@@ -521,6 +550,19 @@ export function recordMainPass(
521
550
  owner.world ?? world,
522
551
  );
523
552
  }
553
+ if (gpuDrivenStandardPbrFrameResources !== undefined) {
554
+ gpuDrivenStandardPbrFrameResources.materialBindGroups.length = 0;
555
+ gpuDrivenStandardPbrFrameResources.materialBindGroups.push(...preparedMaterialBindGroups);
556
+ gpuDrivenStandardPbrFrameResources.materialSlotIndicesByEntity.clear();
557
+ for (let index = 0; index < validatedOrdered.length; index += 1) {
558
+ const entry = validatedOrdered[index];
559
+ if (entry === undefined) continue;
560
+ gpuDrivenStandardPbrFrameResources.materialSlotIndicesByEntity.set(
561
+ worldEntityKey(entry.source.worldId, entry.source.entityKey),
562
+ materialSlotIndices[index] ?? [],
563
+ );
564
+ }
565
+ }
524
566
  const resolveMaterialBindGroup = (
525
567
  materialSlot: number,
526
568
  material: MaterialSnapshot,
@@ -554,6 +596,7 @@ export function recordMainPass(
554
596
  resolveMaterialBindGroup,
555
597
  passKind,
556
598
  selectedDispatch,
599
+ colorFormats,
557
600
  );
558
601
  };
559
602
  if (c.profilePhase === undefined) {
@@ -566,6 +609,33 @@ export function recordMainPass(
566
609
  );
567
610
  }
568
611
 
612
+ if (options?.gpuDriven !== undefined) {
613
+ if (viewBindGroup === null) {
614
+ throw new RhiError({
615
+ code: 'rhi-not-available',
616
+ expected: 'main-pass Standard PBR view bind group for GPU-driven encode',
617
+ hint: 'publish the current frame view/light/shadow bind group before GPU raster',
618
+ });
619
+ }
620
+ if (
621
+ gpuDrivenStandardPbrFrameResources === undefined ||
622
+ gpuDrivenStandardPbrFrameResources.materialBindGroups.length === 0 ||
623
+ gpuDrivenStandardPbrFrameResources.materialBindGroups.some((group) => group === undefined)
624
+ ) {
625
+ throw new RhiError({
626
+ code: 'rhi-not-available',
627
+ expected: 'complete main-pass Standard PBR material bind-group receipt',
628
+ hint: 'finish frame material producer assembly before GPU-driven encode',
629
+ });
630
+ }
631
+ options.gpuDriven.projection.encode(
632
+ viewBindGroup,
633
+ pass,
634
+ options.gpuDriven.resources,
635
+ gpuDrivenStandardPbrFrameResources,
636
+ );
637
+ }
638
+
569
639
  // D-2: LDR sprite pass. Runs after the geometry pass when there are
570
640
  // sprite entities in the draw list and the LDR path is active.
571
641
  // The geometry pass used the bgra8unorm-srgb sRGB view (hardware sRGB
@@ -583,7 +653,6 @@ export function recordMainPass(
583
653
  materialSlotIndices,
584
654
  sampleCount,
585
655
  resolveMaterialBindGroup,
586
- skylightResources,
587
656
  graphPass,
588
657
  selectedDispatch,
589
658
  );
@@ -593,6 +662,7 @@ export function recordMainPass(
593
662
  if (!geometryPassEnded && graphPass === undefined) {
594
663
  pass.end();
595
664
  }
665
+ return gpuDrivenStandardPbrFrameResources;
596
666
  }
597
667
 
598
668
  export function encodeMainPass(
@@ -600,6 +670,6 @@ export function encodeMainPass(
600
670
  pass: RhiRenderPassEncoder,
601
671
  selector?: PassSelector,
602
672
  options?: MainPassOptions,
603
- ): void {
604
- recordMainPass(c, selector, options, pass);
673
+ ): GpuDrivenStandardPbrFrameResources | undefined {
674
+ return recordMainPass(c, selector, options, pass);
605
675
  }
@@ -41,7 +41,7 @@ export function uploadMaterialUniforms(c: _InternalRenderPipelineContext): void
41
41
  );
42
42
  for (let materialSlot = 0; materialSlot < materialSlots.length; materialSlot += 1) {
43
43
  const mat = materialSlots[materialSlot];
44
- const entry = validatedOrdered[materialSlotOwners[materialSlot] ?? -1];
44
+ const entry = materialSlotOwners[materialSlot];
45
45
  if (mat === undefined || entry === undefined) continue;
46
46
 
47
47
  // feat-20260625-refactor-sprite-as-transparent-mesh M3 / w13 (D-2):