@forgeax/engine-render 0.1.19 → 0.1.21

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 (452) hide show
  1. package/README.md +215 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/assembly/device-feature-admission.d.ts +18 -0
  4. package/dist/assembly/device-feature-admission.d.ts.map +1 -0
  5. package/dist/assembly/directional-shadow-inspection.d.ts +38 -0
  6. package/dist/assembly/directional-shadow-inspection.d.ts.map +1 -0
  7. package/dist/assembly/factory.d.ts +34 -20
  8. package/dist/assembly/factory.d.ts.map +1 -1
  9. package/dist/assembly/host-contract.d.ts +9 -0
  10. package/dist/assembly/host-contract.d.ts.map +1 -1
  11. package/dist/assembly/render-target-host.d.ts +46 -0
  12. package/dist/assembly/render-target-host.d.ts.map +1 -0
  13. package/dist/assets/render-asset-port.d.ts.map +1 -1
  14. package/dist/authoring.mjs +3 -0
  15. package/dist/authoring.mjs.map +1 -1
  16. package/dist/capture/cube-views.d.ts +21 -0
  17. package/dist/capture/cube-views.d.ts.map +1 -0
  18. package/dist/capture/scheduler.d.ts +54 -0
  19. package/dist/capture/scheduler.d.ts.map +1 -0
  20. package/dist/{chunk-RJRUS55L.mjs → chunk-5YADUCA7.mjs} +1896 -1624
  21. package/dist/chunk-5YADUCA7.mjs.map +1 -0
  22. package/dist/{chunk-LOSO4CTV.mjs → chunk-6OPXDQ2E.mjs} +423 -46
  23. package/dist/chunk-6OPXDQ2E.mjs.map +1 -0
  24. package/dist/{chunk-IPXCABEP.mjs → chunk-BXBQQKFQ.mjs} +3 -9
  25. package/dist/chunk-BXBQQKFQ.mjs.map +1 -0
  26. package/dist/chunk-FS2KNUQH.mjs +1294 -0
  27. package/dist/chunk-FS2KNUQH.mjs.map +1 -0
  28. package/dist/components/camera.d.ts +1 -0
  29. package/dist/components/camera.d.ts.map +1 -1
  30. package/dist/components/cube-camera.d.ts +20 -0
  31. package/dist/components/cube-camera.d.ts.map +1 -0
  32. package/dist/components/directional-light.d.ts +11 -2
  33. package/dist/components/directional-light.d.ts.map +1 -1
  34. package/dist/components/directional-shadow-filter.d.ts +25 -0
  35. package/dist/components/directional-shadow-filter.d.ts.map +1 -0
  36. package/dist/components/index.d.ts +2 -0
  37. package/dist/components/index.d.ts.map +1 -1
  38. package/dist/components/light-helpers.d.ts.map +1 -1
  39. package/dist/components/reflection-probe.d.ts +17 -0
  40. package/dist/components/reflection-probe.d.ts.map +1 -0
  41. package/dist/components/spot-light.d.ts +12 -0
  42. package/dist/components/spot-light.d.ts.map +1 -1
  43. package/dist/construct-renderer.mjs +8552 -1612
  44. package/dist/construct-renderer.mjs.map +1 -1
  45. package/dist/device/gpu-residency.d.ts +19 -2
  46. package/dist/device/gpu-residency.d.ts.map +1 -1
  47. package/dist/environment/frame.d.ts.map +1 -1
  48. package/dist/environment/lifecycle.d.ts +5 -0
  49. package/dist/environment/lifecycle.d.ts.map +1 -1
  50. package/dist/errors/render.d.ts +209 -93
  51. package/dist/errors/render.d.ts.map +1 -1
  52. package/dist/extract/directional-shadow-projection.d.ts +23 -0
  53. package/dist/extract/directional-shadow-projection.d.ts.map +1 -0
  54. package/dist/extract/environment.d.ts +14 -0
  55. package/dist/extract/environment.d.ts.map +1 -1
  56. package/dist/extract/visibility.d.ts.map +1 -1
  57. package/dist/features/fullscreen.d.ts.map +1 -1
  58. package/dist/features/targets.d.ts.map +1 -1
  59. package/dist/features/types.d.ts +10 -0
  60. package/dist/features/types.d.ts.map +1 -1
  61. package/dist/fullscreen-post-process-pass.d.ts +13 -2
  62. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  63. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  64. package/dist/gpu-driven/production-raster.d.ts +0 -1
  65. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  66. package/dist/gpu-scene.d.ts.map +1 -1
  67. package/dist/gpu-usage.d.ts +2 -0
  68. package/dist/gpu-usage.d.ts.map +1 -1
  69. package/dist/hdrp-buffers.d.ts +19 -17
  70. package/dist/hdrp-buffers.d.ts.map +1 -1
  71. package/dist/ibl/IblPipelineCache.d.ts +4 -0
  72. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  73. package/dist/ibl/kernel-cache.d.ts +36 -0
  74. package/dist/ibl/kernel-cache.d.ts.map +1 -0
  75. package/dist/index.d.ts +35 -4
  76. package/dist/index.d.ts.map +1 -1
  77. package/dist/index.mjs +4 -4
  78. package/dist/index.mjs.map +1 -1
  79. package/dist/inspection-types.d.ts +51 -0
  80. package/dist/inspection-types.d.ts.map +1 -1
  81. package/dist/instances-derived-bounds.d.ts +50 -0
  82. package/dist/instances-derived-bounds.d.ts.map +1 -0
  83. package/dist/internal.mjs +1 -1
  84. package/dist/light-buffer-layout.d.ts +30 -13
  85. package/dist/light-buffer-layout.d.ts.map +1 -1
  86. package/dist/mesh-material-bindings.d.ts +54 -0
  87. package/dist/mesh-material-bindings.d.ts.map +1 -1
  88. package/dist/pbr-pipeline.d.ts +20 -7
  89. package/dist/pbr-pipeline.d.ts.map +1 -1
  90. package/dist/pipeline/standard-forward-lane.d.ts +2 -1
  91. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  92. package/dist/pipeline/standard-lighting/errors.d.ts +4 -0
  93. package/dist/pipeline/standard-lighting/errors.d.ts.map +1 -0
  94. package/dist/pipeline/standard-lighting/graph.d.ts +24 -0
  95. package/dist/pipeline/standard-lighting/graph.d.ts.map +1 -0
  96. package/dist/pipeline/standard-lighting/inspection.d.ts +38 -0
  97. package/dist/pipeline/standard-lighting/inspection.d.ts.map +1 -0
  98. package/dist/pipeline/standard-lighting/layout.d.ts +28 -0
  99. package/dist/pipeline/standard-lighting/layout.d.ts.map +1 -0
  100. package/dist/pipeline/standard-lighting/light-frame.d.ts +33 -0
  101. package/dist/pipeline/standard-lighting/light-frame.d.ts.map +1 -0
  102. package/dist/pipeline/standard-lighting/membership.d.ts +14 -0
  103. package/dist/pipeline/standard-lighting/membership.d.ts.map +1 -0
  104. package/dist/pipeline/standard-lighting/prepare.d.ts +16 -0
  105. package/dist/pipeline/standard-lighting/prepare.d.ts.map +1 -0
  106. package/dist/pipeline/standard-lighting/topology.d.ts +45 -0
  107. package/dist/pipeline/standard-lighting/topology.d.ts.map +1 -0
  108. package/dist/pipeline/standard-lighting/transport.d.ts +36 -0
  109. package/dist/pipeline/standard-lighting/transport.d.ts.map +1 -0
  110. package/dist/pipeline/standard-pipeline.d.ts +4 -13
  111. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  112. package/dist/pipeline/standard-post.d.ts.map +1 -1
  113. package/dist/pipeline/standard-profile.d.ts +12 -20
  114. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  115. package/dist/pipeline-spec.d.ts +40 -7
  116. package/dist/pipeline-spec.d.ts.map +1 -1
  117. package/dist/point-shadow-inspection.d.ts +21 -0
  118. package/dist/point-shadow-inspection.d.ts.map +1 -0
  119. package/dist/record/frame-lighting.d.ts +29 -32
  120. package/dist/record/frame-lighting.d.ts.map +1 -1
  121. package/dist/record/frame-snapshot.d.ts +65 -15
  122. package/dist/record/frame-snapshot.d.ts.map +1 -1
  123. package/dist/record/frame-targets.d.ts +5 -0
  124. package/dist/record/frame-targets.d.ts.map +1 -1
  125. package/dist/record/frame.d.ts +12 -5
  126. package/dist/record/frame.d.ts.map +1 -1
  127. package/dist/record/gpu-pass-timing/contract.d.ts +96 -0
  128. package/dist/record/gpu-pass-timing/contract.d.ts.map +1 -0
  129. package/dist/record/gpu-pass-timing/errors.d.ts +18 -0
  130. package/dist/record/gpu-pass-timing/errors.d.ts.map +1 -0
  131. package/dist/record/gpu-pass-timing/index.d.ts +8 -0
  132. package/dist/record/gpu-pass-timing/index.d.ts.map +1 -0
  133. package/dist/record/gpu-pass-timing/parser.d.ts +11 -0
  134. package/dist/record/gpu-pass-timing/parser.d.ts.map +1 -0
  135. package/dist/record/gpu-pass-timing/session.d.ts +43 -0
  136. package/dist/record/gpu-pass-timing/session.d.ts.map +1 -0
  137. package/dist/record/gpu-timing.d.ts +37 -0
  138. package/dist/record/gpu-timing.d.ts.map +1 -0
  139. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  140. package/dist/record/main-pass-material.d.ts +23 -2
  141. package/dist/record/main-pass-material.d.ts.map +1 -1
  142. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  143. package/dist/record/main-pass.d.ts +2 -0
  144. package/dist/record/main-pass.d.ts.map +1 -1
  145. package/dist/record/render-context.d.ts +48 -3
  146. package/dist/record/render-context.d.ts.map +1 -1
  147. package/dist/record/shadow-pass.d.ts.map +1 -1
  148. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  149. package/dist/record/typed-frame-graph.d.ts +81 -5
  150. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  151. package/dist/record/view-ubo.d.ts +7 -4
  152. package/dist/record/view-ubo.d.ts.map +1 -1
  153. package/dist/reflection/filter.d.ts +22 -0
  154. package/dist/reflection/filter.d.ts.map +1 -0
  155. package/dist/reflection/gpu-table.d.ts +25 -0
  156. package/dist/reflection/gpu-table.d.ts.map +1 -0
  157. package/dist/reflection/projection.d.ts +91 -0
  158. package/dist/reflection/projection.d.ts.map +1 -0
  159. package/dist/render-contract.d.ts +114 -7
  160. package/dist/render-contract.d.ts.map +1 -1
  161. package/dist/render-data.d.ts +10 -6
  162. package/dist/render-data.d.ts.map +1 -1
  163. package/dist/render-graph-primitives.d.ts +1 -0
  164. package/dist/render-graph-primitives.d.ts.map +1 -1
  165. package/dist/render-pipeline.d.ts +78 -2
  166. package/dist/render-pipeline.d.ts.map +1 -1
  167. package/dist/render-system-extract.d.ts +113 -20
  168. package/dist/render-system-extract.d.ts.map +1 -1
  169. package/dist/render-system.d.ts +24 -3
  170. package/dist/render-system.d.ts.map +1 -1
  171. package/dist/renderer-inspect.d.ts +29 -0
  172. package/dist/renderer-inspect.d.ts.map +1 -0
  173. package/dist/renderer.d.ts +43 -0
  174. package/dist/renderer.d.ts.map +1 -0
  175. package/dist/scene/render-scene.d.ts +14 -0
  176. package/dist/scene/render-scene.d.ts.map +1 -1
  177. package/dist/shadow-atlas.d.ts +3 -3
  178. package/dist/shadow-atlas.d.ts.map +1 -1
  179. package/dist/ssao-buffers.d.ts +3 -0
  180. package/dist/ssao-buffers.d.ts.map +1 -1
  181. package/dist/targets/contracts.d.ts +66 -0
  182. package/dist/targets/contracts.d.ts.map +1 -0
  183. package/dist/targets/graph-projection.d.ts +29 -0
  184. package/dist/targets/graph-projection.d.ts.map +1 -0
  185. package/dist/targets/material-source.d.ts +34 -0
  186. package/dist/targets/material-source.d.ts.map +1 -0
  187. package/dist/targets/owner.d.ts +32 -0
  188. package/dist/targets/owner.d.ts.map +1 -0
  189. package/dist/targets/physical.d.ts +18 -0
  190. package/dist/targets/physical.d.ts.map +1 -0
  191. package/dist/targets/readback.d.ts +39 -0
  192. package/dist/targets/readback.d.ts.map +1 -0
  193. package/dist/temporal/frame.d.ts +44 -0
  194. package/dist/temporal/frame.d.ts.map +1 -0
  195. package/dist/temporal/index.mjs +3 -3
  196. package/dist/typed-render-graph-primitives.d.ts +6 -1
  197. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  198. package/dist/typed-shadow-atlas.d.ts +10 -0
  199. package/dist/typed-shadow-atlas.d.ts.map +1 -0
  200. package/dist/typed-shadow-passes.d.ts +1 -1
  201. package/dist/typed-shadow-passes.d.ts.map +1 -1
  202. package/dist/volume/capability.d.ts +57 -0
  203. package/dist/volume/capability.d.ts.map +1 -0
  204. package/dist/volume/component.d.ts +61 -0
  205. package/dist/volume/component.d.ts.map +1 -0
  206. package/dist/volume/extract.d.ts +11 -0
  207. package/dist/volume/extract.d.ts.map +1 -0
  208. package/dist/volume/inspection.d.ts +38 -0
  209. package/dist/volume/inspection.d.ts.map +1 -0
  210. package/dist/volume/passes.d.ts +38 -0
  211. package/dist/volume/passes.d.ts.map +1 -0
  212. package/dist/volume/recovery.d.ts +38 -0
  213. package/dist/volume/recovery.d.ts.map +1 -0
  214. package/dist/volume/resources.d.ts +57 -0
  215. package/dist/volume/resources.d.ts.map +1 -0
  216. package/dist/volume/temporal.d.ts +35 -0
  217. package/dist/volume/temporal.d.ts.map +1 -0
  218. package/package.json +20 -20
  219. package/src/__tests__/bloom-exact-zero.unit.test.ts +48 -19
  220. package/src/__tests__/bloom-lifecycle.integration.test.ts +41 -13
  221. package/src/__tests__/camera-target-consumption.unit.test.ts +53 -0
  222. package/src/__tests__/cluster-binner.unit.test.ts +35 -0
  223. package/src/__tests__/cluster-grid-default-surface.unit.test.ts +7 -2
  224. package/src/__tests__/cube-camera-scheduler.unit.test.ts +70 -0
  225. package/src/__tests__/cube-camera-single-submit.perf.test.ts +75 -0
  226. package/src/__tests__/cube-camera-view-matrices.unit.test.ts +41 -0
  227. package/src/__tests__/cube-camera-vocabulary.unit.test.ts +47 -0
  228. package/src/__tests__/cube-camera.integration.test.ts +42 -0
  229. package/src/__tests__/device-feature-admission.unit.test.ts +73 -0
  230. package/src/__tests__/direct-light-snapshot.unit.test.ts +3 -3
  231. package/src/__tests__/docs-gate-green.unit.test.ts +38 -0
  232. package/src/__tests__/factory-contract.integration.test.ts +255 -29
  233. package/src/__tests__/fog-component.unit.test.ts +67 -0
  234. package/src/__tests__/fog.integration.test.ts +86 -0
  235. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +37 -0
  236. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +10 -9
  237. package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +17 -1
  238. package/src/__tests__/gpu-driven-production.integration.test.ts +16 -17
  239. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +12 -4
  240. package/src/__tests__/gpu-pass-timing-browser-runner.ts +281 -0
  241. package/src/__tests__/gpu-pass-timing-coexistence.integration.test.ts +80 -0
  242. package/src/__tests__/gpu-pass-timing-contract.unit.test.ts +243 -0
  243. package/src/__tests__/gpu-pass-timing-exact-zero.unit.test.ts +131 -0
  244. package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +230 -0
  245. package/src/__tests__/gpu-pass-timing-observation.unit.test.ts +233 -0
  246. package/src/__tests__/gpu-pass-timing-session.unit.test.ts +438 -0
  247. package/src/__tests__/gpu-pass-timing.browser.test.ts +26 -0
  248. package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +125 -0
  249. package/src/__tests__/hdrp-group2-visibility.unit.test.ts +24 -0
  250. package/src/__tests__/instances-culling.integration.test.ts +94 -0
  251. package/src/__tests__/instances-derived-bounds.unit.test.ts +118 -0
  252. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +14 -14
  253. package/src/__tests__/material-observation.integration.test.ts +101 -0
  254. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +1 -1
  255. package/src/__tests__/pbr-view-layout.unit.test.ts +16 -0
  256. package/src/__tests__/point-shadow-inspection.unit.test.ts +60 -0
  257. package/src/__tests__/public-surface.test-d.ts +10 -0
  258. package/src/__tests__/reflection-probe-authoring.unit.test.ts +71 -0
  259. package/src/__tests__/reflection-probe-filter.unit.test.ts +54 -0
  260. package/src/__tests__/reflection-probe-ibl-topology.unit.test.ts +45 -0
  261. package/src/__tests__/reflection-probe-pass-encode.integration.test.ts +101 -0
  262. package/src/__tests__/reflection-probe-performance.perf.test.ts +60 -0
  263. package/src/__tests__/reflection-probe-recovery.integration.test.ts +55 -0
  264. package/src/__tests__/reflection-probe-selection.unit.test.ts +46 -0
  265. package/src/__tests__/render-error-code-owner.test-d.ts +23 -3
  266. package/src/__tests__/render-feature-docs.unit.test.ts +1 -1
  267. package/src/__tests__/render-target-admission.unit.test.ts +80 -0
  268. package/src/__tests__/render-target-graph-projection.unit.test.ts +102 -0
  269. package/src/__tests__/render-target-inspection.unit.test.ts +52 -0
  270. package/src/__tests__/render-target-material-source.test-d.ts +30 -0
  271. package/src/__tests__/render-target-material-source.unit.test.ts +97 -0
  272. package/src/__tests__/render-target-owner-placement.unit.test.ts +203 -0
  273. package/src/__tests__/render-target-owner.unit.test.ts +122 -0
  274. package/src/__tests__/render-target-probe-soak.perf.test.ts +94 -0
  275. package/src/__tests__/render-target-public-schema.json +107 -0
  276. package/src/__tests__/render-target-public-schema.unit.test.ts +91 -0
  277. package/src/__tests__/render-target-public-surface.test-d.ts +83 -0
  278. package/src/__tests__/render-target-readback.integration.test.ts +90 -0
  279. package/src/__tests__/render-target-recovery.integration.test.ts +85 -0
  280. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +76 -0
  281. package/src/__tests__/renderer-frame-transaction.integration.test.ts +1 -1
  282. package/src/__tests__/renderer-lifecycle.integration.test.ts +14 -0
  283. package/src/__tests__/shader-stage-surface.unit.test.ts +19 -4
  284. package/src/__tests__/skin-motion-regression.unit.test.ts +132 -0
  285. package/src/__tests__/skinned-shadow-caster.test.ts +32 -2
  286. package/src/__tests__/standard-cluster-capability.integration.test.ts +63 -0
  287. package/src/__tests__/standard-cluster-transport.unit.test.ts +121 -0
  288. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +232 -0
  289. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +8 -5
  290. package/src/__tests__/standard-lighting-inspection.integration.test.ts +138 -0
  291. package/src/__tests__/standard-lighting-ssot.unit.test.ts +18 -0
  292. package/src/__tests__/standard-lighting-write.unit.test.ts +377 -0
  293. package/src/__tests__/standard-lighting.integration.test.ts +67 -0
  294. package/src/__tests__/standard-pipeline.dawn.test.ts +206 -5
  295. package/src/__tests__/standard-pipeline.integration.test.ts +181 -150
  296. package/src/__tests__/standard-probe-binding.unit.test.ts +25 -0
  297. package/src/__tests__/standard-profile-oracle.unit.test.ts +23 -36
  298. package/src/__tests__/typed-pipeline-topology.unit.test.ts +395 -14
  299. package/src/__tests__/urp-pipeline-targets.unit.test.ts +2 -2
  300. package/src/__tests__/visibility-resolver.unit.test.ts +15 -0
  301. package/src/__tests__/volume-optics-oracle.unit.test.ts +85 -0
  302. package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +655 -0
  303. package/src/__tests__/volumetric-fog-component.unit.test.ts +71 -0
  304. package/src/__tests__/volumetric-fog-composite-stage-readback.dawn.test.ts +376 -0
  305. package/src/__tests__/volumetric-fog-errors.unit.test.ts +51 -0
  306. package/src/__tests__/volumetric-fog-inspection.unit.test.ts +77 -0
  307. package/src/__tests__/volumetric-fog-light-capability.unit.test.ts +19 -0
  308. package/src/__tests__/volumetric-fog-light-consumers.integration.test.ts +18 -0
  309. package/src/__tests__/volumetric-fog-light-errors.unit.test.ts +17 -0
  310. package/src/__tests__/volumetric-fog-light-topology.unit.test.ts +21 -0
  311. package/src/__tests__/volumetric-fog-light-transaction.integration.test.ts +53 -0
  312. package/src/__tests__/volumetric-fog-m9-watcher.integration.test.ts +27 -0
  313. package/src/__tests__/volumetric-fog-point-light-owner.integration.test.ts +44 -0
  314. package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +49 -0
  315. package/src/__tests__/volumetric-fog-point-spot-contract.unit.test.ts +28 -0
  316. package/src/__tests__/volumetric-fog-point-spot-lkg.integration.test.ts +65 -0
  317. package/src/__tests__/volumetric-fog-point-spot-selection.integration.test.ts +49 -0
  318. package/src/__tests__/volumetric-fog-point-spot-temporal.unit.test.ts +55 -0
  319. package/src/__tests__/volumetric-fog-projector-contract.unit.test.ts +22 -0
  320. package/src/__tests__/volumetric-fog-projector-inspection.unit.test.ts +12 -0
  321. package/src/__tests__/volumetric-fog-projector-surface-volume.integration.test.ts +11 -0
  322. package/src/__tests__/volumetric-fog-projector-transaction.integration.test.ts +26 -0
  323. package/src/__tests__/volumetric-fog-recovery.integration.test.ts +47 -0
  324. package/src/__tests__/volumetric-fog-selected-light-resolution.integration.test.ts +63 -0
  325. package/src/__tests__/volumetric-fog-spot-closure.integration.test.ts +26 -0
  326. package/src/__tests__/volumetric-fog-spot-contract.test-d.ts +21 -0
  327. package/src/__tests__/volumetric-fog-spot-contract.unit.test.ts +27 -0
  328. package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +14 -0
  329. package/src/__tests__/volumetric-fog-spot-optics.integration.test.ts +29 -0
  330. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +550 -0
  331. package/src/__tests__/volumetric-fog-temporal-selected-light.unit.test.ts +33 -0
  332. package/src/__tests__/volumetric-fog-temporal.unit.test.ts +45 -0
  333. package/src/__tests__/volumetric-fog-topology.unit.test.ts +237 -0
  334. package/src/__tests__/volumetric-fog-transparent.integration.test.ts +27 -0
  335. package/src/assembly/device-feature-admission.ts +73 -0
  336. package/src/assembly/directional-shadow-inspection.ts +122 -0
  337. package/src/assembly/factory.ts +1093 -246
  338. package/src/assembly/host-contract.ts +25 -0
  339. package/src/assembly/render-target-host.ts +847 -0
  340. package/src/assets/asset-decoders.ts +1 -1
  341. package/src/assets/render-asset-port.ts +7 -1
  342. package/src/capture/cube-views.ts +69 -0
  343. package/src/capture/scheduler.ts +265 -0
  344. package/src/components/__tests__/schema-contract.unit.test.ts +12 -0
  345. package/src/components/__tests__/schema-parity.unit.test.ts +9 -0
  346. package/src/components/camera.ts +4 -0
  347. package/src/components/cube-camera.ts +52 -0
  348. package/src/components/directional-light.ts +22 -2
  349. package/src/components/directional-shadow-filter.ts +57 -0
  350. package/src/components/index.ts +2 -0
  351. package/src/components/light-helpers.ts +85 -7
  352. package/src/components/reflection-probe.ts +49 -0
  353. package/src/components/spot-light.ts +22 -3
  354. package/src/device/gpu-residency.ts +168 -58
  355. package/src/environment/frame.ts +6 -24
  356. package/src/environment/lifecycle.ts +12 -0
  357. package/src/errors/render.ts +405 -143
  358. package/src/extract/directional-shadow-projection.ts +61 -0
  359. package/src/extract/environment.ts +57 -0
  360. package/src/extract/visibility.ts +25 -1
  361. package/src/features/fullscreen.ts +3 -0
  362. package/src/features/targets.ts +4 -1
  363. package/src/features/types.ts +10 -0
  364. package/src/fullscreen-post-process-pass.ts +43 -2
  365. package/src/gpu-driven/batch-topology.ts +1 -0
  366. package/src/gpu-driven/production-raster.ts +1 -3
  367. package/src/gpu-scene.ts +8 -1
  368. package/src/gpu-usage.ts +2 -0
  369. package/src/hdrp-buffers.ts +165 -59
  370. package/src/ibl/IblPipelineCache.ts +11 -0
  371. package/src/ibl/kernel-cache.ts +88 -0
  372. package/src/index.ts +186 -1
  373. package/src/inspection-types.ts +56 -0
  374. package/src/instances-derived-bounds.ts +171 -0
  375. package/src/light-buffer-layout.ts +74 -26
  376. package/src/mesh-material-bindings.ts +132 -0
  377. package/src/pbr-pipeline.ts +139 -27
  378. package/src/pipeline/standard-forward-lane.ts +65 -15
  379. package/src/pipeline/standard-lighting/errors.ts +6 -0
  380. package/src/pipeline/standard-lighting/graph.ts +157 -0
  381. package/src/pipeline/standard-lighting/inspection.ts +88 -0
  382. package/src/pipeline/standard-lighting/layout.ts +31 -0
  383. package/src/pipeline/standard-lighting/light-frame.ts +34 -0
  384. package/src/pipeline/standard-lighting/membership.ts +43 -0
  385. package/src/pipeline/standard-lighting/prepare.ts +37 -0
  386. package/src/pipeline/standard-lighting/topology.ts +120 -0
  387. package/src/pipeline/standard-lighting/transport.ts +77 -0
  388. package/src/pipeline/standard-pipeline.ts +141 -192
  389. package/src/pipeline/standard-post.ts +26 -7
  390. package/src/pipeline/standard-profile.ts +23 -30
  391. package/src/pipeline-spec.ts +84 -21
  392. package/src/point-shadow-inspection.ts +55 -0
  393. package/src/record/__tests__/temporal-payload.unit.test.ts +42 -1
  394. package/src/record/__tests__/transparent-group2-selection.unit.test.ts +73 -0
  395. package/src/record/__tests__/view-ubo-layout.unit.test.ts +40 -0
  396. package/src/record/frame-lighting.ts +470 -516
  397. package/src/record/frame-snapshot.ts +76 -28
  398. package/src/record/frame-targets.ts +23 -2
  399. package/src/record/frame.ts +1169 -79
  400. package/src/record/gpu-pass-timing/contract.ts +180 -0
  401. package/src/record/gpu-pass-timing/errors.ts +34 -0
  402. package/src/record/gpu-pass-timing/index.ts +37 -0
  403. package/src/record/gpu-pass-timing/parser.ts +97 -0
  404. package/src/record/gpu-pass-timing/session.ts +938 -0
  405. package/src/record/gpu-timing.ts +233 -0
  406. package/src/record/main-pass-geometry.ts +120 -80
  407. package/src/record/main-pass-material.ts +101 -11
  408. package/src/record/main-pass-sprite-draws.ts +54 -25
  409. package/src/record/main-pass.ts +71 -15
  410. package/src/record/render-context.ts +77 -0
  411. package/src/record/shadow-pass.ts +104 -66
  412. package/src/record/skybox-post-pass.ts +20 -4
  413. package/src/record/typed-frame-graph.ts +1016 -32
  414. package/src/record/view-ubo.ts +63 -28
  415. package/src/reflection/filter.ts +81 -0
  416. package/src/reflection/gpu-table.ts +44 -0
  417. package/src/reflection/projection.ts +281 -0
  418. package/src/render-contract.ts +147 -4
  419. package/src/render-data.ts +50 -22
  420. package/src/render-graph-primitives.ts +9 -4
  421. package/src/render-pipeline.ts +161 -2
  422. package/src/render-system-extract.ts +886 -103
  423. package/src/render-system.ts +1174 -66
  424. package/src/renderer-inspect.ts +66 -0
  425. package/src/renderer.ts +222 -0
  426. package/src/scene/render-scene.ts +117 -9
  427. package/src/shadow-atlas.ts +5 -5
  428. package/src/ssao-buffers.ts +9 -2
  429. package/src/targets/contracts.ts +182 -0
  430. package/src/targets/graph-projection.ts +169 -0
  431. package/src/targets/material-source.ts +143 -0
  432. package/src/targets/owner.ts +214 -0
  433. package/src/targets/physical.ts +18 -0
  434. package/src/targets/readback.ts +153 -0
  435. package/src/temporal/frame.ts +128 -0
  436. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +61 -23
  437. package/src/typed-render-graph-primitives.ts +34 -2
  438. package/src/typed-shadow-atlas.ts +17 -0
  439. package/src/typed-shadow-passes.ts +47 -40
  440. package/src/volume/capability.ts +173 -0
  441. package/src/volume/component.ts +110 -0
  442. package/src/volume/extract.ts +21 -0
  443. package/src/volume/inspection.ts +78 -0
  444. package/src/volume/passes.ts +686 -0
  445. package/src/volume/recovery.ts +86 -0
  446. package/src/volume/resources.ts +236 -0
  447. package/src/volume/temporal.ts +89 -0
  448. package/dist/chunk-IPXCABEP.mjs.map +0 -1
  449. package/dist/chunk-LOSO4CTV.mjs.map +0 -1
  450. package/dist/chunk-RJRUS55L.mjs.map +0 -1
  451. package/dist/chunk-YTQ5C7YQ.mjs +0 -584
  452. package/dist/chunk-YTQ5C7YQ.mjs.map +0 -1
