@forgeax/engine-render 0.1.32 → 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 (624) hide show
  1. package/README.md +1374 -142
  2. package/dist/assembly/analytic-fog-registration.d.ts +3 -0
  3. package/dist/assembly/analytic-fog-registration.d.ts.map +1 -0
  4. package/dist/assembly/backend-contract.d.ts +2 -0
  5. package/dist/assembly/backend-contract.d.ts.map +1 -1
  6. package/dist/assembly/barrel-distortion-inspection.d.ts +3 -0
  7. package/dist/assembly/barrel-distortion-inspection.d.ts.map +1 -0
  8. package/dist/assembly/canvas-draw-guard.d.ts +3 -0
  9. package/dist/assembly/canvas-draw-guard.d.ts.map +1 -0
  10. package/dist/assembly/cloud-shadow-entry.d.ts +4 -0
  11. package/dist/assembly/cloud-shadow-entry.d.ts.map +1 -0
  12. package/dist/assembly/dynamic-geometry-host.d.ts +4 -1
  13. package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
  14. package/dist/assembly/dynamic-geometry-runtime.d.ts +1 -1
  15. package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -1
  16. package/dist/assembly/factory.d.ts +1 -1
  17. package/dist/assembly/factory.d.ts.map +1 -1
  18. package/dist/assembly/fxaa-registration.d.ts +4 -0
  19. package/dist/assembly/fxaa-registration.d.ts.map +1 -0
  20. package/dist/assembly/host-contract.d.ts +3 -3
  21. package/dist/assembly/host-contract.d.ts.map +1 -1
  22. package/dist/assembly/lod-observation.d.ts +4 -0
  23. package/dist/assembly/lod-observation.d.ts.map +1 -0
  24. package/dist/assembly/material/assembly.d.ts.map +1 -1
  25. package/dist/assembly/material/pipeline-helpers.d.ts +5 -0
  26. package/dist/assembly/material/pipeline-helpers.d.ts.map +1 -1
  27. package/dist/assembly/material-shader-policy.d.ts +16 -2
  28. package/dist/assembly/material-shader-policy.d.ts.map +1 -1
  29. package/dist/assembly/material-shader-prewarm.d.ts.map +1 -1
  30. package/dist/assembly/motion-blur-registration.d.ts +3 -0
  31. package/dist/assembly/motion-blur-registration.d.ts.map +1 -0
  32. package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -1
  33. package/dist/assembly/recovery/renderer-recover.d.ts +2 -0
  34. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  35. package/dist/assembly/render-feature-post-processes.d.ts +6 -0
  36. package/dist/assembly/render-feature-post-processes.d.ts.map +1 -0
  37. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  38. package/dist/assembly/renderer-feature-inspection.d.ts +1 -1
  39. package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -1
  40. package/dist/assembly/renderer-frame-transaction.d.ts +12 -0
  41. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  42. package/dist/assembly/renderer-inspection.d.ts +11 -0
  43. package/dist/assembly/renderer-inspection.d.ts.map +1 -1
  44. package/dist/assembly/temporal-post-process-prewarm.d.ts +13 -0
  45. package/dist/assembly/temporal-post-process-prewarm.d.ts.map +1 -0
  46. package/dist/assembly/webgpu-pbr-ready.d.ts +1 -0
  47. package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -1
  48. package/dist/assembly/webgpu-ready-contract.d.ts +4 -3
  49. package/dist/assembly/webgpu-ready-contract.d.ts.map +1 -1
  50. package/dist/assembly/webgpu-ready-per-pass.d.ts +39 -0
  51. package/dist/assembly/webgpu-ready-per-pass.d.ts.map +1 -0
  52. package/dist/assembly/webgpu-ready.d.ts +2 -2
  53. package/dist/assembly/webgpu-ready.d.ts.map +1 -1
  54. package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -1
  55. package/dist/assembly/webgpu-renderer-observation-owner.d.ts +35 -0
  56. package/dist/assembly/webgpu-renderer-observation-owner.d.ts.map +1 -0
  57. package/dist/assembly/webgpu-renderer.d.ts +1 -1
  58. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  59. package/dist/authoring.mjs +1 -1
  60. package/dist/barrel-distortion.d.ts +47 -0
  61. package/dist/barrel-distortion.d.ts.map +1 -0
  62. package/dist/bloom-admission.d.ts +13 -0
  63. package/dist/bloom-admission.d.ts.map +1 -0
  64. package/dist/{chunk-PA5DRJNI.mjs → chunk-ELJFJ2BU.mjs} +2 -2
  65. package/dist/chunk-ELJFJ2BU.mjs.map +1 -0
  66. package/dist/{chunk-JCIRYQ4V.mjs → chunk-HEB564WF.mjs} +10 -4
  67. package/dist/chunk-HEB564WF.mjs.map +1 -0
  68. package/dist/{chunk-JRIPCMYC.mjs → chunk-MKDIT2EM.mjs} +1584 -375
  69. package/dist/chunk-MKDIT2EM.mjs.map +1 -0
  70. package/dist/{chunk-S665NJNF.mjs → chunk-OCDLEI6I.mjs} +3 -3
  71. package/dist/{chunk-S665NJNF.mjs.map → chunk-OCDLEI6I.mjs.map} +1 -1
  72. package/dist/chunk-ODZWR6JQ.mjs +4927 -0
  73. package/dist/chunk-ODZWR6JQ.mjs.map +1 -0
  74. package/dist/{chunk-DRR7D3KX.mjs → chunk-SHFUFJ5N.mjs} +192 -18
  75. package/dist/chunk-SHFUFJ5N.mjs.map +1 -0
  76. package/dist/{chunk-4NNZQCL3.mjs → chunk-UI5SFODX.mjs} +223 -277
  77. package/dist/chunk-UI5SFODX.mjs.map +1 -0
  78. package/dist/{chunk-GWCEMDVR.mjs → chunk-UINHLCZA.mjs} +787 -80
  79. package/dist/chunk-UINHLCZA.mjs.map +1 -0
  80. package/dist/{chunk-6TFBXLRJ.mjs → chunk-WEX45HKH.mjs} +222 -337
  81. package/dist/chunk-WEX45HKH.mjs.map +1 -0
  82. package/dist/cloud/density.d.ts +55 -0
  83. package/dist/cloud/density.d.ts.map +1 -0
  84. package/dist/cloud/extract.d.ts +25 -0
  85. package/dist/cloud/extract.d.ts.map +1 -0
  86. package/dist/cloud/feature.d.ts +57 -0
  87. package/dist/cloud/feature.d.ts.map +1 -0
  88. package/dist/cloud/frame-context.d.ts +8 -0
  89. package/dist/cloud/frame-context.d.ts.map +1 -0
  90. package/dist/cloud/inspection.d.ts +59 -0
  91. package/dist/cloud/inspection.d.ts.map +1 -0
  92. package/dist/cloud/optics.d.ts +56 -0
  93. package/dist/cloud/optics.d.ts.map +1 -0
  94. package/dist/cloud/parameters.d.ts +73 -0
  95. package/dist/cloud/parameters.d.ts.map +1 -0
  96. package/dist/cloud/resources.d.ts +60 -0
  97. package/dist/cloud/resources.d.ts.map +1 -0
  98. package/dist/cloud/shadow.d.ts +42 -0
  99. package/dist/cloud/shadow.d.ts.map +1 -0
  100. package/dist/cloud/temporal.d.ts +74 -0
  101. package/dist/cloud/temporal.d.ts.map +1 -0
  102. package/dist/components/atmosphere.d.ts +2 -0
  103. package/dist/components/atmosphere.d.ts.map +1 -1
  104. package/dist/components/barrel-distortion.d.ts +13 -0
  105. package/dist/components/barrel-distortion.d.ts.map +1 -0
  106. package/dist/components/camera.d.ts +20 -4
  107. package/dist/components/camera.d.ts.map +1 -1
  108. package/dist/components/cloud-layer.d.ts +29 -0
  109. package/dist/components/cloud-layer.d.ts.map +1 -0
  110. package/dist/components/index.d.ts +2 -0
  111. package/dist/components/index.d.ts.map +1 -1
  112. package/dist/components/instances.d.ts +20 -6
  113. package/dist/components/instances.d.ts.map +1 -1
  114. package/dist/components/mesh-filter.d.ts +6 -5
  115. package/dist/components/mesh-filter.d.ts.map +1 -1
  116. package/dist/components/motion-blur.d.ts +1 -0
  117. package/dist/components/motion-blur.d.ts.map +1 -1
  118. package/dist/construct-renderer.d.ts +1 -1
  119. package/dist/construct-renderer.d.ts.map +1 -1
  120. package/dist/construct-renderer.mjs +9751 -3528
  121. package/dist/construct-renderer.mjs.map +1 -1
  122. package/dist/device/gpu-residency.d.ts +6 -0
  123. package/dist/device/gpu-residency.d.ts.map +1 -1
  124. package/dist/dynamic-geometry.d.ts +5 -1
  125. package/dist/dynamic-geometry.d.ts.map +1 -1
  126. package/dist/environment/analytic-fog.d.ts +6 -0
  127. package/dist/environment/analytic-fog.d.ts.map +1 -0
  128. package/dist/errors/cloud.d.ts +59 -0
  129. package/dist/errors/cloud.d.ts.map +1 -0
  130. package/dist/errors/render.d.ts +23 -5
  131. package/dist/errors/render.d.ts.map +1 -1
  132. package/dist/examples/single-layer-medium-surface.d.ts +47 -0
  133. package/dist/examples/single-layer-medium-surface.d.ts.map +1 -0
  134. package/dist/extract/camera.d.ts.map +1 -1
  135. package/dist/extract/contracts.d.ts +12 -1
  136. package/dist/extract/contracts.d.ts.map +1 -1
  137. package/dist/extract/environment.d.ts +2 -0
  138. package/dist/extract/environment.d.ts.map +1 -1
  139. package/dist/features/barrel-distortion.d.ts +29 -0
  140. package/dist/features/barrel-distortion.d.ts.map +1 -0
  141. package/dist/features/error-reporting.d.ts +17 -0
  142. package/dist/features/error-reporting.d.ts.map +1 -0
  143. package/dist/features/host.d.ts +15 -0
  144. package/dist/features/host.d.ts.map +1 -1
  145. package/dist/features/motion-blur/motion-blur-feature.d.ts +20 -2
  146. package/dist/features/motion-blur/motion-blur-feature.d.ts.map +1 -1
  147. package/dist/features/motion-blur/motion-blur-params.d.ts +21 -0
  148. package/dist/features/motion-blur/motion-blur-params.d.ts.map +1 -1
  149. package/dist/features/motion-blur/motion-blur-runtime.d.ts +54 -0
  150. package/dist/features/motion-blur/motion-blur-runtime.d.ts.map +1 -0
  151. package/dist/features/plan.d.ts +15 -4
  152. package/dist/features/plan.d.ts.map +1 -1
  153. package/dist/features/prepared-gpu-work.d.ts +9 -5
  154. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  155. package/dist/features/render-graph-compute.d.ts.map +1 -1
  156. package/dist/features/render-graph-contribution.d.ts +5 -0
  157. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  158. package/dist/features/render-graph-raster.d.ts +1 -0
  159. package/dist/features/render-graph-raster.d.ts.map +1 -1
  160. package/dist/features/targets.d.ts +2 -0
  161. package/dist/features/targets.d.ts.map +1 -1
  162. package/dist/features/types.d.ts +44 -0
  163. package/dist/features/types.d.ts.map +1 -1
  164. package/dist/fullscreen-post-process-pass.d.ts +15 -7
  165. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  166. package/dist/gpu-dirty-ranges.d.ts +11 -0
  167. package/dist/gpu-dirty-ranges.d.ts.map +1 -0
  168. package/dist/gpu-driven/batch-topology.d.ts +17 -0
  169. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  170. package/dist/gpu-driven/material-artifacts.d.ts +6 -0
  171. package/dist/gpu-driven/material-artifacts.d.ts.map +1 -1
  172. package/dist/gpu-driven/prepared-draw.d.ts +7 -0
  173. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  174. package/dist/gpu-driven/production-raster-material.d.ts +178 -0
  175. package/dist/gpu-driven/production-raster-material.d.ts.map +1 -0
  176. package/dist/gpu-driven/production-raster.d.ts +50 -4
  177. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  178. package/dist/gpu-driven/resource-allocation.d.ts +31 -0
  179. package/dist/gpu-driven/resource-allocation.d.ts.map +1 -0
  180. package/dist/gpu-driven/shadow-ownership.d.ts +14 -0
  181. package/dist/gpu-driven/shadow-ownership.d.ts.map +1 -0
  182. package/dist/gpu-driven/view-gpu.d.ts +35 -2
  183. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  184. package/dist/gpu-scene.d.ts +11 -1
  185. package/dist/gpu-scene.d.ts.map +1 -1
  186. package/dist/hdrp-buffers.d.ts +2 -2
  187. package/dist/hdrp-buffers.d.ts.map +1 -1
  188. package/dist/ibl/skylight-bind-group.d.ts +10 -1
  189. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  190. package/dist/index.d.ts +31 -8
  191. package/dist/index.d.ts.map +1 -1
  192. package/dist/index.mjs +258 -8
  193. package/dist/index.mjs.map +1 -1
  194. package/dist/inspection-types.d.ts +178 -3
  195. package/dist/inspection-types.d.ts.map +1 -1
  196. package/dist/instance-buffer-cache.d.ts +4 -4
  197. package/dist/instance-buffer-cache.d.ts.map +1 -1
  198. package/dist/instances.d.ts +49 -94
  199. package/dist/instances.d.ts.map +1 -1
  200. package/dist/internal.mjs +7 -7
  201. package/dist/pbr-pipeline.d.ts +19 -1
  202. package/dist/pbr-pipeline.d.ts.map +1 -1
  203. package/dist/pipeline/single-layer-medium-passes.d.ts +73 -0
  204. package/dist/pipeline/single-layer-medium-passes.d.ts.map +1 -0
  205. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  206. package/dist/pipeline/standard-output/graph.d.ts.map +1 -1
  207. package/dist/pipeline/standard-output/types.d.ts +4 -2
  208. package/dist/pipeline/standard-output/types.d.ts.map +1 -1
  209. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  210. package/dist/pipeline/standard-post.d.ts +28 -19
  211. package/dist/pipeline/standard-post.d.ts.map +1 -1
  212. package/dist/pipeline-builder.d.ts +1 -1
  213. package/dist/pipeline-builder.d.ts.map +1 -1
  214. package/dist/pipeline-spec.d.ts +2 -2
  215. package/dist/plugin.d.ts.map +1 -1
  216. package/dist/prepare/prepared-graphics-resolver.d.ts +2 -0
  217. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  218. package/dist/record/barrel-distortion-frame.d.ts +15 -0
  219. package/dist/record/barrel-distortion-frame.d.ts.map +1 -0
  220. package/dist/record/dynamic-geometry-consumption.d.ts +10 -2
  221. package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -1
  222. package/dist/record/fold-buckets.d.ts +95 -0
  223. package/dist/record/fold-buckets.d.ts.map +1 -0
  224. package/dist/record/fold-instance-buffer.d.ts +6 -0
  225. package/dist/record/fold-instance-buffer.d.ts.map +1 -0
  226. package/dist/record/frame-lighting.d.ts +1 -0
  227. package/dist/record/frame-lighting.d.ts.map +1 -1
  228. package/dist/record/frame-snapshot.d.ts +40 -3
  229. package/dist/record/frame-snapshot.d.ts.map +1 -1
  230. package/dist/record/frame-targets.d.ts.map +1 -1
  231. package/dist/record/frame.d.ts +14 -62
  232. package/dist/record/frame.d.ts.map +1 -1
  233. package/dist/record/gpu-draw-receipts.d.ts +11 -0
  234. package/dist/record/gpu-draw-receipts.d.ts.map +1 -0
  235. package/dist/record/gpu-timing.d.ts +8 -0
  236. package/dist/record/gpu-timing.d.ts.map +1 -1
  237. package/dist/record/main-pass-geometry.d.ts +21 -5
  238. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  239. package/dist/record/main-pass-material.d.ts +7 -1
  240. package/dist/record/main-pass-material.d.ts.map +1 -1
  241. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  242. package/dist/record/main-pass.d.ts +13 -2
  243. package/dist/record/main-pass.d.ts.map +1 -1
  244. package/dist/record/mesh-ssbo.d.ts +6 -5
  245. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  246. package/dist/record/motion-blur-receipt.d.ts +11 -0
  247. package/dist/record/motion-blur-receipt.d.ts.map +1 -0
  248. package/dist/record/probe-blend-buffer.d.ts +16 -0
  249. package/dist/record/probe-blend-buffer.d.ts.map +1 -0
  250. package/dist/record/recovery-pipeline.d.ts.map +1 -1
  251. package/dist/record/render-context.d.ts +34 -31
  252. package/dist/record/render-context.d.ts.map +1 -1
  253. package/dist/record/shadow-pass.d.ts +2 -0
  254. package/dist/record/shadow-pass.d.ts.map +1 -1
  255. package/dist/record/skybox-post-pass.d.ts +6 -4
  256. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  257. package/dist/record/typed-frame-graph.d.ts +22 -2
  258. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  259. package/dist/record/view-ubo.d.ts +11 -3
  260. package/dist/record/view-ubo.d.ts.map +1 -1
  261. package/dist/record/volume-params.d.ts +9 -0
  262. package/dist/record/volume-params.d.ts.map +1 -0
  263. package/dist/recovery/render-system-candidate.d.ts +10 -0
  264. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  265. package/dist/reflection/record-owner.d.ts.map +1 -1
  266. package/dist/render-contract.d.ts +66 -8
  267. package/dist/render-contract.d.ts.map +1 -1
  268. package/dist/render-graph-primitives.d.ts.map +1 -1
  269. package/dist/render-pipeline.d.ts +106 -3
  270. package/dist/render-pipeline.d.ts.map +1 -1
  271. package/dist/render-system-extract-tail.d.ts +3 -2
  272. package/dist/render-system-extract-tail.d.ts.map +1 -1
  273. package/dist/render-system-extract.d.ts +24 -10
  274. package/dist/render-system-extract.d.ts.map +1 -1
  275. package/dist/render-system-presentation.d.ts +23 -0
  276. package/dist/render-system-presentation.d.ts.map +1 -0
  277. package/dist/render-system-producer-roots.d.ts +10 -0
  278. package/dist/render-system-producer-roots.d.ts.map +1 -0
  279. package/dist/render-system-residency.d.ts +12 -0
  280. package/dist/render-system-residency.d.ts.map +1 -0
  281. package/dist/render-system.d.ts +26 -15
  282. package/dist/render-system.d.ts.map +1 -1
  283. package/dist/scene/probe-blend.d.ts +27 -0
  284. package/dist/scene/probe-blend.d.ts.map +1 -1
  285. package/dist/scene/render-scene.d.ts +14 -5
  286. package/dist/scene/render-scene.d.ts.map +1 -1
  287. package/dist/ssao-buffers.d.ts +9 -0
  288. package/dist/ssao-buffers.d.ts.map +1 -1
  289. package/dist/surface/dynamic-input.d.ts +133 -0
  290. package/dist/surface/dynamic-input.d.ts.map +1 -0
  291. package/dist/surface/gpu-driven.d.ts +41 -0
  292. package/dist/surface/gpu-driven.d.ts.map +1 -0
  293. package/dist/surface/submission-observation.d.ts +136 -0
  294. package/dist/surface/submission-observation.d.ts.map +1 -0
  295. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  296. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  297. package/dist/temporal/frame.d.ts +7 -0
  298. package/dist/temporal/frame.d.ts.map +1 -1
  299. package/dist/temporal/gpu.d.ts +13 -1
  300. package/dist/temporal/gpu.d.ts.map +1 -1
  301. package/dist/temporal/index.mjs +5 -5
  302. package/dist/temporal/inspection.d.ts.map +1 -1
  303. package/dist/temporal/standard-scene-data.d.ts.map +1 -1
  304. package/dist/temporal/target-coverage-attachment.d.ts.map +1 -1
  305. package/dist/temporal/view.d.ts +6 -1
  306. package/dist/temporal/view.d.ts.map +1 -1
  307. package/dist/transmission/single-layer-medium.d.ts +89 -0
  308. package/dist/transmission/single-layer-medium.d.ts.map +1 -0
  309. package/dist/typed-render-graph-primitives.d.ts +24 -9
  310. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  311. package/dist/volume/component.d.ts +9 -5
  312. package/dist/volume/component.d.ts.map +1 -1
  313. package/dist/volume/extract.d.ts +1 -1
  314. package/dist/volume/extract.d.ts.map +1 -1
  315. package/dist/volume/inspection.d.ts +2 -0
  316. package/dist/volume/inspection.d.ts.map +1 -1
  317. package/dist/volume/passes.d.ts +4 -1
  318. package/dist/volume/passes.d.ts.map +1 -1
  319. package/dist/volume/resources.d.ts.map +1 -1
  320. package/dist/volume/temporal.d.ts +3 -1
  321. package/dist/volume/temporal.d.ts.map +1 -1
  322. package/package.json +22 -21
  323. package/src/__tests__/analytic-fog-graph.unit.test.ts +199 -0
  324. package/src/__tests__/analytic-fog-optics.unit.test.ts +38 -0
  325. package/src/__tests__/atmosphere-daylight.dawn.test.ts +72 -0
  326. package/src/__tests__/barrel-distortion-lkg.integration.test.ts +353 -0
  327. package/src/__tests__/barrel-distortion.dawn.test.ts +41 -0
  328. package/src/__tests__/barrel-distortion.unit.test.ts +364 -0
  329. package/src/__tests__/bloom-exact-zero.unit.test.ts +112 -18
  330. package/src/__tests__/bloom-lifecycle.integration.test.ts +17 -4
  331. package/src/__tests__/construct-renderer-identity.unit.test.ts +49 -0
  332. package/src/__tests__/detached-recovery-graph.unit.test.ts +277 -0
  333. package/src/__tests__/device-loss-fanout.unit.test.ts +36 -1
  334. package/src/__tests__/docs-gate-green.unit.test.ts +112 -1
  335. package/src/__tests__/dynamic-resolution-plugin.integration.test.ts +20 -0
  336. package/src/__tests__/environment-fog-lanes.integration.test.ts +14 -0
  337. package/src/__tests__/environment-selection.unit.test.ts +12 -0
  338. package/src/__tests__/factory-contract.integration.test.ts +626 -113
  339. package/src/__tests__/feature-depth-input.dawn.test.ts +129 -2
  340. package/src/__tests__/frame-camera-selection.unit.test.ts +39 -1
  341. package/src/__tests__/frame-plan-contract.unit.test.ts +2 -0
  342. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +14 -3
  343. package/src/__tests__/gpu-dirty-ranges.unit.test.ts +22 -0
  344. package/src/__tests__/gpu-driven-baseline.characterization.test.ts +16 -3
  345. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +12 -0
  346. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +2 -1
  347. package/src/__tests__/gpu-driven-material-artifacts.unit.test.ts +143 -0
  348. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +2 -2
  349. package/src/__tests__/gpu-driven-production.integration.test.ts +482 -3
  350. package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +7 -6
  351. package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +1 -1
  352. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +103 -4
  353. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +18 -2
  354. package/src/__tests__/gpu-driven-view.browser.test.ts +5 -8
  355. package/src/__tests__/gpu-driven-view.dawn.test.ts +6 -2
  356. package/src/__tests__/gpu-driven-view.unit.test.ts +1 -1
  357. package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +1 -0
  358. package/src/__tests__/gpu-pass-timing.browser.test.ts +6 -4
  359. package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +1 -0
  360. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +12 -0
  361. package/src/__tests__/gpu-scene.unit.test.ts +210 -9
  362. package/src/__tests__/instance-allocation-failure.unit.test.ts +57 -0
  363. package/src/__tests__/instances-culling.integration.test.ts +10 -36
  364. package/src/__tests__/instances-store.unit.test.ts +105 -238
  365. package/src/__tests__/instances-world-ownership.integration.test.ts +62 -0
  366. package/src/__tests__/main-pass-material-medium-selection.unit.test.ts +146 -0
  367. package/src/__tests__/material-shader-prewarm.unit.test.ts +59 -0
  368. package/src/__tests__/material-snapshot-mutation.integration.test.ts +39 -1
  369. package/src/__tests__/mesh-submission-lifetime.unit.test.ts +31 -0
  370. package/src/__tests__/morph-culling-reentry.dawn.test.ts +5 -5
  371. package/src/__tests__/morph-visual-evidence.integration.test.ts +8 -7
  372. package/src/__tests__/motion-blur-compute.dawn.test.ts +589 -0
  373. package/src/__tests__/motion-blur.pixel.integration.test.ts +2 -2
  374. package/src/__tests__/nineslice-handle-surface.unit.test.ts +4 -4
  375. package/src/__tests__/pbr-view-layout.unit.test.ts +9 -0
  376. package/src/__tests__/physical-clearcoat.integration.test.ts +58 -0
  377. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +21 -0
  378. package/src/__tests__/prepared-graphics-capability.unit.test.ts +66 -2
  379. package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +86 -0
  380. package/src/__tests__/probe-bindings.unit.test.ts +582 -1
  381. package/src/__tests__/probe-scene-dirty.integration.test.ts +28 -1
  382. package/src/__tests__/public-surface.test-d.ts +8 -0
  383. package/src/__tests__/receipt-observation-retirement.unit.test.ts +65 -0
  384. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +69 -0
  385. package/src/__tests__/render-error-code-owner.test-d.ts +9 -0
  386. package/src/__tests__/render-feature-diagnostics.unit.test.ts +15 -2
  387. package/src/__tests__/render-feature-error-reporting.unit.test.ts +44 -0
  388. package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +10 -1
  389. package/src/__tests__/render-feature-retry.unit.test.ts +12 -1
  390. package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +23 -0
  391. package/src/__tests__/render-scene-mixed-updates.integration.test.ts +145 -19
  392. package/src/__tests__/render-scene-projection.unit.test.ts +36 -11
  393. package/src/__tests__/render-scene-temporal-retry.unit.test.ts +37 -6
  394. package/src/__tests__/render-target-probe-soak.perf.test.ts +2 -2
  395. package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +3 -3
  396. package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +5 -2
  397. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +41 -7
  398. package/src/__tests__/renderer-frame-generation-fence.integration.test.ts +16 -0
  399. package/src/__tests__/renderer-frame-transaction.integration.test.ts +33 -11
  400. package/src/__tests__/resource-allocation.unit.test.ts +123 -0
  401. package/src/__tests__/shader-manifest-fixture.ts +4 -4
  402. package/src/__tests__/single-layer-medium-passes.unit.test.ts +275 -0
  403. package/src/__tests__/skin-motion-regression.unit.test.ts +70 -1
  404. package/src/__tests__/skin-palette-recycling.dawn.test.ts +97 -0
  405. package/src/__tests__/skinned-shadow-caster.test.ts +17 -0
  406. package/src/__tests__/ssr-carrier-public-contract.unit.test.ts +21 -0
  407. package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +4 -4
  408. package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +2 -2
  409. package/src/__tests__/ssr-gpu-dispatch.ts +1 -1
  410. package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +6 -2
  411. package/src/__tests__/standard-lighting-write.unit.test.ts +2 -1
  412. package/src/__tests__/standard-output-chain-contract.unit.test.ts +28 -0
  413. package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +46 -1
  414. package/src/__tests__/standard-pipeline.dawn.test.ts +1 -1
  415. package/src/__tests__/standard-pipeline.integration.test.ts +200 -9
  416. package/src/__tests__/surface-dynamic-buffer-lifecycle.unit.test.ts +506 -0
  417. package/src/__tests__/surface-submission-observation.unit.test.ts +812 -0
  418. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +32 -0
  419. package/src/__tests__/temporal-performance.integration.test.ts +3 -3
  420. package/src/__tests__/temporal-reset-matrix.unit.test.ts +10 -0
  421. package/src/__tests__/temporal-view.unit.test.ts +2 -1
  422. package/src/__tests__/typed-pipeline-topology.unit.test.ts +20 -4
  423. package/src/__tests__/visibility-instances.integration.test.ts +7 -19
  424. package/src/__tests__/visibility-producer-matrix.integration.test.ts +9 -20
  425. package/src/__tests__/volume-optics-oracle.unit.test.ts +7 -3
  426. package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +189 -15
  427. package/src/__tests__/volumetric-fog-errors.unit.test.ts +4 -3
  428. package/src/__tests__/volumetric-fog-multiple.unit.test.ts +55 -0
  429. package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +1 -1
  430. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +558 -68
  431. package/src/__tests__/volumetric-fog-temporal.unit.test.ts +27 -0
  432. package/src/__tests__/volumetric-fog-topology.unit.test.ts +23 -5
  433. package/src/assembly/analytic-fog-registration.ts +14 -0
  434. package/src/assembly/backend-contract.ts +30 -0
  435. package/src/assembly/barrel-distortion-inspection.ts +22 -0
  436. package/src/assembly/canvas-draw-guard.ts +11 -0
  437. package/src/assembly/cloud-shadow-entry.ts +22 -0
  438. package/src/assembly/dynamic-geometry-host.ts +65 -37
  439. package/src/assembly/dynamic-geometry-runtime.ts +7 -1
  440. package/src/assembly/factory.ts +2 -30
  441. package/src/assembly/fxaa-registration.ts +17 -0
  442. package/src/assembly/host-contract.ts +3 -3
  443. package/src/assembly/lod-observation.ts +12 -0
  444. package/src/assembly/material/assembly.ts +25 -13
  445. package/src/assembly/material/pipeline-helpers.ts +53 -12
  446. package/src/assembly/material-shader-policy.ts +55 -0
  447. package/src/assembly/material-shader-prewarm.ts +21 -10
  448. package/src/assembly/motion-blur-registration.ts +17 -0
  449. package/src/assembly/recovery/device-loss-fanout.ts +13 -0
  450. package/src/assembly/recovery/renderer-recover.ts +41 -18
  451. package/src/assembly/render-feature-post-processes.ts +54 -0
  452. package/src/assembly/renderer-facade.ts +6 -1
  453. package/src/assembly/renderer-feature-inspection.ts +8 -2
  454. package/src/assembly/renderer-frame-transaction.ts +23 -0
  455. package/src/assembly/renderer-inspection.ts +28 -0
  456. package/src/assembly/skin-palette-owner.ts +1 -1
  457. package/src/assembly/temporal-post-process-prewarm.ts +40 -0
  458. package/src/assembly/webgpu-pbr-ready.ts +9 -1
  459. package/src/assembly/webgpu-ready-contract.ts +8 -3
  460. package/src/assembly/webgpu-ready-per-pass.ts +104 -0
  461. package/src/assembly/webgpu-ready.ts +296 -306
  462. package/src/assembly/webgpu-renderer-bootstrap.ts +0 -12
  463. package/src/assembly/webgpu-renderer-observation-owner.ts +222 -0
  464. package/src/assembly/webgpu-renderer.ts +228 -281
  465. package/src/assembly/webgpu-vertex-layouts.ts +1 -1
  466. package/src/barrel-distortion.ts +247 -0
  467. package/src/bloom-admission.ts +21 -0
  468. package/src/cloud/__tests__/cloud-density-parity.dawn.test.ts +173 -0
  469. package/src/cloud/__tests__/cloud-layer-framebuffer-y.dawn.test.ts +265 -0
  470. package/src/cloud/__tests__/cloud-layer.browser.test.ts +432 -0
  471. package/src/cloud/__tests__/cloud-layer.unit.test.ts +634 -0
  472. package/src/cloud/density.ts +600 -0
  473. package/src/cloud/extract.ts +110 -0
  474. package/src/cloud/feature.ts +1810 -0
  475. package/src/cloud/frame-context.ts +42 -0
  476. package/src/cloud/inspection.ts +130 -0
  477. package/src/cloud/optics.ts +285 -0
  478. package/src/cloud/parameters.ts +255 -0
  479. package/src/cloud/resources.ts +122 -0
  480. package/src/cloud/shadow.ts +167 -0
  481. package/src/cloud/temporal.ts +226 -0
  482. package/src/components/__tests__/motion-blur.unit.test.ts +1 -0
  483. package/src/components/atmosphere.ts +4 -0
  484. package/src/components/barrel-distortion.ts +46 -0
  485. package/src/components/camera.ts +66 -10
  486. package/src/components/cloud-layer.ts +47 -0
  487. package/src/components/index.ts +2 -0
  488. package/src/components/instances.ts +18 -45
  489. package/src/components/mesh-filter.ts +11 -9
  490. package/src/components/motion-blur.ts +1 -0
  491. package/src/components/sprite-instances.ts +1 -1
  492. package/src/construct-renderer.ts +1 -1
  493. package/src/device/gpu-residency.ts +56 -12
  494. package/src/dynamic-geometry.ts +12 -1
  495. package/src/environment/analytic-fog.ts +44 -0
  496. package/src/environment/background.ts +2 -2
  497. package/src/errors/cloud.ts +103 -0
  498. package/src/errors/render.ts +58 -8
  499. package/src/examples/single-layer-medium-surface.ts +59 -0
  500. package/src/extract/camera.ts +35 -8
  501. package/src/extract/contracts.ts +12 -0
  502. package/src/extract/environment.ts +4 -0
  503. package/src/features/barrel-distortion.ts +172 -0
  504. package/src/features/error-reporting.ts +98 -0
  505. package/src/features/host.ts +138 -24
  506. package/src/features/motion-blur/__tests__/motion-blur-feature.unit.test.ts +111 -1
  507. package/src/features/motion-blur/__tests__/motion-blur-params.unit.test.ts +58 -3
  508. package/src/features/motion-blur/motion-blur-feature.ts +1519 -15
  509. package/src/features/motion-blur/motion-blur-params.ts +70 -2
  510. package/src/features/motion-blur/motion-blur-runtime.ts +176 -0
  511. package/src/features/plan.ts +33 -8
  512. package/src/features/prepared-gpu-work.ts +86 -35
  513. package/src/features/render-graph-compute.ts +13 -5
  514. package/src/features/render-graph-contribution.ts +11 -0
  515. package/src/features/render-graph-raster.ts +45 -3
  516. package/src/features/targets.ts +66 -0
  517. package/src/features/types.ts +47 -0
  518. package/src/fullscreen-post-process-pass.ts +41 -9
  519. package/src/gpu-dirty-ranges.ts +48 -0
  520. package/src/gpu-driven/batch-topology.ts +53 -0
  521. package/src/gpu-driven/material-artifacts.ts +35 -32
  522. package/src/gpu-driven/prepared-draw.ts +27 -14
  523. package/src/gpu-driven/production-raster-material.ts +1894 -0
  524. package/src/gpu-driven/production-raster.ts +904 -787
  525. package/src/gpu-driven/resource-allocation.ts +142 -0
  526. package/src/gpu-driven/shadow-ownership.ts +71 -0
  527. package/src/gpu-driven/view-gpu.ts +181 -10
  528. package/src/gpu-scene.ts +259 -101
  529. package/src/hdrp-buffers.ts +4 -3
  530. package/src/ibl/skylight-bind-group.ts +49 -7
  531. package/src/index.ts +228 -9
  532. package/src/inspection-types.ts +222 -2
  533. package/src/instance-buffer-cache.ts +4 -4
  534. package/src/instances.ts +151 -492
  535. package/src/pbr-pipeline.ts +219 -13
  536. package/src/pipeline/single-layer-medium-passes.ts +267 -0
  537. package/src/pipeline/standard-forward-lane.ts +313 -57
  538. package/src/pipeline/standard-output/graph.ts +8 -2
  539. package/src/pipeline/standard-output/types.ts +12 -1
  540. package/src/pipeline/standard-pipeline.ts +291 -18
  541. package/src/pipeline/standard-post.ts +397 -102
  542. package/src/pipeline-builder.ts +1 -1
  543. package/src/pipeline-spec.ts +5 -5
  544. package/src/plugin.ts +4 -0
  545. package/src/points-lines/__tests__/points-lines.bench.ts +17 -8
  546. package/src/points-lines/__tests__/view-ubo.unit.test.ts +2 -1
  547. package/src/prepare/prepared-graphics-resolver.ts +2 -0
  548. package/src/record/__tests__/main-pass-geometry.unit.test.ts +30 -0
  549. package/src/record/__tests__/sprite-material-abi.unit.test.ts +1 -1
  550. package/src/record/__tests__/temporal-payload.unit.test.ts +3 -2
  551. package/src/record/__tests__/transparent-group2-selection.unit.test.ts +11 -0
  552. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +1 -0
  553. package/src/record/__tests__/view-ubo-layout.unit.test.ts +4 -3
  554. package/src/record/barrel-distortion-frame.ts +110 -0
  555. package/src/record/dynamic-geometry-consumption.ts +39 -9
  556. package/src/record/fold-buckets.ts +852 -0
  557. package/src/record/fold-instance-buffer.ts +51 -0
  558. package/src/record/frame-lighting.ts +36 -2
  559. package/src/record/frame-snapshot.ts +44 -4
  560. package/src/record/frame-targets.ts +10 -6
  561. package/src/record/frame.ts +373 -1099
  562. package/src/record/gpu-draw-receipts.ts +38 -0
  563. package/src/record/gpu-timing.ts +48 -5
  564. package/src/record/main-pass-geometry.ts +281 -83
  565. package/src/record/main-pass-material.ts +66 -4
  566. package/src/record/main-pass-sprite-draws.ts +13 -66
  567. package/src/record/main-pass.ts +156 -20
  568. package/src/record/mesh-ssbo.ts +43 -6
  569. package/src/record/motion-blur-receipt.ts +91 -0
  570. package/src/record/probe-blend-buffer.ts +180 -0
  571. package/src/record/recovery-pipeline.ts +35 -3
  572. package/src/record/render-context.ts +51 -31
  573. package/src/record/shadow-pass.ts +36 -2
  574. package/src/record/skybox-post-pass.ts +150 -200
  575. package/src/record/typed-frame-graph.ts +824 -44
  576. package/src/record/view-ubo.ts +26 -3
  577. package/src/record/volume-params.ts +225 -0
  578. package/src/recovery/render-system-candidate.ts +257 -52
  579. package/src/reflection/record-owner.ts +7 -3
  580. package/src/render-contract.ts +71 -8
  581. package/src/render-graph-primitives.ts +7 -1
  582. package/src/render-pipeline.ts +136 -1
  583. package/src/render-system-extract-tail.ts +72 -60
  584. package/src/render-system-extract.ts +117 -87
  585. package/src/render-system-presentation.ts +56 -0
  586. package/src/render-system-producer-roots.ts +96 -0
  587. package/src/render-system-residency.ts +159 -0
  588. package/src/render-system.ts +601 -482
  589. package/src/scene/probe-blend.ts +96 -4
  590. package/src/scene/render-scene.ts +431 -281
  591. package/src/ssao-buffers.ts +95 -2
  592. package/src/surface/__tests__/dynamic-input.unit.test.ts +374 -0
  593. package/src/surface/__tests__/gpu-driven.unit.test.ts +87 -0
  594. package/src/surface/dynamic-input.ts +658 -0
  595. package/src/surface/gpu-driven.ts +147 -0
  596. package/src/surface/submission-observation.ts +517 -0
  597. package/src/systems/skin-palette-allocator.ts +4 -1
  598. package/src/temporal/__tests__/temporal-frame-transaction.unit.test.ts +36 -0
  599. package/src/temporal/frame-coordinator.ts +8 -1
  600. package/src/temporal/frame.ts +20 -0
  601. package/src/temporal/gpu.ts +101 -17
  602. package/src/temporal/inspection.ts +7 -1
  603. package/src/temporal/standard-scene-data.ts +5 -0
  604. package/src/temporal/target-coverage-attachment.ts +4 -0
  605. package/src/temporal/view.ts +13 -2
  606. package/src/transmission/__tests__/single-layer-medium.unit.test.ts +149 -0
  607. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +12 -11
  608. package/src/transmission/single-layer-medium.ts +322 -0
  609. package/src/typed-render-graph-primitives.ts +191 -50
  610. package/src/volume/component.ts +10 -10
  611. package/src/volume/extract.ts +11 -5
  612. package/src/volume/inspection.ts +3 -0
  613. package/src/volume/passes.ts +95 -8
  614. package/src/volume/resources.ts +2 -1
  615. package/src/volume/temporal.ts +11 -0
  616. package/dist/chunk-4NNZQCL3.mjs.map +0 -1
  617. package/dist/chunk-6TFBXLRJ.mjs.map +0 -1
  618. package/dist/chunk-DRR7D3KX.mjs.map +0 -1
  619. package/dist/chunk-GWCEMDVR.mjs.map +0 -1
  620. package/dist/chunk-JCIRYQ4V.mjs.map +0 -1
  621. package/dist/chunk-JRIPCMYC.mjs.map +0 -1
  622. package/dist/chunk-LULCA3OF.mjs +0 -1713
  623. package/dist/chunk-LULCA3OF.mjs.map +0 -1
  624. package/dist/chunk-PA5DRJNI.mjs.map +0 -1
