@forgeax/engine-render 0.1.21 → 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 (426) hide show
  1. package/README.md +150 -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.map +1 -1
  5. package/dist/assembly/factory.d.ts +14 -6
  6. package/dist/assembly/factory.d.ts.map +1 -1
  7. package/dist/assembly/host-contract.d.ts +10 -0
  8. package/dist/assembly/host-contract.d.ts.map +1 -1
  9. package/dist/authoring.mjs +1 -1
  10. package/dist/{chunk-PCHBPYML.mjs → chunk-4L3P6DT5.mjs} +2 -2
  11. package/dist/chunk-4L3P6DT5.mjs.map +1 -0
  12. package/dist/{chunk-VFPLTKCU.mjs → chunk-4NPUASZR.mjs} +15 -4
  13. package/dist/chunk-4NPUASZR.mjs.map +1 -0
  14. package/dist/chunk-DIYW3M5D.mjs +5085 -0
  15. package/dist/chunk-DIYW3M5D.mjs.map +1 -0
  16. package/dist/chunk-FBC4R44J.mjs +1003 -0
  17. package/dist/chunk-FBC4R44J.mjs.map +1 -0
  18. package/dist/{chunk-FS2KNUQH.mjs → chunk-FF7K3FSO.mjs} +253 -489
  19. package/dist/chunk-FF7K3FSO.mjs.map +1 -0
  20. package/dist/chunk-HZUPSYW7.mjs +1104 -0
  21. package/dist/chunk-HZUPSYW7.mjs.map +1 -0
  22. package/dist/{chunk-6OPXDQ2E.mjs → chunk-QODA5UKU.mjs} +33 -294
  23. package/dist/chunk-QODA5UKU.mjs.map +1 -0
  24. package/dist/chunk-YALPS44A.mjs +296 -0
  25. package/dist/chunk-YALPS44A.mjs.map +1 -0
  26. package/dist/{chunk-5YADUCA7.mjs → chunk-ZUWKAZ2I.mjs} +585 -991
  27. package/dist/chunk-ZUWKAZ2I.mjs.map +1 -0
  28. package/dist/cluster-binner.d.ts +5 -0
  29. package/dist/cluster-binner.d.ts.map +1 -1
  30. package/dist/components/index.d.ts +3 -0
  31. package/dist/components/index.d.ts.map +1 -1
  32. package/dist/components/light-helpers.d.ts +4 -0
  33. package/dist/components/light-helpers.d.ts.map +1 -1
  34. package/dist/components/light-probe.d.ts +9 -0
  35. package/dist/components/light-probe.d.ts.map +1 -0
  36. package/dist/components/rect-area-light.d.ts +12 -0
  37. package/dist/components/rect-area-light.d.ts.map +1 -0
  38. package/dist/components/scene-instance.d.ts +4 -0
  39. package/dist/components/scene-instance.d.ts.map +1 -1
  40. package/dist/components/spot-light.d.ts +3 -0
  41. package/dist/components/spot-light.d.ts.map +1 -1
  42. package/dist/construct-renderer.mjs +10437 -10044
  43. package/dist/construct-renderer.mjs.map +1 -1
  44. package/dist/device/gpu-residency.d.ts +8 -1
  45. package/dist/device/gpu-residency.d.ts.map +1 -1
  46. package/dist/device/lifecycle-transaction.d.ts +2 -0
  47. package/dist/device/lifecycle-transaction.d.ts.map +1 -0
  48. package/dist/environment/lifecycle.d.ts.map +1 -1
  49. package/dist/errors/gpu-driven.d.ts +26 -0
  50. package/dist/errors/gpu-driven.d.ts.map +1 -0
  51. package/dist/errors/index.d.ts +1 -0
  52. package/dist/errors/index.d.ts.map +1 -1
  53. package/dist/errors/recover.d.ts +9 -1
  54. package/dist/errors/recover.d.ts.map +1 -1
  55. package/dist/errors/render.d.ts +26 -1
  56. package/dist/errors/render.d.ts.map +1 -1
  57. package/dist/extract/gpu-driven.d.ts +50 -0
  58. package/dist/extract/gpu-driven.d.ts.map +1 -0
  59. package/dist/extract/visibility.d.ts.map +1 -1
  60. package/dist/gpu-driven/batch-topology.d.ts +34 -0
  61. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  62. package/dist/gpu-driven/prepared-draw.d.ts +63 -0
  63. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -0
  64. package/dist/gpu-driven/production-raster.d.ts +98 -2
  65. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  66. package/dist/gpu-driven/view-gpu.d.ts +64 -1
  67. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  68. package/dist/gpu-scene-schema.d.ts +14 -0
  69. package/dist/gpu-scene-schema.d.ts.map +1 -1
  70. package/dist/gpu-scene.d.ts +8 -1
  71. package/dist/gpu-scene.d.ts.map +1 -1
  72. package/dist/gpu-usage.d.ts +0 -1
  73. package/dist/gpu-usage.d.ts.map +1 -1
  74. package/dist/hdrp-buffers.d.ts +3 -3
  75. package/dist/hdrp-buffers.d.ts.map +1 -1
  76. package/dist/index.d.ts +12 -1
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.mjs +90 -5
  79. package/dist/index.mjs.map +1 -1
  80. package/dist/inspection-types.d.ts +163 -1
  81. package/dist/inspection-types.d.ts.map +1 -1
  82. package/dist/internal.d.ts +9 -0
  83. package/dist/internal.d.ts.map +1 -1
  84. package/dist/internal.mjs +23 -2
  85. package/dist/internal.mjs.map +1 -1
  86. package/dist/light-buffer-layout.d.ts +58 -149
  87. package/dist/light-buffer-layout.d.ts.map +1 -1
  88. package/dist/materials.d.ts.map +1 -1
  89. package/dist/pbr-pipeline.d.ts +26 -12
  90. package/dist/pbr-pipeline.d.ts.map +1 -1
  91. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  92. package/dist/pipeline/standard-lighting/graph.d.ts.map +1 -1
  93. package/dist/pipeline/standard-lighting/light-frame.d.ts +3 -3
  94. package/dist/pipeline/standard-lighting/light-frame.d.ts.map +1 -1
  95. package/dist/pipeline/standard-lighting/topology.d.ts +1 -1
  96. package/dist/pipeline/standard-lighting/topology.d.ts.map +1 -1
  97. package/dist/pipeline/standard-lighting/transport.d.ts.map +1 -1
  98. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  99. package/dist/pipeline-builder.d.ts +2 -0
  100. package/dist/pipeline-builder.d.ts.map +1 -1
  101. package/dist/pipeline-spec.d.ts +1 -1
  102. package/dist/pipeline-spec.d.ts.map +1 -1
  103. package/dist/plugin.d.ts.map +1 -1
  104. package/dist/prepare/extended-lighting/ltc-resources.d.ts +31 -0
  105. package/dist/prepare/extended-lighting/ltc-resources.d.ts.map +1 -0
  106. package/dist/prepare/extended-lighting/resources.d.ts +72 -0
  107. package/dist/prepare/extended-lighting/resources.d.ts.map +1 -0
  108. package/dist/prepare/extended-lighting/spot-modifiers.d.ts +42 -0
  109. package/dist/prepare/extended-lighting/spot-modifiers.d.ts.map +1 -0
  110. package/dist/prepare/extended-lighting/state.d.ts +24 -0
  111. package/dist/prepare/extended-lighting/state.d.ts.map +1 -0
  112. package/dist/record/frame-lighting.d.ts +8 -6
  113. package/dist/record/frame-lighting.d.ts.map +1 -1
  114. package/dist/record/frame-snapshot.d.ts +50 -10
  115. package/dist/record/frame-snapshot.d.ts.map +1 -1
  116. package/dist/record/frame.d.ts +7 -3
  117. package/dist/record/frame.d.ts.map +1 -1
  118. package/dist/record/gpu-timing.d.ts +19 -7
  119. package/dist/record/gpu-timing.d.ts.map +1 -1
  120. package/dist/record/helpers.d.ts +0 -20
  121. package/dist/record/helpers.d.ts.map +1 -1
  122. package/dist/record/main-pass-geometry.d.ts +6 -1
  123. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  124. package/dist/record/main-pass-material.d.ts +3 -1
  125. package/dist/record/main-pass-material.d.ts.map +1 -1
  126. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  127. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  128. package/dist/record/render-context.d.ts +57 -6
  129. package/dist/record/render-context.d.ts.map +1 -1
  130. package/dist/record/shadow-pass.d.ts.map +1 -1
  131. package/dist/record/typed-frame-graph.d.ts +49 -2
  132. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  133. package/dist/record/view-ubo.d.ts +1 -2
  134. package/dist/record/view-ubo.d.ts.map +1 -1
  135. package/dist/reflection/inspection.d.ts +10 -0
  136. package/dist/reflection/inspection.d.ts.map +1 -0
  137. package/dist/reflection/projection.d.ts +49 -0
  138. package/dist/reflection/projection.d.ts.map +1 -1
  139. package/dist/reflection/record-owner.d.ts +60 -0
  140. package/dist/reflection/record-owner.d.ts.map +1 -0
  141. package/dist/render-contract.d.ts +14 -8
  142. package/dist/render-contract.d.ts.map +1 -1
  143. package/dist/render-pipeline.d.ts +7 -0
  144. package/dist/render-pipeline.d.ts.map +1 -1
  145. package/dist/render-system-extract.d.ts +104 -16
  146. package/dist/render-system-extract.d.ts.map +1 -1
  147. package/dist/render-system.d.ts +12 -1
  148. package/dist/render-system.d.ts.map +1 -1
  149. package/dist/scene/probe-blend-record.d.ts +22 -0
  150. package/dist/scene/probe-blend-record.d.ts.map +1 -0
  151. package/dist/scene/probe-blend.d.ts +142 -0
  152. package/dist/scene/probe-blend.d.ts.map +1 -0
  153. package/dist/scene/render-scene-types.d.ts +0 -6
  154. package/dist/scene/render-scene-types.d.ts.map +1 -1
  155. package/dist/scene/render-scene.d.ts +103 -9
  156. package/dist/scene/render-scene.d.ts.map +1 -1
  157. package/dist/scene/visibility/bounds.d.ts +20 -0
  158. package/dist/scene/visibility/bounds.d.ts.map +1 -0
  159. package/dist/scene/visibility/budget.d.ts +16 -0
  160. package/dist/scene/visibility/budget.d.ts.map +1 -0
  161. package/dist/scene/visibility/facet.d.ts +73 -0
  162. package/dist/scene/visibility/facet.d.ts.map +1 -0
  163. package/dist/scene/visibility/gpu-frame-timing.d.ts +41 -0
  164. package/dist/scene/visibility/gpu-frame-timing.d.ts.map +1 -0
  165. package/dist/scene/visibility/gpu-lod.d.ts +46 -0
  166. package/dist/scene/visibility/gpu-lod.d.ts.map +1 -0
  167. package/dist/scene/visibility/inspection.d.ts +132 -0
  168. package/dist/scene/visibility/inspection.d.ts.map +1 -0
  169. package/dist/scene/visibility/lod-selector.d.ts +25 -0
  170. package/dist/scene/visibility/lod-selector.d.ts.map +1 -0
  171. package/dist/scene/visibility/occlusion-confidence.d.ts +81 -0
  172. package/dist/scene/visibility/occlusion-confidence.d.ts.map +1 -0
  173. package/dist/scene/visibility/occlusion-pass.d.ts +57 -0
  174. package/dist/scene/visibility/occlusion-pass.d.ts.map +1 -0
  175. package/dist/scene/visibility/occlusion-query-pool.d.ts +57 -0
  176. package/dist/scene/visibility/occlusion-query-pool.d.ts.map +1 -0
  177. package/dist/scene/visibility/occlusion-runtime.d.ts +96 -0
  178. package/dist/scene/visibility/occlusion-runtime.d.ts.map +1 -0
  179. package/dist/scene/visibility/types.d.ts +34 -0
  180. package/dist/scene/visibility/types.d.ts.map +1 -0
  181. package/dist/ssr/admission.d.ts +122 -0
  182. package/dist/ssr/admission.d.ts.map +1 -0
  183. package/dist/ssr/composition.d.ts +32 -0
  184. package/dist/ssr/composition.d.ts.map +1 -0
  185. package/dist/ssr/errors.d.ts +39 -0
  186. package/dist/ssr/errors.d.ts.map +1 -0
  187. package/dist/ssr/identity.d.ts +13 -0
  188. package/dist/ssr/identity.d.ts.map +1 -0
  189. package/dist/systems/skin-palette-allocator.d.ts +1 -1
  190. package/dist/temporal/frame-coordinator.d.ts +13 -0
  191. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  192. package/dist/temporal/frame.d.ts +2 -0
  193. package/dist/temporal/frame.d.ts.map +1 -1
  194. package/dist/temporal/index.mjs +6 -5
  195. package/dist/temporal/view.d.ts +7 -0
  196. package/dist/temporal/view.d.ts.map +1 -1
  197. package/dist/tilemap-chunk-extract-system.d.ts +1 -1
  198. package/dist/typed-render-graph-primitives.d.ts +4 -0
  199. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  200. package/dist/volume/passes.d.ts +8 -4
  201. package/dist/volume/passes.d.ts.map +1 -1
  202. package/package.json +20 -20
  203. package/src/__tests__/cluster-grid-default-surface.unit.test.ts +5 -0
  204. package/src/__tests__/detached-inspection.integration.test.ts +6 -0
  205. package/src/__tests__/device-feature-admission.unit.test.ts +13 -1
  206. package/src/__tests__/direct-light-snapshot.unit.test.ts +59 -3
  207. package/src/__tests__/environment-generation.integration.test.ts +16 -0
  208. package/src/__tests__/evidence-identity.ts +13 -0
  209. package/src/__tests__/evidence-identity.unit.test.ts +24 -0
  210. package/src/__tests__/extended-lighting-recovery.browser.test.ts +14 -0
  211. package/src/__tests__/extended-lighting-recovery.dawn.test.ts +14 -0
  212. package/src/__tests__/extended-lighting-recovery.integration.test.ts +81 -0
  213. package/src/__tests__/extended-lighting-resources.unit.test.ts +51 -0
  214. package/src/__tests__/extended-lighting-zero-feature.integration.test.ts +52 -0
  215. package/src/__tests__/factory-contract.integration.test.ts +33 -0
  216. package/src/__tests__/frame-observation.contract.test.ts +15 -0
  217. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +146 -0
  218. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +1 -0
  219. package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +1 -0
  220. package/src/__tests__/gpu-driven-production.integration.test.ts +572 -9
  221. package/src/__tests__/gpu-driven-scaling.unit.test.ts +66 -2
  222. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +26 -1
  223. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +89 -2
  224. package/src/__tests__/gpu-driven-view.browser.test.ts +3 -3
  225. package/src/__tests__/gpu-driven-view.dawn.test.ts +3 -3
  226. package/src/__tests__/gpu-driven-view.unit.test.ts +50 -0
  227. package/src/__tests__/gpu-lod-evidence.ts +188 -0
  228. package/src/__tests__/gpu-lod-fallback.integration.test.ts +10 -0
  229. package/src/__tests__/gpu-lod-indirect.integration.test.ts +40 -0
  230. package/src/__tests__/gpu-lod-parity.dawn.test.ts +29 -0
  231. package/src/__tests__/gpu-lod-readiness.integration.test.ts +52 -0
  232. package/src/__tests__/gpu-lod-schema.unit.test.ts +66 -0
  233. package/src/__tests__/gpu-lod-selector.unit.test.ts +28 -0
  234. package/src/__tests__/gpu-lod-silhouette.browser.test.ts +13 -0
  235. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +66 -1
  236. package/src/__tests__/gpu-scene.dawn.test.ts +8 -1
  237. package/src/__tests__/gpu-scene.unit.test.ts +49 -3
  238. package/src/__tests__/light-buffer-layout.unit.test.ts +113 -3
  239. package/src/__tests__/light-inspection.unit.test.ts +55 -0
  240. package/src/__tests__/light-resource-error.unit.test.ts +43 -0
  241. package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +109 -0
  242. package/src/__tests__/lod-bounds.unit.test.ts +42 -0
  243. package/src/__tests__/lod-cpu-lane.integration.test.ts +55 -0
  244. package/src/__tests__/lod-cpu-no-change.perf.test.ts +19 -0
  245. package/src/__tests__/lod-gpu-frame-timing.unit.test.ts +49 -0
  246. package/src/__tests__/lod-multi-view.integration.test.ts +63 -0
  247. package/src/__tests__/lod-occlusion-device-loss.integration.test.ts +27 -0
  248. package/src/__tests__/lod-occlusion-final-decision.integration.test.ts +47 -0
  249. package/src/__tests__/lod-occlusion-inspection.integration.test.ts +217 -0
  250. package/src/__tests__/lod-occlusion-inspection.schema.test-d.ts +14 -0
  251. package/src/__tests__/lod-occlusion-inspection.unit.test.ts +72 -0
  252. package/src/__tests__/lod-occlusion-visual-evidence.ts +91 -0
  253. package/src/__tests__/lod-occlusion.browser.test.ts +15 -0
  254. package/src/__tests__/lod-occlusion.dawn.test.ts +20 -0
  255. package/src/__tests__/lod-selector.profile.test.ts +35 -0
  256. package/src/__tests__/lod-selector.unit.test.ts +68 -0
  257. package/src/__tests__/lod-visibility-identity.unit.test.ts +198 -0
  258. package/src/__tests__/lod-visibility-lifecycle.integration.test.ts +132 -0
  259. package/src/__tests__/ltc-resources.unit.test.ts +32 -0
  260. package/src/__tests__/material-contract-inventory.unit.test.ts +17 -0
  261. package/src/__tests__/occlusion-confidence.unit.test.ts +168 -0
  262. package/src/__tests__/occlusion-invalidation.integration.test.ts +37 -0
  263. package/src/__tests__/occlusion-pass-routing.unit.test.ts +16 -0
  264. package/src/__tests__/occlusion-pass.dawn.test.ts +20 -0
  265. package/src/__tests__/occlusion-pass.integration.test.ts +43 -0
  266. package/src/__tests__/occlusion-pass.rhi-null.test.ts +22 -0
  267. package/src/__tests__/occlusion-query-pool.rhi-null.test.ts +21 -0
  268. package/src/__tests__/occlusion-query-pool.unit.test.ts +95 -0
  269. package/src/__tests__/occlusion-query-ticket.integration.test.ts +47 -0
  270. package/src/__tests__/occlusion-query.dawn.test.ts +16 -0
  271. package/src/__tests__/occlusion-query.evidence.ts +178 -0
  272. package/src/__tests__/occlusion-query.rhi-null.test.ts +31 -0
  273. package/src/__tests__/occlusion-runtime.unit.test.ts +120 -0
  274. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +196 -0
  275. package/src/__tests__/probe-bindings.unit.test.ts +200 -0
  276. package/src/__tests__/probe-blend-numeric.unit.test.ts +67 -0
  277. package/src/__tests__/probe-blend-oracle.unit.test.ts +136 -0
  278. package/src/__tests__/probe-capacity.integration.test.ts +97 -0
  279. package/src/__tests__/probe-recovery.integration.test.ts +104 -0
  280. package/src/__tests__/probe-scene-dirty.integration.test.ts +211 -0
  281. package/src/__tests__/profiler-phase-catalog.test.ts +4 -1
  282. package/src/__tests__/profiler-phase-token.test.ts +1 -0
  283. package/src/__tests__/rect-area-boundary.unit.test.ts +24 -0
  284. package/src/__tests__/reflection-fallback-graph.unit.test.ts +67 -0
  285. package/src/__tests__/reflection-fallback-inspection.unit.test.ts +77 -0
  286. package/src/__tests__/reflection-fallback-lifecycle.integration.test.ts +21 -0
  287. package/src/__tests__/reflection-fallback-projection.unit.test.ts +90 -0
  288. package/src/__tests__/reflection-fallback-source.unit.test.ts +32 -0
  289. package/src/__tests__/reflection-probe-owner-placement.unit.test.ts +39 -0
  290. package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +120 -0
  291. package/src/__tests__/render-error-code-owner.test-d.ts +1 -0
  292. package/src/__tests__/render-feature-docs.unit.test.ts +12 -7
  293. package/src/__tests__/render-graph-fallback.integration.test.ts +24 -0
  294. package/src/__tests__/render-perf/extended-lighting.bench.test.ts +66 -0
  295. package/src/__tests__/render-scene-projection.unit.test.ts +447 -18
  296. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +76 -0
  297. package/src/__tests__/skin-motion-regression.unit.test.ts +22 -0
  298. package/src/__tests__/skinned-shadow-caster.test.ts +2 -2
  299. package/src/__tests__/spot-modifier-projection.unit.test.ts +70 -0
  300. package/src/__tests__/ssr-admission-matrix.integration.test.ts +206 -0
  301. package/src/__tests__/ssr-composition.unit.test.ts +46 -0
  302. package/src/__tests__/ssr-fallback-zero-work.bench.test.ts +94 -0
  303. package/src/__tests__/ssr-recovery-errors.unit.test.ts +58 -0
  304. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +67 -0
  305. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +7 -0
  306. package/src/__tests__/standard-lighting-inspection.integration.test.ts +1 -1
  307. package/src/__tests__/standard-lighting-write.unit.test.ts +66 -2
  308. package/src/__tests__/temporal-fallback-generation.integration.test.ts +16 -0
  309. package/src/__tests__/temporal-view.unit.test.ts +3 -3
  310. package/src/__tests__/transmission-prewarm.unit.test.ts +69 -0
  311. package/src/__tests__/visibility-budget.integration.test.ts +140 -0
  312. package/src/__tests__/visibility-budget.unit.test.ts +70 -0
  313. package/src/__tests__/visibility-extract.integration.test.ts +11 -6
  314. package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +6 -3
  315. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +31 -28
  316. package/src/assembly/backend-contract.ts +13 -0
  317. package/src/assembly/device-feature-admission.ts +16 -9
  318. package/src/assembly/factory.ts +547 -93
  319. package/src/assembly/host-contract.ts +10 -0
  320. package/src/cluster-binner.ts +31 -0
  321. package/src/components/__tests__/lighting-authoring.unit.test.ts +39 -0
  322. package/src/components/__tests__/rect-area-light.unit.test.ts +33 -0
  323. package/src/components/index.ts +3 -0
  324. package/src/components/light-helpers.ts +52 -1
  325. package/src/components/light-probe.ts +13 -0
  326. package/src/components/rect-area-light.ts +15 -0
  327. package/src/components/scene-instance.ts +6 -0
  328. package/src/components/spot-light.ts +3 -0
  329. package/src/device/__tests__/extended-lighting-recovery.unit.test.ts +24 -0
  330. package/src/device/gpu-residency.ts +140 -9
  331. package/src/device/lifecycle-transaction.ts +12 -0
  332. package/src/environment/lifecycle.ts +8 -1
  333. package/src/errors/gpu-driven.ts +92 -0
  334. package/src/errors/index.ts +1 -0
  335. package/src/errors/recover.ts +32 -0
  336. package/src/errors/render.ts +55 -1
  337. package/src/extract/camera.ts +3 -3
  338. package/src/extract/gpu-driven.ts +108 -0
  339. package/src/extract/visibility.ts +0 -23
  340. package/src/gpu-driven/batch-topology.ts +206 -28
  341. package/src/gpu-driven/prepared-draw.ts +208 -0
  342. package/src/gpu-driven/production-raster.ts +953 -41
  343. package/src/gpu-driven/view-gpu.ts +411 -29
  344. package/src/gpu-scene-schema.ts +13 -0
  345. package/src/gpu-scene.ts +134 -65
  346. package/src/gpu-usage.ts +0 -1
  347. package/src/hdrp-buffers.ts +6 -6
  348. package/src/index.ts +74 -0
  349. package/src/inspection-types.ts +220 -1
  350. package/src/internal.ts +38 -0
  351. package/src/light-buffer-layout.ts +154 -324
  352. package/src/materials.ts +16 -2
  353. package/src/pbr-pipeline.ts +151 -45
  354. package/src/pipeline/standard-forward-lane.ts +47 -0
  355. package/src/pipeline/standard-lighting/graph.ts +2 -1
  356. package/src/pipeline/standard-lighting/light-frame.ts +3 -2
  357. package/src/pipeline/standard-lighting/topology.ts +1 -1
  358. package/src/pipeline/standard-lighting/transport.ts +2 -1
  359. package/src/pipeline/standard-pipeline.ts +2 -0
  360. package/src/pipeline-builder.ts +5 -2
  361. package/src/pipeline-spec.ts +12 -1
  362. package/src/plugin.ts +4 -0
  363. package/src/prepare/__tests__/extended-lighting-capability.unit.test.ts +56 -0
  364. package/src/prepare/extended-lighting/ltc-resources.ts +136 -0
  365. package/src/prepare/extended-lighting/resources.ts +389 -0
  366. package/src/prepare/extended-lighting/spot-modifiers.ts +194 -0
  367. package/src/prepare/extended-lighting/state.ts +92 -0
  368. package/src/record/__tests__/gpu-timing.unit.test.ts +177 -0
  369. package/src/record/__tests__/temporal-payload.unit.test.ts +23 -1
  370. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +20 -1
  371. package/src/record/frame-lighting.ts +252 -53
  372. package/src/record/frame-snapshot.ts +57 -12
  373. package/src/record/frame.ts +410 -93
  374. package/src/record/gpu-timing.ts +108 -44
  375. package/src/record/helpers.ts +0 -58
  376. package/src/record/main-pass-geometry.ts +204 -39
  377. package/src/record/main-pass-material.ts +8 -1
  378. package/src/record/main-pass-sprite-draws.ts +52 -85
  379. package/src/record/mesh-ssbo.ts +47 -36
  380. package/src/record/render-context.ts +65 -4
  381. package/src/record/shadow-pass.ts +66 -40
  382. package/src/record/typed-frame-graph.ts +225 -83
  383. package/src/record/view-ubo.ts +14 -24
  384. package/src/reflection/inspection.ts +67 -0
  385. package/src/reflection/projection.ts +196 -1
  386. package/src/reflection/record-owner.ts +1283 -0
  387. package/src/render-contract.ts +17 -5
  388. package/src/render-pipeline.ts +5 -0
  389. package/src/render-system-extract.ts +493 -134
  390. package/src/render-system.ts +811 -615
  391. package/src/scene/__tests__/changed-block-summary.candidate.test.ts +36 -0
  392. package/src/scene/probe-blend-record.ts +54 -0
  393. package/src/scene/probe-blend.ts +813 -0
  394. package/src/scene/render-scene-types.ts +0 -7
  395. package/src/scene/render-scene.ts +848 -183
  396. package/src/scene/visibility/bounds.ts +57 -0
  397. package/src/scene/visibility/budget.ts +40 -0
  398. package/src/scene/visibility/facet.ts +400 -0
  399. package/src/scene/visibility/gpu-frame-timing.ts +101 -0
  400. package/src/scene/visibility/gpu-lod.ts +119 -0
  401. package/src/scene/visibility/inspection.ts +313 -0
  402. package/src/scene/visibility/lod-selector.ts +84 -0
  403. package/src/scene/visibility/occlusion-confidence.ts +478 -0
  404. package/src/scene/visibility/occlusion-pass.ts +165 -0
  405. package/src/scene/visibility/occlusion-query-pool.ts +178 -0
  406. package/src/scene/visibility/occlusion-runtime.ts +672 -0
  407. package/src/scene/visibility/types.ts +50 -0
  408. package/src/ssr/admission.ts +451 -0
  409. package/src/ssr/composition.ts +73 -0
  410. package/src/ssr/errors.ts +76 -0
  411. package/src/ssr/identity.ts +12 -0
  412. package/src/systems/skin-palette-allocator.ts +1 -1
  413. package/src/temporal/frame-coordinator.ts +26 -0
  414. package/src/temporal/frame.ts +14 -1
  415. package/src/temporal/view.ts +11 -0
  416. package/src/tilemap-chunk-extract-system.ts +4 -4
  417. package/src/typed-render-graph-primitives.ts +48 -0
  418. package/src/volume/passes.ts +46 -49
  419. package/dist/.tsbuildinfo +0 -1
  420. package/dist/chunk-5YADUCA7.mjs.map +0 -1
  421. package/dist/chunk-6OPXDQ2E.mjs.map +0 -1
  422. package/dist/chunk-BXBQQKFQ.mjs +0 -67
  423. package/dist/chunk-BXBQQKFQ.mjs.map +0 -1
  424. package/dist/chunk-FS2KNUQH.mjs.map +0 -1
  425. package/dist/chunk-PCHBPYML.mjs.map +0 -1
  426. package/dist/chunk-VFPLTKCU.mjs.map +0 -1
