@forgeax/engine-render 0.1.28 → 0.1.30

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 (768) hide show
  1. package/README.md +856 -126
  2. package/dist/assembly/atmosphere-shader-prewarm.d.ts +6 -0
  3. package/dist/assembly/atmosphere-shader-prewarm.d.ts.map +1 -0
  4. package/dist/assembly/device-feature-admission.d.ts +4 -3
  5. package/dist/assembly/device-feature-admission.d.ts.map +1 -1
  6. package/dist/assembly/dynamic-geometry-host.d.ts +27 -0
  7. package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
  8. package/dist/assembly/dynamic-geometry-runtime.d.ts +20 -0
  9. package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -0
  10. package/dist/assembly/factory.d.ts +3 -1
  11. package/dist/assembly/factory.d.ts.map +1 -1
  12. package/dist/assembly/gpu-driven-owner.d.ts +10 -0
  13. package/dist/assembly/gpu-driven-owner.d.ts.map +1 -0
  14. package/dist/assembly/host-contract.d.ts +14 -0
  15. package/dist/assembly/host-contract.d.ts.map +1 -1
  16. package/dist/assembly/material/assembly.d.ts +31 -1
  17. package/dist/assembly/material/assembly.d.ts.map +1 -1
  18. package/dist/assembly/material/pipeline-helpers.d.ts +24 -0
  19. package/dist/assembly/material/pipeline-helpers.d.ts.map +1 -0
  20. package/dist/assembly/material-shader-policy.d.ts +3 -1
  21. package/dist/assembly/material-shader-policy.d.ts.map +1 -1
  22. package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -1
  23. package/dist/assembly/recovery/failure-location.d.ts +12 -0
  24. package/dist/assembly/recovery/failure-location.d.ts.map +1 -0
  25. package/dist/assembly/recovery/recovery-attempt.d.ts +1 -6
  26. package/dist/assembly/recovery/recovery-attempt.d.ts.map +1 -1
  27. package/dist/assembly/recovery/renderer-recover.d.ts +7 -4
  28. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  29. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  30. package/dist/assembly/renderer-feature-inspection.d.ts +5 -0
  31. package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -0
  32. package/dist/assembly/renderer-frame-transaction.d.ts +19 -0
  33. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  34. package/dist/assembly/renderer-helpers.d.ts +3 -0
  35. package/dist/assembly/renderer-helpers.d.ts.map +1 -1
  36. package/dist/assembly/renderer-inspection.d.ts +4 -0
  37. package/dist/assembly/renderer-inspection.d.ts.map +1 -1
  38. package/dist/assembly/shader-prewarm-policy.d.ts +7 -1
  39. package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -1
  40. package/dist/assembly/skin-palette-owner.d.ts +8 -0
  41. package/dist/assembly/skin-palette-owner.d.ts.map +1 -0
  42. package/dist/assembly/ssr-shader-prewarm.d.ts +6 -0
  43. package/dist/assembly/ssr-shader-prewarm.d.ts.map +1 -0
  44. package/dist/assembly/webgpu-device-loss.d.ts +15 -0
  45. package/dist/assembly/webgpu-device-loss.d.ts.map +1 -0
  46. package/dist/assembly/webgpu-pbr-ready.d.ts +38 -0
  47. package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -0
  48. package/dist/assembly/webgpu-ready-mipmap.d.ts +11 -0
  49. package/dist/assembly/webgpu-ready-mipmap.d.ts.map +1 -0
  50. package/dist/assembly/webgpu-ready.d.ts +7 -3
  51. package/dist/assembly/webgpu-ready.d.ts.map +1 -1
  52. package/dist/assembly/webgpu-renderer-bootstrap.d.ts +10 -0
  53. package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -0
  54. package/dist/assembly/webgpu-renderer-contract.d.ts +62 -0
  55. package/dist/assembly/webgpu-renderer-contract.d.ts.map +1 -0
  56. package/dist/assembly/webgpu-renderer-guards.d.ts +9 -0
  57. package/dist/assembly/webgpu-renderer-guards.d.ts.map +1 -0
  58. package/dist/assembly/webgpu-renderer-observation.d.ts +6 -0
  59. package/dist/assembly/webgpu-renderer-observation.d.ts.map +1 -0
  60. package/dist/assembly/webgpu-renderer-recovery-failure.d.ts +12 -0
  61. package/dist/assembly/webgpu-renderer-recovery-failure.d.ts.map +1 -0
  62. package/dist/assembly/webgpu-renderer.d.ts +7 -141
  63. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  64. package/dist/assembly/webgpu-vertex-layouts.d.ts +28 -84
  65. package/dist/assembly/webgpu-vertex-layouts.d.ts.map +1 -1
  66. package/dist/authoring.mjs +2 -2
  67. package/dist/capture/scene-projection.d.ts +41 -0
  68. package/dist/capture/scene-projection.d.ts.map +1 -0
  69. package/dist/{chunk-J52NMQKR.mjs → chunk-7MQ3XBSP.mjs} +1098 -844
  70. package/dist/chunk-7MQ3XBSP.mjs.map +1 -0
  71. package/dist/{chunk-GF523LHF.mjs → chunk-BLXGONR2.mjs} +30 -12
  72. package/dist/chunk-BLXGONR2.mjs.map +1 -0
  73. package/dist/{chunk-VSL23LZE.mjs → chunk-C3DDSXYK.mjs} +1188 -463
  74. package/dist/chunk-C3DDSXYK.mjs.map +1 -0
  75. package/dist/{chunk-IQMKJLNU.mjs → chunk-FUUO4UND.mjs} +443 -30
  76. package/dist/chunk-FUUO4UND.mjs.map +1 -0
  77. package/dist/{chunk-J6KACNOH.mjs → chunk-JRBDO2KB.mjs} +617 -7
  78. package/dist/chunk-JRBDO2KB.mjs.map +1 -0
  79. package/dist/{chunk-GE3SDD72.mjs → chunk-MDQJPY3T.mjs} +20 -40
  80. package/dist/chunk-MDQJPY3T.mjs.map +1 -0
  81. package/dist/{chunk-MYJ5RPJO.mjs → chunk-NO4WZCAH.mjs} +3 -3
  82. package/dist/chunk-NO4WZCAH.mjs.map +1 -0
  83. package/dist/{chunk-RBDBZ5R7.mjs → chunk-PA5DRJNI.mjs} +2 -2
  84. package/dist/chunk-PA5DRJNI.mjs.map +1 -0
  85. package/dist/{chunk-MBU4ZVE7.mjs → chunk-PSEQ6QPH.mjs} +4655 -892
  86. package/dist/chunk-PSEQ6QPH.mjs.map +1 -0
  87. package/dist/{chunk-JAASCMXA.mjs → chunk-S5UE2T5P.mjs} +289 -41
  88. package/dist/chunk-S5UE2T5P.mjs.map +1 -0
  89. package/dist/components/camera.d.ts +62 -2
  90. package/dist/components/camera.d.ts.map +1 -1
  91. package/dist/components/directional-light.d.ts +2 -2
  92. package/dist/components/dynamic-resolution.d.ts +15 -0
  93. package/dist/components/dynamic-resolution.d.ts.map +1 -0
  94. package/dist/components/index.d.ts +2 -0
  95. package/dist/components/index.d.ts.map +1 -1
  96. package/dist/components/instances.d.ts +6 -20
  97. package/dist/components/instances.d.ts.map +1 -1
  98. package/dist/components/light-helpers.d.ts.map +1 -1
  99. package/dist/components/reflection-probe.d.ts +1 -0
  100. package/dist/components/reflection-probe.d.ts.map +1 -1
  101. package/dist/components/scene-instance.d.ts +2 -1
  102. package/dist/components/scene-instance.d.ts.map +1 -1
  103. package/dist/components/screen-space-reflection.d.ts +14 -0
  104. package/dist/components/screen-space-reflection.d.ts.map +1 -0
  105. package/dist/components/skylight.d.ts +4 -1
  106. package/dist/components/skylight.d.ts.map +1 -1
  107. package/dist/construct-renderer.mjs +14809 -7570
  108. package/dist/construct-renderer.mjs.map +1 -1
  109. package/dist/device/device-scope.d.ts +2 -0
  110. package/dist/device/device-scope.d.ts.map +1 -1
  111. package/dist/device/gpu-residency.d.ts +3 -14
  112. package/dist/device/gpu-residency.d.ts.map +1 -1
  113. package/dist/dynamic-geometry.d.ts.map +1 -1
  114. package/dist/environment/background.d.ts +7 -0
  115. package/dist/environment/background.d.ts.map +1 -0
  116. package/dist/environment/ibl.d.ts +11 -0
  117. package/dist/environment/ibl.d.ts.map +1 -0
  118. package/dist/environment/storage.d.ts +14 -0
  119. package/dist/environment/storage.d.ts.map +1 -0
  120. package/dist/errors/gpu-driven.d.ts +6 -3
  121. package/dist/errors/gpu-driven.d.ts.map +1 -1
  122. package/dist/errors/render.d.ts +41 -4
  123. package/dist/errors/render.d.ts.map +1 -1
  124. package/dist/extract/camera.d.ts.map +1 -1
  125. package/dist/extract/contracts.d.ts +7 -0
  126. package/dist/extract/contracts.d.ts.map +1 -1
  127. package/dist/extract/gpu-driven.d.ts +50 -3
  128. package/dist/extract/gpu-driven.d.ts.map +1 -1
  129. package/dist/features/host.d.ts +23 -1
  130. package/dist/features/host.d.ts.map +1 -1
  131. package/dist/features/noise-texture.d.ts +17 -0
  132. package/dist/features/noise-texture.d.ts.map +1 -0
  133. package/dist/features/plan.d.ts +83 -2
  134. package/dist/features/plan.d.ts.map +1 -1
  135. package/dist/features/prepared-gpu-work.d.ts +37 -4
  136. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  137. package/dist/features/prepared-graphics-store.d.ts.map +1 -1
  138. package/dist/features/prepared-graphics.d.ts +5 -0
  139. package/dist/features/prepared-graphics.d.ts.map +1 -1
  140. package/dist/features/render-graph-compute.d.ts +5 -3
  141. package/dist/features/render-graph-compute.d.ts.map +1 -1
  142. package/dist/features/render-graph-contribution.d.ts +11 -3
  143. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  144. package/dist/features/render-graph-raster.d.ts +19 -3
  145. package/dist/features/render-graph-raster.d.ts.map +1 -1
  146. package/dist/features/types.d.ts +11 -0
  147. package/dist/features/types.d.ts.map +1 -1
  148. package/dist/fullscreen-post-process-pass.d.ts +2 -0
  149. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  150. package/dist/gpu-driven/batch-topology.d.ts +34 -1
  151. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  152. package/dist/gpu-driven/material-artifacts.d.ts +24 -0
  153. package/dist/gpu-driven/material-artifacts.d.ts.map +1 -0
  154. package/dist/gpu-driven/material-bindings.d.ts +7 -0
  155. package/dist/gpu-driven/material-bindings.d.ts.map +1 -0
  156. package/dist/gpu-driven/pbr-program.d.ts +10 -0
  157. package/dist/gpu-driven/pbr-program.d.ts.map +1 -0
  158. package/dist/gpu-driven/prepared-draw.d.ts +2 -0
  159. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  160. package/dist/gpu-driven/production-raster.d.ts +169 -27
  161. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  162. package/dist/gpu-driven/shadow-views.d.ts +126 -0
  163. package/dist/gpu-driven/shadow-views.d.ts.map +1 -0
  164. package/dist/gpu-driven/view-gpu.d.ts +18 -2
  165. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  166. package/dist/gpu-resource.d.ts +5 -2
  167. package/dist/gpu-resource.d.ts.map +1 -1
  168. package/dist/gpu-scene-schema.d.ts +2 -8
  169. package/dist/gpu-scene-schema.d.ts.map +1 -1
  170. package/dist/gpu-scene.d.ts +14 -0
  171. package/dist/gpu-scene.d.ts.map +1 -1
  172. package/dist/gpu-texture-usage.d.ts +1 -0
  173. package/dist/gpu-texture-usage.d.ts.map +1 -1
  174. package/dist/hdrp-buffers.d.ts +9 -0
  175. package/dist/hdrp-buffers.d.ts.map +1 -1
  176. package/dist/ibl/IblPipelineCache.d.ts +2 -0
  177. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  178. package/dist/ibl/frame-resources.d.ts +8 -0
  179. package/dist/ibl/frame-resources.d.ts.map +1 -0
  180. package/dist/ibl/skylight-bind-group.d.ts +3 -1
  181. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  182. package/dist/index.d.ts +87 -75
  183. package/dist/index.d.ts.map +1 -1
  184. package/dist/index.mjs +10 -8
  185. package/dist/index.mjs.map +1 -1
  186. package/dist/inspection-types.d.ts +180 -1
  187. package/dist/inspection-types.d.ts.map +1 -1
  188. package/dist/instances-derived-bounds.d.ts +11 -0
  189. package/dist/instances-derived-bounds.d.ts.map +1 -1
  190. package/dist/instances.d.ts +89 -44
  191. package/dist/instances.d.ts.map +1 -1
  192. package/dist/internal.d.ts +3 -0
  193. package/dist/internal.d.ts.map +1 -1
  194. package/dist/internal.mjs +117 -9
  195. package/dist/internal.mjs.map +1 -1
  196. package/dist/lifecycle.d.ts +2 -1
  197. package/dist/lifecycle.d.ts.map +1 -1
  198. package/dist/material-row.d.ts +15 -0
  199. package/dist/material-row.d.ts.map +1 -0
  200. package/dist/materials.d.ts +15 -0
  201. package/dist/materials.d.ts.map +1 -1
  202. package/dist/pbr-pipeline.d.ts +23 -5
  203. package/dist/pbr-pipeline.d.ts.map +1 -1
  204. package/dist/pipeline/render-extent.d.ts +51 -0
  205. package/dist/pipeline/render-extent.d.ts.map +1 -0
  206. package/dist/pipeline/standard-build-context.d.ts +7 -0
  207. package/dist/pipeline/standard-build-context.d.ts.map +1 -0
  208. package/dist/pipeline/standard-forward-lane.d.ts +3 -2
  209. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  210. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts +12 -0
  211. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts.map +1 -0
  212. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts +70 -0
  213. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts.map +1 -0
  214. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts +75 -0
  215. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts.map +1 -0
  216. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts +111 -0
  217. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts.map +1 -0
  218. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts +16 -0
  219. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts.map +1 -0
  220. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts +14 -0
  221. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts.map +1 -0
  222. package/dist/pipeline/standard-output/auto-exposure/state.d.ts +46 -0
  223. package/dist/pipeline/standard-output/auto-exposure/state.d.ts.map +1 -0
  224. package/dist/pipeline/standard-output/color-transform.d.ts +27 -0
  225. package/dist/pipeline/standard-output/color-transform.d.ts.map +1 -0
  226. package/dist/pipeline/standard-output/graph.d.ts +15 -0
  227. package/dist/pipeline/standard-output/graph.d.ts.map +1 -0
  228. package/dist/pipeline/standard-output/lut-admission.d.ts +29 -0
  229. package/dist/pipeline/standard-output/lut-admission.d.ts.map +1 -0
  230. package/dist/pipeline/standard-output/lut-gpu.d.ts +48 -0
  231. package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -0
  232. package/dist/pipeline/standard-output/lut-state.d.ts +68 -0
  233. package/dist/pipeline/standard-output/lut-state.d.ts.map +1 -0
  234. package/dist/pipeline/standard-output/resources.d.ts +10 -0
  235. package/dist/pipeline/standard-output/resources.d.ts.map +1 -0
  236. package/dist/pipeline/standard-output/types.d.ts +39 -0
  237. package/dist/pipeline/standard-output/types.d.ts.map +1 -0
  238. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  239. package/dist/pipeline/standard-post.d.ts +2 -2
  240. package/dist/pipeline/standard-post.d.ts.map +1 -1
  241. package/dist/pipeline/standard-profile.d.ts +2 -1
  242. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  243. package/dist/pipeline-builder.d.ts +5 -2
  244. package/dist/pipeline-builder.d.ts.map +1 -1
  245. package/dist/pipeline-spec-types.d.ts +4 -0
  246. package/dist/pipeline-spec-types.d.ts.map +1 -1
  247. package/dist/pipeline-spec.d.ts +1 -9
  248. package/dist/pipeline-spec.d.ts.map +1 -1
  249. package/dist/plugin.d.ts.map +1 -1
  250. package/dist/points-lines/standard-owner.d.ts +1 -1
  251. package/dist/points-lines/standard-owner.d.ts.map +1 -1
  252. package/dist/post-process-errors.d.ts +9 -2
  253. package/dist/post-process-errors.d.ts.map +1 -1
  254. package/dist/prepare/extended-lighting/resources.d.ts +3 -3
  255. package/dist/prepare/prepared-graphics-resolver.d.ts +6 -1
  256. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  257. package/dist/record/dynamic-geometry-consumption.d.ts +15 -0
  258. package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -0
  259. package/dist/record/frame-lighting.d.ts +3 -3
  260. package/dist/record/frame-lighting.d.ts.map +1 -1
  261. package/dist/record/frame-snapshot.d.ts +109 -13
  262. package/dist/record/frame-snapshot.d.ts.map +1 -1
  263. package/dist/record/frame-targets.d.ts.map +1 -1
  264. package/dist/record/frame.d.ts +41 -5
  265. package/dist/record/frame.d.ts.map +1 -1
  266. package/dist/record/main-pass-geometry.d.ts +13 -9
  267. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  268. package/dist/record/main-pass-material.d.ts +43 -3
  269. package/dist/record/main-pass-material.d.ts.map +1 -1
  270. package/dist/record/main-pass-sprite-draws.d.ts +2 -10
  271. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  272. package/dist/record/main-pass.d.ts +14 -2
  273. package/dist/record/main-pass.d.ts.map +1 -1
  274. package/dist/record/mesh-ssbo.d.ts +15 -6
  275. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  276. package/dist/record/prepared-material-bindings.d.ts +19 -0
  277. package/dist/record/prepared-material-bindings.d.ts.map +1 -0
  278. package/dist/record/recovery-pipeline.d.ts +1 -0
  279. package/dist/record/recovery-pipeline.d.ts.map +1 -1
  280. package/dist/record/render-context.d.ts +101 -22
  281. package/dist/record/render-context.d.ts.map +1 -1
  282. package/dist/record/shadow-pass.d.ts +62 -7
  283. package/dist/record/shadow-pass.d.ts.map +1 -1
  284. package/dist/record/skybox-post-pass.d.ts +1 -1
  285. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  286. package/dist/record/typed-frame-graph.d.ts +39 -8
  287. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  288. package/dist/record/view-ubo.d.ts +1 -0
  289. package/dist/record/view-ubo.d.ts.map +1 -1
  290. package/dist/recovery/render-system-candidate.d.ts +10 -2
  291. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  292. package/dist/recovery/render-system-roots.d.ts +11 -0
  293. package/dist/recovery/render-system-roots.d.ts.map +1 -0
  294. package/dist/recovery/types.d.ts +76 -0
  295. package/dist/recovery/types.d.ts.map +1 -0
  296. package/dist/reflection/background.d.ts +14 -0
  297. package/dist/reflection/background.d.ts.map +1 -0
  298. package/dist/reflection/filter.d.ts.map +1 -1
  299. package/dist/reflection/projection.d.ts +1 -0
  300. package/dist/reflection/projection.d.ts.map +1 -1
  301. package/dist/reflection/record-owner.d.ts +4 -4
  302. package/dist/reflection/record-owner.d.ts.map +1 -1
  303. package/dist/render-contract.d.ts +211 -53
  304. package/dist/render-contract.d.ts.map +1 -1
  305. package/dist/render-graph-primitives.d.ts +1 -0
  306. package/dist/render-graph-primitives.d.ts.map +1 -1
  307. package/dist/render-pipeline.d.ts +81 -6
  308. package/dist/render-pipeline.d.ts.map +1 -1
  309. package/dist/render-system-extract-tail.d.ts +15 -6
  310. package/dist/render-system-extract-tail.d.ts.map +1 -1
  311. package/dist/render-system-extract.d.ts +128 -41
  312. package/dist/render-system-extract.d.ts.map +1 -1
  313. package/dist/render-system-projections.d.ts +22 -0
  314. package/dist/render-system-projections.d.ts.map +1 -0
  315. package/dist/render-system.d.ts +27 -77
  316. package/dist/render-system.d.ts.map +1 -1
  317. package/dist/scene/render-scene-types.d.ts +14 -7
  318. package/dist/scene/render-scene-types.d.ts.map +1 -1
  319. package/dist/scene/render-scene.d.ts +31 -11
  320. package/dist/scene/render-scene.d.ts.map +1 -1
  321. package/dist/scene/shadow-visibility.d.ts +5 -0
  322. package/dist/scene/shadow-visibility.d.ts.map +1 -0
  323. package/dist/ssao-config.d.ts +8 -6
  324. package/dist/ssao-config.d.ts.map +1 -1
  325. package/dist/ssr/admission.d.ts +70 -1
  326. package/dist/ssr/admission.d.ts.map +1 -1
  327. package/dist/ssr/compose.d.ts +13 -0
  328. package/dist/ssr/compose.d.ts.map +1 -0
  329. package/dist/ssr/errors.d.ts +35 -0
  330. package/dist/ssr/errors.d.ts.map +1 -1
  331. package/dist/ssr/graph.d.ts +60 -0
  332. package/dist/ssr/graph.d.ts.map +1 -0
  333. package/dist/ssr/history.d.ts +97 -0
  334. package/dist/ssr/history.d.ts.map +1 -0
  335. package/dist/ssr/hiz.d.ts +37 -0
  336. package/dist/ssr/hiz.d.ts.map +1 -0
  337. package/dist/ssr/inspection.d.ts +42 -0
  338. package/dist/ssr/inspection.d.ts.map +1 -0
  339. package/dist/ssr/resources.d.ts +58 -0
  340. package/dist/ssr/resources.d.ts.map +1 -0
  341. package/dist/ssr/temporal.d.ts +38 -0
  342. package/dist/ssr/temporal.d.ts.map +1 -0
  343. package/dist/systems/skin-palette-allocator.d.ts +32 -10
  344. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  345. package/dist/systems/skin-palette-types.d.ts +15 -0
  346. package/dist/systems/skin-palette-types.d.ts.map +1 -1
  347. package/dist/systems/transparent-dispatch.d.ts +9 -0
  348. package/dist/systems/transparent-dispatch.d.ts.map +1 -0
  349. package/dist/targets/material-source.d.ts +7 -0
  350. package/dist/targets/material-source.d.ts.map +1 -1
  351. package/dist/temporal/frame-coordinator.d.ts +7 -0
  352. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  353. package/dist/temporal/gpu.d.ts +8 -0
  354. package/dist/temporal/gpu.d.ts.map +1 -1
  355. package/dist/temporal/history.d.ts.map +1 -1
  356. package/dist/temporal/index.mjs +6 -6
  357. package/dist/temporal/inspection.d.ts.map +1 -1
  358. package/dist/temporal/standard-scene-data.d.ts +4 -2
  359. package/dist/temporal/standard-scene-data.d.ts.map +1 -1
  360. package/dist/temporal/target-coverage-attachment.d.ts +15 -0
  361. package/dist/temporal/target-coverage-attachment.d.ts.map +1 -0
  362. package/dist/temporal/temporal-view.d.ts +6 -0
  363. package/dist/temporal/temporal-view.d.ts.map +1 -1
  364. package/dist/temporal/view.d.ts +6 -0
  365. package/dist/temporal/view.d.ts.map +1 -1
  366. package/dist/typed-render-graph-primitives.d.ts +41 -1
  367. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  368. package/dist/typed-shadow-passes.d.ts +3 -1
  369. package/dist/typed-shadow-passes.d.ts.map +1 -1
  370. package/dist/volume/component.d.ts +1 -0
  371. package/dist/volume/component.d.ts.map +1 -1
  372. package/dist/volume/temporal.d.ts +6 -0
  373. package/dist/volume/temporal.d.ts.map +1 -1
  374. package/package.json +21 -20
  375. package/src/__tests__/auto-exposure-gpu-evidence.ts +291 -0
  376. package/src/__tests__/auto-exposure-inspection.unit.test.ts +80 -0
  377. package/src/__tests__/auto-exposure-transaction.integration.test.ts +99 -0
  378. package/src/__tests__/auto-exposure.browser.test.ts +33 -0
  379. package/src/__tests__/auto-exposure.dawn.test.ts +33 -0
  380. package/src/__tests__/capture-scene-projection.unit.test.ts +24 -0
  381. package/src/__tests__/detached-inspection.integration.test.ts +5 -0
  382. package/src/__tests__/device-feature-admission.unit.test.ts +15 -24
  383. package/src/__tests__/device-loss-fanout.unit.test.ts +43 -0
  384. package/src/__tests__/device-scope-lifecycle.unit.test.ts +18 -0
  385. package/src/__tests__/device-scope-stale-matrix.unit.test.ts +18 -0
  386. package/src/__tests__/docs-gate-green.unit.test.ts +3 -3
  387. package/src/__tests__/dynamic-geometry-batch.unit.test.ts +157 -0
  388. package/src/__tests__/dynamic-geometry.unit.test.ts +36 -0
  389. package/src/__tests__/dynamic-resolution-plugin.integration.test.ts +81 -0
  390. package/src/__tests__/factory-contract.integration.test.ts +231 -9
  391. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +19 -0
  392. package/src/__tests__/feature-depth-input.dawn.test.ts +121 -0
  393. package/src/__tests__/feature-noise.unit.test.ts +38 -0
  394. package/src/__tests__/fixtures/taa-resolve-pinned-baseline.wgsl +301 -0
  395. package/src/__tests__/frame-camera-selection.unit.test.ts +131 -0
  396. package/src/__tests__/frame-observation.contract.test.ts +21 -0
  397. package/src/__tests__/frame-plan-contract.unit.test.ts +24 -0
  398. package/src/__tests__/frame-targets.unit.test.ts +24 -0
  399. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +3 -0
  400. package/src/__tests__/gpu-driven-baseline.characterization.test.ts +79 -0
  401. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +307 -7
  402. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +122 -142
  403. package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +10 -1
  404. package/src/__tests__/gpu-driven-lod-cache.unit.test.ts +261 -0
  405. package/src/__tests__/gpu-driven-mesh-world-identity.unit.test.ts +346 -0
  406. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +1422 -0
  407. package/src/__tests__/gpu-driven-pbr.integration.test.ts +21 -0
  408. package/src/__tests__/gpu-driven-production-fixture.ts +96 -0
  409. package/src/__tests__/gpu-driven-production.integration.test.ts +1076 -106
  410. package/src/__tests__/gpu-driven-scaling.unit.test.ts +1 -3
  411. package/src/__tests__/gpu-driven-shadow-views.browser.test.ts +63 -0
  412. package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +294 -0
  413. package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +97 -0
  414. package/src/__tests__/gpu-driven-shadow-views.unit.test.ts +168 -0
  415. package/src/__tests__/gpu-driven-skin-contract.test-d.ts +11 -0
  416. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +72 -20
  417. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +30 -9
  418. package/src/__tests__/gpu-driven-view.unit.test.ts +160 -52
  419. package/src/__tests__/gpu-pass-timing-browser-runner.ts +15 -0
  420. package/src/__tests__/gpu-pass-timing.browser.test.ts +20 -2
  421. package/src/__tests__/gpu-resource-scope.unit.test.ts +71 -0
  422. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +42 -0
  423. package/src/__tests__/gpu-scene-render-graph-gpu.ts +19 -5
  424. package/src/__tests__/gpu-scene.dawn.test.ts +40 -13
  425. package/src/__tests__/gpu-scene.unit.test.ts +613 -33
  426. package/src/__tests__/instances-culling.integration.test.ts +36 -10
  427. package/src/__tests__/instances-derived-bounds.unit.test.ts +54 -0
  428. package/src/__tests__/instances-store.unit.test.ts +242 -39
  429. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +6 -0
  430. package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +13 -16
  431. package/src/__tests__/lut-lkg-transaction.integration.test.ts +122 -0
  432. package/src/__tests__/material-contract-inventory.unit.test.ts +5 -6
  433. package/src/__tests__/material-dispatch-shader-id.unit.test.ts +51 -0
  434. package/src/__tests__/material-lane-selection.unit.test.ts +60 -0
  435. package/src/__tests__/material-numeric-upload.unit.test.ts +53 -0
  436. package/src/__tests__/material-texture-handles.unit.test.ts +18 -0
  437. package/src/__tests__/material-texture-source.unit.test.ts +87 -0
  438. package/src/__tests__/materials-authoring-validation.unit.test.ts +41 -0
  439. package/src/__tests__/materials-standard-contract.unit.test.ts +57 -3
  440. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +4 -0
  441. package/src/__tests__/mesh-submission-lifetime.unit.test.ts +8 -0
  442. package/src/__tests__/morph-neutral-admission.unit.test.ts +19 -0
  443. package/src/__tests__/normal-fallback.dawn.test.ts +122 -0
  444. package/src/__tests__/particle-material-input-layout.unit.test.ts +104 -0
  445. package/src/__tests__/physical-clearcoat.integration.test.ts +42 -3
  446. package/src/__tests__/pipeline-texture-specialization.unit.test.ts +138 -0
  447. package/src/__tests__/point-shadow-inspection.unit.test.ts +2 -0
  448. package/src/__tests__/post-process-error-policy-owner.unit.test.ts +6 -5
  449. package/src/__tests__/prepared-gpu-driven-pbr-contract.test-d.ts +31 -0
  450. package/src/__tests__/prepared-gpu-driven-pbr-contract.unit.test.ts +39 -0
  451. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +251 -9
  452. package/src/__tests__/prepared-graphics-capability.unit.test.ts +21 -0
  453. package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +6 -2
  454. package/src/__tests__/profiler-phase-catalog.test.ts +5 -0
  455. package/src/__tests__/public-surface.test-d.ts +3 -0
  456. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +30 -12
  457. package/src/__tests__/reflection-fallback-async-publication.unit.test.ts +171 -0
  458. package/src/__tests__/reflection-probe-authoring.unit.test.ts +12 -10
  459. package/src/__tests__/reflection-probe-box.dawn.test.ts +71 -0
  460. package/src/__tests__/reflection-probe-filter.unit.test.ts +9 -0
  461. package/src/__tests__/reflection-probe-orientation.dawn.test.ts +294 -0
  462. package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +5 -14
  463. package/src/__tests__/reflection-probe-updates.unit.test.ts +129 -0
  464. package/src/__tests__/render-error-code-owner.test-d.ts +7 -0
  465. package/src/__tests__/render-error-detail-ssot.test-d.ts +27 -1
  466. package/src/__tests__/render-error-exhaustive.test-d.ts +15 -0
  467. package/src/__tests__/render-extent.unit.test.ts +63 -0
  468. package/src/__tests__/render-feature-gpu-work.integration.test.ts +285 -2
  469. package/src/__tests__/render-feature-plan.unit.test.ts +245 -0
  470. package/src/__tests__/render-feature-shadow-order.unit.test.ts +228 -0
  471. package/src/__tests__/render-feature-zero-work.unit.test.ts +35 -1
  472. package/src/__tests__/render-graph-fallback.integration.test.ts +2 -2
  473. package/src/__tests__/render-owner-cohesion.unit.test.ts +55 -0
  474. package/src/__tests__/render-scene-mixed-updates.integration.test.ts +426 -0
  475. package/src/__tests__/render-scene-projection.unit.test.ts +915 -23
  476. package/src/__tests__/render-scene-resource-updates.integration.test.ts +214 -0
  477. package/src/__tests__/render-scene-skin-lifecycle.integration.test.ts +173 -0
  478. package/src/__tests__/render-scene-temporal-retry.unit.test.ts +133 -0
  479. package/src/__tests__/render-target-material-source.test-d.ts +27 -3
  480. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +233 -9
  481. package/src/__tests__/renderer-frame-transaction.integration.test.ts +923 -5
  482. package/src/__tests__/shader-manifest-fixture.ts +45 -0
  483. package/src/__tests__/skin-motion-regression.unit.test.ts +0 -33
  484. package/src/__tests__/skin-palette-persistent.integration.test.ts +28 -0
  485. package/src/__tests__/skin-palette-persistent.unit.test.ts +247 -0
  486. package/src/__tests__/skinned-shadow-caster.test.ts +125 -14
  487. package/src/__tests__/specular-environment-scale.dawn.test.ts +158 -0
  488. package/src/__tests__/ssao-config.unit.test.ts +7 -0
  489. package/src/__tests__/ssao-surface.dawn.test.ts +252 -0
  490. package/src/__tests__/ssr-admission-matrix.integration.test.ts +7 -1
  491. package/src/__tests__/ssr-confidence-compose.unit.test.ts +84 -0
  492. package/src/__tests__/ssr-coordinate-oracle.unit.test.ts +28 -0
  493. package/src/__tests__/ssr-cube-silhouette.dawn.test.ts +270 -0
  494. package/src/__tests__/ssr-format-probe-gating.integration.test.ts +82 -0
  495. package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +99 -0
  496. package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +116 -0
  497. package/src/__tests__/ssr-gpu-dispatch.ts +951 -0
  498. package/src/__tests__/ssr-graph-topology.unit.test.ts +104 -0
  499. package/src/__tests__/ssr-history-filter.dawn.test.ts +198 -0
  500. package/src/__tests__/ssr-hit-color.dawn.test.ts +273 -0
  501. package/src/__tests__/ssr-hiz-odd-reduction.dawn.test.ts +569 -0
  502. package/src/__tests__/ssr-hiz-rescue.dawn.test.ts +279 -0
  503. package/src/__tests__/ssr-hiz.browser.test.ts +150 -0
  504. package/src/__tests__/ssr-hiz.dawn.test.ts +150 -0
  505. package/src/__tests__/ssr-hiz.unit.test.ts +56 -0
  506. package/src/__tests__/ssr-inspection.unit.test.ts +105 -0
  507. package/src/__tests__/ssr-memory-budget.unit.test.ts +45 -0
  508. package/src/__tests__/ssr-performance-sequence-aggregation.unit.test.ts +15 -0
  509. package/src/__tests__/ssr-public-surface.test-d.ts +37 -0
  510. package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +387 -0
  511. package/src/__tests__/ssr-reflection-mip-reducer.dawn.test.ts +309 -0
  512. package/src/__tests__/ssr-reprojection-probe.ts +90 -0
  513. package/src/__tests__/ssr-roughness-mip.dawn.test.ts +163 -0
  514. package/src/__tests__/ssr-shader-prewarm.unit.test.ts +59 -0
  515. package/src/__tests__/ssr-spatial.integration.test.ts +141 -0
  516. package/src/__tests__/ssr-stable-lattice.dawn.test.ts +475 -0
  517. package/src/__tests__/ssr-temporal-history.unit.test.ts +202 -0
  518. package/src/__tests__/ssr-texel-crossing.dawn.test.ts +448 -0
  519. package/src/__tests__/ssr-zero-work.integration.test.ts +87 -0
  520. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +84 -12
  521. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +29 -0
  522. package/src/__tests__/standard-output-chain-contract.unit.test.ts +99 -0
  523. package/src/__tests__/standard-output-chain.integration.test.ts +73 -0
  524. package/src/__tests__/standard-output-gpu-evidence.ts +205 -0
  525. package/src/__tests__/standard-output.browser.test.ts +15 -0
  526. package/src/__tests__/standard-output.dawn.test.ts +15 -0
  527. package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +275 -0
  528. package/src/__tests__/standard-pipeline.integration.test.ts +320 -3
  529. package/src/__tests__/standard-profile-oracle.unit.test.ts +49 -0
  530. package/src/__tests__/standard-surface-lighting.unit.test.ts +41 -0
  531. package/src/__tests__/standard-texture-specialization.dawn.test.ts +141 -0
  532. package/src/__tests__/surface-adjacent-regressions.integration.test.ts +6 -3
  533. package/src/__tests__/taa-coverage-edge.dawn.test.ts +199 -0
  534. package/src/__tests__/taa-history-clipping.dawn.test.ts +328 -0
  535. package/src/__tests__/taa-neighborhood-equivalence.dawn.test.ts +782 -0
  536. package/src/__tests__/taa-stability-feedback.browser.test.ts +23 -0
  537. package/src/__tests__/taa-stability-feedback.dawn.test.ts +68 -0
  538. package/src/__tests__/taa-stability-feedback.ts +342 -0
  539. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +49 -7
  540. package/src/__tests__/temporal-reset-matrix.unit.test.ts +9 -0
  541. package/src/__tests__/temporal-transaction.integration.test.ts +28 -0
  542. package/src/__tests__/temporal-view.unit.test.ts +17 -0
  543. package/src/__tests__/texture-usage-surface.unit.test.ts +4 -2
  544. package/src/__tests__/transmission-prewarm.unit.test.ts +57 -0
  545. package/src/__tests__/typed-pipeline-topology.unit.test.ts +109 -4
  546. package/src/__tests__/typed-scene-pass-material-cache.integration.test.ts +126 -0
  547. package/src/__tests__/vertex-layouts-ssot.unit.test.ts +47 -0
  548. package/src/__tests__/visibility-extract.perf.test.ts +20 -8
  549. package/src/__tests__/visibility-instances.integration.test.ts +19 -7
  550. package/src/__tests__/visibility-producer-matrix.integration.test.ts +20 -9
  551. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +62 -13
  552. package/src/__tests__/volumetric-fog-topology.unit.test.ts +7 -7
  553. package/src/assembly/atmosphere-shader-prewarm.ts +39 -0
  554. package/src/assembly/device-feature-admission.ts +9 -4
  555. package/src/assembly/dynamic-geometry-host.ts +284 -163
  556. package/src/assembly/dynamic-geometry-runtime.ts +71 -0
  557. package/src/assembly/factory.ts +4 -0
  558. package/src/assembly/gpu-driven-owner.ts +29 -0
  559. package/src/assembly/host-contract.ts +19 -0
  560. package/src/assembly/material/assembly.ts +383 -1
  561. package/src/assembly/material/pipeline-helpers.ts +100 -0
  562. package/src/assembly/material-shader-policy.ts +110 -46
  563. package/src/assembly/recovery/device-loss-fanout.ts +5 -0
  564. package/src/assembly/recovery/failure-location.ts +62 -0
  565. package/src/assembly/recovery/recovery-attempt.ts +2 -29
  566. package/src/assembly/recovery/renderer-recover.ts +16 -17
  567. package/src/assembly/renderer-facade.ts +34 -1
  568. package/src/assembly/renderer-feature-inspection.ts +13 -0
  569. package/src/assembly/renderer-frame-transaction.ts +63 -0
  570. package/src/assembly/renderer-helpers.ts +26 -0
  571. package/src/assembly/renderer-inspection.ts +6 -0
  572. package/src/assembly/shader-prewarm-policy.ts +46 -1
  573. package/src/assembly/skin-palette-owner.ts +21 -0
  574. package/src/assembly/ssr-shader-prewarm.ts +41 -0
  575. package/src/assembly/webgpu-device-loss.ts +75 -0
  576. package/src/assembly/webgpu-pbr-ready.ts +232 -0
  577. package/src/assembly/webgpu-ready-mipmap.ts +26 -0
  578. package/src/assembly/webgpu-ready.ts +161 -131
  579. package/src/assembly/webgpu-renderer-bootstrap.ts +85 -0
  580. package/src/assembly/webgpu-renderer-contract.ts +69 -0
  581. package/src/assembly/webgpu-renderer-guards.ts +32 -0
  582. package/src/assembly/webgpu-renderer-observation.ts +43 -0
  583. package/src/assembly/webgpu-renderer-recovery-failure.ts +62 -0
  584. package/src/assembly/webgpu-renderer.ts +744 -730
  585. package/src/assembly/webgpu-vertex-layouts.ts +233 -87
  586. package/src/capture/scene-projection.ts +37 -0
  587. package/src/components/__tests__/camera-exposure.contract.unit.test.ts +153 -0
  588. package/src/components/__tests__/dynamic-resolution-schema.unit.test.ts +65 -0
  589. package/src/components/__tests__/light-radius.integration.test.ts +59 -0
  590. package/src/components/camera.ts +287 -7
  591. package/src/components/directional-light.ts +3 -3
  592. package/src/components/dynamic-resolution.ts +67 -0
  593. package/src/components/index.ts +2 -0
  594. package/src/components/instances.ts +45 -18
  595. package/src/components/light-helpers.ts +6 -1
  596. package/src/components/reflection-probe.ts +1 -0
  597. package/src/components/scene-instance.ts +2 -1
  598. package/src/components/screen-space-reflection.ts +21 -0
  599. package/src/components/skylight.ts +4 -1
  600. package/src/components/sprite-animation.ts +2 -2
  601. package/src/components/sprite-instances.ts +1 -1
  602. package/src/device/device-scope.ts +13 -7
  603. package/src/device/gpu-residency.ts +45 -42
  604. package/src/dynamic-geometry.ts +13 -8
  605. package/src/environment/background.ts +281 -0
  606. package/src/environment/ibl.ts +211 -0
  607. package/src/environment/storage.ts +63 -0
  608. package/src/errors/gpu-driven.ts +49 -8
  609. package/src/errors/render.ts +91 -3
  610. package/src/extract/camera.ts +37 -1
  611. package/src/extract/contracts.ts +10 -0
  612. package/src/extract/gpu-driven.ts +240 -10
  613. package/src/features/host.ts +237 -19
  614. package/src/features/noise-texture.ts +91 -0
  615. package/src/features/plan.ts +553 -24
  616. package/src/features/prepared-gpu-work.ts +631 -49
  617. package/src/features/prepared-graphics-store.ts +31 -0
  618. package/src/features/prepared-graphics.ts +5 -0
  619. package/src/features/render-graph-compute.ts +41 -8
  620. package/src/features/render-graph-contribution.ts +141 -3
  621. package/src/features/render-graph-raster.ts +143 -30
  622. package/src/features/types.ts +11 -0
  623. package/src/fullscreen-post-process-pass.ts +3 -0
  624. package/src/gpu-driven/batch-topology.ts +452 -108
  625. package/src/gpu-driven/material-artifacts.ts +179 -0
  626. package/src/gpu-driven/material-bindings.ts +41 -0
  627. package/src/gpu-driven/pbr-program.ts +31 -0
  628. package/src/gpu-driven/prepared-draw.ts +42 -6
  629. package/src/gpu-driven/production-raster.ts +2806 -716
  630. package/src/gpu-driven/shadow-views.ts +539 -0
  631. package/src/gpu-driven/view-gpu.ts +188 -41
  632. package/src/gpu-resource.ts +21 -2
  633. package/src/gpu-scene-schema.ts +61 -11
  634. package/src/gpu-scene.ts +197 -99
  635. package/src/gpu-texture-usage.ts +1 -0
  636. package/src/hdrp-buffers.ts +141 -36
  637. package/src/ibl/IblPipelineCache.ts +5 -0
  638. package/src/ibl/frame-resources.ts +38 -0
  639. package/src/ibl/skylight-bind-group.ts +32 -21
  640. package/src/index.ts +194 -75
  641. package/src/inspection-types.ts +207 -1
  642. package/src/instances-derived-bounds.ts +258 -34
  643. package/src/instances.ts +459 -150
  644. package/src/internal.ts +22 -0
  645. package/src/lifecycle.ts +2 -0
  646. package/src/material-row.ts +194 -0
  647. package/src/materials.ts +44 -8
  648. package/src/pbr-pipeline.ts +172 -19
  649. package/src/pipeline/render-extent.ts +111 -0
  650. package/src/pipeline/standard-build-context.ts +7 -0
  651. package/src/pipeline/standard-forward-lane.ts +74 -29
  652. package/src/pipeline/standard-output/__tests__/lut-admission.unit.test.ts +103 -0
  653. package/src/pipeline/standard-output/auto-exposure/__tests__/capability.unit.test.ts +40 -0
  654. package/src/pipeline/standard-output/auto-exposure/__tests__/gpu.contract.unit.test.ts +125 -0
  655. package/src/pipeline/standard-output/auto-exposure/__tests__/graph.contract.unit.test.ts +94 -0
  656. package/src/pipeline/standard-output/auto-exposure/__tests__/oracle.test.ts +108 -0
  657. package/src/pipeline/standard-output/auto-exposure/__tests__/preset.test.ts +26 -0
  658. package/src/pipeline/standard-output/auto-exposure/capability.ts +38 -0
  659. package/src/pipeline/standard-output/auto-exposure/gpu.ts +567 -0
  660. package/src/pipeline/standard-output/auto-exposure/graph.ts +221 -0
  661. package/src/pipeline/standard-output/auto-exposure/inspection.ts +231 -0
  662. package/src/pipeline/standard-output/auto-exposure/oracle.ts +291 -0
  663. package/src/pipeline/standard-output/auto-exposure/preset.ts +28 -0
  664. package/src/pipeline/standard-output/auto-exposure/state.ts +156 -0
  665. package/src/pipeline/standard-output/color-transform.ts +124 -0
  666. package/src/pipeline/standard-output/graph.ts +139 -0
  667. package/src/pipeline/standard-output/lut-admission.ts +121 -0
  668. package/src/pipeline/standard-output/lut-gpu.ts +399 -0
  669. package/src/pipeline/standard-output/lut-state.ts +176 -0
  670. package/src/pipeline/standard-output/resources.ts +121 -0
  671. package/src/pipeline/standard-output/types.ts +58 -0
  672. package/src/pipeline/standard-pipeline.ts +232 -70
  673. package/src/pipeline/standard-post.ts +190 -27
  674. package/src/pipeline/standard-profile.ts +2 -1
  675. package/src/pipeline-builder.ts +28 -9
  676. package/src/pipeline-spec-types.ts +4 -0
  677. package/src/pipeline-spec.ts +37 -29
  678. package/src/plugin.ts +4 -0
  679. package/src/points-lines/standard-owner.ts +6 -14
  680. package/src/post-process-errors.ts +26 -18
  681. package/src/prepare/__tests__/extended-lighting-capability.unit.test.ts +2 -2
  682. package/src/prepare/extended-lighting/resources.ts +3 -3
  683. package/src/prepare/prepared-graphics-resolver.ts +9 -2
  684. package/src/record/__tests__/main-pass-geometry.unit.test.ts +68 -0
  685. package/src/record/__tests__/material-bg-cache.unit.test.ts +45 -0
  686. package/src/record/__tests__/material-slot-plan.unit.test.ts +57 -0
  687. package/src/record/__tests__/mesh-ssbo.unit.test.ts +40 -1
  688. package/src/record/__tests__/recovery-pipeline.unit.test.ts +20 -1
  689. package/src/record/__tests__/sprite-material-abi.unit.test.ts +41 -6
  690. package/src/record/__tests__/temporal-payload.unit.test.ts +2 -0
  691. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +45 -0
  692. package/src/record/__tests__/view-ubo-layout.unit.test.ts +5 -0
  693. package/src/record/dynamic-geometry-consumption.ts +59 -0
  694. package/src/record/frame-lighting.ts +15 -12
  695. package/src/record/frame-snapshot.ts +146 -34
  696. package/src/record/frame-targets.ts +9 -0
  697. package/src/record/frame.ts +838 -170
  698. package/src/record/main-pass-geometry.ts +209 -103
  699. package/src/record/main-pass-material.ts +157 -40
  700. package/src/record/main-pass-sprite-draws.ts +16 -107
  701. package/src/record/main-pass.ts +141 -12
  702. package/src/record/material-uniforms.ts +1 -1
  703. package/src/record/mesh-ssbo.ts +59 -15
  704. package/src/record/prepared-material-bindings.ts +238 -0
  705. package/src/record/recovery-pipeline.ts +69 -90
  706. package/src/record/render-context.ts +123 -24
  707. package/src/record/shadow-pass.ts +1389 -230
  708. package/src/record/skybox-post-pass.ts +14 -3
  709. package/src/record/typed-frame-graph.ts +1064 -47
  710. package/src/record/view-ubo.ts +12 -1
  711. package/src/recovery/render-system-candidate.ts +135 -68
  712. package/src/recovery/render-system-roots.ts +113 -0
  713. package/src/recovery/types.ts +77 -0
  714. package/src/reflection/background.ts +151 -0
  715. package/src/reflection/filter.ts +3 -0
  716. package/src/reflection/projection.ts +16 -6
  717. package/src/reflection/record-owner.ts +308 -140
  718. package/src/render-contract.ts +237 -49
  719. package/src/render-graph-primitives.ts +34 -5
  720. package/src/render-pipeline.ts +90 -2
  721. package/src/render-system-extract-tail.ts +431 -162
  722. package/src/render-system-extract.ts +478 -119
  723. package/src/render-system-projections.ts +241 -0
  724. package/src/render-system.ts +715 -828
  725. package/src/scene/render-scene-types.ts +13 -4
  726. package/src/scene/render-scene.ts +577 -355
  727. package/src/scene/shadow-visibility.ts +21 -0
  728. package/src/ssao-config.ts +25 -8
  729. package/src/ssr/admission.ts +380 -14
  730. package/src/ssr/compose.ts +144 -0
  731. package/src/ssr/errors.ts +48 -0
  732. package/src/ssr/graph.ts +797 -0
  733. package/src/ssr/history.ts +436 -0
  734. package/src/ssr/hiz.ts +124 -0
  735. package/src/ssr/inspection.ts +124 -0
  736. package/src/ssr/resources.ts +202 -0
  737. package/src/ssr/temporal.ts +164 -0
  738. package/src/systems/skin-palette-allocator.ts +495 -148
  739. package/src/systems/skin-palette-types.ts +17 -0
  740. package/src/systems/transparent-dispatch.ts +90 -0
  741. package/src/targets/material-source.ts +34 -0
  742. package/src/temporal/coverage.ts +1 -1
  743. package/src/temporal/frame-coordinator.ts +23 -2
  744. package/src/temporal/gpu.ts +79 -12
  745. package/src/temporal/history.ts +3 -1
  746. package/src/temporal/inspection.ts +2 -1
  747. package/src/temporal/standard-scene-data.ts +10 -2
  748. package/src/temporal/target-coverage-attachment.ts +72 -0
  749. package/src/temporal/temporal-view.ts +11 -2
  750. package/src/temporal/view.ts +12 -2
  751. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +219 -139
  752. package/src/typed-render-graph-primitives.ts +304 -74
  753. package/src/typed-shadow-passes.ts +122 -12
  754. package/src/volume/component.ts +1 -0
  755. package/src/volume/passes.ts +3 -3
  756. package/src/volume/temporal.ts +10 -0
  757. package/dist/chunk-GE3SDD72.mjs.map +0 -1
  758. package/dist/chunk-GF523LHF.mjs.map +0 -1
  759. package/dist/chunk-IQMKJLNU.mjs.map +0 -1
  760. package/dist/chunk-J52NMQKR.mjs.map +0 -1
  761. package/dist/chunk-J6KACNOH.mjs.map +0 -1
  762. package/dist/chunk-JAASCMXA.mjs.map +0 -1
  763. package/dist/chunk-MBU4ZVE7.mjs.map +0 -1
  764. package/dist/chunk-MYJ5RPJO.mjs.map +0 -1
  765. package/dist/chunk-RBDBZ5R7.mjs.map +0 -1
  766. package/dist/chunk-VSL23LZE.mjs.map +0 -1
  767. package/src/__tests__/instances-world-ownership.integration.test.ts +0 -62
  768. package/src/scene/__tests__/changed-block-summary.candidate.test.ts +0 -36
