@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
@@ -1,8 +1,8 @@
1
1
  import { GlyphText } from './chunk-ILQ5MEZF.mjs';
2
- import { MeshRenderer, MeshFilter, DirectionalLight, validateDirectionalLightData, PointLight, computeInvRangeSquared, SpotLight, degToCos, RectAreaLight, validateRectAreaLightData, directionalShadowQualityFromF32, PointLightShadow, Skylight, LightProbe, validateLightProbeData, SkyboxBackground, Atmosphere, selectEnvironment, Instances, Layer, Points, Lines, SortKey, resolveMeshMaterialBindings, pointShapeFromU32, PostProcessParams, buildCubeCameraFaceViews, CubeCamera, cubeCameraUpdateIntentFromF32, ReflectionProbe, reflectionProbeUpdateIntentFromF32, tonemapToU32, resolveVisibility, Fog, VolumetricFog, resolveSelectedVolumetricLight, extractVolumetricFog, MotionBlur, DynamicResolution, ScreenSpaceReflection, DepthOfField, Camera, cameraProjectionFromF32, resolveDepthOfFieldParams, depthOfFieldRequestFailure, CAMERA_EXPOSURE_MODE_MANUAL, cameraExposureFromColumns, antialiasFromF32, validateDynamicResolutionCamera, validateCameraBloom, tonemapFromF32 } from './chunk-PLAXOOX5.mjs';
3
- import { SpriteRegionOverride, SpriteInstances, selectActiveCameraIndex, getActiveCamera } from './chunk-PA5DRJNI.mjs';
4
- import { PROBE_BLEND_RECORD_CAPACITY, GPU_BUFFER_USAGE_MAP_READ, GPU_BUFFER_USAGE_VERTEX, GPU_BUFFER_USAGE_COPY_DST, gpuDrivenShadowDrawKey, IES_SLICE_CAPACITY, COOKIE_SLICE_CAPACITY, isStandardPbrSkinMaterialShader, buildGpuDrivenDraws, worldEntityKey, gpuDrivenSourceDrawItemIndex, selectPasses, resolveRenderTargetMaterialSource, isCanonicalStandardPbrMaterialShader, PROBE_BLEND_RECORD_BYTE_SIZE, GPU_BUFFER_USAGE_UNIFORM, GPU_BUFFER_USAGE_QUERY_RESOLVE, GPU_BUFFER_USAGE_COPY_SRC, COOKIE_SLICE_SIZE, isStandardPbrMaterialShader } from './chunk-3RTCJTH4.mjs';
5
- import { MotionBlurValidationError, STANDARD_OUTPUT_TRANSFORM_FEATURE_ID, SHADOW_ATLAS_DEFAULT_LAYERS, MaterialSkinAttrMissingError, SkinMaterialMismatchError, InstanceCollectionError, ShadowInvalidConfigError, resolveMotionBlurParams, GPU_TEXTURE_USAGE_COPY_SRC, GPU_TEXTURE_USAGE_COPY_DST, GPU_TEXTURE_USAGE_TEXTURE_BINDING, GPU_TEXTURE_USAGE_STORAGE_BINDING, GPU_TEXTURE_USAGE_RENDER_ATTACHMENT } from './chunk-NB2S7ZRX.mjs';
2
+ import { freezeBarrelDistortionMapping, MeshRenderer, MeshFilter, DirectionalLight, extractCloudLayer, validateDirectionalLightData, PointLight, computeInvRangeSquared, SpotLight, degToCos, RectAreaLight, validateRectAreaLightData, directionalShadowQualityFromF32, PointLightShadow, Skylight, LightProbe, validateLightProbeData, SkyboxBackground, Atmosphere, selectEnvironment, Instances, Layer, Points, Lines, SortKey, resolveMeshMaterialBindings, pointShapeFromU32, PostProcessParams, buildCubeCameraFaceViews, CubeCamera, cubeCameraUpdateIntentFromF32, ReflectionProbe, reflectionProbeUpdateIntentFromF32, tonemapToU32, resolveVisibility, Fog, VolumetricFog, resolveSelectedVolumetricLight, extractVolumetricFog, MotionBlur, DynamicResolution, ScreenSpaceReflection, DepthOfField, BarrelDistortion, Camera, cameraProjectionFromF32, resolveDepthOfFieldParams, depthOfFieldRequestFailure, CAMERA_EXPOSURE_MODE_MANUAL, cameraExposureFromColumns, antialiasFromF32, validateDynamicResolutionCamera, validateBarrelDistortionParameters, validateCameraBloom, tonemapFromF32 } from './chunk-UINHLCZA.mjs';
3
+ import { SpriteRegionOverride, SpriteInstances, selectActiveCameraIndex, getActiveCamera } from './chunk-ELJFJ2BU.mjs';
4
+ import { PROBE_BLEND_RECORD_CAPACITY, GPU_BUFFER_USAGE_MAP_READ, GPU_BUFFER_USAGE_VERTEX, GPU_BUFFER_USAGE_COPY_DST, gpuDrivenShadowDrawKey, IES_SLICE_CAPACITY, COOKIE_SLICE_CAPACITY, isStandardPbrSkinMaterialShader, buildGpuDrivenDraws, worldEntityKey, gpuDrivenSourceDrawItemIndex, selectPasses, resolveRenderTargetMaterialSource, isCanonicalStandardPbrMaterialShader, PROBE_BLEND_RECORD_BYTE_SIZE, GPU_BUFFER_USAGE_UNIFORM, GPU_BUFFER_USAGE_QUERY_RESOLVE, GPU_BUFFER_USAGE_COPY_SRC, COOKIE_SLICE_SIZE, isStandardPbrMaterialShader } from './chunk-SHFUFJ5N.mjs';
5
+ import { MotionBlurValidationError, STANDARD_OUTPUT_TRANSFORM_FEATURE_ID, SHADOW_ATLAS_DEFAULT_LAYERS, MaterialSkinAttrMissingError, SkinMaterialMismatchError, validateInstanceTransforms, ShadowInvalidConfigError, resolveMotionBlurParams, GPU_TEXTURE_USAGE_COPY_SRC, GPU_TEXTURE_USAGE_COPY_DST, GPU_TEXTURE_USAGE_TEXTURE_BINDING, GPU_TEXTURE_USAGE_STORAGE_BINDING, GPU_TEXTURE_USAGE_RENDER_ATTACHMENT } from './chunk-WEX45HKH.mjs';
6
6
  import { R_MIN, ok, err, TextError, toShared, handleSlot, AssetError, ASSET_ERROR_HINTS, materialValuesToLinearRuntime, derive, unpackSlot, materialGuidText } from '@forgeax/engine-types';