@@ -7,10 +7,13 @@ import {
7
7
  GPU_BUFFER_USAGE_QUERY_RESOLVE,
8
8
  } from '../gpu-usage';
9
9
 
10
- const MAX_VOLUME_PASSES = 4;
11
- const QUERY_COUNT = MAX_VOLUME_PASSES * 2;
12
- const QUERY_STRIDE_BYTES = 256;
13
- const READBACK_BYTES = QUERY_COUNT * QUERY_STRIDE_BYTES;
10
+ // The pass descriptor timestampWrites API needs one pair per actual raster or
11
+ // compute pass. Keep the capture bounded so enabling timing cannot turn into an
12
+ // unbounded query allocation on a pathological graph.
13
+ const MAX_CAPTURE_PASSES = 64;
14
+ const QUERY_COUNT = MAX_CAPTURE_PASSES * 2;
15
+ const QUERY_RESULT_BYTES = 8;
16
+ const READBACK_BYTES = QUERY_COUNT * QUERY_RESULT_BYTES;
14
17
  const PASS_NAMES = [
15
18
  'volume-inject',
16
19
  'volume-integrate',
@@ -18,11 +21,29 @@ const PASS_NAMES = [
18
21
  'volume-composite',
19
22
  ] as const;
20
23
 
24
+ type TimedPassKind = 'raster' | 'compute';
25
+
26
+ interface TimedPass {
27
+ readonly name: string;
28
+ readonly kind: TimedPassKind;
29
+ readonly executionIndex: number;
30
+ readonly queryIndex: number;
31
+ }
32
+
33
+ export interface GpuTimingPassTimestampWrites {
34
+ readonly querySet: QuerySet;
35
+ readonly beginningOfPassWriteIndex: number;
36
+ readonly endOfPassWriteIndex: number;
37
+ }
38
+
21
39
  export type VolumeTimingObservation =
22
40
  | {
23
41
  readonly status: 'ready';
24
42
  readonly unit: 'ms';
43
+ /** Time covered by authored volumetric passes only. */
25
44
  readonly totalMs: number;
45
+ /** Time from the first graph pass marker to the final graph marker. */
46
+ readonly frameMs: number;
26
47
  readonly passes: readonly { readonly name: string; readonly milliseconds: number }[];
27
48
  }
28
49
  | {
@@ -34,11 +55,7 @@ function unavailable(reason: string): VolumeTimingObservation {
34
55
  return Object.freeze({ status: 'unavailable', reason });
35
56
  }
36
57
 
37
- export interface VolumeTimingTimestampWrites {
38
- readonly querySet: QuerySet;
39
- readonly beginningOfPassWriteIndex: number;
40
- readonly endOfPassWriteIndex: number;
41
- }
58
+ export type VolumeTimingTimestampWrites = GpuTimingPassTimestampWrites;
42
59
 
43
60
  /**
44
61
  * Renderer-owned timestamp capture for the authored volume graph. Query
@@ -52,12 +69,13 @@ export class GpuTimingCapture {
52
69
  readonly #resolveBuffer: Buffer;
53
70
  readonly #readbackBuffer: Buffer;
54
71
  readonly #periodNanoseconds: number;
55
- readonly #started = new Map<string, number>();
56
- readonly #finished = new Map<string, number>();
72
+ readonly #passes: TimedPass[] = [];
57
73
  #resolved = false;
58
74
  #submitted = false;
59
75
  #discarded = false;
60
76
  #disposed = false;
77
+ #frameStarted = false;
78
+ #unavailableReason: string | undefined;
61
79
  #observation: Promise<VolumeTimingObservation> | undefined;
62
80
 
63
81
  private constructor(
@@ -115,11 +133,32 @@ export class GpuTimingCapture {
115
133
  );
116
134
  }
117
135
 
118
- recordPass(name: string): VolumeTimingTimestampWrites | undefined {
119
- const index = PASS_NAMES.indexOf(name as (typeof PASS_NAMES)[number]);
120
- if (index < 0 || this.#started.has(name) || this.#discarded) return undefined;
121
- this.#started.set(name, index);
122
- this.#finished.set(name, index);
136
+ /**
137
+ * Reserve a query pair for a real render/compute pass. The pair is later
138
+ * attached to that pass's descriptor by the render-graph instrumentation
139
+ * seam; no command-encoder timestamp method is used.
140
+ */
141
+ beginPass(
142
+ name: string,
143
+ kind: TimedPassKind,
144
+ executionIndex: number,
145
+ ): GpuTimingPassTimestampWrites | undefined {
146
+ if (this.#unavailableReason !== undefined || this.#resolved || this.#discarded) return;
147
+ const existing = this.#passes.find((pass) => pass.executionIndex === executionIndex);
148
+ if (existing !== undefined) {
149
+ return {
150
+ querySet: this.#querySet,
151
+ beginningOfPassWriteIndex: existing.queryIndex * 2,
152
+ endOfPassWriteIndex: existing.queryIndex * 2 + 1,
153
+ };
154
+ }
155
+ if (this.#passes.length >= MAX_CAPTURE_PASSES) {
156
+ this.#unavailableReason = `timestamp capture exceeded ${MAX_CAPTURE_PASSES} pass pairs`;
157
+ return;
158
+ }
159
+ const index = this.#passes.length;
160
+ this.#passes.push({ name, kind, executionIndex, queryIndex: index });
161
+ this.#frameStarted = true;
123
162
  return {
124
163
  querySet: this.#querySet,
125
164
  beginningOfPassWriteIndex: index * 2,
@@ -127,20 +166,22 @@ export class GpuTimingCapture {
127
166
  };
128
167
  }
129
168
 
130
- skipPass(name: string): void {
131
- this.#started.delete(name);
132
- this.#finished.delete(name);
169
+ /** An existing producer-owned timestamp pair cannot be overwritten. */
170
+ markOwnerConflict(name: string): void {
171
+ if (this.#unavailableReason === undefined) {
172
+ this.#unavailableReason = `timestamp pass '${name}' already has producer-owned timestampWrites`;
173
+ }
133
174
  }
134
175
 
135
176
  resolve(encoder: RhiCommandEncoder): Result<void, RhiError> {
136
- if (this.#started.size === 0) {
177
+ if (!this.#frameStarted || this.#unavailableReason !== undefined || this.#passes.length === 0) {
137
178
  this.#resolved = true;
138
179
  return ok(undefined);
139
180
  }
140
181
  const resolved = encoder.resolveQuerySet(
141
182
  this.#querySet,
142
183
  0,
143
- QUERY_COUNT,
184
+ this.#passes.length * 2,
144
185
  this.#resolveBuffer,
145
186
  0,
146
187
  );
@@ -164,9 +205,20 @@ export class GpuTimingCapture {
164
205
 
165
206
  observation(): Promise<VolumeTimingObservation> {
166
207
  if (this.#observation !== undefined) return this.#observation;
167
- if (this.#discarded || !this.#resolved || !this.#submitted || this.#started.size === 0) {
208
+ // Frame markers are the generic renderer timing lane. The optional volume
209
+ // markers enrich that same observation when authored fog passes exist, but
210
+ // a Standard graph without fog must still publish frame timing.
211
+ if (
212
+ this.#discarded ||
213
+ !this.#resolved ||
214
+ !this.#submitted ||
215
+ !this.#frameStarted ||
216
+ this.#unavailableReason !== undefined
217
+ ) {
168
218
  this.#observation = Promise.resolve(
169
- unavailable('timestamp capture did not reach an accepted volume submit'),
219
+ unavailable(
220
+ this.#unavailableReason ?? 'timestamp capture did not reach an accepted render submit',
221
+ ),
170
222
  );
171
223
  this.#dispose();
172
224
  return this.#observation;
@@ -174,47 +226,59 @@ export class GpuTimingCapture {
174
226
  this.#observation = this.#readbackBuffer
175
227
  .mapAsync(GPU_BUFFER_USAGE_MAP_READ)
176
228
  .then((mapped) => {
177
- if (!mapped.ok) return unavailable(`timestamp readback failed: ${mapped.error.code}`);
229
+ if (!mapped.ok) {
230
+ this.#dispose();
231
+ return unavailable(`timestamp readback failed: ${mapped.error.code}`);
232
+ }
178
233
  const range = mapped.value.getMappedRange();
179
234
  if (!range.ok) {
180
235
  mapped.value.unmap();
236
+ this.#dispose();
181
237
  return unavailable(`timestamp mapping failed: ${range.error.code}`);
182
238
  }
183
239
  const values = new DataView(range.value);
184
- const decoded = [...this.#finished.entries()]
185
- .sort((a, b) => a[1] - b[1])
186
- .map(([name, index]) => ({
187
- name,
188
- begin: values.getBigUint64(index * 2 * QUERY_STRIDE_BYTES, true),
189
- end: values.getBigUint64((index * 2 + 1) * QUERY_STRIDE_BYTES, true),
190
- }));
191
- if (decoded.some(({ end, begin }) => end < begin)) {
240
+ const decoded = this.#passes.map((pass, index) => ({
241
+ name: pass.name,
242
+ kind: pass.kind,
243
+ begin: values.getBigUint64(index * 2 * QUERY_RESULT_BYTES, true),
244
+ end: values.getBigUint64((index * 2 + 1) * QUERY_RESULT_BYTES, true),
245
+ }));
246
+ const frameBegin = decoded[0]?.begin;
247
+ const frameEnd = decoded[decoded.length - 1]?.end;
248
+ if (
249
+ frameBegin === undefined ||
250
+ frameEnd === undefined ||
251
+ frameEnd <= frameBegin ||
252
+ decoded.some(({ end, begin }) => end < begin)
253
+ ) {
192
254
  mapped.value.unmap();
193
255
  this.#dispose();
194
- return unavailable('timestamp query returned an end before its begin');
256
+ return unavailable('timestamp query returned a non-positive frame interval');
195
257
  }
196
- const passes = decoded.map(({ name, begin, end }) => ({
258
+ const volumeDecoded = decoded.filter(({ name }) =>
259
+ PASS_NAMES.includes(name as (typeof PASS_NAMES)[number]),
260
+ );
261
+ const passes = volumeDecoded.map(({ name, begin, end }) => ({
197
262
  name,
198
263
  milliseconds: (Number(end - begin) * this.#periodNanoseconds) / 1_000_000,
199
264
  }));
200
- const firstBegin = decoded.reduce(
201
- (first, sample) => (sample.begin < first ? sample.begin : first),
202
- decoded[0]?.begin ?? 0n,
203
- );
204
- const lastEnd = decoded.reduce(
205
- (last, sample) => (sample.end > last ? sample.end : last),
206
- decoded[0]?.end ?? 0n,
207
- );
208
- const totalMs = (Number(lastEnd - firstBegin) * this.#periodNanoseconds) / 1_000_000;
265
+ const frameMs = (Number(frameEnd - frameBegin) * this.#periodNanoseconds) / 1_000_000;
266
+ const firstBegin = volumeDecoded[0]?.begin;
267
+ const lastEnd = volumeDecoded[volumeDecoded.length - 1]?.end;
268
+ const totalMs =
269
+ firstBegin === undefined || lastEnd === undefined
270
+ ? 0
271
+ : (Number(lastEnd - firstBegin) * this.#periodNanoseconds) / 1_000_000;
209
272
  mapped.value.unmap();
210
273
  this.#dispose();
211
274
  if (
275
+ !Number.isFinite(frameMs) ||
212
276
  !Number.isFinite(totalMs) ||
213
277
  passes.some((pass) => !Number.isFinite(pass.milliseconds))
214
278
  ) {
215
279
  return unavailable('timestamp query returned a non-finite duration');
216
280
  }
217
- return Object.freeze({ status: 'ready', unit: 'ms', totalMs, passes });
281
+ return Object.freeze({ status: 'ready', unit: 'ms', totalMs, frameMs, passes });
218
282
  })
219
283
  .catch((cause: unknown) => {
220
284
  this.#dispose();
@@ -71,64 +71,6 @@ export function warnMultiLightDirectional(
71
71
  }
72
72
  }
73
73
 
74
- /**
75
- * feat-20260608-multi-light-warn-once M3: warn-once latch for point light
76
- * N>4 overrun (first-slice cap). Fires at most once per RenderSystem
77
- * lifetime.
78
- */
79
- export function warnMultiLightPoint(
80
- frameState: Pick<RenderFrameState, 'warnedMultiLightPoint'>,
81
- pointCount: number,
82
- envOverride?: { env?: { NODE_ENV?: string } },
83
- ): void {
84
- if (!frameState.warnedMultiLightPoint && pointCount > 4) {
85
- frameState.warnedMultiLightPoint = true;
86
- const env =
87
- envOverride ?? (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process;
88
- if (env?.env?.NODE_ENV !== 'production') {
89
- console.warn(
90
- '[forgeax] render-system-multi-light point: at most 4 entities (got N=' +
91
- pointCount +
92
- '). First 4 used; rest dropped.',
93
- {
94
- code: 'render-system-multi-light',
95
- expected: 'at most 4 point',
96
- detail: { type: 'point', got: pointCount },
97
- },
98
- );
99
- }
100
- }
101
- }
102
-
103
- /**
104
- * feat-20260608-multi-light-warn-once M3: warn-once latch for spot light
105
- * N>4 overrun (first-slice cap). Fires at most once per RenderSystem
106
- * lifetime.
107
- */
108
- export function warnMultiLightSpot(
109
- frameState: Pick<RenderFrameState, 'warnedMultiLightSpot'>,
110
- spotCount: number,
111
- envOverride?: { env?: { NODE_ENV?: string } },
112
- ): void {
113
- if (!frameState.warnedMultiLightSpot && spotCount > 4) {
114
- frameState.warnedMultiLightSpot = true;
115
- const env =
116
- envOverride ?? (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process;
117
- if (env?.env?.NODE_ENV !== 'production') {
118
- console.warn(
119
- '[forgeax] render-system-multi-light spot: at most 4 entities (got N=' +
120
- spotCount +
121
- '). First 4 used; rest dropped.',
122
- {
123
- code: 'render-system-multi-light',
124
- expected: 'at most 4 spot',
125
- detail: { type: 'spot', got: spotCount },
126
- },
127
- );
128
- }
129
- }
130
- }
131
-
132
74
  /**
133
75
  * feat-20260630-equirect-kind-internalized-ibl-declarative-skyligh M3 / w19:
134
76
  * once-warn for >1 Skylight entity (first archetype hit wins). Fires at most