@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
package/src/index.ts CHANGED
@@ -10,15 +10,15 @@ export {
10
10
  materialContribution,
11
11
  renderPipelineContribution,
12
12
  samplerContribution,
13
- } from './assets/asset-decoders';
13
+ } from './assets/asset-decoders.js';
14
14
  // Runtime contract: leases, frame receipts, detached inspection, profile,
15
15
  // lifecycle state, and the single renderer event stream.
16
16
  export type {
17
17
  CubeCameraFaceView,
18
18
  CubeCameraFaceViewInput,
19
- } from './capture/cube-views';
20
- export { buildCubeCameraFaceViews } from './capture/cube-views';
21
- export { Atmosphere } from './components/atmosphere';
19
+ } from './capture/cube-views.js';
20
+ export { buildCubeCameraFaceViews } from './capture/cube-views.js';
21
+ export { Atmosphere } from './components/atmosphere.js';
22
22
  // ECS render vocabulary and grouped closed values.
23
23
  export type {
24
24
  Antialias,
@@ -29,7 +29,7 @@ export type {
29
29
  CameraExposure,
30
30
  CameraProjection,
31
31
  Tonemap,
32
- } from './components/camera';
32
+ } from './components/camera.js';
33
33
  export {
34
34
  ANTIALIAS_FXAA,
35
35
  ANTIALIAS_MSAA,
@@ -61,7 +61,7 @@ export {
61
61
  TONEMAP_REINHARD_EXTENDED,
62
62
  validateCameraColorGrading,
63
63
  validateCameraExposure,
64
- } from './components/camera';
64
+ } from './components/camera.js';
65
65
  export {
66
66
  CUBE_CAMERA_FACE_ORDER,
67
67
  CUBE_CAMERA_UPDATE_CONTINUOUS,
@@ -73,27 +73,33 @@ export {
73
73
  type CubeCameraUpdateIntent,
74
74
  cubeCameraUpdateIntentFromF32,
75
75
  cubeCameraUpdateIntentToF32,
76
- } from './components/cube-camera';
77
- export * from './components/directional-light';
78
- export { Fog } from './components/fog';
79
- export { Instances, type InstancesData } from './components/instances';
80
- export { Layer } from './components/layer';
81
- export * from './components/light-helpers';
82
- export { LightProbe } from './components/light-probe';
83
- export { Lines } from './components/lines';
84
- export * from './components/mesh-filter';
85
- export * from './components/mesh-renderer';
86
- export { MotionBlur } from './components/motion-blur';
87
- export { PointLight } from './components/point-light';
88
- export { PointLightShadow } from './components/point-light-shadow';
76
+ } from './components/cube-camera.js';
77
+ export * from './components/directional-light.js';
78
+ export {
79
+ DynamicResolution,
80
+ type DynamicResolutionData,
81
+ validateDynamicResolutionCamera,
82
+ validateDynamicResolutionParameters,
83
+ } from './components/dynamic-resolution.js';
84
+ export { Fog } from './components/fog.js';
85
+ export { Instances, type InstancesData } from './components/instances.js';
86
+ export { Layer } from './components/layer.js';
87
+ export * from './components/light-helpers.js';
88
+ export { LightProbe } from './components/light-probe.js';
89
+ export { Lines } from './components/lines.js';
90
+ export * from './components/mesh-filter.js';
91
+ export * from './components/mesh-renderer.js';
92
+ export { MotionBlur } from './components/motion-blur.js';
93
+ export { PointLight } from './components/point-light.js';
94
+ export { PointLightShadow } from './components/point-light-shadow.js';
89
95
  export {
90
96
  type PointShape,
91
97
  PointShapeValue,
92
98
  Points,
93
99
  pointShapeFromU32,
94
- } from './components/points';
95
- export { PostProcessParams } from './components/post-process-params';
96
- export { RectAreaLight } from './components/rect-area-light';
100
+ } from './components/points.js';
101
+ export { PostProcessParams } from './components/post-process-params.js';
102
+ export { RectAreaLight } from './components/rect-area-light.js';
97
103
  export {
98
104
  REFLECTION_PROBE_UPDATE_CONTINUOUS,
99
105
  REFLECTION_PROBE_UPDATE_ON_CHANGE,
@@ -103,8 +109,8 @@ export {
103
109
  type ReflectionProbeUpdateIntent,
104
110
  reflectionProbeUpdateIntentFromF32,
105
111
  reflectionProbeUpdateIntentToF32,
106
- } from './components/reflection-probe';
107
- export { SceneInstance } from './components/scene-instance';
112
+ } from './components/reflection-probe.js';
113
+ export { SceneInstance } from './components/scene-instance.js';
108
114
  export {
109
115
  ScreenSpaceReflection,
110
116
  type ScreenSpaceReflectionData,
@@ -113,17 +119,17 @@ export {
113
119
  SKYBOX_MODE_CUBEMAP,
114
120
  SkyboxBackground,
115
121
  type SkyboxMode,
116
- } from './components/skybox-background';
117
- export { Skylight } from './components/skylight';
118
- export { SortKey } from './components/sort-key';
119
- export type { SpotLightAuthoring, SpotLightProjector } from './components/spot-light';
120
- export { SpotLight } from './components/spot-light';
122
+ } from './components/skybox-background.js';
123
+ export { Skylight } from './components/skylight.js';
124
+ export { SortKey } from './components/sort-key.js';
125
+ export type { SpotLightAuthoring, SpotLightProjector } from './components/spot-light.js';
126
+ export { SpotLight } from './components/spot-light.js';
121
127
  export {
122
128
  Visibility,
123
129
  type VisibilityState,
124
130
  VisibilityStateValue,
125
131
  visibilityStateFromU32,
126
- } from './components/visibility';
132
+ } from './components/visibility.js';
127
133
  export type {
128
134
  DynamicGeometryCandidate,
129
135
  DynamicGeometryCandidateState,
@@ -134,17 +140,17 @@ export type {
134
140
  DynamicGeometryOrdering,
135
141
  DynamicGeometryPrepareInput,
136
142
  DynamicGeometryReceipt,
137
- } from './dynamic-geometry';
143
+ } from './dynamic-geometry.js';
138
144
  export {
139
145
  createDynamicGeometryLifecycle,
140
146
  DynamicGeometryError,
141
- } from './dynamic-geometry';
147
+ } from './dynamic-geometry.js';
142
148
  export type {
143
149
  EnvironmentInspection,
144
150
  EnvironmentInspectionFailure,
145
151
  EnvironmentInspectionGeneration,
146
152
  EnvironmentInspectionStatus,
147
- } from './environment/inspection';
153
+ } from './environment/inspection.js';
148
154
  // Public structured operation failure union. Concrete error classes stay