@@ -1,11 +1,12 @@
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, 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, bloomEnabledFromF32, tonemapFromF32 } from './chunk-GWCEMDVR.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-DRR7D3KX.mjs';
5
- import { STANDARD_OUTPUT_TRANSFORM_FEATURE_ID, SHADOW_ATLAS_DEFAULT_LAYERS, MaterialSkinAttrMissingError, SkinMaterialMismatchError, InstanceCollectionError, ShadowInvalidConfigError, EnvironmentSourceConflictError, FogCardinalityError, 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, AtmosphereInvalidParameterError } from './chunk-6TFBXLRJ.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';
9
+ import { Time } from '@forgeax/engine-ecs';
9
10
  import { SpawnLightInvalidBoundsError, routeWorldError, SpriteInstancesMutuallyExclusiveWithInstancesError, SpriteInstancesRequiresSpriteShaderError, SpriteInstancesCountMismatchError, readRenderArrayView } from '@forgeax/engine-ecs/projection';
10
11
  import { vec3, mat4, frustum, box3 } from '@forgeax/engine-math';
11
12
  import { AssetGuid } from '@forgeax/engine-pack/guid';
@@ -183,6 +184,35 @@ function projectLightInspection(input) {
183
184
  function lightInspectionIdentity(topology, generation) {
184
185
  return `${topology}:generation-${generation}`;
185
186
  }
187
+ var emptyBloomInspection = () => ({
188
+ graphStatus: "empty",
189
+ enabled: false,
190
+ levelCount: 0,
191
+ levelDimensions: [],
192
+ downsamplePassCount: 0,
193
+ upsamplePassCount: 0,
194
+ targetCount: 0,
195
+ targetBytes: 0,
196
+ resourceCount: 0,
197
+ passCount: 0,
198
+ encodeCount: 0,
199
+ bindGroupCount: 0,
200
+ uploadCount: 0,
201
+ residentChildBytes: 0,
202
+ generation: 0,
203
+ state: "off"
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
+ }
186
216
 
187
217
  // src/prepare/extended-lighting/state.ts
188
218
  function createExtendedLightingState(generation) {
@@ -938,8 +968,8 @@ var OcclusionRenderRuntime = class {
938
968
  if (this.queryLatencySamplesUs.length === 0) {
939
969
  return { median: 0, p95: 0, last: this.lastQueryLatencyUs };
940
970
  }
941
- const sorted2 = [...this.queryLatencySamplesUs].sort((left, right) => left - right);
942
- const rank = (percentile) => sorted2[Math.max(0, Math.ceil(sorted2.length * percentile) - 1)] ?? 0;
971
+ const sorted = [...this.queryLatencySamplesUs].sort((left, right) => left - right);
972
+ const rank = (percentile) => sorted[Math.max(0, Math.ceil(sorted.length * percentile) - 1)] ?? 0;
943
973
  return {
944
974
  median: rank(0.5),
945
975
  p95: rank(0.95),
@@ -1224,181 +1254,6 @@ function runtimeError(hint) {
1224
1254
  });
1225
1255
  }
1226
1256
 
1227
- // src/environment/signature.ts
1228
- function sorted(items) {
1229
- return [...items].sort((left, right) => left.entityKey - right.entityKey);
1230
- }
1231
- function environmentSignature(input) {
1232
- return JSON.stringify({
1233
- environments: sorted(input.environments),
1234
- fogs: sorted(input.fogs),
1235
- suns: sorted(input.suns)
1236
- });
1237
- }
1238
- function environmentOnlySignature(input) {
1239
- return JSON.stringify({
1240
- environments: sorted(input.environments),
1241
- suns: sorted(input.suns)
1242
- });
1243
- }
1244
- function fogOnlySignature(input) {
1245
- return JSON.stringify({ fogs: sorted(input.fogs) });
1246
- }
1247
- function environmentFactSignatures(input) {
1248
- return {
1249
- environmentSignature: environmentOnlySignature(input),
1250
- fogSignature: fogOnlySignature(input),
1251
- signature: environmentSignature(input)
1252
- };
1253
- }
1254
-
1255
- // src/extract/environment.ts
1256
- var ATMOSPHERE_PARAMETER_RANGES = Object.freeze({
1257
- turbidity: Object.freeze({ min: 1, max: 20 }),
1258
- rayleigh: Object.freeze({ min: 0, max: Number.POSITIVE_INFINITY }),
1259
- mieCoefficient: Object.freeze({ min: 0, max: Number.POSITIVE_INFINITY }),
1260
- mieDirectionalG: Object.freeze({ min: 0, max: 0.999 }),
1261
- sunAngularRadius: Object.freeze({ min: 0, max: Number.POSITIVE_INFINITY })
1262
- });
1263
- function validateFogParameters(candidate) {
1264
- if (candidate.color.length !== 3) {
1265
- return {
1266
- field: "color",
1267
- value: candidate.color.length,
1268
- expected: "exactly three finite channels in [0, 1]"
1269
- };
1270
- }
1271
- for (let index = 0; index < candidate.color.length; index += 1) {
1272
- const value = candidate.color[index];
1273
- if (value === void 0 || !Number.isFinite(value) || value < 0 || value > 1) {
1274
- return {
1275
- field: `color[${index}]`,
1276
- value: value ?? Number.NaN,
1277
- expected: "a finite number in [0, 1]"
1278
- };
1279
- }
1280
- }
1281
- if (!Number.isFinite(candidate.density) || candidate.density < 0) {
1282
- return { field: "density", value: candidate.density, expected: "a finite number >= 0" };
1283
- }
1284
- if (!Number.isFinite(candidate.heightFalloff) || candidate.heightFalloff < 0) {
1285
- return {
1286
- field: "heightFalloff",
1287
- value: candidate.heightFalloff,
1288
- expected: "a finite number >= 0"
1289
- };
1290
- }
1291
- if (!Number.isFinite(candidate.maxOpacity) || candidate.maxOpacity < 0 || candidate.maxOpacity > 1) {
1292
- return {
1293
- field: "maxOpacity",
1294
- value: candidate.maxOpacity,
1295
- expected: "a finite number in [0, 1]"
1296
- };
1297
- }
1298
- return void 0;
1299
- }
1300
- function validateAtmosphereParameters(parameters) {
1301
- for (const field of Object.keys(ATMOSPHERE_PARAMETER_RANGES)) {
1302
- const value = parameters[field];
1303
- const range = ATMOSPHERE_PARAMETER_RANGES[field];
1304
- if (!Number.isFinite(value) || value < range.min || value > range.max) {
1305
- return new AtmosphereInvalidParameterError(field, value, range);
1306
- }
1307
- }
1308
- return void 0;
1309
- }
1310
-
1311
- // src/environment/frame.ts
1312
- var SKYLIGHT_RECOVERY_FALLBACK = Object.freeze({
1313
- kind: "skylight",
1314
- active: false
1315
- });
1316
- var EnvironmentSelectionParameterError = class extends Error {
1317
- code = "environment-selection-invalid";
1318
- expected;
1319
- hint;
1320
- detail;
1321
- constructor(field, value, expected) {
1322
- super(`environment selection field ${field} is invalid`);
1323
- this.name = "EnvironmentSelectionParameterError";
1324
- this.expected = expected;
1325
- this.hint = `set ${field} to a finite value satisfying ${expected}`;
1326
- this.detail = { field, value };
1327
- }
1328
- };
1329
- var SunCardinalityError = class extends Error {
1330
- code = "sun-cardinality";
1331
- expected = "atmosphere has exactly one sun owner";
1332
- hint = "add exactly one DirectionalLight sun for the atmosphere owner";
1333
- detail;
1334
- constructor(value) {
1335
- super(`atmosphere sun cardinality is ${value}`);
1336
- this.name = "SunCardinalityError";
1337
- this.detail = { field: "sun", value };
1338
- }
1339
- };
1340
- function freezeCandidate(candidate) {
1341
- return Object.freeze(candidate);
1342
- }
1343
- function freezeFog(candidate) {
1344
- return Object.freeze({
1345
- ...candidate,
1346
- color: Object.freeze([...candidate.color])
1347
- });
1348
- }
1349
- function selectEnvironment(input) {
1350
- if (input.environments.length > 1) {
1351
- return err(
1352
- new EnvironmentSourceConflictError(
1353
- [...input.environments].sort((left, right) => left.entityKey - right.entityKey).map(({ kind, entityKey, sourceKey }) => ({ kind, entityKey, sourceKey }))
1354
- )
1355
- );
1356
- }
1357
- if (input.fogs.length > 1) return err(new FogCardinalityError(input.fogs.length));
1358
- const selectedFog = input.fogs[0];
1359
- if (selectedFog !== void 0) {
1360
- const issue = validateFogParameters(selectedFog);
1361
- if (issue !== void 0) {
1362
- return err(new EnvironmentSelectionParameterError(issue.field, issue.value, issue.expected));
1363
- }
1364
- }
1365
- const selected = input.environments[0];
1366
- if (selected?.kind === "atmosphere") {
1367
- const invalid = validateAtmosphereParameters(selected.atmosphere);
1368
- if (invalid !== void 0) return err(invalid);
1369
- }
1370
- if (selected?.kind === "atmosphere" && input.suns.length !== 1) {
1371
- return err(new SunCardinalityError(input.suns.length));
1372
- }
1373
- const source = selected === void 0 ? { kind: "none" } : selected.kind === "atmosphere" ? {
1374
- kind: "atmosphere",
1375
- entityKey: selected.entityKey,
1376
- sourceKey: selected.sourceKey,
1377
- atmosphere: Object.freeze({ ...selected.atmosphere })
1378
- } : {
1379
- kind: "image",
1380
- entityKey: selected.entityKey,
1381
- sourceKey: selected.sourceKey
1382
- };
1383
- const sun = input.suns[0] === void 0 ? void 0 : freezeCandidate({ ...input.suns[0] });
1384
- const fog = selectedFog === void 0 ? void 0 : freezeFog(selectedFog);
1385
- const signatureInput = {
1386
- environments: selected === void 0 ? [] : [selected],
1387
- fogs: selectedFog === void 0 ? [] : [selectedFog],
1388
- suns: input.suns
1389
- };
1390
- const signatures = environmentFactSignatures(signatureInput);
1391
- const result = {
1392
- source: Object.freeze(source),
1393
- fog,
1394
- ...signatures,
1395
- revision: 0,
1396
- sun
1397
- };
1398
- Object.defineProperty(result, "lane", { value: input.lane, enumerable: false });
1399
- return ok(Object.freeze(result));
1400
- }
1401
-
1402
1257
  // src/extract/directional-shadow-projection.ts
1403
1258
  function projectDirectionalShadow(fits, mapSize, shadowFilter, shadowAngularRadius, maxPenumbraTexels) {
1404
1259
  if (!Number.isFinite(mapSize) || mapSize < 1) return void 0;
@@ -2054,9 +1909,10 @@ function extractFrames(worlds, owner, assets, pipelineState, materialSnapshotCac
2054
1909
  });
2055
1910
  const frame = extractFrame(world, prepared);
2056
1911
  framesByWorld.set(wi, frame);
2057
- } catch (err8) {
1912
+ } catch (err5) {
1913
+ if (err5 instanceof MotionBlurValidationError) throw err5;
2058
1914
  try {
2059
- createWorldInternalView(world)._routeError(err8, {
1915
+ createWorldInternalView(world)._routeError(err5, {
2060
1916
  severity: Severity.Error,
2061
1917
  systemName: `RenderSystem.extractFrames(world[${wi}])`
2062
1918
  });
@@ -2216,6 +2072,7 @@ function extractFrames(worlds, owner, assets, pipelineState, materialSnapshotCac
2216
2072
  directionalCsmDirection
2217
2073
  };
2218
2074
  const volumetricFog = resourceOwnerFrame?.volumetricFog;
2075
+ const cloudLayer = resourceOwnerFrame?.cloudLayer;
2219
2076
  const skylight = resourceOwnerFrame?.skylight;
2220
2077
  const skylightCount = resourceOwnerFrame?.skylightCount ?? 0;
2221
2078
  const skybox = resourceOwnerFrame?.skybox;
@@ -2271,6 +2128,7 @@ function extractFrames(worlds, owner, assets, pipelineState, materialSnapshotCac
2271
2128
  reflectionProbes,
2272
2129
  lights,
2273
2130
  ...volumetricFog === void 0 ? {} : { volumetricFog: { ...volumetricFog, worldId: resourceOwner } },
2131
+ ...cloudLayer === void 0 ? {} : { cloudLayer },
2274
2132
  renderables,
2275
2133
  dispatch: dispatchEntries,
2276
2134
  shadowCasterEntityKeys,
@@ -2360,6 +2218,16 @@ function extractFrame(world, context) {
2360
2218
  const directionalLightQuery = world.query({ read: [DirectionalLight] }).unwrap();
2361
2219
  const worldInternal = createWorldInternalView(world);
2362
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
+ }
2363
2231
  const cameraRoles = selectCameraRoles(world, context.cameraEntityKey);
2364
2232
  const cameras = [...cameraRoles.display];
2365
2233
  const auxiliaryCameras = cameraRoles.auxiliary;
@@ -2927,7 +2795,9 @@ function extractFrame(world, context) {
2927
2795
  rayleigh: value.rayleigh,
2928
2796
  mieCoefficient: value.mieCoefficient,
2929
2797
  mieDirectionalG: value.mieDirectionalG,
2930
- sunAngularRadius: value.sunAngularRadius
2798
+ sunAngularRadius: value.sunAngularRadius,
2799
+ circumsolarStrength: value.circumsolarStrength,
2800
+ circumsolarWidth: value.circumsolarWidth
2931
2801
  };
2932
2802
  environmentCandidates.push({
2933
2803
  kind: "atmosphere",
@@ -3015,7 +2885,6 @@ function extractFrame(world, context) {
3015
2885
  let dispatch = [];
3016
2886
  const shadowMembershipEntries = [];
3017
2887
  const materialSnapshotCache = /* @__PURE__ */ new Map();
3018
- const instanceSnapshotCache = /* @__PURE__ */ new Map();
3019
2888
  const skinnedMaterialSnapshotCache = /* @__PURE__ */ new Map();
3020
2889
  const meshRendererQuery = context.renderables === "none" ? [] : world.query({
3021
2890
  read: [MeshRenderer],
@@ -3052,14 +2921,18 @@ function extractFrame(world, context) {
3052
2921
  const flushPendingDispatch = (pending) => {
3053
2922
  for (const entry of pending) dispatch.push(entry);
3054
2923
  };
3055
- for (const row of meshRendererQuery) {
3056
- if (context.renderables === "full" && renderableEntities !== void 0 && !renderableEntities.has(row.entity)) {
3057
- 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
+ }
3058
2930
  }
2931
+ };
2932
+ for (const row of requestedRows) {
3059
2933
  const hasTransform = row.has(Transform);
3060
2934
  const meshFilter = row.get(MeshFilter);
3061
- const instancesData = row.get(Instances);
3062
- const hasInstances = instancesData !== void 0;
2935
+ const hasInstances = row.has(Instances);
3063
2936
  const skin = row.get(Skin);
3064
2937
  const morphWeightsView = worldInternal._getArrayView(row.entity, MorphWeights, "weights");
3065
2938
  const hasMeshFilter = meshFilter !== void 0;
@@ -3085,6 +2958,9 @@ function extractFrame(world, context) {
3085
2958
  if (!authorVisible && !retainHidden) {
3086
2959
  continue;
3087
2960
  }
2961
+ if (isRenderable && fAssetHandle === 0) {
2962
+ continue;
2963
+ }
3088
2964
  const layerVal = fLayerValue ?? 0;
3089
2965
  const pendingDispatch = [];
3090
2966
  const materialsView = worldInternal._getArrayView(entity, MeshRenderer, "materials");
@@ -3270,28 +3146,28 @@ function extractFrame(world, context) {
3270
3146
  } else {
3271
3147
  const resolvedResult = walkMaterialPassesOverSharedRefs(world, tagged, assets);
3272
3148
  if (!resolvedResult.ok) {
3273
- const err8 = resolvedResult.error;
3274
- switch (err8.code) {
3149
+ const err5 = resolvedResult.error;
3150
+ switch (err5.code) {
3275
3151
  case "material-parent-not-found":
3276
3152
  case "material-no-effective-pass":
3277
3153
  case "material-value-unknown":
3278
3154
  case "material-value-type-mismatch":
3279
3155
  case "material-contract-program-mismatch":
3280
- worldInternal._routeError(err8, {
3156
+ worldInternal._routeError(err5, {
3281
3157
  severity: Severity.Error,
3282
- systemName: `RenderSystem.extract (${err8.code})`
3158
+ systemName: `RenderSystem.extract (${err5.code})`
3283
3159
  });
3284
3160
  break;
3285
3161
  case "material-circular-inheritance":
3286
- worldInternal._routeError(err8, {
3162
+ worldInternal._routeError(err5, {
3287
3163
  severity: Severity.Error,
3288
3164
  systemName: "RenderSystem.extract (material-circular-inheritance)"
3289
3165
  });
3290
3166
  break;
3291
3167
  default:
3292
- worldInternal._routeError(err8, {
3168
+ worldInternal._routeError(err5, {
3293
3169
  severity: Severity.Error,
3294
- systemName: `RenderSystem.extract (_materialWalk: ${err8.code})`
3170
+ systemName: `RenderSystem.extract (_materialWalk: ${err5.code})`
3295
3171
  });
3296
3172
  }
3297
3173
  continue;
@@ -3548,6 +3424,12 @@ function extractFrame(world, context) {
3548
3424
  baseColor,
3549
3425
  metallic: metallicPv,
3550
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
+ ),
3551
3433
  ...specularColorPv !== void 0 && {
3552
3434
  specularColor: [
3553
3435
  specularColorPv[0] ?? 1,
@@ -3898,44 +3780,26 @@ function extractFrame(world, context) {
3898
3780
  };
3899
3781
  let instancesSnap;
3900
3782
  if (hasInstances) {
3901
- const collectionId = instancesData?.collectionId;
3902
- let collectionResult = collectionId !== void 0 ? instanceSnapshotCache.get(collectionId) : void 0;
3903
- if (collectionResult === void 0) {
3904
- collectionResult = collectionId !== void 0 && collectionId > 0 && instanceCollections !== void 0 ? instanceCollections.snapshot(collectionId) : err(
3905
- new InstanceCollectionError(
3906
- "instance-collection-invalid",
3907
- "Instances.collectionId references a live renderer-owned collection",
3908
- "create the collection through renderer.instances before attaching Instances",
3909
- {
3910
- operation: "inspect",
3911
- expected: "a positive collectionId with a live renderer owner",
3912
- actual: Number(collectionId ?? 0),
3913
- ...collectionId === void 0 ? {} : { collectionId }
3914
- }
3915
- )
3916
- );
3917
- if (collectionId !== void 0)
3918
- instanceSnapshotCache.set(collectionId, collectionResult);
3919
- }
3920
- if (collectionResult === void 0) continue;
3921
- if (!collectionResult.ok) {
3922
- 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, {
3923
3787
  severity: Severity.Error,
3924
- systemName: "RenderSystem.extract (Instances collection)"
3788
+ systemName: "RenderSystem.extract (Instances transforms)"
3925
3789
  });
3926
3790
  continue;
3927
3791
  }
3792
+ const projected = instanceCollections?.project(world, entity, transforms);
3928
3793
  instancesSnap = {
3929
- transforms: collectionResult.value.transforms,
3930
- instanceCount: collectionResult.value.count,
3931
- collectionId: collectionResult.value.collectionId,
3932
- revision: collectionResult.value.revision,
3933
- capacity: collectionResult.value.capacity,
3934
- dirtyRanges: collectionResult.value.dirtyRanges,
3794
+ transforms: projected?.transforms ?? new Float32Array(transforms),
3795
+ instanceCount: transforms.length / 16,
3935
3796
  cacheKey: entity,
3936
- // Explicit collection revisions supersede ECS archetype content
3937
- // hashes; retain zero as the legacy sprite-only field value.
3938
- 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
+ }
3939
3803
  };
3940
3804
  }
3941
3805
  const baseRenderable = {
@@ -4123,6 +3987,7 @@ function extractFrame(world, context) {
4123
3987
  environment,
4124
3988
  environmentReady: true,
4125
3989
  ...volumetricFog === void 0 ? {} : { volumetricFog },
3990
+ ...cloudLayer === void 0 ? {} : { cloudLayer },
4126
3991
  renderables,
4127
3992
  dispatch,
4128
3993
  shadowCasterEntityKeys,
@@ -4823,6 +4688,12 @@ function resolveMaterialSnapshot(handleRaw, world, assetsRef, materialSnapshotCa
4823
4688
  baseColor,
4824
4689
  metallic: metallicPv,
4825
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
+ ),
4826
4697
  ...specularColorPv !== void 0 && {
4827
4698
  specularColor: [
4828
4699
  specularColorPv[0] ?? 1,
@@ -5072,12 +4943,22 @@ function collectCameraSnapshots(world) {
5072
4943
  const cameras = [];
5073
4944
  const cameraQuery = world.query({
5074
4945
  read: [Camera],
5075
- optional: [MotionBlur, DynamicResolution, ScreenSpaceReflection, DepthOfField],
4946
+ optional: [
4947
+ MotionBlur,
4948
+ DynamicResolution,
4949
+ ScreenSpaceReflection,
4950
+ DepthOfField,
4951
+ BarrelDistortion
4952
+ ],
5076
4953
  with: [Transform, GlobalTransform]
5077
4954
  }).unwrap();
5078
4955
  for (const row of cameraQuery) {
5079
4956
  const cam = row.get(Camera);
5080
4957
  const motionBlur = row.get(MotionBlur);
4958
+ const barrelDistortion = row.get(BarrelDistortion);
4959
+ const motionBlurResult = resolveMotionBlurParams(motionBlur);
4960
+ if (!motionBlurResult.ok) throw motionBlurResult.error;
4961
+ const motionBlurParams = motionBlurResult.value;
5081
4962
  const depthOfField = row.get(DepthOfField);
5082
4963
  const dynamicResolution = row.get(DynamicResolution);
5083
4964
  const screenSpaceReflection = row.get(ScreenSpaceReflection);
@@ -5105,6 +4986,8 @@ function collectCameraSnapshots(world) {
5105
4986
  const antialias = antialiasFromF32(cam.antialias);
5106
4987
  const dynamicResolutionResult = validateDynamicResolutionCamera(dynamicResolution, antialias);
5107
4988
  if (!dynamicResolutionResult.ok) throw dynamicResolutionResult.error;
4989
+ const barrelDistortionResult = validateBarrelDistortionParameters(barrelDistortion);
4990
+ if (!barrelDistortionResult.ok) throw barrelDistortionResult.error;
5108
4991
  cameras.push({
5109
4992
  entityKey: entity,
5110
4993
  ...target === void 0 ? {} : { target },
@@ -5126,10 +5009,17 @@ function collectCameraSnapshots(world) {
5126
5009
  ...output === void 0 ? {} : { output },
5127
5010
  antialias,
5128
5011
  ...dynamicResolutionResult.value === void 0 ? {} : { dynamicResolution: dynamicResolutionResult.value },
5129
- bloom: bloomEnabledFromF32(cam.bloom),
5012
+ bloom: validateCameraBloom(
5013
+ cam.bloom,
5014
+ cam.bloomThreshold,
5015
+ cam.bloomIntensity,
5016
+ cam.bloomSoftKnee,
5017
+ cam.bloomScatter
5018
+ ),
5130
5019
  bloomThreshold: cam.bloomThreshold,
5131
5020
  bloomIntensity: cam.bloomIntensity,
5132
- bloomBlurRadius: cam.bloomBlurRadius,
5021
+ bloomSoftKnee: cam.bloomSoftKnee,
5022
+ bloomScatter: cam.bloomScatter,
5133
5023
  clearColor: [
5134
5024
  cam.clearColor[0] ?? 0,
5135
5025
  cam.clearColor[1] ?? 0,
@@ -5138,13 +5028,15 @@ function collectCameraSnapshots(world) {
5138
5028
  ],
5139
5029
  ...depthOfFieldResult.ok && depthOfFieldResult.value !== void 0 ? { depthOfField: depthOfFieldResult.value } : {},
5140
5030
  ...depthOfFieldError === void 0 ? {} : { depthOfFieldError },
5141
- ...motionBlur === void 0 ? {} : {
5031
+ ...motionBlurParams === void 0 ? {} : {
5142
5032
  motionBlur: {
5143
- shutterAngle: motionBlur.shutterAngle,
5144
- maxRadiusPixels: motionBlur.maxRadiusPixels,
5145
- sampleCount: motionBlur.sampleCount
5033
+ shutterAngle: motionBlurParams.shutterAngle,
5034
+ maxRadiusPixels: motionBlurParams.maxRadiusPixels,
5035
+ sampleCount: motionBlurParams.sampleCount,
5036
+ targetFps: motionBlurParams.targetFps
5146
5037
  }
5147
5038
  },
5039
+ ...barrelDistortion === void 0 ? {} : { barrelDistortion: barrelDistortionResult.value },
5148
5040
  ...screenSpaceReflection === void 0 ? {} : {
5149
5041
  screenSpaceReflection: {
5150
5042
  maxDistance: screenSpaceReflection.maxDistance,
@@ -5320,11 +5212,14 @@ function textureDigest(texture2) {
5320
5212
  return `fnv1a:${hash.toString(16).padStart(8, "0")}`;
5321
5213
  }
5322
5214
  function extractVolumeSnapshot(world, assets, worldInternal) {
5215
+ const elapsed = world.getResource(Time).elapsed;
5216
+ const worldTimeSeconds = Number.isFinite(elapsed) ? Math.max(0, elapsed) : 0;
5323
5217
  const query = world.query({ read: [VolumetricFog] }).unwrap();
5324
5218
  const authorings = [];
5219
+ const members = [];
5325
5220
  let selectedLight;
5326
- let first;
5327
5221
  for (const row of query) {
5222
+ selectedLight = void 0;
5328
5223
  const source = row.get(VolumetricFog);
5329
5224
  if (source.light === null) continue;
5330
5225
  const selected = resolveSelectedVolumetricLight(world, source.light);
@@ -5349,7 +5244,7 @@ function extractVolumeSnapshot(world, assets, worldInternal) {
5349
5244
  }) : resolved.error,
5350
5245
  { severity: Severity.Error, systemName: "RenderSystem.extract (volumetric-density)" }
5351
5246
  );
5352
- return { status: "degraded" };
5247
+ return { status: "degraded", worldTimeSeconds };
5353
5248
  }
5354
5249
  const densityAsset = resolved.value;
5355
5250
  const guid = assets?.guidOf(densityAsset) ?? `handle:${Number(densityHandle)}`;
@@ -5392,10 +5287,25 @@ function extractVolumeSnapshot(world, assets, worldInternal) {
5392
5287
  albedo: [source.albedo[0] ?? 0, source.albedo[1] ?? 0, source.albedo[2] ?? 0],
5393
5288
  emission: [source.emission[0] ?? 0, source.emission[1] ?? 0, source.emission[2] ?? 0],
5394
5289
  anisotropy: source.anisotropy,
5395
- maxDistance: source.maxDistance
5290
+ maxDistance: source.maxDistance,
5291
+ sampling: source.sampling === 1 ? "density" : "noise"
5396
5292
  };
5397
5293
  authorings.push(authoring);
5398
- 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
+ });
5399
5309
  }
5400
5310
  if (authorings.length === 0) return void 0;
5401
5311
  const extracted = extractVolumetricFog(authorings);
@@ -5404,39 +5314,18 @@ function extractVolumeSnapshot(world, assets, worldInternal) {
5404
5314
  severity: Severity.Error,
5405
5315
  systemName: "RenderSystem.extract (volumetric-fog)"
5406
5316
  });
5407
- return {
5408
- status: "degraded",
5409
- ...first === void 0 ? {} : {
5410
- densityHandle: first.densityHandle,
5411
- densityAsset: first.densityAsset,
5412
- guid: first.guid,
5413
- generation: 1,
5414
- digest: textureDigest(first.densityAsset),
5415
- ...selectedLight === void 0 ? {} : {
5416
- lightEntity: selectedLight.entity,
5417
- lightKind: selectedLight.kind,
5418
- ...selectedLight.pointLightEntity === void 0 ? {} : { pointLightEntity: selectedLight.pointLightEntity },
5419
- ...selectedLight.spotLightEntity === void 0 ? {} : { spotLightEntity: selectedLight.spotLightEntity }
5420
- }
5421
- }
5422
- };
5317
+ return { ...members[0], status: "degraded" };
5423
5318
  }
5424
- if (extracted.value.status === "off" || first === void 0) return { status: "off" };
5425
- const selectedLightFields = selectedLight === void 0 ? {} : {
5426
- lightEntity: selectedLight.entity,
5427
- lightKind: selectedLight.kind,
5428
- ...selectedLight.pointLightEntity === void 0 ? {} : { pointLightEntity: selectedLight.pointLightEntity },
5429
- ...selectedLight.spotLightEntity === void 0 ? {} : { spotLightEntity: selectedLight.spotLightEntity }
5430
- };
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
+ }));
5431
5325
  return {
5432
5326
  status: "available",
5433
- fog: extracted.value.fog,
5434
- densityHandle: first.densityHandle,
5435
- densityAsset: first.densityAsset,
5436
- guid: first.guid,
5437
- generation: 1,
5438
- digest: textureDigest(first.densityAsset),
5439
- ...selectedLightFields
5327
+ ...validatedMembers[0],
5328
+ additional: validatedMembers.slice(1)
5440
5329
  };
5441
5330
  }
5442
5331
  var PROBE_R_MIN = R_MIN;
@@ -5737,6 +5626,17 @@ var ProbeBlendSceneProjection = class {
5737
5626
  };
5738
5627
  lastDirtyVisitCount = 0;
5739
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([]);
5740
5640
  recordFacts = /* @__PURE__ */ new Map();
5741
5641
  getRecord(objectKey) {
5742
5642
  return this.records.get(objectKey);
@@ -5744,6 +5644,10 @@ var ProbeBlendSceneProjection = class {
5744
5644
  hasRecords() {
5745
5645
  return this.records.size > 0;
5746
5646
  }
5647
+ /** Stable upload projection; rebuilt only when probe/object facts change. */
5648
+ recordBufferProjection() {
5649
+ return this.bufferProjection;
5650
+ }
5747
5651
  inspect() {
5748
5652
  return {
5749
5653
  activeContributorCount: this.lastActiveContributorCount,
@@ -5804,6 +5708,23 @@ var ProbeBlendSceneProjection = class {
5804
5708
  const dirtyReasons = [];
5805
5709
  const affectedObjectKeys = /* @__PURE__ */ new Set();
5806
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
+ }
5807
5728
  const objectKeys = input.objects.map((object) => String(object.objectKey)).sort();
5808
5729
  const previousObjectKeys = previous?.objects.map((object) => String(object.objectKey)).sort() ?? [];
5809
5730
  if (previous === void 0 || !sameList(objectKeys, previousObjectKeys)) {
@@ -5812,7 +5733,7 @@ var ProbeBlendSceneProjection = class {
5812
5733
  }
5813
5734
  if (previous !== void 0 && input.worldRevision !== previous.worldRevision)
5814
5735
  dirtyReasons.push("world");
5815
- if (previous !== void 0 && !sameProbeFacts(input.probes, previous.probes))
5736
+ if (previous !== void 0 && (!sameProbeFacts(input.probes, previous.probes) || input.retainSkyResidualRecords !== previous.retainSkyResidualRecords))
5816
5737
  dirtyReasons.push("probe-fact");
5817
5738
  if (previous !== void 0 && !sameSkyFacts(input, previous)) dirtyReasons.push("sky");
5818
5739
  const previousObjects = new Map(previous?.objects.map((object) => [object.objectKey, object]));
@@ -5889,7 +5810,7 @@ var ProbeBlendSceneProjection = class {
5889
5810
  let record;
5890
5811
  if (admission.error !== void 0) firstError ??= admission.error;
5891
5812
  if (admission.admitted.length === 0) {
5892
- if (input.probes.length === 0) {
5813
+ if (input.probes.length === 0 && input.retainSkyResidualRecords !== true) {
5893
5814
  nextRecords.delete(object.objectKey);
5894
5815
  this.recordFacts.delete(object.objectKey);
5895
5816
  continue;
@@ -5946,8 +5867,9 @@ var ProbeBlendSceneProjection = class {
5946
5867
  firstError ??= admission.error;
5947
5868
  }
5948
5869
  const allocations = previous === void 0 ? nextRecords.size : 0;
5870
+ const resultRecords = Object.freeze([...nextRecords.values()]);
5949
5871
  const result = {
5950
- records: [...nextRecords.values()],
5872
+ records: resultRecords,
5951
5873
  contributors: firstTerms,
5952
5874
  activeContributorCount: firstActiveCount,
5953
5875
  admittedProbeCount: firstAdmittedCount,
@@ -5961,14 +5883,38 @@ var ProbeBlendSceneProjection = class {
5961
5883
  receipt: firstReceipt,
5962
5884
  ...firstError === void 0 ? {} : { error: firstError }
5963
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
+ );
5964
5899
  this.previous = input;
5965
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
+ });
5966
5912
  this.lastError = firstError;
5967
5913
  this.lastReceipt = firstReceipt;
5968
5914
  this.lastActiveContributorCount = firstActiveCount;
5969
5915
  this.lastAdmittedProbeCount = firstAdmittedCount;
5970
5916
  this.lastCoverage = firstCoverage;
5971
- this.lastFinite = [...nextRecords.values()].every(
5917
+ this.lastFinite = this.resultRecords.every(
5972
5918
  (record) => record.bytes.length === PROBE_BLEND_RECORD_BYTE_SIZE
5973
5919
  );
5974
5920
  this.lastSky = input.sky ?? (input.skyIrradiance === void 0 ? { available: false, irradiance: [0, 0, 0], fallbackReason: "no-skylight" } : { available: true, irradiance: input.skyIrradiance });
@@ -5978,6 +5924,6 @@ var ProbeBlendSceneProjection = class {
5978
5924
  }
5979
5925
  };
5980
5926
 
5981
- export { InstanceBoundsCache, OcclusionRenderRuntime, PROBE_MAX_CONTRIBUTORS, ProbeBlendSceneProjection, SKYLIGHT_RECOVERY_FALLBACK, SSR_HISTORY_FORMAT, SsrHistoryOwner, admitProbeContributors, blendLightProbes, buildRectAreaWorldFrame, buildShadowFrusta, createCookieProjectionMatrixData, createExtendedLightingState, createSsrHistoryOwner, createSsrSpatialResources, estimateSsrSpatialMemory, extractFrames, fingerprintNumericArray, glyphTextLayoutSystem, primitiveKey, primitiveKeyId, projectExtendedLightingInspection, promoteExtendedLightingCandidate, recordExtendedLightingFailure, rectAreaFacesPoint, scaledProbeWeight, setOcclusionRuntimeTestHooks, viewKey, viewKeyId };
5982
- //# sourceMappingURL=chunk-4NNZQCL3.mjs.map
5983
- //# sourceMappingURL=chunk-4NNZQCL3.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