@forgeax/engine-render 0.1.20 → 0.1.23

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 (645) hide show
  1. package/README.md +365 -29
  2. package/dist/assembly/backend-contract.d.ts +13 -0
  3. package/dist/assembly/backend-contract.d.ts.map +1 -1
  4. package/dist/assembly/device-feature-admission.d.ts +18 -0
  5. package/dist/assembly/device-feature-admission.d.ts.map +1 -0
  6. package/dist/assembly/directional-shadow-inspection.d.ts +38 -0
  7. package/dist/assembly/directional-shadow-inspection.d.ts.map +1 -0
  8. package/dist/assembly/factory.d.ts +30 -19
  9. package/dist/assembly/factory.d.ts.map +1 -1
  10. package/dist/assembly/host-contract.d.ts +19 -0
  11. package/dist/assembly/host-contract.d.ts.map +1 -1
  12. package/dist/assembly/render-target-host.d.ts +46 -0
  13. package/dist/assembly/render-target-host.d.ts.map +1 -0
  14. package/dist/assets/render-asset-port.d.ts.map +1 -1
  15. package/dist/authoring.mjs +4 -1
  16. package/dist/authoring.mjs.map +1 -1
  17. package/dist/capture/cube-views.d.ts +21 -0
  18. package/dist/capture/cube-views.d.ts.map +1 -0
  19. package/dist/capture/scheduler.d.ts +54 -0
  20. package/dist/capture/scheduler.d.ts.map +1 -0
  21. package/dist/{chunk-PCHBPYML.mjs → chunk-4L3P6DT5.mjs} +2 -2
  22. package/dist/chunk-4L3P6DT5.mjs.map +1 -0
  23. package/dist/{chunk-VFPLTKCU.mjs → chunk-4NPUASZR.mjs} +15 -4
  24. package/dist/chunk-4NPUASZR.mjs.map +1 -0
  25. package/dist/chunk-DIYW3M5D.mjs +5085 -0
  26. package/dist/chunk-DIYW3M5D.mjs.map +1 -0
  27. package/dist/chunk-FBC4R44J.mjs +1003 -0
  28. package/dist/chunk-FBC4R44J.mjs.map +1 -0
  29. package/dist/{chunk-CDTWTHZR.mjs → chunk-FF7K3FSO.mjs} +474 -168
  30. package/dist/chunk-FF7K3FSO.mjs.map +1 -0
  31. package/dist/chunk-HZUPSYW7.mjs +1104 -0
  32. package/dist/chunk-HZUPSYW7.mjs.map +1 -0
  33. package/dist/{chunk-TBQJOK2L.mjs → chunk-QODA5UKU.mjs} +321 -269
  34. package/dist/chunk-QODA5UKU.mjs.map +1 -0
  35. package/dist/chunk-YALPS44A.mjs +296 -0
  36. package/dist/chunk-YALPS44A.mjs.map +1 -0
  37. package/dist/{chunk-4XINDLAY.mjs → chunk-ZUWKAZ2I.mjs} +1963 -2178
  38. package/dist/chunk-ZUWKAZ2I.mjs.map +1 -0
  39. package/dist/cluster-binner.d.ts +5 -0
  40. package/dist/cluster-binner.d.ts.map +1 -1
  41. package/dist/components/camera.d.ts +1 -0
  42. package/dist/components/camera.d.ts.map +1 -1
  43. package/dist/components/cube-camera.d.ts +20 -0
  44. package/dist/components/cube-camera.d.ts.map +1 -0
  45. package/dist/components/directional-light.d.ts +11 -2
  46. package/dist/components/directional-light.d.ts.map +1 -1
  47. package/dist/components/directional-shadow-filter.d.ts +25 -0
  48. package/dist/components/directional-shadow-filter.d.ts.map +1 -0
  49. package/dist/components/index.d.ts +5 -0
  50. package/dist/components/index.d.ts.map +1 -1
  51. package/dist/components/light-helpers.d.ts +4 -0
  52. package/dist/components/light-helpers.d.ts.map +1 -1
  53. package/dist/components/light-probe.d.ts +9 -0
  54. package/dist/components/light-probe.d.ts.map +1 -0
  55. package/dist/components/rect-area-light.d.ts +12 -0
  56. package/dist/components/rect-area-light.d.ts.map +1 -0
  57. package/dist/components/reflection-probe.d.ts +17 -0
  58. package/dist/components/reflection-probe.d.ts.map +1 -0
  59. package/dist/components/scene-instance.d.ts +4 -0
  60. package/dist/components/scene-instance.d.ts.map +1 -1
  61. package/dist/components/spot-light.d.ts +3 -0
  62. package/dist/components/spot-light.d.ts.map +1 -1
  63. package/dist/construct-renderer.mjs +14836 -9620
  64. package/dist/construct-renderer.mjs.map +1 -1
  65. package/dist/device/gpu-residency.d.ts +8 -1
  66. package/dist/device/gpu-residency.d.ts.map +1 -1
  67. package/dist/device/lifecycle-transaction.d.ts +2 -0
  68. package/dist/device/lifecycle-transaction.d.ts.map +1 -0
  69. package/dist/environment/frame.d.ts.map +1 -1
  70. package/dist/environment/lifecycle.d.ts +5 -0
  71. package/dist/environment/lifecycle.d.ts.map +1 -1
  72. package/dist/errors/gpu-driven.d.ts +26 -0
  73. package/dist/errors/gpu-driven.d.ts.map +1 -0
  74. package/dist/errors/index.d.ts +1 -0
  75. package/dist/errors/index.d.ts.map +1 -1
  76. package/dist/errors/recover.d.ts +9 -1
  77. package/dist/errors/recover.d.ts.map +1 -1
  78. package/dist/errors/render.d.ts +166 -93
  79. package/dist/errors/render.d.ts.map +1 -1
  80. package/dist/extract/directional-shadow-projection.d.ts +23 -0
  81. package/dist/extract/directional-shadow-projection.d.ts.map +1 -0
  82. package/dist/extract/environment.d.ts +14 -0
  83. package/dist/extract/environment.d.ts.map +1 -1
  84. package/dist/extract/gpu-driven.d.ts +50 -0
  85. package/dist/extract/gpu-driven.d.ts.map +1 -0
  86. package/dist/extract/visibility.d.ts.map +1 -1
  87. package/dist/features/fullscreen.d.ts.map +1 -1
  88. package/dist/features/targets.d.ts.map +1 -1
  89. package/dist/features/types.d.ts +10 -0
  90. package/dist/features/types.d.ts.map +1 -1
  91. package/dist/fullscreen-post-process-pass.d.ts +13 -2
  92. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  93. package/dist/gpu-driven/batch-topology.d.ts +34 -0
  94. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  95. package/dist/gpu-driven/prepared-draw.d.ts +63 -0
  96. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -0
  97. package/dist/gpu-driven/production-raster.d.ts +97 -2
  98. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  99. package/dist/gpu-driven/view-gpu.d.ts +64 -1
  100. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  101. package/dist/gpu-scene-schema.d.ts +14 -0
  102. package/dist/gpu-scene-schema.d.ts.map +1 -1
  103. package/dist/gpu-scene.d.ts +8 -1
  104. package/dist/gpu-scene.d.ts.map +1 -1
  105. package/dist/gpu-usage.d.ts +0 -1
  106. package/dist/gpu-usage.d.ts.map +1 -1
  107. package/dist/hdrp-buffers.d.ts +21 -19
  108. package/dist/hdrp-buffers.d.ts.map +1 -1
  109. package/dist/ibl/IblPipelineCache.d.ts +4 -0
  110. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  111. package/dist/ibl/kernel-cache.d.ts +36 -0
  112. package/dist/ibl/kernel-cache.d.ts.map +1 -0
  113. package/dist/index.d.ts +39 -3
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.mjs +91 -6
  116. package/dist/index.mjs.map +1 -1
  117. package/dist/inspection-types.d.ts +214 -1
  118. package/dist/inspection-types.d.ts.map +1 -1
  119. package/dist/instances-derived-bounds.d.ts +50 -0
  120. package/dist/instances-derived-bounds.d.ts.map +1 -0
  121. package/dist/internal.d.ts +9 -0
  122. package/dist/internal.d.ts.map +1 -1
  123. package/dist/internal.mjs +23 -2
  124. package/dist/internal.mjs.map +1 -1
  125. package/dist/light-buffer-layout.d.ts +58 -140
  126. package/dist/light-buffer-layout.d.ts.map +1 -1
  127. package/dist/materials.d.ts.map +1 -1
  128. package/dist/mesh-material-bindings.d.ts +54 -0
  129. package/dist/mesh-material-bindings.d.ts.map +1 -1
  130. package/dist/pbr-pipeline.d.ts +38 -14
  131. package/dist/pbr-pipeline.d.ts.map +1 -1
  132. package/dist/pipeline/standard-forward-lane.d.ts +2 -1
  133. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  134. package/dist/pipeline/standard-lighting/errors.d.ts +4 -0
  135. package/dist/pipeline/standard-lighting/errors.d.ts.map +1 -0
  136. package/dist/pipeline/standard-lighting/graph.d.ts +24 -0
  137. package/dist/pipeline/standard-lighting/graph.d.ts.map +1 -0
  138. package/dist/pipeline/standard-lighting/inspection.d.ts +38 -0
  139. package/dist/pipeline/standard-lighting/inspection.d.ts.map +1 -0
  140. package/dist/pipeline/standard-lighting/layout.d.ts +28 -0
  141. package/dist/pipeline/standard-lighting/layout.d.ts.map +1 -0
  142. package/dist/pipeline/standard-lighting/light-frame.d.ts +33 -0
  143. package/dist/pipeline/standard-lighting/light-frame.d.ts.map +1 -0
  144. package/dist/pipeline/standard-lighting/membership.d.ts +14 -0
  145. package/dist/pipeline/standard-lighting/membership.d.ts.map +1 -0
  146. package/dist/pipeline/standard-lighting/prepare.d.ts +16 -0
  147. package/dist/pipeline/standard-lighting/prepare.d.ts.map +1 -0
  148. package/dist/pipeline/standard-lighting/topology.d.ts +45 -0
  149. package/dist/pipeline/standard-lighting/topology.d.ts.map +1 -0
  150. package/dist/pipeline/standard-lighting/transport.d.ts +36 -0
  151. package/dist/pipeline/standard-lighting/transport.d.ts.map +1 -0
  152. package/dist/pipeline/standard-pipeline.d.ts +4 -13
  153. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  154. package/dist/pipeline/standard-post.d.ts.map +1 -1
  155. package/dist/pipeline/standard-profile.d.ts +5 -26
  156. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  157. package/dist/pipeline-builder.d.ts +2 -0
  158. package/dist/pipeline-builder.d.ts.map +1 -1
  159. package/dist/pipeline-spec.d.ts +40 -7
  160. package/dist/pipeline-spec.d.ts.map +1 -1
  161. package/dist/plugin.d.ts.map +1 -1
  162. package/dist/point-shadow-inspection.d.ts +21 -0
  163. package/dist/point-shadow-inspection.d.ts.map +1 -0
  164. package/dist/prepare/extended-lighting/ltc-resources.d.ts +31 -0
  165. package/dist/prepare/extended-lighting/ltc-resources.d.ts.map +1 -0
  166. package/dist/prepare/extended-lighting/resources.d.ts +72 -0
  167. package/dist/prepare/extended-lighting/resources.d.ts.map +1 -0
  168. package/dist/prepare/extended-lighting/spot-modifiers.d.ts +42 -0
  169. package/dist/prepare/extended-lighting/spot-modifiers.d.ts.map +1 -0
  170. package/dist/prepare/extended-lighting/state.d.ts +24 -0
  171. package/dist/prepare/extended-lighting/state.d.ts.map +1 -0
  172. package/dist/record/frame-lighting.d.ts +33 -36
  173. package/dist/record/frame-lighting.d.ts.map +1 -1
  174. package/dist/record/frame-snapshot.d.ts +78 -24
  175. package/dist/record/frame-snapshot.d.ts.map +1 -1
  176. package/dist/record/frame-targets.d.ts +5 -0
  177. package/dist/record/frame-targets.d.ts.map +1 -1
  178. package/dist/record/frame.d.ts +16 -6
  179. package/dist/record/frame.d.ts.map +1 -1
  180. package/dist/record/gpu-pass-timing/contract.d.ts +96 -0
  181. package/dist/record/gpu-pass-timing/contract.d.ts.map +1 -0
  182. package/dist/record/gpu-pass-timing/errors.d.ts +18 -0
  183. package/dist/record/gpu-pass-timing/errors.d.ts.map +1 -0
  184. package/dist/record/gpu-pass-timing/index.d.ts +8 -0
  185. package/dist/record/gpu-pass-timing/index.d.ts.map +1 -0
  186. package/dist/record/gpu-pass-timing/parser.d.ts +11 -0
  187. package/dist/record/gpu-pass-timing/parser.d.ts.map +1 -0
  188. package/dist/record/gpu-pass-timing/session.d.ts +43 -0
  189. package/dist/record/gpu-pass-timing/session.d.ts.map +1 -0
  190. package/dist/record/gpu-timing.d.ts +20 -3
  191. package/dist/record/gpu-timing.d.ts.map +1 -1
  192. package/dist/record/helpers.d.ts +0 -20
  193. package/dist/record/helpers.d.ts.map +1 -1
  194. package/dist/record/main-pass-geometry.d.ts +6 -1
  195. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  196. package/dist/record/main-pass-material.d.ts +25 -2
  197. package/dist/record/main-pass-material.d.ts.map +1 -1
  198. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  199. package/dist/record/main-pass.d.ts +2 -0
  200. package/dist/record/main-pass.d.ts.map +1 -1
  201. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  202. package/dist/record/render-context.d.ts +98 -6
  203. package/dist/record/render-context.d.ts.map +1 -1
  204. package/dist/record/shadow-pass.d.ts.map +1 -1
  205. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  206. package/dist/record/typed-frame-graph.d.ts +119 -4
  207. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  208. package/dist/record/view-ubo.d.ts +7 -5
  209. package/dist/record/view-ubo.d.ts.map +1 -1
  210. package/dist/reflection/filter.d.ts +22 -0
  211. package/dist/reflection/filter.d.ts.map +1 -0
  212. package/dist/reflection/gpu-table.d.ts +25 -0
  213. package/dist/reflection/gpu-table.d.ts.map +1 -0
  214. package/dist/reflection/inspection.d.ts +10 -0
  215. package/dist/reflection/inspection.d.ts.map +1 -0
  216. package/dist/reflection/projection.d.ts +140 -0
  217. package/dist/reflection/projection.d.ts.map +1 -0
  218. package/dist/reflection/record-owner.d.ts +60 -0
  219. package/dist/reflection/record-owner.d.ts.map +1 -0
  220. package/dist/render-contract.d.ts +62 -14
  221. package/dist/render-contract.d.ts.map +1 -1
  222. package/dist/render-graph-primitives.d.ts +1 -0
  223. package/dist/render-graph-primitives.d.ts.map +1 -1
  224. package/dist/render-pipeline.d.ts +49 -2
  225. package/dist/render-pipeline.d.ts.map +1 -1
  226. package/dist/render-system-extract.d.ts +160 -31
  227. package/dist/render-system-extract.d.ts.map +1 -1
  228. package/dist/render-system.d.ts +28 -2
  229. package/dist/render-system.d.ts.map +1 -1
  230. package/dist/renderer.d.ts +43 -0
  231. package/dist/renderer.d.ts.map +1 -0
  232. package/dist/scene/probe-blend-record.d.ts +22 -0
  233. package/dist/scene/probe-blend-record.d.ts.map +1 -0
  234. package/dist/scene/probe-blend.d.ts +142 -0
  235. package/dist/scene/probe-blend.d.ts.map +1 -0
  236. package/dist/scene/render-scene-types.d.ts +0 -6
  237. package/dist/scene/render-scene-types.d.ts.map +1 -1
  238. package/dist/scene/render-scene.d.ts +117 -9
  239. package/dist/scene/render-scene.d.ts.map +1 -1
  240. package/dist/scene/visibility/bounds.d.ts +20 -0
  241. package/dist/scene/visibility/bounds.d.ts.map +1 -0
  242. package/dist/scene/visibility/budget.d.ts +16 -0
  243. package/dist/scene/visibility/budget.d.ts.map +1 -0
  244. package/dist/scene/visibility/facet.d.ts +73 -0
  245. package/dist/scene/visibility/facet.d.ts.map +1 -0
  246. package/dist/scene/visibility/gpu-frame-timing.d.ts +41 -0
  247. package/dist/scene/visibility/gpu-frame-timing.d.ts.map +1 -0
  248. package/dist/scene/visibility/gpu-lod.d.ts +46 -0
  249. package/dist/scene/visibility/gpu-lod.d.ts.map +1 -0
  250. package/dist/scene/visibility/inspection.d.ts +132 -0
  251. package/dist/scene/visibility/inspection.d.ts.map +1 -0
  252. package/dist/scene/visibility/lod-selector.d.ts +25 -0
  253. package/dist/scene/visibility/lod-selector.d.ts.map +1 -0
  254. package/dist/scene/visibility/occlusion-confidence.d.ts +81 -0
  255. package/dist/scene/visibility/occlusion-confidence.d.ts.map +1 -0
  256. package/dist/scene/visibility/occlusion-pass.d.ts +57 -0
  257. package/dist/scene/visibility/occlusion-pass.d.ts.map +1 -0
  258. package/dist/scene/visibility/occlusion-query-pool.d.ts +57 -0
  259. package/dist/scene/visibility/occlusion-query-pool.d.ts.map +1 -0
  260. package/dist/scene/visibility/occlusion-runtime.d.ts +96 -0
  261. package/dist/scene/visibility/occlusion-runtime.d.ts.map +1 -0
  262. package/dist/scene/visibility/types.d.ts +34 -0
  263. package/dist/scene/visibility/types.d.ts.map +1 -0
  264. package/dist/shadow-atlas.d.ts +3 -3
  265. package/dist/shadow-atlas.d.ts.map +1 -1
  266. package/dist/ssao-buffers.d.ts +3 -0
  267. package/dist/ssao-buffers.d.ts.map +1 -1
  268. package/dist/ssr/admission.d.ts +122 -0
  269. package/dist/ssr/admission.d.ts.map +1 -0
  270. package/dist/ssr/composition.d.ts +32 -0
  271. package/dist/ssr/composition.d.ts.map +1 -0
  272. package/dist/ssr/errors.d.ts +39 -0
  273. package/dist/ssr/errors.d.ts.map +1 -0
  274. package/dist/ssr/identity.d.ts +13 -0
  275. package/dist/ssr/identity.d.ts.map +1 -0
  276. package/dist/systems/skin-palette-allocator.d.ts +1 -1
  277. package/dist/targets/contracts.d.ts +66 -0
  278. package/dist/targets/contracts.d.ts.map +1 -0
  279. package/dist/targets/graph-projection.d.ts +29 -0
  280. package/dist/targets/graph-projection.d.ts.map +1 -0
  281. package/dist/targets/material-source.d.ts +34 -0
  282. package/dist/targets/material-source.d.ts.map +1 -0
  283. package/dist/targets/owner.d.ts +32 -0
  284. package/dist/targets/owner.d.ts.map +1 -0
  285. package/dist/targets/physical.d.ts +18 -0
  286. package/dist/targets/physical.d.ts.map +1 -0
  287. package/dist/targets/readback.d.ts +39 -0
  288. package/dist/targets/readback.d.ts.map +1 -0
  289. package/dist/temporal/frame-coordinator.d.ts +13 -0
  290. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  291. package/dist/temporal/frame.d.ts +2 -0
  292. package/dist/temporal/frame.d.ts.map +1 -1
  293. package/dist/temporal/index.mjs +6 -5
  294. package/dist/temporal/view.d.ts +7 -0
  295. package/dist/temporal/view.d.ts.map +1 -1
  296. package/dist/tilemap-chunk-extract-system.d.ts +1 -1
  297. package/dist/typed-render-graph-primitives.d.ts +5 -1
  298. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  299. package/dist/typed-shadow-passes.d.ts +1 -1
  300. package/dist/typed-shadow-passes.d.ts.map +1 -1
  301. package/dist/volume/passes.d.ts +9 -5
  302. package/dist/volume/passes.d.ts.map +1 -1
  303. package/package.json +20 -20
  304. package/src/__tests__/bloom-exact-zero.unit.test.ts +48 -19
  305. package/src/__tests__/bloom-lifecycle.integration.test.ts +41 -13
  306. package/src/__tests__/camera-target-consumption.unit.test.ts +53 -0
  307. package/src/__tests__/cluster-binner.unit.test.ts +35 -0
  308. package/src/__tests__/cluster-grid-default-surface.unit.test.ts +12 -2
  309. package/src/__tests__/cube-camera-scheduler.unit.test.ts +70 -0
  310. package/src/__tests__/cube-camera-single-submit.perf.test.ts +75 -0
  311. package/src/__tests__/cube-camera-view-matrices.unit.test.ts +41 -0
  312. package/src/__tests__/cube-camera-vocabulary.unit.test.ts +47 -0
  313. package/src/__tests__/cube-camera.integration.test.ts +42 -0
  314. package/src/__tests__/detached-inspection.integration.test.ts +6 -0
  315. package/src/__tests__/device-feature-admission.unit.test.ts +85 -0
  316. package/src/__tests__/direct-light-snapshot.unit.test.ts +62 -6
  317. package/src/__tests__/docs-gate-green.unit.test.ts +38 -0
  318. package/src/__tests__/environment-generation.integration.test.ts +16 -0
  319. package/src/__tests__/evidence-identity.ts +13 -0
  320. package/src/__tests__/evidence-identity.unit.test.ts +24 -0
  321. package/src/__tests__/extended-lighting-recovery.browser.test.ts +14 -0
  322. package/src/__tests__/extended-lighting-recovery.dawn.test.ts +14 -0
  323. package/src/__tests__/extended-lighting-recovery.integration.test.ts +81 -0
  324. package/src/__tests__/extended-lighting-resources.unit.test.ts +51 -0
  325. package/src/__tests__/extended-lighting-zero-feature.integration.test.ts +52 -0
  326. package/src/__tests__/factory-contract.integration.test.ts +288 -29
  327. package/src/__tests__/fog-component.unit.test.ts +67 -0
  328. package/src/__tests__/fog.integration.test.ts +86 -0
  329. package/src/__tests__/frame-observation.contract.test.ts +15 -0
  330. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +37 -0
  331. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +146 -0
  332. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +10 -8
  333. package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +18 -1
  334. package/src/__tests__/gpu-driven-production.integration.test.ts +579 -17
  335. package/src/__tests__/gpu-driven-scaling.unit.test.ts +66 -2
  336. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +26 -1
  337. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +101 -6
  338. package/src/__tests__/gpu-driven-view.browser.test.ts +3 -3
  339. package/src/__tests__/gpu-driven-view.dawn.test.ts +3 -3
  340. package/src/__tests__/gpu-driven-view.unit.test.ts +50 -0
  341. package/src/__tests__/gpu-lod-evidence.ts +188 -0
  342. package/src/__tests__/gpu-lod-fallback.integration.test.ts +10 -0
  343. package/src/__tests__/gpu-lod-indirect.integration.test.ts +40 -0
  344. package/src/__tests__/gpu-lod-parity.dawn.test.ts +29 -0
  345. package/src/__tests__/gpu-lod-readiness.integration.test.ts +52 -0
  346. package/src/__tests__/gpu-lod-schema.unit.test.ts +66 -0
  347. package/src/__tests__/gpu-lod-selector.unit.test.ts +28 -0
  348. package/src/__tests__/gpu-lod-silhouette.browser.test.ts +13 -0
  349. package/src/__tests__/gpu-pass-timing-browser-runner.ts +281 -0
  350. package/src/__tests__/gpu-pass-timing-coexistence.integration.test.ts +80 -0
  351. package/src/__tests__/gpu-pass-timing-contract.unit.test.ts +243 -0
  352. package/src/__tests__/gpu-pass-timing-exact-zero.unit.test.ts +131 -0
  353. package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +230 -0
  354. package/src/__tests__/gpu-pass-timing-observation.unit.test.ts +233 -0
  355. package/src/__tests__/gpu-pass-timing-session.unit.test.ts +438 -0
  356. package/src/__tests__/gpu-pass-timing.browser.test.ts +26 -0
  357. package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +125 -0
  358. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +66 -1
  359. package/src/__tests__/gpu-scene.dawn.test.ts +8 -1
  360. package/src/__tests__/gpu-scene.unit.test.ts +49 -3
  361. package/src/__tests__/hdrp-group2-visibility.unit.test.ts +24 -0
  362. package/src/__tests__/instances-culling.integration.test.ts +94 -0
  363. package/src/__tests__/instances-derived-bounds.unit.test.ts +118 -0
  364. package/src/__tests__/light-buffer-layout.unit.test.ts +113 -3
  365. package/src/__tests__/light-inspection.unit.test.ts +55 -0
  366. package/src/__tests__/light-resource-error.unit.test.ts +43 -0
  367. package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +109 -0
  368. package/src/__tests__/lod-bounds.unit.test.ts +42 -0
  369. package/src/__tests__/lod-cpu-lane.integration.test.ts +55 -0
  370. package/src/__tests__/lod-cpu-no-change.perf.test.ts +19 -0
  371. package/src/__tests__/lod-gpu-frame-timing.unit.test.ts +49 -0
  372. package/src/__tests__/lod-multi-view.integration.test.ts +63 -0
  373. package/src/__tests__/lod-occlusion-device-loss.integration.test.ts +27 -0
  374. package/src/__tests__/lod-occlusion-final-decision.integration.test.ts +47 -0
  375. package/src/__tests__/lod-occlusion-inspection.integration.test.ts +217 -0
  376. package/src/__tests__/lod-occlusion-inspection.schema.test-d.ts +14 -0
  377. package/src/__tests__/lod-occlusion-inspection.unit.test.ts +72 -0
  378. package/src/__tests__/lod-occlusion-visual-evidence.ts +91 -0
  379. package/src/__tests__/lod-occlusion.browser.test.ts +15 -0
  380. package/src/__tests__/lod-occlusion.dawn.test.ts +20 -0
  381. package/src/__tests__/lod-selector.profile.test.ts +35 -0
  382. package/src/__tests__/lod-selector.unit.test.ts +68 -0
  383. package/src/__tests__/lod-visibility-identity.unit.test.ts +198 -0
  384. package/src/__tests__/lod-visibility-lifecycle.integration.test.ts +132 -0
  385. package/src/__tests__/ltc-resources.unit.test.ts +32 -0
  386. package/src/__tests__/material-contract-inventory.unit.test.ts +17 -0
  387. package/src/__tests__/material-observation.integration.test.ts +101 -0
  388. package/src/__tests__/occlusion-confidence.unit.test.ts +168 -0
  389. package/src/__tests__/occlusion-invalidation.integration.test.ts +37 -0
  390. package/src/__tests__/occlusion-pass-routing.unit.test.ts +16 -0
  391. package/src/__tests__/occlusion-pass.dawn.test.ts +20 -0
  392. package/src/__tests__/occlusion-pass.integration.test.ts +43 -0
  393. package/src/__tests__/occlusion-pass.rhi-null.test.ts +22 -0
  394. package/src/__tests__/occlusion-query-pool.rhi-null.test.ts +21 -0
  395. package/src/__tests__/occlusion-query-pool.unit.test.ts +95 -0
  396. package/src/__tests__/occlusion-query-ticket.integration.test.ts +47 -0
  397. package/src/__tests__/occlusion-query.dawn.test.ts +16 -0
  398. package/src/__tests__/occlusion-query.evidence.ts +178 -0
  399. package/src/__tests__/occlusion-query.rhi-null.test.ts +31 -0
  400. package/src/__tests__/occlusion-runtime.unit.test.ts +120 -0
  401. package/src/__tests__/pbr-view-layout.unit.test.ts +16 -0
  402. package/src/__tests__/point-shadow-inspection.unit.test.ts +60 -0
  403. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +196 -0
  404. package/src/__tests__/probe-bindings.unit.test.ts +200 -0
  405. package/src/__tests__/probe-blend-numeric.unit.test.ts +67 -0
  406. package/src/__tests__/probe-blend-oracle.unit.test.ts +136 -0
  407. package/src/__tests__/probe-capacity.integration.test.ts +97 -0
  408. package/src/__tests__/probe-recovery.integration.test.ts +104 -0
  409. package/src/__tests__/probe-scene-dirty.integration.test.ts +211 -0
  410. package/src/__tests__/profiler-phase-catalog.test.ts +4 -1
  411. package/src/__tests__/profiler-phase-token.test.ts +1 -0
  412. package/src/__tests__/public-surface.test-d.ts +10 -0
  413. package/src/__tests__/rect-area-boundary.unit.test.ts +24 -0
  414. package/src/__tests__/reflection-fallback-graph.unit.test.ts +67 -0
  415. package/src/__tests__/reflection-fallback-inspection.unit.test.ts +77 -0
  416. package/src/__tests__/reflection-fallback-lifecycle.integration.test.ts +21 -0
  417. package/src/__tests__/reflection-fallback-projection.unit.test.ts +90 -0
  418. package/src/__tests__/reflection-fallback-source.unit.test.ts +32 -0
  419. package/src/__tests__/reflection-probe-authoring.unit.test.ts +71 -0
  420. package/src/__tests__/reflection-probe-filter.unit.test.ts +54 -0
  421. package/src/__tests__/reflection-probe-ibl-topology.unit.test.ts +45 -0
  422. package/src/__tests__/reflection-probe-owner-placement.unit.test.ts +39 -0
  423. package/src/__tests__/reflection-probe-pass-encode.integration.test.ts +101 -0
  424. package/src/__tests__/reflection-probe-performance.perf.test.ts +60 -0
  425. package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +120 -0
  426. package/src/__tests__/reflection-probe-recovery.integration.test.ts +55 -0
  427. package/src/__tests__/reflection-probe-selection.unit.test.ts +46 -0
  428. package/src/__tests__/render-error-code-owner.test-d.ts +19 -3
  429. package/src/__tests__/render-feature-docs.unit.test.ts +12 -7
  430. package/src/__tests__/render-graph-fallback.integration.test.ts +24 -0
  431. package/src/__tests__/render-perf/extended-lighting.bench.test.ts +66 -0
  432. package/src/__tests__/render-scene-projection.unit.test.ts +447 -18
  433. package/src/__tests__/render-target-admission.unit.test.ts +80 -0
  434. package/src/__tests__/render-target-graph-projection.unit.test.ts +102 -0
  435. package/src/__tests__/render-target-inspection.unit.test.ts +52 -0
  436. package/src/__tests__/render-target-material-source.test-d.ts +30 -0
  437. package/src/__tests__/render-target-material-source.unit.test.ts +97 -0
  438. package/src/__tests__/render-target-owner-placement.unit.test.ts +203 -0
  439. package/src/__tests__/render-target-owner.unit.test.ts +122 -0
  440. package/src/__tests__/render-target-probe-soak.perf.test.ts +94 -0
  441. package/src/__tests__/render-target-public-schema.json +107 -0
  442. package/src/__tests__/render-target-public-schema.unit.test.ts +91 -0
  443. package/src/__tests__/render-target-public-surface.test-d.ts +83 -0
  444. package/src/__tests__/render-target-readback.integration.test.ts +90 -0
  445. package/src/__tests__/render-target-recovery.integration.test.ts +85 -0
  446. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +124 -0
  447. package/src/__tests__/renderer-lifecycle.integration.test.ts +14 -0
  448. package/src/__tests__/shader-stage-surface.unit.test.ts +19 -4
  449. package/src/__tests__/skin-motion-regression.unit.test.ts +154 -0
  450. package/src/__tests__/skinned-shadow-caster.test.ts +13 -4
  451. package/src/__tests__/spot-modifier-projection.unit.test.ts +70 -0
  452. package/src/__tests__/ssr-admission-matrix.integration.test.ts +206 -0
  453. package/src/__tests__/ssr-composition.unit.test.ts +46 -0
  454. package/src/__tests__/ssr-fallback-zero-work.bench.test.ts +94 -0
  455. package/src/__tests__/ssr-recovery-errors.unit.test.ts +58 -0
  456. package/src/__tests__/standard-cluster-capability.integration.test.ts +63 -0
  457. package/src/__tests__/standard-cluster-transport.unit.test.ts +121 -0
  458. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +299 -0
  459. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +15 -5
  460. package/src/__tests__/standard-lighting-inspection.integration.test.ts +138 -0
  461. package/src/__tests__/standard-lighting-ssot.unit.test.ts +18 -0
  462. package/src/__tests__/standard-lighting-write.unit.test.ts +441 -0
  463. package/src/__tests__/standard-lighting.integration.test.ts +67 -0
  464. package/src/__tests__/standard-pipeline.dawn.test.ts +206 -5
  465. package/src/__tests__/standard-pipeline.integration.test.ts +181 -150
  466. package/src/__tests__/standard-probe-binding.unit.test.ts +25 -0
  467. package/src/__tests__/standard-profile-oracle.unit.test.ts +23 -38
  468. package/src/__tests__/temporal-fallback-generation.integration.test.ts +16 -0
  469. package/src/__tests__/temporal-view.unit.test.ts +3 -3
  470. package/src/__tests__/transmission-prewarm.unit.test.ts +69 -0
  471. package/src/__tests__/typed-pipeline-topology.unit.test.ts +395 -14
  472. package/src/__tests__/urp-pipeline-targets.unit.test.ts +2 -2
  473. package/src/__tests__/visibility-budget.integration.test.ts +140 -0
  474. package/src/__tests__/visibility-budget.unit.test.ts +70 -0
  475. package/src/__tests__/visibility-extract.integration.test.ts +11 -6
  476. package/src/__tests__/visibility-resolver.unit.test.ts +15 -0
  477. package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +6 -3
  478. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +31 -28
  479. package/src/assembly/backend-contract.ts +13 -0
  480. package/src/assembly/device-feature-admission.ts +80 -0
  481. package/src/assembly/directional-shadow-inspection.ts +122 -0
  482. package/src/assembly/factory.ts +1411 -366
  483. package/src/assembly/host-contract.ts +35 -0
  484. package/src/assembly/render-target-host.ts +847 -0
  485. package/src/assets/asset-decoders.ts +1 -1
  486. package/src/assets/render-asset-port.ts +7 -1
  487. package/src/capture/cube-views.ts +69 -0
  488. package/src/capture/scheduler.ts +265 -0
  489. package/src/cluster-binner.ts +31 -0
  490. package/src/components/__tests__/lighting-authoring.unit.test.ts +39 -0
  491. package/src/components/__tests__/rect-area-light.unit.test.ts +33 -0
  492. package/src/components/__tests__/schema-contract.unit.test.ts +12 -0
  493. package/src/components/__tests__/schema-parity.unit.test.ts +9 -0
  494. package/src/components/camera.ts +4 -0
  495. package/src/components/cube-camera.ts +52 -0
  496. package/src/components/directional-light.ts +22 -2
  497. package/src/components/directional-shadow-filter.ts +57 -0
  498. package/src/components/index.ts +5 -0
  499. package/src/components/light-helpers.ts +133 -8
  500. package/src/components/light-probe.ts +13 -0
  501. package/src/components/rect-area-light.ts +15 -0
  502. package/src/components/reflection-probe.ts +49 -0
  503. package/src/components/scene-instance.ts +6 -0
  504. package/src/components/spot-light.ts +3 -0
  505. package/src/device/__tests__/extended-lighting-recovery.unit.test.ts +24 -0
  506. package/src/device/gpu-residency.ts +140 -9
  507. package/src/device/lifecycle-transaction.ts +12 -0
  508. package/src/environment/frame.ts +6 -24
  509. package/src/environment/lifecycle.ts +20 -1
  510. package/src/errors/gpu-driven.ts +92 -0
  511. package/src/errors/index.ts +1 -0
  512. package/src/errors/recover.ts +32 -0
  513. package/src/errors/render.ts +341 -143
  514. package/src/extract/camera.ts +3 -3
  515. package/src/extract/directional-shadow-projection.ts +61 -0
  516. package/src/extract/environment.ts +57 -0
  517. package/src/extract/gpu-driven.ts +108 -0
  518. package/src/extract/visibility.ts +2 -1
  519. package/src/features/fullscreen.ts +3 -0
  520. package/src/features/targets.ts +4 -1
  521. package/src/features/types.ts +10 -0
  522. package/src/fullscreen-post-process-pass.ts +43 -2
  523. package/src/gpu-driven/batch-topology.ts +207 -28
  524. package/src/gpu-driven/prepared-draw.ts +208 -0
  525. package/src/gpu-driven/production-raster.ts +953 -43
  526. package/src/gpu-driven/view-gpu.ts +411 -29
  527. package/src/gpu-scene-schema.ts +13 -0
  528. package/src/gpu-scene.ts +140 -64
  529. package/src/gpu-usage.ts +0 -1
  530. package/src/hdrp-buffers.ts +169 -63
  531. package/src/ibl/IblPipelineCache.ts +11 -0
  532. package/src/ibl/kernel-cache.ts +88 -0
  533. package/src/index.ts +222 -0
  534. package/src/inspection-types.ts +276 -1
  535. package/src/instances-derived-bounds.ts +171 -0
  536. package/src/internal.ts +38 -0
  537. package/src/light-buffer-layout.ts +155 -310
  538. package/src/materials.ts +16 -2
  539. package/src/mesh-material-bindings.ts +132 -0
  540. package/src/pbr-pipeline.ts +255 -60
  541. package/src/pipeline/standard-forward-lane.ts +93 -16
  542. package/src/pipeline/standard-lighting/errors.ts +6 -0
  543. package/src/pipeline/standard-lighting/graph.ts +158 -0
  544. package/src/pipeline/standard-lighting/inspection.ts +88 -0
  545. package/src/pipeline/standard-lighting/layout.ts +31 -0
  546. package/src/pipeline/standard-lighting/light-frame.ts +35 -0
  547. package/src/pipeline/standard-lighting/membership.ts +43 -0
  548. package/src/pipeline/standard-lighting/prepare.ts +37 -0
  549. package/src/pipeline/standard-lighting/topology.ts +120 -0
  550. package/src/pipeline/standard-lighting/transport.ts +78 -0
  551. package/src/pipeline/standard-pipeline.ts +124 -193
  552. package/src/pipeline/standard-post.ts +26 -7
  553. package/src/pipeline/standard-profile.ts +17 -47
  554. package/src/pipeline-builder.ts +5 -2
  555. package/src/pipeline-spec.ts +95 -21
  556. package/src/plugin.ts +4 -0
  557. package/src/point-shadow-inspection.ts +55 -0
  558. package/src/prepare/__tests__/extended-lighting-capability.unit.test.ts +56 -0
  559. package/src/prepare/extended-lighting/ltc-resources.ts +136 -0
  560. package/src/prepare/extended-lighting/resources.ts +389 -0
  561. package/src/prepare/extended-lighting/spot-modifiers.ts +194 -0
  562. package/src/prepare/extended-lighting/state.ts +92 -0
  563. package/src/record/__tests__/gpu-timing.unit.test.ts +177 -0
  564. package/src/record/__tests__/temporal-payload.unit.test.ts +64 -1
  565. package/src/record/__tests__/transparent-group2-selection.unit.test.ts +73 -0
  566. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +20 -1
  567. package/src/record/__tests__/view-ubo-layout.unit.test.ts +40 -0
  568. package/src/record/frame-lighting.ts +591 -452
  569. package/src/record/frame-snapshot.ts +92 -39
  570. package/src/record/frame-targets.ts +17 -0
  571. package/src/record/frame.ts +662 -158
  572. package/src/record/gpu-pass-timing/contract.ts +180 -0
  573. package/src/record/gpu-pass-timing/errors.ts +34 -0
  574. package/src/record/gpu-pass-timing/index.ts +37 -0
  575. package/src/record/gpu-pass-timing/parser.ts +97 -0
  576. package/src/record/gpu-pass-timing/session.ts +938 -0
  577. package/src/record/gpu-timing.ts +112 -39
  578. package/src/record/helpers.ts +0 -58
  579. package/src/record/main-pass-geometry.ts +324 -119
  580. package/src/record/main-pass-material.ts +103 -10
  581. package/src/record/main-pass-sprite-draws.ts +99 -103
  582. package/src/record/main-pass.ts +71 -15
  583. package/src/record/mesh-ssbo.ts +47 -36
  584. package/src/record/render-context.ts +136 -3
  585. package/src/record/shadow-pass.ts +83 -68
  586. package/src/record/skybox-post-pass.ts +20 -4
  587. package/src/record/typed-frame-graph.ts +1034 -43
  588. package/src/record/view-ubo.ts +72 -47
  589. package/src/reflection/filter.ts +81 -0
  590. package/src/reflection/gpu-table.ts +44 -0
  591. package/src/reflection/inspection.ts +67 -0
  592. package/src/reflection/projection.ts +476 -0
  593. package/src/reflection/record-owner.ts +1283 -0
  594. package/src/render-contract.ts +93 -10
  595. package/src/render-graph-primitives.ts +9 -4
  596. package/src/render-pipeline.ts +122 -2
  597. package/src/render-system-extract.ts +1041 -225
  598. package/src/render-system.ts +1310 -85
  599. package/src/renderer.ts +222 -0
  600. package/src/scene/__tests__/changed-block-summary.candidate.test.ts +36 -0
  601. package/src/scene/probe-blend-record.ts +54 -0
  602. package/src/scene/probe-blend.ts +813 -0
  603. package/src/scene/render-scene-types.ts +0 -7
  604. package/src/scene/render-scene.ts +942 -171
  605. package/src/scene/visibility/bounds.ts +57 -0
  606. package/src/scene/visibility/budget.ts +40 -0
  607. package/src/scene/visibility/facet.ts +400 -0
  608. package/src/scene/visibility/gpu-frame-timing.ts +101 -0
  609. package/src/scene/visibility/gpu-lod.ts +119 -0
  610. package/src/scene/visibility/inspection.ts +313 -0
  611. package/src/scene/visibility/lod-selector.ts +84 -0
  612. package/src/scene/visibility/occlusion-confidence.ts +478 -0
  613. package/src/scene/visibility/occlusion-pass.ts +165 -0
  614. package/src/scene/visibility/occlusion-query-pool.ts +178 -0
  615. package/src/scene/visibility/occlusion-runtime.ts +672 -0
  616. package/src/scene/visibility/types.ts +50 -0
  617. package/src/shadow-atlas.ts +5 -5
  618. package/src/ssao-buffers.ts +9 -2
  619. package/src/ssr/admission.ts +451 -0
  620. package/src/ssr/composition.ts +73 -0
  621. package/src/ssr/errors.ts +76 -0
  622. package/src/ssr/identity.ts +12 -0
  623. package/src/systems/skin-palette-allocator.ts +1 -1
  624. package/src/targets/contracts.ts +182 -0
  625. package/src/targets/graph-projection.ts +169 -0
  626. package/src/targets/material-source.ts +143 -0
  627. package/src/targets/owner.ts +214 -0
  628. package/src/targets/physical.ts +18 -0
  629. package/src/targets/readback.ts +153 -0
  630. package/src/temporal/frame-coordinator.ts +26 -0
  631. package/src/temporal/frame.ts +14 -1
  632. package/src/temporal/view.ts +11 -0
  633. package/src/tilemap-chunk-extract-system.ts +4 -4
  634. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +59 -20
  635. package/src/typed-render-graph-primitives.ts +53 -3
  636. package/src/typed-shadow-passes.ts +46 -40
  637. package/src/volume/passes.ts +61 -58
  638. package/dist/.tsbuildinfo +0 -1
  639. package/dist/chunk-4XINDLAY.mjs.map +0 -1
  640. package/dist/chunk-CDTWTHZR.mjs.map +0 -1
  641. package/dist/chunk-M2MP4ZOU.mjs +0 -73
  642. package/dist/chunk-M2MP4ZOU.mjs.map +0 -1
  643. package/dist/chunk-PCHBPYML.mjs.map +0 -1
  644. package/dist/chunk-TBQJOK2L.mjs.map +0 -1
  645. package/dist/chunk-VFPLTKCU.mjs.map +0 -1
