@forgeax/engine-render 0.1.29 → 0.1.31

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 (350) hide show
  1. package/README.md +248 -21
  2. package/dist/assembly/atmosphere-shader-prewarm.d.ts +1 -1
  3. package/dist/assembly/atmosphere-shader-prewarm.d.ts.map +1 -1
  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 +6 -0
  7. package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
  8. package/dist/assembly/host-contract.d.ts +6 -0
  9. package/dist/assembly/host-contract.d.ts.map +1 -1
  10. package/dist/assembly/material/assembly.d.ts +26 -3
  11. package/dist/assembly/material/assembly.d.ts.map +1 -1
  12. package/dist/assembly/material/pipeline-helpers.d.ts +24 -0
  13. package/dist/assembly/material/pipeline-helpers.d.ts.map +1 -0
  14. package/dist/assembly/material-shader-policy.d.ts.map +1 -1
  15. package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -1
  16. package/dist/assembly/recovery/recovery-attempt.d.ts +1 -6
  17. package/dist/assembly/recovery/recovery-attempt.d.ts.map +1 -1
  18. package/dist/assembly/recovery/renderer-recover.d.ts +1 -0
  19. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  20. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  21. package/dist/assembly/shader-prewarm-policy.d.ts +1 -1
  22. package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -1
  23. package/dist/assembly/webgpu-ready.d.ts +1 -1
  24. package/dist/assembly/webgpu-ready.d.ts.map +1 -1
  25. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  26. package/dist/capture/scene-projection.d.ts +41 -0
  27. package/dist/capture/scene-projection.d.ts.map +1 -0
  28. package/dist/{chunk-BQVQOQJH.mjs → chunk-7MQ3XBSP.mjs} +20 -14
  29. package/dist/chunk-7MQ3XBSP.mjs.map +1 -0
  30. package/dist/{chunk-S4DNKQYQ.mjs → chunk-C3DDSXYK.mjs} +86 -33
  31. package/dist/chunk-C3DDSXYK.mjs.map +1 -0
  32. package/dist/{chunk-BTWH7BP4.mjs → chunk-FUUO4UND.mjs} +73 -29
  33. package/dist/chunk-FUUO4UND.mjs.map +1 -0
  34. package/dist/{chunk-NRNXBLIJ.mjs → chunk-JRBDO2KB.mjs} +46 -6
  35. package/dist/chunk-JRBDO2KB.mjs.map +1 -0
  36. package/dist/{chunk-NICXSHAT.mjs → chunk-MDQJPY3T.mjs} +8 -6
  37. package/dist/chunk-MDQJPY3T.mjs.map +1 -0
  38. package/dist/{chunk-JQTSEI3Z.mjs → chunk-NO4WZCAH.mjs} +3 -3
  39. package/dist/chunk-NO4WZCAH.mjs.map +1 -0
  40. package/dist/{chunk-FUODTTIA.mjs → chunk-PSEQ6QPH.mjs} +621 -108
  41. package/dist/chunk-PSEQ6QPH.mjs.map +1 -0
  42. package/dist/{chunk-33XZFTQU.mjs → chunk-S5UE2T5P.mjs} +48 -6
  43. package/dist/chunk-S5UE2T5P.mjs.map +1 -0
  44. package/dist/components/directional-light.d.ts +2 -2
  45. package/dist/components/dynamic-resolution.d.ts +15 -0
  46. package/dist/components/dynamic-resolution.d.ts.map +1 -0
  47. package/dist/components/index.d.ts +1 -0
  48. package/dist/components/index.d.ts.map +1 -1
  49. package/dist/components/light-helpers.d.ts.map +1 -1
  50. package/dist/components/reflection-probe.d.ts +1 -0
  51. package/dist/components/reflection-probe.d.ts.map +1 -1
  52. package/dist/components/skylight.d.ts +4 -1
  53. package/dist/components/skylight.d.ts.map +1 -1
  54. package/dist/construct-renderer.mjs +2172 -796
  55. package/dist/construct-renderer.mjs.map +1 -1
  56. package/dist/device/device-scope.d.ts +2 -0
  57. package/dist/device/device-scope.d.ts.map +1 -1
  58. package/dist/device/gpu-residency.d.ts +2 -2
  59. package/dist/device/gpu-residency.d.ts.map +1 -1
  60. package/dist/dynamic-geometry.d.ts.map +1 -1
  61. package/dist/environment/background.d.ts +3 -2
  62. package/dist/environment/background.d.ts.map +1 -1
  63. package/dist/environment/ibl.d.ts +11 -0
  64. package/dist/environment/ibl.d.ts.map +1 -0
  65. package/dist/environment/storage.d.ts +14 -0
  66. package/dist/environment/storage.d.ts.map +1 -0
  67. package/dist/errors/gpu-driven.d.ts +2 -2
  68. package/dist/errors/gpu-driven.d.ts.map +1 -1
  69. package/dist/errors/render.d.ts +35 -1
  70. package/dist/errors/render.d.ts.map +1 -1
  71. package/dist/extract/camera.d.ts.map +1 -1
  72. package/dist/extract/contracts.d.ts +7 -0
  73. package/dist/extract/contracts.d.ts.map +1 -1
  74. package/dist/extract/gpu-driven.d.ts +18 -1
  75. package/dist/extract/gpu-driven.d.ts.map +1 -1
  76. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  77. package/dist/gpu-driven/material-artifacts.d.ts +24 -0
  78. package/dist/gpu-driven/material-artifacts.d.ts.map +1 -0
  79. package/dist/gpu-driven/material-bindings.d.ts +7 -0
  80. package/dist/gpu-driven/material-bindings.d.ts.map +1 -0
  81. package/dist/gpu-driven/prepared-draw.d.ts +2 -0
  82. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  83. package/dist/gpu-driven/production-raster.d.ts +27 -6
  84. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  85. package/dist/gpu-resource.d.ts +5 -2
  86. package/dist/gpu-resource.d.ts.map +1 -1
  87. package/dist/gpu-scene-schema.d.ts.map +1 -1
  88. package/dist/gpu-scene.d.ts.map +1 -1
  89. package/dist/hdrp-buffers.d.ts +3 -0
  90. package/dist/hdrp-buffers.d.ts.map +1 -1
  91. package/dist/ibl/IblPipelineCache.d.ts +2 -0
  92. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  93. package/dist/ibl/skylight-bind-group.d.ts +3 -1
  94. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  95. package/dist/index.d.ts +83 -81
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.mjs +7 -5
  98. package/dist/index.mjs.map +1 -1
  99. package/dist/inspection-types.d.ts +16 -1
  100. package/dist/inspection-types.d.ts.map +1 -1
  101. package/dist/internal.mjs +6 -6
  102. package/dist/material-row.d.ts +10 -0
  103. package/dist/material-row.d.ts.map +1 -1
  104. package/dist/pbr-pipeline.d.ts +3 -1
  105. package/dist/pbr-pipeline.d.ts.map +1 -1
  106. package/dist/pipeline/render-extent.d.ts +51 -0
  107. package/dist/pipeline/render-extent.d.ts.map +1 -0
  108. package/dist/pipeline/standard-build-context.d.ts +7 -0
  109. package/dist/pipeline/standard-build-context.d.ts.map +1 -0
  110. package/dist/pipeline/standard-forward-lane.d.ts +3 -2
  111. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  112. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  113. package/dist/pipeline/standard-post.d.ts +1 -1
  114. package/dist/pipeline/standard-post.d.ts.map +1 -1
  115. package/dist/pipeline/standard-profile.d.ts +2 -1
  116. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  117. package/dist/pipeline-builder.d.ts +3 -1
  118. package/dist/pipeline-builder.d.ts.map +1 -1
  119. package/dist/plugin.d.ts.map +1 -1
  120. package/dist/post-process-errors.d.ts +9 -2
  121. package/dist/post-process-errors.d.ts.map +1 -1
  122. package/dist/prepare/extended-lighting/resources.d.ts +3 -3
  123. package/dist/record/frame-lighting.d.ts.map +1 -1
  124. package/dist/record/frame-snapshot.d.ts +3 -8
  125. package/dist/record/frame-snapshot.d.ts.map +1 -1
  126. package/dist/record/frame.d.ts +3 -2
  127. package/dist/record/frame.d.ts.map +1 -1
  128. package/dist/record/main-pass-geometry.d.ts +7 -2
  129. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  130. package/dist/record/main-pass-material.d.ts +6 -3
  131. package/dist/record/main-pass-material.d.ts.map +1 -1
  132. package/dist/record/main-pass.d.ts +2 -0
  133. package/dist/record/main-pass.d.ts.map +1 -1
  134. package/dist/record/prepared-material-bindings.d.ts.map +1 -1
  135. package/dist/record/recovery-pipeline.d.ts +9 -1
  136. package/dist/record/recovery-pipeline.d.ts.map +1 -1
  137. package/dist/record/render-context.d.ts +34 -3
  138. package/dist/record/render-context.d.ts.map +1 -1
  139. package/dist/record/shadow-pass.d.ts +2 -2
  140. package/dist/record/shadow-pass.d.ts.map +1 -1
  141. package/dist/record/typed-frame-graph.d.ts +5 -2
  142. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  143. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  144. package/dist/reflection/background.d.ts +14 -0
  145. package/dist/reflection/background.d.ts.map +1 -0
  146. package/dist/reflection/filter.d.ts.map +1 -1
  147. package/dist/reflection/projection.d.ts +1 -0
  148. package/dist/reflection/projection.d.ts.map +1 -1
  149. package/dist/reflection/record-owner.d.ts +4 -2
  150. package/dist/reflection/record-owner.d.ts.map +1 -1
  151. package/dist/render-contract.d.ts +47 -32
  152. package/dist/render-contract.d.ts.map +1 -1
  153. package/dist/render-graph-primitives.d.ts.map +1 -1
  154. package/dist/render-pipeline.d.ts +17 -1
  155. package/dist/render-pipeline.d.ts.map +1 -1
  156. package/dist/render-system-extract-tail.d.ts +9 -2
  157. package/dist/render-system-extract-tail.d.ts.map +1 -1
  158. package/dist/render-system-extract.d.ts +29 -2
  159. package/dist/render-system-extract.d.ts.map +1 -1
  160. package/dist/render-system.d.ts.map +1 -1
  161. package/dist/scene/render-scene.d.ts +2 -0
  162. package/dist/scene/render-scene.d.ts.map +1 -1
  163. package/dist/ssao-config.d.ts +8 -6
  164. package/dist/ssao-config.d.ts.map +1 -1
  165. package/dist/ssr/graph.d.ts.map +1 -1
  166. package/dist/temporal/gpu.d.ts.map +1 -1
  167. package/dist/temporal/index.mjs +5 -5
  168. package/dist/temporal/standard-scene-data.d.ts +2 -1
  169. package/dist/temporal/standard-scene-data.d.ts.map +1 -1
  170. package/dist/temporal/target-coverage-attachment.d.ts +15 -0
  171. package/dist/temporal/target-coverage-attachment.d.ts.map +1 -0
  172. package/dist/temporal/temporal-view.d.ts +6 -2
  173. package/dist/temporal/temporal-view.d.ts.map +1 -1
  174. package/dist/temporal/view.d.ts +6 -0
  175. package/dist/temporal/view.d.ts.map +1 -1
  176. package/dist/typed-render-graph-primitives.d.ts +6 -0
  177. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  178. package/dist/volume/component.d.ts +1 -0
  179. package/dist/volume/component.d.ts.map +1 -1
  180. package/package.json +21 -21
  181. package/src/__tests__/capture-scene-projection.unit.test.ts +24 -0
  182. package/src/__tests__/device-feature-admission.unit.test.ts +15 -24
  183. package/src/__tests__/device-loss-fanout.unit.test.ts +43 -0
  184. package/src/__tests__/dynamic-geometry-batch.unit.test.ts +157 -0
  185. package/src/__tests__/dynamic-geometry.unit.test.ts +36 -0
  186. package/src/__tests__/dynamic-resolution-plugin.integration.test.ts +81 -0
  187. package/src/__tests__/factory-contract.integration.test.ts +164 -1
  188. package/src/__tests__/frame-observation.contract.test.ts +21 -0
  189. package/src/__tests__/gpu-driven-baseline.characterization.test.ts +1 -1
  190. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +20 -1
  191. package/src/__tests__/gpu-driven-lod-cache.unit.test.ts +0 -3
  192. package/src/__tests__/gpu-driven-mesh-world-identity.unit.test.ts +0 -3
  193. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +11 -6
  194. package/src/__tests__/gpu-driven-production.integration.test.ts +13 -25
  195. package/src/__tests__/gpu-driven-view.unit.test.ts +1 -0
  196. package/src/__tests__/gpu-pass-timing-browser-runner.ts +15 -0
  197. package/src/__tests__/gpu-pass-timing.browser.test.ts +14 -1
  198. package/src/__tests__/gpu-resource-scope.unit.test.ts +71 -0
  199. package/src/__tests__/gpu-scene.unit.test.ts +55 -1
  200. package/src/__tests__/materials-standard-contract.unit.test.ts +5 -1
  201. package/src/__tests__/mesh-submission-lifetime.unit.test.ts +8 -0
  202. package/src/__tests__/morph-neutral-admission.unit.test.ts +19 -0
  203. package/src/__tests__/physical-clearcoat.integration.test.ts +6 -1
  204. package/src/__tests__/post-process-error-policy-owner.unit.test.ts +6 -5
  205. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +216 -5
  206. package/src/__tests__/reflection-fallback-async-publication.unit.test.ts +68 -1
  207. package/src/__tests__/reflection-probe-authoring.unit.test.ts +12 -10
  208. package/src/__tests__/reflection-probe-box.dawn.test.ts +71 -0
  209. package/src/__tests__/reflection-probe-filter.unit.test.ts +9 -0
  210. package/src/__tests__/reflection-probe-orientation.dawn.test.ts +294 -0
  211. package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +5 -15
  212. package/src/__tests__/reflection-probe-updates.unit.test.ts +129 -0
  213. package/src/__tests__/render-error-code-owner.test-d.ts +3 -0
  214. package/src/__tests__/render-error-detail-ssot.test-d.ts +5 -1
  215. package/src/__tests__/render-extent.unit.test.ts +63 -0
  216. package/src/__tests__/render-scene-projection.unit.test.ts +3 -2
  217. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +173 -9
  218. package/src/__tests__/shader-manifest-fixture.ts +6 -0
  219. package/src/__tests__/skinned-shadow-caster.test.ts +8 -1
  220. package/src/__tests__/specular-environment-scale.dawn.test.ts +4 -2
  221. package/src/__tests__/ssao-config.unit.test.ts +7 -0
  222. package/src/__tests__/ssao-surface.dawn.test.ts +252 -0
  223. package/src/__tests__/ssr-cube-silhouette.dawn.test.ts +270 -0
  224. package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +51 -43
  225. package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +4 -0
  226. package/src/__tests__/ssr-gpu-dispatch.ts +10 -5
  227. package/src/__tests__/ssr-graph-topology.unit.test.ts +2 -2
  228. package/src/__tests__/ssr-hiz.browser.test.ts +1 -1
  229. package/src/__tests__/ssr-hiz.dawn.test.ts +1 -1
  230. package/src/__tests__/ssr-spatial.integration.test.ts +1 -1
  231. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +40 -0
  232. package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +238 -1
  233. package/src/__tests__/standard-profile-oracle.unit.test.ts +27 -0
  234. package/src/__tests__/taa-coverage-edge.dawn.test.ts +6 -0
  235. package/src/__tests__/taa-neighborhood-equivalence.dawn.test.ts +5 -1
  236. package/src/__tests__/taa-stability-feedback.ts +1 -0
  237. package/src/__tests__/temporal-reset-matrix.unit.test.ts +2 -2
  238. package/src/__tests__/temporal-view.unit.test.ts +17 -0
  239. package/src/__tests__/transmission-prewarm.unit.test.ts +57 -0
  240. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +62 -13
  241. package/src/__tests__/volumetric-fog-topology.unit.test.ts +7 -7
  242. package/src/assembly/atmosphere-shader-prewarm.ts +3 -2
  243. package/src/assembly/device-feature-admission.ts +9 -4
  244. package/src/assembly/dynamic-geometry-host.ts +236 -163
  245. package/src/assembly/host-contract.ts +9 -0
  246. package/src/assembly/material/assembly.ts +350 -6
  247. package/src/assembly/material/pipeline-helpers.ts +100 -0
  248. package/src/assembly/material-shader-policy.ts +39 -18
  249. package/src/assembly/recovery/device-loss-fanout.ts +5 -0
  250. package/src/assembly/recovery/recovery-attempt.ts +2 -29
  251. package/src/assembly/recovery/renderer-recover.ts +6 -9
  252. package/src/assembly/renderer-facade.ts +22 -1
  253. package/src/assembly/shader-prewarm-policy.ts +14 -1
  254. package/src/assembly/webgpu-ready.ts +28 -19
  255. package/src/assembly/webgpu-renderer.ts +95 -95
  256. package/src/capture/scene-projection.ts +37 -0
  257. package/src/components/__tests__/dynamic-resolution-schema.unit.test.ts +65 -0
  258. package/src/components/__tests__/light-radius.integration.test.ts +59 -0
  259. package/src/components/directional-light.ts +3 -3
  260. package/src/components/dynamic-resolution.ts +67 -0
  261. package/src/components/index.ts +1 -0
  262. package/src/components/light-helpers.ts +6 -1
  263. package/src/components/reflection-probe.ts +1 -0
  264. package/src/components/skylight.ts +4 -1
  265. package/src/device/device-scope.ts +13 -7
  266. package/src/device/gpu-residency.ts +11 -11
  267. package/src/dynamic-geometry.ts +13 -8
  268. package/src/environment/background.ts +30 -12
  269. package/src/environment/ibl.ts +211 -0
  270. package/src/environment/storage.ts +63 -0
  271. package/src/errors/gpu-driven.ts +10 -3
  272. package/src/errors/render.ts +64 -0
  273. package/src/extract/camera.ts +12 -1
  274. package/src/extract/contracts.ts +10 -0
  275. package/src/extract/gpu-driven.ts +72 -17
  276. package/src/gpu-driven/batch-topology.ts +33 -11
  277. package/src/gpu-driven/material-artifacts.ts +179 -0
  278. package/src/gpu-driven/material-bindings.ts +41 -0
  279. package/src/gpu-driven/prepared-draw.ts +13 -2
  280. package/src/gpu-driven/production-raster.ts +681 -164
  281. package/src/gpu-resource.ts +21 -2
  282. package/src/gpu-scene-schema.ts +11 -2
  283. package/src/gpu-scene.ts +14 -3
  284. package/src/hdrp-buffers.ts +69 -0
  285. package/src/ibl/IblPipelineCache.ts +5 -0
  286. package/src/ibl/skylight-bind-group.ts +27 -17
  287. package/src/index.ts +92 -81
  288. package/src/inspection-types.ts +16 -1
  289. package/src/material-row.ts +60 -11
  290. package/src/pbr-pipeline.ts +13 -2
  291. package/src/pipeline/render-extent.ts +111 -0
  292. package/src/pipeline/standard-build-context.ts +7 -0
  293. package/src/pipeline/standard-forward-lane.ts +41 -24
  294. package/src/pipeline/standard-pipeline.ts +47 -18
  295. package/src/pipeline/standard-post.ts +4 -0
  296. package/src/pipeline/standard-profile.ts +2 -1
  297. package/src/pipeline-builder.ts +12 -3
  298. package/src/plugin.ts +4 -0
  299. package/src/post-process-errors.ts +26 -18
  300. package/src/prepare/__tests__/extended-lighting-capability.unit.test.ts +2 -2
  301. package/src/prepare/extended-lighting/resources.ts +3 -3
  302. package/src/record/__tests__/main-pass-geometry.unit.test.ts +68 -0
  303. package/src/record/__tests__/material-bg-cache.unit.test.ts +45 -0
  304. package/src/record/__tests__/material-slot-plan.unit.test.ts +9 -0
  305. package/src/record/__tests__/recovery-pipeline.unit.test.ts +47 -1
  306. package/src/record/__tests__/sprite-material-abi.unit.test.ts +7 -3
  307. package/src/record/__tests__/temporal-payload.unit.test.ts +2 -0
  308. package/src/record/frame-lighting.ts +3 -1
  309. package/src/record/frame-snapshot.ts +13 -11
  310. package/src/record/frame.ts +150 -74
  311. package/src/record/main-pass-geometry.ts +60 -9
  312. package/src/record/main-pass-material.ts +47 -19
  313. package/src/record/main-pass.ts +63 -4
  314. package/src/record/prepared-material-bindings.ts +4 -0
  315. package/src/record/recovery-pipeline.ts +56 -0
  316. package/src/record/render-context.ts +34 -3
  317. package/src/record/shadow-pass.ts +187 -50
  318. package/src/record/typed-frame-graph.ts +60 -3
  319. package/src/record/view-ubo.ts +1 -1
  320. package/src/recovery/render-system-candidate.ts +54 -11
  321. package/src/reflection/background.ts +151 -0
  322. package/src/reflection/filter.ts +3 -0
  323. package/src/reflection/projection.ts +16 -6
  324. package/src/reflection/record-owner.ts +282 -86
  325. package/src/render-contract.ts +50 -32
  326. package/src/render-graph-primitives.ts +28 -3
  327. package/src/render-pipeline.ts +20 -1
  328. package/src/render-system-extract-tail.ts +23 -3
  329. package/src/render-system-extract.ts +127 -42
  330. package/src/render-system.ts +35 -7
  331. package/src/scene/render-scene.ts +8 -0
  332. package/src/ssao-config.ts +25 -8
  333. package/src/ssr/graph.ts +78 -58
  334. package/src/temporal/gpu.ts +5 -0
  335. package/src/temporal/standard-scene-data.ts +7 -1
  336. package/src/temporal/target-coverage-attachment.ts +72 -0
  337. package/src/temporal/temporal-view.ts +10 -4
  338. package/src/temporal/view.ts +12 -2
  339. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +24 -9
  340. package/src/typed-render-graph-primitives.ts +38 -0
  341. package/src/volume/component.ts +1 -0
  342. package/src/volume/passes.ts +3 -3
  343. package/dist/chunk-33XZFTQU.mjs.map +0 -1
  344. package/dist/chunk-BQVQOQJH.mjs.map +0 -1
  345. package/dist/chunk-BTWH7BP4.mjs.map +0 -1
  346. package/dist/chunk-FUODTTIA.mjs.map +0 -1
  347. package/dist/chunk-JQTSEI3Z.mjs.map +0 -1
  348. package/dist/chunk-NICXSHAT.mjs.map +0 -1
  349. package/dist/chunk-NRNXBLIJ.mjs.map +0 -1
  350. package/dist/chunk-S4DNKQYQ.mjs.map +0 -1
