@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,7 +1,8 @@
1
- import { PointsLinesBudgetExceededError, VolumeOwnerConflictError, VolumeDensityShapeMismatchError, VolumeInvalidBoundsError, VolumeInvalidParametersError, PointsLinesStyleUnsupportedError, PointsLinesMaterialUnsupportedError, PointsLinesInvalidStyleError, PointsLinesTopologyMismatchError } from './chunk-TBQJOK2L.mjs';
1
+ import { RenderIntentInvalidError, ShadowInvalidConfigError, VolumeOwnerConflictError, VolumeDensityShapeMismatchError, VolumeInvalidBoundsError, VolumeInvalidParametersError } from './chunk-QODA5UKU.mjs';
2
2
  import { defineComponent, Entity } from '@forgeax/engine-ecs';
3
3
  import { TONEMAP_SHADER_MODE } from '@forgeax/engine-shader';
4
- import { err, ok } from '@forgeax/engine-types';
4
+ import { R_MIN, err, ok } from '@forgeax/engine-types';
5
+ import { SpawnLightInvalidBoundsError } from '@forgeax/engine-ecs/projection';
5
6
  import { Transform, projectHierarchy } from '@forgeax/engine-scene';
6
7
 
7
8
  var Atmosphere = defineComponent("Atmosphere", {
@@ -106,6 +107,10 @@ var Camera = defineComponent("Camera", {
106
107
  bloomThreshold: { type: "f32", default: 1 },
107
108
  bloomIntensity: { type: "f32", default: 1 },
108
109
  bloomBlurRadius: { type: "f32", default: 4 },
110
+ // M1 target camera role: zero means this camera is eligible for display;
111
+ // non-zero shared targets are auxiliary producers whose views and receipt
112
+ // promotion remain owned by Renderer.
113
+ target: { type: "shared<RenderTarget>", simulationTransient: true },
109
114
  // feat-20260709 M3 / D-3: clear-color is one inline `array<f32,4>` column.
110
115
  // The earlier 4-scalar form (clearR/G/B/A) was chosen when this was believed
111
116
  // to be the only SoA-safe shape; the Transform (pos/quat/scale) and light
@@ -165,6 +170,75 @@ function orthographic(opts) {
165
170
  top: opts.top
166
171
  };
167
172
  }
173
+ var CUBE_CAMERA_UPDATE_ONCE = 0;
174
+ var CUBE_CAMERA_UPDATE_ON_DEMAND = 1;
175
+ var CUBE_CAMERA_UPDATE_CONTINUOUS = 2;
176
+ var CUBE_CAMERA_FACE_ORDER = ["+X", "-X", "+Y", "-Y", "+Z", "-Z"];
177
+ function cubeCameraUpdateIntentFromF32(value) {
178
+ switch (value) {
179
+ case CUBE_CAMERA_UPDATE_ONCE:
180
+ return "once";
181
+ case CUBE_CAMERA_UPDATE_ON_DEMAND:
182
+ return "on-demand";
183
+ case CUBE_CAMERA_UPDATE_CONTINUOUS:
184
+ return "continuous";
185
+ default:
186
+ throw new RenderIntentInvalidError("CubeCamera", value);
187
+ }
188
+ }
189
+ function cubeCameraUpdateIntentToF32(intent) {
190
+ switch (intent) {
191
+ case "once":
192
+ return CUBE_CAMERA_UPDATE_ONCE;
193
+ case "on-demand":
194
+ return CUBE_CAMERA_UPDATE_ON_DEMAND;
195
+ case "continuous":
196
+ return CUBE_CAMERA_UPDATE_CONTINUOUS;
197
+ }
198
+ }
199
+ var CubeCamera = defineComponent("CubeCamera", {
200
+ target: { type: "shared<RenderTarget>", simulationTransient: true },
201
+ near: { type: "f32", default: 0.1 },
202
+ far: { type: "f32", default: 100 },
203
+ updateIntent: { type: "f32", default: CUBE_CAMERA_UPDATE_ONCE },
204
+ requestVersion: { type: "u32", default: 0 },
205
+ faceBudget: { type: "u32", default: 1 }
206
+ });
207
+
208
+ // src/components/directional-shadow-filter.ts
209
+ var DirectionalShadowFilterValue = Object.freeze({
210
+ pcf1: 1,
211
+ pcf3: 2,
212
+ pcf5: 3,
213
+ pcssMedium: 4,
214
+ pcssHigh: 5
215
+ });
216
+ function directionalShadowQualityFromF32(value, angularRadiusRadians, maxPenumbraTexels) {
217
+ switch (value) {
218
+ case DirectionalShadowFilterValue.pcf1:
219
+ return { kind: "pcf", kernel: 1 };
220
+ case DirectionalShadowFilterValue.pcf3:
221
+ return { kind: "pcf", kernel: 3 };
222
+ case DirectionalShadowFilterValue.pcf5:
223
+ return { kind: "pcf", kernel: 5 };
224
+ case DirectionalShadowFilterValue.pcssMedium:
225
+ return {
226
+ kind: "pcss",
227
+ preset: "medium",
228
+ angularRadiusRadians,
229
+ maxPenumbraTexels
230
+ };
231
+ case DirectionalShadowFilterValue.pcssHigh:
232
+ return {
233
+ kind: "pcss",
234
+ preset: "high",
235
+ angularRadiusRadians,
236
+ maxPenumbraTexels
237
+ };
238
+ default:
239
+ return void 0;
240
+ }
241
+ }
168
242
  var DirectionalLight = defineComponent("DirectionalLight", {
169
243
  // direction is the ONLY field with no default (D-5): omitting it lands the
170
244
  // array layer-3 all-zero [0,0,0], which the renderer owner rejects -- there is no
@@ -188,7 +262,13 @@ var DirectionalLight = defineComponent("DirectionalLight", {
188
262
  // reach. Default 200 world units (matches UE-style "dynamic shadow
189
263
  // distance"; the old farPlane default was 50).
190
264
  shadowDistance: { type: "f32", default: 200 },
191
- pcfKernelSize: { type: "f32", default: 3 }
265
+ shadowFilter: {
266
+ type: "enum",
267
+ default: DirectionalShadowFilterValue.pcf3,
268
+ labels: DirectionalShadowFilterValue
269
+ },
270
+ shadowAngularRadius: { type: "f32", default: 465e-5 },
271
+ maxPenumbraTexels: { type: "f32", default: 32 }
192
272
  });
193
273
  var Fog = defineComponent("Fog", {
194
274
  color: { type: "array<f32, 3>", default: new Float32Array([0.5, 0.5, 0.5]) },
@@ -202,6 +282,221 @@ var Instances = defineComponent("Instances", {
202
282
  var Layer = defineComponent("Layer", {
203
283
  value: { type: "i32", default: 0 }
204
284
  });
285
+
286
+ // src/components/light-helpers.ts
287
+ var RANGE_ZERO_FALLBACK_INV_R2 = 1e8;
288
+ var DEG_TO_RAD = Math.PI / 180;
289
+ var PCSS_RADIUS_MIN = 1e-4;
290
+ var PCSS_RADIUS_MAX = 0.05;
291
+ var PCSS_PENUMBRA_MIN = 1;
292
+ var PCSS_PENUMBRA_MAX = 64;
293
+ function degToCos(deg) {
294
+ return Math.cos(deg * DEG_TO_RAD);
295
+ }
296
+ function computeInvRangeSquared(range) {
297
+ if (range === Number.POSITIVE_INFINITY) return 0;
298
+ if (range === 0) return RANGE_ZERO_FALLBACK_INV_R2;
299
+ return 1 / (range * range);
300
+ }
301
+ function validateDirection(componentName, direction) {
302
+ const dir = direction;
303
+ if (dir === void 0 || (dir[0] ?? 0) === 0 && (dir[1] ?? 0) === 0 && (dir[2] ?? 0) === 0) {
304
+ return new SpawnLightInvalidBoundsError(
305
+ componentName,
306
+ "direction",
307
+ dir === void 0 ? [0, 0, 0] : [dir[0] ?? 0, dir[1] ?? 0, dir[2] ?? 0]
308
+ );
309
+ }
310
+ return null;
311
+ }
312
+ function validateDirectionalLightData(data) {
313
+ const directionError = validateDirection(
314
+ "DirectionalLight",
315
+ data.direction
316
+ );
317
+ if (directionError !== null) return err(directionError);
318
+ if (data.castShadow === false) return ok(void 0);
319
+ const mapSize = data.mapSize ?? 2048;
320
+ if (mapSize < 1) {
321
+ return err(new ShadowInvalidConfigError("mapSize", mapSize, 1));
322
+ }
323
+ const cascadeCount = data.cascadeCount ?? 4;
324
+ if (cascadeCount < 1 || cascadeCount > 4 || !Number.isInteger(cascadeCount)) {
325
+ return err(new ShadowInvalidConfigError("cascadeCount", cascadeCount, 1, 4));
326
+ }
327
+ const splitLambda = data.splitLambda ?? 0.75;
328
+ if (splitLambda < 0 || splitLambda > 1) {
329
+ return err(new ShadowInvalidConfigError("splitLambda", splitLambda, 0, 1));
330
+ }
331
+ const cascadeBlend = data.cascadeBlend ?? 0.2;
332
+ if (cascadeBlend < 0 || cascadeBlend > 0.5) {
333
+ return err(new ShadowInvalidConfigError("cascadeBlend", cascadeBlend, 0, 0.5));
334
+ }
335
+ const shadowDistance = data.shadowDistance ?? 200;
336
+ if (shadowDistance <= 0) {
337
+ return err(new ShadowInvalidConfigError("shadowDistance", shadowDistance, 0, ">"));
338
+ }
339
+ const shadowFilter = data.shadowFilter ?? DirectionalShadowFilterValue.pcf3;
340
+ const allowedFilters = Object.values(DirectionalShadowFilterValue);
341
+ if (!Number.isFinite(shadowFilter) || !allowedFilters.includes(shadowFilter)) {
342
+ return err(
343
+ new ShadowInvalidConfigError(
344
+ "shadowFilter",
345
+ shadowFilter,
346
+ { kind: "allowed-values", values: allowedFilters },
347
+ void 0,
348
+ "one of [pcf1, pcf3, pcf5, pcssMedium, pcssHigh]"
349
+ )
350
+ );
351
+ }
352
+ if (shadowFilter === DirectionalShadowFilterValue.pcssMedium || shadowFilter === DirectionalShadowFilterValue.pcssHigh) {
353
+ const shadowAngularRadius = data.shadowAngularRadius ?? 465e-5;
354
+ if (!Number.isFinite(shadowAngularRadius)) {
355
+ return err(
356
+ new ShadowInvalidConfigError("shadowAngularRadius", shadowAngularRadius, {
357
+ kind: "range",
358
+ min: PCSS_RADIUS_MIN,
359
+ max: PCSS_RADIUS_MAX
360
+ })
361
+ );
362
+ }
363
+ if (shadowAngularRadius < PCSS_RADIUS_MIN || shadowAngularRadius > PCSS_RADIUS_MAX) {
364
+ return err(
365
+ new ShadowInvalidConfigError("shadowAngularRadius", shadowAngularRadius, {
366
+ kind: "range",
367
+ min: PCSS_RADIUS_MIN,
368
+ max: PCSS_RADIUS_MAX
369
+ })
370
+ );
371
+ }
372
+ const maxPenumbraTexels = data.maxPenumbraTexels ?? 32;
373
+ if (!Number.isFinite(maxPenumbraTexels) || !Number.isInteger(maxPenumbraTexels) || maxPenumbraTexels < PCSS_PENUMBRA_MIN || maxPenumbraTexels > PCSS_PENUMBRA_MAX) {
374
+ return err(
375
+ new ShadowInvalidConfigError(
376
+ "maxPenumbraTexels",
377
+ maxPenumbraTexels,
378
+ { kind: "range", min: PCSS_PENUMBRA_MIN, max: PCSS_PENUMBRA_MAX },
379
+ void 0,
380
+ "a finite integer in [1, 64]"
381
+ )
382
+ );
383
+ }
384
+ }
385
+ return ok(void 0);
386
+ }
387
+ function validateSpotLightData(data) {
388
+ const directionError = validateDirection(
389
+ "SpotLight",
390
+ data.direction
391
+ );
392
+ if (directionError !== null) return err(directionError);
393
+ if (data.castShadow === false) return ok(void 0);
394
+ const range = data.range ?? 10;
395
+ if (typeof range !== "number" || Number.isNaN(range) || range < 0) {
396
+ return err(new SpawnLightInvalidBoundsError("SpotLight", "range", range));
397
+ }
398
+ const innerConeDeg = data.innerConeDeg ?? 0;
399
+ const outerConeDeg = data.outerConeDeg ?? 45;
400
+ if (outerConeDeg > 90) {
401
+ return err(new SpawnLightInvalidBoundsError("SpotLight", "outerNinety", outerConeDeg));
402
+ }
403
+ if (outerConeDeg <= innerConeDeg) {
404
+ return err(new SpawnLightInvalidBoundsError("SpotLight", "innerOuter", outerConeDeg));
405
+ }
406
+ const mapSize = data.mapSize ?? 2048;
407
+ if (mapSize < 1) return err(new ShadowInvalidConfigError("mapSize", mapSize, 1));
408
+ const nearPlane = data.nearPlane;
409
+ const farPlane = data.farPlane;
410
+ if (nearPlane !== void 0 && farPlane !== void 0 && farPlane <= nearPlane) {
411
+ return err(new ShadowInvalidConfigError("farPlane", farPlane, nearPlane));
412
+ }
413
+ const pcfKernelSize = data.pcfKernelSize ?? 3;
414
+ if (pcfKernelSize < 1 || pcfKernelSize % 2 === 0) {
415
+ return err(
416
+ new ShadowInvalidConfigError(
417
+ "pcfKernelSize",
418
+ pcfKernelSize,
419
+ { kind: "lower-bound", operator: ">=", value: 1 },
420
+ void 0,
421
+ "an odd integer >= 1"
422
+ )
423
+ );
424
+ }
425
+ const shadowIntensity = data.shadowIntensity ?? 1;
426
+ if (!Number.isFinite(shadowIntensity) || shadowIntensity < 0 || shadowIntensity > 1) {
427
+ return err(new ShadowInvalidConfigError("shadowIntensity", shadowIntensity, 0, 1));
428
+ }
429
+ return ok(void 0);
430
+ }
431
+ function validatePointLightData(data) {
432
+ const range = data.range ?? 10;
433
+ if (typeof range !== "number" || Number.isNaN(range) || range < 0) {
434
+ return err(new SpawnLightInvalidBoundsError("PointLight", "range", range));
435
+ }
436
+ return ok(void 0);
437
+ }
438
+ function validatePointLightShadowData(data) {
439
+ const mapSize = data.mapSize ?? 512;
440
+ if (mapSize < 1) return err(new ShadowInvalidConfigError("mapSize", mapSize, 1));
441
+ const nearPlane = data.nearPlane ?? 0.1;
442
+ const farPlane = data.farPlane ?? 25;
443
+ if (farPlane <= nearPlane) {
444
+ return err(new ShadowInvalidConfigError("farPlane", farPlane, nearPlane));
445
+ }
446
+ const pcfKernelSize = data.pcfKernelSize ?? 3;
447
+ if (pcfKernelSize < 1 || pcfKernelSize % 2 === 0) {
448
+ return err(
449
+ new ShadowInvalidConfigError(
450
+ "pcfKernelSize",
451
+ pcfKernelSize,
452
+ { kind: "lower-bound", operator: ">=", value: 1 },
453
+ void 0,
454
+ "an odd integer >= 1"
455
+ )
456
+ );
457
+ }
458
+ return ok(void 0);
459
+ }
460
+ function validateRectAreaLightData(data) {
461
+ const intensity = data.intensity ?? 1;
462
+ if (typeof intensity !== "number" || !Number.isFinite(intensity) || intensity < 0) {
463
+ return err(new SpawnLightInvalidBoundsError("RectAreaLight", "intensity", intensity));
464
+ }
465
+ const color = data.color ?? [1, 1, 1];
466
+ if (color.length !== 3 || Array.from(color).some(
467
+ (value) => typeof value !== "number" || !Number.isFinite(value) || value < 0
468
+ )) {
469
+ return err(new SpawnLightInvalidBoundsError("RectAreaLight", "color", Array.from(color)));
470
+ }
471
+ for (const field of ["width", "height", "range"]) {
472
+ const value = data[field] ?? (field === "range" ? 10 : 1);
473
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
474
+ return err(new SpawnLightInvalidBoundsError("RectAreaLight", field, value));
475
+ }
476
+ }
477
+ return ok(void 0);
478
+ }
479
+ function validateLightProbeData(data) {
480
+ const irradiance = data.irradiance;
481
+ if (irradiance === void 0 || irradiance.length !== 27 || Array.from(irradiance).some((value) => typeof value !== "number" || !Number.isFinite(value))) {
482
+ return err(
483
+ new SpawnLightInvalidBoundsError(
484
+ "LightProbe",
485
+ "irradiance",
486
+ irradiance === void 0 ? [] : Array.from(irradiance)
487
+ )
488
+ );
489
+ }
490
+ const radius = data.radius ?? R_MIN;
491
+ if (typeof radius !== "number" || !Number.isFinite(radius) || radius < R_MIN) {
492
+ return err(new SpawnLightInvalidBoundsError("LightProbe", "radius", radius));
493
+ }
494
+ return ok(void 0);
495
+ }
496
+ var LightProbe = defineComponent("LightProbe", {
497
+ irradiance: { type: "array<f32, 27>" },
498
+ radius: { type: "f32", default: R_MIN }
499
+ });
205
500
  var Lines = defineComponent(
206
501
  "Lines",
207
502
  {
@@ -276,6 +571,46 @@ var schema = {
276
571
  data: "buffer"
277
572
  };
278
573
  var PostProcessParams = defineComponent("PostProcessParams", schema);
574
+ var RectAreaLight = defineComponent("RectAreaLight", {
575
+ color: { type: "array<f32, 3>", default: new Float32Array([1, 1, 1]) },
576
+ intensity: { type: "f32", default: 1 },
577
+ width: { type: "f32", default: 1 },
578
+ height: { type: "f32", default: 1 },
579
+ range: { type: "f32", default: 10 }
580
+ });
581
+ var REFLECTION_PROBE_UPDATE_ONCE = 0;
582
+ var REFLECTION_PROBE_UPDATE_ON_CHANGE = 1;
583
+ var REFLECTION_PROBE_UPDATE_CONTINUOUS = 2;
584
+ function reflectionProbeUpdateIntentFromF32(value) {
585
+ switch (value) {
586
+ case REFLECTION_PROBE_UPDATE_ONCE:
587
+ return "once";
588
+ case REFLECTION_PROBE_UPDATE_ON_CHANGE:
589
+ return "on-change";
590
+ case REFLECTION_PROBE_UPDATE_CONTINUOUS:
591
+ return "continuous";
592
+ default:
593
+ throw new RenderIntentInvalidError("ReflectionProbe", value);
594
+ }
595
+ }
596
+ function reflectionProbeUpdateIntentToF32(intent) {
597
+ switch (intent) {
598
+ case "once":
599
+ return REFLECTION_PROBE_UPDATE_ONCE;
600
+ case "on-change":
601
+ return REFLECTION_PROBE_UPDATE_ON_CHANGE;
602
+ case "continuous":
603
+ return REFLECTION_PROBE_UPDATE_CONTINUOUS;
604
+ }
605
+ }
606
+ var ReflectionProbe = defineComponent("ReflectionProbe", {
607
+ halfExtents: { type: "array<f32, 3>", default: new Float32Array([1, 1, 1]) },
608
+ priority: { type: "f32", default: 0 },
609
+ intensity: { type: "f32", default: 1 },
610
+ resolution: { type: "u32", default: 256 },
611
+ updateIntent: { type: "f32", default: REFLECTION_PROBE_UPDATE_ONCE },
612
+ invalidationVersion: { type: "u32", default: 0 }
613
+ });
279
614
  var SceneInstance = defineComponent(
280
615
  "SceneInstance",
281
616
  {
@@ -320,6 +655,9 @@ var SpotLight = defineComponent("SpotLight", {
320
655
  range: { type: "f32", default: 10 },
321
656
  innerConeDeg: { type: "f32", default: 0 },
322
657
  outerConeDeg: { type: "f32", default: 45 },
658
+ iesProfile: { type: "shared<IesProfileAsset>" },
659
+ cookie: { type: "shared<TextureAsset>" },
660
+ rollDeg: { type: "f32", default: 0 },
323
661
  // Shadow opt-out gate: defaults to true so zero-config spawns cast shadows.
324
662
  castShadow: { type: "bool", default: true },
325
663
  // 7 shadow fields aligned with the shared light shadow vocabulary.
@@ -372,175 +710,142 @@ var Visibility = defineComponent(
372
710
  }
373
711
  }
374
712
  );
375
- function invalidStyle(input, component, field, value, expected) {
376
- return err(new PointsLinesInvalidStyleError({ entity: input.entity, component, field, value, expected }));
377
- }
378
- function topologyMismatch(input, submesh, expected, actual) {
379
- return err(new PointsLinesTopologyMismatchError({ entity: input.entity, submesh, expected, actual }));
380
- }
381
- function checkStyle(input) {
382
- const hasPoints = input.points !== void 0;
383
- const hasLines = input.lines !== void 0;
384
- if (hasPoints && hasLines) {
385
- return invalidStyle(
386
- input,
387
- "Points/Lines",
388
- "components",
389
- "Points + Lines",
390
- "exactly one style component"
391
- );
392
- }
393
- if (!hasPoints && !hasLines) {
394
- return invalidStyle(input, "Points/Lines", "components", void 0, "one style component");
713
+
714
+ // src/scene/visibility/budget.ts
715
+ var DEFAULT_CONFIGURED_QUERY_BUDGET = 2048;
716
+ var MAX_QUERY_BUDGET = 4096;
717
+ var VISIBILITY_CANDIDATE_COUNT = 1e5;
718
+ var VISIBILITY_OCCLUDED_COUNT = 9e4;
719
+ function createVisibilityBudget(configuredQueryBudget = DEFAULT_CONFIGURED_QUERY_BUDGET) {
720
+ if (!Number.isSafeInteger(configuredQueryBudget) || configuredQueryBudget <= 0) {
721
+ throw new RangeError("configuredQueryBudget must be a positive safe integer");
395
722
  }
396
- if (hasPoints) {
397
- const sizePx = input.points?.sizePx ?? 4;
398
- const shapeValue = input.points?.shape ?? PointShapeValue.square;
399
- const shape = pointShapeFromU32(shapeValue);
400
- if (!Number.isFinite(sizePx) || sizePx <= 0) {
401
- return invalidStyle(input, "Points", "sizePx", sizePx, "finite sizePx > 0");
402
- }
403
- if (shape === void 0) {
404
- return invalidStyle(input, "Points", "shape", shapeValue, "shape is 'square' or 'circle'");
405
- }
406
- return ok({ component: "Points", shape, sizePx });
407
- }
408
- const widthPx = input.lines?.widthPx ?? 1;
409
- if (!Number.isFinite(widthPx) || widthPx <= 0) {
410
- return invalidStyle(input, "Lines", "widthPx", widthPx, "finite widthPx > 0");
411
- }
412
- return ok({ component: "Lines", widthPx });
413
- }
414
- function checkTopology(input, component) {
415
- const expected = component === "Points" ? "point-list" : "line-list";
416
- let pointCount = 0;
417
- let segmentCount = 0;
418
- const acceptedSubmeshes = [];
419
- let sawNonEmpty = false;
420
- for (const [submeshIndex, submesh] of input.mesh.submeshes.entries()) {
421
- const indexed = input.mesh.indices !== void 0 && submesh.indexCount > 0;
422
- const elementCount = indexed ? submesh.indexCount : submesh.vertexCount;
423
- if (elementCount === 0) continue;
424
- sawNonEmpty = true;
425
- if (component === "Lines" && submesh.topology === "line-strip") {
426
- return err(
427
- new PointsLinesStyleUnsupportedError({
428
- lane: "admission",
429
- field: "topology",
430
- member: "line-strip",
431
- supported: ["line-list"]
723
+ const effectiveQueryBudget = Math.min(configuredQueryBudget, MAX_QUERY_BUDGET);
724
+ const oneSweepCandidates = oneSweep(VISIBILITY_CANDIDATE_COUNT, effectiveQueryBudget);
725
+ const oneSweepOccluded = oneSweep(VISIBILITY_OCCLUDED_COUNT, effectiveQueryBudget);
726
+ const retestSubmits = Math.max(6, oneSweepOccluded);
727
+ return Object.freeze({
728
+ configuredQueryBudget,
729
+ effectiveQueryBudget,
730
+ oneSweepCandidates,
731
+ oneSweepOccluded,
732
+ settleSubmits: 2 * oneSweepCandidates,
733
+ retestSubmits,
734
+ expirySubmits: Math.max(8, retestSubmits + oneSweepOccluded)
735
+ });
736
+ }
737
+ function oneSweep(candidateCount, effectiveQueryBudget) {
738
+ return Math.ceil(candidateCount / effectiveQueryBudget);
739
+ }
740
+
741
+ // src/mesh-material-bindings.ts
742
+ var EMPTY_RESIDENCY = Object.freeze({
743
+ readiness: "pending",
744
+ samplers: Object.freeze([]),
745
+ textures: Object.freeze([])
746
+ });
747
+ function projectMeshMaterialBindingObservation(input) {
748
+ const residency = input.bindings.map((_, index) => {
749
+ const value = input.residency?.[index] ?? EMPTY_RESIDENCY;
750
+ return Object.freeze({
751
+ ...value,
752
+ samplers: Object.freeze(value.samplers.map((sampler) => Object.freeze({ ...sampler }))),
753
+ textures: Object.freeze(value.textures.map((texture) => Object.freeze({ ...texture }))),
754
+ ...value.preparationFailure === void 0 ? {} : {
755
+ preparationFailure: Object.freeze({
756
+ ...value.preparationFailure,
757
+ ...value.preparationFailure.detail === void 0 ? {} : { detail: Object.freeze({ ...value.preparationFailure.detail }) }
432
758
  })
433
- );
434
- }
435
- if (submesh.topology !== expected) {
436
- return topologyMismatch(input, submeshIndex, expected, submesh.topology);
437
- }
438
- if (component === "Lines" && elementCount % 2 !== 0) {
439
- return topologyMismatch(input, submeshIndex, "line-list pairs", "line-list odd tail");
759
+ }
760
+ });
761
+ });
762
+ return {
763
+ worldId: input.worldId,
764
+ entityKey: input.entityKey,
765
+ bindings: Object.freeze([...input.bindings]),
766
+ diagnostics: Object.freeze([...input.diagnostics]),
767
+ residency: Object.freeze(residency)
768
+ };
769
+ }
770
+ function summarizeMeshMaterialBindings(observations) {
771
+ let ready = 0;
772
+ let pending = 0;
773
+ let failed = 0;
774
+ let lastKnownGood = 0;
775
+ let textureCount = 0;
776
+ let samplerCount = 0;
777
+ for (const observation of observations) {
778
+ for (const residency of observation.residency) {
779
+ switch (residency.readiness) {
780
+ case "ready":
781
+ ready += 1;
782
+ break;
783
+ case "pending":
784
+ pending += 1;
785
+ break;
786
+ case "failed":
787
+ failed += 1;
788
+ break;
789
+ case "last-known-good":
790
+ lastKnownGood += 1;
791
+ break;
792
+ }
793
+ textureCount += residency.textures.length;
794
+ samplerCount += residency.samplers.length;
440
795
  }
441
- acceptedSubmeshes.push(submeshIndex);
442
- if (component === "Points") pointCount += elementCount;
443
- else segmentCount += elementCount / 2;
444
- }
445
- if (!sawNonEmpty) return topologyMismatch(input, 0, expected, "empty-range");
446
- return ok({ pointCount, segmentCount, submeshes: acceptedSubmeshes });
447
- }
448
- function checkMaterial(input) {
449
- const passes = input.material.passes ?? [];
450
- const unlitModules = /* @__PURE__ */ new Set(["forgeax_material::unlit", "forgeax::default-unlit"]);
451
- if (passes.length !== 1 || passes[0] === void 0) {
452
- const pass2 = passes.find(
453
- (candidate) => candidate.name === "deferred" || candidate.name === "shadow-caster"
454
- ) ?? passes[0];
455
- return err(
456
- new PointsLinesMaterialUnsupportedError({
457
- entity: input.entity,
458
- material: input.materialId ?? "<anonymous>",
459
- pass: pass2?.name ?? "<empty>",
460
- module: pass2?.program.module ?? "<empty>",
461
- reason: "points-lines admission requires one unlit forward pass"
462
- })
463
- );
464
- }
465
- const pass = passes[0];
466
- const lightMode = pass.renderState?.tags?.LightMode;
467
- if (!unlitModules.has(pass.program.module) || pass.name !== "forward" || lightMode === "ShadowCaster") {
468
- return err(
469
- new PointsLinesMaterialUnsupportedError({
470
- entity: input.entity,
471
- material: input.materialId ?? "<anonymous>",
472
- pass: pass.name,
473
- module: pass.program.module,
474
- reason: "points-lines admission requires an engine-owned unlit forward pass"
475
- })
476
- );
477
796
  }
478
- return ok(void 0);
797
+ return {
798
+ total: ready + pending + failed + lastKnownGood,
799
+ ready,
800
+ pending,
801
+ failed,
802
+ lastKnownGood,
803
+ textureCount,
804
+ samplerCount
805
+ };
479
806
  }
480
- function admitPointsLines(input) {
481
- const style = checkStyle(input);
482
- if (!style.ok) return style;
483
- const topology = checkTopology(input, style.value.component);
484
- if (!topology.ok) return topology;
485
- const material = checkMaterial(input);
486
- if (!material.ok) return material;
487
- if (style.value.component === "Points" && input.limits?.maxPoints !== void 0) {
488
- if (topology.value.pointCount > input.limits.maxPoints) {
489
- return err(
490
- new PointsLinesBudgetExceededError({
491
- lane: "admission",
492
- requested: topology.value.pointCount,
493
- limit: input.limits.maxPoints,
494
- unit: "points"
495
- })
496
- );
497
- }
807
+ function resolveMeshMaterialBindings(mesh, rendererOverrides, deps) {
808
+ const bindings = [];
809
+ const diagnostics = [];
810
+ if (!Array.isArray(mesh.materialSlots)) {
811
+ return { ok: false, code: "mesh-material-slots-missing" };
498
812
  }
499
- if (style.value.component === "Lines" && input.limits?.maxSegments !== void 0) {
500
- if (topology.value.segmentCount > input.limits.maxSegments) {
501
- return err(
502
- new PointsLinesBudgetExceededError({
503
- lane: "admission",
504
- requested: topology.value.segmentCount,
505
- limit: input.limits.maxSegments,
506
- unit: "segments"
507
- })
508
- );
813
+ if (rendererOverrides.length > mesh.materialSlots.length) {
814
+ diagnostics.push({
815
+ code: "mesh-renderer-material-override-overflow",
816
+ slotIndex: mesh.materialSlots.length
817
+ });
818
+ }
819
+ for (let slotIndex = 0; slotIndex < mesh.materialSlots.length; slotIndex++) {
820
+ const override = rendererOverrides[slotIndex] ?? 0;
821
+ if (override !== 0 && deps.isValidOverride(override)) {
822
+ bindings.push({ handle: override, source: "renderer-override" });
823
+ continue;
509
824
  }
825
+ if (override !== 0) {
826
+ diagnostics.push({
827
+ code: "mesh-renderer-material-override-invalid",
828
+ slotIndex,
829
+ handle: override
830
+ });
831
+ }
832
+ const declaredDefault = mesh.materialSlots[slotIndex]?.defaultMaterial;
833
+ if (declaredDefault !== void 0) {
834
+ const handle = deps.resolveMeshDefault(declaredDefault);
835
+ if (handle === void 0) {
836
+ return {
837
+ ok: false,
838
+ code: "mesh-default-material-not-ready",
839
+ slotIndex,
840
+ defaultMaterial: declaredDefault
841
+ };
842
+ }
843
+ bindings.push({ handle, source: "mesh-default" });
844
+ continue;
845
+ }
846
+ bindings.push({ handle: 0, source: "engine-default" });
510
847
  }
511
- return ok({ ...style.value, ...topology.value });
512
- }
513
-
514
- // src/volume/inspection.ts
515
- function resourceStage(input) {
516
- if (!input.authored || input.recovery === void 0) return "none";
517
- if (input.recovery.status === "candidate") return "candidate";
518
- if (input.recovery.status === "recovering") return "recovering";
519
- if (input.recovery.status === "degraded") return "lkg";
520
- return "accepted";
521
- }
522
- function inspectVolumetricFog(input) {
523
- const recovery = input.recovery;
524
- const status = !input.authored ? "off" : input.capability === "unavailable" ? "unavailable" : input.degraded === true || recovery?.status === "degraded" ? "degraded" : "available";
525
- return Object.freeze({
526
- status,
527
- resourceStage: resourceStage(input),
528
- guid: recovery?.guid,
529
- generation: recovery?.generation,
530
- digest: input.acceptedDigest,
531
- candidateGeneration: recovery?.candidateGeneration,
532
- candidateDigest: recovery?.candidateDigest,
533
- lkgGeneration: recovery?.lkgGeneration,
534
- candidateFailure: recovery?.candidateFailure,
535
- deviceEpoch: recovery?.deviceEpoch ?? 0,
536
- format: input.format,
537
- passCount: input.passCount ?? 0,
538
- sampleCount: input.sampleCount ?? 0,
539
- memoryBytes: input.memoryBytes ?? 0,
540
- resourceFacts: input.resourceFacts,
541
- selectedLight: recovery?.selectedLight,
542
- candidateSelectedLight: recovery?.candidateSelectedLight
543
- });
848
+ return { ok: true, bindings, diagnostics };
544
849
  }
545
850
  function hasVolumetricFogCapability(caps, shaders) {
546
851
  return caps.compute && caps.storageTexture && shaders !== void 0;
@@ -689,7 +994,7 @@ function resolveVisibility(world, hierarchy = projectHierarchy(world)) {
689
994
  return result;
690
995
  };
691
996
  };
692
- return {
997
+ const snapshot = {
693
998
  diagnostics: hierarchy.diagnostics,
694
999
  hasAnyIntent: intentCount > 0,
695
1000
  hasAnyHiddenIntent,
@@ -702,6 +1007,7 @@ function resolveVisibility(world, hierarchy = projectHierarchy(world)) {
702
1007
  return resolveEntity?.(entity)?.effective ?? "visible";
703
1008
  }
704
1009
  };
1010
+ return snapshot;
705
1011
  }
706
1012
  var VolumetricFog = defineComponent("VolumetricFog", {
707
1013
  light: { type: "entity" },
@@ -747,6 +1053,6 @@ function extractVolumetricFog(inputs) {
747
1053
  return ok({ status: "available", fog: validated.value });
748
1054
  }
749
1055
 
750
- export { ANTIALIAS_FXAA, ANTIALIAS_MSAA, ANTIALIAS_NONE, ANTIALIAS_TAA, Atmosphere, BLOOM_DISABLED, BLOOM_ENABLED, CAMERA_PROJECTION_ORTHOGRAPHIC, CAMERA_PROJECTION_PERSPECTIVE, Camera, DirectionalLight, Fog, Instances, Layer, Lines, MeshFilter, MeshRenderer, MotionBlur, PointLight, PointLightShadow, PointShapeValue, Points, PostProcessParams, SKYBOX_MODE_CUBEMAP, SceneInstance, SkyboxBackground, Skylight, SortKey, SpotLight, TONEMAP_ACES_FILMIC, TONEMAP_AGX, TONEMAP_CINEON, TONEMAP_LINEAR, TONEMAP_NEUTRAL, TONEMAP_NONE, TONEMAP_REINHARD, TONEMAP_REINHARD_EXTENDED, Visibility, VisibilityStateValue, VolumetricFog, admitPointsLines, antialiasFromF32, bloomEnabledFromF32, cameraProjectionFromF32, extractVolumetricFog, hasVolumetricFogCapability, inspectVolumetricFog, orthographic, perspective, pointShapeFromU32, resolveIntegratedVolumeConsumer, resolveSelectedVolumetricLight, resolveVisibility, resolveVolumetricFogLightPair, tonemapFromF32, tonemapToU32, validateVolumetricFog, visibilityStateFromU32 };
751
- //# sourceMappingURL=chunk-CDTWTHZR.mjs.map
752
- //# sourceMappingURL=chunk-CDTWTHZR.mjs.map
1056
+ export { ANTIALIAS_FXAA, ANTIALIAS_MSAA, ANTIALIAS_NONE, ANTIALIAS_TAA, Atmosphere, BLOOM_DISABLED, BLOOM_ENABLED, CAMERA_PROJECTION_ORTHOGRAPHIC, CAMERA_PROJECTION_PERSPECTIVE, CUBE_CAMERA_FACE_ORDER, CUBE_CAMERA_UPDATE_CONTINUOUS, CUBE_CAMERA_UPDATE_ONCE, CUBE_CAMERA_UPDATE_ON_DEMAND, Camera, CubeCamera, DirectionalLight, DirectionalShadowFilterValue, Fog, Instances, Layer, LightProbe, Lines, MeshFilter, MeshRenderer, MotionBlur, PointLight, PointLightShadow, PointShapeValue, Points, PostProcessParams, REFLECTION_PROBE_UPDATE_CONTINUOUS, REFLECTION_PROBE_UPDATE_ONCE, REFLECTION_PROBE_UPDATE_ON_CHANGE, RectAreaLight, ReflectionProbe, SKYBOX_MODE_CUBEMAP, SceneInstance, SkyboxBackground, Skylight, SortKey, SpotLight, TONEMAP_ACES_FILMIC, TONEMAP_AGX, TONEMAP_CINEON, TONEMAP_LINEAR, TONEMAP_NEUTRAL, TONEMAP_NONE, TONEMAP_REINHARD, TONEMAP_REINHARD_EXTENDED, Visibility, VisibilityStateValue, VolumetricFog, antialiasFromF32, bloomEnabledFromF32, cameraProjectionFromF32, computeInvRangeSquared, createVisibilityBudget, cubeCameraUpdateIntentFromF32, cubeCameraUpdateIntentToF32, degToCos, directionalShadowQualityFromF32, extractVolumetricFog, hasVolumetricFogCapability, orthographic, perspective, pointShapeFromU32, projectMeshMaterialBindingObservation, reflectionProbeUpdateIntentFromF32, reflectionProbeUpdateIntentToF32, resolveIntegratedVolumeConsumer, resolveMeshMaterialBindings, resolveSelectedVolumetricLight, resolveVisibility, resolveVolumetricFogLightPair, summarizeMeshMaterialBindings, tonemapFromF32, tonemapToU32, validateDirection, validateDirectionalLightData, validateLightProbeData, validatePointLightData, validatePointLightShadowData, validateRectAreaLightData, validateSpotLightData, validateVolumetricFog, visibilityStateFromU32 };
1057
+ //# sourceMappingURL=chunk-FF7K3FSO.mjs.map
1058
+ //# sourceMappingURL=chunk-FF7K3FSO.mjs.map