@forgeax/engine-render 0.1.33 → 0.1.34

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 (518) hide show
  1. package/README.md +1010 -124
  2. package/dist/assembly/backend-contract.d.ts +2 -0
  3. package/dist/assembly/backend-contract.d.ts.map +1 -1
  4. package/dist/assembly/barrel-distortion-inspection.d.ts +3 -0
  5. package/dist/assembly/barrel-distortion-inspection.d.ts.map +1 -0
  6. package/dist/assembly/canvas-draw-guard.d.ts +3 -0
  7. package/dist/assembly/canvas-draw-guard.d.ts.map +1 -0
  8. package/dist/assembly/cloud-shadow-entry.d.ts +4 -0
  9. package/dist/assembly/cloud-shadow-entry.d.ts.map +1 -0
  10. package/dist/assembly/dynamic-geometry-host.d.ts +4 -1
  11. package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
  12. package/dist/assembly/dynamic-geometry-runtime.d.ts +1 -1
  13. package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -1
  14. package/dist/assembly/factory.d.ts +1 -1
  15. package/dist/assembly/factory.d.ts.map +1 -1
  16. package/dist/assembly/host-contract.d.ts +3 -3
  17. package/dist/assembly/host-contract.d.ts.map +1 -1
  18. package/dist/assembly/material/assembly.d.ts.map +1 -1
  19. package/dist/assembly/material/pipeline-helpers.d.ts +5 -0
  20. package/dist/assembly/material/pipeline-helpers.d.ts.map +1 -1
  21. package/dist/assembly/material-shader-policy.d.ts +16 -2
  22. package/dist/assembly/material-shader-policy.d.ts.map +1 -1
  23. package/dist/assembly/material-shader-prewarm.d.ts.map +1 -1
  24. package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -1
  25. package/dist/assembly/recovery/renderer-recover.d.ts +2 -0
  26. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  27. package/dist/assembly/render-feature-post-processes.d.ts +6 -0
  28. package/dist/assembly/render-feature-post-processes.d.ts.map +1 -0
  29. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  30. package/dist/assembly/renderer-feature-inspection.d.ts +1 -1
  31. package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -1
  32. package/dist/assembly/renderer-frame-transaction.d.ts +12 -0
  33. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  34. package/dist/assembly/renderer-inspection.d.ts +11 -0
  35. package/dist/assembly/renderer-inspection.d.ts.map +1 -1
  36. package/dist/assembly/webgpu-pbr-ready.d.ts +1 -0
  37. package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -1
  38. package/dist/assembly/webgpu-ready-per-pass.d.ts +39 -0
  39. package/dist/assembly/webgpu-ready-per-pass.d.ts.map +1 -0
  40. package/dist/assembly/webgpu-ready.d.ts +1 -1
  41. package/dist/assembly/webgpu-ready.d.ts.map +1 -1
  42. package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -1
  43. package/dist/assembly/webgpu-renderer-observation-owner.d.ts +35 -0
  44. package/dist/assembly/webgpu-renderer-observation-owner.d.ts.map +1 -0
  45. package/dist/assembly/webgpu-renderer.d.ts +1 -1
  46. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  47. package/dist/authoring.mjs +1 -1
  48. package/dist/barrel-distortion.d.ts +47 -0
  49. package/dist/barrel-distortion.d.ts.map +1 -0
  50. package/dist/{chunk-PA5DRJNI.mjs → chunk-ELJFJ2BU.mjs} +2 -2
  51. package/dist/chunk-ELJFJ2BU.mjs.map +1 -0
  52. package/dist/{chunk-ZDQWGQW7.mjs → chunk-HEB564WF.mjs} +4 -4
  53. package/dist/{chunk-ZDQWGQW7.mjs.map → chunk-HEB564WF.mjs.map} +1 -1
  54. package/dist/{chunk-VOZWDM3L.mjs → chunk-MKDIT2EM.mjs} +1307 -188
  55. package/dist/chunk-MKDIT2EM.mjs.map +1 -0
  56. package/dist/{chunk-LEAXOMYJ.mjs → chunk-OCDLEI6I.mjs} +3 -3
  57. package/dist/{chunk-LEAXOMYJ.mjs.map → chunk-OCDLEI6I.mjs.map} +1 -1
  58. package/dist/chunk-ODZWR6JQ.mjs +4927 -0
  59. package/dist/chunk-ODZWR6JQ.mjs.map +1 -0
  60. package/dist/{chunk-3RTCJTH4.mjs → chunk-SHFUFJ5N.mjs} +184 -13
  61. package/dist/chunk-SHFUFJ5N.mjs.map +1 -0
  62. package/dist/{chunk-OO3DRYK7.mjs → chunk-UI5SFODX.mjs} +176 -96
  63. package/dist/chunk-UI5SFODX.mjs.map +1 -0
  64. package/dist/{chunk-PLAXOOX5.mjs → chunk-UINHLCZA.mjs} +561 -79
  65. package/dist/chunk-UINHLCZA.mjs.map +1 -0
  66. package/dist/{chunk-NB2S7ZRX.mjs → chunk-WEX45HKH.mjs} +127 -386
  67. package/dist/chunk-WEX45HKH.mjs.map +1 -0
  68. package/dist/cloud/density.d.ts +55 -0
  69. package/dist/cloud/density.d.ts.map +1 -0
  70. package/dist/cloud/extract.d.ts +25 -0
  71. package/dist/cloud/extract.d.ts.map +1 -0
  72. package/dist/cloud/feature.d.ts +57 -0
  73. package/dist/cloud/feature.d.ts.map +1 -0
  74. package/dist/cloud/frame-context.d.ts +8 -0
  75. package/dist/cloud/frame-context.d.ts.map +1 -0
  76. package/dist/cloud/inspection.d.ts +59 -0
  77. package/dist/cloud/inspection.d.ts.map +1 -0
  78. package/dist/cloud/optics.d.ts +56 -0
  79. package/dist/cloud/optics.d.ts.map +1 -0
  80. package/dist/cloud/parameters.d.ts +73 -0
  81. package/dist/cloud/parameters.d.ts.map +1 -0
  82. package/dist/cloud/resources.d.ts +60 -0
  83. package/dist/cloud/resources.d.ts.map +1 -0
  84. package/dist/cloud/shadow.d.ts +42 -0
  85. package/dist/cloud/shadow.d.ts.map +1 -0
  86. package/dist/cloud/temporal.d.ts +74 -0
  87. package/dist/cloud/temporal.d.ts.map +1 -0
  88. package/dist/components/barrel-distortion.d.ts +13 -0
  89. package/dist/components/barrel-distortion.d.ts.map +1 -0
  90. package/dist/components/cloud-layer.d.ts +29 -0
  91. package/dist/components/cloud-layer.d.ts.map +1 -0
  92. package/dist/components/index.d.ts +2 -0
  93. package/dist/components/index.d.ts.map +1 -1
  94. package/dist/components/instances.d.ts +20 -6
  95. package/dist/components/instances.d.ts.map +1 -1
  96. package/dist/construct-renderer.d.ts +1 -1
  97. package/dist/construct-renderer.d.ts.map +1 -1
  98. package/dist/construct-renderer.mjs +6759 -2875
  99. package/dist/construct-renderer.mjs.map +1 -1
  100. package/dist/dynamic-geometry.d.ts +5 -1
  101. package/dist/dynamic-geometry.d.ts.map +1 -1
  102. package/dist/errors/cloud.d.ts +59 -0
  103. package/dist/errors/cloud.d.ts.map +1 -0
  104. package/dist/errors/render.d.ts +18 -4
  105. package/dist/errors/render.d.ts.map +1 -1
  106. package/dist/examples/single-layer-medium-surface.d.ts +47 -0
  107. package/dist/examples/single-layer-medium-surface.d.ts.map +1 -0
  108. package/dist/extract/camera.d.ts.map +1 -1
  109. package/dist/extract/contracts.d.ts +5 -1
  110. package/dist/extract/contracts.d.ts.map +1 -1
  111. package/dist/features/barrel-distortion.d.ts +29 -0
  112. package/dist/features/barrel-distortion.d.ts.map +1 -0
  113. package/dist/features/error-reporting.d.ts +6 -2
  114. package/dist/features/error-reporting.d.ts.map +1 -1
  115. package/dist/features/host.d.ts +10 -0
  116. package/dist/features/host.d.ts.map +1 -1
  117. package/dist/features/plan.d.ts +8 -0
  118. package/dist/features/plan.d.ts.map +1 -1
  119. package/dist/features/render-graph-contribution.d.ts +5 -0
  120. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  121. package/dist/features/render-graph-raster.d.ts +1 -0
  122. package/dist/features/render-graph-raster.d.ts.map +1 -1
  123. package/dist/features/targets.d.ts +2 -0
  124. package/dist/features/targets.d.ts.map +1 -1
  125. package/dist/features/types.d.ts +44 -0
  126. package/dist/features/types.d.ts.map +1 -1
  127. package/dist/fullscreen-post-process-pass.d.ts +15 -7
  128. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  129. package/dist/gpu-dirty-ranges.d.ts +11 -0
  130. package/dist/gpu-dirty-ranges.d.ts.map +1 -0
  131. package/dist/gpu-driven/batch-topology.d.ts +17 -0
  132. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  133. package/dist/gpu-driven/material-artifacts.d.ts +6 -0
  134. package/dist/gpu-driven/material-artifacts.d.ts.map +1 -1
  135. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  136. package/dist/gpu-driven/production-raster-material.d.ts +178 -0
  137. package/dist/gpu-driven/production-raster-material.d.ts.map +1 -0
  138. package/dist/gpu-driven/production-raster.d.ts +47 -3
  139. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  140. package/dist/gpu-driven/resource-allocation.d.ts +31 -0
  141. package/dist/gpu-driven/resource-allocation.d.ts.map +1 -0
  142. package/dist/gpu-driven/shadow-ownership.d.ts +14 -0
  143. package/dist/gpu-driven/shadow-ownership.d.ts.map +1 -0
  144. package/dist/gpu-driven/view-gpu.d.ts +26 -2
  145. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  146. package/dist/gpu-scene.d.ts +5 -0
  147. package/dist/gpu-scene.d.ts.map +1 -1
  148. package/dist/hdrp-buffers.d.ts +2 -2
  149. package/dist/hdrp-buffers.d.ts.map +1 -1
  150. package/dist/ibl/skylight-bind-group.d.ts +10 -1
  151. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  152. package/dist/index.d.ts +27 -7
  153. package/dist/index.d.ts.map +1 -1
  154. package/dist/index.mjs +258 -8
  155. package/dist/index.mjs.map +1 -1
  156. package/dist/inspection-types.d.ts +135 -1
  157. package/dist/inspection-types.d.ts.map +1 -1
  158. package/dist/instance-buffer-cache.d.ts +4 -4
  159. package/dist/instance-buffer-cache.d.ts.map +1 -1
  160. package/dist/instances.d.ts +48 -100
  161. package/dist/instances.d.ts.map +1 -1
  162. package/dist/internal.mjs +7 -7
  163. package/dist/pbr-pipeline.d.ts +19 -1
  164. package/dist/pbr-pipeline.d.ts.map +1 -1
  165. package/dist/pipeline/single-layer-medium-passes.d.ts +73 -0
  166. package/dist/pipeline/single-layer-medium-passes.d.ts.map +1 -0
  167. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  168. package/dist/pipeline/standard-output/graph.d.ts.map +1 -1
  169. package/dist/pipeline/standard-output/types.d.ts +4 -2
  170. package/dist/pipeline/standard-output/types.d.ts.map +1 -1
  171. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  172. package/dist/pipeline/standard-post.d.ts.map +1 -1
  173. package/dist/pipeline-builder.d.ts +1 -1
  174. package/dist/pipeline-builder.d.ts.map +1 -1
  175. package/dist/plugin.d.ts.map +1 -1
  176. package/dist/prepare/prepared-graphics-resolver.d.ts +2 -0
  177. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  178. package/dist/record/barrel-distortion-frame.d.ts +15 -0
  179. package/dist/record/barrel-distortion-frame.d.ts.map +1 -0
  180. package/dist/record/dynamic-geometry-consumption.d.ts +10 -2
  181. package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -1
  182. package/dist/record/fold-buckets.d.ts +95 -0
  183. package/dist/record/fold-buckets.d.ts.map +1 -0
  184. package/dist/record/fold-instance-buffer.d.ts +6 -0
  185. package/dist/record/fold-instance-buffer.d.ts.map +1 -0
  186. package/dist/record/frame-lighting.d.ts +1 -0
  187. package/dist/record/frame-lighting.d.ts.map +1 -1
  188. package/dist/record/frame-snapshot.d.ts +37 -3
  189. package/dist/record/frame-snapshot.d.ts.map +1 -1
  190. package/dist/record/frame.d.ts +10 -61
  191. package/dist/record/frame.d.ts.map +1 -1
  192. package/dist/record/gpu-draw-receipts.d.ts +11 -0
  193. package/dist/record/gpu-draw-receipts.d.ts.map +1 -0
  194. package/dist/record/gpu-timing.d.ts +8 -0
  195. package/dist/record/gpu-timing.d.ts.map +1 -1
  196. package/dist/record/main-pass-geometry.d.ts +21 -5
  197. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  198. package/dist/record/main-pass-material.d.ts +7 -1
  199. package/dist/record/main-pass-material.d.ts.map +1 -1
  200. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  201. package/dist/record/main-pass.d.ts +13 -2
  202. package/dist/record/main-pass.d.ts.map +1 -1
  203. package/dist/record/motion-blur-receipt.d.ts +11 -0
  204. package/dist/record/motion-blur-receipt.d.ts.map +1 -0
  205. package/dist/record/probe-blend-buffer.d.ts +16 -0
  206. package/dist/record/probe-blend-buffer.d.ts.map +1 -0
  207. package/dist/record/recovery-pipeline.d.ts.map +1 -1
  208. package/dist/record/render-context.d.ts +22 -3
  209. package/dist/record/render-context.d.ts.map +1 -1
  210. package/dist/record/shadow-pass.d.ts +2 -0
  211. package/dist/record/shadow-pass.d.ts.map +1 -1
  212. package/dist/record/skybox-post-pass.d.ts +1 -1
  213. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  214. package/dist/record/typed-frame-graph.d.ts +22 -2
  215. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  216. package/dist/record/view-ubo.d.ts +11 -3
  217. package/dist/record/view-ubo.d.ts.map +1 -1
  218. package/dist/record/volume-params.d.ts +9 -0
  219. package/dist/record/volume-params.d.ts.map +1 -0
  220. package/dist/recovery/render-system-candidate.d.ts +10 -0
  221. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  222. package/dist/reflection/record-owner.d.ts.map +1 -1
  223. package/dist/render-contract.d.ts +42 -4
  224. package/dist/render-contract.d.ts.map +1 -1
  225. package/dist/render-graph-primitives.d.ts.map +1 -1
  226. package/dist/render-pipeline.d.ts +103 -2
  227. package/dist/render-pipeline.d.ts.map +1 -1
  228. package/dist/render-system-extract-tail.d.ts +3 -2
  229. package/dist/render-system-extract-tail.d.ts.map +1 -1
  230. package/dist/render-system-extract.d.ts +16 -9
  231. package/dist/render-system-extract.d.ts.map +1 -1
  232. package/dist/render-system-presentation.d.ts +23 -0
  233. package/dist/render-system-presentation.d.ts.map +1 -0
  234. package/dist/render-system-producer-roots.d.ts +10 -0
  235. package/dist/render-system-producer-roots.d.ts.map +1 -0
  236. package/dist/render-system-residency.d.ts +12 -0
  237. package/dist/render-system-residency.d.ts.map +1 -0
  238. package/dist/render-system.d.ts +19 -14
  239. package/dist/render-system.d.ts.map +1 -1
  240. package/dist/scene/probe-blend.d.ts +27 -0
  241. package/dist/scene/probe-blend.d.ts.map +1 -1
  242. package/dist/scene/render-scene.d.ts +12 -5
  243. package/dist/scene/render-scene.d.ts.map +1 -1
  244. package/dist/ssao-buffers.d.ts +9 -0
  245. package/dist/ssao-buffers.d.ts.map +1 -1
  246. package/dist/surface/dynamic-input.d.ts +133 -0
  247. package/dist/surface/dynamic-input.d.ts.map +1 -0
  248. package/dist/surface/gpu-driven.d.ts +41 -0
  249. package/dist/surface/gpu-driven.d.ts.map +1 -0
  250. package/dist/surface/submission-observation.d.ts +136 -0
  251. package/dist/surface/submission-observation.d.ts.map +1 -0
  252. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  253. package/dist/temporal/gpu.d.ts +13 -1
  254. package/dist/temporal/gpu.d.ts.map +1 -1
  255. package/dist/temporal/index.mjs +5 -5
  256. package/dist/temporal/inspection.d.ts.map +1 -1
  257. package/dist/temporal/standard-scene-data.d.ts.map +1 -1
  258. package/dist/temporal/target-coverage-attachment.d.ts.map +1 -1
  259. package/dist/transmission/single-layer-medium.d.ts +89 -0
  260. package/dist/transmission/single-layer-medium.d.ts.map +1 -0
  261. package/dist/typed-render-graph-primitives.d.ts +14 -2
  262. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  263. package/dist/volume/component.d.ts +9 -4
  264. package/dist/volume/component.d.ts.map +1 -1
  265. package/dist/volume/extract.d.ts +1 -1
  266. package/dist/volume/extract.d.ts.map +1 -1
  267. package/dist/volume/inspection.d.ts +2 -0
  268. package/dist/volume/inspection.d.ts.map +1 -1
  269. package/dist/volume/passes.d.ts +4 -1
  270. package/dist/volume/passes.d.ts.map +1 -1
  271. package/dist/volume/resources.d.ts.map +1 -1
  272. package/package.json +22 -21
  273. package/src/__tests__/atmosphere-daylight.dawn.test.ts +72 -0
  274. package/src/__tests__/barrel-distortion-lkg.integration.test.ts +353 -0
  275. package/src/__tests__/barrel-distortion.dawn.test.ts +41 -0
  276. package/src/__tests__/barrel-distortion.unit.test.ts +364 -0
  277. package/src/__tests__/construct-renderer-identity.unit.test.ts +49 -0
  278. package/src/__tests__/detached-recovery-graph.unit.test.ts +277 -0
  279. package/src/__tests__/device-loss-fanout.unit.test.ts +36 -1
  280. package/src/__tests__/docs-gate-green.unit.test.ts +112 -1
  281. package/src/__tests__/factory-contract.integration.test.ts +295 -45
  282. package/src/__tests__/feature-depth-input.dawn.test.ts +129 -2
  283. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +14 -3
  284. package/src/__tests__/gpu-dirty-ranges.unit.test.ts +22 -0
  285. package/src/__tests__/gpu-driven-baseline.characterization.test.ts +16 -3
  286. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +12 -0
  287. package/src/__tests__/gpu-driven-material-artifacts.unit.test.ts +143 -0
  288. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +2 -2
  289. package/src/__tests__/gpu-driven-production.integration.test.ts +482 -3
  290. package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +6 -5
  291. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +94 -6
  292. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +18 -2
  293. package/src/__tests__/gpu-driven-view.browser.test.ts +5 -8
  294. package/src/__tests__/gpu-driven-view.dawn.test.ts +6 -2
  295. package/src/__tests__/gpu-driven-view.unit.test.ts +1 -1
  296. package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +1 -0
  297. package/src/__tests__/gpu-pass-timing.browser.test.ts +6 -4
  298. package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +1 -0
  299. package/src/__tests__/gpu-scene.unit.test.ts +119 -9
  300. package/src/__tests__/instance-allocation-failure.unit.test.ts +57 -0
  301. package/src/__tests__/instances-culling.integration.test.ts +10 -36
  302. package/src/__tests__/instances-store.unit.test.ts +97 -305
  303. package/src/__tests__/instances-world-ownership.integration.test.ts +62 -0
  304. package/src/__tests__/main-pass-material-medium-selection.unit.test.ts +146 -0
  305. package/src/__tests__/material-shader-prewarm.unit.test.ts +59 -0
  306. package/src/__tests__/material-snapshot-mutation.integration.test.ts +39 -1
  307. package/src/__tests__/morph-culling-reentry.dawn.test.ts +5 -5
  308. package/src/__tests__/morph-visual-evidence.integration.test.ts +8 -7
  309. package/src/__tests__/motion-blur-compute.dawn.test.ts +13 -7
  310. package/src/__tests__/motion-blur.pixel.integration.test.ts +2 -2
  311. package/src/__tests__/nineslice-handle-surface.unit.test.ts +4 -4
  312. package/src/__tests__/pbr-view-layout.unit.test.ts +9 -0
  313. package/src/__tests__/physical-clearcoat.integration.test.ts +58 -0
  314. package/src/__tests__/prepared-graphics-capability.unit.test.ts +66 -2
  315. package/src/__tests__/probe-bindings.unit.test.ts +582 -1
  316. package/src/__tests__/probe-scene-dirty.integration.test.ts +28 -1
  317. package/src/__tests__/receipt-observation-retirement.unit.test.ts +65 -0
  318. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +69 -0
  319. package/src/__tests__/render-error-code-owner.test-d.ts +7 -0
  320. package/src/__tests__/render-feature-diagnostics.unit.test.ts +15 -2
  321. package/src/__tests__/render-feature-error-reporting.unit.test.ts +21 -1
  322. package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +10 -1
  323. package/src/__tests__/render-feature-retry.unit.test.ts +12 -1
  324. package/src/__tests__/render-scene-mixed-updates.integration.test.ts +145 -19
  325. package/src/__tests__/render-scene-projection.unit.test.ts +36 -11
  326. package/src/__tests__/render-scene-temporal-retry.unit.test.ts +20 -20
  327. package/src/__tests__/render-target-probe-soak.perf.test.ts +2 -2
  328. package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +3 -3
  329. package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +5 -2
  330. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +41 -7
  331. package/src/__tests__/renderer-frame-generation-fence.integration.test.ts +16 -0
  332. package/src/__tests__/renderer-frame-transaction.integration.test.ts +26 -10
  333. package/src/__tests__/resource-allocation.unit.test.ts +123 -0
  334. package/src/__tests__/single-layer-medium-passes.unit.test.ts +275 -0
  335. package/src/__tests__/skin-motion-regression.unit.test.ts +70 -1
  336. package/src/__tests__/skin-palette-recycling.dawn.test.ts +97 -0
  337. package/src/__tests__/skinned-shadow-caster.test.ts +15 -0
  338. package/src/__tests__/ssr-carrier-public-contract.unit.test.ts +21 -0
  339. package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +4 -4
  340. package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +2 -2
  341. package/src/__tests__/ssr-gpu-dispatch.ts +1 -1
  342. package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +6 -2
  343. package/src/__tests__/standard-output-chain-contract.unit.test.ts +28 -0
  344. package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +46 -1
  345. package/src/__tests__/standard-pipeline.integration.test.ts +182 -1
  346. package/src/__tests__/surface-dynamic-buffer-lifecycle.unit.test.ts +506 -0
  347. package/src/__tests__/surface-submission-observation.unit.test.ts +812 -0
  348. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +32 -0
  349. package/src/__tests__/temporal-performance.integration.test.ts +3 -3
  350. package/src/__tests__/visibility-instances.integration.test.ts +7 -19
  351. package/src/__tests__/visibility-producer-matrix.integration.test.ts +9 -20
  352. package/src/__tests__/volume-optics-oracle.unit.test.ts +4 -2
  353. package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +30 -20
  354. package/src/__tests__/volumetric-fog-errors.unit.test.ts +4 -3
  355. package/src/__tests__/volumetric-fog-multiple.unit.test.ts +55 -0
  356. package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +1 -1
  357. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +113 -9
  358. package/src/__tests__/volumetric-fog-topology.unit.test.ts +5 -3
  359. package/src/assembly/backend-contract.ts +30 -0
  360. package/src/assembly/barrel-distortion-inspection.ts +22 -0
  361. package/src/assembly/canvas-draw-guard.ts +11 -0
  362. package/src/assembly/cloud-shadow-entry.ts +22 -0
  363. package/src/assembly/dynamic-geometry-host.ts +65 -37
  364. package/src/assembly/dynamic-geometry-runtime.ts +7 -1
  365. package/src/assembly/factory.ts +2 -30
  366. package/src/assembly/host-contract.ts +3 -3
  367. package/src/assembly/material/assembly.ts +25 -13
  368. package/src/assembly/material/pipeline-helpers.ts +53 -12
  369. package/src/assembly/material-shader-policy.ts +55 -0
  370. package/src/assembly/material-shader-prewarm.ts +21 -10
  371. package/src/assembly/recovery/device-loss-fanout.ts +13 -0
  372. package/src/assembly/recovery/renderer-recover.ts +41 -18
  373. package/src/assembly/render-feature-post-processes.ts +54 -0
  374. package/src/assembly/renderer-facade.ts +4 -1
  375. package/src/assembly/renderer-feature-inspection.ts +8 -2
  376. package/src/assembly/renderer-frame-transaction.ts +23 -0
  377. package/src/assembly/renderer-inspection.ts +28 -0
  378. package/src/assembly/skin-palette-owner.ts +1 -1
  379. package/src/assembly/temporal-post-process-prewarm.ts +3 -3
  380. package/src/assembly/webgpu-pbr-ready.ts +9 -1
  381. package/src/assembly/webgpu-ready-per-pass.ts +104 -0
  382. package/src/assembly/webgpu-ready.ts +115 -61
  383. package/src/assembly/webgpu-renderer-bootstrap.ts +0 -12
  384. package/src/assembly/webgpu-renderer-observation-owner.ts +222 -0
  385. package/src/assembly/webgpu-renderer.ts +214 -252
  386. package/src/assembly/webgpu-vertex-layouts.ts +1 -1
  387. package/src/barrel-distortion.ts +247 -0
  388. package/src/cloud/__tests__/cloud-density-parity.dawn.test.ts +173 -0
  389. package/src/cloud/__tests__/cloud-layer-framebuffer-y.dawn.test.ts +265 -0
  390. package/src/cloud/__tests__/cloud-layer.browser.test.ts +432 -0
  391. package/src/cloud/__tests__/cloud-layer.unit.test.ts +634 -0
  392. package/src/cloud/density.ts +600 -0
  393. package/src/cloud/extract.ts +110 -0
  394. package/src/cloud/feature.ts +1810 -0
  395. package/src/cloud/frame-context.ts +42 -0
  396. package/src/cloud/inspection.ts +130 -0
  397. package/src/cloud/optics.ts +285 -0
  398. package/src/cloud/parameters.ts +255 -0
  399. package/src/cloud/resources.ts +122 -0
  400. package/src/cloud/shadow.ts +167 -0
  401. package/src/cloud/temporal.ts +226 -0
  402. package/src/components/barrel-distortion.ts +46 -0
  403. package/src/components/cloud-layer.ts +47 -0
  404. package/src/components/index.ts +2 -0
  405. package/src/components/instances.ts +18 -45
  406. package/src/components/sprite-instances.ts +1 -1
  407. package/src/construct-renderer.ts +1 -1
  408. package/src/dynamic-geometry.ts +12 -1
  409. package/src/errors/cloud.ts +103 -0
  410. package/src/errors/render.ts +44 -7
  411. package/src/examples/single-layer-medium-surface.ts +59 -0
  412. package/src/extract/camera.ts +15 -1
  413. package/src/extract/contracts.ts +5 -0
  414. package/src/features/barrel-distortion.ts +172 -0
  415. package/src/features/error-reporting.ts +26 -6
  416. package/src/features/host.ts +115 -14
  417. package/src/features/plan.ts +8 -0
  418. package/src/features/render-graph-contribution.ts +9 -0
  419. package/src/features/render-graph-raster.ts +45 -3
  420. package/src/features/targets.ts +66 -0
  421. package/src/features/types.ts +47 -0
  422. package/src/fullscreen-post-process-pass.ts +41 -9
  423. package/src/gpu-dirty-ranges.ts +48 -0
  424. package/src/gpu-driven/batch-topology.ts +53 -0
  425. package/src/gpu-driven/material-artifacts.ts +33 -25
  426. package/src/gpu-driven/prepared-draw.ts +12 -4
  427. package/src/gpu-driven/production-raster-material.ts +1894 -0
  428. package/src/gpu-driven/production-raster.ts +825 -784
  429. package/src/gpu-driven/resource-allocation.ts +142 -0
  430. package/src/gpu-driven/shadow-ownership.ts +71 -0
  431. package/src/gpu-driven/view-gpu.ts +164 -10
  432. package/src/gpu-scene.ts +75 -84
  433. package/src/hdrp-buffers.ts +4 -3
  434. package/src/ibl/skylight-bind-group.ts +49 -7
  435. package/src/index.ts +196 -9
  436. package/src/inspection-types.ts +162 -0
  437. package/src/instance-buffer-cache.ts +4 -4
  438. package/src/instances.ts +149 -569
  439. package/src/pbr-pipeline.ts +219 -13
  440. package/src/pipeline/single-layer-medium-passes.ts +267 -0
  441. package/src/pipeline/standard-forward-lane.ts +313 -57
  442. package/src/pipeline/standard-output/graph.ts +8 -2
  443. package/src/pipeline/standard-output/types.ts +12 -1
  444. package/src/pipeline/standard-pipeline.ts +291 -18
  445. package/src/pipeline/standard-post.ts +90 -24
  446. package/src/pipeline-builder.ts +1 -1
  447. package/src/plugin.ts +4 -0
  448. package/src/points-lines/__tests__/points-lines.bench.ts +17 -8
  449. package/src/prepare/prepared-graphics-resolver.ts +2 -0
  450. package/src/record/__tests__/main-pass-geometry.unit.test.ts +30 -0
  451. package/src/record/__tests__/sprite-material-abi.unit.test.ts +1 -1
  452. package/src/record/__tests__/temporal-payload.unit.test.ts +1 -1
  453. package/src/record/__tests__/transparent-group2-selection.unit.test.ts +11 -0
  454. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +1 -0
  455. package/src/record/__tests__/view-ubo-layout.unit.test.ts +4 -3
  456. package/src/record/barrel-distortion-frame.ts +110 -0
  457. package/src/record/dynamic-geometry-consumption.ts +39 -9
  458. package/src/record/fold-buckets.ts +852 -0
  459. package/src/record/fold-instance-buffer.ts +51 -0
  460. package/src/record/frame-lighting.ts +36 -2
  461. package/src/record/frame-snapshot.ts +39 -3
  462. package/src/record/frame.ts +217 -1084
  463. package/src/record/gpu-draw-receipts.ts +38 -0
  464. package/src/record/gpu-timing.ts +48 -5
  465. package/src/record/main-pass-geometry.ts +251 -82
  466. package/src/record/main-pass-material.ts +66 -4
  467. package/src/record/main-pass-sprite-draws.ts +7 -65
  468. package/src/record/main-pass.ts +156 -20
  469. package/src/record/motion-blur-receipt.ts +91 -0
  470. package/src/record/probe-blend-buffer.ts +180 -0
  471. package/src/record/recovery-pipeline.ts +35 -3
  472. package/src/record/render-context.ts +39 -3
  473. package/src/record/shadow-pass.ts +30 -1
  474. package/src/record/skybox-post-pass.ts +28 -4
  475. package/src/record/typed-frame-graph.ts +770 -134
  476. package/src/record/view-ubo.ts +26 -3
  477. package/src/record/volume-params.ts +225 -0
  478. package/src/recovery/render-system-candidate.ts +235 -42
  479. package/src/reflection/record-owner.ts +7 -3
  480. package/src/render-contract.ts +48 -4
  481. package/src/render-graph-primitives.ts +7 -1
  482. package/src/render-pipeline.ts +130 -0
  483. package/src/render-system-extract-tail.ts +57 -61
  484. package/src/render-system-extract.ts +74 -76
  485. package/src/render-system-presentation.ts +56 -0
  486. package/src/render-system-producer-roots.ts +96 -0
  487. package/src/render-system-residency.ts +159 -0
  488. package/src/render-system.ts +347 -363
  489. package/src/scene/probe-blend.ts +96 -4
  490. package/src/scene/render-scene.ts +349 -280
  491. package/src/ssao-buffers.ts +95 -2
  492. package/src/surface/__tests__/dynamic-input.unit.test.ts +374 -0
  493. package/src/surface/__tests__/gpu-driven.unit.test.ts +87 -0
  494. package/src/surface/dynamic-input.ts +658 -0
  495. package/src/surface/gpu-driven.ts +147 -0
  496. package/src/surface/submission-observation.ts +517 -0
  497. package/src/systems/skin-palette-allocator.ts +4 -1
  498. package/src/temporal/gpu.ts +101 -17
  499. package/src/temporal/inspection.ts +7 -1
  500. package/src/temporal/standard-scene-data.ts +5 -0
  501. package/src/temporal/target-coverage-attachment.ts +4 -0
  502. package/src/transmission/__tests__/single-layer-medium.unit.test.ts +149 -0
  503. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +12 -11
  504. package/src/transmission/single-layer-medium.ts +322 -0
  505. package/src/typed-render-graph-primitives.ts +70 -2
  506. package/src/volume/component.ts +10 -9
  507. package/src/volume/extract.ts +11 -5
  508. package/src/volume/inspection.ts +3 -0
  509. package/src/volume/passes.ts +87 -4
  510. package/src/volume/resources.ts +2 -1
  511. package/dist/chunk-3RTCJTH4.mjs.map +0 -1
  512. package/dist/chunk-NB2S7ZRX.mjs.map +0 -1
  513. package/dist/chunk-NNQL7CB3.mjs +0 -1713
  514. package/dist/chunk-NNQL7CB3.mjs.map +0 -1
  515. package/dist/chunk-OO3DRYK7.mjs.map +0 -1
  516. package/dist/chunk-PA5DRJNI.mjs.map +0 -1
  517. package/dist/chunk-PLAXOOX5.mjs.map +0 -1
  518. package/dist/chunk-VOZWDM3L.mjs.map +0 -1