@@ -1,3 +1,4 @@
1
+ import { transmissionBackdropAvailable } from '../assembly/device-feature-admission';
1
2
  import { getOrCreateIblCache } from '../ibl/IblPipelineCache';
2
3
  import type { _InternalRenderPipelineContext } from './render-context';
3
4
  // @forgeax/engine-runtime - RenderSystem record stage: main-pass-material.
@@ -947,7 +948,7 @@ export interface PerSubmeshMaterialBgDeps {
947
948
  readonly resolveReflectionProbeResources?: (
948
949
  materialWorld: World,
949
950
  entityKey: number,
950
- ) => SkylightBindGroupResources | undefined;
951
+ ) => { readonly resources: SkylightBindGroupResources; readonly probeIndex: number } | undefined;
951
952
  readonly materialBgShared: Map<string, WeakMap<object, unknown>>;
952
953
  /** Cross-frame final BG reuse keyed by the stable source material handle. */
953
954
  readonly materialBgAssemblyCache: Map<string, MaterialBgAssemblyCacheEntry>;
@@ -1007,6 +1008,7 @@ export function isMaterialBgAssemblyCacheHit(
1007
1008
  skylightResources: SkylightBindGroupResources,
1008
1009
  materialResourceEpoch: number,
1009
1010
  transmissionBackdropView?: TextureView | null,
1011
+ sceneMaterialBuffer?: Buffer,
1010
1012
  ): cached is MaterialBgAssemblyCacheEntry {
1011
1013
  if (transmissionBackdropView != null) return false;
1012
1014
  return (
@@ -1014,9 +1016,11 @@ export function isMaterialBgAssemblyCacheHit(
1014
1016
  cached.materialResourceEpoch === materialResourceEpoch &&
1015
1017
  cached.materialBgl === materialBgl &&
1016
1018
  cached.materialBuffer === materialBuffer &&
1019
+ cached.sceneMaterialBuffer === sceneMaterialBuffer &&
1017
1020
  cached.skylightResources.irradianceView === skylightResources.irradianceView &&
1018
1021
  cached.skylightResources.irradianceSampler === skylightResources.irradianceSampler &&
1019
1022
  cached.skylightResources.prefilterView === skylightResources.prefilterView &&
1023
+ cached.skylightResources.skylightPrefilterView === skylightResources.skylightPrefilterView &&
1020
1024
  cached.skylightResources.prefilterSampler === skylightResources.prefilterSampler &&
1021
1025
  cached.skylightResources.brdfLutView === skylightResources.brdfLutView &&
1022
1026
  cached.skylightResources.brdfLutSampler === skylightResources.brdfLutSampler &&
@@ -1046,13 +1050,13 @@ export function buildPerSubmeshMaterialBg(
1046
1050
  bindGroupCounts,
1047
1051
  frameState,
1048
1052
  } = deps;
1049
- const effectiveSkylightResources =
1050
- resolveReflectionProbeResources?.(materialWorld, entityKey) ?? skylightResources;
1053
+ const selectedProbe = resolveReflectionProbeResources?.(materialWorld, entityKey);
1054
+ const effectiveSkylightResources = selectedProbe?.resources ?? skylightResources;
1051
1055
  const smMaterialHandle = submeshMaterial.materialHandle;
1052
1056
  const materialCacheKey =
1053
1057
  smMaterialHandle === undefined
1054
1058
  ? undefined
1055
- : `${materialWorld.identity}:${smMaterialHandle}:${materialShaderId ?? ''}`;
1059
+ : `${materialWorld.identity}:${smMaterialHandle}:${materialShaderId ?? ''}:${selectedProbe?.probeIndex ?? 'sky'}`;
1056
1060
  const smHasVideoFields = (submeshMaterial.videoTextureFields?.size ?? 0) > 0;
1057
1061
  const smShaderId = materialShaderId;
1058
1062
  // The cooked shader schema owns the resource ABI. A material snapshot may
@@ -1079,6 +1083,9 @@ export function buildPerSubmeshMaterialBg(
1079
1083
  ? BUILTIN_USER_REGION_TEXTURE_FIELDS
1080
1084
  : userRegionTextureFieldOrder(smSchema).filter((field) => !physicalFields.includes(field));
1081
1085
  const hasActiveTransmissionBackdrop = transmissionBackdropView != null;
1086
+ const sceneMaterialBuffer = runtime.device.caps.storageBuffer
1087
+ ? (deps.sceneMaterialBuffer ?? pipelineState.meshStorageBuffer.buffer)
1088
+ : undefined;
1082
1089
  const diagnosticsEnabled = materialDiagnosticsEnabled();
1083
1090
  if (smMaterialHandle !== undefined && !smHasVideoFields && !hasActiveTransmissionBackdrop) {
1084
1091
  const cached =
@@ -1092,8 +1099,8 @@ export function buildPerSubmeshMaterialBg(
1092
1099
  effectiveSkylightResources,
1093
1100
  store.materialResourceEpoch,
1094
1101
  transmissionBackdropView,
1095
- ) &&
1096
- deps.sceneMaterialBuffer === undefined
1102
+ sceneMaterialBuffer,
1103
+ )
1097
1104
  ) {
1098
1105
  if (diagnosticsEnabled) {
1099
1106
  recordIblMaterialBinding(
@@ -1103,31 +1110,34 @@ export function buildPerSubmeshMaterialBg(
1103
1110
  [
1104
1111
  {
1105
1112
  binding: 1 + smUserRegionFields.length * 2,
1106
- resource: { kind: 'textureView', value: skylightResources.irradianceView },
1113
+ resource: { kind: 'textureView', value: effectiveSkylightResources.irradianceView },
1107
1114
  },
1108
1115
  {
1109
1116
  binding: 2 + smUserRegionFields.length * 2,
1110
- resource: { kind: 'sampler', value: skylightResources.irradianceSampler },
1117
+ resource: { kind: 'sampler', value: effectiveSkylightResources.irradianceSampler },
1111
1118
  },
1112
1119
  {
1113
1120
  binding: 3 + smUserRegionFields.length * 2,
1114
- resource: { kind: 'textureView', value: skylightResources.prefilterView },
1121
+ resource: { kind: 'textureView', value: effectiveSkylightResources.prefilterView },
1115
1122
  },
1116
1123
  {
1117
1124
  binding: 4 + smUserRegionFields.length * 2,
1118
- resource: { kind: 'sampler', value: skylightResources.prefilterSampler },
1125
+ resource: { kind: 'sampler', value: effectiveSkylightResources.prefilterSampler },
1119
1126
  },
1120
1127
  {
1121
1128
  binding: 5 + smUserRegionFields.length * 2,
1122
- resource: { kind: 'textureView', value: skylightResources.brdfLutView },
1129
+ resource: { kind: 'textureView', value: effectiveSkylightResources.brdfLutView },
1123
1130
  },
1124
1131
  {
1125
1132
  binding: 6 + smUserRegionFields.length * 2,
1126
- resource: { kind: 'sampler', value: skylightResources.brdfLutSampler },
1133
+ resource: { kind: 'sampler', value: effectiveSkylightResources.brdfLutSampler },
1127
1134
  },
1128
1135
  {
1129
1136
  binding: 7 + smUserRegionFields.length * 2,
1130
- resource: { kind: 'buffer', value: { buffer: skylightResources.intensityBuffer } },
1137
+ resource: {
1138
+ kind: 'buffer',
1139
+ value: { buffer: effectiveSkylightResources.intensityBuffer },
1140
+ },
1131
1141
  },
1132
1142
  ],
1133
1143
  1 + smUserRegionFields.length * 2,
@@ -1264,10 +1274,14 @@ export function buildPerSubmeshMaterialBg(
1264
1274
  const smMergedEntries = assembleMaterialWithSkylightEntries(
1265
1275
  smBaseEntries,
1266
1276
  effectiveSkylightResources,
1267
- {
1268
- sampler: transmissionSampler,
1269
- ...(transmissionBackdropView === undefined ? {} : { backdropView: transmissionBackdropView }),
1270
- } satisfies TransmissionBindGroupResources,
1277
+ transmissionBackdropAvailable(runtime.device.limits.maxSampledTexturesPerShaderStage)
1278
+ ? ({
1279
+ sampler: transmissionSampler,
1280
+ ...(transmissionBackdropView === undefined
1281
+ ? {}
1282
+ : { backdropView: transmissionBackdropView }),
1283
+ } satisfies TransmissionBindGroupResources)
1284
+ : null,
1271
1285
  physicalTextureInjections,
1272
1286
  );
1273
1287
  // Storage-capable devices share one Standard material BGL with the
@@ -1354,7 +1368,6 @@ export function buildPerSubmeshMaterialBg(
1354
1368
  smMaterialHandle !== undefined &&
1355
1369
  !smHasVideoFields &&
1356
1370
  materialResourcesResident &&
1357
- deps.sceneMaterialBuffer === undefined &&
1358
1371
  !hasActiveTransmissionBackdrop
1359
1372
  ) {
1360
1373
  if (materialCacheKey !== undefined) {
@@ -1363,6 +1376,7 @@ export function buildPerSubmeshMaterialBg(
1363
1376
  materialResourceEpoch: store.materialResourceEpoch,
1364
1377
  materialBgl: smMaterialBgl,
1365
1378
  materialBuffer: pipelineState.materialUniformBuffer.buffer,
1379
+ ...(sceneMaterialBuffer === undefined ? {} : { sceneMaterialBuffer }),
1366
1380
  skylightResources: effectiveSkylightResources,
1367
1381
  bindGroup: smBindGroup,
1368
1382
  });
@@ -1387,6 +1401,7 @@ export function resolveMaterialSkylight(
1387
1401
  pipelineState: Pick<PipelineState, 'skylightFallback'>,
1388
1402
  skylight: SkylightSnapshot | undefined,
1389
1403
  skylightCount: number,
1404
+ environmentIbl?: _InternalRenderPipelineContext['environmentIbl'],
1390
1405
  ) {
1391
1406
  const skylightFallback = pipelineState.skylightFallback;
1392
1407
  if (skylightFallback === null) {
@@ -1440,6 +1455,13 @@ export function resolveMaterialSkylight(
1440
1455
  };
1441
1456
  }
1442
1457
  }
1458
+ if (environmentIbl !== undefined && skylight !== undefined && skylight.equirectHandle === 0) {
1459
+ activeViews = {
1460
+ irr: environmentIbl.irradiance,
1461
+ pref: environmentIbl.prefilter,
1462
+ brdf: activeViews?.brdf ?? skylightFallback.brdfLutView,
1463
+ };
1464
+ }
1443
1465
  const skylightResources =
1444
1466
  activeViews !== undefined
1445
1467
  ? {
@@ -1465,5 +1487,11 @@ export function resolveMaterialSkylight(
1465
1487
 
1466
1488
  /** The same scene resources back material bindings in depth and color passes. */
1467
1489
  export function prepareMaterialSkylight(c: _InternalRenderPipelineContext) {
1468
- return resolveMaterialSkylight(c.runtime, c.pipelineState, c.skylight, c.skylightCount);
1490
+ return resolveMaterialSkylight(
1491
+ c.runtime,
1492
+ c.pipelineState,
1493
+ c.skylight,
1494
+ c.skylightCount,
1495
+ c.environmentIbl,
1496
+ );
1469
1497
  }
@@ -8,7 +8,11 @@ import {
8
8
  type TextureView,
9
9
  } from '@forgeax/engine-rhi';
10
10
  import type { PassKind, PassSelector } from '@forgeax/engine-types';
11
- import { createHdrpUnifiedBindGroup, getOrCreateHdrpBuffers } from '../hdrp-buffers';
11
+ import {
12
+ createGpuDrivenLightingBindGroup,
13
+ createHdrpUnifiedBindGroup,
14
+ getOrCreateHdrpBuffers,
15
+ } from '../hdrp-buffers';
12
16
  import { getOrCreateIblCache } from '../ibl/IblPipelineCache';
13
17
  import type { SkylightBindGroupResources } from '../ibl/skylight-bind-group';
14
18
  import { buildBeginRenderPassDescriptor, standardTopologyBindGroupReady } from '../pipeline-spec';
@@ -67,6 +71,8 @@ export type MainPassOptions = {
67
71
  /** Require the same material to contribute to another graph lane. */
68
72
  readonly includeSelector?: PassSelector;
69
73
  readonly transmissionBackdropView?: TextureView | null;
74
+ /** Select the material temporal entry's binary coverage output. */
75
+ readonly coverageOnly?: boolean;
70
76
  readonly gpuDriven?: {
71
77
  readonly projection: RenderPipelineGpuDrivenProjection;
72
78
  readonly resources: GraphResourceResolver;
@@ -469,6 +475,13 @@ export function recordMainPass(
469
475
  // which cannot render a PBR decal). Captures only frame-stable closure
470
476
  // state; the caller passes the per-submesh material snapshot + entityKey
471
477
  // (for video texture routing) and sets the dynamic UBO offset itself.
478
+ // Selection keys use the extracted frame index, never World.identity.
479
+ const hasProbeBindings = (c.reflectionProbes?.table.rows.length ?? 0) > 0;
480
+ const worldIndices = hasProbeBindings
481
+ ? new Map(
482
+ validatedOrdered.map((entry) => [entry.world ?? world, entry.source.worldId] as const),
483
+ )
484
+ : undefined;
472
485
  const perSubmeshMaterialBgDeps: PerSubmeshMaterialBgDeps = {
473
486
  runtime,
474
487
  pipelineState,
@@ -480,8 +493,10 @@ export function recordMainPass(
480
493
  resolveRenderTargetTextureSource: runtime.resolveRenderTargetTextureSource,
481
494
  resolveReflectionProbeResources: (materialWorld, entityKey) => {
482
495
  const reflectionProbes = c.reflectionProbes;
483
- if (reflectionProbes === undefined) return undefined;
484
- const selection = reflectionProbes.selections.get(`${materialWorld.identity}:${entityKey}`);
496
+ if (reflectionProbes === undefined || !hasProbeBindings) return undefined;
497
+ const selection = reflectionProbes.selections.get(
498
+ `${worldIndices?.get(materialWorld)}:${entityKey}`,
499
+ );
485
500
  if (selection === undefined) return undefined;
486
501
  const binding = resolveReflectionProbeBinding(selection, reflectionProbes.table);
487
502
  if (binding.useSkylight || binding.probeIndex === undefined) return undefined;
@@ -499,12 +514,13 @@ export function recordMainPass(
499
514
  irradianceView: skylightResources.irradianceView,
500
515
  irradianceSampler: skylightResources.irradianceSampler,
501
516
  prefilterView: row.filteredView,
517
+ skylightPrefilterView: skylightResources.prefilterView,
502
518
  prefilterSampler: row.sampler,
503
519
  brdfLutView: skylightResources.brdfLutView,
504
520
  brdfLutSampler: skylightResources.brdfLutSampler,
505
521
  intensityBuffer: row.uniformBuffer,
506
522
  };
507
- return probeResources;
523
+ return { resources: probeResources, probeIndex: row.index };
508
524
  },
509
525
  materialBgShared: frameState.materialBgShared,
510
526
  materialBgAssemblyCache: c.materialBgAssemblyCache,
@@ -551,12 +567,53 @@ export function recordMainPass(
551
567
  );
552
568
  }
553
569
  if (gpuDrivenStandardPbrFrameResources !== undefined) {
570
+ gpuDrivenStandardPbrFrameResources.resolveClusteredMeshBindGroup = (binding) => {
571
+ const buffers = getOrCreateHdrpBuffers(
572
+ runtime,
573
+ frameState.installedPipelineConfig?.clusterGrid,
574
+ );
575
+ const layout =
576
+ binding.paletteBuffer === undefined
577
+ ? pipelineState.hdrpMeshBindGroupLayout
578
+ : pipelineState.hdrpSkinMeshBindGroupLayout;
579
+ const group =
580
+ buffers === null || layout == null
581
+ ? null
582
+ : createGpuDrivenLightingBindGroup(
583
+ runtime,
584
+ buffers,
585
+ layout,
586
+ binding,
587
+ c.hdrpSsaoBlurredView,
588
+ );
589
+ if (group === null)
590
+ throw new RhiError({
591
+ code: 'rhi-not-available',
592
+ expected: 'scene-index clustered lighting binding',
593
+ hint: 'publish scene rows and the current lighting/AO resources before indirect drawing',
594
+ });
595
+ return group;
596
+ };
554
597
  gpuDrivenStandardPbrFrameResources.materialBindGroups.length = 0;
555
598
  gpuDrivenStandardPbrFrameResources.materialBindGroups.push(...preparedMaterialBindGroups);
599
+ gpuDrivenStandardPbrFrameResources.colorFormats = colorFormats;
600
+ const selectedMaterialSlots = new Set<number>();
601
+ if (matchedMaterials === null)
602
+ delete gpuDrivenStandardPbrFrameResources.selectedMaterialSlots;
603
+ else gpuDrivenStandardPbrFrameResources.selectedMaterialSlots = selectedMaterialSlots;
556
604
  gpuDrivenStandardPbrFrameResources.materialSlotIndicesByEntity.clear();
557
605
  for (let index = 0; index < validatedOrdered.length; index += 1) {
558
606
  const entry = validatedOrdered[index];
559
607
  if (entry === undefined) continue;
608
+ const selected = matchedMaterials?.get(entry.renderableIndex);
609
+ const materials =
610
+ entry.source.materials.length > 0 ? entry.source.materials : [entry.source.material];
611
+ for (let slot = 0; slot < materials.length; slot += 1) {
612
+ const handle = materials[slot]?.materialHandle ?? -1;
613
+ const globalSlot = materialSlotIndices[index]?.[slot];
614
+ if (globalSlot !== undefined && selected?.has(handle))
615
+ selectedMaterialSlots.add(globalSlot);
616
+ }
560
617
  gpuDrivenStandardPbrFrameResources.materialSlotIndicesByEntity.set(
561
618
  worldEntityKey(entry.source.worldId, entry.source.entityKey),
562
619
  materialSlotIndices[index] ?? [],
@@ -570,6 +627,7 @@ export function recordMainPass(
570
627
  materialWorld: World = world,
571
628
  materialShaderId: string | undefined = material.materialShaderId,
572
629
  ): BindGroup =>
630
+ !hasProbeBindings &&
573
631
  materialShaderId === material.materialShaderId &&
574
632
  materialShaderId !== POINTS_LINES_MATERIAL_SHADER_ID
575
633
  ? (preparedMaterialBindGroups[materialSlot] ??
@@ -597,6 +655,7 @@ export function recordMainPass(
597
655
  passKind,
598
656
  selectedDispatch,
599
657
  colorFormats,
658
+ options?.coverageOnly ?? false,
600
659
  );
601
660
  };
602
661
  if (c.profilePhase === undefined) {
@@ -10,6 +10,7 @@ import {
10
10
  materialValuesToLinearRuntime,
11
11
  type SamplerAsset,
12
12
  } from '@forgeax/engine-types';
13
+ import { transmissionBackdropAvailable } from '../assembly/device-feature-admission';
13
14
  import { GPU_BUFFER_USAGE_COPY_DST, GPU_BUFFER_USAGE_UNIFORM } from '../gpu-usage';
14
15
  import type { SkylightBindGroupResources } from '../ibl/skylight-bind-group';
15
16
  import { assembleMaterialWithSkylightEntries } from '../ibl/skylight-bind-group';
@@ -205,6 +206,9 @@ export function preparedMaterialBindings(
205
206
  brdfLutSampler: fallback.sampler,
206
207
  intensityBuffer: fallback.intensityBuffer,
207
208
  },
209
+ transmissionBackdropAvailable(runtime.device.limits.maxSampledTexturesPerShaderStage)
210
+ ? undefined
211
+ : null,
208
212
  );
209
213
  // Per-shader PBR layouts reserve the scene-material SSBO at binding 46 on
210
214
  // storage-capable devices. Prepared feature materials use this same layout,
@@ -31,6 +31,7 @@ import { geometryRenderStateForTopology } from './main-pass-material';
31
31
  import type {
32
32
  MaterialShaderPipelineEntry,
33
33
  PipelineState,
34
+ RecoveryColdWorkGuard,
34
35
  RenderSystemInternals,
35
36
  } from './render-context';
36
37
 
@@ -38,6 +39,60 @@ export interface RecoveryPipelineReadiness {
38
39
  readonly pipelineSpecs: readonly PipelineSpec[];
39
40
  /** Re-resolve every candidate request and assert a stable cache hit. */
40
41
  readonly assertPreparedCache: () => void;
42
+ readonly assertFirstRecoveryFrame: () => void;
43
+ }
44
+
45
+ /**
46
+ * Create the one-shot assertion used by the first frame after publication.
47
+ * Recording a miss is a failure at the owner seam; the draw path never gets a
48
+ * chance to submit a frame that hides a shader/pipeline or static-residency
49
+ * cold build behind an apparently successful receipt.
50
+ */
51
+ export function createRecoveryColdWorkGuard(): RecoveryColdWorkGuard {
52
+ let armed = false;
53
+ let recording = false;
54
+ let finished = false;
55
+ let pipelineColdWork = 0;
56
+ let uploadColdWork = 0;
57
+ const fail = (kind: 'pipeline' | 'upload'): never => {
58
+ if (kind === 'pipeline') pipelineColdWork += 1;
59
+ else uploadColdWork += 1;
60
+ throw new Error(
61
+ `recovery first frame performed cold ${kind} work ` +
62
+ `(pipeline=${pipelineColdWork}, upload=${uploadColdWork})`,
63
+ );
64
+ };
65
+ return {
66
+ arm(): void {
67
+ armed = true;
68
+ finished = false;
69
+ pipelineColdWork = 0;
70
+ uploadColdWork = 0;
71
+ },
72
+ beginFrame(): void {
73
+ recording = true;
74
+ },
75
+ endFrame(): void {
76
+ recording = false;
77
+ },
78
+ notePipelineColdWork(): void {
79
+ if (armed && recording && !finished) fail('pipeline');
80
+ },
81
+ noteUploadColdWork(): void {
82
+ if (armed && recording && !finished) fail('upload');
83
+ },
84
+ finish(): void {
85
+ if (!armed || finished) return;
86
+ finished = true;
87
+ armed = false;
88
+ if (pipelineColdWork !== 0 || uploadColdWork !== 0) {
89
+ throw new Error(
90
+ `recovery first frame cold-work assertion failed ` +
91
+ `(pipeline=${pipelineColdWork}, upload=${uploadColdWork})`,
92
+ );
93
+ }
94
+ },
95
+ };
41
96
  }
42
97
 
43
98
  interface RecoveryPipelineRequest {
@@ -614,5 +669,6 @@ export function prepareRecoveryPipelineReadiness(input: {
614
669
  return {
615
670
  pipelineSpecs: Object.freeze(requests.map((request) => request.spec)),
616
671
  assertPreparedCache,
672
+ assertFirstRecoveryFrame: assertPreparedCache,
617
673
  };
618
674
  }
@@ -88,7 +88,7 @@ export interface ReflectionProbeRecordState {
88
88
  >;
89
89
  /** Demand is derived from this frame's renderable/source selection. */
90
90
  readonly fallbackDemand?: boolean;
91
- /** True when at least one selected row must prove a non-zero readback. */
91
+ /** Non-neutral sources require a nonzero diagnostic sample when capture is enabled. */
92
92
  readonly fallbackHasNonNeutral?: boolean;
93
93
  readonly completeSubmission: (
94
94
  submitted: boolean,
@@ -144,6 +144,22 @@ import type {
144
144
  } from './frame-snapshot';
145
145
  import type { FoldDispatchPlan } from './mesh-ssbo';
146
146
 
147
+ /**
148
+ * Armed only for the first published recovery frame. Candidate preparation
149
+ * must make every pipeline and static residency lookup a cache hit before this
150
+ * guard is armed; a miss during draw is a hard failure before queue submission.
151
+ * Explicit preparation between draws remains allowed, including new geometry
152
+ * admitted on the first fixed step after device recovery.
153
+ */
154
+ export interface RecoveryColdWorkGuard {
155
+ arm(): void;
156
+ beginFrame(): void;
157
+ endFrame(): void;
158
+ notePipelineColdWork(): void;
159
+ noteUploadColdWork(): void;
160
+ finish(): void;
161
+ }
162
+
147
163
  export interface RenderSystemRuntime {
148
164
  readonly device: RhiDevice;
149
165
  /** Current renderer device generation used to fence receipt-bound captures. */
@@ -178,7 +194,16 @@ export interface RenderSystemRuntime {
178
194
  /** Producer-owned cooked Standard PBR artifact used by GPU-driven projection. */
179
195
  readonly getMaterialShaderArtifact?: (
180
196
  materialShaderId: string,
181
- vertexColorAvailable?: boolean,
197
+ request?:
198
+ | {
199
+ readonly vertexColorAvailable?: boolean;
200
+ readonly deformation?: 'rigid' | 'skin';
201
+ readonly clustered?: boolean;
202
+ readonly reflectionFallback?: boolean;
203
+ readonly pass?: 'forward' | 'shadow' | 'depth';
204
+ readonly address?: 'direct' | 'scene-index';
205
+ }
206
+ | boolean,
182
207
  ) => MaterialShaderArtifact | undefined;
183
208
  readonly getMaterialShaderPipeline?: (
184
209
  materialShaderId: string,
@@ -221,7 +246,7 @@ export interface RenderSystemRuntime {
221
246
  vertexLayout?: string,
222
247
  vertexLayoutProjection?: VertexLayoutProjection,
223
248
  shaderModuleMode?: RenderFeatureShaderModuleMode,
224
- layoutKindOverride?: 'pbr' | 'pbr-skin',
249
+ layoutKindOverride?: 'pbr' | 'pbr-skin' | 'gpu-driven-pbr' | 'gpu-driven-skin',
225
250
  /** Optional vertex entry override for receipt-owned scene-index passes. */
226
251
  vertexEntryPoint?: string,
227
252
  additionalColorFormats?: readonly GPUTextureFormat[],
@@ -249,6 +274,8 @@ export interface RenderSystemRuntime {
249
274
  ) => BindGroupLayout | undefined;
250
275
  /** Handle-first factory for built-in same-frame GPU producers. */
251
276
  readonly immediateShaderModuleFactory?: PipelineBuilderShaderModuleFactory;
277
+ /** Optional guard for the first recovery frame's cold-work boundary. */
278
+ readonly recoveryColdWorkGuard?: RecoveryColdWorkGuard | undefined;
252
279
  readonly metrics: EngineMetrics;
253
280
  readonly lookupPostProcess?: (
254
281
  id: string,
@@ -422,6 +449,7 @@ export interface PipelineState {
422
449
  readonly gpuDrivenPbrSkinPipelineLayout?: PipelineLayout | null;
423
450
  readonly pbrProbePipelineLayout?: PipelineLayout | null;
424
451
  readonly hdrpPbrPipelineLayout: PipelineLayout | null;
452
+ readonly hdrpMeshBindGroupLayout?: BindGroupLayout | null;
425
453
  readonly hdrpProbePbrPipelineLayout?: PipelineLayout | null;
426
454
  readonly hdrpClusterMembershipPipeline: ComputePipeline | null;
427
455
  readonly hdrpClusterMembershipBindGroupLayout: BindGroupLayout | null;
@@ -462,6 +490,7 @@ export interface RenderSystemInternals extends RenderSystemRuntime {
462
490
  readonly build?: string | undefined;
463
491
  /** Host identity binding for the renderer-owned SSR dependency seam. */
464
492
  readonly ssrIdentity?: SsrAdmissionIdentity | undefined;
493
+ readonly captureReflectionFallbackReadback?: boolean | undefined;
465
494
  readonly standardProfile?: StandardProfile | undefined;
466
495
  readonly standardPipeline: RenderFrameState['activePipeline'];
467
496
  readonly featureHost?: RenderFeatureHost | undefined;
@@ -518,6 +547,8 @@ export interface RenderSystemInternals extends RenderSystemRuntime {
518
547
  }
519
548
 
520
549
  export interface _StandardForwardSceneView {
550
+ readonly environmentIbl?: { readonly irradiance: TextureView; readonly prefilter: TextureView };
551
+ readonly captureDispatch?: readonly DispatchEntry[];
521
552
  readonly assets: AssetRegistry;
522
553
  readonly store: import('../device/gpu-residency').GpuResidencyCache;
523
554
  readonly pipelineState: PipelineState;