149
155
  // behind the Renderer Result/event boundary.
150
156
  export type {
@@ -155,6 +161,7 @@ export type {
155
161
  } from './errors/gpu-driven';
156
162
  export { GpuDrivenPreparationError } from './errors/gpu-driven';
157
163
  export type {
164
+ DynamicResolutionError,
158
165
  ReflectionProbeBudgetExceededDetail,
159
166
  RenderError,
160
167
  RenderErrorCode,
@@ -165,27 +172,30 @@ export type {
165
172
  RenderTargetStateInvalidDetail,
166
173
  SceneDataUnavailableDetail,
167
174
  SceneDataUnavailableReason,
168
- } from './errors/render';
175
+ } from './errors/render.js';
169
176
  export {
170
177
  AtmosphereInvalidParameterError,
178
+ DynamicResolutionInvalidParameterError,
179
+ DynamicResolutionRequiresTaaError,
180
+ DynamicResolutionTimingUnavailableError,
171
181
  EnvironmentGenerationFailedError,
172
182
  EnvironmentSourceConflictError,
173
183
  FogCardinalityError,
174
184
  OwnerStageFailedError,
175
185
  SceneDataUnavailableError,
176
186
  TaaCapsInsufficientError,
177
- } from './errors/render';
187
+ } from './errors/render.js';
178
188
  export type {
179
189
  EnvironmentFrame,
180
190
  EnvironmentSource,
181
191
  FogFrame,
182
192
  FramePlan,
183
- } from './extract/environment';
193
+ } from './extract/environment.js';
184
194
  export {
185
195
  resolveVisibility,
186
196
  type VisibilityResolution,
187
197
  type VisibilitySnapshot,
188
- } from './extract/visibility';
198
+ } from './extract/visibility.js';
189
199
  export type {
190
200
  RenderFeatureLogicalTarget,
191
201
  RenderFeatureMaterialShaderBindingContract,
@@ -193,7 +203,7 @@ export type {
193
203
  RenderFeaturePlan,
194
204
  RenderFeaturePlanContext,
195
205
  RenderFeatureResourceDeclaration,
196
- } from './features/plan';
206
+ } from './features/plan.js';
197
207
  // Minimal declarative extension contract. Implementations use relative
