@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
@@ -19,7 +19,6 @@ import {
19
19
  postProcessShaderEntrySignature,
20
20
  postProcessShaderPipelineLabel,
21
21
  } from '../../fullscreen-post-process-pass';
22
- import { resolveStandardPbrProgram } from '../../gpu-driven/pbr-program';
23
22
  import type { PipelineState, RenderSystemInternals } from '../../record/render-context';
24
23
  import type {
25
24
  RecoveryGraphCandidate,
@@ -143,6 +142,9 @@ export interface RendererRecoveryDependencies {
143
142
  readonly getMaterialShaderPipelineEntry: NonNullable<
144
143
  RenderSystemInternals['getMaterialShaderPipelineEntry']
145
144
  >;
145
+ readonly getMaterialShaderArtifact: NonNullable<
146
+ RenderSystemInternals['getMaterialShaderArtifact']
147
+ >;
146
148
  readonly getCachedMaterialShaderBindingContract: NonNullable<
147
149
  RenderSystemInternals['getMaterialShaderBindingContract']
148
150
  >;
@@ -201,6 +203,7 @@ export function createRendererRecovery(deps: RendererRecoveryDependencies): Rend
201
203
  buildPipeline,
202
204
  getMaterialShaderPipeline,
203
205
  getMaterialShaderPipelineEntry,
206
+ getMaterialShaderArtifact,
204
207
  getCachedMaterialShaderBindingContract,
205
208
  getParamSchema,
206
209
  getMaterialBindGroupLayout,
@@ -329,6 +332,7 @@ export function createRendererRecovery(deps: RendererRecoveryDependencies): Rend
329
332
  candidateShaderCatalog.installMaterialArtifact(identifier, {
330
333
  source: entry.value.source,
331
334
  paramSchema: entry.value.paramSchema,
335
+ ...(entry.value.receipt === undefined ? {} : { receipt: entry.value.receipt }),
332
336
  });
333
337
  }
334
338
  }
@@ -571,14 +575,7 @@ export function createRendererRecovery(deps: RendererRecoveryDependencies): Rend
571
575
  dynamicTextureStore: { value: candidateState.dynamicTextureStore },
572
576
  getMaterialShaderPipeline: { value: getMaterialShaderPipeline },
573
577
  getMaterialShaderPipelineEntry: { value: getMaterialShaderPipelineEntry },
574
- getMaterialShaderArtifact: {
575
- value: (materialShaderId: string, vertexColorAvailable = false) =>
576
- resolveStandardPbrProgram(
577
- candidatePipelineState.gpuDrivenPbrPrograms,
578
- materialShaderId,
579
- vertexColorAvailable,
580
- )?.artifact,
581
- },
578
+ getMaterialShaderArtifact: { value: getMaterialShaderArtifact },
582
579
  getMaterialShaderBindingContract: { value: getCachedMaterialShaderBindingContract },
583
580
  getParamSchema: { value: getParamSchema },
584
581
  getMaterialBindGroupLayout: { value: getMaterialBindGroupLayout },
@@ -30,6 +30,7 @@ import type {
30
30
  RenderProfile,
31
31
  RenderResult,
32
32
  } from '../render-contract';
33
+ import { resolveSsaoParameters } from '../ssao-config';
33
34
  import type { RendererHostImplementation } from './host-contract';
34
35
  import { createRendererLifecycle, isRendererStateOperational } from './renderer-lifecycle';
35
36
 
@@ -108,6 +109,8 @@ export function exposeRenderer(renderer: RendererHostImplementation): Renderer {
108
109
  candidate: DynamicGeometryCandidate,
109
110
  ordering: DynamicGeometryOrdering,
110
111
  ) => renderer.acceptDynamicGeometry(candidate, ordering),
112
+ acceptDynamicGeometryCandidates: (candidates, ordering) =>
113
+ renderer.acceptDynamicGeometryCandidates(candidates, ordering),
111
114
  dynamicGeometryReceipt: (candidate: DynamicGeometryCandidate) =>
112
115
  renderer.dynamicGeometryReceipt(candidate),
113
116
  cancelDynamicGeometry: (candidate: DynamicGeometryCandidate) =>
