@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
@@ -1,4 +1,4 @@
1
- import { err, ok } from '@forgeax/engine-types';
1
+ import { cubeArrayDepthDescriptor, comparisonSamplerDescriptor, cubeArrayDepthFaceView } from '@forgeax/engine-rhi';
2
2
 
3
3
  // src/errors/render.ts
4
4
  var LifecycleConstructionError = class extends Error {
@@ -12,6 +12,33 @@ var LifecycleConstructionError = class extends Error {
12
12
  this.detail = detail;
13
13
  }
14
14
  };
15
+ var LightResourceUnavailableError = class extends Error {
16
+ code = "light-resource-unavailable";
17
+ expected;
18
+ hint;
19
+ detail;
20
+ constructor(detail, expected, actual, hint) {
21
+ super(`light-resource-unavailable: ${detail.feature} ${actual}`);
22
+ this.name = "LightResourceUnavailableError";
23
+ this.expected = expected;
24
+ this.hint = hint;
25
+ this.detail = detail;
26
+ }
27
+ };
28
+ function createLightResourceUnavailable(input) {
29
+ return new LightResourceUnavailableError(
30
+ {
31
+ entity: input.entity,
32
+ feature: input.feature,
33
+ generation: input.generation,
34
+ sourceKey: input.sourceKey,
35
+ reason: input.reason
36
+ },
37
+ input.expected,
38
+ input.actual,
39
+ input.hint
40
+ );
41
+ }
15
42
  var TemporalFrameSubmitError = class extends Error {
16
43
  code = "temporal-frame-submit-rejected";
17
44
  expected = "the staged frame is accepted by queue.submit before temporal facts advance";
@@ -28,23 +55,42 @@ var ShadowInvalidConfigError = class extends Error {
28
55
  expected;
29
56
  hint;
30
57
  detail;
31
- constructor(field, value, min, maxOrComparator) {
32
- const isComparator = maxOrComparator === ">" || maxOrComparator === ">=";
33
- const max = !isComparator && typeof maxOrComparator === "number" ? maxOrComparator : void 0;
34
- const comparator = isComparator ? maxOrComparator : ">=";
35
- const isInteger = field === "cascadeCount" || field === "pcfKernelSize";
36
- const isOdd = field === "pcfKernelSize";
37
- const hint = max !== void 0 ? isInteger ? `set ${field} to an integer in [${min}, ${max}]; got ${value}` : `set ${field} to a value in [${min}, ${max}]; got ${value}` : isOdd ? `set ${field} to an odd integer ${comparator} ${min}; got ${value}` : `set ${field} to a value ${comparator} ${min}; got ${value}`;
38
- const expected = max !== void 0 ? `${field} in [${min}, ${max}]` : `${field} ${comparator} ${min}`;
39
- super(
40
- max !== void 0 ? `shadow component .${field} must be in [${min}, ${max}], got ${value}` : `shadow component .${field} must be ${comparator} ${min}, got ${value}`
41
- );
58
+ constructor(field, actual, minOrBound, maxOrComparator, reason) {
59
+ const bound = typeof minOrBound === "number" ? typeof maxOrComparator === "number" ? { kind: "range", min: minOrBound, max: maxOrComparator } : {
60
+ kind: "lower-bound",
61
+ operator: maxOrComparator === ">" ? ">" : ">=",
62
+ value: minOrBound
63
+ } : minOrBound;
64
+ const resolvedReason = reason ?? shadowBoundReason(bound);
65
+ const expected = shadowBoundExpected(field, bound);
66
+ const hint = `set ${field} to ${resolvedReason}; got ${actual}`;
67
+ super(`shadow component .${field} is invalid: ${resolvedReason}; got ${actual}`);
42
68
  this.name = "ShadowInvalidConfigError";
43
69
  this.hint = hint;
44
70
  this.expected = expected;
45
- this.detail = { field, value, min, ...max !== void 0 ? { max } : {} };
71
+ this.detail = { field, actual, bound, reason: resolvedReason };
46
72
  }
47
73
  };
74
+ function shadowBoundExpected(field, bound) {
75
+ switch (bound.kind) {
76
+ case "range":
77
+ return `${field} in [${bound.min}, ${bound.max}]`;
78
+ case "lower-bound":
79
+ return `${field} ${bound.operator} ${bound.value}`;
80
+ case "allowed-values":
81
+ return `${field} in {${bound.values.join(", ")}}`;
82
+ }
83
+ }
84
+ function shadowBoundReason(bound) {
85
+ switch (bound.kind) {
86
+ case "range":
87
+ return `a value in [${bound.min}, ${bound.max}]`;
88
+ case "lower-bound":
89
+ return `a value ${bound.operator} ${bound.value}`;
90
+ case "allowed-values":
91
+ return `one of [${bound.values.join(", ")}]`;
92
+ }
93
+ }
48
94
  var EquirectProjectionFailedError = class extends Error {
49
95
  code = "equirect-projection-failed";
50
96
  expected;
@@ -60,52 +106,64 @@ var EquirectProjectionFailedError = class extends Error {
60
106
  this.detail = { handle };
61
107
  }
62
108
  };
63
- var HdrpLightBudgetExceededError = class extends Error {
64
- code = "hdrp-light-budget-exceeded";
109
+ var StandardLightBudgetExceededError = class extends Error {
110
+ code = "standard-light-budget-exceeded";
65
111
  expected;
66
112
  hint;
67
113
  detail;
68
114
  constructor(actual, budget) {
69
115
  const expected = `light count <= ${budget}`;
70
- const hint = `${actual} lights exceed HDRP budget ${budget}; truncating to 256. Reduce light count or wait for OOS-hdrp-larger-budget`;
71
- super(`HDRP light budget exceeded: ${actual} > ${budget}`);
72
- this.name = "HdrpLightBudgetExceededError";
116
+ const hint = `${actual} finite local lights exceed Standard budget ${budget}; reduce the local-light set or select a profile with a supported budget`;
117
+ super(`Standard light budget exceeded: ${actual} > ${budget}`);
118
+ this.name = "StandardLightBudgetExceededError";
73
119
  this.expected = expected;
74
120
  this.hint = hint;
75
121
  this.detail = { actual, budget };
76
122
  }
77
123
  };
78
- var HdrpIndexListOverflowError = class extends Error {
79
- code = "hdrp-index-list-overflow";
124
+ var StandardClusterIndexOverflowError = class extends Error {
125
+ code = "standard-cluster-index-overflow";
80
126
  expected;
81
127
  hint;
82
128
  detail;
83
129
  constructor(actual, capacity) {
84
130
  const expected = `light index list entries <= ${capacity}`;
85
- const hint = `cluster binner overflow: writeCount ${actual} exceeds capacity ${capacity}; reduce lights, shrink cluster grid, or increase LIGHT_INDEX_LIST_CAPACITY`;
86
- super(`HDRP index list overflow: ${actual} > ${capacity}`);
87
- this.name = "HdrpIndexListOverflowError";
131
+ const hint = `cluster binner overflow: writeCount ${actual} exceeds capacity ${capacity}; reduce finite local lights or choose a supported cluster layout`;
132
+ super(`Standard cluster index list overflow: ${actual} > ${capacity}`);
133
+ this.name = "StandardClusterIndexOverflowError";
88
134
  this.expected = expected;
89
135
  this.hint = hint;
90
136
  this.detail = { actual, capacity };
91
137
  }
92
138
  };
93
- var HdrpDeferredCapsInsufficientError = class extends Error {
94
- code = "hdrp-deferred-caps-insufficient";
95
- expected;
139
+ var StandardClusterTransportUnavailableError = class extends Error {
140
+ code = "standard-cluster-transport-unavailable";
141
+ expected = "all requested local lights have a proven Cluster transport";
96
142
  hint;
97
143
  detail;
98
- constructor(actual) {
99
- const _expected = 4;
100
- const _expectedStr = `maxColorAttachments >= ${_expected}`;
101
- const hint = `WebGPU maxColorAttachments = ${actual} (need >= ${_expected}). Upgrade browser to latest Chrome/Edge/Safari, or use URP (forgeax::urp) instead of HDRP.`;
102
- super(
103
- `HDRP deferred caps insufficient: maxColorAttachments = ${actual} (need >= ${_expected})`
104
- );
105
- this.name = "HdrpDeferredCapsInsufficientError";
106
- this.expected = _expectedStr;
144
+ constructor(requested, hint = "enable a proven Cluster storage transport before drawing") {
145
+ super(`Standard Cluster transport unavailable for ${requested} local lights`);
146
+ this.name = "StandardClusterTransportUnavailableError";
107
147
  this.hint = hint;
108
- this.detail = { actual, expected: _expected };
148
+ this.detail = { requested, admitted: 0 };
149
+ }
150
+ };
151
+ var StandardProfileInvalidError = class extends Error {
152
+ code = "standard-profile-invalid";
153
+ expected;
154
+ hint;
155
+ detail;
156
+ constructor(message, detail) {
157
+ super(message);
158
+ this.name = "StandardProfileInvalidError";
159
+ this.detail = detail ?? { field: "profile", actual: message };
160
+ if (this.detail.field === "clusterGrid") {
161
+ this.expected = "clusterGrid.{x,y,z} each positive integer in [1, 64]";
162
+ this.hint = "set clusterGrid.x, clusterGrid.y, and clusterGrid.z to positive integers in [1, 64]";
163
+ } else {
164
+ this.expected = "StandardProfile contains only supported fields and values";
165
+ this.hint = "repair the Standard profile fields and retry setProfile";
166
+ }
109
167
  }
110
168
  };
111
169
  var PointShadowAtlasUninitializedError = class extends Error {
@@ -602,6 +660,73 @@ var PointsLinesPrepareFailedError = class extends Error {
602
660
  this.detail = detail;
603
661
  }
604
662
  };
663
+ var RenderTargetDescriptorInvalidError = class extends Error {
664
+ code = "render-target-descriptor-invalid";
665
+ expected;
666
+ hint;
667
+ detail;
668
+ constructor(detail) {
669
+ super(`render-target-descriptor-invalid: ${detail.field} does not satisfy ${detail.expected}`);
670
+ this.name = "RenderTargetDescriptorInvalidError";
671
+ this.expected = detail.expected;
672
+ this.hint = `set RenderTargetDescriptor.${detail.field} to the expected value, then retry create or resize`;
673
+ this.detail = detail;
674
+ }
675
+ };
676
+ var RenderTargetCapabilityMissingError = class extends Error {
677
+ code = "render-target-capability-missing";
678
+ expected;
679
+ hint;
680
+ detail;
681
+ constructor(detail) {
682
+ super(
683
+ `render-target-capability-missing: ${detail.capability} does not admit ${detail.requested}`
684
+ );
685
+ this.name = "RenderTargetCapabilityMissingError";
686
+ this.expected = `${detail.capability} admits ${detail.requested}`;
687
+ this.hint = `choose an admitted target descriptor or use a backend providing ${detail.capability}`;
688
+ this.detail = detail;
689
+ }
690
+ };
691
+ var RenderTargetStateInvalidError = class extends Error {
692
+ code = "render-target-state-invalid";
693
+ expected;
694
+ hint;
695
+ detail;
696
+ constructor(detail) {
697
+ super(`render-target-state-invalid: ${detail.operation} cannot use ${detail.reason}`);
698
+ this.name = "RenderTargetStateInvalidError";
699
+ this.expected = `target state permits ${detail.operation}`;
700
+ this.hint = "use the Renderer that created the target, then initialize, recover, or stop using the destroyed token";
701
+ this.detail = detail;
702
+ }
703
+ };
704
+ var RenderTargetOperationFailedError = class extends Error {
705
+ code = "render-target-operation-failed";
706
+ expected;
707
+ hint;
708
+ detail;
709
+ constructor(detail) {
710
+ super(`render-target-operation-failed: ${detail.operation} failed during ${detail.stage}`);
711
+ this.name = "RenderTargetOperationFailedError";
712
+ this.expected = `${detail.operation} completes ${detail.stage}`;
713
+ this.hint = "inspect detail.cause, then retry, recover the Renderer, or retain the last-known-good generation";
714
+ this.detail = detail;
715
+ }
716
+ };
717
+ var RenderIntentInvalidError = class extends Error {
718
+ code = "render-intent-invalid";
719
+ expected;
720
+ hint;
721
+ detail;
722
+ constructor(component, value) {
723
+ super(`render-intent-invalid: ${component}.updateIntent is not an admitted value`);
724
+ this.name = "RenderIntentInvalidError";
725
+ this.expected = `${component}.updateIntent is one of 0, 1, or 2`;
726
+ this.hint = `set ${component}.updateIntent to 0, 1, or 2`;
727
+ this.detail = { component, field: "updateIntent", value, allowed: [0, 1, 2] };
728
+ }
729
+ };
605
730
  var VolumeOwnerConflictError = class extends Error {
606
731
  code = "volume-owner-conflict";
607
732
  expected = "exactly one global VolumetricFog owner is authored";
@@ -649,240 +774,164 @@ var VolumeInvalidParametersError = class extends Error {
649
774
  }
650
775
  };
651
776
 
652
- // src/temporal/scene-data.ts
653
- var SCENE_DATA_TEMPORAL_V1_SCHEMA = "forgeax::scene-data::temporal-v1";
654
- var SCENE_DATA_TEMPORAL_V1_DESCRIPTOR = Object.freeze({
655
- schema: SCENE_DATA_TEMPORAL_V1_SCHEMA,
656
- format: "rgba16float",
657
- sampleCount: 1,
658
- extent: "render-resolution",
659
- clearValue: [0, 0, -1, 1],
660
- channels: Object.freeze({
661
- motionUv: "rg",
662
- viewDepth: "b-log2-1-plus-depth",
663
- reactive: "a"
664
- })
665
- });
666
- var targetOwners = /* @__PURE__ */ new WeakMap();
667
- function registerSceneDataTarget(target, owner) {
668
- targetOwners.set(target, owner);
669
- }
670
- function sceneDataTargetOwner(target) {
671
- return typeof target === "object" && target !== null ? targetOwners.get(target) : void 0;
672
- }
673
- function sceneDataTokenMismatch(operation, reason, owner, target) {
674
- const detail = reason === "generation-mismatch" ? {
675
- featureIdentity: owner.featureIdentity,
676
- order: -1,
677
- stage: "contribute",
678
- operation,
679
- resourceKind: "attachment",
680
- reason,
681
- expectedGeneration: owner.generation,
682
- actualGeneration: targetOwners.get(target)?.generation ?? -1,
683
- recovery: "renderer-recover"
684
- } : reason === "foreign-feature" ? {
685
- featureIdentity: owner.featureIdentity,
686
- order: -1,
687
- stage: "contribute",
688
- operation,
689
- resourceKind: "attachment",
690
- reason,
691
- expectedFeatureIdentity: owner.featureIdentity,
692
- actualFeatureIdentity: targetOwners.get(target)?.featureIdentity ?? "unknown",
693
- recovery: "next-frame"
694
- } : reason === "foreign-kind" ? {
695
- featureIdentity: owner.featureIdentity,
696
- order: -1,
697
- stage: "contribute",
698
- operation,
699
- resourceKind: "attachment",
700
- reason,
701
- expectedKind: "attachment",
702
- actualKind: "pipeline",
703
- recovery: "next-frame"
704
- } : {
705
- featureIdentity: owner.featureIdentity,
706
- order: -1,
707
- stage: "contribute",
708
- operation,
709
- resourceKind: "attachment",
710
- reason,
711
- expectedLayout: "sampled-read-temporal-v1",
712
- actualLayout: target?.access ?? "unknown",
713
- recovery: "next-frame"
714
- };
715
- return new RenderFeaturePreparedStateMismatchError(detail);
716
- }
717
- function isSceneDataTarget(value) {
718
- if (value === null || typeof value !== "object") return false;
719
- const candidate = value;
720
- return candidate.kind === "scene-data" && candidate.schema === SCENE_DATA_TEMPORAL_V1_SCHEMA && candidate.access === "sampled-read" && candidate.format === "rgba16float" && candidate.sampleCount === 1 && candidate.extent === "render-resolution" && targetOwners.has(value);
721
- }
722
- function sceneDataTargetAsAttachment(_target) {
723
- throw new TypeError("SceneDataTarget is sampled-read-only and cannot be used as an attachment");
724
- }
725
- function sceneDataError(error) {
726
- return error;
727
- }
728
- function availability(options) {
729
- if (options.recovering) return { status: "unavailable", reason: "renderer-recovering" };
730
- if (!options.rgba16floatRenderable)
731
- return { status: "unavailable", reason: "capability-missing" };
732
- if (options.producerPresent === false)
733
- return { status: "unavailable", reason: "producer-missing" };
734
- if (options.coverageComplete === false)
735
- return { status: "unavailable", reason: "coverage-incomplete" };
736
- return {
737
- status: "available",
738
- completeness: options.reactiveFallback ? "exact-with-reactive-fallback" : "exact"
739
- };
740
- }
741
- function createTarget(owner) {
742
- const target = Object.freeze({
743
- kind: "scene-data",
744
- schema: SCENE_DATA_TEMPORAL_V1_SCHEMA,
745
- access: "sampled-read",
746
- format: "rgba16float",
747
- sampleCount: 1,
748
- extent: "render-resolution"
749
- });
750
- registerSceneDataTarget(target, {
751
- featureIdentity: owner.featureIdentity,
752
- planIdentity: owner.planIdentity,
753
- generation: owner.generation
754
- });
755
- return target;
756
- }
757
- function tokenError(catalog, operation) {
758
- return sceneDataTokenMismatch(
759
- operation,
760
- "foreign-kind",
761
- {
762
- featureIdentity: catalog.featureIdentity,
763
- planIdentity: catalog.planIdentity,
764
- generation: catalog.generation
765
- },
766
- void 0
767
- );
768
- }
769
- function unavailableError(options, reason) {
770
- const recovery = reason === "capability-missing" ? "enable-capability" : reason === "renderer-recovering" ? "renderer-recover" : "next-frame";
771
- return new SceneDataUnavailableError({
772
- featureIdentity: options.featureIdentity,
773
- schema: SCENE_DATA_TEMPORAL_V1_SCHEMA,
774
- lane: options.lane ?? "direct",
775
- reason,
776
- missingContributorIds: options.missingContributorIds ?? [],
777
- omittedMissingContributorCount: 0,
778
- recovery
779
- });
780
- }
781
- function createSceneDataCatalog(options) {
782
- const state = availability(options);
783
- const owner = {
784
- featureIdentity: options.featureIdentity,
785
- planIdentity: options.planIdentity,
786
- generation: options.generation
787
- };
788
- const missing = [...options.missingContributorIds ?? []];
789
- const inspectionBase = {
790
- schema: SCENE_DATA_TEMPORAL_V1_SCHEMA,
791
- generation: options.generation,
792
- planIdentity: options.planIdentity,
793
- lane: options.lane ?? "direct",
794
- missingContributorIds: Object.freeze(missing.slice(0, 32)),
795
- omittedMissingContributorCount: Math.max(0, missing.length - 32)
796
- };
797
- return {
798
- schema: SCENE_DATA_TEMPORAL_V1_SCHEMA,
799
- generation: options.generation,
800
- planIdentity: options.planIdentity,
801
- availability: state,
802
- require(schema) {
803
- if (schema !== SCENE_DATA_TEMPORAL_V1_SCHEMA || state.status !== "available") {
804
- if (state.status === "unavailable") throw unavailableError(options, state.reason);
805
- throw tokenError(options, "require scene-data target");
806
- }
807
- return createTarget(options);
808
- },
809
- validate(target, generation = options.generation) {
810
- const targetOwner = sceneDataTargetOwner(target);
811
- if (targetOwner === void 0) {
812
- return err(
813
- sceneDataTokenMismatch("validate scene-data target", "foreign-feature", owner, target)
814
- );
815
- }
816
- if (targetOwner.planIdentity !== owner.planIdentity || targetOwner.featureIdentity !== owner.featureIdentity) {
817
- return err(
818
- sceneDataTokenMismatch("validate scene-data target", "foreign-feature", owner, target)
819
- );
820
- }
821
- if (generation !== owner.generation || targetOwner.generation !== owner.generation) {
822
- return err(
823
- sceneDataTokenMismatch(
824
- "validate scene-data target",
825
- "generation-mismatch",
826
- owner,
827
- target
828
- )
829
- );
830
- }
831
- if (target.access !== "sampled-read") {
832
- return err(
833
- sceneDataTokenMismatch("validate scene-data target", "layout-mismatch", owner, target)
834
- );
835
- }
836
- return ok(target);
837
- },
838
- inspect() {
839
- return Object.freeze(
840
- state.status === "available" ? { ...inspectionBase, status: state.status, completeness: state.completeness } : { ...inspectionBase, status: state.status, reason: state.reason }
841
- );
842
- }
843
- };
844
- }
777
+ // src/gpu-texture-usage.ts
778
+ var GPU_TEXTURE_USAGE_COPY_SRC = 1;
779
+ var GPU_TEXTURE_USAGE_COPY_DST = 2;
780
+ var GPU_TEXTURE_USAGE_TEXTURE_BINDING = 4;
781
+ var GPU_TEXTURE_USAGE_RENDER_ATTACHMENT = 16;
782
+ var GPU_TEXTURE_USAGE_RENDER_ATTACHMENT_AND_TEXTURE_BINDING = GPU_TEXTURE_USAGE_RENDER_ATTACHMENT | GPU_TEXTURE_USAGE_TEXTURE_BINDING;
845
783
 
846
- // src/pipeline/standard-profile.ts
847
- var STANDARD_PIPELINE_ID = "forgeax::standard";
848
- var STANDARD_LIGHT_COUNTS = [1, 32, 256];
849
- var DEFAULT_CLUSTER_GRID = { x: 16, y: 9, z: 24 };
850
- var CLUSTER_GRID_STRIDE_U32 = 2;
851
- var LIGHT_INDEX_LIST_CAPACITY = 1048576;
852
- var MAX_LIGHTS = 256;
853
- var STANDARD_POST_STAGE_NAMES = [
854
- "transparent-blend",
855
- "bloom",
856
- "output-transform",
857
- "fxaa",
858
- "post-effect",
859
- "present"
860
- ];
861
- var DEFAULT_STANDARD_PROFILE = Object.freeze({
862
- pipelineId: STANDARD_PIPELINE_ID,
863
- lightCount: 32,
864
- lighting: "direct",
865
- shadows: "filtered",
866
- pbr: true,
867
- ibl: true,
868
- ssao: false,
869
- bloom: true,
870
- tone: "aces-filmic",
871
- antialias: "fxaa",
872
- sky: true,
873
- fallback: "native",
874
- postStages: STANDARD_POST_STAGE_NAMES
875
- });
876
- function resolveVolumetricFogProfile(profile) {
877
- return profile.volumetricFog ?? { quality: "high", depth: 64, tileSize: 4 };
878
- }
879
- function resolveStandardLane(profile, capabilities) {
880
- if (!capabilities.compute || !capabilities.storageBuffer) return "cpu-webgl2";
881
- return profile.lighting;
882
- }
784
+ // src/shadow-atlas.ts
785
+ var SHADOW_ATLAS_DEFAULT_FACE_SIZE = 512;
786
+ var SHADOW_ATLAS_DEFAULT_LAYERS = 4;
787
+ var ShadowAtlas = class {
788
+ /** Backing cube_array depth texture. `null` until `ensure()` has run. */
789
+ texture = null;
790
+ /**
791
+ * Whole-atlas cube_array sampling view used by URP shaders that bind the
792
+ * atlas at `@group(0) @binding(5)`. `null` until `ensure()` has run.
793
+ */
794
+ cubeArrayView = null;
795
+ /** Comparison sampler for `texture_depth_cube_array`. */
796
+ compareSampler = null;
797
+ /** Per-face 2D depth view cache, keyed by `layer * 6 + face`. */
798
+ faceViews = /* @__PURE__ */ new Map();
799
+ /** Per-face label cache (debug aid). Reused on re-creation. */
800
+ device;
801
+ /** Per-face square size in pixels. */
802
+ faceSize;
803
+ /** Cube layer count. */
804
+ layers;
805
+ constructor(device, options = {}) {
806
+ this.device = device;
807
+ this.faceSize = options.faceSize ?? SHADOW_ATLAS_DEFAULT_FACE_SIZE;
808
+ this.layers = options.layers ?? SHADOW_ATLAS_DEFAULT_LAYERS;
809
+ }
810
+ /**
811
+ * Returns `true` once the atlas texture is allocated. Used by the extract /
812
+ * record path to gate "no PointLightShadow → no allocation" (AC-09) — the
813
+ * caller calls {@link ensure} on a frame that has at least one snapshot;
814
+ * before that, `isAllocated()` stays `false` and tests can assert no GPU
815
+ * resources were created.
816
+ */
817
+ isAllocated() {
818
+ return this.texture !== null;
819
+ }
820
+ /**
821
+ * Lazy-allocate the atlas texture + cube_array sampling view + comparison
822
+ * sampler. Idempotent: subsequent calls are zero-cost no-ops once the
823
+ * resources exist.
824
+ *
825
+ * Throws (via the RHI error registry) on allocation failure. This is the
826
+ * only path that touches the GPU — keeping it inside one method makes the
827
+ * "zero-shadow scene = zero allocation" gate easy to enforce: the renderer
828
+ * never calls this method on a frame with no PointLightShadow entities.
829
+ */
830
+ ensure() {
831
+ if (this.texture !== null) return;
832
+ const usage = GPU_TEXTURE_USAGE_RENDER_ATTACHMENT_AND_TEXTURE_BINDING;
833
+ const texDesc = cubeArrayDepthDescriptor(this.faceSize, this.layers, usage);
834
+ const texRes = this.device.createTexture(texDesc);
835
+ if (!texRes.ok) throw texRes.error;
836
+ this.texture = texRes.value;
837
+ const viewRes = this.device.createTextureView(this.texture, {
838
+ label: "shadow-atlas-cube-array-view",
839
+ dimension: "cube-array",
840
+ aspect: "depth-only",
841
+ baseArrayLayer: 0,
842
+ arrayLayerCount: 6 * this.layers,
843
+ baseMipLevel: 0,
844
+ mipLevelCount: 1
845
+ });
846
+ if (!viewRes.ok) {
847
+ this.device.destroyTexture(this.texture);
848
+ this.texture = null;
849
+ throw viewRes.error;
850
+ }
851
+ this.cubeArrayView = viewRes.value;
852
+ const sampRes = this.device.createSampler(comparisonSamplerDescriptor());
853
+ if (!sampRes.ok) {
854
+ this.device.destroyTexture(this.texture);
855
+ this.texture = null;
856
+ this.cubeArrayView = null;
857
+ throw sampRes.error;
858
+ }
859
+ this.compareSampler = sampRes.value;
860
+ }
861
+ /**
862
+ * Whole-atlas cube_array sampling view (`texture_depth_cube_array`). Returns
863
+ * `null` if the atlas is not yet allocated; the caller should gate on a
864
+ * non-null pointShadow array before calling {@link ensure} + this getter.
865
+ */
866
+ getAtlasView() {
867
+ return this.cubeArrayView;
868
+ }
869
+ /**
870
+ * Comparison sampler (`compare: 'less'`) for cube_array depth sampling.
871
+ * Returns `null` if the atlas is not yet allocated.
872
+ */
873
+ getComparisonSampler() {
874
+ return this.compareSampler;
875
+ }
876
+ /**
877
+ * Backing texture handle. Returns `null` if the atlas is not yet allocated.
878
+ */
879
+ getTexture() {
880
+ return this.texture;
881
+ }
882
+ /**
883
+ * Lazy 2D depth view selecting `(layer, face)` (the caller passes
884
+ * `shadowAtlasLayer` from the snapshot and a face index 0..5). Used as the
885
+ * depth attachment of the shadow-caster render pass for one cube face.
886
+ *
887
+ * Caches per `(layer, face)` so the per-frame shadow loop pays zero
888
+ * `createTextureView` cost after the first allocation. Cache is cleared on
889
+ * {@link dispose}.
890
+ *
891
+ * @throws PointShadowAtlasUninitializedError if the atlas is not yet
892
+ * allocated (caller must call {@link ensure} first).
893
+ * @throws PointShadowAtlasBoundsViolationError if `layer` or `face` is out
894
+ * of range.
895
+ * @throws RhiError if the underlying `createTextureView` fails.
896
+ */
897
+ faceView(layer, face) {
898
+ if (this.texture === null) {
899
+ throw new PointShadowAtlasUninitializedError();
900
+ }
901
+ if (layer < 0 || layer >= this.layers) {
902
+ throw new PointShadowAtlasBoundsViolationError("layer", layer, this.layers);
903
+ }
904
+ if (face < 0 || face >= 6) {
905
+ throw new PointShadowAtlasBoundsViolationError("face", face, 6);
906
+ }
907
+ const key = layer * 6 + face;
908
+ const cached = this.faceViews.get(key);
909
+ if (cached !== void 0) return cached;
910
+ const desc = cubeArrayDepthFaceView(layer, face);
911
+ const r = this.device.createTextureView(this.texture, desc);
912
+ if (!r.ok) throw r.error;
913
+ this.faceViews.set(key, r.value);
914
+ return r.value;
915
+ }
916
+ /**
917
+ * Release the GPU resources and clear the per-face view cache. Idempotent;
918
+ * subsequent calls are zero-cost. After dispose, `isAllocated()` returns
919
+ * `false` and the next `ensure()` re-allocates from scratch.
920
+ */
921
+ dispose() {
922
+ this.faceViews.clear();
923
+ if (this.texture !== null) {
924
+ this.device.destroyTexture(this.texture);
925
+ this.texture = null;
926
+ }
927
+ this.cubeArrayView = null;
928
+ this.compareSampler = null;
929
+ }
930
+ };
883
931
 
884
932
  // src/render-contract.ts
885
933
  var STANDARD_OUTPUT_TRANSFORM_FEATURE_ID = "forgeax::standard::output-transform";
934
+ var FXAA_POST_PROCESS_ID = "forgeax::post::fxaa";
886
935
  var RENDER_GRAPH_EXECUTION_PHASE_CATALOG = [
887
936
  "record/graph-execute/point-shadow",
888
937
  "record/graph-execute/cluster-binner-upload",
@@ -939,6 +988,8 @@ var RENDER_SCENE_STATE_PHASE_CATALOG = [
939
988
  ...RENDER_HDRP_CLUSTER_PHASE_CATALOG
940
989
  ];
941
990
  var RENDER_RECORD_PHASE_CATALOG = [
991
+ "record/occlusion-query-submit",
992
+ "record/occlusion-global-advance",
942
993
  "record/scene-state",
943
994
  ...RENDER_SCENE_STATE_PHASE_CATALOG,
944
995
  "record/swapchain",
@@ -953,6 +1004,7 @@ var RENDER_RECORD_PHASE_CATALOG = [
953
1004
  ];
954
1005
  var RENDER_PHASE_CATALOG = [
955
1006
  "extract",
1007
+ "occlusion-prepare",
956
1008
  "bind-groups",
957
1009
  "features",
958
1010
  "sort",
@@ -960,6 +1012,6 @@ var RENDER_PHASE_CATALOG = [
960
1012
  ...RENDER_RECORD_PHASE_CATALOG
961
1013
  ];
962
1014
 
963
- export { AtmosphereInvalidParameterError, CLUSTER_GRID_STRIDE_U32, DEFAULT_CLUSTER_GRID, DEFAULT_STANDARD_PROFILE, EnvironmentGenerationFailedError, EnvironmentSourceConflictError, EquirectProjectionFailedError, FogCardinalityError, FrameReceiptStaleError, HdrpDeferredCapsInsufficientError, HdrpIndexListOverflowError, HdrpLightBudgetExceededError, LIGHT_INDEX_LIST_CAPACITY, LifecycleConstructionError, MAX_LIGHTS, MaterialSkinAttrMissingError, ObservationUnavailableError, OwnerStageFailedError, PointShadowAtlasBoundsViolationError, PointShadowAtlasUninitializedError, PointsLinesBudgetExceededError, PointsLinesInvalidStyleError, PointsLinesMaterialUnsupportedError, PointsLinesPrepareFailedError, PointsLinesStyleUnsupportedError, PointsLinesTopologyMismatchError, RENDER_PHASE_CATALOG, RenderFeatureCapabilityMissingError, RenderFeatureDrawRecordingFailedError, RenderFeaturePreparationFailedError, RenderFeaturePreparedStateMismatchError, RenderFeatureRegistrationConflictError, RenderFeatureStageFailedError, RendererContractFailureError, RendererOperationError, SCENE_DATA_TEMPORAL_V1_DESCRIPTOR, SCENE_DATA_TEMPORAL_V1_SCHEMA, STANDARD_LIGHT_COUNTS, STANDARD_OUTPUT_TRANSFORM_FEATURE_ID, STANDARD_PIPELINE_ID, STANDARD_POST_STAGE_NAMES, SceneDataUnavailableError, ShadowInvalidConfigError, SkinMaterialMismatchError, SkinPaletteOverflowError, TaaCapsInsufficientError, TemporalFrameSubmitError, TransmissionCapabilityMissingError, VertexColorVariantConflictError, VideoUploadUnsupportedError, VolumeDensityShapeMismatchError, VolumeInvalidBoundsError, VolumeInvalidParametersError, VolumeOwnerConflictError, createSceneDataCatalog, isSceneDataTarget, registerSceneDataTarget, resolveStandardLane, resolveVolumetricFogProfile, sceneDataError, sceneDataTargetAsAttachment, sceneDataTargetOwner, sceneDataTokenMismatch };
964
- //# sourceMappingURL=chunk-TBQJOK2L.mjs.map
965
- //# sourceMappingURL=chunk-TBQJOK2L.mjs.map
1015
+ export { AtmosphereInvalidParameterError, EnvironmentGenerationFailedError, EnvironmentSourceConflictError, EquirectProjectionFailedError, FXAA_POST_PROCESS_ID, FogCardinalityError, FrameReceiptStaleError, GPU_TEXTURE_USAGE_COPY_DST, GPU_TEXTURE_USAGE_COPY_SRC, GPU_TEXTURE_USAGE_RENDER_ATTACHMENT, GPU_TEXTURE_USAGE_RENDER_ATTACHMENT_AND_TEXTURE_BINDING, GPU_TEXTURE_USAGE_TEXTURE_BINDING, LifecycleConstructionError, MaterialSkinAttrMissingError, ObservationUnavailableError, OwnerStageFailedError, PointShadowAtlasBoundsViolationError, PointShadowAtlasUninitializedError, PointsLinesBudgetExceededError, PointsLinesInvalidStyleError, PointsLinesMaterialUnsupportedError, PointsLinesPrepareFailedError, PointsLinesStyleUnsupportedError, PointsLinesTopologyMismatchError, RENDER_PHASE_CATALOG, RenderFeatureCapabilityMissingError, RenderFeatureDrawRecordingFailedError, RenderFeaturePreparationFailedError, RenderFeaturePreparedStateMismatchError, RenderFeatureRegistrationConflictError, RenderFeatureStageFailedError, RenderIntentInvalidError, RenderTargetCapabilityMissingError, RenderTargetDescriptorInvalidError, RenderTargetOperationFailedError, RenderTargetStateInvalidError, RendererContractFailureError, RendererOperationError, SHADOW_ATLAS_DEFAULT_FACE_SIZE, SHADOW_ATLAS_DEFAULT_LAYERS, STANDARD_OUTPUT_TRANSFORM_FEATURE_ID, SceneDataUnavailableError, ShadowAtlas, ShadowInvalidConfigError, SkinMaterialMismatchError, SkinPaletteOverflowError, StandardClusterIndexOverflowError, StandardClusterTransportUnavailableError, StandardLightBudgetExceededError, StandardProfileInvalidError, TaaCapsInsufficientError, TemporalFrameSubmitError, TransmissionCapabilityMissingError, VertexColorVariantConflictError, VideoUploadUnsupportedError, VolumeDensityShapeMismatchError, VolumeInvalidBoundsError, VolumeInvalidParametersError, VolumeOwnerConflictError, createLightResourceUnavailable };
1016
+ //# sourceMappingURL=chunk-QODA5UKU.mjs.map
1017
+ //# sourceMappingURL=chunk-QODA5UKU.mjs.map