@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
@@ -0,0 +1,180 @@
1
+ import type { RhiCaps } from '@forgeax/engine-rhi';
2
+ import { err, ok, type Result } from '@forgeax/engine-types';
3
+ import type { GpuPassTimingJson, GpuPassTimingReason } from './errors.js';
4
+
5
+ export const GPU_PASS_TIMING_SCHEMA_VERSION = '1.0' as const;
6
+
7
+ export interface GpuPassTimingOptions {
8
+ readonly maxPassesPerFrame?: number | undefined;
9
+ readonly maxFramesInFlight?: number | undefined;
10
+ readonly retentionFrames?: number | undefined;
11
+ }
12
+
13
+ export interface NormalizedGpuPassTimingOptions {
14
+ readonly maxPassesPerFrame: number;
15
+ readonly maxFramesInFlight: number;
16
+ readonly retentionFrames: number;
17
+ }
18
+
19
+ export const DEFAULT_GPU_PASS_TIMING_OPTIONS: NormalizedGpuPassTimingOptions = Object.freeze({
20
+ maxPassesPerFrame: 256,
21
+ maxFramesInFlight: 3,
22
+ retentionFrames: 8,
23
+ });
24
+
25
+ function optionError(field: string, value: number, min: number, max: number): GpuPassTimingReason {
26
+ return {
27
+ code: 'invalid-timing-options',
28
+ expected: `${field} is an integer in [${min}, ${max}]`,
29
+ hint: `set ${field} to an integer in [${min}, ${max}]`,
30
+ detail: { field, value, min, max },
31
+ };
32
+ }
33
+
34
+ function validInteger(value: number, min: number, max: number): boolean {
35
+ return Number.isInteger(value) && value >= min && value <= max;
36
+ }
37
+
38
+ export function normalizeGpuPassTimingOptions(
39
+ options: GpuPassTimingOptions = {},
40
+ ): Result<NormalizedGpuPassTimingOptions, GpuPassTimingReason> {
41
+ const maxPassesPerFrame =
42
+ options.maxPassesPerFrame ?? DEFAULT_GPU_PASS_TIMING_OPTIONS.maxPassesPerFrame;
43
+ if (!validInteger(maxPassesPerFrame, 1, 2048)) {
44
+ return err(optionError('maxPassesPerFrame', maxPassesPerFrame, 1, 2048));
45
+ }
46
+ const maxFramesInFlight =
47
+ options.maxFramesInFlight ?? DEFAULT_GPU_PASS_TIMING_OPTIONS.maxFramesInFlight;
48
+ if (!validInteger(maxFramesInFlight, 1, 8)) {
49
+ return err(optionError('maxFramesInFlight', maxFramesInFlight, 1, 8));
50
+ }
51
+ const retentionFrames =
52
+ options.retentionFrames ?? DEFAULT_GPU_PASS_TIMING_OPTIONS.retentionFrames;
53
+ if (!validInteger(retentionFrames, 1, 8)) {
54
+ return err(optionError('retentionFrames', retentionFrames, 1, 8));
55
+ }
56
+ return ok(Object.freeze({ maxPassesPerFrame, maxFramesInFlight, retentionFrames }));
57
+ }
58
+
59
+ export interface GpuPassTimingPassIdentity {
60
+ readonly passName: string;
61
+ readonly passKind: 'raster' | 'compute' | 'copy';
62
+ readonly executionIndex: number;
63
+ }
64
+
65
+ export type GpuPassTimingMeasurementSource = 'pass-boundary' | 'copy-boundary-envelope';
66
+
67
+ export interface GpuPassTimingMeasuredEntry extends GpuPassTimingPassIdentity {
68
+ readonly status: 'measured';
69
+ readonly measurementSource: GpuPassTimingMeasurementSource;
70
+ readonly beginningTick: string;
71
+ readonly endTick: string;
72
+ readonly durationNanoseconds: number;
73
+ readonly timerResolution?: 'equal-ticks' | undefined;
74
+ }
75
+
76
+ export interface GpuPassTimingUnmeasuredEntry extends GpuPassTimingPassIdentity {
77
+ readonly status: 'unmeasured';
78
+ readonly reason: GpuPassTimingReason;
79
+ }
80
+
81
+ export type GpuPassTimingEntry = GpuPassTimingMeasuredEntry | GpuPassTimingUnmeasuredEntry;
82
+
83
+ export interface GpuPassTimingFrame {
84
+ readonly schemaVersion: typeof GPU_PASS_TIMING_SCHEMA_VERSION;
85
+ readonly frameId: number;
86
+ readonly deviceGeneration: number;
87
+ readonly graphGeneration: number;
88
+ readonly backendKind: RhiCaps['backendKind'];
89
+ readonly timestampPeriodNanoseconds: number;
90
+ readonly passCapacity: number;
91
+ readonly executedPassCount: number;
92
+ readonly measuredPassCount: number;
93
+ readonly droppedPassCount: number;
94
+ readonly passes: readonly GpuPassTimingEntry[];
95
+ readonly measuredPassNanoseconds: number;
96
+ }
97
+
98
+ export interface GpuPassTimingFrameInput {
99
+ readonly frameId: number;
100
+ readonly deviceGeneration: number;
101
+ readonly graphGeneration: number;
102
+ readonly backendKind: RhiCaps['backendKind'];
103
+ readonly timestampPeriodNanoseconds: number;
104
+ readonly passCapacity: number;
105
+ readonly passes: readonly GpuPassTimingEntry[];
106
+ readonly droppedPassCount?: number | undefined;
107
+ }
108
+
109
+ export interface GpuPassTimingRef {
110
+ readonly frameId: number;
111
+ readonly deviceGeneration: number;
112
+ readonly graphGeneration: number;
113
+ }
114
+
115
+ export interface GpuPassTimingCapability {
116
+ readonly timestampQuery: boolean;
117
+ readonly timestampPeriodNanoseconds: number | null;
118
+ }
119
+
120
+ /**
121
+ * Receipt-bound GPU pass facts. The four statuses are exhaustive: a caller can
122
+ * branch on `status` without guessing whether a missing duration means that
123
+ * the device lacks capability, the bounded capture failed, or a pass was
124
+ * intentionally left unmeasured. A pass duration is not frame latency.
125
+ */
126
+ export type GpuPassTimingObservation =
127
+ | { readonly status: 'complete'; readonly frame: GpuPassTimingFrame }
128
+ | {
129
+ readonly status: 'partial';
130
+ readonly frame: GpuPassTimingFrame;
131
+ readonly reason: GpuPassTimingReason;
132
+ }
133
+ | {
134
+ readonly status: 'unavailable';
135
+ readonly reason: GpuPassTimingReason;
136
+ readonly capability: GpuPassTimingCapability;
137
+ }
138
+ | {
139
+ readonly status: 'failed';
140
+ readonly error: GpuPassTimingReason;
141
+ readonly latestKnownGood?: GpuPassTimingRef | undefined;
142
+ };
143
+
144
+ function deepFreeze<T>(value: T): T {
145
+ if (value === null || typeof value !== 'object' || Object.isFrozen(value)) return value;
146
+ Object.freeze(value);
147
+ for (const child of Object.values(value as Record<string, unknown>)) deepFreeze(child);
148
+ return value;
149
+ }
150
+
151
+ export function createGpuPassTimingFrame(input: GpuPassTimingFrameInput): GpuPassTimingFrame {
152
+ let measuredPassCount = 0;
153
+ let measuredPassNanoseconds = 0;
154
+ for (const pass of input.passes) {
155
+ if (pass.status === 'measured') {
156
+ measuredPassCount += 1;
157
+ measuredPassNanoseconds += pass.durationNanoseconds;
158
+ }
159
+ }
160
+ return {
161
+ schemaVersion: GPU_PASS_TIMING_SCHEMA_VERSION,
162
+ frameId: input.frameId,
163
+ deviceGeneration: input.deviceGeneration,
164
+ graphGeneration: input.graphGeneration,
165
+ backendKind: input.backendKind,
166
+ timestampPeriodNanoseconds: input.timestampPeriodNanoseconds,
167
+ passCapacity: input.passCapacity,
168
+ executedPassCount: input.passes.length + (input.droppedPassCount ?? 0),
169
+ measuredPassCount,
170
+ droppedPassCount: input.droppedPassCount ?? 0,
171
+ passes: input.passes,
172
+ measuredPassNanoseconds,
173
+ };
174
+ }
175
+
176
+ export function freezeGpuPassTimingFrame(frame: GpuPassTimingFrame): GpuPassTimingFrame {
177
+ return deepFreeze(frame);
178
+ }
179
+
180
+ export type GpuPassTimingJsonObject = { readonly [key: string]: GpuPassTimingJson };
@@ -0,0 +1,34 @@
1
+ export type GpuPassTimingReasonCode =
2
+ | 'gpu-timing-not-enabled'
3
+ | 'timestamp-query-unsupported'
4
+ | 'timestamp-period-unavailable'
5
+ | 'query-budget-exceeded'
6
+ | 'timing-in-flight-exhausted'
7
+ | 'timing-retention-expired'
8
+ | 'timestamp-write-unavailable'
9
+ | 'timestamp-owner-conflict'
10
+ | 'timestamp-resolve-failed'
11
+ | 'timestamp-readback-failed'
12
+ | 'timestamp-range-invalid'
13
+ | 'timing-device-generation-stale'
14
+ | 'timing-session-disposed'
15
+ | 'invalid-timing-options';
16
+
17
+ export type GpuPassTimingJson =
18
+ | null
19
+ | boolean
20
+ | number
21
+ | string
22
+ | readonly GpuPassTimingJson[]
23
+ | { readonly [key: string]: GpuPassTimingJson };
24
+
25
+ export interface GpuPassTimingReason {
26
+ readonly code: GpuPassTimingReasonCode;
27
+ readonly expected: string;
28
+ readonly hint: string;
29
+ readonly detail: { readonly [key: string]: GpuPassTimingJson };
30
+ readonly cause?: { readonly [key: string]: GpuPassTimingJson } | undefined;
31
+ }
32
+
33
+ export type GpuPassTimingError = GpuPassTimingReason;
34
+ export type GpuPassTimingErrorCode = GpuPassTimingReasonCode;
@@ -0,0 +1,37 @@
1
+ export type {
2
+ GpuPassTimingCapability,
3
+ GpuPassTimingEntry,
4
+ GpuPassTimingFrame,
5
+ GpuPassTimingFrameInput,
6
+ GpuPassTimingMeasuredEntry,
7
+ GpuPassTimingMeasurementSource,
8
+ GpuPassTimingObservation,
9
+ GpuPassTimingOptions,
10
+ GpuPassTimingPassIdentity,
11
+ GpuPassTimingRef,
12
+ GpuPassTimingUnmeasuredEntry,
13
+ NormalizedGpuPassTimingOptions,
14
+ } from './contract.js';
15
+ export {
16
+ createGpuPassTimingFrame,
17
+ DEFAULT_GPU_PASS_TIMING_OPTIONS,
18
+ freezeGpuPassTimingFrame,
19
+ GPU_PASS_TIMING_SCHEMA_VERSION,
20
+ normalizeGpuPassTimingOptions,
21
+ } from './contract.js';
22
+ export type {
23
+ GpuPassTimingError,
24
+ GpuPassTimingErrorCode,
25
+ GpuPassTimingJson,
26
+ GpuPassTimingReason,
27
+ GpuPassTimingReasonCode,
28
+ } from './errors.js';
29
+ export type { GpuPassTimingTickInput, GpuPassTimingTickResult } from './parser.js';
30
+ export { parseGpuPassTimingTicks } from './parser.js';
31
+ export type {
32
+ GpuPassTimingCapture,
33
+ GpuPassTimingFrameIdentity,
34
+ GpuPassTimingSession,
35
+ GpuPassTimingSessionOptions,
36
+ } from './session.js';
37
+ export { createGpuPassTimingSession } from './session.js';
@@ -0,0 +1,97 @@
1
+ import { err, ok, type Result } from '@forgeax/engine-types';
2
+ import type { GpuPassTimingMeasuredEntry } from './contract.js';
3
+ import type { GpuPassTimingReason } from './errors.js';
4
+
5
+ export interface GpuPassTimingTickInput {
6
+ readonly beginningTick: string;
7
+ readonly endTick: string;
8
+ readonly timestampPeriodNanoseconds: number;
9
+ }
10
+
11
+ export type GpuPassTimingTickResult = Omit<
12
+ GpuPassTimingMeasuredEntry,
13
+ 'passName' | 'passKind' | 'executionIndex' | 'measurementSource'
14
+ >;
15
+
16
+ function failure(
17
+ code: GpuPassTimingReason['code'],
18
+ expected: string,
19
+ hint: string,
20
+ detail: { readonly [key: string]: null | boolean | number | string },
21
+ ): GpuPassTimingReason {
22
+ return { code, expected, hint, detail };
23
+ }
24
+
25
+ function decimal(value: string): bigint | undefined {
26
+ return /^(0|[1-9][0-9]*)$/.test(value) ? BigInt(value) : undefined;
27
+ }
28
+
29
+ export function parseGpuPassTimingTicks(
30
+ input: GpuPassTimingTickInput,
31
+ ): Result<GpuPassTimingTickResult, GpuPassTimingReason> {
32
+ const period = input.timestampPeriodNanoseconds;
33
+ if (!Number.isFinite(period) || period <= 0) {
34
+ return err(
35
+ failure(
36
+ 'timestamp-period-unavailable',
37
+ 'timestampPeriodNanoseconds is finite and greater than zero',
38
+ 'use a device with a trustworthy positive timestamp period',
39
+ { timestampPeriodNanoseconds: period },
40
+ ),
41
+ );
42
+ }
43
+ const beginning = decimal(input.beginningTick);
44
+ const end = decimal(input.endTick);
45
+ if (beginning === undefined || end === undefined) {
46
+ return err(
47
+ failure(
48
+ 'timestamp-range-invalid',
49
+ 'raw timestamp ticks are unsigned decimal strings',
50
+ 'retain the GPU u64 readback as a decimal string before parsing',
51
+ { beginningTick: input.beginningTick, endTick: input.endTick },
52
+ ),
53
+ );
54
+ }
55
+ if (end < beginning) {
56
+ return err(
57
+ failure(
58
+ 'timestamp-range-invalid',
59
+ 'end tick is greater than or equal to beginning tick',
60
+ 'discard the readback and wait for a later receipt',
61
+ { beginningTick: input.beginningTick, endTick: input.endTick },
62
+ ),
63
+ );
64
+ }
65
+ const delta = end - beginning;
66
+ if (delta > BigInt(Number.MAX_SAFE_INTEGER)) {
67
+ return err(
68
+ failure(
69
+ 'timestamp-range-invalid',
70
+ 'tick delta converts to a safe finite duration',
71
+ 'use a bounded timestamp range or capture a later receipt',
72
+ { beginningTick: input.beginningTick, endTick: input.endTick },
73
+ ),
74
+ );
75
+ }
76
+ const durationNanoseconds = Number(delta) * period;
77
+ if (
78
+ !Number.isFinite(durationNanoseconds) ||
79
+ !Number.isSafeInteger(Math.round(durationNanoseconds))
80
+ ) {
81
+ return err(
82
+ failure(
83
+ 'timestamp-range-invalid',
84
+ 'derived duration is finite and safely representable',
85
+ 'use a smaller tick range or a trustworthy timestamp period',
86
+ { timestampPeriodNanoseconds: period },
87
+ ),
88
+ );
89
+ }
90
+ return ok({
91
+ status: 'measured',
92
+ beginningTick: input.beginningTick,
93
+ endTick: input.endTick,
94
+ durationNanoseconds,
95
+ ...(delta === 0n ? { timerResolution: 'equal-ticks' as const } : {}),
96
+ });
97
+ }