@@ -116,6 +116,60 @@ export function createRenderSurfaceError(
116
116
  return new RenderSurfaceError(`surface-${kind}-failed` as SurfaceFailureCode, detail);
117
117
  }
118
118
 
119
+ export type LightResourceFailureReason = 'asset' | 'format' | 'capability' | 'capacity';
120
+
121
+ export interface LightResourceUnavailableDetail {
122
+ readonly entity: number;
123
+ readonly feature: 'ies' | 'cookie' | 'probe';
124
+ readonly generation: number;
125
+ readonly sourceKey: string;
126
+ readonly reason: LightResourceFailureReason;
127
+ }
128
+
129
+ export class LightResourceUnavailableError extends Error {
130
+ readonly code = 'light-resource-unavailable' as const;
131
+ readonly expected: string;
132
+ readonly hint: string;
133
+ readonly detail: LightResourceUnavailableDetail;
134
+
135
+ constructor(
136
+ detail: LightResourceUnavailableDetail,
137
+ expected: string,
138
+ actual: string,
139
+ hint: string,
140
+ ) {
141
+ super(`light-resource-unavailable: ${detail.feature} ${actual}`);
142
+ this.name = 'LightResourceUnavailableError';
143
+ this.expected = expected;
144
+ this.hint = hint;
145
+ this.detail = detail;
146
+ }
147
+ }
148
+
149
+ export function createLightResourceUnavailable(input: {
150
+ readonly entity: number;
151
+ readonly feature: LightResourceUnavailableDetail['feature'];
152
+ readonly generation: number;
153
+ readonly sourceKey: string;
154
+ readonly reason: LightResourceFailureReason;
155
+ readonly expected: string;
156
+ readonly actual: string;
157
+ readonly hint: string;
158
+ }): LightResourceUnavailableError {
159
+ return new LightResourceUnavailableError(
160
+ {
161
+ entity: input.entity,
162
+ feature: input.feature,
163
+ generation: input.generation,
164
+ sourceKey: input.sourceKey,
165
+ reason: input.reason,
166
+ },
167
+ input.expected,
168
+ input.actual,
169
+ input.hint,
170
+ );
171
+ }
172
+
119
173
  export interface TemporalFrameSubmitDetail {
120
174
  readonly reason: 'queue-submit-failed';
121
175
  }