198
208
  // imports; the root does not expose prepared state, graph projectors, target
199
209
  // handles, or builtin feature factories.
@@ -207,7 +217,7 @@ export type {
207
217
  RenderFeatureShaderModuleMode,
208
218
  RenderFeatureStatus,
209
219
  RenderFeatureWorldVisibilitySnapshot,
210
- } from './features/types';
220
+ } from './features/types.js';
211
221
  export {
212
222
  beginProbeIblUpdate,
213
223
  createIblKernelCache,
@@ -219,7 +229,7 @@ export {
219
229
  REFLECTION_PROBE_IBL_STAGES,
220
230
  type ReflectionProbeIblStage,
221
231
  resetIblKernelCaches,
222
- } from './ibl/kernel-cache';
232
+ } from './ibl/kernel-cache.js';
223
233
  export type {
224
234
  BloomInspection,
225
235
  GpuDrivenLane,
@@ -243,7 +253,7 @@ export type {
243
253
  RenderFeatureGraphInspection,
244
254
  RenderFeatureHostInspection,
245
255
  TransmissionInspection,
246
- } from './inspection-types';
256
+ } from './inspection-types.js';
247
257
  export {
248
258
  type InstanceBackendKind,
249
259
  type InstanceCollectionCreateInput,
@@ -272,7 +282,7 @@ export {
272
282
  Materials,
273
283
  MaterialTransmissionContractError,
274
284
  srgb,
275
- } from './materials';
285
+ } from './materials.js';
276
286
  export {
277
287
  type MeshMaterialBindingObservation,
278
288
  type MeshMaterialBindingPreparationFailure,
@@ -283,12 +293,13 @@ export {
283
293
  type MeshMaterialBindingTextureObservation,
284
294
  projectMeshMaterialBindingObservation,
285
295
  summarizeMeshMaterialBindings,
286
- } from './mesh-material-bindings';
296
+ } from './mesh-material-bindings.js';
297
+ export type { RenderExtent } from './pipeline/render-extent.js';
287
298
  export type {
288
299
  StandardClusterTransportInspection,
289
300
  StandardLightingInspection,
290
301
  StandardNoLocalLightingInspection,
291
- } from './pipeline/standard-lighting/inspection';
302
+ } from './pipeline/standard-lighting/inspection.js';
292
303
  export type {
293
304
  AutoExposureCapabilityUnavailableDetail,
294
305
  AutoExposureError,
@@ -303,7 +314,7 @@ export type {
303
314
  AutoExposureResetReason,
304
315
  AutoExposureStageFailedDetail,
305
316
  AutoExposureStaleGenerationDetail,
306
- } from './pipeline/standard-output/auto-exposure/inspection';
317
+ } from './pipeline/standard-output/auto-exposure/inspection.js';
307
318
  export {
308
319
  AutoExposureCapabilityUnavailableError,
309
320
  AutoExposureInvalidParameterError,
@@ -311,24 +322,24 @@ export {
311
322
  AutoExposureStaleGenerationError,
312
323
  createAutoExposureError,
313
324
  createAutoExposureInspection,
314
- } from './pipeline/standard-output/auto-exposure/inspection';
325
+ } from './pipeline/standard-output/auto-exposure/inspection.js';
315
326
  export type {
316
327
  StandardLutFailure,
317
328
  StandardLutInspection,
318
329
  StandardLutState,
319
- } from './pipeline/standard-output/lut-state';
330
+ } from './pipeline/standard-output/lut-state.js';
320
331
  // The host-facing default is a stable profile value; implementation-only