@@ -349,9 +352,26 @@ export function validateRenderProfile(profile: RenderProfile): string | undefine
349
352
  if (profile.shadows !== 'off' && profile.shadows !== 'hard' && profile.shadows !== 'filtered') {
350
353
  return "RenderProfile.shadows must be 'off', 'hard', or 'filtered'";
351
354
  }
352
- for (const field of ['pbr', 'ibl', 'ssao'] as const) {
355
+ for (const field of ['pbr', 'ibl'] as const) {
353
356
  if (typeof profile[field] !== 'boolean') return `RenderProfile.${field} must be boolean`;
354
357
  }
358
+ if (
359
+ typeof profile.ssao !== 'boolean' &&
360
+ (typeof profile.ssao !== 'object' || profile.ssao === null || Array.isArray(profile.ssao))
361
+ )
362
+ return 'RenderProfile.ssao must be boolean or AO parameters';
363
+ if (typeof profile.ssao === 'object') {
364
+ if (
365
+ Object.keys(profile.ssao).some(
366
+ (key) => !['radius', 'bias', 'intensity', 'quality'].includes(key),
367
+ )
368
+ )
369
+ return 'RenderProfile.ssao contains an unsupported parameter';
370
+ const resolved = resolveSsaoParameters(profile.ssao);
371
+ if (!resolved.ok) return resolved.error.hint;
372
+ }
373
+ if (profile.ssao !== false && profile.renderPath !== 'deferred')
374
+ return 'SSAO needs current depth and normals: set renderPath to deferred';
355
375
  const stages = STANDARD_POST_STAGE_NAMES;
356
376
  if (
357
377
  !Array.isArray(profile.postStages) ||
@@ -366,6 +386,7 @@ export function validateRenderProfile(profile: RenderProfile): string | undefine
366
386
  export function freezeRenderProfile(profile: RenderProfile): RenderProfile {
367
387
  return Object.freeze({
368
388
  ...profile,
389
+ ssao: typeof profile.ssao === 'object' ? Object.freeze({ ...profile.ssao }) : profile.ssao,
369
390
  postStages: Object.freeze([...profile.postStages]) as RenderProfile['postStages'],
370
391
  });
371
392
  }
@@ -2,7 +2,13 @@ import type { Result, RhiError, ShaderModule } from '@forgeax/engine-rhi';
2
2
  import { findVariantByKey, type MaterialShaderManifestEntry } from '@forgeax/engine-shader';
3
3
 
4
4
  /** Minimum sampled-texture limit needed by Standard transmission variants. */
5
- export const STANDARD_PBR_REQUIRED_SAMPLED_TEXTURES = 17;
5
+ export const STANDARD_PBR_REQUIRED_SAMPLED_TEXTURES = 18;
6
+
7
+ function isOrdinaryMaterialVariant(
8
+ variant: MaterialShaderManifestEntry['variants'][number],
9
+ ): boolean {
10
+ return variant.defines.COVERAGE_ONLY !== true;
11
+ }
6
12
 
7
13
  /** Select HDRP variants that must be seeded during ready-state construction. */
8
14
  export function selectHdrpPbrPrewarmVariants(
@@ -27,6 +33,7 @@ export function selectHdrpPbrPrewarmVariants(
27
33
  return (
28
34
  variants.filter(
29
35
  (variant) =>
36
+ isOrdinaryMaterialVariant(variant) &&
30
37
  variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
31
38
  (!('EXTENDED_LIGHTING_AVAILABLE' in variant.defines) ||
32
39
  variant.defines.EXTENDED_LIGHTING_AVAILABLE === extendedLightingShaderAvailable) &&
@@ -49,6 +56,7 @@ export function selectSkinPrewarmVariants(
49
56
  return (
50
57
  manifestEntry?.variants.filter(
51
58
  (variant) =>
59
+ isOrdinaryMaterialVariant(variant) &&
52
60
  variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
53
61
  (storageBufferCapable || variant.defines.CLUSTER_FORWARD_AVAILABLE !== true) &&
54
62
  variant.defines.PROBE_BLEND_AVAILABLE !== true,
@@ -70,6 +78,7 @@ export function selectGpuDrivenSceneIndexVariant(
70
78
  ): MaterialShaderManifestEntry['variants'][number] | undefined {
71
79
  return manifestEntry?.variants.find(
72
80
  (variant) =>
81
+ isOrdinaryMaterialVariant(variant) &&
73
82
  variant.defines.STORAGE_BUFFER_AVAILABLE === true &&
74
83
  variant.defines.GPU_DRIVEN_SCENE_INDEX_AVAILABLE === true &&
75
84
  (!('CLUSTER_FORWARD_AVAILABLE' in variant.defines) ||
@@ -83,6 +92,8 @@ export function selectGpuDrivenSceneIndexVariant(
83
92
  variant.defines.DIRECTIONAL_PCSS_AVAILABLE === directionalPcssAvailable) &&
84
93
  (!('PROJECTOR_AVAILABLE' in variant.defines) ||
85
94
  variant.defines.PROJECTOR_AVAILABLE === projectorAvailable) &&
95
+ (!('REFLECTION_FALLBACK_AVAILABLE' in variant.defines) ||
96
+ variant.defines.REFLECTION_FALLBACK_AVAILABLE === false) &&
86
97
  (!('TRANSMISSION_AVAILABLE' in variant.defines) ||
87
98
  variant.defines.TRANSMISSION_AVAILABLE === false),
88
99
  );
@@ -103,6 +114,7 @@ export function selectProbePrewarmVariants(
103
114
  manifestEntry?.variants.filter((variant) => {
104
115
  const defines = variant.defines;
105
116
  return (
117
+ isOrdinaryMaterialVariant(variant) &&
106
118
  defines.PROBE_BLEND_AVAILABLE === true &&
107
119
  defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
108
120
  (!('WEBGL2_COMPAT' in defines) || defines.WEBGL2_COMPAT === webgl2Downlevel) &&
@@ -156,6 +168,7 @@ export function selectStandardPbrTransmissionPrewarmVariants(
156
168
  for (const transmissionAvailable of [false, true]) {
157
169
  const declared = manifestEntry.variants.find(
158
170
  (variant) =>
171
+ isOrdinaryMaterialVariant(variant) &&
159
172
  variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
160
173
  variant.defines.CLUSTER_FORWARD_AVAILABLE === standardBootClusterAxis() &&
161
174
  variant.defines.VERTEX_COLOR_AVAILABLE === false &&
@@ -1,4 +1,5 @@
1
1
  import type { GpuDrivenPbrProgram } from '../gpu-driven/pbr-program';
2
+ import { transmissionBackdropAvailable } from './device-feature-admission';
2
3
  // WebGPU generation-scoped ready-state builder.
3
4
  // This owner performs one complete device-generation promotion; it receives
4
5
  // policy/adapters and returns a fully prepared PipelineState.
@@ -225,18 +226,11 @@ export async function buildReadyWebGPU(
225
226
  setVolumetricFogShaderSources: (sources: VolumetricFogShaderSources) => void,
226
227
  /** Install manifest-owned SSR utility sources only after all five modules compile. */
227
228
  setSsrShaderSources: (sources: SsrShaderSources) => void,
228
- /** Install manifest-owned atmosphere utility sources only after both modules compile. */
229
+ /** Install manifest-owned atmosphere utility sources only after all modules compile. */
229
230
  setAtmosphereShaderSources: (sources: AtmosphereShaderSources) => void,
230
231
  ): Promise<PipelineState> {
231
232
  const extendedLightingShaderAvailable = deriveExtendedLightingCapability(rhiDevice).admitted;
232
- // bug-20260610: WebGL2 fallback path read storage-buffer capability up
233
- // front so both Step 2 (shader-module compile, where we patch engine
234
- // entries to the STORAGE_BUFFER_AVAILABLE=false variant) and Step 3
235
- // (buildPbrPipelineLayouts, which switches between read-only-storage
236
- // and uniform BGL entries) walk the same axis. Step 0 already ran in
237
- // `prepareMaterialShaders`; this is an idempotent re-read driven by
238
- // `device.limits.maxStorageBuffersPerShaderStage`, which is 0 on the
239
- // wgpu-wasm WebGL2 backend (downlevel_webgl2_defaults).
233
+ // Shader and layout construction consume the same storage capability.
240
234
  const capValue = (rhiDevice.limits as Readonly<Record<string, number>>)
241
235
  .maxStorageBuffersPerShaderStage;
242
236
  const webgl2Downlevel = rhiDevice.caps.backendKind === 'wgpu-webgl2';
@@ -386,6 +380,7 @@ export async function buildReadyWebGPU(
386
380
  let iblIrradianceEntry: ManifestEntry | undefined;
387
381
  let iblPrefilterEntry: ManifestEntry | undefined;
388
382
  let iblBrdfLutEntry: ManifestEntry | undefined;
383
+ let probeBackgroundEntry: ManifestEntry | undefined;
389
384
  let fxaaEntry: ManifestEntry | undefined;
390
385
  let skyboxEntry: ManifestEntry | undefined;
391
386
  let bloomBrightEntry: ManifestEntry | undefined;
@@ -441,6 +436,10 @@ export async function buildReadyWebGPU(
441
436
  iblBrdfLutEntry ??= entry;
442
437
  continue;
443
438
  }
439
+ if (entry.wgsl.includes('probe_background_fs')) {
440
+ probeBackgroundEntry ??= entry;
441
+ continue;
442
+ }
444
443
  if (entry.wgsl.includes('f_schlick')) {
445
444
  pbrEntry ??= entry;
446
445
  continue;
@@ -522,6 +521,7 @@ export async function buildReadyWebGPU(
522
521
  const exact = ms.variants.find(
523
522
  (v) =>
524
523
  v.defines.STORAGE_BUFFER_AVAILABLE === false &&
524
+ v.defines.COVERAGE_ONLY !== true &&
525
525
  (!('CLUSTER_FORWARD_AVAILABLE' in v.defines) ||
526
526
  v.defines.CLUSTER_FORWARD_AVAILABLE === false) &&
527
527
  (!('VERTEX_COLOR_AVAILABLE' in v.defines) ||
@@ -564,6 +564,7 @@ export async function buildReadyWebGPU(
564
564
  const exact = ms.variants.find(
565
565
  (variant) =>
566
566
  variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
567
+ variant.defines.COVERAGE_ONLY !== true &&
567
568
  (!('CLUSTER_FORWARD_AVAILABLE' in variant.defines) ||
568
569
  variant.defines.CLUSTER_FORWARD_AVAILABLE === false) &&
569
570
  (!('VERTEX_COLOR_AVAILABLE' in variant.defines) ||
@@ -642,13 +643,7 @@ export async function buildReadyWebGPU(
642
643
  }
643
644
  }
644
645
  }
645
- // Wire composed IBL shaders into IblPipelineCache before the cache's
646
- // createIblPipelines runs (called downstream by the internal
647
- // GpuResidencyCache equirect-to-cubemap projection during the first Skylight
648
- // dispatch). When all 4 are present, register them; otherwise leave
649
- // the cache untouched (charter F1: tests / non-IBL hosts that ship
650
- // empty / 3-entry manifests still boot, and the IBL pipeline cache's
651
- // own error surfacing covers the "missing" case downstream).
646
+ // Publish the generation's compiled IBL programs before resource preparation.
652
647
  if (
653
648
  iblEquirectEntry !== undefined &&
654
649
  iblIrradianceEntry !== undefined &&
@@ -660,6 +655,9 @@ export async function buildReadyWebGPU(
660
655
  irradiance: iblIrradianceEntry.wgsl,
661
656
  prefilter: iblPrefilterEntry.wgsl,
662
657
  brdfLut: iblBrdfLutEntry.wgsl,
658
+ ...(probeBackgroundEntry === undefined
659
+ ? {}
660
+ : { probeBackground: probeBackgroundEntry.wgsl }),
663
661
  });
664
662
  }
665
663
  // Points/Lines are an engine-owned record path rather than a producer
@@ -986,7 +984,8 @@ export async function buildReadyWebGPU(
986
984
  const coloredUnlitVariant = unlitManifestEntry?.variants.find(
987
985
  (variant) =>
988
986
  variant.defines.VERTEX_COLOR_AVAILABLE === true &&
989
- variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable,
987
+ variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
988
+ variant.defines.COVERAGE_ONLY !== true,
990
989
  );
991
990
  if (coloredUnlitVariant !== undefined && coloredUnlitVariant.composedWgsl !== unlitEntry.wgsl) {
992
991
  const coloredUnlitShaderResult = await runShimStep(
@@ -1013,7 +1012,8 @@ export async function buildReadyWebGPU(
1013
1012
  const uncoloredUnlitVariant = unlitManifestEntry?.variants.find(
1014
1013
  (variant) =>
1015
1014
  variant.defines.VERTEX_COLOR_AVAILABLE === false &&
1016
- variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable,
1015
+ variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
1016
+ variant.defines.COVERAGE_ONLY !== true,
1017
1017
  );
1018
1018
  if (uncoloredUnlitVariant !== undefined) {
1019
1019
  seedShaderModule(
@@ -1411,7 +1411,10 @@ export async function buildReadyWebGPU(
1411
1411
  // feat-20260612-hdrp-ssao M6 / w27: SSAO shader module compilation.
1412
1412
  // Optional manifest entry — absent on legacy manifests (zero-overhead
1413
1413
  // opt-out, same as bloom). Identified by 'fs_ssao_calc' content marker.
1414
- if (ssaoEntry !== undefined) {
1414
+ // The GLES translator cannot read raw depth through this SSAO program.
1415
+ // Keep optional AO out of fallback startup; requesting it is refused by
1416
+ // the record owner instead of breaking every AO-disabled renderer.
1417
+ if (ssaoEntry !== undefined && !webgl2Downlevel) {
1415
1418
  const entry = ssaoEntry;
1416
1419
  const ssaoShaderResult = await runShimStep(
1417
1420
  () =>
@@ -1460,6 +1463,9 @@ export async function buildReadyWebGPU(
1460
1463
  storageBuffer: storageBufferCapable,
1461
1464
  extendedLighting: extendedLightingShaderAvailable,
1462
1465
  projectorAvailable,
1466
+ transmissionBackdrop: transmissionBackdropAvailable(
1467
+ rhiDevice.limits.maxSampledTexturesPerShaderStage,
1468
+ ),
1463
1469
  }),
1464
1470
  ),
1465
1471
  'webgpu-runtime-error',
@@ -1485,6 +1491,7 @@ export async function buildReadyWebGPU(
1485
1491
  // (URP layout) so the manifest entry's URP variant WGSL still builds a
1486
1492
  // valid PSO instead of hard-disabling the entire HDRP-variant build path.
1487
1493
  let hdrpPbrPipelineLayoutHandle: PipelineLayout | null = null;
1494
+ let hdrpMeshBindGroupLayoutHandle: BindGroupLayout | null = null;
1488
1495
  let hdrpProbePbrPipelineLayoutHandle: PipelineLayout | null = null;
1489
1496
  // The cluster layout is storage-buffer backed. On the WebGL2/fallback
1490
1497
  // capability tier its uniform-buffer projection exceeds the backend's
@@ -1493,6 +1500,7 @@ export async function buildReadyWebGPU(
1493
1500
  const hdrpUnifiedBglDesc = createHdrpBindGroupLayoutDescriptor();
1494
1501
  const hdrpUnifiedBglRes = rhiDevice.createBindGroupLayout(hdrpUnifiedBglDesc);
1495
1502
  if (hdrpUnifiedBglRes.ok) {
1503
+ hdrpMeshBindGroupLayoutHandle = hdrpUnifiedBglRes.value;
1496
1504
  const hdrpPlRes = rhiDevice.createPipelineLayout({
1497
1505
  label: 'hdrp-pbr-pl',
1498
1506
  bindGroupLayouts: [
@@ -3919,6 +3927,7 @@ export async function buildReadyWebGPU(
3919
3927
  // HDRP variant uses the unified group(2) layout built above.
3920
3928
  hdrpPbrPipelineLayout:
3921
3929
  unlitModule !== null && pbrModule !== null ? hdrpPbrPipelineLayoutHandle : null,
3930
+ hdrpMeshBindGroupLayout: hdrpMeshBindGroupLayoutHandle,
3922
3931
  hdrpProbePbrPipelineLayout:
3923
3932
  unlitModule !== null && pbrModule !== null ? hdrpProbePbrPipelineLayoutHandle : null,
3924
3933
  hdrpClusterMembershipPipeline,