@@ -132,55 +186,38 @@ export class TemporalFrameSubmitError extends Error {
132
186
  this.detail = { reason };
133
187
  }
134
188
  }
135
-
136
189
  // ── ShadowInvalidConfigError ──────────────────────────────────────────────
137
190
 
138
191
  /**
139
192
  * Detail for `RuntimeErrorCode 'shadow-invalid-config'`.
140
193
  *
141
- * Emitted by `DirectionalLight.validate` shadow-field path when a field value violates
142
- * runtime constraints (e.g. mapSize < 1, cascadeCount not in {1..4}).
143
- * AI users access `.detail.field` / `.detail.value` / `.detail.min` /
144
- * `.detail.max` via property access — no string parsing.
145
- *
146
- * `max` is `undefined` for lower-bound-only validations (e.g. mapSize < 1).
147
- * feat-20260613-csm: max added for upper-bound cascade validations
148
- * (cascadeCount max=4, splitLambda max=1, cascadeBlend max=0.5).
194
+ * The four fields are the only recovery surface: AI users read the invalid
195
+ * field, actual value, structured bound, and reason without parsing prose.
149
196
  */
197
+ export type ShadowInvalidConfigBound =
198
+ | { readonly kind: 'range'; readonly min: number; readonly max: number }
199
+ | { readonly kind: 'lower-bound'; readonly operator: '>' | '>='; readonly value: number }
200
+ | { readonly kind: 'allowed-values'; readonly values: readonly number[] };
201
+
150
202
  export interface ShadowInvalidConfigDetail {
151
203
  readonly field: string;
152
- readonly value: number;
153
- readonly min: number;
154
- readonly max?: number;
204
+ readonly actual: number;
205
+ readonly bound: ShadowInvalidConfigBound;
206
+ readonly reason: string;
155
207
  }