@@ -2,12 +2,13 @@ import type { EntityHandle, World } from '@forgeax/engine-ecs';
2
2
  import { FixedTime } from '@forgeax/engine-ecs';
3
3
  import { AssetGuid } from '@forgeax/engine-pack/guid';
4
4
  import { Transform } from '@forgeax/engine-scene';
5
- import { err, type Handle, type Result } from '@forgeax/engine-types';
5
+ import { err, type Handle, ok, type Result } from '@forgeax/engine-types';
6
6
  import { MeshFilter } from '../components/mesh-filter';
7
7
  import { MeshRenderer } from '../components/mesh-renderer';
8
8
  import type { GpuResidencyCache } from '../device/gpu-residency';
9
9
  import type { MeshResidencyLease } from '../device/mesh-residency-lifetime';
10
10
  import {
11
+ createDynamicGeometryLifecycle,
11
12
  type DynamicGeometryCandidate,
12
13
  DynamicGeometryError,
13
14
  type DynamicGeometryLifecycle,
@@ -25,6 +26,15 @@ export interface DynamicGeometryHostImplementation {
25
26
  candidate: DynamicGeometryCandidate,
26
27
  ordering: DynamicGeometryOrdering,
27
28
  ): Result<DynamicGeometryCandidate, DynamicGeometryError>;
29
+ /**
30
+ * Atomically swap distinct entities in one attached World. Returned failures
31
+ * retain old bindings; an uncertain rollback throws to require paired rebuild.
32
+ * Invoke inside PhysicsWorld.admitDerivedShapeCandidates commitGeometry.
33
+ */
34
+ acceptDynamicGeometryCandidates(
35
+ candidates: readonly DynamicGeometryCandidate[],
36
+ ordering: DynamicGeometryOrdering,
37
+ ): Result<readonly DynamicGeometryCandidate[], DynamicGeometryError>;
28
38
  dynamicGeometryReceipt(candidate: DynamicGeometryCandidate): DynamicGeometryReceipt | undefined;
29
39
  cancelDynamicGeometry(candidate: DynamicGeometryCandidate): Result<void, DynamicGeometryError>;
30
40
  retireDynamicGeometry(candidate: DynamicGeometryCandidate): Result<void, DynamicGeometryError>;
@@ -269,7 +279,188 @@ export function createDynamicGeometryHost(options: {
269
279
  else void completion.then(finish, finish);
270
280
  return completion;
271
281
  };
272
- return {
282
+ const acceptCandidate = (
283
+ candidate: DynamicGeometryCandidate,
284
+ ordering: DynamicGeometryOrdering,
285
+ deferredSupersession?: Set<HostCandidateRecord>,
286
+ ): Result<DynamicGeometryCandidate, DynamicGeometryError> => {
287
+ synchronizeGeneration();
288
+ const world = candidate.world as World;
289
+ const hostRecordById = hostCandidates.get(candidate.candidateId);
290
+ const hostRecord = candidateRecord(candidate);
291
+ if (hostRecord === undefined && hostRecordById !== undefined)
292
+ return err(
293
+ new DynamicGeometryError(
294
+ 'dynamic-geometry-receipt-mismatch',
295
+ 'admission uses the exact host candidate owner and lifecycle credential',
296
+ 'discard the altered credential and use the value returned by preparation',
297
+ { candidateId: candidate.candidateId },
298
+ ),
299
+ );
300
+ if (hostRecord !== undefined && candidate.state !== 'prepared')
301
+ return err(
302
+ new DynamicGeometryError(
303
+ 'dynamic-geometry-candidate-state',
304
+ 'admission consumes a prepared candidate exactly once',
305
+ 'retain the accepted or published candidate receipt instead of admitting it again',
306
+ { candidateId: candidate.candidateId },
307
+ ),
308
+ );
309
+ if (ordering === undefined || !attachedWorlds.has(world) || ordering.world !== candidate.world)
310
+ return err(
311
+ new DynamicGeometryError(
312
+ 'dynamic-geometry-world-not-attached',
313
+ 'candidate and fixed-step ordering belong to the same attached World',
314
+ 'attach the World and submit its PhysicsWorld ordering before accepting geometry',
315
+ { candidateId: candidate.candidateId },
316
+ ),
317
+ );
318
+ if (!candidate.gpuReady)
319
+ return err(
320
+ new DynamicGeometryError(
321
+ 'dynamic-geometry-gpu-not-ready',
322
+ 'candidate has standard GPU residency before acceptance',
323
+ 'prepare with an existing MeshAsset shared handle and repair residency failures',
324
+ { candidateId: candidate.candidateId },
325
+ ),
326
+ );
327
+ if (
328
+ hostRecord === undefined ||
329
+ !hasRenderableBinding(world, candidate.entity) ||
330
+ !hasMaterialIdentity(world, candidate.entity, candidate.mesh, candidate.materialIdentity)
331
+ )
332
+ return err(
333
+ new DynamicGeometryError(
334
+ 'dynamic-geometry-invalid',
335
+ 'the candidate is bound to a live ECS MeshFilter and MeshRenderer',
336
+ 'keep the candidate MeshFilter binding intact until the consuming draw',
337
+ { candidateId: candidate.candidateId },
338
+ ),
339
+ );
340
+ if (meshHandleOf(world, candidate.entity) !== hostRecord.previousMeshHandle)
341
+ return err(
342
+ new DynamicGeometryError(
343
+ 'dynamic-geometry-invalid',
344
+ 'the old MeshFilter binding remains visible until candidate acceptance',
345
+ 'do not replace the live ECS binding while geometry is prepared',
346
+ { candidateId: candidate.candidateId },
347
+ ),
348
+ );
349
+ const currentFixedStep = fixedStepOf(world);
350
+ if (
351
+ currentFixedStep === undefined ||
352
+ candidate.fixedStep === undefined ||
353
+ candidate.fixedStep > currentFixedStep ||
354
+ ordering.fixedStep !== currentFixedStep
355
+ )
356
+ return err(
357
+ new DynamicGeometryError(
358
+ 'dynamic-geometry-ordering-required',
359
+ 'ordering matches the current World tick, no earlier than preparation',
360
+ 'accept a prepared candidate during the current fixed-step admission',
361
+ {
362
+ candidateId: candidate.candidateId,
363
+ actual: {
364
+ candidate: candidate.fixedStep,
365
+ currentFixedStep,
366
+ ordering: ordering.fixedStep,
367
+ },
368
+ },
369
+ ),
370
+ );
371
+ if (candidate.physicsEntity !== undefined) {
372
+ const publication = physicsPublicationOf(world, candidate.physicsEntity, true);
373
+ if (
374
+ publication === undefined ||
375
+ publication.fixedStep !== currentFixedStep ||
376
+ publication.revision !== candidate.revision
377
+ )
378
+ return err(
379
+ new DynamicGeometryError(
380
+ 'dynamic-geometry-ordering-required',
381
+ 'candidate physicsEntity has the active paired PhysicsWorld admission',
382
+ 'accept geometry inside admitDerivedShapeCandidate commitGeometry, before physics step',
383
+ { candidateId: candidate.candidateId, actual: publication },
384
+ ),
385
+ );
386
+ }
387
+ // One ECS MeshFilter has one visible geometry owner. Once this
388
+ // candidate is accepted, any older prepared/accepted candidate for the
389
+ // same entity can no longer become a receipt-bearing draw. Cancel it
390
+ // after the new ECS swap so its candidate-only residency is no longer
391
+ // protected as the live draw owner. Published candidates stay
392
+ // receipt-bound and are retired independently.
393
+ const superseded = [...hostCandidates.values()].filter(
394
+ (record) =>
395
+ record.candidate.candidateId !== candidate.candidateId &&
396
+ record.world === world &&
397
+ record.entity === candidate.entity &&
398
+ !record.published,
399
+ );
400
+ const accepted = lifecycle.accept(candidate, ordering);
401
+ if (!accepted.ok) return accepted;
402
+ const swapped = world.set(candidate.entity as EntityHandle, MeshFilter, {
403
+ assetHandle: hostRecord.meshHandle,
404
+ });
405
+ if (!swapped.ok) {
406
+ lifecycle.cancel(accepted.value);
407
+ hostCandidates.delete(candidate.candidateId);
408
+ cleanupCandidateResidency(hostRecord);
409
+ const released = releaseMeshLeases(hostRecord);
410
+ if (released !== undefined) return err(released);
411
+ return err(
412
+ new DynamicGeometryError(
413
+ 'dynamic-geometry-invalid',
414
+ 'the candidate MeshFilter swap commits through the ECS write barrier',
415
+ 'restore the live entity and retry from a fresh candidate',
416
+ { candidateId: candidate.candidateId, actual: swapped.error },
417
+ ),
418
+ );
419
+ }
420
+ hostRecord.candidate = accepted.value;
421
+ hostRecord.accepted = true;
422
+ if (deferredSupersession === undefined) options.onTopologyChanged?.();
423
+ // Keep the World handle leased through the final GPU submission; its slot
424
+ // must not be reused while a retired frame still references the old mesh.
425
+ // Cleanup happens only after the new ECS MeshFilter is visible. Before
426
+ // the swap, hasMeshBinding intentionally protects the older candidate's
427
+ // GPU copy because it is still the live draw owner.
428
+ if (deferredSupersession !== undefined) {
429
+ for (const record of superseded) deferredSupersession.add(record);
430
+ return accepted;
431
+ }
432
+ for (const record of superseded) {
433
+ const completion = cleanupCandidateResidency(record);
434
+ const cancelled = lifecycle.cancel(record.candidate, completion);
435
+ if (!cancelled.ok && cancelled.error.code !== 'dynamic-geometry-candidate-not-found') {
436
+ const restored = world.set(candidate.entity as EntityHandle, MeshFilter, {
437
+ assetHandle: hostRecord.previousMeshHandle,
438
+ });
439
+ lifecycle.cancel(accepted.value);
440
+ hostCandidates.delete(candidate.candidateId);
441
+ cleanupCandidateResidency(hostRecord);
442
+ releasePreviousMeshLease(hostRecord);
443
+ return err(
444
+ new DynamicGeometryError(
445
+ 'dynamic-geometry-invalid',
446
+ 'candidate supersession cancels the prior credential atomically',
447
+ 'keep the prior ECS binding and candidate lifecycle intact when supersession fails',
448
+ {
449
+ candidateId: candidate.candidateId,
450
+ actual: {
451
+ cancelled: cancelled.error,
452
+ restored: restored.ok ? undefined : restored.error,
453
+ },
454
+ },
455
+ ),
456
+ );
457
+ }
458
+ hostCandidates.delete(record.candidate.candidateId);
459
+ scheduleCandidateCleanup(record);
460
+ }
461
+ return accepted;
462
+ };
463
+ const host: DynamicGeometryHostImplementation = {
273
464
  prepareDynamicGeometry(input) {
274
465
  const generation = synchronizeGeneration();
275
466
  const world = input.world as World;
@@ -463,182 +654,64 @@ export function createDynamicGeometryHost(options: {
463
654
  });
464
655
  return prepared;
465
656
  },
466
- acceptDynamicGeometry(candidate, ordering) {
657
+ acceptDynamicGeometry: (candidate, ordering) => acceptCandidate(candidate, ordering),
658
+ acceptDynamicGeometryCandidates(candidates, ordering) {
467
659
  synchronizeGeneration();
468
- const world = candidate.world as World;
469
- const hostRecordById = hostCandidates.get(candidate.candidateId);
470
- const hostRecord = candidateRecord(candidate);
471
- if (hostRecord === undefined && hostRecordById !== undefined)
472
- return err(
473
- new DynamicGeometryError(
474
- 'dynamic-geometry-receipt-mismatch',
475
- 'admission uses the exact host candidate owner and lifecycle credential',
476
- 'discard the altered credential and use the value returned by preparation',
477
- { candidateId: candidate.candidateId },
478
- ),
479
- );
480
- if (hostRecord !== undefined && candidate.state !== 'prepared')
481
- return err(
482
- new DynamicGeometryError(
483
- 'dynamic-geometry-candidate-state',
484
- 'admission consumes a prepared candidate exactly once',
485
- 'retain the accepted or published candidate receipt instead of admitting it again',
486
- { candidateId: candidate.candidateId },
487
- ),
488
- );
489
- if (
490
- ordering === undefined ||
491
- !attachedWorlds.has(world) ||
492
- ordering.world !== candidate.world
493
- )
494
- return err(
495
- new DynamicGeometryError(
496
- 'dynamic-geometry-world-not-attached',
497
- 'candidate and fixed-step ordering belong to the same attached World',
498
- 'attach the World and submit its PhysicsWorld ordering before accepting geometry',
499
- { candidateId: candidate.candidateId },
500
- ),
501
- );
502
- if (!candidate.gpuReady)
503
- return err(
504
- new DynamicGeometryError(
505
- 'dynamic-geometry-gpu-not-ready',
506
- 'candidate has standard GPU residency before acceptance',
507
- 'prepare with an existing MeshAsset shared handle and repair residency failures',
508
- { candidateId: candidate.candidateId },
509
- ),
510
- );
660
+ // The existing lifecycle's candidate budget bounds this group; there is
661
+ // no second queue or independently tunable batch allocation limit.
511
662
  if (
512
- hostRecord === undefined ||
513
- !hasRenderableBinding(world, candidate.entity) ||
514
- !hasMaterialIdentity(world, candidate.entity, candidate.mesh, candidate.materialIdentity)
663
+ candidates.length === 0 ||
664
+ candidates.length > hostCandidates.size ||
665
+ new Set(candidates.map((candidate) => candidate.entity)).size !== candidates.length ||
666
+ candidates.some(
667
+ (candidate) =>
668
+ candidate.world !== ordering?.world || candidateRecord(candidate) === undefined,
669
+ )
515
670
  )
516
671
  return err(
517
672
  new DynamicGeometryError(
518
673
  'dynamic-geometry-invalid',
519
- 'the candidate is bound to a live ECS MeshFilter and MeshRenderer',
520
- 'keep the candidate MeshFilter binding intact until the consuming draw',
521
- { candidateId: candidate.candidateId },
674
+ 'a geometry group contains owned candidates for distinct entities in one World',
675
+ 'prepare one candidate per entity and accept the nonempty group in its paired physics admission',
522
676
  ),
523
677
  );
524
- if (meshHandleOf(world, candidate.entity) !== hostRecord.previousMeshHandle)
525
- return err(
526
- new DynamicGeometryError(
678
+ const accepted: DynamicGeometryCandidate[] = [];
679
+ const superseded = new Set<HostCandidateRecord>();
680
+ const rollback = (): void => {
681
+ const failures: DynamicGeometryError[] = [];
682
+ for (const candidate of [...accepted].reverse()) {
683
+ const result = host.cancelDynamicGeometry(candidate);
684
+ if (!result.ok) failures.push(result.error);
685
+ }
686
+ // A returned failure promises old state. A throw deliberately routes
687
+ // the paired PhysicsWorld into rebuild-required when that proof fails.
688
+ if (failures.length > 0)
689
+ throw new DynamicGeometryError(
527
690
  'dynamic-geometry-invalid',
528
- 'the old MeshFilter binding remains visible until candidate acceptance',
529
- 'do not replace the live ECS binding while geometry is prepared',
530
- { candidateId: candidate.candidateId },
531
- ),
532
- );
533
- const currentFixedStep = fixedStepOf(world);
534
- if (
535
- currentFixedStep === undefined ||
536
- candidate.fixedStep === undefined ||
537
- candidate.fixedStep > currentFixedStep ||
538
- ordering.fixedStep !== currentFixedStep
539
- )
540
- return err(
541
- new DynamicGeometryError(
542
- 'dynamic-geometry-ordering-required',
543
- 'ordering matches the current World tick, no earlier than preparation',
544
- 'accept a prepared candidate during the current fixed-step admission',
545
- {
546
- candidateId: candidate.candidateId,
547
- actual: {
548
- candidate: candidate.fixedStep,
549
- currentFixedStep,
550
- ordering: ordering.fixedStep,
551
- },
552
- },
553
- ),
554
- );
555
- if (candidate.physicsEntity !== undefined) {
556
- const publication = physicsPublicationOf(world, candidate.physicsEntity, true);
557
- if (
558
- publication === undefined ||
559
- publication.fixedStep !== currentFixedStep ||
560
- publication.revision !== candidate.revision
561
- )
562
- return err(
563
- new DynamicGeometryError(
564
- 'dynamic-geometry-ordering-required',
565
- 'candidate physicsEntity has the active paired PhysicsWorld admission',
566
- 'accept geometry inside admitDerivedShapeCandidate commitGeometry, before physics step',
567
- { candidateId: candidate.candidateId, actual: publication },
568
- ),
691
+ 'a failed geometry group restores every previous ECS binding',
692
+ 'rebuild the paired World and Renderer before rendering or querying physics',
693
+ { actual: failures },
569
694
  );
695
+ };
696
+ for (const candidate of candidates) {
697
+ const result = acceptCandidate(candidate, ordering, superseded);
698
+ if (!result.ok) {
699
+ rollback();
700
+ return err(result.error);
701
+ }
702
+ accepted.push(result.value);
570
703
  }
571
- // One ECS MeshFilter has one visible geometry owner. Once this
572
- // candidate is accepted, any older prepared/accepted candidate for the
573
- // same entity can no longer become a receipt-bearing draw. Cancel it
574
- // after the new ECS swap so its candidate-only residency is no longer
575
- // protected as the live draw owner. Published candidates stay
576
- // receipt-bound and are retired independently.
577
- const superseded = [...hostCandidates.values()].filter(
578
- (record) =>
579
- record.candidate.candidateId !== candidate.candidateId &&
580
- record.world === world &&
581
- record.entity === candidate.entity &&
582
- !record.published,
583
- );
584
- const accepted = lifecycle.accept(candidate, ordering);
585
- if (!accepted.ok) return accepted;
586
- const swapped = world.set(candidate.entity as EntityHandle, MeshFilter, {
587
- assetHandle: hostRecord.meshHandle,
588
- });
589
- if (!swapped.ok) {
590
- lifecycle.cancel(accepted.value);
591
- hostCandidates.delete(candidate.candidateId);
592
- cleanupCandidateResidency(hostRecord);
593
- const released = releaseMeshLeases(hostRecord);
594
- if (released !== undefined) return err(released);
595
- return err(
596
- new DynamicGeometryError(
597
- 'dynamic-geometry-invalid',
598
- 'the candidate MeshFilter swap commits through the ECS write barrier',
599
- 'restore the live entity and retry from a fresh candidate',
600
- { candidateId: candidate.candidateId, actual: swapped.error },
601
- ),
602
- );
603
- }
604
- hostRecord.candidate = accepted.value;
605
- hostRecord.accepted = true;
606
- options.onTopologyChanged?.();
607
- // Keep the World handle leased through the final GPU submission; its slot
608
- // must not be reused while a retired frame still references the old mesh.
609
- // Cleanup happens only after the new ECS MeshFilter is visible. Before
610
- // the swap, hasMeshBinding intentionally protects the older candidate's
611
- // GPU copy because it is still the live draw owner.
704
+ // Keep all previous unpublished credentials and leases until every ECS
705
+ // swap succeeds, so a kth-member rejection can still draw the old group.
612
706
  for (const record of superseded) {
613
707
  const completion = cleanupCandidateResidency(record);
614
- const cancelled = lifecycle.cancel(record.candidate, completion);
615
- if (!cancelled.ok && cancelled.error.code !== 'dynamic-geometry-candidate-not-found') {
616
- const restored = world.set(candidate.entity as EntityHandle, MeshFilter, {
617
- assetHandle: hostRecord.previousMeshHandle,
618
- });
619
- lifecycle.cancel(accepted.value);
620
- hostCandidates.delete(candidate.candidateId);
621
- cleanupCandidateResidency(hostRecord);
622
- releasePreviousMeshLease(hostRecord);
623
- return err(
624
- new DynamicGeometryError(
625
- 'dynamic-geometry-invalid',
626
- 'candidate supersession cancels the prior credential atomically',
627
- 'keep the prior ECS binding and candidate lifecycle intact when supersession fails',
628
- {
629
- candidateId: candidate.candidateId,
630
- actual: {
631
- cancelled: cancelled.error,
632
- restored: restored.ok ? undefined : restored.error,
633
- },
634
- },
635
- ),
636
- );
637
- }
638
- hostCandidates.delete(record.candidate.candidateId);
708
+ const result = lifecycle.cancel(record.candidate, completion);
709
+ if (!result.ok && result.error.code !== 'dynamic-geometry-candidate-not-found')
710
+ throw result.error;
639
711
  scheduleCandidateCleanup(record);
640
712
  }
641
- return accepted;
713
+ options.onTopologyChanged?.();
714
+ return ok(Object.freeze(accepted));
642
715
  },
643
716
  dynamicGeometryReceipt(candidate) {
644
717
  synchronizeGeneration();
@@ -836,4 +909,52 @@ export function createDynamicGeometryHost(options: {
836
909
  return receipts;
837
910
  },
838
911
  };
912
+ return host;
913
+ }
914
+
915
+ /**
916
+ * Renderer assembly adapter for the host's temporal geometry owner.
917
+ *
918
+ * Keeping the render-system callback at this boundary prevents the concrete
919
+ * WebGPU assembly from growing another owner-specific block while preserving
920
+ * the same lifecycle and residency contracts.
921
+ */
922
+ export function createRendererDynamicGeometryHost(options: {
923
+ readonly lifecycle: DynamicGeometryLifecycle;
924
+ readonly attachedWorlds: ReadonlySet<World>;
925
+ readonly getGpuStore: () => GpuResidencyCache;
926
+ readonly currentGeneration: () => number;
927
+ readonly renderSystem: {
928
+ readonly invalidateGeometryHistory: () => void;
929
+ readonly isDynamicGeometryConsumed: (
930
+ world: World,
931
+ entity: number,
932
+ meshHandle: DynamicGeometryCandidate['meshHandle'],
933
+ ) => boolean;
934
+ };
935
+ }): DynamicGeometryHostImplementation {
936
+ const { renderSystem, ...hostOptions } = options;
937
+ return createDynamicGeometryHost({
938
+ ...hostOptions,
939
+ onTopologyChanged: () => renderSystem.invalidateGeometryHistory(),
940
+ isConsumedByRenderFrame: (candidate) =>
941
+ renderSystem.isDynamicGeometryConsumed(
942
+ candidate.world as World,
943
+ candidate.entity ?? -1,
944
+ candidate.meshHandle,
945
+ ),
946
+ });
947
+ }
948
+
949
+ export function createRendererDynamicGeometryController(
950
+ options: Omit<Parameters<typeof createRendererDynamicGeometryHost>[0], 'lifecycle'>,
951
+ ): {
952
+ readonly lifecycle: DynamicGeometryLifecycle;
953
+ readonly host: DynamicGeometryHostImplementation;
954
+ } {
955
+ const lifecycle = createDynamicGeometryLifecycle();
956
+ return {
957
+ lifecycle,
958
+ host: createRendererDynamicGeometryHost({ ...options, lifecycle }),
959
+ };
839
960
  }
@@ -0,0 +1,71 @@
1
+ import type { World } from '@forgeax/engine-ecs';
2
+ import type { GpuResidencyCache } from '../device/gpu-residency';
3
+ import {
4
+ createDynamicGeometryLifecycle,
5
+ type DynamicGeometryCandidate,
6
+ type DynamicGeometryLifecycle,
7
+ } from '../dynamic-geometry';
8
+ import { RendererContractFailureError, RendererOperationError } from '../errors/render';
9
+ import type { RenderSystem } from '../render-system';
10
+ import {
11
+ createDynamicGeometryHost,
12
+ type DynamicGeometryHostImplementation,
13
+ } from './dynamic-geometry-host';
14
+
15
+ export interface DynamicGeometryRuntime {
16
+ readonly lifecycle: DynamicGeometryLifecycle;
17
+ readonly host: DynamicGeometryHostImplementation;
18
+ }
19
+
20
+ /** Assemble the renderer-owned candidate lifecycle and its device host. */
21
+ export function createDynamicGeometryRuntime(options: {
22
+ readonly attachedWorlds: ReadonlySet<World>;
23
+ readonly getGpuStore: () => GpuResidencyCache;
24
+ readonly currentGeneration: () => number;
25
+ readonly renderSystem: Pick<
26
+ RenderSystem,
27
+ 'invalidateGeometryHistory' | 'isDynamicGeometryConsumed'
28
+ >;
29
+ }): DynamicGeometryRuntime {
30
+ const lifecycle = createDynamicGeometryLifecycle();
31
+ const host = createDynamicGeometryHost({
32
+ lifecycle,
33
+ attachedWorlds: options.attachedWorlds,
34
+ getGpuStore: options.getGpuStore,
35
+ currentGeneration: options.currentGeneration,
36
+ onTopologyChanged: () => options.renderSystem.invalidateGeometryHistory(),
37
+ isConsumedByRenderFrame: (candidate: DynamicGeometryCandidate) =>
38
+ options.renderSystem.isDynamicGeometryConsumed(
39
+ candidate.world as World,
40
+ candidate.entity ?? -1,
41
+ candidate.meshHandle,
42
+ ),
43
+ });
44
+ return { lifecycle, host };
45
+ }
46
+
47
+ /** Reject a draw while a derived-physics publication is still unsettled. */
48
+ export function validateDerivedPhysicsFrame(
49
+ worlds: readonly World[],
50
+ ): RendererOperationError<'frame-input-invalid'> | undefined {
51
+ for (const world of worlds) {
52
+ if (!world.hasResource('PhysicsWorld')) continue;
53
+ const physics = world.getResource<{
54
+ readonly getDerivedAdmission?: () => unknown;
55
+ readonly getDerivedRecoveryState?: () => string;
56
+ }>('PhysicsWorld');
57
+ if (
58
+ physics?.getDerivedAdmission?.() !== undefined ||
59
+ physics?.getDerivedRecoveryState?.() === 'rebuild-required'
60
+ ) {
61
+ return new RendererOperationError('frame-input-invalid', {
62
+ operation: 'draw',
63
+ cause: new RendererContractFailureError(
64
+ 'draw',
65
+ 'paired geometry admission must finish physics step and writeback in a healthy World before draw',
66
+ ),
67
+ });
68
+ }
69
+ }
70
+ return undefined;
71
+ }
@@ -9,6 +9,9 @@ import type { RendererAssemblyImplementation } from './host-contract';
9
9
  import { toError } from './renderer-facade';
10
10
  import { tryCreateWebGPURenderer } from './webgpu-renderer';
11
11
 
12
+ export { disposeObservationCaptureSet } from './webgpu-renderer';
13
+ export { particleMaterialInputVertexBuffers } from './webgpu-vertex-layouts';
14
+
12
15
  /*
13
16
  * Renderer ownership stays explicit even though the implementation is split:
14
17
  * the delegated target owner comes from './render-target-host'. The concrete
@@ -69,6 +72,7 @@ export {
69
72
  resolveMaterialShaderUvSetCount,
70
73
  resolveMaterialShaderVariantSet,
71
74
  resolveMaterialShaderVertexInputContract,
75
+ selectGpuDrivenSceneIndexVariant,
72
76
  selectHdrpPbrPrewarmVariants,
73
77
  selectNoColorPbrVariant,
74
78
  selectPipelineLayoutForVariant,
@@ -0,0 +1,29 @@
1
+ import { err, type RhiDevice, RhiError } from '@forgeax/engine-rhi';
2
+ import { GpuDrivenProduction } from '../gpu-driven/production-raster';
3
+ import type { PipelineBuilderShaderModuleFactory } from '../pipeline-builder';
4
+
5
+ /**
6
+ * Renderer-owned GPU-driven frame state boundary. The production object owns
7
+ * view resources and prepared generations; callers only supply the backend
8
+ * and shader factory and must not create a parallel frame loop.
9
+ */
10
+ export function createGpuDrivenOwner(
11
+ device: RhiDevice,
12
+ shaderModuleFactory?: PipelineBuilderShaderModuleFactory,
13
+ recoveryCount = 0,
14
+ ): GpuDrivenProduction {
15
+ return new GpuDrivenProduction(
16
+ device,
17
+ shaderModuleFactory ?? {
18
+ createShaderModule: () =>
19
+ err(
20
+ new RhiError({
21
+ code: 'rhi-not-available',
22
+ expected: 'the renderer backend exposes shader module creation',
23
+ hint: 'construct the renderer through the backend pack before activating GPU-driven rendering',
24
+ }),
25
+ ),
26
+ },
27
+ recoveryCount,
28
+ );
29
+ }
@@ -13,6 +13,7 @@ import type { RecoverFailure } from '../errors/recover';
13
13
  import type { ObservationUnavailableError, RenderError } from '../errors/render';
14
14
  import type { RenderFeature, RenderFeatureDiagnostics } from '../features/types';
15
15
  import type { GpuDrivenProductionInspection, LodOcclusionInspection } from '../inspection-types';
16
+ import type { InstanceCollectionStore } from '../instances';
16
17
  import type { MeshMaterialBindingObservation } from '../mesh-material-bindings';
17
18
  import type { FrameObservation, FrameObservationOptions } from '../record/frame';
18
19
  import type { CurrentGraphTarget, GraphTargetCaptureRequest } from '../record/frame-snapshot';
@@ -33,6 +34,7 @@ import type {
33
34
  RenderWorldLease,
34
35
  } from '../render-contract';
35
36
  import type { RenderSceneInspection } from '../render-system';
37
+ import type { RenderSceneBounds } from '../scene/render-scene-types';
36
38
  import type {
37
39
  RenderTarget,
38
40
  RenderTargetDescriptor,
@@ -60,6 +62,8 @@ export type RendererHostEventListener = (event: RendererHostEvent) => void;
60
62
  * the public Renderer type.
61
63
  */
62
64
  export interface RendererHostImplementation {
65
+ /** Renderer-owned authoring and update path for large instance collections. */
66
+ readonly instances: InstanceCollectionStore;
63
67
  attach(world: World): RenderResult<RenderWorldLease, RenderError>;
64
68
  prepareDynamicGeometry(
65
69
  input: DynamicGeometryPrepareInput,
@@ -68,6 +72,15 @@ export interface RendererHostImplementation {
68
72
  candidate: DynamicGeometryCandidate,
69
73
  ordering: DynamicGeometryOrdering,
70
74
  ): Result<DynamicGeometryCandidate, DynamicGeometryError>;
75
+ /**
76
+ * Atomically swap distinct entities in one attached World. Returned failures
77
+ * retain old bindings; an uncertain rollback throws to require paired rebuild.
78
+ * Invoke inside PhysicsWorld.admitDerivedShapeCandidates commitGeometry.
79
+ */
80
+ acceptDynamicGeometryCandidates(
81
+ candidates: readonly DynamicGeometryCandidate[],
82
+ ordering: DynamicGeometryOrdering,
83
+ ): Result<readonly DynamicGeometryCandidate[], DynamicGeometryError>;
71
84
  dynamicGeometryReceipt(candidate: DynamicGeometryCandidate): DynamicGeometryReceipt | undefined;
72
85
  cancelDynamicGeometry(candidate: DynamicGeometryCandidate): Result<void, DynamicGeometryError>;
73
86
  retireDynamicGeometry(candidate: DynamicGeometryCandidate): Result<void, DynamicGeometryError>;
@@ -95,6 +108,8 @@ export interface RendererHostImplementation {
95
108
  ): RenderResult<RenderTargetReadbackTicket, RenderError>;
96
109
  destroyRenderTarget(target: RenderTarget): RenderResult<void, RenderError>;
97
110
  setProfile(profile: RenderProfile): RenderResult<void, RenderError>;
111
+ /** Detached world bounds for one record in the last extracted World; undefined if unavailable. */
112
+ bounds(world: World, entity: number): RenderSceneBounds | undefined;
98
113
  inspect(): RenderInspection;
99
114
  /**
100
115
  * Internal bounded inspection for high-cardinality producers. The public
@@ -106,6 +121,10 @@ export interface RendererHostImplementation {
106
121
  readonly gpuDriven: GpuDrivenProductionInspection;
107
122
  };
108
123
  drawFrame(request: RenderFrameInput): RenderResult<FrameReceipt, RhiError | RenderError>;
124
+ /** Arm one upcoming frame for receipt-bound color observations. */
125
+ requestObservation?: (
126
+ domains: readonly import('../render-contract').FrameObservationDomain[],
127
+ ) => RenderResult<void, RenderError>;
109
128
  observe(
110
129
  receipt: FrameReceipt,
111
130
  request: FrameObservationRequest,