321
332
  // pipeline helpers remain behind the package boundary.
322
333
  export {
323
334
  DEFAULT_STANDARD_PROFILE,
324
335
  type StandardVolumetricFogProfile,
325
336
  type StandardVolumetricFogQuality,
326
- } from './pipeline/standard-profile';
327
- export { renderComponentsPlugin } from './plugin';
337
+ } from './pipeline/standard-profile.js';
338
+ export { renderComponentsPlugin } from './plugin.js';
328
339
  export {
329
340
  inspectPointShadow,
330
341
  type PointShadowInspection,
331
- } from './point-shadow-inspection';
342
+ } from './point-shadow-inspection.js';
332
343
  export {
333
344
  admitPointsLines,
334
345
  type LinesStyleInput,
@@ -337,8 +348,8 @@ export {
337
348
  type PointsLinesAdmissionInput,
338
349
  type PointsLinesAdmissionLimits,
339
350
  type PointsStyleInput,
340
- } from './points-lines/admission';
341
- export type { PointsLinesInspection } from './points-lines/inspection';
351
+ } from './points-lines/admission.js';
352
+ export type { PointsLinesInspection } from './points-lines/inspection.js';
342
353
  /**
343
354
  * Public bounded GPU pass facts. Use the single `gpuPassTiming` opt-in,
344
355
  * `draw()` receipt, and `observe(receipt, { include: ['timings'] })` route.
@@ -375,17 +386,17 @@ export {
375
386
  createProbeFilterState,
376
387
  type ProbeFilterState,
377
388
  probeFilterIsSteady,
378
- } from './reflection/filter';
389
+ } from './reflection/filter.js';
379
390
  export {
380
391
  buildReflectionProbeTable,
381
392
  type ReflectionProbeTable,
382
393
  type ReflectionProbeTableRow,
383
394
  reflectionProbeTableBytes,
384
- } from './reflection/gpu-table';
395
+ } from './reflection/gpu-table.js';
385
396
  export {
386
397
  inspectReflectionFallback,
387
398
  type ReflectionFallbackFailureInput,
388
- } from './reflection/inspection';
399
+ } from './reflection/inspection.js';
389
400
  export {
390
401
  admitReflectionProbe,
391
402
  DEFAULT_REFLECTION_PROBE_LIMITS,
@@ -401,7 +412,7 @@ export {
401
412
  type SkylightSelection,
402
413
  selectReflectionProbe,
403
414
  validateReflectionProbeInput,
404
- } from './reflection/projection';
415
+ } from './reflection/projection.js';
405
416
  export type {
406
417
  CameraOutputSnapshot,
407
418
  CubeCameraSnapshot,
@@ -419,25 +430,25 @@ export type {
419
430
  RenderProfile,
420
431
  RenderResult,
421
432
  RenderWorldLease,
422
- } from './render-contract';
423
- export { RENDER_PHASE_CATALOG } from './render-contract';
433
+ } from './render-contract.js';
434
+ export { RENDER_PHASE_CATALOG } from './render-contract.js';
424
435
  export type {
425
436
  TemporalInspectionInput,
426
437
  TemporalInspectionStatus,
427
- } from './renderer-inspect';
428
- export type { RenderSceneBounds } from './scene/render-scene-types';
438
+ } from './renderer-inspect.js';
439
+ export type { RenderSceneBounds } from './scene/render-scene-types.js';
429
440
  export type {
430
441
  GpuFrameTiming,
431
442
  GpuFrameTimingProtocol,
432
443
  GpuFrameTimingRecord,
433
444
  GpuFrameTimingSample,
434
445
  GpuFrameTimingSummary,
435
- } from './scene/visibility/gpu-frame-timing';
446
+ } from './scene/visibility/gpu-frame-timing.js';
436
447
  export {
437
448
  createGpuFrameTiming,
438
449
  recordGpuFrameTiming,
439
450
  summarizeGpuFrameTiming,
440
- } from './scene/visibility/gpu-frame-timing';
451
+ } from './scene/visibility/gpu-frame-timing.js';
441
452
  export type {
442
453
  LodOcclusionDegradation,
443
454
  LodOcclusionFallback,
@@ -451,19 +462,19 @@ export type {
451
462
  LodOcclusionWorldAttribution,
452
463
  LodOcclusionWorldInspection,
453
464
  LodOcclusionWorldInspectionInput,
454
- } from './scene/visibility/inspection';
465
+ } from './scene/visibility/inspection.js';
455
466
  export {
456
467
  consumeLodOcclusionInspection,
457
468
  inspectLodOcclusion,
458
469
  LOD_OCCLUSION_INSPECTION_MAX_BYTES,
459
470
  LOD_OCCLUSION_INSPECTION_SCHEMA,
460
471
  serializeLodOcclusionInspection,
461
- } from './scene/visibility/inspection';
472
+ } from './scene/visibility/inspection.js';
462
473
  export {
463
474
  SHADOW_ATLAS_DEFAULT_FACE_SIZE,
464
475
  SHADOW_ATLAS_DEFAULT_LAYERS,
465
476
  ShadowAtlas,
466
- } from './shadow-atlas';
477
+ } from './shadow-atlas.js';
467
478
  export type {
468
479
  SsrAdmissionBudget,
469
480
  SsrAdmissionFailure,
@@ -482,7 +493,7 @@ export type {
482
493
  SsrSpatialStatus,
483
494
  SsrSpatialWork,
484
495
  SsrTemporalReceipt,
485
- } from './ssr/admission';
496
+ } from './ssr/admission.js';
486
497
  export {
487
498
  admitSsrM0,
488
499
  admitSsrSpatial,
@@ -492,32 +503,32 @@ export {
492
503
  SSR_FORMAT_STAGES,
493
504
  validateScreenSpaceReflection,
494
505
  zeroSsrAdmissionWork,
495
- } from './ssr/admission';
506
+ } from './ssr/admission.js';
496
507
  export {
497
508
  composeSsrReflection,
498
509
  type SsrCompositionInput,
499
510
  type SsrCompositionInputError,
500
511
  type SsrCompositionResult,
501
512
  type SsrReflectionColor,
502
- } from './ssr/composition';
513
+ } from './ssr/composition.js';
503
514
  export type {
504
515
  SsrConfigField,
505
516
  SsrConfigInvalidError,
506
517
  SsrConfigRange,
507
518
  SsrSpatialUnavailableReason,
508
519
  SsrUnavailableError,
509
- } from './ssr/errors';
520
+ } from './ssr/errors.js';
510
521
  export type {
511
522
  SsrSpatialHistoryInspection,
512
523
  SsrSpatialInspection,
513
524
  SsrSpatialInspectionFailure,
514
525
  SsrSpatialInspectionProjection,
515
- } from './ssr/inspection';
526
+ } from './ssr/inspection.js';
516
527
  export {
517
528
  projectSsrSpatialInspection,
518
529
  serializeSsrSpatialInspection,
519
- } from './ssr/inspection';
520
- export { getActiveCamera, setActiveCamera } from './systems/active-camera';
530
+ } from './ssr/inspection.js';
531
+ export { getActiveCamera, setActiveCamera } from './systems/active-camera.js';
521
532
  export type {
522
533
  RenderTarget,
523
534
  RenderTargetAdmissionLimits,
@@ -533,8 +544,8 @@ export type {
533
544
  RenderTargetTextureAspect,
534
545
  RenderTargetTextureSource,
535
546
  RenderTargetTextureSourceOptions,
536
- } from './targets/contracts';
537
- export type { TemporalInspection, TemporalResourceInspection } from './temporal/inspection';
547
+ } from './targets/contracts.js';
548
+ export type { TemporalInspection, TemporalResourceInspection } from './temporal/inspection.js';
538
549
  export {
539
550
  SCENE_DATA_TEMPORAL_V1_DESCRIPTOR,
540
551
  SCENE_DATA_TEMPORAL_V1_SCHEMA,
@@ -542,15 +553,15 @@ export {
542
553
  type SceneDataSchemaId,
543
554
  type SceneDataTarget,
544
555
  type SceneDataTemporalV1Descriptor,
545
- } from './temporal/scene-data';
556
+ } from './temporal/scene-data.js';
546
557
  export {
547
558
  createSceneDataCatalog,
548
559
  type SceneDataAvailability,
549
560
  type SceneDataCatalog,
550
561
  type SceneDataCatalogOptions,
551
562
  type SceneDataInspection,
552
- } from './temporal/scene-data-catalog';
553
- export type { TemporalView } from './temporal/view';
563
+ } from './temporal/scene-data-catalog.js';
564
+ export type { TemporalView } from './temporal/view.js';
554
565
  export {
555
566
  hasVolumetricFogCapability,
556
567
  type IntegratedVolumeResource,
@@ -561,7 +572,7 @@ export {
561
572
  type VolumetricFogLightKind,
562
573
  type VolumetricFogLightPairResolution,
563
574
  type VolumetricFogLightResolution,
564
- } from './volume/capability';
575
+ } from './volume/capability.js';
565
576
  export {
566
577
  type ValidatedVolumetricFog,
567
578
  type VolumeBounds,
@@ -570,12 +581,12 @@ export {
570
581
  type VolumetricFogAuthoring,
571
582
  type VolumetricFogLightSelection,
572
583
  validateVolumetricFog,
573
- } from './volume/component';
574
- export { extractVolumetricFog, type VolumetricFogExtract } from './volume/extract';
584
+ } from './volume/component.js';
585
+ export { extractVolumetricFog, type VolumetricFogExtract } from './volume/extract.js';
575
586
  export {
576
587
  inspectVolumetricFog,
577
588
  type VolumetricFogInspection,
578
589
  type VolumetricFogInspectionInput,
579
590
  type VolumetricFogInspectionStatus,
580
591
  type VolumetricFogResourceStage,
581
- } from './volume/inspection';
592
+ } from './volume/inspection.js';
@@ -455,7 +455,9 @@ export interface ReflectionFallbackReceipt {
455
455
  }
456
456
 
457
457
  /**
458
- * One completed readback for the frame-owned fallback attachment.
458
+ * Completed fallback attachment proof, available only when the renderer opts
459
+ * into captureReflectionFallbackReadback. Normal rendering publishes source
460
+ * receipts after GPU completion without copying, mapping, or hashing pixels.
459
461
  *
460
462
  * This is an aggregate attachment fact, not a per-renderable row. Row
461
463
  * receipts deliberately carry source/coverage identity only, so one pixel
@@ -502,6 +504,19 @@ export interface ReflectionFallbackInspection {
502
504
  }
503
505
 
504
506
  export interface ReflectionProbeInspection {
507
+ readonly workBudgetPerFrame?: number;
508
+ readonly updates?: readonly {
509
+ readonly worldId: number;
510
+ readonly entityKey: number;
511
+ readonly intent: 'once' | 'on-change' | 'continuous';
512
+ readonly activeGeneration: number;
513
+ readonly requestedRevision: number;
514
+ readonly capturedRevision: number;
515
+ readonly pending: boolean;
516
+ readonly captureStartedFrame: number;
517
+ readonly lastCompletedFrame: number;
518
+ readonly latencyFrames: number | undefined;
519
+ }[];
505
520
  readonly selection: ReflectionProbeSelectionInspection;
506
521
  readonly factCount: number;
507
522
  readonly acceptedCount: number;
@@ -2,15 +2,12 @@ import {
2
2
  type MaterialShaderArtifactReceipt,
3
3
  STANDARD_PIPELINE_PARAM_SCHEMA,
4
4
  } from '@forgeax/engine-shader';
5
- import { derive, type UboFieldLayout } from '@forgeax/engine-types';
5
+ import { derive, type ParamSchemaEntry, type UboFieldLayout } from '@forgeax/engine-types';
6
6
  import { GPU_SCENE_LAYOUTS } from './gpu-scene-schema';
7
7
  import type { MaterialSnapshot } from './render-system-extract';
8
8
 
9
9
  const ROW = GPU_SCENE_LAYOUTS.material;
10
10
  const STANDARD_PIPELINE_DERIVED = derive(STANDARD_PIPELINE_PARAM_SCHEMA);
11
- const STANDARD_PARAM_ENTRIES = new Map(
12
- STANDARD_PIPELINE_PARAM_SCHEMA.map((entry) => [entry.name, entry]),
13
- );
14
11
 
15
12
  function isNumericValue(value: unknown): value is number | readonly number[] {
16
13
  return typeof value === 'number' || Array.isArray(value);
@@ -42,19 +39,26 @@ function numericFallback(
42
39
  return material.normalScale ?? 1;
43
40
  case 'specularColor':
44
41
  return material.specularColor ?? [1, 1, 1];
45
- default: {
46
- const defaultValue = STANDARD_PARAM_ENTRIES.get(name)?.default;
47
- return isNumericValue(defaultValue) ? defaultValue : undefined;
48
- }
42
+ default:
43
+ return undefined;
49
44
  }
50
45
  }
51
46
 
52
47
  function numericValue(
53
48
  name: string,
54
49
  material: MaterialSnapshot,
50
+ schema: readonly ParamSchemaEntry[],
51
+ allowStandardFallback = false,
55
52
  ): number | readonly number[] | undefined {
56
53
  const snapshotValue = material.paramSnapshot?.[name];
57
- return isNumericValue(snapshotValue) ? snapshotValue : numericFallback(name, material);
54
+ if (isNumericValue(snapshotValue)) return snapshotValue;
55
+ if (allowStandardFallback) {
56
+ const materialValue = numericFallback(name, material);
57
+ if (materialValue !== undefined) return materialValue;
58
+ }
59
+ const defaultValue = schema.find((entry) => entry.name === name)?.default;
60
+ if (isNumericValue(defaultValue)) return defaultValue;
61
+ return undefined;
58
62
  }
59
63
 
60
64
  function writeScalar(view: DataView, member: UboFieldLayout, value: number): void {
@@ -102,7 +106,9 @@ function writeVec4(view: DataView, offset: number, values: readonly number[]): v
102
106
  }
103
107
 
104
108
  function validateReceipt(receipt: MaterialShaderArtifactReceipt): void {
105
- const expectedFields = ROW.fields.map((field) => field.name);
109
+ const expectedFields = ROW.fields
110
+ .filter((field) => !field.name.startsWith('_gpuDrivenPadding'))
111
+ .map((field) => field.name);
106
112
  if (
107
113
  receipt.materialRow.byteLength !== ROW.stride ||
108
114
  receipt.materialRow.fields.length !== expectedFields.length ||
@@ -123,7 +129,11 @@ export function packStandardPbrMaterialRow(
123
129
  const payload = new Uint8Array(ROW.stride);
124
130
  const view = new DataView(payload.buffer);
125
131
  for (const member of STANDARD_PIPELINE_DERIVED.numericMembers) {
126
- writeNumeric(view, member, numericValue(member.name, material));
132
+ writeNumeric(
133
+ view,
134
+ member,
135
+ numericValue(member.name, material, STANDARD_PIPELINE_PARAM_SCHEMA, true),
136
+ );
127
137
  }
128
138
  for (const record of STANDARD_PIPELINE_DERIVED.coordinateRecords) {
129
139
  const coordinates = material.textureCoordinates?.get(record.parameter);
@@ -143,3 +153,42 @@ export function packStandardPbrMaterialRow(
143
153
  }
144
154
  return payload;
145
155
  }
156
+
157
+ /**
158
+ * Pack any producer-owned numeric/coordinate schema into the shared GPU Scene
159
+ * row page. Resource handles are intentionally absent: the scene-index shader
160
+ * reads texture/sampler bindings from the ordinary material group while this
161
+ * row carries only the values its generated `MaterialParameters` struct owns.
162
+ * `undefined` means the schema exceeds the page and must remain outside the
163
+ * capable lane.
164
+ */
165
+ export function packMaterialProgramRow(
166
+ schema: readonly ParamSchemaEntry[],
167
+ material: MaterialSnapshot,
168
+ rowStride = ROW.stride,
169
+ ): Uint8Array | undefined {
170
+ const derived = derive(schema);
171
+ if (derived.totalBytes > rowStride || rowStride < 16 || rowStride % 16 !== 0) return undefined;
172
+ const payload = new Uint8Array(rowStride);
173
+ const view = new DataView(payload.buffer);
174
+ for (const member of derived.numericMembers) {
175
+ writeNumeric(view, member, numericValue(member.name, material, schema));
176
+ }
177
+ for (const record of derived.coordinateRecords) {
178
+ const coordinates = material.textureCoordinates?.get(record.parameter);
179
+ const transform = coordinates?.transform;
180
+ writeVec4(view, record.offset, [
181
+ transform?.offset?.[0] ?? 0,
182
+ transform?.offset?.[1] ?? 0,
183
+ transform?.scale?.[0] ?? 1,
184
+ transform?.scale?.[1] ?? 1,
185
+ ]);
186
+ writeVec4(view, record.offset + 16, [
187
+ coordinates?.set ?? 0,
188
+ transform?.rotation ?? 0,
189
+ coordinates?.physicalUvScale?.[0] ?? 1,
190
+ coordinates?.physicalUvScale?.[1] ?? 1,
191
+ ]);
192
+ }
193
+ return payload;
194
+ }
@@ -444,6 +444,8 @@ export interface PbrCaps {
444
444
  readonly probeBlend?: boolean;
445
445
  /** Whether the device can carry the optional SpotLight projector texture. */
446
446
  readonly projectorAvailable?: boolean;
447
+ /** Omit unused backdrop slots on minimum-limit devices; physical slots stay fixed. */
448
+ readonly transmissionBackdrop?: boolean;
447
449
  }