156
208
 
157
209
  /**
158
210
  * Structured error for shadow component config validation failures.
159
211
  *
160
- * Emitted by `DirectionalLight.validate()` shadow-field path (mapSize / cascadeCount /
161
- * splitLambda / cascadeBlend / shadowDistance) and `PointLightShadow.validate()`
162
- * (mapSize / farPlane > nearPlane / pcfKernelSize); both shadow component
163
- * types share this single error class so `switch (err.code)` on
164
- * `RuntimeErrorCode` only needs one branch (charter P4 — closed-union SSOT).
165
- * Four-field surface per AGENTS.md error model:
212
+ * Emitted by Directional, Point, and Spot shadow validation. All three
213
+ * component owners share this error class so `switch (err.code)` on
214
+ * `RuntimeErrorCode` needs one branch (charter P4 closed-union SSOT).
215
+ * Four-field surface:
166
216
  * - `.code = 'shadow-invalid-config'` (closed RuntimeErrorCode)
167
217
  * - `.expected` — expected-state description (programmatic predicate form)
168
218
  * - `.hint` — actionable recovery guidance (imperative; AI users paste into
169
- * spawn calls). Integer-typed fields (e.g. `cascadeCount`, `pcfKernelSize`)
170
- * get an "integer in [min, max]" hint; otherwise "[min, max]" range or
171
- * "<comparator> min".
172
- * - `.detail = { field, value, min, max? }` — structured values (charter P4)
173
- *
174
- * 4th constructor parameter is a union over the two range shapes:
175
- * - `number` — `max` for a closed `[min, max]` range (CSM cascadeCount /
176
- * splitLambda / cascadeBlend). hint uses "in [min, max]"; integer-typed
177
- * fields get "integer in [min, max]".
178
- * - `'>' | '>='` — comparator for an open lower-bound predicate. `'>'` is
179
- * used when `min` carries dynamic context (e.g. `farPlane > nearPlane` —
180
- * the surfaced hint reads "must be > nearPlane" so AI users setting
181
- * farPlane=nearPlane don't re-fail the spawn loop with the wrong cue).
182
- * - `undefined` — defaults to `'>='`. Callsites for mapSize < 1 validation
183
- * stay backward-compatible (3-arg form).
219
+ * spawn calls).
220
+ * - `.detail = { field, actual, bound, reason }` structured values.
184
221
  */