7
7
  import { err as err$1, ok as ok$1, RhiError } from '@forgeax/engine-rhi';
8
8
  import { resolveAssetHandle, walkMaterialPassesOverSharedRefs, selectMaterialPassProgram, materialParametersToParamSchema as materialParametersToParamSchema$1 } from '@forgeax/engine-assets-runtime';
@@ -202,6 +202,17 @@ var emptyBloomInspection = () => ({
202
202
  generation: 0,
203
203
  state: "off"
204
204
  });
205
+ function projectBarrelDistortionInspection(input) {
206
+ const effectiveMapping = input.effectiveMapping === void 0 ? void 0 : freezeBarrelDistortionMapping(input.effectiveMapping);
207
+ return Object.freeze({
208
+ effectiveMapping,
209
+ extent: effectiveMapping === void 0 ? void 0 : Object.freeze({ width: effectiveMapping.width, height: effectiveMapping.height }),
210
+ frameId: input.frameId,
211
+ deviceGeneration: input.deviceGeneration,
212
+ graphGeneration: input.graphGeneration,
213
+ lastKnownGood: input.lastKnownGood
214
+ });
215
+ }
205
216
 
206
217
  // src/prepare/extended-lighting/state.ts
207
218
  function createExtendedLightingState(generation) {
@@ -1898,10 +1909,10 @@ function extractFrames(worlds, owner, assets, pipelineState, materialSnapshotCac
1898
1909
  });
1899
1910
  const frame = extractFrame(world, prepared);
1900
1911
  framesByWorld.set(wi, frame);
