@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,5 +1,6 @@
1
1
  import { err, ok } from '@forgeax/engine-types';
2
2
  import { cubeArrayDepthDescriptor, comparisonSamplerDescriptor, cubeArrayDepthFaceView } from '@forgeax/engine-rhi';
3
+ import { InstanceTransformsStrideMismatchError } from '@forgeax/engine-ecs/projection';
3
4
 
4
5
  // src/pipeline/standard-output/auto-exposure/inspection.ts
5
6
  var AutoExposureInvalidParameterError = class extends Error {
@@ -373,16 +374,16 @@ var MaterialSkinAttrMissingError = class extends Error {
373
374
  expected;
374
375
  hint;
375
376
  detail;
376
- constructor(entity, missing2) {
377
+ constructor(entity, missing) {
377
378
  const expected = "pbr-skin material requires mesh.attributes.skinIndex + skinWeight";
378
- const hint = `entity ${entity} uses forgeax::pbr-skin but its MeshAsset is missing ${missing2}; switch the entity to a skinned glTF mesh authored with JOINTS_0 + WEIGHTS_0, or change the material to a non-skin shader via Materials.standard / Materials.unlit`;
379
+ const hint = `entity ${entity} uses forgeax::pbr-skin but its MeshAsset is missing ${missing}; switch the entity to a skinned glTF mesh authored with JOINTS_0 + WEIGHTS_0, or change the material to a non-skin shader via Materials.standard / Materials.unlit`;
379
380
  super(
380
- `material/skin attribute mismatch on entity ${entity}: pbr-skin material with mesh missing ${missing2}`
381
+ `material/skin attribute mismatch on entity ${entity}: pbr-skin material with mesh missing ${missing}`
381
382
  );
382
383
  this.name = "MaterialSkinAttrMissingError";
383
384
  this.expected = expected;
384
385
  this.hint = hint;
385
- this.detail = { entity, missing: missing2 };
386
+ this.detail = { entity, missing };
386
387
  }
387
388
  };
388
389
  var TransmissionCapabilityMissingError = class extends Error {
@@ -667,6 +668,19 @@ var DynamicResolutionTimingUnavailableError = class extends Error {
667
668
  this.detail = detail;
668
669
  }
669
670
  };
671
+ var BarrelDistortionInvalidParameterError = class extends Error {
672
+ code = "barrel-distortion-invalid-parameter";
673
+ expected;
674
+ hint;
675
+ detail;
676
+ constructor(detail) {
677
+ super(`BarrelDistortion.${detail.field} is invalid`);
678
+ this.name = "BarrelDistortionInvalidParameterError";
679
+ this.expected = `BarrelDistortion.${detail.field} must be ${detail.expected}`;
680
+ this.hint = `set BarrelDistortion.${detail.field} to a value that is ${detail.expected}`;
681
+ this.detail = detail;
682
+ }
683
+ };
670
684
  var OwnerStageFailedError = class extends Error {
671
685
  code = "owner-stage-failed";
672
686
  expected = "the owner completes its current frame stage";
@@ -884,8 +898,8 @@ var RenderIntentInvalidError = class extends Error {
884
898
  };
885
899
  var VolumeOwnerConflictError = class extends Error {
886
900
  code = "volume-owner-conflict";
887
- expected = "exactly one global VolumetricFog owner is authored";
888
- hint = "remove additional VolumetricFog owners and retry extraction";
901
+ expected = "at most eight local VolumetricFog owners per rendered World";
902
+ hint = "reduce simultaneously visible volume owners and retry extraction";
889
903
  detail;
890
904
  constructor(ownerCount) {
891
905
  super(`volume-owner-conflict: received ${ownerCount} owners`);
@@ -918,11 +932,12 @@ var VolumeInvalidBoundsError = class extends Error {
918
932
  var VolumeInvalidParametersError = class extends Error {
919
933
  code = "volume-invalid-parameters";
920
934
  expected = "volume parameters remain finite and inside their closed ranges";
921
- hint = "repair extinction, albedo, emission, anisotropy, or maxDistance";
935
+ hint = "repair extinction, albedo, emission, anisotropy, maxDistance, or sampling";
922
936
  detail;
923
937
  constructor(input) {
924
- const field = input.maxDistance !== void 0 && input.maxDistance <= 0 ? "maxDistance" : "parameters";
925
- const value = field === "maxDistance" ? input.maxDistance : input.anisotropy;
938
+ const invalidSampling = input.sampling !== void 0 && input.sampling !== "noise" && input.sampling !== "density";
939
+ const field = invalidSampling ? "sampling" : input.maxDistance !== void 0 && input.maxDistance <= 0 ? "maxDistance" : "parameters";
940
+ const value = invalidSampling ? input.sampling : field === "maxDistance" ? input.maxDistance : input.anisotropy;
926
941
  super(`volume-invalid-parameters: ${field} is outside the authored range`);
927
942
  this.name = "VolumeInvalidParametersError";
928
943
  this.detail = { field, value };
@@ -1240,258 +1255,115 @@ var GpuDrivenPreparationError = class extends Error {
1240
1255
  }
1241
1256
  };
1242
1257
  var MATRIX_STRIDE = 16;
1243
- var INITIAL_CAPACITY = 1;
1244
- function instanceUploadRangesForResident(activeIsNew, dirtyRanges, fullRange) {
1245
- return activeIsNew ? [fullRange] : dirtyRanges;
1246
- }
1247
- function instanceCollectionFailureFacts(cause, recovery, requestedBytes = 0, supportedBytes = void 0, backend = "unknown") {
1248
- return {
1249
- requestedBytes,
1250
- supportedBytes,
1251
- backend,
1252
- owner: "renderer.instances",
1253
- cause,
1254
- recovery
1255
- };
1256
- }
1257
- var InstanceCollectionError = class extends Error {
1258
- code;
1259
- expected;
1260
- hint;
1261
- detail;
1262
- owner = "renderer.instances";
1263
- recovery;
1264
- facts;
1265
- constructor(code, expected, hint, detail, facts) {
1266
- super(`${code}: ${expected}`);
1267
- this.name = "InstanceCollectionError";
1268
- this.code = code;
1269
- this.expected = expected;
1270
- this.hint = hint;
1258
+ var InstanceTransformsError = class extends Error {
1259
+ constructor(detail) {
1260
+ super("Instances.transforms must contain complete finite matrices");
1271
1261
  this.detail = detail;
1272
- this.facts = facts ?? instanceCollectionFailureFacts(
1273
- code,
1274
- hint,
1275
- detail?.operation === "create" || detail?.operation === "replace" ? typeof detail.actual === "number" && Number.isFinite(detail.actual) ? detail.actual * Float32Array.BYTES_PER_ELEMENT : 0 : 0
1276
- );
1277
- this.recovery = this.facts.recovery;
1262
+ this.name = "InstanceTransformsError";
1278
1263
  }
1279
- };
1280
- function nextCapacity(required) {
1281
- let capacity = INITIAL_CAPACITY;
1282
- while (capacity < required) capacity *= 2;
1283
- return capacity;
1284
- }
1285
- function invalid(operation, expected, actual, collectionId, context) {
1286
- const hint = "repair the collection payload and retry the same authoring operation";
1287
- return new InstanceCollectionError(
1288
- "instance-collection-invalid",
1289
- expected,
1290
- hint,
1291
- { operation, expected, actual, ...collectionId === void 0 ? {} : { collectionId } },
1292
- instanceCollectionFailureFacts(
1293
- context?.cause ?? `invalid-${operation}-authoring`,
1294
- context?.recovery ?? hint,
1295
- context?.requestedBytes ?? 0,
1296
- context?.supportedBytes
1297
- )
1298
- );
1299
- }
1300
- function validateTransforms(operation, transforms, collectionId) {
1301
- if (!(transforms instanceof Float32Array)) {
1302
- return invalid(operation, "transforms is a Float32Array", typeof transforms, collectionId, {
1303
- cause: "invalid-transform-type"
1304
- });
1305
- }
1306
- if (transforms.length % MATRIX_STRIDE !== 0) {
1307
- return invalid(
1308
- operation,
1309
- `transforms.length is a multiple of ${MATRIX_STRIDE}`,
1310
- transforms.length,
1311
- collectionId,
1312
- {
1313
- requestedBytes: transforms.byteLength,
1314
- cause: "invalid-transform-stride"
1315
- }
1316
- );
1317
- }
1318
- for (const value of transforms) {
1319
- if (!Number.isFinite(value)) {
1320
- return invalid(operation, "every transform value is finite", value, collectionId, {
1321
- requestedBytes: transforms.byteLength,
1322
- cause: "invalid-transform-value"
1264
+ detail;
1265
+ code = "instance-transforms-invalid";
1266
+ expected = "finite column-major mat4 values, with transforms.length a multiple of 16";
1267
+ hint = "repair Instances.transforms in the World or source SceneAsset and retry";
1268
+ };
1269
+ function validateInstanceTransforms(transforms) {
1270
+ if (transforms.length % MATRIX_STRIDE !== 0)
1271
+ return new InstanceTransformsStrideMismatchError(transforms.length);
1272
+ for (let index = 0; index < transforms.length; index++) {
1273
+ if (!Number.isFinite(transforms[index]))
1274
+ return new InstanceTransformsError({
1275
+ actualLength: transforms.length,
1276
+ nonFiniteIndex: index
1323
1277
  });
1324
- }
1325
1278
  }
1326
1279
  return void 0;
1327
1280
  }
1328
- function appendRange(ranges, start, end) {
1329
- if (start >= end) return;
1330
- let index = 0;
1331
- while (index < ranges.length) {
1332
- const existing = ranges[index];
1333
- if (existing === void 0 || existing.end >= start) break;
1334
- index += 1;
1335
- }
1336
- while (index < ranges.length) {
1337
- const existing = ranges[index];
1338
- if (existing === void 0 || existing.start > end) break;
1339
- start = Math.min(start, existing.start);
1340
- end = Math.max(end, existing.end);
1341
- ranges.splice(index, 1);
1342
- }
1343
- ranges.splice(index, 0, { start, end });
1344
- }
1345
- function appendDirtyRange(record, start, end) {
1346
- appendRange(record.dirtyRanges, start, end);
1347
- }
1348
- function missing(operation, id) {
1349
- return new InstanceCollectionError(
1350
- "instance-collection-not-found",
1351
- `instance collection ${Number(id)} is live and owned by this Renderer`,
1352
- "create a collection with renderer.instances.create or retain the original collection id",
1353
- { operation, expected: "a live instance collection id", actual: Number(id), collectionId: id }
1354
- );
1281
+ function instanceUploadRangesForResident(activeIsNew, dirtyRanges, fullRange) {
1282
+ return activeIsNew ? [fullRange] : dirtyRanges;
1355
1283
  }
1356
- var InstanceCollectionStore = class {
1284
+ var InstanceProjectionStore = class {
1357
1285
  nextId = 1;
1358
- nextInstanceGeneration = 1;
1359
- epochValue = 0;
1360
- disposed = false;
1286
+ nextGeneration = 1;
1287
+ identities = /* @__PURE__ */ new WeakMap();
1361
1288
  records = /* @__PURE__ */ new Map();
1362
1289
  residency = /* @__PURE__ */ new Map();
1363
- get epoch() {
1364
- return this.epochValue;
1365
- }
1366
- create(input) {
1367
- if (this.disposed) {
1368
- return err(
1369
- new InstanceCollectionError(
1370
- "instance-collection-released",
1371
- "the Renderer-owned instance collection store is live",
1372
- "create a new Renderer before authoring instance collections"
1373
- )
1374
- );
1375
- }
1376
- const invalidPayload = validateTransforms("create", input.transforms);
1377
- if (invalidPayload !== void 0) return err(invalidPayload);
1378
- const id = this.nextId++;
1379
- const count = input.transforms.length / MATRIX_STRIDE;
1380
- const generations = this.allocateGenerations(count);
1290
+ project(world, entity, transforms) {
1291
+ const collectionId = this.identities.get(world)?.get(entity) ?? this.nextId++;
1292
+ const previous = this.records.get(collectionId);
1293
+ if (previous !== void 0 && previous.transforms.length === transforms.length && previous.transforms.every((value, index) => Object.is(value, transforms[index])))
1294
+ return previous;
1295
+ const count = transforms.length / MATRIX_STRIDE;
1296
+ const generations = previous?.count === count ? previous.generations : Uint32Array.from({ length: count }, () => this.nextGeneration++);
1381
1297
  const record = {
1382
- id,
1383
- transforms: new Float32Array(input.transforms),
1298
+ collectionId,
1299
+ world,
1300
+ entity,
1301
+ transforms: new Float32Array(transforms),
1384
1302
  generations,
1385
1303
  count,
1386
- capacity: nextCapacity(Math.max(INITIAL_CAPACITY, count)),
1387
- revision: 1,
1388
- dirtyRanges: count === 0 ? [] : [{ start: 0, end: count }],
1389
- lastSnapshotRevision: 0,
1390
- released: false
1304
+ revision: (previous?.revision ?? 0) + 1
1391
1305
  };
1392
- this.records.set(id, record);
1393
- this.epochValue += 1;
1394
- return ok(this.info(record));
1395
- }
1396
- replace(id, transforms, generations) {
1397
- const record = this.live("replace", id);
1398
- if (!record.ok) return record;
1399
- const invalidPayload = validateTransforms("replace", transforms, id);
1400
- if (invalidPayload !== void 0) return err(invalidPayload);
1401
- const count = transforms.length / MATRIX_STRIDE;
1402
- const generationResult = generations === void 0 ? ok(this.allocateGenerations(count)) : this.validateReplacementGenerations(generations, count, id);
1403
- if (!generationResult.ok) return generationResult;
1404
- const replacementGenerations = generationResult.value;
1405
- record.value.transforms = new Float32Array(transforms);
1406
- record.value.generations = replacementGenerations;
1407
- record.value.count = count;
1408
- record.value.capacity = Math.max(record.value.capacity, nextCapacity(Math.max(1, count)));
1409
- record.value.revision += 1;
1410
- record.value.dirtyRanges = count === 0 ? [] : [{ start: 0, end: count }];
1411
- record.value.lastSnapshotRevision = record.value.revision - 1;
1412
- this.epochValue += 1;
1413
- return ok(this.info(record.value));
1414
- }
1415
- update(id, input) {
1416
- const record = this.live("update", id);
1417
- if (!record.ok) return record;
1418
- const invalidPayload = validateTransforms("update", input.transforms, id);
1419
- if (invalidPayload !== void 0) return err(invalidPayload);
1420
- if (!Number.isInteger(input.start) || input.start < 0) {
1421
- return err(
1422
- invalid("update", "start is a non-negative matrix ordinal", input.start, id, {
1423
- requestedBytes: input.transforms.byteLength,
1424
- supportedBytes: record.value.capacity * MATRIX_STRIDE * Float32Array.BYTES_PER_ELEMENT,
1425
- cause: "invalid-update-range-start"
1426
- })
1427
- );
1306
+ return record;
1307
+ }
1308
+ /** Called only after the owning RenderScene accepts its prepared changes. */
1309
+ accept(world, entity, snapshot) {
1310
+ const { collectionId, revision, transforms, generations } = snapshot;
1311
+ if (collectionId === void 0 || revision === void 0 || generations === void 0) return;
1312
+ let entities = this.identities.get(world);
1313
+ if (entities === void 0) {
1314
+ entities = /* @__PURE__ */ new Map();
1315
+ this.identities.set(world, entities);
1428
1316
  }
1429
- const span = input.transforms.length / MATRIX_STRIDE;
1430
- const attemptedEnd = input.start + span;
1431
- if (attemptedEnd > record.value.count) {
1432
- return err(
1433
- invalid(
1434
- "update",
1435
- `start + matrix count is <= collection count (${record.value.count})`,
1436
- attemptedEnd,
1437
- id,
1438
- {
1439
- requestedBytes: attemptedEnd * MATRIX_STRIDE * Float32Array.BYTES_PER_ELEMENT,
1440
- supportedBytes: record.value.count * MATRIX_STRIDE * Float32Array.BYTES_PER_ELEMENT,
1441
- cause: "invalid-update-range-end"
1442
- }
1443
- )
1444
- );
1445
- }
1446
- if (record.value.lastSnapshotRevision === record.value.revision) {
1447
- record.value.dirtyRanges = [];
1317
+ entities.set(entity, collectionId);
1318
+ this.records.set(collectionId, {
1319
+ collectionId,
1320
+ revision,
1321
+ transforms,
1322
+ generations,
1323
+ count: transforms.length / MATRIX_STRIDE,
1324
+ world,
1325
+ entity
1326
+ });
1327
+ }
1328
+ release(world, entity) {
1329
+ const entities = this.identities.get(world);
1330
+ const id = entities?.get(entity);
1331
+ if (id === void 0) return;
1332
+ entities?.delete(entity);
1333
+ this.records.delete(id);
1334
+ this.residency.delete(id);
1335
+ }
1336
+ retain(ids) {
1337
+ for (const record of this.records.values()) {
1338
+ if (!ids.has(record.collectionId)) this.release(record.world, record.entity);
1448
1339
  }
1449
- record.value.transforms.set(input.transforms, input.start * MATRIX_STRIDE);
1450
- record.value.revision += 1;
1451
- appendDirtyRange(record.value, input.start, input.start + span);
1452
- this.epochValue += 1;
1453
- return ok(this.info(record.value));
1454
1340
  }
1455
- inspect(id) {
1456
- const record = this.live("inspect", id);
1457
- return record.ok ? ok(this.info(record.value)) : record;
1341
+ dispose() {
1342
+ this.records.clear();
1343
+ this.residency.clear();
1344
+ this.identities = /* @__PURE__ */ new WeakMap();
1458
1345
  }
1459
- /**
1460
- * Return detached residency facts for every live collection.
1461
- *
1462
- * @internal Record-stage evidence is reported through the two methods below;
1463
- * callers only receive immutable PODs and never GPU handles.
1464
- */
1465
- _inspections() {
1466
- return Object.freeze(
1467
- [...this.records.values()].map((record) => this.projectInspection(record))
1468
- );
1346
+ _resetResidency() {
1347
+ this.residency.clear();
1469
1348
  }
1470
- /** @internal Renderer record owner reports the accepted collection lane. */
1471
1349
  _reportResidency(input) {
1472
1350
  if (!this.records.has(input.collectionId)) return;
1473
1351
  const previous = this.residency.get(input.collectionId);
1474
- const sameFrame = previous !== void 0 && previous.frameNumber === input.frameNumber && previous.error === void 0;
1475
- const uploadRanges = sameFrame ? [...previous.uploadRanges].reduce(
1476
- (ranges, range) => {
1477
- appendRange(ranges, range.start, range.end);
1478
- return ranges;
1479
- },
1480
- input.uploadRanges.map((range) => ({ ...range }))
1481
- ) : input.uploadRanges.map((range) => ({ ...range }));
1352
+ const sameFrame = previous?.frameNumber === input.frameNumber && previous.error === void 0;
1353
+ const ranges = [...sameFrame ? previous.uploadRanges : [], ...input.uploadRanges].map((range) => ({ ...range })).sort((a, b) => a.start - b.start);
1354
+ const uploadRanges = [];
1355
+ for (const range of ranges) {
1356
+ const last = uploadRanges.at(-1);
1357
+ if (last !== void 0 && range.start <= last.end) last.end = Math.max(last.end, range.end);
1358
+ else uploadRanges.push(range);
1359
+ }
1482
1360
  this.residency.set(input.collectionId, {
1483
- frameNumber: input.frameNumber,
1484
- residentGeneration: input.residentGeneration,
1485
- lane: input.lane,
1361
+ ...input,
1486
1362
  uploadRanges,
1487
- uploadedBytes: sameFrame ? previous.uploadedBytes + input.uploadedBytes : input.uploadedBytes,
1488
- requestedBytes: input.requestedBytes,
1489
- supportedBytes: input.supportedBytes,
1490
- backend: input.backend,
1363
+ uploadedBytes: input.uploadedBytes + (sameFrame ? previous.uploadedBytes : 0),
1491
1364
  error: void 0
1492
1365
  });
1493
1366
  }
1494
- /** @internal Renderer record owner reports a typed admission failure. */
1495
1367
  _reportFailure(input) {
1496
1368
  if (!this.records.has(input.collectionId)) return;
1497
1369
  this.residency.set(input.collectionId, {
@@ -1511,155 +1383,24 @@ var InstanceCollectionStore = class {
1511
1383
  }
1512
1384
  });
1513
1385
  }
1514
- /** @internal A lost device invalidates every renderer-owned GPU resident. */
1515
- _resetResidency() {
1516
- this.residency.clear();
1517
- }
1518
- snapshot(id) {
1519
- const record = this.live("inspect", id);
1520
- if (!record.ok) return record;
1521
- const value = record.value;
1522
- value.lastSnapshotRevision = value.revision;
1523
- const result = {
1524
- ...this.info(value),
1525
- transforms: new Float32Array(value.transforms),
1526
- generations: new Uint32Array(value.generations),
1527
- dirtyRanges: value.dirtyRanges.map((range) => ({ ...range }))
1528
- };
1529
- return ok(result);
1530
- }
1531
- /**
1532
- * Read a detached matrix view without advancing the render-consumption
1533
- * cursor. Inspection and picking may call this between authoring updates;
1534
- * the next renderer snapshot must still receive the complete dirty union.
1535
- */
1536
- peek(id) {
1537
- const record = this.live("inspect", id);
1538
- return record.ok ? ok(this.detachedSnapshot(record.value)) : record;
1539
- }
1540
- release(id) {
1541
- const record = this.records.get(id);
1542
- if (record === void 0) return err(missing("release", id));
1543
- if (record.released) {
1544
- return err(
1545
- new InstanceCollectionError(
1546
- "instance-collection-released",
1547
- `instance collection ${Number(id)} has not already been released`,
1548
- "do not reuse a released collection id; create a new collection",
1549
- {
1550
- operation: "release",
1551
- expected: "a live instance collection id",
1552
- actual: Number(id),
1553
- collectionId: id
1554
- }
1555
- )
1556
- );
1557
- }
1558
- record.released = true;
1559
- this.records.delete(id);
1560
- this.residency.delete(id);
1561
- this.epochValue += 1;
1562
- return ok(void 0);
1563
- }
1564
- /** Drop all canonical matrices during Renderer disposal. */
1565
- dispose() {
1566
- if (this.disposed) return;
1567
- this.disposed = true;
1568
- for (const record of this.records.values()) record.released = true;
1569
- this.records.clear();
1570
- this.residency.clear();
1571
- this.epochValue += 1;
1572
- }
1573
- live(operation, id) {
1574
- if (!Number.isInteger(id) || id <= 0) {
1575
- return err(invalid(operation, "collectionId is a positive integer", id, id));
1576
- }
1577
- if (this.disposed) {
1578
- return err(
1579
- new InstanceCollectionError(
1580
- "instance-collection-released",
1581
- "the Renderer-owned instance collection store is live",
1582
- "create a new Renderer before using instance collections",
1583
- { operation, expected: "a live collection store", actual: "disposed", collectionId: id }
1584
- )
1585
- );
1586
- }
1587
- const record = this.records.get(id);
1588
- return record === void 0 ? err(missing(operation, id)) : ok(record);
1589
- }
1590
- detachedSnapshot(record) {
1591
- return {
1592
- ...this.info(record),
1593
- transforms: new Float32Array(record.transforms),
1594
- generations: new Uint32Array(record.generations),
1595
- dirtyRanges: record.dirtyRanges.map((range) => ({ ...range }))
1596
- };
1597
- }
1598
- info(record) {
1599
- return Object.freeze({
1600
- collectionId: record.id,
1601
- count: record.count,
1602
- capacity: record.capacity,
1603
- revision: record.revision
1604
- });
1605
- }
1606
- allocateGenerations(count) {
1607
- const generations = new Uint32Array(count);
1608
- for (let index = 0; index < count; index += 1) {
1609
- generations[index] = this.nextInstanceGeneration;
1610
- this.nextInstanceGeneration = this.nextInstanceGeneration + 1 >>> 0 || 1;
1611
- }
1612
- return generations;
1613
- }
1614
- validateReplacementGenerations(generations, count, collectionId) {
1615
- if (!(generations instanceof Uint32Array) || generations.length !== count) {
1616
- return err(
1617
- invalid(
1618
- "replace",
1619
- `generations is a Uint32Array with ${count} entries`,
1620
- generations instanceof Uint32Array ? generations.length : typeof generations,
1621
- collectionId,
1622
- { requestedBytes: generations?.byteLength ?? 0, cause: "invalid-generation-shape" }
1623
- )
1624
- );
1625
- }
1626
- const seen = /* @__PURE__ */ new Set();
1627
- for (const generation of generations) {
1628
- if (generation === 0 || seen.has(generation)) {
1629
- return err(
1630
- invalid(
1631
- "replace",
1632
- "generations contain unique non-zero identity tokens",
1633
- generation,
1634
- collectionId,
1635
- {
1636
- requestedBytes: generations.byteLength,
1637
- cause: "invalid-generation-identity"
1638
- }
1639
- )
1640
- );
1641
- }
1642
- seen.add(generation);
1643
- if (generation >= this.nextInstanceGeneration) {
1644
- this.nextInstanceGeneration = generation + 1 >>> 0 || 1;
1645
- }
1646
- }
1647
- return ok(new Uint32Array(generations));
1648
- }
1649
- projectInspection(record) {
1650
- const residency = this.residency.get(record.id);
1651
- return Object.freeze({
1652
- ...this.info(record),
1653
- residentGeneration: residency?.residentGeneration,
1654
- lane: residency?.lane ?? "unresident",
1655
- dirtyRanges: Object.freeze(record.dirtyRanges.map((range) => ({ ...range }))),
1656
- uploadRanges: Object.freeze(residency?.uploadRanges.map((range) => ({ ...range })) ?? []),
1657
- uploadedBytes: residency?.uploadedBytes ?? 0,
1658
- requestedBytes: residency?.requestedBytes ?? record.count * MATRIX_STRIDE * 4,
1659
- supportedBytes: residency?.supportedBytes,
1660
- backend: residency?.backend ?? "unknown",
1661
- owner: "renderer.instances",
1662
- error: residency?.error
1386
+ _inspections(frameNumber) {
1387
+ return [...this.records.values()].map((record) => {
1388
+ const resident = this.residency.get(record.collectionId);
1389
+ const current = resident?.frameNumber === frameNumber;
1390
+ return {
1391
+ collectionId: record.collectionId,
1392
+ count: record.count,
1393
+ revision: record.revision,
1394
+ residentGeneration: resident?.residentGeneration,
1395
+ lane: resident?.lane ?? "unresident",
1396
+ uploadRanges: current ? resident.uploadRanges.map((range) => ({ ...range })) : [],
1397
+ uploadedBytes: current ? resident.uploadedBytes : 0,
1398
+ requestedBytes: resident?.requestedBytes ?? record.transforms.byteLength,
1399
+ supportedBytes: resident?.supportedBytes,
1400
+ backend: resident?.backend ?? "unknown",
1401
+ owner: "renderer.instances",
1402
+ error: resident?.error
1403
+ };
1663
1404
  });
1664
1405
  }
1665
1406
  };
@@ -1778,6 +1519,6 @@ var RENDER_PHASE_CATALOG = [
1778
1519
  ...RENDER_RECORD_PHASE_CATALOG
1779
1520
  ];
1780
1521
 
1781
- export { AtmosphereInvalidParameterError, AutoExposureCapabilityUnavailableError, AutoExposureInvalidParameterError, AutoExposureStageFailedError, AutoExposureStaleGenerationError, DEFAULT_MOTION_BLUR_PARAMS, DynamicResolutionInvalidParameterError, DynamicResolutionRequiresTaaError, DynamicResolutionTimingUnavailableError, EnvironmentGenerationFailedError, EnvironmentSourceConflictError, EquirectProjectionFailedError, FXAA_POST_PROCESS_ID, FogCardinalityError, FrameReceiptStaleError, GPU_TEXTURE_USAGE_COPY_DST, GPU_TEXTURE_USAGE_COPY_SRC, GPU_TEXTURE_USAGE_RENDER_ATTACHMENT, GPU_TEXTURE_USAGE_RENDER_ATTACHMENT_AND_TEXTURE_BINDING, GPU_TEXTURE_USAGE_STORAGE_BINDING, GPU_TEXTURE_USAGE_TEXTURE_BINDING, GpuDrivenPreparationError, InstanceCollectionError, InstanceCollectionStore, LifecycleConstructionError, MOTION_BLUR_PARAMS_BYTE_SIZE, MaterialSkinAttrMissingError, MotionBlurValidationError, ObservationUnavailableError, OwnerStageFailedError, PointShadowAtlasBoundsViolationError, PointShadowAtlasUninitializedError, PointsLinesBudgetExceededError, PointsLinesInvalidStyleError, PointsLinesMaterialUnsupportedError, PointsLinesPrepareFailedError, PointsLinesStyleUnsupportedError, PointsLinesTopologyMismatchError, RENDER_PHASE_CATALOG, RenderFeatureCapabilityMissingError, RenderFeatureDrawRecordingFailedError, RenderFeaturePreparationFailedError, RenderFeaturePreparedStateMismatchError, RenderFeatureRegistrationConflictError, RenderFeatureStageFailedError, RenderIntentInvalidError, RenderTargetCapabilityMissingError, RenderTargetDescriptorInvalidError, RenderTargetOperationFailedError, RenderTargetStateInvalidError, RendererContractFailureError, RendererOperationError, SHADOW_ATLAS_DEFAULT_FACE_SIZE, SHADOW_ATLAS_DEFAULT_LAYERS, STANDARD_OUTPUT_TRANSFORM_FEATURE_ID, SceneDataUnavailableError, ShadowAtlas, ShadowInvalidConfigError, SkinMaterialMismatchError, SkinPaletteOverflowError, StandardClusterIndexOverflowError, StandardClusterTransportUnavailableError, StandardLightBudgetExceededError, StandardProfileInvalidError, TaaCapsInsufficientError, TemporalFrameSubmitError, TransmissionCapabilityMissingError, VertexColorVariantConflictError, VideoUploadUnsupportedError, VolumeDensityShapeMismatchError, VolumeInvalidBoundsError, VolumeInvalidParametersError, VolumeOwnerConflictError, createAutoExposureError, createAutoExposureInspection, createLightResourceUnavailable, createVisibilityBudget, effectiveMotionBlurSampleCount, instanceUploadRangesForResident, isMotionBlurIntervalValid, motionBlurExposureScale, motionBlurSampleDelta, motionBlurTemporalDemand, resolveMotionBlurParams, validateMotionBlurParams };
1782
- //# sourceMappingURL=chunk-NB2S7ZRX.mjs.map
1783
- //# sourceMappingURL=chunk-NB2S7ZRX.mjs.map
1522
+ export { AtmosphereInvalidParameterError, AutoExposureCapabilityUnavailableError, AutoExposureInvalidParameterError, AutoExposureStageFailedError, AutoExposureStaleGenerationError, BarrelDistortionInvalidParameterError, DEFAULT_MOTION_BLUR_PARAMS, DynamicResolutionInvalidParameterError, DynamicResolutionRequiresTaaError, DynamicResolutionTimingUnavailableError, EnvironmentGenerationFailedError, EnvironmentSourceConflictError, EquirectProjectionFailedError, FXAA_POST_PROCESS_ID, FogCardinalityError, FrameReceiptStaleError, GPU_TEXTURE_USAGE_COPY_DST, GPU_TEXTURE_USAGE_COPY_SRC, GPU_TEXTURE_USAGE_RENDER_ATTACHMENT, GPU_TEXTURE_USAGE_RENDER_ATTACHMENT_AND_TEXTURE_BINDING, GPU_TEXTURE_USAGE_STORAGE_BINDING, GPU_TEXTURE_USAGE_TEXTURE_BINDING, GpuDrivenPreparationError, InstanceProjectionStore, InstanceTransformsError, LifecycleConstructionError, MOTION_BLUR_PARAMS_BYTE_SIZE, MaterialSkinAttrMissingError, MotionBlurValidationError, ObservationUnavailableError, OwnerStageFailedError, PointShadowAtlasBoundsViolationError, PointShadowAtlasUninitializedError, PointsLinesBudgetExceededError, PointsLinesInvalidStyleError, PointsLinesMaterialUnsupportedError, PointsLinesPrepareFailedError, PointsLinesStyleUnsupportedError, PointsLinesTopologyMismatchError, RENDER_PHASE_CATALOG, RenderFeatureCapabilityMissingError, RenderFeatureDrawRecordingFailedError, RenderFeaturePreparationFailedError, RenderFeaturePreparedStateMismatchError, RenderFeatureRegistrationConflictError, RenderFeatureStageFailedError, RenderIntentInvalidError, RenderTargetCapabilityMissingError, RenderTargetDescriptorInvalidError, RenderTargetOperationFailedError, RenderTargetStateInvalidError, RendererContractFailureError, RendererOperationError, SHADOW_ATLAS_DEFAULT_FACE_SIZE, SHADOW_ATLAS_DEFAULT_LAYERS, STANDARD_OUTPUT_TRANSFORM_FEATURE_ID, SceneDataUnavailableError, ShadowAtlas, ShadowInvalidConfigError, SkinMaterialMismatchError, SkinPaletteOverflowError, StandardClusterIndexOverflowError, StandardClusterTransportUnavailableError, StandardLightBudgetExceededError, StandardProfileInvalidError, TaaCapsInsufficientError, TemporalFrameSubmitError, TransmissionCapabilityMissingError, VertexColorVariantConflictError, VideoUploadUnsupportedError, VolumeDensityShapeMismatchError, VolumeInvalidBoundsError, VolumeInvalidParametersError, VolumeOwnerConflictError, createAutoExposureError, createAutoExposureInspection, createLightResourceUnavailable, createVisibilityBudget, effectiveMotionBlurSampleCount, instanceUploadRangesForResident, isMotionBlurIntervalValid, motionBlurExposureScale, motionBlurSampleDelta, motionBlurTemporalDemand, resolveMotionBlurParams, validateInstanceTransforms, validateMotionBlurParams };
1523
+ //# sourceMappingURL=chunk-WEX45HKH.mjs.map
1524
+ //# sourceMappingURL=chunk-WEX45HKH.mjs.map