185
222
  export class ShadowInvalidConfigError extends Error {
186
223
  readonly code = 'shadow-invalid-config' as const;
@@ -188,35 +225,53 @@ export class ShadowInvalidConfigError extends Error {
188
225
  readonly hint: string;
189
226
  readonly detail: ShadowInvalidConfigDetail;
190
227
 
191
- constructor(field: string, value: number, min: number, maxOrComparator?: number | '>' | '>=') {
192
- const isComparator = maxOrComparator === '>' || maxOrComparator === '>=';
193
- const max = !isComparator && typeof maxOrComparator === 'number' ? maxOrComparator : undefined;
194
- const comparator: '>' | '>=' = isComparator ? (maxOrComparator as '>' | '>=') : '>=';
195
- // Integer-typed fields get an "integer in [min, max]" hint when a range
196
- // is supplied. Expand this set as new integer-typed shadow fields land.
197
- const isInteger = field === 'cascadeCount' || field === 'pcfKernelSize';
198
- // pcfKernelSize must be odd (kernel is symmetric around the center tap).
199
- // Naming "odd" in the hint stops an AI retry from looping min->min+1 (4->6).
200
- const isOdd = field === 'pcfKernelSize';
201
- const hint =
202
- max !== undefined
203
- ? isInteger
204
- ? `set ${field} to an integer in [${min}, ${max}]; got ${value}`
205
- : `set ${field} to a value in [${min}, ${max}]; got ${value}`
206
- : isOdd
207
- ? `set ${field} to an odd integer ${comparator} ${min}; got ${value}`
208
- : `set ${field} to a value ${comparator} ${min}; got ${value}`;
209
- const expected =
210
- max !== undefined ? `${field} in [${min}, ${max}]` : `${field} ${comparator} ${min}`;
211
- super(
212
- max !== undefined
213
- ? `shadow component .${field} must be in [${min}, ${max}], got ${value}`
214
- : `shadow component .${field} must be ${comparator} ${min}, got ${value}`,
215
- );
228
+ constructor(
229
+ field: string,
230
+ actual: number,
231
+ minOrBound: number | ShadowInvalidConfigBound,
232
+ maxOrComparator?: number | '>' | '>=',
233
+ reason?: string,
234
+ ) {
235
+ const bound: ShadowInvalidConfigBound =
236
+ typeof minOrBound === 'number'
237
+ ? typeof maxOrComparator === 'number'
238
+ ? { kind: 'range', min: minOrBound, max: maxOrComparator }
239
+ : {
240
+ kind: 'lower-bound',
241
+ operator: maxOrComparator === '>' ? '>' : '>=',
242
+ value: minOrBound,
243
+ }
244
+ : minOrBound;
245
+ const resolvedReason = reason ?? shadowBoundReason(bound);
246
+ const expected = shadowBoundExpected(field, bound);
247
+ const hint = `set ${field} to ${resolvedReason}; got ${actual}`;
248
+ super(`shadow component .${field} is invalid: ${resolvedReason}; got ${actual}`);
216
249
  this.name = 'ShadowInvalidConfigError';
217
250
  this.hint = hint;
218
251
  this.expected = expected;
219
- this.detail = { field, value, min, ...(max !== undefined ? { max } : {}) };
252
+ this.detail = { field, actual, bound, reason: resolvedReason };
253
+ }
254
+ }
255
+
256
+ function shadowBoundExpected(field: string, bound: ShadowInvalidConfigBound): string {
257
+ switch (bound.kind) {
258
+ case 'range':
259
+ return `${field} in [${bound.min}, ${bound.max}]`;
260
+ case 'lower-bound':
261
+ return `${field} ${bound.operator} ${bound.value}`;
262
+ case 'allowed-values':
263
+ return `${field} in {${bound.values.join(', ')}}`;
264
+ }
265
+ }
266
+
267
+ function shadowBoundReason(bound: ShadowInvalidConfigBound): string {
268
+ switch (bound.kind) {
269
+ case 'range':
270
+ return `a value in [${bound.min}, ${bound.max}]`;
271
+ case 'lower-bound':
272
+ return `a value ${bound.operator} ${bound.value}`;
273
+ case 'allowed-values':
274
+ return `one of [${bound.values.join(', ')}]`;
220
275
  }
221
276
  }
222
277
 
@@ -270,133 +325,125 @@ export class EquirectProjectionFailedError extends Error {
270
325
  }
271
326
  }
272
327
 
273
- // ── HdrpLightBudgetExceededError ───────────────────────────────────────────
328
+ // ── StandardLightBudgetExceededError ──────────────────────────────────────
274
329
 
275
- /**
276
- * Detail for `RuntimeErrorCode 'hdrp-light-budget-exceeded'`.
277
- *
278
- * Emitted per-frame (once-per-frame fire) when light count exceeds HDRP budget.
279
- */
280
- export interface HdrpLightBudgetExceededDetail {
330
+ /** The finite local-light budget that a Standard frame agreed to admit. */
331
+ export interface StandardLightBudgetExceededDetail {
281
332
  readonly actual: number;
282
333
  readonly budget: number;
283
334
  }
284
335
 
285
336
  /**
286
- * Structured error for HDRP light budget exceeded (AC-06/AC-07).
287
- *
288
- * Emitted per-frame in recordFrame when the total punctual light count
289
- * exceeds the HDRP budget (256). Fail-soft: fire once per frame, truncate to 256.
290
- * - `.code = 'hdrp-light-budget-exceeded'` (closed RuntimeErrorCode)
291
- * - `.expected` — 'light count <= 256'
292
- * - `.hint` — 'reduce world light count or increase budget (OOS-hdrp-larger-budget)'
293
- * - `.detail = { actual, budget }`
337
+ * Structured refusal for a Standard frame whose finite local-light set is
338
+ * outside the selected profile budget. The frame is rejected as a whole; the
339
+ * record owner must not slice the input or submit a partial membership set.
294
340
  */
295
- export class HdrpLightBudgetExceededError extends Error {
296
- readonly code = 'hdrp-light-budget-exceeded' as const;
341
+ export class StandardLightBudgetExceededError extends Error {
342
+ readonly code = 'standard-light-budget-exceeded' as const;
297
343
  readonly expected: string;
298
344
  readonly hint: string;
299
- readonly detail: HdrpLightBudgetExceededDetail;
345
+ readonly detail: StandardLightBudgetExceededDetail;
300
346
 
301
347
  constructor(actual: number, budget: number) {
302
348
  const expected = `light count <= ${budget}`;
303
349
  const hint =
304
- `${actual} lights exceed HDRP budget ${budget}; ` +
305
- 'truncating to 256. Reduce light count or wait for OOS-hdrp-larger-budget';
306
- super(`HDRP light budget exceeded: ${actual} > ${budget}`);
307
- this.name = 'HdrpLightBudgetExceededError';
350
+ `${actual} finite local lights exceed Standard budget ${budget}; ` +
351
+ 'reduce the local-light set or select a profile with a supported budget';
352
+ super(`Standard light budget exceeded: ${actual} > ${budget}`);
353
+ this.name = 'StandardLightBudgetExceededError';
308
354
  this.expected = expected;
309
355
  this.hint = hint;
310
356
  this.detail = { actual, budget };
311
357
  }
312
358
  }
313
359
 
314
- // ── HdrpIndexListOverflowError ─────────────────────────────────────────────
360
+ // ── StandardClusterIndexOverflowError ──────────────────────────────────────
315
361
 
316
- /**
317
- * Detail for `RuntimeErrorCode 'hdrp-index-list-overflow'`.
318
- *
319
- * Emitted per-frame (once-per-frame fire) when the cluster binner overflows
320
- * the light index list capacity (65536). Upgraded from ClusterBinError.
321
- */
322
- export interface HdrpIndexListOverflowDetail {
362
+ /** Cluster membership entries that could not fit the single shared index list. */
363
+ export interface StandardClusterIndexOverflowDetail {
323
364
  readonly actual: number;
324
365
  readonly capacity: number;
325
366
  }
326
367
 
327
368
  /**
328
- * Structured error for HDRP cluster binner index list overflow (AC-24).
329
- *
330
- * Emitted per-frame in recordFrame when the CPU binner returns
331
- * `ClusterBinError('index-overflow')`. Fail-soft: fire once per frame,
332
- * continue rendering with what fit.
333
- * - `.code = 'hdrp-index-list-overflow'` (closed RuntimeErrorCode)
334
- * - `.expected` — 'light index list entries <= 65536'
335
- * - `.hint` — 'reduce lights, shrink cluster grid, or increase capacity'
336
- * - `.detail = { actual, capacity }`
369
+ * Structured refusal for a membership producer that exceeded the shared
370
+ * Cluster index-list capacity. No truncated list is uploaded and no graph is
371
+ * submitted for the rejected frame.
337
372
  */
338
- export class HdrpIndexListOverflowError extends Error {
339
- readonly code = 'hdrp-index-list-overflow' as const;
373
+ export class StandardClusterIndexOverflowError extends Error {
374
+ readonly code = 'standard-cluster-index-overflow' as const;
340
375
  readonly expected: string;
341
376
  readonly hint: string;
342
- readonly detail: HdrpIndexListOverflowDetail;
377
+ readonly detail: StandardClusterIndexOverflowDetail;
343
378
 
344
379
  constructor(actual: number, capacity: number) {
345
380
  const expected = `light index list entries <= ${capacity}`;
346
381
  const hint =
347
382
  `cluster binner overflow: writeCount ${actual} exceeds capacity ${capacity}; ` +
348
- 'reduce lights, shrink cluster grid, or increase LIGHT_INDEX_LIST_CAPACITY';
349
- super(`HDRP index list overflow: ${actual} > ${capacity}`);
350
- this.name = 'HdrpIndexListOverflowError';
383
+ 'reduce finite local lights or choose a supported cluster layout';
384
+ super(`Standard cluster index list overflow: ${actual} > ${capacity}`);
385
+ this.name = 'StandardClusterIndexOverflowError';
351
386
  this.expected = expected;
352
387
  this.hint = hint;
353
388
  this.detail = { actual, capacity };
354
389
  }
355
390
  }
356
391
 
357
- // ── HdrpDeferredCapsInsufficientError ──────────────────────────────────────
392
+ // ── StandardClusterTransportUnavailableError ───────────────────────────────
358
393
 
359
- /**
360
- * Detail for `RuntimeErrorCode 'hdrp-deferred-caps-insufficient'`.
361
- *
362
- * Emitted when the Standard clustered lane has fewer than 4 color attachments,
363
- * meaning the deferred path cannot allocate 3 g-buffer color targets + depth.
364
- */
365
- export interface HdrpDeferredCapsInsufficientDetail {
366
- readonly actual: number;
367
- readonly expected: number;
394
+ export interface StandardClusterTransportUnavailableDetail {
395
+ readonly requested: number;
396
+ readonly admitted: 0;
368
397
  }
369
398
 
370
399
  /**
371
- * Structured error for deferred-path capability gate failure.
372
- *
373
- * Emitted during Standard clustered lane validation synchronous throw.
374
- * - `.code = 'hdrp-deferred-caps-insufficient'` (closed RuntimeErrorCode)
375
- * - `.expected` — 'maxColorAttachments >= 4'
376
- * - `.hint` — actionable guidance to upgrade browser or select URP
377
- * - `.detail = { actual, expected }`
378
- *
379
- * @see plan-strategy D-5 (capability validation, no silent fallback)
400
+ * Structured capability refusal. Standard never turns an unproven transport
401
+ * into a smaller direct-light lane; the caller receives the exact requested
402
+ * local-light count and an admitted count of zero.
380
403
  */
381
- export class HdrpDeferredCapsInsufficientError extends Error {
382
- readonly code = 'hdrp-deferred-caps-insufficient' as const;
383
- readonly expected: string;
404
+ export class StandardClusterTransportUnavailableError extends Error {
405
+ readonly code = 'standard-cluster-transport-unavailable' as const;
406
+ readonly expected = 'all requested local lights have a proven Cluster transport';
384
407
  readonly hint: string;
385
- readonly detail: HdrpDeferredCapsInsufficientDetail;
408
+ readonly detail: StandardClusterTransportUnavailableDetail;
386
409
 
387
- constructor(actual: number) {
388
- const _expected = 4;
389
- const _expectedStr = `maxColorAttachments >= ${_expected}`;
390
- const hint =
391
- `WebGPU maxColorAttachments = ${actual} (need >= ${_expected}). ` +
392
- 'Upgrade browser to latest Chrome/Edge/Safari, or use URP (forgeax::urp) instead of HDRP.';
393
- super(
394
- `HDRP deferred caps insufficient: maxColorAttachments = ${actual} (need >= ${_expected})`,
395
- );
396
- this.name = 'HdrpDeferredCapsInsufficientError';
397
- this.expected = _expectedStr;
410
+ constructor(
411
+ requested: number,
412
+ hint = 'enable a proven Cluster storage transport before drawing',
413
+ ) {
414
+ super(`Standard Cluster transport unavailable for ${requested} local lights`);
415
+ this.name = 'StandardClusterTransportUnavailableError';
398
416
  this.hint = hint;
399
- this.detail = { actual, expected: _expected };
417
+ this.detail = { requested, admitted: 0 };
418
+ }
419
+ }
420
+
421
+ // ── StandardProfileInvalidError ───────────────────────────────────────────
422
+
423
+ export interface StandardProfileInvalidDetail {
424
+ readonly field: string;
425
+ readonly actual: unknown;
426
+ }
427
+
428
+ /** Structured validation failure for the single Standard profile surface. */
429
+ export class StandardProfileInvalidError extends Error {
430
+ readonly code = 'standard-profile-invalid' as const;
431
+ readonly expected: string;
432
+ readonly hint: string;
433
+ readonly detail: StandardProfileInvalidDetail;
434
+
435
+ constructor(message: string, detail?: StandardProfileInvalidDetail) {
436
+ super(message);
437
+ this.name = 'StandardProfileInvalidError';
438
+ this.detail = detail ?? { field: 'profile', actual: message };
439
+ if (this.detail.field === 'clusterGrid') {
440
+ this.expected = 'clusterGrid.{x,y,z} each positive integer in [1, 64]';
441
+ this.hint =
442
+ 'set clusterGrid.x, clusterGrid.y, and clusterGrid.z to positive integers in [1, 64]';
443
+ } else {
444
+ this.expected = 'StandardProfile contains only supported fields and values';
445
+ this.hint = 'repair the Standard profile fields and retry setProfile';
446
+ }
400
447
  }
401
448
  }
402
449
 
@@ -452,7 +499,7 @@ export interface PointShadowAtlasBoundsViolationDetail {
452
499
  * - `.code = 'point-shadow-atlas-bounds-violation'`
453
500
  * - `.expected` — `0 <= layer < layers && 0 <= face < 6`
454
501
  * - `.hint` — clamp `shadowAtlasLayer` or face index before calling
455
- * `faceView`; the cap on layers is `PointLightShadow` cardinality (4)
502
+ * `faceView`; the layer cap is the renderer-owned ShadowAtlas capacity
456
503
  * - `.detail = { axis, value, max }` — discriminates layer vs face
457
504
  */
458
505
  export class PointShadowAtlasBoundsViolationError extends Error {
@@ -1531,6 +1578,149 @@ export class PointsLinesPrepareFailedError extends Error {
1531
1578
  }
1532
1579
  }
1533
1580
 
1581
+ // -- RenderTarget errors ------------------------------------------------------
1582
+
1583
+ export interface RenderTargetDescriptorInvalidDetail {
1584
+ readonly field: string;
1585
+ readonly value: unknown;
1586
+ readonly expected: string;
1587
+ }
1588
+
1589
+ export class RenderTargetDescriptorInvalidError extends Error {
1590
+ readonly code = 'render-target-descriptor-invalid' as const;
1591
+ readonly expected: string;
1592
+ readonly hint: string;
1593
+ readonly detail: RenderTargetDescriptorInvalidDetail;
1594
+
1595
+ constructor(detail: RenderTargetDescriptorInvalidDetail) {
1596
+ super(`render-target-descriptor-invalid: ${detail.field} does not satisfy ${detail.expected}`);
1597
+ this.name = 'RenderTargetDescriptorInvalidError';
1598
+ this.expected = detail.expected;
1599
+ this.hint = `set RenderTargetDescriptor.${detail.field} to the expected value, then retry create or resize`;
1600
+ this.detail = detail;
1601
+ }
1602
+ }
1603
+
1604
+ export interface RenderTargetCapabilityMissingDetail {
1605
+ readonly operation: 'create' | 'resize' | 'source' | 'readback';
1606
+ readonly requested: string;
1607
+ readonly capability: string;
1608
+ readonly actual: string;
1609
+ }
1610
+
1611
+ export class RenderTargetCapabilityMissingError extends Error {
1612
+ readonly code = 'render-target-capability-missing' as const;
1613
+ readonly expected: string;
1614
+ readonly hint: string;
1615
+ readonly detail: RenderTargetCapabilityMissingDetail;
1616
+
1617
+ constructor(detail: RenderTargetCapabilityMissingDetail) {
1618
+ super(
1619
+ `render-target-capability-missing: ${detail.capability} does not admit ${detail.requested}`,
1620
+ );
1621
+ this.name = 'RenderTargetCapabilityMissingError';
1622
+ this.expected = `${detail.capability} admits ${detail.requested}`;
1623
+ this.hint = `choose an admitted target descriptor or use a backend providing ${detail.capability}`;
1624
+ this.detail = detail;
1625
+ }
1626
+ }
1627
+
1628
+ export type RenderTargetStateInvalidReason =
1629
+ | 'foreign-renderer'
1630
+ | 'destroyed'
1631
+ | 'uninitialized'
1632
+ | 'generation-mismatch'
1633
+ | 'readback-without-intent';
1634
+
1635
+ export interface RenderTargetStateInvalidDetail {
1636
+ readonly operation: 'inspect' | 'resize' | 'source' | 'readback' | 'destroy';
1637
+ readonly reason: RenderTargetStateInvalidReason;
1638
+ readonly state: 'uninitialized' | 'candidate' | 'active' | 'rebuilding' | 'destroyed';
1639
+ readonly generation: number;
1640
+ }
1641
+
1642
+ export class RenderTargetStateInvalidError extends Error {
1643
+ readonly code = 'render-target-state-invalid' as const;
1644
+ readonly expected: string;
1645
+ readonly hint: string;
1646
+ readonly detail: RenderTargetStateInvalidDetail;
1647
+
1648
+ constructor(detail: RenderTargetStateInvalidDetail) {
1649
+ super(`render-target-state-invalid: ${detail.operation} cannot use ${detail.reason}`);
1650
+ this.name = 'RenderTargetStateInvalidError';
1651
+ this.expected = `target state permits ${detail.operation}`;
1652
+ this.hint =
1653
+ 'use the Renderer that created the target, then initialize, recover, or stop using the destroyed token';
1654
+ this.detail = detail;
1655
+ }
1656
+ }
1657
+
1658
+ export interface RenderTargetOperationFailedDetail {
1659
+ readonly operation: 'create' | 'resize' | 'source' | 'readback' | 'destroy' | 'recover';
1660
+ readonly stage: 'allocation' | 'compile' | 'write' | 'submit' | 'copy' | 'retire';
1661
+ readonly generation: number;
1662
+ readonly cause: unknown;
1663
+ readonly recovery: 'retry' | 'recover' | 'retain-last-known-good';
1664
+ }
1665
+
1666
+ export class RenderTargetOperationFailedError extends Error {
1667
+ readonly code = 'render-target-operation-failed' as const;
1668
+ readonly expected: string;
1669
+ readonly hint: string;
1670
+ readonly detail: RenderTargetOperationFailedDetail;
1671
+
1672
+ constructor(detail: RenderTargetOperationFailedDetail) {
1673
+ super(`render-target-operation-failed: ${detail.operation} failed during ${detail.stage}`);
1674
+ this.name = 'RenderTargetOperationFailedError';
1675
+ this.expected = `${detail.operation} completes ${detail.stage}`;
1676
+ this.hint =
1677
+ 'inspect detail.cause, then retry, recover the Renderer, or retain the last-known-good generation';
1678
+ this.detail = detail;
1679
+ }
1680
+ }
1681
+
1682
+ export interface ReflectionProbeBudgetExceededDetail {
1683
+ readonly actual: number;
1684
+ readonly budget: number;
1685
+ }
1686
+
1687
+ export class ReflectionProbeBudgetExceededError extends Error {
1688
+ readonly code = 'reflection-probe-budget-exceeded' as const;
1689
+ readonly expected: string;
1690
+ readonly hint: string;
1691
+ readonly detail: ReflectionProbeBudgetExceededDetail;
1692
+
1693
+ constructor(actual: number, budget: number) {
1694
+ super(`reflection-probe-budget-exceeded: ${actual} > ${budget}`);
1695
+ this.name = 'ReflectionProbeBudgetExceededError';
1696
+ this.expected = `reflection probe work <= ${budget}`;
1697
+ this.hint = 'reduce probe updates for this frame or raise the RenderProfile probe budget';
1698
+ this.detail = { actual, budget };
1699
+ }
1700
+ }
1701
+
1702
+ export interface RenderIntentInvalidDetail {
1703
+ readonly component: 'CubeCamera' | 'ReflectionProbe';
1704
+ readonly field: 'updateIntent';
1705
+ readonly value: number;
1706
+ readonly allowed: readonly [0, 1, 2];
1707
+ }
1708
+
1709
+ export class RenderIntentInvalidError extends Error {
1710
+ readonly code = 'render-intent-invalid' as const;
1711
+ readonly expected: string;
1712
+ readonly hint: string;
1713
+ readonly detail: RenderIntentInvalidDetail;
1714
+
1715
+ constructor(component: RenderIntentInvalidDetail['component'], value: number) {
1716
+ super(`render-intent-invalid: ${component}.updateIntent is not an admitted value`);
1717
+ this.name = 'RenderIntentInvalidError';
1718
+ this.expected = `${component}.updateIntent is one of 0, 1, or 2`;
1719
+ this.hint = `set ${component}.updateIntent to 0, 1, or 2`;
1720
+ this.detail = { component, field: 'updateIntent', value, allowed: [0, 1, 2] };
1721
+ }
1722
+ }
1723
+
1534
1724
  export interface VolumeOwnerConflictDetail {
1535
1725
  readonly ownerCount: number;
1536
1726
  }
@@ -1652,9 +1842,10 @@ export type RenderError =
1652
1842
  | TaaUnavailableError
1653
1843
  | ShadowInvalidConfigError
1654
1844
  | EquirectProjectionFailedError
1655
- | HdrpLightBudgetExceededError
1656
- | HdrpIndexListOverflowError
1657
- | HdrpDeferredCapsInsufficientError
1845
+ | StandardLightBudgetExceededError
1846
+ | StandardClusterIndexOverflowError
1847
+ | StandardClusterTransportUnavailableError
1848
+ | StandardProfileInvalidError
1658
1849
  | PointShadowAtlasUninitializedError
1659
1850
  | PointShadowAtlasBoundsViolationError
1660
1851
  | VideoUploadUnsupportedError
@@ -1683,5 +1874,12 @@ export type RenderError =
1683
1874
  | PointsLinesMaterialUnsupportedError
1684
1875
  | PointsLinesBudgetExceededError
1685
1876
  | PointsLinesPrepareFailedError
1877
+ | LightResourceUnavailableError
1878
+ | RenderTargetDescriptorInvalidError
1879
+ | RenderTargetCapabilityMissingError
1880
+ | RenderTargetStateInvalidError
1881
+ | RenderTargetOperationFailedError
1882
+ | ReflectionProbeBudgetExceededError
1883
+ | RenderIntentInvalidError
1686
1884
  | ProjectorBindingError
1687
1885
  | VolumeError;
@@ -1,7 +1,7 @@
1
1
  import type { EntityHandle, World } from '@forgeax/engine-ecs';
2
2
  import { readRenderArrayView } from '@forgeax/engine-ecs/projection';
3
3
  import { mat4, vec3 } from '@forgeax/engine-math';
4
- import { Transform } from '@forgeax/engine-scene';
4
+ import { GlobalTransform } from '@forgeax/engine-scene';
5
5
  import {
6
6
  antialiasFromF32,
7
7
  bloomEnabledFromF32,
@@ -14,7 +14,7 @@ import type { CameraSnapshot } from '../render-contract';
14
14
  import { getActiveCamera, selectActiveCameraIndex } from '../systems/active-camera';
15
15
 
16
16
  function readWorldMatrix(world: World, entity: EntityHandle): Float32Array | undefined {
17
- const view = readRenderArrayView(world, entity, Transform, 'world');
17
+ const view = readRenderArrayView(world, entity, GlobalTransform, 'world');
18
18
  return view === undefined ? undefined : new Float32Array(view);
19
19
  }
20
20
 
@@ -23,7 +23,7 @@ export function extractCameraSnapshots(world: World): CameraSnapshot[] {
23
23
  const cameras: CameraSnapshot[] = [];
24
24
  const cameraEntities: number[] = [];
25
25
  const cameraQuery = world
26
- .query({ read: [Camera], optional: [MotionBlur], with: [Transform] })
26
+ .query({ read: [Camera], optional: [MotionBlur], with: [GlobalTransform] })
27
27
  .unwrap();
28
28
  for (const row of cameraQuery) {
29
29
  const cam = row.get(Camera);