1901
- } catch (err6) {
1902
- if (err6 instanceof MotionBlurValidationError) throw err6;
1912
+ } catch (err5) {
1913
+ if (err5 instanceof MotionBlurValidationError) throw err5;
1903
1914
  try {
1904
- createWorldInternalView(world)._routeError(err6, {
1915
+ createWorldInternalView(world)._routeError(err5, {
1905
1916
  severity: Severity.Error,
1906
1917
  systemName: `RenderSystem.extractFrames(world[${wi}])`
1907
1918
  });
@@ -2061,6 +2072,7 @@ function extractFrames(worlds, owner, assets, pipelineState, materialSnapshotCac
2061
2072
  directionalCsmDirection
2062
2073
  };
2063
2074
  const volumetricFog = resourceOwnerFrame?.volumetricFog;
2075
+ const cloudLayer = resourceOwnerFrame?.cloudLayer;
2064
2076
  const skylight = resourceOwnerFrame?.skylight;
2065
2077
  const skylightCount = resourceOwnerFrame?.skylightCount ?? 0;
2066
2078
  const skybox = resourceOwnerFrame?.skybox;
@@ -2116,6 +2128,7 @@ function extractFrames(worlds, owner, assets, pipelineState, materialSnapshotCac
2116
2128
  reflectionProbes,
2117
2129
  lights,
2118
2130
  ...volumetricFog === void 0 ? {} : { volumetricFog: { ...volumetricFog, worldId: resourceOwner } },
2131
+ ...cloudLayer === void 0 ? {} : { cloudLayer },
2119
2132
  renderables,
2120
2133
  dispatch: dispatchEntries,
2121
2134
  shadowCasterEntityKeys,
@@ -2205,6 +2218,16 @@ function extractFrame(world, context) {
2205
2218
  const directionalLightQuery = world.query({ read: [DirectionalLight] }).unwrap();
2206
2219
  const worldInternal = createWorldInternalView(world);
2207
2220
  let volumetricFog = extractVolumeSnapshot(world, assets, worldInternal);
2221
+ let cloudLayer;
2222
+ const extractedCloudLayer = extractCloudLayer(world);
2223
+ if (extractedCloudLayer.ok) {
2224
+ cloudLayer = extractedCloudLayer.value;
2225
+ } else {
2226
+ worldInternal._routeError(extractedCloudLayer.error, {
2227
+ severity: Severity.Error,
2228
+ systemName: "RenderSystem.extract (cloud-layer)"
2229
+ });
2230
+ }
2208
2231
  const cameraRoles = selectCameraRoles(world, context.cameraEntityKey);
2209
2232
  const cameras = [...cameraRoles.display];
2210
2233
  const auxiliaryCameras = cameraRoles.auxiliary;
@@ -2862,7 +2885,6 @@ function extractFrame(world, context) {
2862
2885
  let dispatch = [];
2863
2886
  const shadowMembershipEntries = [];
2864
2887
  const materialSnapshotCache = /* @__PURE__ */ new Map();
2865
- const instanceSnapshotCache = /* @__PURE__ */ new Map();
2866
2888
  const skinnedMaterialSnapshotCache = /* @__PURE__ */ new Map();
2867
2889
  const meshRendererQuery = context.renderables === "none" ? [] : world.query({
2868
2890
  read: [MeshRenderer],
@@ -2899,14 +2921,18 @@ function extractFrame(world, context) {
2899
2921
  const flushPendingDispatch = (pending) => {
2900
2922
  for (const entry of pending) dispatch.push(entry);
2901
2923
  };
2902
- for (const row of meshRendererQuery) {
2903
- if (context.renderables === "full" && renderableEntities !== void 0 && !renderableEntities.has(row.entity)) {
2904
- continue;
2924
+ const requestedRows = renderableEntities === void 0 ? meshRendererQuery : {
2925
+ *[Symbol.iterator]() {
2926
+ for (const entity of renderableEntities) {
2927
+ const row = meshRendererQuery.at(entity);
2928
+ if (row !== void 0) yield row;
2929
+ }
2905
2930
  }
2931
+ };
2932
+ for (const row of requestedRows) {
2906
2933
  const hasTransform = row.has(Transform);
2907
2934
  const meshFilter = row.get(MeshFilter);
2908
- const instancesData = row.get(Instances);
2909
- const hasInstances = instancesData !== void 0;
2935
+ const hasInstances = row.has(Instances);
2910
2936
  const skin = row.get(Skin);
2911
2937
  const morphWeightsView = worldInternal._getArrayView(row.entity, MorphWeights, "weights");
2912
2938
  const hasMeshFilter = meshFilter !== void 0;
@@ -3120,28 +3146,28 @@ function extractFrame(world, context) {
3120
3146
  } else {
3121
3147
  const resolvedResult = walkMaterialPassesOverSharedRefs(world, tagged, assets);
3122
3148
  if (!resolvedResult.ok) {
3123
- const err6 = resolvedResult.error;
3124
- switch (err6.code) {
3149
+ const err5 = resolvedResult.error;
3150
+ switch (err5.code) {
3125
3151
  case "material-parent-not-found":
3126
3152
  case "material-no-effective-pass":
3127
3153
  case "material-value-unknown":
3128
3154
  case "material-value-type-mismatch":
3129
3155
  case "material-contract-program-mismatch":
3130
- worldInternal._routeError(err6, {
3156
+ worldInternal._routeError(err5, {
3131
3157
  severity: Severity.Error,
3132
- systemName: `RenderSystem.extract (${err6.code})`
3158
+ systemName: `RenderSystem.extract (${err5.code})`
3133
3159
  });
3134
3160
  break;
3135
3161
  case "material-circular-inheritance":
3136
- worldInternal._routeError(err6, {
3162
+ worldInternal._routeError(err5, {
3137
3163
  severity: Severity.Error,
3138
3164
  systemName: "RenderSystem.extract (material-circular-inheritance)"
3139
3165
  });
3140
3166
  break;
3141
3167
  default:
3142
- worldInternal._routeError(err6, {
3168
+ worldInternal._routeError(err5, {
3143
3169
  severity: Severity.Error,
3144
- systemName: `RenderSystem.extract (_materialWalk: ${err6.code})`
3170
+ systemName: `RenderSystem.extract (_materialWalk: ${err5.code})`
3145
3171
  });
3146
3172
  }
3147
3173
  continue;
@@ -3398,6 +3424,12 @@ function extractFrame(world, context) {
3398
3424
  baseColor,
3399
3425
  metallic: metallicPv,
3400
3426
  roughness: roughnessPv,
3427
+ ...resolved.surface?.model === void 0 ? {} : { surfaceModel: resolved.surface.model },
3428
+ deferredPass: allPasses.some(
3429
+ (pass) => String(
3430
+ pass.renderState?.tags?.LightMode ?? pass.name
3431
+ ) === "Deferred"
3432
+ ),
3401
3433
  ...specularColorPv !== void 0 && {
3402
3434
  specularColor: [
3403
3435
  specularColorPv[0] ?? 1,
@@ -3748,45 +3780,26 @@ function extractFrame(world, context) {
3748
3780
  };
3749
3781
  let instancesSnap;
3750
3782
  if (hasInstances) {
3751
- const collectionId = instancesData?.collectionId;
3752
- let collectionResult = collectionId !== void 0 ? instanceSnapshotCache.get(collectionId) : void 0;
3753
- if (collectionResult === void 0) {
3754
- collectionResult = collectionId !== void 0 && collectionId > 0 && instanceCollections !== void 0 ? instanceCollections.snapshot(collectionId) : err(
3755
- new InstanceCollectionError(
3756
- "instance-collection-invalid",
3757
- "Instances.collectionId references a live renderer-owned collection",
3758
- "create the collection through renderer.instances before attaching Instances",
3759
- {
3760
- operation: "inspect",
3761
- expected: "a positive collectionId with a live renderer owner",
3762
- actual: Number(collectionId ?? 0),
3763
- ...collectionId === void 0 ? {} : { collectionId }
3764
- }
3765
- )
3766
- );
3767
- if (collectionId !== void 0)
3768
- instanceSnapshotCache.set(collectionId, collectionResult);
3769
- }
3770
- if (collectionResult === void 0) continue;
3771
- if (!collectionResult.ok) {
3772
- worldInternal._routeError(collectionResult.error, {
3783
+ const transforms = worldInternal._getArrayView(entity, Instances, "transforms") ?? new Float32Array();
3784
+ const invalid = validateInstanceTransforms(transforms);
3785
+ if (invalid !== void 0) {
3786
+ worldInternal._routeError(invalid, {
3773
3787
  severity: Severity.Error,
3774
- systemName: "RenderSystem.extract (Instances collection)"
3788
+ systemName: "RenderSystem.extract (Instances transforms)"
3775
3789
  });
3776
3790
  continue;
3777
3791
  }
3792
+ const projected = instanceCollections?.project(world, entity, transforms);
3778
3793
  instancesSnap = {
3779
- transforms: collectionResult.value.transforms,
3780
- generations: collectionResult.value.generations,
3781
- instanceCount: collectionResult.value.count,
3782
- collectionId: collectionResult.value.collectionId,
3783
- revision: collectionResult.value.revision,
3784
- capacity: collectionResult.value.capacity,
3785
- dirtyRanges: collectionResult.value.dirtyRanges,
3794
+ transforms: projected?.transforms ?? new Float32Array(transforms),
3795
+ instanceCount: transforms.length / 16,
3786
3796
  cacheKey: entity,
3787
- // Explicit collection revisions supersede ECS archetype content
3788
- // hashes; retain zero as the legacy sprite-only field value.
3789
- archVersion: 0
3797
+ archVersion: projected === void 0 ? archVersion : 0,
3798
+ ...projected === void 0 ? {} : {
3799
+ collectionId: projected.collectionId,
3800
+ revision: projected.revision,
3801
+ generations: projected.generations
3802
+ }
3790
3803
  };
3791
3804
  }
3792
3805
  const baseRenderable = {
@@ -3974,6 +3987,7 @@ function extractFrame(world, context) {
3974
3987
  environment,
3975
3988
  environmentReady: true,
3976
3989
  ...volumetricFog === void 0 ? {} : { volumetricFog },
3990
+ ...cloudLayer === void 0 ? {} : { cloudLayer },
3977
3991
  renderables,
3978
3992
  dispatch,
3979
3993
  shadowCasterEntityKeys,
@@ -4674,6 +4688,12 @@ function resolveMaterialSnapshot(handleRaw, world, assetsRef, materialSnapshotCa
4674
4688
  baseColor,
4675
4689
  metallic: metallicPv,
4676
4690
  roughness: roughnessPv,
4691
+ ...resolved.surface?.model === void 0 ? {} : { surfaceModel: resolved.surface.model },
4692
+ deferredPass: allPasses.some(
4693
+ (pass) => String(
4694
+ pass.renderState?.tags?.LightMode ?? pass.name
4695
+ ) === "Deferred"
4696
+ ),
4677
4697
  ...specularColorPv !== void 0 && {
4678
4698
  specularColor: [
4679
4699
  specularColorPv[0] ?? 1,
@@ -4923,12 +4943,19 @@ function collectCameraSnapshots(world) {
4923
4943
  const cameras = [];
4924
4944
  const cameraQuery = world.query({
4925
4945
  read: [Camera],
4926
- optional: [MotionBlur, DynamicResolution, ScreenSpaceReflection, DepthOfField],
4946
+ optional: [
4947
+ MotionBlur,
4948
+ DynamicResolution,
4949
+ ScreenSpaceReflection,
4950
+ DepthOfField,
4951
+ BarrelDistortion
4952
+ ],
4927
4953
  with: [Transform, GlobalTransform]
4928
4954
  }).unwrap();
4929
4955
  for (const row of cameraQuery) {
4930
4956
  const cam = row.get(Camera);
4931
4957
  const motionBlur = row.get(MotionBlur);
4958
+ const barrelDistortion = row.get(BarrelDistortion);
4932
4959
  const motionBlurResult = resolveMotionBlurParams(motionBlur);
4933
4960
  if (!motionBlurResult.ok) throw motionBlurResult.error;
4934
4961
  const motionBlurParams = motionBlurResult.value;
@@ -4959,6 +4986,8 @@ function collectCameraSnapshots(world) {
4959
4986
  const antialias = antialiasFromF32(cam.antialias);
4960
4987
  const dynamicResolutionResult = validateDynamicResolutionCamera(dynamicResolution, antialias);
4961
4988
  if (!dynamicResolutionResult.ok) throw dynamicResolutionResult.error;
4989
+ const barrelDistortionResult = validateBarrelDistortionParameters(barrelDistortion);
4990
+ if (!barrelDistortionResult.ok) throw barrelDistortionResult.error;
4962
4991
  cameras.push({
4963
4992
  entityKey: entity,
4964
4993
  ...target === void 0 ? {} : { target },
@@ -5007,6 +5036,7 @@ function collectCameraSnapshots(world) {
5007
5036
  targetFps: motionBlurParams.targetFps
5008
5037
  }
5009
5038
  },
5039
+ ...barrelDistortion === void 0 ? {} : { barrelDistortion: barrelDistortionResult.value },
5010
5040
  ...screenSpaceReflection === void 0 ? {} : {
5011
5041
  screenSpaceReflection: {
5012
5042
  maxDistance: screenSpaceReflection.maxDistance,
@@ -5186,9 +5216,10 @@ function extractVolumeSnapshot(world, assets, worldInternal) {
5186
5216
  const worldTimeSeconds = Number.isFinite(elapsed) ? Math.max(0, elapsed) : 0;
5187
5217
  const query = world.query({ read: [VolumetricFog] }).unwrap();
5188
5218
  const authorings = [];
5219
+ const members = [];
5189
5220
  let selectedLight;
5190
- let first;
5191
5221
  for (const row of query) {
5222
+ selectedLight = void 0;
5192
5223
  const source = row.get(VolumetricFog);
5193
5224
  if (source.light === null) continue;
5194
5225
  const selected = resolveSelectedVolumetricLight(world, source.light);
@@ -5256,10 +5287,25 @@ function extractVolumeSnapshot(world, assets, worldInternal) {
5256
5287
  albedo: [source.albedo[0] ?? 0, source.albedo[1] ?? 0, source.albedo[2] ?? 0],
5257
5288
  emission: [source.emission[0] ?? 0, source.emission[1] ?? 0, source.emission[2] ?? 0],
5258
5289
  anisotropy: source.anisotropy,
5259
- maxDistance: source.maxDistance
5290
+ maxDistance: source.maxDistance,
5291
+ sampling: source.sampling === 1 ? "density" : "noise"
5260
5292
  };
5261
5293
  authorings.push(authoring);
5262
- first ??= { densityHandle, densityAsset, guid };
5294
+ members.push({
5295
+ status: "available",
5296
+ worldTimeSeconds,
5297
+ densityHandle,
5298
+ densityAsset,
5299
+ guid,
5300
+ generation: 1,
5301
+ digest: textureDigest(densityAsset),
5302
+ ...selectedLight === void 0 ? {} : {
5303
+ lightEntity: selectedLight.entity,
5304
+ lightKind: selectedLight.kind,
5305
+ ...selectedLight.pointLightEntity === void 0 ? {} : { pointLightEntity: selectedLight.pointLightEntity },
5306
+ ...selectedLight.spotLightEntity === void 0 ? {} : { spotLightEntity: selectedLight.spotLightEntity }
5307
+ }
5308
+ });
5263
5309
  }
5264
5310
  if (authorings.length === 0) return void 0;
5265
5311
  const extracted = extractVolumetricFog(authorings);
@@ -5268,41 +5314,18 @@ function extractVolumeSnapshot(world, assets, worldInternal) {
5268
5314
  severity: Severity.Error,
5269
5315
  systemName: "RenderSystem.extract (volumetric-fog)"
5270
5316
  });
5271
- return {
5272
- status: "degraded",
5273
- worldTimeSeconds,
5274
- ...first === void 0 ? {} : {
5275
- densityHandle: first.densityHandle,
5276
- densityAsset: first.densityAsset,
5277
- guid: first.guid,
5278
- generation: 1,
5279
- digest: textureDigest(first.densityAsset),
5280
- ...selectedLight === void 0 ? {} : {
5281
- lightEntity: selectedLight.entity,
5282
- lightKind: selectedLight.kind,
5283
- ...selectedLight.pointLightEntity === void 0 ? {} : { pointLightEntity: selectedLight.pointLightEntity },
5284
- ...selectedLight.spotLightEntity === void 0 ? {} : { spotLightEntity: selectedLight.spotLightEntity }
5285
- }
5286
- }
5287
- };
5317
+ return { ...members[0], status: "degraded" };
5288
5318
  }
5289
- if (extracted.value.status === "off" || first === void 0) return { status: "off" };
5290
- const selectedLightFields = selectedLight === void 0 ? {} : {
5291
- lightEntity: selectedLight.entity,
5292
- lightKind: selectedLight.kind,
5293
- ...selectedLight.pointLightEntity === void 0 ? {} : { pointLightEntity: selectedLight.pointLightEntity },
5294
- ...selectedLight.spotLightEntity === void 0 ? {} : { spotLightEntity: selectedLight.spotLightEntity }
5295
- };
5319
+ if (extracted.value.status === "off") return { status: "off" };
5320
+ const validatedMembers = extracted.value.fogs.map((fog, index) => ({
5321
+ ...members[index],
5322
+ status: "available",
5323
+ fog
5324
+ }));
5296
5325
  return {
5297
5326
  status: "available",
5298
- worldTimeSeconds,
5299
- fog: extracted.value.fog,
5300
- densityHandle: first.densityHandle,
5301
- densityAsset: first.densityAsset,
5302
- guid: first.guid,
5303
- generation: 1,
5304
- digest: textureDigest(first.densityAsset),
5305
- ...selectedLightFields
5327
+ ...validatedMembers[0],
5328
+ additional: validatedMembers.slice(1)
5306
5329
  };
5307
5330
  }
5308
5331
  var PROBE_R_MIN = R_MIN;
@@ -5603,6 +5626,17 @@ var ProbeBlendSceneProjection = class {
5603
5626
  };
5604
5627
  lastDirtyVisitCount = 0;
5605
5628
  lastDirtyReasons = [];
5629
+ bufferProjectionSource = Object.freeze({});
5630
+ bufferProjection = Object.freeze({
5631
+ sourceIdentity: this.bufferProjectionSource,
5632
+ revision: 0,
5633
+ baseRevision: 0,
5634
+ capacity: 1,
5635
+ records: Object.freeze([]),
5636
+ dirtyRecords: Object.freeze([]),
5637
+ removedCacheKeys: Object.freeze([])
5638
+ });
5639
+ resultRecords = Object.freeze([]);
5606
5640
  recordFacts = /* @__PURE__ */ new Map();
5607
5641
  getRecord(objectKey) {
5608
5642
  return this.records.get(objectKey);
@@ -5610,6 +5644,10 @@ var ProbeBlendSceneProjection = class {
5610
5644
  hasRecords() {
5611
5645
  return this.records.size > 0;
5612
5646
  }
5647
+ /** Stable upload projection; rebuilt only when probe/object facts change. */
5648
+ recordBufferProjection() {
5649
+ return this.bufferProjection;
5650
+ }
5613
5651
  inspect() {
5614
5652
  return {
5615
5653
  activeContributorCount: this.lastActiveContributorCount,
@@ -5670,6 +5708,23 @@ var ProbeBlendSceneProjection = class {
5670
5708
  const dirtyReasons = [];
5671
5709
  const affectedObjectKeys = /* @__PURE__ */ new Set();
5672
5710
  const previous = this.previous;
5711
+ if (previous !== void 0 && previous.objects === input.objects && input.worldRevision === previous.worldRevision && input.retainSkyResidualRecords === previous.retainSkyResidualRecords && sameProbeFacts(input.probes, previous.probes) && sameSkyFacts(input, previous)) {
5712
+ return {
5713
+ records: this.resultRecords,
5714
+ contributors: [],
5715
+ activeContributorCount: this.lastActiveContributorCount,
5716
+ admittedProbeCount: this.lastAdmittedProbeCount,
5717
+ coverage: this.lastCoverage,
5718
+ skyResidualFraction: 1 - this.lastCoverage,
5719
+ dirtyReasons: [],
5720
+ affectedObjectKeys: [],
5721
+ visits: 0,
5722
+ allocations: 0,
5723
+ uploads: 0,
5724
+ receipt: this.lastReceipt,
5725
+ ...this.lastError === void 0 ? {} : { error: this.lastError }
5726
+ };
5727
+ }
5673
5728
  const objectKeys = input.objects.map((object) => String(object.objectKey)).sort();
5674
5729
  const previousObjectKeys = previous?.objects.map((object) => String(object.objectKey)).sort() ?? [];
5675
5730
  if (previous === void 0 || !sameList(objectKeys, previousObjectKeys)) {
@@ -5678,7 +5733,7 @@ var ProbeBlendSceneProjection = class {
5678
5733
  }
5679
5734
  if (previous !== void 0 && input.worldRevision !== previous.worldRevision)
5680
5735
  dirtyReasons.push("world");
5681
- if (previous !== void 0 && !sameProbeFacts(input.probes, previous.probes))
5736
+ if (previous !== void 0 && (!sameProbeFacts(input.probes, previous.probes) || input.retainSkyResidualRecords !== previous.retainSkyResidualRecords))
5682
5737
  dirtyReasons.push("probe-fact");
5683
5738
  if (previous !== void 0 && !sameSkyFacts(input, previous)) dirtyReasons.push("sky");
5684
5739
  const previousObjects = new Map(previous?.objects.map((object) => [object.objectKey, object]));
@@ -5755,7 +5810,7 @@ var ProbeBlendSceneProjection = class {
5755
5810
  let record;
5756
5811
  if (admission.error !== void 0) firstError ??= admission.error;
5757
5812
  if (admission.admitted.length === 0) {
5758
- if (input.probes.length === 0) {
5813
+ if (input.probes.length === 0 && input.retainSkyResidualRecords !== true) {
5759
5814
  nextRecords.delete(object.objectKey);
5760
5815
  this.recordFacts.delete(object.objectKey);
5761
5816
  continue;
@@ -5812,8 +5867,9 @@ var ProbeBlendSceneProjection = class {
5812
5867
  firstError ??= admission.error;
5813
5868
  }
5814
5869
  const allocations = previous === void 0 ? nextRecords.size : 0;
5870
+ const resultRecords = Object.freeze([...nextRecords.values()]);
5815
5871
  const result = {
5816
- records: [...nextRecords.values()],
5872
+ records: resultRecords,
5817
5873
  contributors: firstTerms,
5818
5874
  activeContributorCount: firstActiveCount,
5819
5875
  admittedProbeCount: firstAdmittedCount,
@@ -5827,14 +5883,38 @@ var ProbeBlendSceneProjection = class {
5827
5883
  receipt: firstReceipt,
5828
5884
  ...firstError === void 0 ? {} : { error: firstError }
5829
5885
  };
5886
+ const projectedRecords = Object.freeze(
5887
+ [...nextRecords].map(([objectKey, record]) => Object.freeze({ cacheKey: objectKey, record }))
5888
+ );
5889
+ const dirtyRecords = Object.freeze(
5890
+ projectedRecords.filter(({ record }) => affectedObjectKeys.has(record.objectKey))
5891
+ );
5892
+ const removedCacheKeys = Object.freeze(
5893
+ [...this.records.keys()].filter((objectKey) => !nextRecords.has(objectKey))
5894
+ );
5895
+ const capacity = projectedRecords.reduce(
5896
+ (value, { record }) => Math.max(value, record.objectKey + 2),
5897
+ 1
5898
+ );
5830
5899
  this.previous = input;
5831
5900
  this.records = nextRecords;
5901
+ this.resultRecords = resultRecords;
5902
+ const baseRevision = this.bufferProjection.revision;
5903
+ this.bufferProjection = Object.freeze({
5904
+ sourceIdentity: this.bufferProjectionSource,
5905
+ revision: baseRevision + 1,
5906
+ baseRevision,
5907
+ capacity,
5908
+ records: projectedRecords,
5909
+ dirtyRecords,
5910
+ removedCacheKeys
5911
+ });
5832
5912
  this.lastError = firstError;
5833
5913
  this.lastReceipt = firstReceipt;
5834
5914
  this.lastActiveContributorCount = firstActiveCount;
5835
5915
  this.lastAdmittedProbeCount = firstAdmittedCount;
5836
5916
  this.lastCoverage = firstCoverage;
5837
- this.lastFinite = [...nextRecords.values()].every(
5917
+ this.lastFinite = this.resultRecords.every(
5838
5918
  (record) => record.bytes.length === PROBE_BLEND_RECORD_BYTE_SIZE
5839
5919
  );
5840
5920
  this.lastSky = input.sky ?? (input.skyIrradiance === void 0 ? { available: false, irradiance: [0, 0, 0], fallbackReason: "no-skylight" } : { available: true, irradiance: input.skyIrradiance });
@@ -5844,6 +5924,6 @@ var ProbeBlendSceneProjection = class {
5844
5924
  }
5845
5925
  };
5846
5926
 
5847
- export { InstanceBoundsCache, OcclusionRenderRuntime, PROBE_MAX_CONTRIBUTORS, ProbeBlendSceneProjection, SSR_HISTORY_FORMAT, SsrHistoryOwner, admitProbeContributors, blendLightProbes, buildRectAreaWorldFrame, buildShadowFrusta, createCookieProjectionMatrixData, createExtendedLightingState, createSsrHistoryOwner, createSsrSpatialResources, emptyBloomInspection, estimateSsrSpatialMemory, extractFrames, fingerprintNumericArray, glyphTextLayoutSystem, primitiveKey, primitiveKeyId, projectExtendedLightingInspection, promoteExtendedLightingCandidate, recordExtendedLightingFailure, rectAreaFacesPoint, scaledProbeWeight, setOcclusionRuntimeTestHooks, viewKey, viewKeyId };
5848
- //# sourceMappingURL=chunk-OO3DRYK7.mjs.map
5849
- //# sourceMappingURL=chunk-OO3DRYK7.mjs.map
5927
+ export { InstanceBoundsCache, OcclusionRenderRuntime, PROBE_MAX_CONTRIBUTORS, ProbeBlendSceneProjection, SSR_HISTORY_FORMAT, SsrHistoryOwner, admitProbeContributors, blendLightProbes, buildRectAreaWorldFrame, buildShadowFrusta, createCookieProjectionMatrixData, createExtendedLightingState, createSsrHistoryOwner, createSsrSpatialResources, emptyBloomInspection, estimateSsrSpatialMemory, extractFrames, fingerprintNumericArray, glyphTextLayoutSystem, primitiveKey, primitiveKeyId, projectBarrelDistortionInspection, projectExtendedLightingInspection, promoteExtendedLightingCandidate, recordExtendedLightingFailure, rectAreaFacesPoint, scaledProbeWeight, setOcclusionRuntimeTestHooks, viewKey, viewKeyId };
5928
+ //# sourceMappingURL=chunk-UI5SFODX.mjs.map
5929
+ //# sourceMappingURL=chunk-UI5SFODX.mjs.map