@@ -1,584 +0,0 @@
1
- import { PointsLinesBudgetExceededError, PointsLinesStyleUnsupportedError, PointsLinesMaterialUnsupportedError, PointsLinesInvalidStyleError, PointsLinesTopologyMismatchError } from './chunk-LOSO4CTV.mjs';
2
- import { defineComponent } from '@forgeax/engine-ecs';
3
- import { TONEMAP_SHADER_MODE } from '@forgeax/engine-shader';
4
- import { err, ok } from '@forgeax/engine-types';
5
- import { projectHierarchy } from '@forgeax/engine-scene';
6
-
7
- var Atmosphere = defineComponent("Atmosphere", {
8
- turbidity: { type: "f32", default: 2 },
9
- rayleigh: { type: "f32", default: 1 },
10
- mieCoefficient: { type: "f32", default: 5e-3 },
11
- mieDirectionalG: { type: "f32", default: 0.8 },
12
- sunAngularRadius: { type: "f32", default: 4675e-6 }
13
- });
14
- var CAMERA_PROJECTION_PERSPECTIVE = 0;
15
- var CAMERA_PROJECTION_ORTHOGRAPHIC = 1;
16
- function cameraProjectionFromF32(value) {
17
- return value === CAMERA_PROJECTION_ORTHOGRAPHIC ? "orthographic" : "perspective";
18
- }
19
- var TONEMAP_NONE = TONEMAP_SHADER_MODE.none;
20
- var TONEMAP_REINHARD_EXTENDED = TONEMAP_SHADER_MODE.reinhardExtended;
21
- var TONEMAP_REINHARD = TONEMAP_SHADER_MODE.reinhard;
22
- var TONEMAP_LINEAR = TONEMAP_SHADER_MODE.linear;
23
- var TONEMAP_CINEON = TONEMAP_SHADER_MODE.cineon;
24
- var TONEMAP_ACES_FILMIC = TONEMAP_SHADER_MODE.acesFilmic;
25
- var TONEMAP_AGX = TONEMAP_SHADER_MODE.agx;
26
- var TONEMAP_NEUTRAL = TONEMAP_SHADER_MODE.neutral;
27
- function tonemapFromF32(value) {
28
- switch (value) {
29
- case TONEMAP_REINHARD_EXTENDED:
30
- return "reinhard-extended";
31
- case TONEMAP_REINHARD:
32
- return "reinhard";
33
- case TONEMAP_LINEAR:
34
- return "linear";
35
- case TONEMAP_CINEON:
36
- return "cineon";
37
- case TONEMAP_ACES_FILMIC:
38
- return "aces-filmic";
39
- case TONEMAP_AGX:
40
- return "agx";
41
- case TONEMAP_NEUTRAL:
42
- return "neutral";
43
- default:
44
- return "none";
45
- }
46
- }
47
- function tonemapToU32(mode) {
48
- switch (mode) {
49
- case "reinhard-extended":
50
- return TONEMAP_REINHARD_EXTENDED;
51
- case "reinhard":
52
- return TONEMAP_REINHARD;
53
- case "linear":
54
- return TONEMAP_LINEAR;
55
- case "cineon":
56
- return TONEMAP_CINEON;
57
- case "aces-filmic":
58
- return TONEMAP_ACES_FILMIC;
59
- case "agx":
60
- return TONEMAP_AGX;
61
- case "neutral":
62
- return TONEMAP_NEUTRAL;
63
- case "none":
64
- return TONEMAP_NONE;
65
- }
66
- throw new RangeError(`Invalid tonemap mode: ${String(mode)}.`);
67
- }
68
- var ANTIALIAS_NONE = 0;
69
- var ANTIALIAS_FXAA = 1;
70
- var ANTIALIAS_MSAA = 2;
71
- var ANTIALIAS_TAA = 3;
72
- function antialiasFromF32(value) {
73
- if (value === ANTIALIAS_NONE) return "none";
74
- if (value === ANTIALIAS_FXAA) return "fxaa";
75
- if (value === ANTIALIAS_MSAA) return "msaa";
76
- if (value === ANTIALIAS_TAA) return "taa";
77
- throw new RangeError(
78
- `Invalid antialias value: ${value}. Expected ${ANTIALIAS_NONE} (none), ${ANTIALIAS_FXAA} (fxaa), ${ANTIALIAS_MSAA} (msaa), or ${ANTIALIAS_TAA} (taa).`
79
- );
80
- }
81
- var BLOOM_DISABLED = 0;
82
- var BLOOM_ENABLED = 1;
83
- function bloomEnabledFromF32(value) {
84
- if (value === BLOOM_DISABLED) return "off";
85
- if (value === BLOOM_ENABLED) return "on";
86
- throw new RangeError(
87
- `Invalid bloom value: ${value}. Expected ${BLOOM_DISABLED} (off) or ${BLOOM_ENABLED} (on).`
88
- );
89
- }
90
- var Camera = defineComponent("Camera", {
91
- fov: { type: "f32" },
92
- aspect: { type: "f32" },
93
- near: { type: "f32" },
94
- far: { type: "f32" },
95
- projection: { type: "f32", default: 0 },
96
- left: { type: "f32", default: -1 },
97
- right: { type: "f32", default: 1 },
98
- bottom: { type: "f32", default: -1 },
99
- top: { type: "f32", default: 1 },
100
- tonemap: { type: "f32", default: 0 },
101
- exposure: { type: "f32", default: 1 },
102
- whitePoint: { type: "f32", default: 4 },
103
- antialias: { type: "f32", default: 0 },
104
- historyVersion: { type: "u32", default: 0 },
105
- bloom: { type: "f32", default: 0 },
106
- bloomThreshold: { type: "f32", default: 1 },
107
- bloomIntensity: { type: "f32", default: 1 },
108
- bloomBlurRadius: { type: "f32", default: 4 },
109
- // feat-20260709 M3 / D-3: clear-color is one inline `array<f32,4>` column.
110
- // The earlier 4-scalar form (clearR/G/B/A) was chosen when this was believed
111
- // to be the only SoA-safe shape; the Transform (pos/quat/scale) and light
112
- // (direction/color) precedents disprove that -- an `array<f32,N>` IS an
113
- // inline stride-N SoA column, read on the hot path as `col[i*N+a]` with zero
114
- // allocation, so collapsing four scalars into one column removes three field
115
- // names a reader must track without changing the storage layout or read
116
- // pattern. The default `[0, 0, 0, 0]` is transparent black; explicit alpha
117
- // stays visible through the same public array field.
118
- clearColor: { type: "array<f32, 4>", default: new Float32Array([0, 0, 0, 0]) },
119
- // feat-20260617-host-engine-contract-and-video-cutscene / M3 / D-4: the
120
- // aspect-sync sidecar on the createApp(canvas) path writes
121
- // canvas.width / canvas.height into `aspect` every frame when this flag is
122
- // true. Reuses the existing `bool` column tier (AnimationPlayer.paused /
123
- // AudioSource.playing precedent) -- zero ECS infrastructure change. Default
124
- // true so demos that never touch aspect track the canvas automatically
125
- // (charter P1 default-is-correct); set false for render-to-texture /
126
- // split-screen cameras that drive aspect themselves. Read it via
127
- // world.get (readRow narrows bool -> JS boolean); the query-bundle path
128
- // returns a raw 0/1 number (the `!== 0` always-true trap).
129
- autoAspect: { type: "bool", default: true }
130
- });
131
- function cameraPodFromDefaults() {
132
- const base = {};
133
- for (const [key, field] of Object.entries(Camera.fields)) {
134
- if ("default" in field && field.default !== void 0) {
135
- base[key] = field.default;
136
- }
137
- }
138
- return base;
139
- }
140
- function perspective(opts) {
141
- return {
142
- // cameraPodFromDefaults() reads autoAspect's schema default (true), so an
143
- // omitted opts.autoAspect lands the default-correct value; an explicit
144
- // false overrides it below (D-4: factory one-step opt-out, charter P1).
145
- ...cameraPodFromDefaults(),
146
- fov: opts.fov,
147
- aspect: opts.aspect,
148
- near: opts.near ?? 0.1,
149
- far: opts.far ?? 100,
150
- projection: CAMERA_PROJECTION_PERSPECTIVE,
151
- ...opts.autoAspect !== void 0 ? { autoAspect: opts.autoAspect } : {}
152
- };
153
- }
154
- function orthographic(opts) {
155
- return {
156
- ...cameraPodFromDefaults(),
157
- fov: 0,
158
- aspect: 1,
159
- near: opts.near ?? 0.1,
160
- far: opts.far ?? 100,
161
- projection: CAMERA_PROJECTION_ORTHOGRAPHIC,
162
- left: opts.left,
163
- right: opts.right,
164
- bottom: opts.bottom,
165
- top: opts.top
166
- };
167
- }
168
- var DirectionalLight = defineComponent("DirectionalLight", {
169
- // direction is the ONLY field with no default (D-5): omitting it lands the
170
- // array layer-3 all-zero [0,0,0], which the renderer owner rejects -- there is no
171
- // universal default direction, so "default is illegal" forces an explicit
172
- // non-zero value. color carries an explicit layer-2 default [1,1,1] (white);
173
- // the array layer-3 fallback is all-zero, so the default MUST be explicit.
174
- direction: { type: "array<f32, 3>" },
175
- color: { type: "array<f32, 3>", default: new Float32Array([1, 1, 1]) },
176
- intensity: { type: "f32", default: 1 },
177
- // Shadow opt-out gate: defaults to true so zero-config spawns get shadows.
178
- castShadow: { type: "bool", default: true },
179
- // 9 shadow fields migrated from DirectionalLightShadow (feat-20260621 M1).
180
- cascadeCount: { type: "f32", default: 4 },
181
- splitLambda: { type: "f32", default: 0.75 },
182
- cascadeBlend: { type: "f32", default: 0.2 },
183
- mapSize: { type: "f32", default: 2048 },
184
- depthBias: { type: "f32", default: 5e-3 },
185
- normalBias: { type: "f32", default: 0.05 },
186
- // Sole shadow coverage knob (feat replaces nearPlane/farPlane). The PSSM
187
- // near end derives from the active camera near; shadowDistance is the far
188
- // reach. Default 200 world units (matches UE-style "dynamic shadow
189
- // distance"; the old farPlane default was 50).
190
- shadowDistance: { type: "f32", default: 200 },
191
- pcfKernelSize: { type: "f32", default: 3 }
192
- });
193
- var Fog = defineComponent("Fog", {
194
- color: { type: "array<f32, 3>", default: new Float32Array([0.5, 0.5, 0.5]) },
195
- density: { type: "f32", default: 0.01 },
196
- heightFalloff: { type: "f32", default: 0 },
197
- maxOpacity: { type: "f32", default: 1 }
198
- });
199
- var Instances = defineComponent("Instances", {
200
- transforms: { type: "array<f32>" }
201
- });
202
- var Layer = defineComponent("Layer", {
203
- value: { type: "i32", default: 0 }
204
- });
205
- var Lines = defineComponent(
206
- "Lines",
207
- {
208
- widthPx: { type: "f32", default: 1 }
209
- },
210
- {
211
- meta: {
212
- quickStart: "Attach Lines to render line-list MeshAsset pairs in screen pixels.",
213
- diagnostics: "Inspect widthPx at the points-lines admission boundary.",
214
- recovery: "Use points-lines-invalid-style for non-finite or non-positive widthPx values.",
215
- boundaries: "Lines owns raster width only; MeshFilter and MeshRenderer own geometry and material."
216
- }
217
- }
218
- );
219
- var MeshFilter = defineComponent("MeshFilter", {
220
- assetHandle: { type: "shared<MeshAsset>" }
221
- });
222
- var MeshRenderer = defineComponent("MeshRenderer", {
223
- materials: { type: "array<shared<MaterialAsset>>", default: [] }
224
- });
225
- var MotionBlur = defineComponent("MotionBlur", {
226
- shutterAngle: { type: "f32", default: 180 },
227
- maxRadiusPixels: { type: "f32", default: 32 },
228
- sampleCount: { type: "f32", default: 8 }
229
- });
230
- var PointLight = defineComponent("PointLight", {
231
- // color carries an explicit layer-2 default [1,1,1] (white); the array
232
- // layer-3 fallback is all-zero, so the default MUST be explicit (D-5).
233
- color: { type: "array<f32, 3>", default: new Float32Array([1, 1, 1]) },
234
- intensity: { type: "f32", default: 1 },
235
- range: { type: "f32", default: 10 }
236
- });
237
- var PointLightShadow = defineComponent("PointLightShadow", {
238
- mapSize: { type: "f32", default: 512 },
239
- depthBias: { type: "f32", default: 5e-3 },
240
- normalBias: { type: "f32", default: 0.05 },
241
- nearPlane: { type: "f32", default: 0.1 },
242
- farPlane: { type: "f32", default: 25 },
243
- pcfKernelSize: { type: "f32", default: 3 }
244
- });
245
- var PointShapeValue = Object.freeze({
246
- square: 0,
247
- circle: 1
248
- });
249
- function pointShapeFromU32(value) {
250
- switch (value) {
251
- case PointShapeValue.square:
252
- return "square";
253
- case PointShapeValue.circle:
254
- return "circle";
255
- default:
256
- return void 0;
257
- }
258
- }
259
- var Points = defineComponent(
260
- "Points",
261
- {
262
- sizePx: { type: "f32", default: 4 },
263
- shape: { type: "enum", default: PointShapeValue.square, labels: PointShapeValue }
264
- },
265
- {
266
- meta: {
267
- quickStart: "Attach Points to render point-list MeshAsset vertices in screen pixels.",
268
- diagnostics: "Inspect sizePx and decode shape with pointShapeFromU32.",
269
- recovery: "Use points-lines-invalid-style for non-finite or non-positive sizePx values.",
270
- boundaries: "Points owns raster size and shape only; MeshFilter and MeshRenderer own geometry and material."
271
- }
272
- }
273
- );
274
- var schema = {
275
- shader: "string",
276
- data: "buffer"
277
- };
278
- var PostProcessParams = defineComponent("PostProcessParams", schema);
279
- var SceneInstance = defineComponent(
280
- "SceneInstance",
281
- {
282
- source: { type: "shared<SceneAsset>" },
283
- mapping: { type: "array<entity>" },
284
- // The unique slot is the ECS storage seam for the instance's structured
285
- // runtime payload; keep the nested semantic visible to schema consumers.
286
- state: { type: "unique<SceneInstanceState>", shape: "nested" }
287
- },
288
- { transient: true }
289
- );
290
- var SKYBOX_MODE_CUBEMAP = 0;
291
- var SkyboxBackground = defineComponent("SkyboxBackground", {
292
- // The GPU skybox projection is render-owned presentation state; restore
293
- // keeps the portable mode/rotation controls and lets the owner re-resolve
294
- // the environment asset on the target world.
295
- equirect: { type: "shared<EquirectAsset>", simulationTransient: true },
296
- mode: { type: "f32", default: SKYBOX_MODE_CUBEMAP },
297
- rotation: { type: "array<f32, 4>", default: new Float32Array([0, 0, 0, 1]) }
298
- });
299
- var Skylight = defineComponent("Skylight", {
300
- // The GPU equirect-to-cubemap projection is render-owned presentation
301
- // state. Record/restore preserves the portable lighting controls while the
302
- // render owner resolves this asset again on the target world.
303
- equirect: { type: "shared<EquirectAsset>", simulationTransient: true },
304
- // color carries an explicit layer-2 default [1,1,1] (white); the array
305
- // layer-3 fallback is all-zero, so the default MUST be explicit (D-5).
306
- color: { type: "array<f32, 3>", default: new Float32Array([1, 1, 1]) },
307
- intensity: { type: "f32", default: 1 },
308
- rotation: { type: "array<f32, 4>", default: new Float32Array([0, 0, 0, 1]) }
309
- });
310
- var SortKey = defineComponent("SortKey", {
311
- value: { type: "f32", default: 0 }
312
- });
313
- var SpotLight = defineComponent("SpotLight", {
314
- // direction has no default (D-5): omitting it lands the array layer-3
315
- // all-zero, which validate() rejects. color carries an explicit layer-2
316
- // default [1,1,1] (white); the array layer-3 fallback is all-zero.
317
- direction: { type: "array<f32, 3>" },
318
- color: { type: "array<f32, 3>", default: new Float32Array([1, 1, 1]) },
319
- intensity: { type: "f32", default: 1 },
320
- range: { type: "f32", default: 10 },
321
- innerConeDeg: { type: "f32", default: 0 },
322
- outerConeDeg: { type: "f32", default: 45 },
323
- // Shadow opt-out gate: defaults to true so zero-config spawns cast shadows.
324
- castShadow: { type: "bool", default: true },
325
- // 6 shadow fields aligned with DirectionalLight (plan-strategy D-6).
326
- mapSize: { type: "f32", default: 2048 },
327
- depthBias: { type: "f32", default: 5e-3 },
328
- normalBias: { type: "f32", default: 0.05 },
329
- nearPlane: { type: "f32", default: 0.1 },
330
- farPlane: { type: "f32", default: 50 },
331
- pcfKernelSize: { type: "f32", default: 3 }
332
- });
333
- var VisibilityStateValue = Object.freeze({
334
- inherited: 0,
335
- hidden: 1,
336
- visible: 2
337
- });
338
- function visibilityStateFromU32(value) {
339
- switch (value) {
340
- case VisibilityStateValue.inherited:
341
- return "inherited";
342
- case VisibilityStateValue.hidden:
343
- return "hidden";
344
- case VisibilityStateValue.visible:
345
- return "visible";
346
- default:
347
- return void 0;
348
- }
349
- }
350
- var Visibility = defineComponent(
351
- "Visibility",
352
- {
353
- state: {
354
- type: "enum",
355
- default: VisibilityStateValue.inherited,
356
- labels: VisibilityStateValue
357
- }
358
- },
359
- {
360
- meta: {
361
- quickStart: "Attach Visibility to author render participation intent.",
362
- diagnostics: "Compare the ECS state with resolveVisibility and renderer.visibilityStats.",
363
- recovery: "Use structured ECS write errors and repair the owning scene relation.",
364
- boundaries: "Visibility does not own camera, picking, lifecycle, assets, or VFX shadow policy."
365
- }
366
- }
367
- );
368
- function invalidStyle(input, component, field, value, expected) {
369
- return err(new PointsLinesInvalidStyleError({ entity: input.entity, component, field, value, expected }));
370
- }
371
- function topologyMismatch(input, submesh, expected, actual) {
372
- return err(new PointsLinesTopologyMismatchError({ entity: input.entity, submesh, expected, actual }));
373
- }
374
- function checkStyle(input) {
375
- const hasPoints = input.points !== void 0;
376
- const hasLines = input.lines !== void 0;
377
- if (hasPoints && hasLines) {
378
- return invalidStyle(
379
- input,
380
- "Points/Lines",
381
- "components",
382
- "Points + Lines",
383
- "exactly one style component"
384
- );
385
- }
386
- if (!hasPoints && !hasLines) {
387
- return invalidStyle(input, "Points/Lines", "components", void 0, "one style component");
388
- }
389
- if (hasPoints) {
390
- const sizePx = input.points?.sizePx ?? 4;
391
- const shapeValue = input.points?.shape ?? PointShapeValue.square;
392
- const shape = pointShapeFromU32(shapeValue);
393
- if (!Number.isFinite(sizePx) || sizePx <= 0) {
394
- return invalidStyle(input, "Points", "sizePx", sizePx, "finite sizePx > 0");
395
- }
396
- if (shape === void 0) {
397
- return invalidStyle(input, "Points", "shape", shapeValue, "shape is 'square' or 'circle'");
398
- }
399
- return ok({ component: "Points", shape, sizePx });
400
- }
401
- const widthPx = input.lines?.widthPx ?? 1;
402
- if (!Number.isFinite(widthPx) || widthPx <= 0) {
403
- return invalidStyle(input, "Lines", "widthPx", widthPx, "finite widthPx > 0");
404
- }
405
- return ok({ component: "Lines", widthPx });
406
- }
407
- function checkTopology(input, component) {
408
- const expected = component === "Points" ? "point-list" : "line-list";
409
- let pointCount = 0;
410
- let segmentCount = 0;
411
- const acceptedSubmeshes = [];
412
- let sawNonEmpty = false;
413
- for (const [submeshIndex, submesh] of input.mesh.submeshes.entries()) {
414
- const indexed = input.mesh.indices !== void 0 && submesh.indexCount > 0;
415
- const elementCount = indexed ? submesh.indexCount : submesh.vertexCount;
416
- if (elementCount === 0) continue;
417
- sawNonEmpty = true;
418
- if (component === "Lines" && submesh.topology === "line-strip") {
419
- return err(
420
- new PointsLinesStyleUnsupportedError({
421
- lane: "admission",
422
- field: "topology",
423
- member: "line-strip",
424
- supported: ["line-list"]
425
- })
426
- );
427
- }
428
- if (submesh.topology !== expected) {
429
- return topologyMismatch(input, submeshIndex, expected, submesh.topology);
430
- }
431
- if (component === "Lines" && elementCount % 2 !== 0) {
432
- return topologyMismatch(input, submeshIndex, "line-list pairs", "line-list odd tail");
433
- }
434
- acceptedSubmeshes.push(submeshIndex);
435
- if (component === "Points") pointCount += elementCount;
436
- else segmentCount += elementCount / 2;
437
- }
438
- if (!sawNonEmpty) return topologyMismatch(input, 0, expected, "empty-range");
439
- return ok({ pointCount, segmentCount, submeshes: acceptedSubmeshes });
440
- }
441
- function checkMaterial(input) {
442
- const passes = input.material.passes ?? [];
443
- const unlitModules = /* @__PURE__ */ new Set(["forgeax_material::unlit", "forgeax::default-unlit"]);
444
- if (passes.length !== 1 || passes[0] === void 0) {
445
- const pass2 = passes.find(
446
- (candidate) => candidate.name === "deferred" || candidate.name === "shadow-caster"
447
- ) ?? passes[0];
448
- return err(
449
- new PointsLinesMaterialUnsupportedError({
450
- entity: input.entity,
451
- material: input.materialId ?? "<anonymous>",
452
- pass: pass2?.name ?? "<empty>",
453
- module: pass2?.program.module ?? "<empty>",
454
- reason: "points-lines admission requires one unlit forward pass"
455
- })
456
- );
457
- }
458
- const pass = passes[0];
459
- const lightMode = pass.renderState?.tags?.LightMode;
460
- if (!unlitModules.has(pass.program.module) || pass.name !== "forward" || lightMode === "ShadowCaster") {
461
- return err(
462
- new PointsLinesMaterialUnsupportedError({
463
- entity: input.entity,
464
- material: input.materialId ?? "<anonymous>",
465
- pass: pass.name,
466
- module: pass.program.module,
467
- reason: "points-lines admission requires an engine-owned unlit forward pass"
468
- })
469
- );
470
- }
471
- return ok(void 0);
472
- }
473
- function admitPointsLines(input) {
474
- const style = checkStyle(input);
475
- if (!style.ok) return style;
476
- const topology = checkTopology(input, style.value.component);
477
- if (!topology.ok) return topology;
478
- const material = checkMaterial(input);
479
- if (!material.ok) return material;
480
- if (style.value.component === "Points" && input.limits?.maxPoints !== void 0) {
481
- if (topology.value.pointCount > input.limits.maxPoints) {
482
- return err(
483
- new PointsLinesBudgetExceededError({
484
- lane: "admission",
485
- requested: topology.value.pointCount,
486
- limit: input.limits.maxPoints,
487
- unit: "points"
488
- })
489
- );
490
- }
491
- }
492
- if (style.value.component === "Lines" && input.limits?.maxSegments !== void 0) {
493
- if (topology.value.segmentCount > input.limits.maxSegments) {
494
- return err(
495
- new PointsLinesBudgetExceededError({
496
- lane: "admission",
497
- requested: topology.value.segmentCount,
498
- limit: input.limits.maxSegments,
499
- unit: "segments"
500
- })
501
- );
502
- }
503
- }
504
- return ok({ ...style.value, ...topology.value });
505
- }
506
- function resolveVisibility(world, hierarchy = projectHierarchy(world)) {
507
- const query = world.query({ read: [Visibility] });
508
- const visitVisibilityRows = (visit) => {
509
- if (!query.ok) return;
510
- const spans = query.value.spans();
511
- if (spans.ok) {
512
- for (const span of spans.value) {
513
- const states = span.get(Visibility).state;
514
- for (let index = 0; index < span.length; index += 1) {
515
- visit(span.entities[index], states[index] ?? 0);
516
- }
517
- }
518
- return;
519
- }
520
- for (const row of query.value) {
521
- visit(row.entity, row.get(Visibility).state);
522
- }
523
- };
524
- let intentCount = 0;
525
- let hasAnyHiddenIntent = false;
526
- visitVisibilityRows((_entity, rawState) => {
527
- intentCount += 1;
528
- if (rawState === VisibilityStateValue.hidden) {
529
- hasAnyHiddenIntent = true;
530
- }
531
- });
532
- let resolveEntity;
533
- let hasIntent;
534
- const ensureResolver = () => {
535
- if (resolveEntity !== void 0) return;
536
- const intentByEntity = /* @__PURE__ */ new Map();
537
- visitVisibilityRows((entity, rawState) => {
538
- const intent = visibilityStateFromU32(rawState);
539
- if (intent !== void 0) {
540
- intentByEntity.set(entity, intent);
541
- }
542
- });
543
- hasIntent = (entity) => intentByEntity.has(entity);
544
- const resolved = /* @__PURE__ */ new Map();
545
- const resolving = /* @__PURE__ */ new Set();
546
- resolveEntity = (entity) => {
547
- const existing = resolved.get(entity);
548
- if (existing !== void 0) return existing;
549
- if (resolving.has(entity)) return void 0;
550
- const intent = intentByEntity.get(entity) ?? "inherited";
551
- resolving.add(entity);
552
- let result;
553
- if (intent === "hidden") {
554
- result = { intent, effective: "hidden", source: "self" };
555
- } else if (intent === "visible") {
556
- result = { intent, effective: "visible", source: "self" };
557
- } else {
558
- const parent = hierarchy.getParent(entity);
559
- const parentResult = parent === void 0 ? void 0 : resolveEntity?.(parent);
560
- result = parentResult === void 0 ? { intent, effective: "visible", source: "default" } : { intent, effective: parentResult.effective, source: "parent" };
561
- }
562
- resolving.delete(entity);
563
- resolved.set(entity, result);
564
- return result;
565
- };
566
- };
567
- return {
568
- diagnostics: hierarchy.diagnostics,
569
- hasAnyIntent: intentCount > 0,
570
- hasAnyHiddenIntent,
571
- get(entity) {
572
- ensureResolver();
573
- return hasIntent?.(entity) ? resolveEntity?.(entity) : void 0;
574
- },
575
- effective(entity) {
576
- ensureResolver();
577
- return resolveEntity?.(entity)?.effective ?? "visible";
578
- }
579
- };
580
- }
581
-
582
- 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, admitPointsLines, antialiasFromF32, bloomEnabledFromF32, cameraProjectionFromF32, orthographic, perspective, pointShapeFromU32, resolveVisibility, tonemapFromF32, tonemapToU32, visibilityStateFromU32 };
583
- //# sourceMappingURL=chunk-YTQ5C7YQ.mjs.map
584
- //# sourceMappingURL=chunk-YTQ5C7YQ.mjs.map