@@ -41,6 +41,7 @@ import type { DepthOfFieldSide } from './components/depth-of-field';
41
41
  import type { DirectionalShadowFilterLabel } from './components/directional-shadow-filter';
42
42
  import type { RenderError } from './errors/render';
43
43
  import type { RenderFeatureTargetKind } from './features/targets';
44
+ import type { RenderFeaturePlacement } from './features/types';
44
45
  import type { ShadowViewIdentity, ShadowViewProjection } from './gpu-driven/shadow-views';
45
46
  import {
46
47
  GPU_TEXTURE_USAGE_COPY_SRC,
@@ -249,6 +250,8 @@ export interface RenderPipelineTopology {
249
250
  readonly useFar: boolean;
250
251
  }
251
252
  | undefined;
253
+ /** Shape-only barrel admission; numeric mapping stays per-frame data. */
254
+ readonly barrelDistortion?: boolean | undefined;
252
255
  };
253
256
  /** Frame-stable Standard output policy; no raw RHI handles enter topology. */
254
257
  readonly output?: {
@@ -285,6 +288,10 @@ export interface RenderPipelineTopology {
285
288
  */
286
289
  readonly volumetricFog?: {
287
290
  readonly enabled: boolean;
291
+ readonly additional?: readonly {
292
+ readonly format: TextureFormat;
293
+ readonly extent: { readonly width: number; readonly height: number; readonly depth: number };
294
+ }[];
288
295
  readonly lightKind?: 'directional' | 'point' | 'spot' | undefined;
289
296
  readonly lightEntity?: number | undefined;
290
297
  readonly pointLightEntity?: number | undefined;
@@ -333,6 +340,8 @@ export interface RenderPipelineTopology {
333
340
  readonly standardLightingTopologySignature?: string | undefined;
334
341
  /** Internal graph fact; renderer callers do not configure transmission demand. */
335
342
  readonly transmissionDemand?: TransmissionDemand | undefined;
343
+ /** Whether the extracted frame contains a single-layer medium Surface. */
344
+ readonly singleLayerMedium?: boolean | undefined;
336
345
  }
337
346
 
338
347
  /** Resolve the built-in final-output dither policy from the pipeline asset. */
@@ -463,9 +472,30 @@ export interface RenderPipelineGpuDrivenProjection {
463
472
  pass: RhiRenderPassEncoder,
464
473
  resources: GraphResourceResolver,
465
474
  frameResources: GpuDrivenStandardPbrFrameResources,
475
+ filter?: RenderPipelineGpuDrivenFilter,
476
+ fragmentEntryPoint?: string,
466
477
  ): void;
467
478
  }
468
479
 
480
+ /** Material family selected by a typed scene pass for GPU-driven encoding. */
481
+ export type RenderPipelineGpuDrivenFilter =
482
+ | 'opaque'
483
+ | 'deferred-opaque'
484
+ | 'forward-only-opaque'
485
+ | 'single-layer-medium';
486
+
487
+ /** Graph-paired inputs available to a single-layer medium Surface pass. */
488
+ export interface RenderPipelineSurfaceMediumPair {
489
+ /** The resolved opaque scene color produced by the shared Standard owner. */
490
+ readonly opaqueColor: GraphTextureView;
491
+ /** Raw depth copy is backend-dependent and remains explicit when unavailable. */
492
+ readonly rawDepth:
493
+ | { readonly status: 'available'; readonly view: GraphTextureView }
494
+ | {
495
+ readonly status: 'unavailable';
496
+ readonly reason: 'depth-copy-unavailable';
497
+ };
498
+ }
469
499
  /** Exact scene rows selected by an indirect batch; palette offsets are global. */
470
500
  export interface GpuDrivenSceneMeshBinding {
471
501
  readonly meshBuffer: Buffer;
@@ -475,6 +505,8 @@ export interface GpuDrivenSceneMeshBinding {
475
505
 
476
506
  /** Producer-owned Standard PBR resources resolved during graph execution. */
477
507
  export interface GpuDrivenStandardPbrFrameResources {
508
+ /** Resource generation of the actual scene-index/indirect producer. */
509
+ readonly resourceGeneration?: number;
478
510
  readonly materialBindGroups: (BindGroup | undefined)[];
479
511
  /** Frame-global material slots keyed by the retained scene entity identity. */
480
512
  readonly materialSlotIndicesByEntity: Map<number, readonly number[]>;
@@ -485,6 +517,56 @@ export interface GpuDrivenStandardPbrFrameResources {
485
517
  colorFormats?: readonly TextureFormat[];
486
518
  /** Exact producer-owned numeric Material table consumed by scene-index PBR. */
487
519
  readonly sceneMaterialBuffer: Buffer;
520
+ /** Renderer-owned generic Surface page and frame/range metadata. */
521
+ readonly surfaceDynamicInput?: {
522
+ readonly page: Buffer;
523
+ readonly frame: Buffer;
524
+ readonly sharedFrame: Buffer;
525
+ readonly pageBytes: number;
526
+ readonly frameBytes: number;
527
+ readonly sharedFrameBytes: number;
528
+ };
529
+ /**
530
+ * Resolve the complete direct Surface slot-3 closure for one retained draw.
531
+ * The producer validates the stable draw identity and instance count before
532
+ * publishing a bind group; record never derives a frame-row address.
533
+ */
534
+ readonly surfaceDirectInstances?: (input: {
535
+ readonly worldId: number;
536
+ readonly entityKey: number;
537
+ readonly drawItemIndex: number;
538
+ readonly instanceCount: number;
539
+ readonly firstInstanceOrdinal?: number;
540
+ readonly instanceBuffer: Buffer;
541
+ readonly probeBuffer?: Buffer;
542
+ readonly probeOffset?: number;
543
+ }) => Result<
544
+ {
545
+ readonly bindGroup: BindGroup;
546
+ readonly dynamicOffsets: readonly number[];
547
+ readonly frameBase: number;
548
+ /** Public Surface member identities covered by the recorded command. */
549
+ readonly memberIds: readonly string[];
550
+ },
551
+ RhiError
552
+ >;
553
+ /** Frame-local sink fed only by actual Surface draw commands. */
554
+ readonly surfaceSubmissionObservation?: import('./surface/submission-observation').SurfaceSubmissionCandidate;
555
+ /** Existing Standard clustered group(2), supplied by the main-pass owner. */
556
+ clusterBindGroup?: BindGroup | undefined;
557
+ /** Rebind the same cluster resources around one batch-local mesh row page. */
558
+ clusterBindGroupForMesh?:
559
+ | ((meshBuffer: Buffer, bindingBytes: number) => BindGroup | undefined)
560
+ | undefined;
561
+ /** Rebind clustered lighting around the scene-index Mesh/Palette/Morph page. */
562
+ clusterBindGroupForSkin?:
563
+ | ((
564
+ meshBuffer: Buffer,
565
+ meshBindingBytes: number,
566
+ paletteBuffer: Buffer,
567
+ paletteBindingWindowBytes: number,
568
+ ) => BindGroup | undefined)
569
+ | undefined;
488
570
  resolveClusteredMeshBindGroup?: (binding: GpuDrivenSceneMeshBinding) => BindGroup;
489
571
  }
490
572
 
@@ -512,6 +594,8 @@ export interface RenderPipelineBuildContext<FrameCtx extends RenderPipelineFrame
512
594
  * inferring rgba16float support from the selected surface format.
513
595
  */
514
596
  readonly capabilities?: Pick<RhiCaps, 'rgba16floatRenderable'>;
597
+ /** Renderer-derived cloud shadow size shared by graph allocation and projection. */
598
+ readonly cloudShadowResolution?: number;
515
599
  /** Prepared typed graph resources owned by RenderSystem/RenderFrameState. */
516
600
  readonly standardOutput?: {
517
601
  readonly autoExposure?: {
@@ -541,6 +625,19 @@ export interface RenderPipelineBuildContext<FrameCtx extends RenderPipelineFrame
541
625
  readonly currentStability: RenderPipelineTarget;
542
626
  readonly previousStability: RenderPipelineTarget;
543
627
  };
628
+ /**
629
+ * Renderer-owned CloudLayer transport history. Each pair is backed by the
630
+ * same submit-fenced temporal owner as TAA, while the three attachments keep
631
+ * radiance, transmittance and representative depth in separate typed lanes.
632
+ */
633
+ readonly cloudHistory?: {
634
+ readonly currentRadiance: RenderPipelineTarget;
635
+ readonly previousRadiance: RenderPipelineTarget;
636
+ readonly currentTransmittance: RenderPipelineTarget;
637
+ readonly previousTransmittance: RenderPipelineTarget;
638
+ readonly currentDepth: RenderPipelineTarget;
639
+ readonly previousDepth: RenderPipelineTarget;
640
+ };
544
641
  /** Renderer-owned SSR temporal history targets for the admitted spatial chain. */
545
642
  readonly ssrHistory?: {
546
643
  readonly previous: RenderPipelineTarget;
@@ -573,6 +670,15 @@ export interface RenderPipelineBuildContext<FrameCtx extends RenderPipelineFrame
573
670
  semanticTargets?: readonly RenderPipelineTarget[],
574
671
  namedTargets?: Readonly<Record<string, RenderPipelineTarget>>,
575
672
  standardSurfaceAccesses?: readonly GraphAccess[],
673
+ featureSelectionOrPlacement?:
674
+ | {
675
+ /** Project only these identities at this ordered stage. */
676
+ readonly include?: readonly string[];
677
+ /** Keep these identities for a later ordered stage. */
678
+ readonly exclude?: readonly string[];
679
+ }
680
+ | RenderFeaturePlacement,
681
+ passNames?: readonly string[],
576
682
  ): Result<void, RenderPipelineBuildError>;
577
683
  /** Prepare feature-owned shadow draws and their early compute producers once. */
578
684
  contributeShadowFeatures?(): Result<
@@ -585,6 +691,30 @@ export interface RenderPipelineBuildContext<FrameCtx extends RenderPipelineFrame
585
691
  ): Result<void, RenderPipelineBuildError>;
586
692
  /** Whether a producer-owned feature is installed for this graph build. */
587
693
  hasFeature?(identity: string): boolean;
694
+ /** Whether a producer-owned feature has executable work at this graph build. */
695
+ hasFeatureWork?(identity: string, placement?: RenderFeaturePlacement): boolean;
696
+ /** Whether a producer-owned feature has a resolved raster pass this frame. */
697
+ hasFeatureRasterWork?(identity: string, placement?: RenderFeaturePlacement): boolean;
698
+ }
699
+
700
+ /** Project the six CloudLayer history attachments into feature target aliases. */
701
+ export function renderPipelineCloudHistoryTargets(input: {
702
+ readonly currentRadiance: RenderPipelineTarget;
703
+ readonly previousRadiance: RenderPipelineTarget;
704
+ readonly currentTransmittance: RenderPipelineTarget;
705
+ readonly previousTransmittance: RenderPipelineTarget;
706
+ readonly currentDepth: RenderPipelineTarget;
707
+ readonly previousDepth: RenderPipelineTarget;
708
+ }): readonly RenderPipelineFeatureTarget[] {
709
+ const entries: readonly (readonly [string, RenderPipelineTarget])[] = [
710
+ ['cloud-history-radiance-previous', input.previousRadiance],
711
+ ['cloud-history-radiance-current', input.currentRadiance],
712
+ ['cloud-history-transmittance-previous', input.previousTransmittance],
713
+ ['cloud-history-transmittance-current', input.currentTransmittance],
714
+ ['cloud-history-depth-previous', input.previousDepth],
715
+ ['cloud-history-depth-current', input.currentDepth],
716
+ ];
717
+ return entries.map(([name, target]) => ({ name, kind: 'scene-color' as const, ...target }));
588
718
  }
589
719
 
590
720
  export type RenderPipelineBuildError = RenderGraphError | RenderError | RhiError;
@@ -37,11 +37,11 @@ import {
37
37
  ASSET_ERROR_HINTS,
38
38
  AssetError,
39
39
  derive,
40
- err,
41
40
  handleSlot,
42
41
  materialValuesToLinearRuntime,
43
42
  toShared,
44
43
  } from '@forgeax/engine-types';
44
+ import { type ExtractedCloudLayer, extractCloudLayer } from './cloud/extract';
45
45
  import {
46
46
  Atmosphere,
47
47
  DirectionalLight,
@@ -92,11 +92,7 @@ import type {
92
92
  RenderFeatureWorldVisibilitySnapshot,
93
93
  } from './features/types';
94
94
  import { ensureGlyphMeshMaterialSlots } from './glyph-text-layout-system';
95
- import {
96
- InstanceCollectionError,
97
- type InstanceCollectionId,
98
- type InstanceCollectionStore,
99
- } from './instances';
95
+ import { type InstanceProjectionStore, validateInstanceTransforms } from './instances';
100
96
  import { deriveInstancesUnionBounds } from './instances-derived-bounds';
101
97
  import {
102
98
  type MeshMaterialBindingDiagnostic,
@@ -234,11 +230,12 @@ export function extractFrames(
234
230
  request?: {
235
231
  readonly vertexColorAvailable?: boolean;
236
232
  readonly deformation?: 'rigid' | 'skin';
233
+ readonly variantSet?: string;
237
234
  readonly pass?: 'forward' | 'shadow' | 'depth';
238
235
  readonly address?: 'direct' | 'scene-index';
239
236
  },
240
237
  ) => MaterialShaderArtifact | undefined;
241
- readonly instanceCollections?: InstanceCollectionStore;
238
+ readonly instanceCollections?: InstanceProjectionStore;
242
239
  } = {},
243
240
  ): ExtractedFrame {
244
241
  // w4: normalize the owner argument. A bare number is the legacy single-owner
@@ -569,6 +566,7 @@ export function extractFrames(
569
566
  };
570
567
 
571
568
  const volumetricFog = resourceOwnerFrame?.volumetricFog;
569
+ const cloudLayer = resourceOwnerFrame?.cloudLayer;
572
570
  const skylight = resourceOwnerFrame?.skylight;
573
571
  const skylightCount = resourceOwnerFrame?.skylightCount ?? 0;
574
572
  const skybox = resourceOwnerFrame?.skybox;
@@ -651,6 +649,7 @@ export function extractFrames(
651
649
  ...(volumetricFog === undefined
652
650
  ? {}
653
651
  : { volumetricFog: { ...volumetricFog, worldId: resourceOwner } }),
652
+ ...(cloudLayer === undefined ? {} : { cloudLayer }),
654
653
  renderables,
655
654
  dispatch: dispatchEntries,
656
655
  shadowCasterEntityKeys,
@@ -795,6 +794,16 @@ export function extractFrame(world: World, context: PreparedExtractContext): Ext
795
794
  // calls survive untouched, only the entity source changes).
796
795
  const worldInternal = createWorldInternalView(world);
797
796
  let volumetricFog = extractVolumeSnapshot(world, assets, worldInternal);
797
+ let cloudLayer: ExtractedCloudLayer | undefined;
798
+ const extractedCloudLayer = extractCloudLayer(world);
799
+ if (extractedCloudLayer.ok) {
800
+ cloudLayer = extractedCloudLayer.value;
801
+ } else {
802
+ worldInternal._routeError(extractedCloudLayer.error, {
803
+ severity: Severity.Error,
804
+ systemName: 'RenderSystem.extract (cloud-layer)',
805
+ });
806
+ }
798
807
 
799
808
  const cameraRoles = selectCameraRoles(world, context.cameraEntityKey);
800
809
  const cameras = [...cameraRoles.display];
@@ -1708,13 +1717,6 @@ export function extractFrame(world: World, context: PreparedExtractContext): Ext
1708
1717
  // extraction. Shared handles are immutable inputs for the frame, while
1709
1718
  // dispatch entries still need to be rebuilt for each entity.
1710
1719
  const materialSnapshotCache: MaterialSnapshotCache = new Map();
1711
- // A collection can be associated with more than one entity. Snapshot its
1712
- // renderer-owned bytes once per extracted frame so culling and every
1713
- // submission lane consume the same detached revision without repeat copies.
1714
- const instanceSnapshotCache = new Map<
1715
- InstanceCollectionId,
1716
- ReturnType<InstanceCollectionStore['snapshot']>
1717
- >();
1718
1720
  const skinnedMaterialSnapshotCache: MaterialSnapshotCache = new Map();
1719
1721
  // tweak-20260611 M1: MeshRenderer renderable archetype walk routes
1720
1722
  // through one World-owned Query. K-2 sniffing scheme B
@@ -1779,22 +1781,25 @@ export function extractFrame(world: World, context: PreparedExtractContext): Ext
1779
1781
  const flushPendingDispatch = (pending: readonly DispatchEntry[]): void => {
1780
1782
  for (const entry of pending) dispatch.push(entry);
1781
1783
  };
1782
- for (const row of meshRendererQuery) {
1783
- if (
1784
- context.renderables === 'full' &&
1785
- renderableEntities !== undefined &&
1786
- !renderableEntities.has(row.entity)
1787
- ) {
1788
- continue;
1789
- }
1784
+ const requestedRows =
1785
+ renderableEntities === undefined
1786
+ ? meshRendererQuery
1787
+ : {
1788
+ *[Symbol.iterator]() {
1789
+ for (const entity of renderableEntities) {
1790
+ const row = meshRendererQuery.at(entity as EntityHandle);
1791
+ if (row !== undefined) yield row;
1792
+ }
1793
+ },
1794
+ };
1795
+ for (const row of requestedRows) {
1790
1796
  // K-2 archetype-edge sniff (scheme B): a missing optional component
1791
1797
  // surfaces as an absent bundle key, not a row-internal optional chain.
1792
1798
  // Presence-only checks use QueryRow.has so large array-bearing components
1793
1799
  // are not materialised merely to answer a boolean question.
1794
1800
  const hasTransform = row.has(Transform);
1795
1801
  const meshFilter = row.get(MeshFilter);
1796
- const instancesData = row.get(Instances);
1797
- const hasInstances = instancesData !== undefined;
1802
+ const hasInstances = row.has(Instances);
1798
1803
  const skin = row.get(Skin);
1799
1804
  const morphWeightsView = worldInternal._getArrayView(row.entity, MorphWeights, 'weights');
1800
1805
  const hasMeshFilter = meshFilter !== undefined;
@@ -2574,6 +2579,16 @@ export function extractFrame(world: World, context: PreparedExtractContext): Ext
2574
2579
  baseColor,
2575
2580
  metallic: metallicPv,
2576
2581
  roughness: roughnessPv,
2582
+ ...(resolved.surface?.model === undefined
2583
+ ? {}
2584
+ : { surfaceModel: resolved.surface.model }),
2585
+ deferredPass: allPasses.some(
2586
+ (pass) =>
2587
+ String(
2588
+ (pass.renderState?.tags as Record<string, unknown> | undefined)?.LightMode ??
2589
+ pass.name,
2590
+ ) === 'Deferred',
2591
+ ),
2577
2592
  ...(specularColorPv !== undefined && {
2578
2593
  specularColor: [
2579
2594
  specularColorPv[0] ?? 1,
@@ -3073,49 +3088,29 @@ export function extractFrame(world: World, context: PreparedExtractContext): Ext
3073
3088
  // make the cull and draw disagree within one frame).
3074
3089
  let instancesSnap: InstancesSnapshot | undefined;
3075
3090
  if (hasInstances) {
3076
- const collectionId = instancesData?.collectionId as InstanceCollectionId | undefined;
3077
- let collectionResult =
3078
- collectionId !== undefined ? instanceSnapshotCache.get(collectionId) : undefined;
3079
- if (collectionResult === undefined) {
3080
- collectionResult =
3081
- collectionId !== undefined && collectionId > 0 && instanceCollections !== undefined
3082
- ? instanceCollections.snapshot(collectionId)
3083
- : err(
3084
- new InstanceCollectionError(
3085
- 'instance-collection-invalid',
3086
- 'Instances.collectionId references a live renderer-owned collection',
3087
- 'create the collection through renderer.instances before attaching Instances',
3088
- {
3089
- operation: 'inspect',
3090
- expected: 'a positive collectionId with a live renderer owner',
3091
- actual: Number(collectionId ?? 0),
3092
- ...(collectionId === undefined ? {} : { collectionId }),
3093
- },
3094
- ),
3095
- );
3096
- if (collectionId !== undefined)
3097
- instanceSnapshotCache.set(collectionId, collectionResult);
3098
- }
3099
- if (collectionResult === undefined) continue;
3100
- if (!collectionResult.ok) {
3101
- worldInternal._routeError(collectionResult.error, {
3091
+ const transforms =
3092
+ worldInternal._getArrayView(entity, Instances, 'transforms') ?? new Float32Array();
3093
+ const invalid = validateInstanceTransforms(transforms);
3094
+ if (invalid !== undefined) {
3095
+ worldInternal._routeError(invalid, {
3102
3096
  severity: Severity.Error,
3103
- systemName: 'RenderSystem.extract (Instances collection)',
3097
+ systemName: 'RenderSystem.extract (Instances transforms)',
3104
3098
  });
3105
3099
  continue;
3106
3100
  }
3101
+ const projected = instanceCollections?.project(world, entity, transforms);
3107
3102
  instancesSnap = {
3108
- transforms: collectionResult.value.transforms,
3109
- generations: collectionResult.value.generations,
3110
- instanceCount: collectionResult.value.count,
3111
- collectionId: collectionResult.value.collectionId,
3112
- revision: collectionResult.value.revision,
3113
- capacity: collectionResult.value.capacity,
3114
- dirtyRanges: collectionResult.value.dirtyRanges,
3103
+ transforms: projected?.transforms ?? new Float32Array(transforms),
3104
+ instanceCount: transforms.length / 16,
3115
3105
  cacheKey: entity,
3116
- // Explicit collection revisions supersede ECS archetype content
3117
- // hashes; retain zero as the legacy sprite-only field value.
3118
- archVersion: 0,
3106
+ archVersion: projected === undefined ? archVersion : 0,
3107
+ ...(projected === undefined
3108
+ ? {}
3109
+ : {
3110
+ collectionId: projected.collectionId,
3111
+ revision: projected.revision,
3112
+ generations: projected.generations,
3113
+ }),
3119
3114
  };
3120
3115
  }
3121
3116
 
@@ -3391,6 +3386,7 @@ export function extractFrame(world: World, context: PreparedExtractContext): Ext
3391
3386
  environment,
3392
3387
  environmentReady: true,
3393
3388
  ...(volumetricFog === undefined ? {} : { volumetricFog }),
3389
+ ...(cloudLayer === undefined ? {} : { cloudLayer }),
3394
3390
  renderables,
3395
3391
  dispatch,
3396
3392
  shadowCasterEntityKeys,