448
450
 
449
451
  /**
@@ -777,6 +779,7 @@ export function shadowCasterVariantSet(
777
779
  skinned: boolean,
778
780
  gpuDrivenSceneIndex = false,
779
781
  alphaMask = false,
782
+ vertexColorAvailable = false,
780
783
  ): string {
781
784
  const skinningDisabled = !skinned;
782
785
  const defines: Record<string, boolean> = {
@@ -786,6 +789,7 @@ export function shadowCasterVariantSet(
786
789
  SKINNING_DISABLED: skinningDisabled,
787
790
  STORAGE_BUFFER_AVAILABLE: storageBuffer,
788
791
  };
792
+ if (vertexColorAvailable) defines.VERTEX_COLOR_AVAILABLE = true;
789
793
  return Object.entries(defines)
790
794
  .sort(([left], [right]) => (left < right ? -1 : left > right ? 1 : 0))
791
795
  .map(([name, value]) => `${name}=${String(value)}`)
@@ -1501,7 +1505,7 @@ export function buildBindGroupLayoutDescriptor(
1501
1505
  const afterIbl = [...userRegion, ...appendInjection(userRegion, 'ibl')];
1502
1506
  const afterTransmission = [...afterIbl, ...appendInjection(afterIbl, 'transmission')];
1503
1507
  const merged = [
1504
- ...afterTransmission,
1508
+ ...(options.caps?.transmissionBackdrop === false ? afterIbl : afterTransmission),
1505
1509
  ...appendTextureInjection(afterTransmission, physicalFields),
1506
1510
  ];
1507
1511
  // Scene-index Standard variants consume one producer-owned material row
@@ -1516,7 +1520,14 @@ export function buildBindGroupLayoutDescriptor(
1516
1520
  }
1517
1521
  return {
1518
1522
  label: 'pbr-material-skylight-bgl',
1519
- entries: merged,
1523
+ entries: [
1524
+ ...merged,
1525
+ {
1526
+ binding: 47,
1527
+ visibility: GPU_SHADER_STAGE_FRAGMENT,
1528
+ texture: { sampleType: 'float', viewDimension: 'cube' },
1529
+ },
1530
+ ],
1520
1531
  };
1521
1532
  }
1522
1533
  case 'unlit-material': {