@forgeax/engine-render 0.1.20 → 0.1.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (645) hide show
  1. package/README.md +365 -29
  2. package/dist/assembly/backend-contract.d.ts +13 -0
  3. package/dist/assembly/backend-contract.d.ts.map +1 -1
  4. package/dist/assembly/device-feature-admission.d.ts +18 -0
  5. package/dist/assembly/device-feature-admission.d.ts.map +1 -0
  6. package/dist/assembly/directional-shadow-inspection.d.ts +38 -0
  7. package/dist/assembly/directional-shadow-inspection.d.ts.map +1 -0
  8. package/dist/assembly/factory.d.ts +30 -19
  9. package/dist/assembly/factory.d.ts.map +1 -1
  10. package/dist/assembly/host-contract.d.ts +19 -0
  11. package/dist/assembly/host-contract.d.ts.map +1 -1
  12. package/dist/assembly/render-target-host.d.ts +46 -0
  13. package/dist/assembly/render-target-host.d.ts.map +1 -0
  14. package/dist/assets/render-asset-port.d.ts.map +1 -1
  15. package/dist/authoring.mjs +4 -1
  16. package/dist/authoring.mjs.map +1 -1
  17. package/dist/capture/cube-views.d.ts +21 -0
  18. package/dist/capture/cube-views.d.ts.map +1 -0
  19. package/dist/capture/scheduler.d.ts +54 -0
  20. package/dist/capture/scheduler.d.ts.map +1 -0
  21. package/dist/{chunk-PCHBPYML.mjs → chunk-4L3P6DT5.mjs} +2 -2
  22. package/dist/chunk-4L3P6DT5.mjs.map +1 -0
  23. package/dist/{chunk-VFPLTKCU.mjs → chunk-4NPUASZR.mjs} +15 -4
  24. package/dist/chunk-4NPUASZR.mjs.map +1 -0
  25. package/dist/chunk-DIYW3M5D.mjs +5085 -0
  26. package/dist/chunk-DIYW3M5D.mjs.map +1 -0
  27. package/dist/chunk-FBC4R44J.mjs +1003 -0
  28. package/dist/chunk-FBC4R44J.mjs.map +1 -0
  29. package/dist/{chunk-CDTWTHZR.mjs → chunk-FF7K3FSO.mjs} +474 -168
  30. package/dist/chunk-FF7K3FSO.mjs.map +1 -0
  31. package/dist/chunk-HZUPSYW7.mjs +1104 -0
  32. package/dist/chunk-HZUPSYW7.mjs.map +1 -0
  33. package/dist/{chunk-TBQJOK2L.mjs → chunk-QODA5UKU.mjs} +321 -269
  34. package/dist/chunk-QODA5UKU.mjs.map +1 -0
  35. package/dist/chunk-YALPS44A.mjs +296 -0
  36. package/dist/chunk-YALPS44A.mjs.map +1 -0
  37. package/dist/{chunk-4XINDLAY.mjs → chunk-ZUWKAZ2I.mjs} +1963 -2178
  38. package/dist/chunk-ZUWKAZ2I.mjs.map +1 -0
  39. package/dist/cluster-binner.d.ts +5 -0
  40. package/dist/cluster-binner.d.ts.map +1 -1
  41. package/dist/components/camera.d.ts +1 -0
  42. package/dist/components/camera.d.ts.map +1 -1
  43. package/dist/components/cube-camera.d.ts +20 -0
  44. package/dist/components/cube-camera.d.ts.map +1 -0
  45. package/dist/components/directional-light.d.ts +11 -2
  46. package/dist/components/directional-light.d.ts.map +1 -1
  47. package/dist/components/directional-shadow-filter.d.ts +25 -0
  48. package/dist/components/directional-shadow-filter.d.ts.map +1 -0
  49. package/dist/components/index.d.ts +5 -0
  50. package/dist/components/index.d.ts.map +1 -1
  51. package/dist/components/light-helpers.d.ts +4 -0
  52. package/dist/components/light-helpers.d.ts.map +1 -1
  53. package/dist/components/light-probe.d.ts +9 -0
  54. package/dist/components/light-probe.d.ts.map +1 -0
  55. package/dist/components/rect-area-light.d.ts +12 -0
  56. package/dist/components/rect-area-light.d.ts.map +1 -0
  57. package/dist/components/reflection-probe.d.ts +17 -0
  58. package/dist/components/reflection-probe.d.ts.map +1 -0
  59. package/dist/components/scene-instance.d.ts +4 -0
  60. package/dist/components/scene-instance.d.ts.map +1 -1
  61. package/dist/components/spot-light.d.ts +3 -0
  62. package/dist/components/spot-light.d.ts.map +1 -1
  63. package/dist/construct-renderer.mjs +14836 -9620
  64. package/dist/construct-renderer.mjs.map +1 -1
  65. package/dist/device/gpu-residency.d.ts +8 -1
  66. package/dist/device/gpu-residency.d.ts.map +1 -1
  67. package/dist/device/lifecycle-transaction.d.ts +2 -0
  68. package/dist/device/lifecycle-transaction.d.ts.map +1 -0
  69. package/dist/environment/frame.d.ts.map +1 -1
  70. package/dist/environment/lifecycle.d.ts +5 -0
  71. package/dist/environment/lifecycle.d.ts.map +1 -1
  72. package/dist/errors/gpu-driven.d.ts +26 -0
  73. package/dist/errors/gpu-driven.d.ts.map +1 -0
  74. package/dist/errors/index.d.ts +1 -0
  75. package/dist/errors/index.d.ts.map +1 -1
  76. package/dist/errors/recover.d.ts +9 -1
  77. package/dist/errors/recover.d.ts.map +1 -1
  78. package/dist/errors/render.d.ts +166 -93
  79. package/dist/errors/render.d.ts.map +1 -1
  80. package/dist/extract/directional-shadow-projection.d.ts +23 -0
  81. package/dist/extract/directional-shadow-projection.d.ts.map +1 -0
  82. package/dist/extract/environment.d.ts +14 -0
  83. package/dist/extract/environment.d.ts.map +1 -1
  84. package/dist/extract/gpu-driven.d.ts +50 -0
  85. package/dist/extract/gpu-driven.d.ts.map +1 -0
  86. package/dist/extract/visibility.d.ts.map +1 -1
  87. package/dist/features/fullscreen.d.ts.map +1 -1
  88. package/dist/features/targets.d.ts.map +1 -1
  89. package/dist/features/types.d.ts +10 -0
  90. package/dist/features/types.d.ts.map +1 -1
  91. package/dist/fullscreen-post-process-pass.d.ts +13 -2
  92. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  93. package/dist/gpu-driven/batch-topology.d.ts +34 -0
  94. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  95. package/dist/gpu-driven/prepared-draw.d.ts +63 -0
  96. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -0
  97. package/dist/gpu-driven/production-raster.d.ts +97 -2
  98. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  99. package/dist/gpu-driven/view-gpu.d.ts +64 -1
  100. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  101. package/dist/gpu-scene-schema.d.ts +14 -0
  102. package/dist/gpu-scene-schema.d.ts.map +1 -1
  103. package/dist/gpu-scene.d.ts +8 -1
  104. package/dist/gpu-scene.d.ts.map +1 -1
  105. package/dist/gpu-usage.d.ts +0 -1
  106. package/dist/gpu-usage.d.ts.map +1 -1
  107. package/dist/hdrp-buffers.d.ts +21 -19
  108. package/dist/hdrp-buffers.d.ts.map +1 -1
  109. package/dist/ibl/IblPipelineCache.d.ts +4 -0
  110. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  111. package/dist/ibl/kernel-cache.d.ts +36 -0
  112. package/dist/ibl/kernel-cache.d.ts.map +1 -0
  113. package/dist/index.d.ts +39 -3
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.mjs +91 -6
  116. package/dist/index.mjs.map +1 -1
  117. package/dist/inspection-types.d.ts +214 -1
  118. package/dist/inspection-types.d.ts.map +1 -1
  119. package/dist/instances-derived-bounds.d.ts +50 -0
  120. package/dist/instances-derived-bounds.d.ts.map +1 -0
  121. package/dist/internal.d.ts +9 -0
  122. package/dist/internal.d.ts.map +1 -1
  123. package/dist/internal.mjs +23 -2
  124. package/dist/internal.mjs.map +1 -1
  125. package/dist/light-buffer-layout.d.ts +58 -140
  126. package/dist/light-buffer-layout.d.ts.map +1 -1
  127. package/dist/materials.d.ts.map +1 -1
  128. package/dist/mesh-material-bindings.d.ts +54 -0
  129. package/dist/mesh-material-bindings.d.ts.map +1 -1
  130. package/dist/pbr-pipeline.d.ts +38 -14
  131. package/dist/pbr-pipeline.d.ts.map +1 -1
  132. package/dist/pipeline/standard-forward-lane.d.ts +2 -1
  133. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  134. package/dist/pipeline/standard-lighting/errors.d.ts +4 -0
  135. package/dist/pipeline/standard-lighting/errors.d.ts.map +1 -0
  136. package/dist/pipeline/standard-lighting/graph.d.ts +24 -0
  137. package/dist/pipeline/standard-lighting/graph.d.ts.map +1 -0
  138. package/dist/pipeline/standard-lighting/inspection.d.ts +38 -0
  139. package/dist/pipeline/standard-lighting/inspection.d.ts.map +1 -0
  140. package/dist/pipeline/standard-lighting/layout.d.ts +28 -0
  141. package/dist/pipeline/standard-lighting/layout.d.ts.map +1 -0
  142. package/dist/pipeline/standard-lighting/light-frame.d.ts +33 -0
  143. package/dist/pipeline/standard-lighting/light-frame.d.ts.map +1 -0
  144. package/dist/pipeline/standard-lighting/membership.d.ts +14 -0
  145. package/dist/pipeline/standard-lighting/membership.d.ts.map +1 -0
  146. package/dist/pipeline/standard-lighting/prepare.d.ts +16 -0
  147. package/dist/pipeline/standard-lighting/prepare.d.ts.map +1 -0
  148. package/dist/pipeline/standard-lighting/topology.d.ts +45 -0
  149. package/dist/pipeline/standard-lighting/topology.d.ts.map +1 -0
  150. package/dist/pipeline/standard-lighting/transport.d.ts +36 -0
  151. package/dist/pipeline/standard-lighting/transport.d.ts.map +1 -0
  152. package/dist/pipeline/standard-pipeline.d.ts +4 -13
  153. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  154. package/dist/pipeline/standard-post.d.ts.map +1 -1
  155. package/dist/pipeline/standard-profile.d.ts +5 -26
  156. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  157. package/dist/pipeline-builder.d.ts +2 -0
  158. package/dist/pipeline-builder.d.ts.map +1 -1
  159. package/dist/pipeline-spec.d.ts +40 -7
  160. package/dist/pipeline-spec.d.ts.map +1 -1
  161. package/dist/plugin.d.ts.map +1 -1
  162. package/dist/point-shadow-inspection.d.ts +21 -0
  163. package/dist/point-shadow-inspection.d.ts.map +1 -0
  164. package/dist/prepare/extended-lighting/ltc-resources.d.ts +31 -0
  165. package/dist/prepare/extended-lighting/ltc-resources.d.ts.map +1 -0
  166. package/dist/prepare/extended-lighting/resources.d.ts +72 -0
  167. package/dist/prepare/extended-lighting/resources.d.ts.map +1 -0
  168. package/dist/prepare/extended-lighting/spot-modifiers.d.ts +42 -0
  169. package/dist/prepare/extended-lighting/spot-modifiers.d.ts.map +1 -0
  170. package/dist/prepare/extended-lighting/state.d.ts +24 -0
  171. package/dist/prepare/extended-lighting/state.d.ts.map +1 -0
  172. package/dist/record/frame-lighting.d.ts +33 -36
  173. package/dist/record/frame-lighting.d.ts.map +1 -1
  174. package/dist/record/frame-snapshot.d.ts +78 -24
  175. package/dist/record/frame-snapshot.d.ts.map +1 -1
  176. package/dist/record/frame-targets.d.ts +5 -0
  177. package/dist/record/frame-targets.d.ts.map +1 -1
  178. package/dist/record/frame.d.ts +16 -6
  179. package/dist/record/frame.d.ts.map +1 -1
  180. package/dist/record/gpu-pass-timing/contract.d.ts +96 -0
  181. package/dist/record/gpu-pass-timing/contract.d.ts.map +1 -0
  182. package/dist/record/gpu-pass-timing/errors.d.ts +18 -0
  183. package/dist/record/gpu-pass-timing/errors.d.ts.map +1 -0
  184. package/dist/record/gpu-pass-timing/index.d.ts +8 -0
  185. package/dist/record/gpu-pass-timing/index.d.ts.map +1 -0
  186. package/dist/record/gpu-pass-timing/parser.d.ts +11 -0
  187. package/dist/record/gpu-pass-timing/parser.d.ts.map +1 -0
  188. package/dist/record/gpu-pass-timing/session.d.ts +43 -0
  189. package/dist/record/gpu-pass-timing/session.d.ts.map +1 -0
  190. package/dist/record/gpu-timing.d.ts +20 -3
  191. package/dist/record/gpu-timing.d.ts.map +1 -1
  192. package/dist/record/helpers.d.ts +0 -20
  193. package/dist/record/helpers.d.ts.map +1 -1
  194. package/dist/record/main-pass-geometry.d.ts +6 -1
  195. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  196. package/dist/record/main-pass-material.d.ts +25 -2
  197. package/dist/record/main-pass-material.d.ts.map +1 -1
  198. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  199. package/dist/record/main-pass.d.ts +2 -0
  200. package/dist/record/main-pass.d.ts.map +1 -1
  201. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  202. package/dist/record/render-context.d.ts +98 -6
  203. package/dist/record/render-context.d.ts.map +1 -1
  204. package/dist/record/shadow-pass.d.ts.map +1 -1
  205. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  206. package/dist/record/typed-frame-graph.d.ts +119 -4
  207. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  208. package/dist/record/view-ubo.d.ts +7 -5
  209. package/dist/record/view-ubo.d.ts.map +1 -1
  210. package/dist/reflection/filter.d.ts +22 -0
  211. package/dist/reflection/filter.d.ts.map +1 -0
  212. package/dist/reflection/gpu-table.d.ts +25 -0
  213. package/dist/reflection/gpu-table.d.ts.map +1 -0
  214. package/dist/reflection/inspection.d.ts +10 -0
  215. package/dist/reflection/inspection.d.ts.map +1 -0
  216. package/dist/reflection/projection.d.ts +140 -0
  217. package/dist/reflection/projection.d.ts.map +1 -0
  218. package/dist/reflection/record-owner.d.ts +60 -0
  219. package/dist/reflection/record-owner.d.ts.map +1 -0
  220. package/dist/render-contract.d.ts +62 -14
  221. package/dist/render-contract.d.ts.map +1 -1
  222. package/dist/render-graph-primitives.d.ts +1 -0
  223. package/dist/render-graph-primitives.d.ts.map +1 -1
  224. package/dist/render-pipeline.d.ts +49 -2
  225. package/dist/render-pipeline.d.ts.map +1 -1
  226. package/dist/render-system-extract.d.ts +160 -31
  227. package/dist/render-system-extract.d.ts.map +1 -1
  228. package/dist/render-system.d.ts +28 -2
  229. package/dist/render-system.d.ts.map +1 -1
  230. package/dist/renderer.d.ts +43 -0
  231. package/dist/renderer.d.ts.map +1 -0
  232. package/dist/scene/probe-blend-record.d.ts +22 -0
  233. package/dist/scene/probe-blend-record.d.ts.map +1 -0
  234. package/dist/scene/probe-blend.d.ts +142 -0
  235. package/dist/scene/probe-blend.d.ts.map +1 -0
  236. package/dist/scene/render-scene-types.d.ts +0 -6
  237. package/dist/scene/render-scene-types.d.ts.map +1 -1
  238. package/dist/scene/render-scene.d.ts +117 -9
  239. package/dist/scene/render-scene.d.ts.map +1 -1
  240. package/dist/scene/visibility/bounds.d.ts +20 -0
  241. package/dist/scene/visibility/bounds.d.ts.map +1 -0
  242. package/dist/scene/visibility/budget.d.ts +16 -0
  243. package/dist/scene/visibility/budget.d.ts.map +1 -0
  244. package/dist/scene/visibility/facet.d.ts +73 -0
  245. package/dist/scene/visibility/facet.d.ts.map +1 -0
  246. package/dist/scene/visibility/gpu-frame-timing.d.ts +41 -0
  247. package/dist/scene/visibility/gpu-frame-timing.d.ts.map +1 -0
  248. package/dist/scene/visibility/gpu-lod.d.ts +46 -0
  249. package/dist/scene/visibility/gpu-lod.d.ts.map +1 -0
  250. package/dist/scene/visibility/inspection.d.ts +132 -0
  251. package/dist/scene/visibility/inspection.d.ts.map +1 -0
  252. package/dist/scene/visibility/lod-selector.d.ts +25 -0
  253. package/dist/scene/visibility/lod-selector.d.ts.map +1 -0
  254. package/dist/scene/visibility/occlusion-confidence.d.ts +81 -0
  255. package/dist/scene/visibility/occlusion-confidence.d.ts.map +1 -0
  256. package/dist/scene/visibility/occlusion-pass.d.ts +57 -0
  257. package/dist/scene/visibility/occlusion-pass.d.ts.map +1 -0
  258. package/dist/scene/visibility/occlusion-query-pool.d.ts +57 -0
  259. package/dist/scene/visibility/occlusion-query-pool.d.ts.map +1 -0
  260. package/dist/scene/visibility/occlusion-runtime.d.ts +96 -0
  261. package/dist/scene/visibility/occlusion-runtime.d.ts.map +1 -0
  262. package/dist/scene/visibility/types.d.ts +34 -0
  263. package/dist/scene/visibility/types.d.ts.map +1 -0
  264. package/dist/shadow-atlas.d.ts +3 -3
  265. package/dist/shadow-atlas.d.ts.map +1 -1
  266. package/dist/ssao-buffers.d.ts +3 -0
  267. package/dist/ssao-buffers.d.ts.map +1 -1
  268. package/dist/ssr/admission.d.ts +122 -0
  269. package/dist/ssr/admission.d.ts.map +1 -0
  270. package/dist/ssr/composition.d.ts +32 -0
  271. package/dist/ssr/composition.d.ts.map +1 -0
  272. package/dist/ssr/errors.d.ts +39 -0
  273. package/dist/ssr/errors.d.ts.map +1 -0
  274. package/dist/ssr/identity.d.ts +13 -0
  275. package/dist/ssr/identity.d.ts.map +1 -0
  276. package/dist/systems/skin-palette-allocator.d.ts +1 -1
  277. package/dist/targets/contracts.d.ts +66 -0
  278. package/dist/targets/contracts.d.ts.map +1 -0
  279. package/dist/targets/graph-projection.d.ts +29 -0
  280. package/dist/targets/graph-projection.d.ts.map +1 -0
  281. package/dist/targets/material-source.d.ts +34 -0
  282. package/dist/targets/material-source.d.ts.map +1 -0
  283. package/dist/targets/owner.d.ts +32 -0
  284. package/dist/targets/owner.d.ts.map +1 -0
  285. package/dist/targets/physical.d.ts +18 -0
  286. package/dist/targets/physical.d.ts.map +1 -0
  287. package/dist/targets/readback.d.ts +39 -0
  288. package/dist/targets/readback.d.ts.map +1 -0
  289. package/dist/temporal/frame-coordinator.d.ts +13 -0
  290. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  291. package/dist/temporal/frame.d.ts +2 -0
  292. package/dist/temporal/frame.d.ts.map +1 -1
  293. package/dist/temporal/index.mjs +6 -5
  294. package/dist/temporal/view.d.ts +7 -0
  295. package/dist/temporal/view.d.ts.map +1 -1
  296. package/dist/tilemap-chunk-extract-system.d.ts +1 -1
  297. package/dist/typed-render-graph-primitives.d.ts +5 -1
  298. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  299. package/dist/typed-shadow-passes.d.ts +1 -1
  300. package/dist/typed-shadow-passes.d.ts.map +1 -1
  301. package/dist/volume/passes.d.ts +9 -5
  302. package/dist/volume/passes.d.ts.map +1 -1
  303. package/package.json +20 -20
  304. package/src/__tests__/bloom-exact-zero.unit.test.ts +48 -19
  305. package/src/__tests__/bloom-lifecycle.integration.test.ts +41 -13
  306. package/src/__tests__/camera-target-consumption.unit.test.ts +53 -0
  307. package/src/__tests__/cluster-binner.unit.test.ts +35 -0
  308. package/src/__tests__/cluster-grid-default-surface.unit.test.ts +12 -2
  309. package/src/__tests__/cube-camera-scheduler.unit.test.ts +70 -0
  310. package/src/__tests__/cube-camera-single-submit.perf.test.ts +75 -0
  311. package/src/__tests__/cube-camera-view-matrices.unit.test.ts +41 -0
  312. package/src/__tests__/cube-camera-vocabulary.unit.test.ts +47 -0
  313. package/src/__tests__/cube-camera.integration.test.ts +42 -0
  314. package/src/__tests__/detached-inspection.integration.test.ts +6 -0
  315. package/src/__tests__/device-feature-admission.unit.test.ts +85 -0
  316. package/src/__tests__/direct-light-snapshot.unit.test.ts +62 -6
  317. package/src/__tests__/docs-gate-green.unit.test.ts +38 -0
  318. package/src/__tests__/environment-generation.integration.test.ts +16 -0
  319. package/src/__tests__/evidence-identity.ts +13 -0
  320. package/src/__tests__/evidence-identity.unit.test.ts +24 -0
  321. package/src/__tests__/extended-lighting-recovery.browser.test.ts +14 -0
  322. package/src/__tests__/extended-lighting-recovery.dawn.test.ts +14 -0
  323. package/src/__tests__/extended-lighting-recovery.integration.test.ts +81 -0
  324. package/src/__tests__/extended-lighting-resources.unit.test.ts +51 -0
  325. package/src/__tests__/extended-lighting-zero-feature.integration.test.ts +52 -0
  326. package/src/__tests__/factory-contract.integration.test.ts +288 -29
  327. package/src/__tests__/fog-component.unit.test.ts +67 -0
  328. package/src/__tests__/fog.integration.test.ts +86 -0
  329. package/src/__tests__/frame-observation.contract.test.ts +15 -0
  330. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +37 -0
  331. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +146 -0
  332. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +10 -8
  333. package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +18 -1
  334. package/src/__tests__/gpu-driven-production.integration.test.ts +579 -17
  335. package/src/__tests__/gpu-driven-scaling.unit.test.ts +66 -2
  336. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +26 -1
  337. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +101 -6
  338. package/src/__tests__/gpu-driven-view.browser.test.ts +3 -3
  339. package/src/__tests__/gpu-driven-view.dawn.test.ts +3 -3
  340. package/src/__tests__/gpu-driven-view.unit.test.ts +50 -0
  341. package/src/__tests__/gpu-lod-evidence.ts +188 -0
  342. package/src/__tests__/gpu-lod-fallback.integration.test.ts +10 -0
  343. package/src/__tests__/gpu-lod-indirect.integration.test.ts +40 -0
  344. package/src/__tests__/gpu-lod-parity.dawn.test.ts +29 -0
  345. package/src/__tests__/gpu-lod-readiness.integration.test.ts +52 -0
  346. package/src/__tests__/gpu-lod-schema.unit.test.ts +66 -0
  347. package/src/__tests__/gpu-lod-selector.unit.test.ts +28 -0
  348. package/src/__tests__/gpu-lod-silhouette.browser.test.ts +13 -0
  349. package/src/__tests__/gpu-pass-timing-browser-runner.ts +281 -0
  350. package/src/__tests__/gpu-pass-timing-coexistence.integration.test.ts +80 -0
  351. package/src/__tests__/gpu-pass-timing-contract.unit.test.ts +243 -0
  352. package/src/__tests__/gpu-pass-timing-exact-zero.unit.test.ts +131 -0
  353. package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +230 -0
  354. package/src/__tests__/gpu-pass-timing-observation.unit.test.ts +233 -0
  355. package/src/__tests__/gpu-pass-timing-session.unit.test.ts +438 -0
  356. package/src/__tests__/gpu-pass-timing.browser.test.ts +26 -0
  357. package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +125 -0
  358. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +66 -1
  359. package/src/__tests__/gpu-scene.dawn.test.ts +8 -1
  360. package/src/__tests__/gpu-scene.unit.test.ts +49 -3
  361. package/src/__tests__/hdrp-group2-visibility.unit.test.ts +24 -0
  362. package/src/__tests__/instances-culling.integration.test.ts +94 -0
  363. package/src/__tests__/instances-derived-bounds.unit.test.ts +118 -0
  364. package/src/__tests__/light-buffer-layout.unit.test.ts +113 -3
  365. package/src/__tests__/light-inspection.unit.test.ts +55 -0
  366. package/src/__tests__/light-resource-error.unit.test.ts +43 -0
  367. package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +109 -0
  368. package/src/__tests__/lod-bounds.unit.test.ts +42 -0
  369. package/src/__tests__/lod-cpu-lane.integration.test.ts +55 -0
  370. package/src/__tests__/lod-cpu-no-change.perf.test.ts +19 -0
  371. package/src/__tests__/lod-gpu-frame-timing.unit.test.ts +49 -0
  372. package/src/__tests__/lod-multi-view.integration.test.ts +63 -0
  373. package/src/__tests__/lod-occlusion-device-loss.integration.test.ts +27 -0
  374. package/src/__tests__/lod-occlusion-final-decision.integration.test.ts +47 -0
  375. package/src/__tests__/lod-occlusion-inspection.integration.test.ts +217 -0
  376. package/src/__tests__/lod-occlusion-inspection.schema.test-d.ts +14 -0
  377. package/src/__tests__/lod-occlusion-inspection.unit.test.ts +72 -0
  378. package/src/__tests__/lod-occlusion-visual-evidence.ts +91 -0
  379. package/src/__tests__/lod-occlusion.browser.test.ts +15 -0
  380. package/src/__tests__/lod-occlusion.dawn.test.ts +20 -0
  381. package/src/__tests__/lod-selector.profile.test.ts +35 -0
  382. package/src/__tests__/lod-selector.unit.test.ts +68 -0
  383. package/src/__tests__/lod-visibility-identity.unit.test.ts +198 -0
  384. package/src/__tests__/lod-visibility-lifecycle.integration.test.ts +132 -0
  385. package/src/__tests__/ltc-resources.unit.test.ts +32 -0
  386. package/src/__tests__/material-contract-inventory.unit.test.ts +17 -0
  387. package/src/__tests__/material-observation.integration.test.ts +101 -0
  388. package/src/__tests__/occlusion-confidence.unit.test.ts +168 -0
  389. package/src/__tests__/occlusion-invalidation.integration.test.ts +37 -0
  390. package/src/__tests__/occlusion-pass-routing.unit.test.ts +16 -0
  391. package/src/__tests__/occlusion-pass.dawn.test.ts +20 -0
  392. package/src/__tests__/occlusion-pass.integration.test.ts +43 -0
  393. package/src/__tests__/occlusion-pass.rhi-null.test.ts +22 -0
  394. package/src/__tests__/occlusion-query-pool.rhi-null.test.ts +21 -0
  395. package/src/__tests__/occlusion-query-pool.unit.test.ts +95 -0
  396. package/src/__tests__/occlusion-query-ticket.integration.test.ts +47 -0
  397. package/src/__tests__/occlusion-query.dawn.test.ts +16 -0
  398. package/src/__tests__/occlusion-query.evidence.ts +178 -0
  399. package/src/__tests__/occlusion-query.rhi-null.test.ts +31 -0
  400. package/src/__tests__/occlusion-runtime.unit.test.ts +120 -0
  401. package/src/__tests__/pbr-view-layout.unit.test.ts +16 -0
  402. package/src/__tests__/point-shadow-inspection.unit.test.ts +60 -0
  403. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +196 -0
  404. package/src/__tests__/probe-bindings.unit.test.ts +200 -0
  405. package/src/__tests__/probe-blend-numeric.unit.test.ts +67 -0
  406. package/src/__tests__/probe-blend-oracle.unit.test.ts +136 -0
  407. package/src/__tests__/probe-capacity.integration.test.ts +97 -0
  408. package/src/__tests__/probe-recovery.integration.test.ts +104 -0
  409. package/src/__tests__/probe-scene-dirty.integration.test.ts +211 -0
  410. package/src/__tests__/profiler-phase-catalog.test.ts +4 -1
  411. package/src/__tests__/profiler-phase-token.test.ts +1 -0
  412. package/src/__tests__/public-surface.test-d.ts +10 -0
  413. package/src/__tests__/rect-area-boundary.unit.test.ts +24 -0
  414. package/src/__tests__/reflection-fallback-graph.unit.test.ts +67 -0
  415. package/src/__tests__/reflection-fallback-inspection.unit.test.ts +77 -0
  416. package/src/__tests__/reflection-fallback-lifecycle.integration.test.ts +21 -0
  417. package/src/__tests__/reflection-fallback-projection.unit.test.ts +90 -0
  418. package/src/__tests__/reflection-fallback-source.unit.test.ts +32 -0
  419. package/src/__tests__/reflection-probe-authoring.unit.test.ts +71 -0
  420. package/src/__tests__/reflection-probe-filter.unit.test.ts +54 -0
  421. package/src/__tests__/reflection-probe-ibl-topology.unit.test.ts +45 -0
  422. package/src/__tests__/reflection-probe-owner-placement.unit.test.ts +39 -0
  423. package/src/__tests__/reflection-probe-pass-encode.integration.test.ts +101 -0
  424. package/src/__tests__/reflection-probe-performance.perf.test.ts +60 -0
  425. package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +120 -0
  426. package/src/__tests__/reflection-probe-recovery.integration.test.ts +55 -0
  427. package/src/__tests__/reflection-probe-selection.unit.test.ts +46 -0
  428. package/src/__tests__/render-error-code-owner.test-d.ts +19 -3
  429. package/src/__tests__/render-feature-docs.unit.test.ts +12 -7
  430. package/src/__tests__/render-graph-fallback.integration.test.ts +24 -0
  431. package/src/__tests__/render-perf/extended-lighting.bench.test.ts +66 -0
  432. package/src/__tests__/render-scene-projection.unit.test.ts +447 -18
  433. package/src/__tests__/render-target-admission.unit.test.ts +80 -0
  434. package/src/__tests__/render-target-graph-projection.unit.test.ts +102 -0
  435. package/src/__tests__/render-target-inspection.unit.test.ts +52 -0
  436. package/src/__tests__/render-target-material-source.test-d.ts +30 -0
  437. package/src/__tests__/render-target-material-source.unit.test.ts +97 -0
  438. package/src/__tests__/render-target-owner-placement.unit.test.ts +203 -0
  439. package/src/__tests__/render-target-owner.unit.test.ts +122 -0
  440. package/src/__tests__/render-target-probe-soak.perf.test.ts +94 -0
  441. package/src/__tests__/render-target-public-schema.json +107 -0
  442. package/src/__tests__/render-target-public-schema.unit.test.ts +91 -0
  443. package/src/__tests__/render-target-public-surface.test-d.ts +83 -0
  444. package/src/__tests__/render-target-readback.integration.test.ts +90 -0
  445. package/src/__tests__/render-target-recovery.integration.test.ts +85 -0
  446. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +124 -0
  447. package/src/__tests__/renderer-lifecycle.integration.test.ts +14 -0
  448. package/src/__tests__/shader-stage-surface.unit.test.ts +19 -4
  449. package/src/__tests__/skin-motion-regression.unit.test.ts +154 -0
  450. package/src/__tests__/skinned-shadow-caster.test.ts +13 -4
  451. package/src/__tests__/spot-modifier-projection.unit.test.ts +70 -0
  452. package/src/__tests__/ssr-admission-matrix.integration.test.ts +206 -0
  453. package/src/__tests__/ssr-composition.unit.test.ts +46 -0
  454. package/src/__tests__/ssr-fallback-zero-work.bench.test.ts +94 -0
  455. package/src/__tests__/ssr-recovery-errors.unit.test.ts +58 -0
  456. package/src/__tests__/standard-cluster-capability.integration.test.ts +63 -0
  457. package/src/__tests__/standard-cluster-transport.unit.test.ts +121 -0
  458. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +299 -0
  459. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +15 -5
  460. package/src/__tests__/standard-lighting-inspection.integration.test.ts +138 -0
  461. package/src/__tests__/standard-lighting-ssot.unit.test.ts +18 -0
  462. package/src/__tests__/standard-lighting-write.unit.test.ts +441 -0
  463. package/src/__tests__/standard-lighting.integration.test.ts +67 -0
  464. package/src/__tests__/standard-pipeline.dawn.test.ts +206 -5
  465. package/src/__tests__/standard-pipeline.integration.test.ts +181 -150
  466. package/src/__tests__/standard-probe-binding.unit.test.ts +25 -0
  467. package/src/__tests__/standard-profile-oracle.unit.test.ts +23 -38
  468. package/src/__tests__/temporal-fallback-generation.integration.test.ts +16 -0
  469. package/src/__tests__/temporal-view.unit.test.ts +3 -3
  470. package/src/__tests__/transmission-prewarm.unit.test.ts +69 -0
  471. package/src/__tests__/typed-pipeline-topology.unit.test.ts +395 -14
  472. package/src/__tests__/urp-pipeline-targets.unit.test.ts +2 -2
  473. package/src/__tests__/visibility-budget.integration.test.ts +140 -0
  474. package/src/__tests__/visibility-budget.unit.test.ts +70 -0
  475. package/src/__tests__/visibility-extract.integration.test.ts +11 -6
  476. package/src/__tests__/visibility-resolver.unit.test.ts +15 -0
  477. package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +6 -3
  478. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +31 -28
  479. package/src/assembly/backend-contract.ts +13 -0
  480. package/src/assembly/device-feature-admission.ts +80 -0
  481. package/src/assembly/directional-shadow-inspection.ts +122 -0
  482. package/src/assembly/factory.ts +1411 -366
  483. package/src/assembly/host-contract.ts +35 -0
  484. package/src/assembly/render-target-host.ts +847 -0
  485. package/src/assets/asset-decoders.ts +1 -1
  486. package/src/assets/render-asset-port.ts +7 -1
  487. package/src/capture/cube-views.ts +69 -0
  488. package/src/capture/scheduler.ts +265 -0
  489. package/src/cluster-binner.ts +31 -0
  490. package/src/components/__tests__/lighting-authoring.unit.test.ts +39 -0
  491. package/src/components/__tests__/rect-area-light.unit.test.ts +33 -0
  492. package/src/components/__tests__/schema-contract.unit.test.ts +12 -0
  493. package/src/components/__tests__/schema-parity.unit.test.ts +9 -0
  494. package/src/components/camera.ts +4 -0
  495. package/src/components/cube-camera.ts +52 -0
  496. package/src/components/directional-light.ts +22 -2
  497. package/src/components/directional-shadow-filter.ts +57 -0
  498. package/src/components/index.ts +5 -0
  499. package/src/components/light-helpers.ts +133 -8
  500. package/src/components/light-probe.ts +13 -0
  501. package/src/components/rect-area-light.ts +15 -0
  502. package/src/components/reflection-probe.ts +49 -0
  503. package/src/components/scene-instance.ts +6 -0
  504. package/src/components/spot-light.ts +3 -0
  505. package/src/device/__tests__/extended-lighting-recovery.unit.test.ts +24 -0
  506. package/src/device/gpu-residency.ts +140 -9
  507. package/src/device/lifecycle-transaction.ts +12 -0
  508. package/src/environment/frame.ts +6 -24
  509. package/src/environment/lifecycle.ts +20 -1
  510. package/src/errors/gpu-driven.ts +92 -0
  511. package/src/errors/index.ts +1 -0
  512. package/src/errors/recover.ts +32 -0
  513. package/src/errors/render.ts +341 -143
  514. package/src/extract/camera.ts +3 -3
  515. package/src/extract/directional-shadow-projection.ts +61 -0
  516. package/src/extract/environment.ts +57 -0
  517. package/src/extract/gpu-driven.ts +108 -0
  518. package/src/extract/visibility.ts +2 -1
  519. package/src/features/fullscreen.ts +3 -0
  520. package/src/features/targets.ts +4 -1
  521. package/src/features/types.ts +10 -0
  522. package/src/fullscreen-post-process-pass.ts +43 -2
  523. package/src/gpu-driven/batch-topology.ts +207 -28
  524. package/src/gpu-driven/prepared-draw.ts +208 -0
  525. package/src/gpu-driven/production-raster.ts +953 -43
  526. package/src/gpu-driven/view-gpu.ts +411 -29
  527. package/src/gpu-scene-schema.ts +13 -0
  528. package/src/gpu-scene.ts +140 -64
  529. package/src/gpu-usage.ts +0 -1
  530. package/src/hdrp-buffers.ts +169 -63
  531. package/src/ibl/IblPipelineCache.ts +11 -0
  532. package/src/ibl/kernel-cache.ts +88 -0
  533. package/src/index.ts +222 -0
  534. package/src/inspection-types.ts +276 -1
  535. package/src/instances-derived-bounds.ts +171 -0
  536. package/src/internal.ts +38 -0
  537. package/src/light-buffer-layout.ts +155 -310
  538. package/src/materials.ts +16 -2
  539. package/src/mesh-material-bindings.ts +132 -0
  540. package/src/pbr-pipeline.ts +255 -60
  541. package/src/pipeline/standard-forward-lane.ts +93 -16
  542. package/src/pipeline/standard-lighting/errors.ts +6 -0
  543. package/src/pipeline/standard-lighting/graph.ts +158 -0
  544. package/src/pipeline/standard-lighting/inspection.ts +88 -0
  545. package/src/pipeline/standard-lighting/layout.ts +31 -0
  546. package/src/pipeline/standard-lighting/light-frame.ts +35 -0
  547. package/src/pipeline/standard-lighting/membership.ts +43 -0
  548. package/src/pipeline/standard-lighting/prepare.ts +37 -0
  549. package/src/pipeline/standard-lighting/topology.ts +120 -0
  550. package/src/pipeline/standard-lighting/transport.ts +78 -0
  551. package/src/pipeline/standard-pipeline.ts +124 -193
  552. package/src/pipeline/standard-post.ts +26 -7
  553. package/src/pipeline/standard-profile.ts +17 -47
  554. package/src/pipeline-builder.ts +5 -2
  555. package/src/pipeline-spec.ts +95 -21
  556. package/src/plugin.ts +4 -0
  557. package/src/point-shadow-inspection.ts +55 -0
  558. package/src/prepare/__tests__/extended-lighting-capability.unit.test.ts +56 -0
  559. package/src/prepare/extended-lighting/ltc-resources.ts +136 -0
  560. package/src/prepare/extended-lighting/resources.ts +389 -0
  561. package/src/prepare/extended-lighting/spot-modifiers.ts +194 -0
  562. package/src/prepare/extended-lighting/state.ts +92 -0
  563. package/src/record/__tests__/gpu-timing.unit.test.ts +177 -0
  564. package/src/record/__tests__/temporal-payload.unit.test.ts +64 -1
  565. package/src/record/__tests__/transparent-group2-selection.unit.test.ts +73 -0
  566. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +20 -1
  567. package/src/record/__tests__/view-ubo-layout.unit.test.ts +40 -0
  568. package/src/record/frame-lighting.ts +591 -452
  569. package/src/record/frame-snapshot.ts +92 -39
  570. package/src/record/frame-targets.ts +17 -0
  571. package/src/record/frame.ts +662 -158
  572. package/src/record/gpu-pass-timing/contract.ts +180 -0
  573. package/src/record/gpu-pass-timing/errors.ts +34 -0
  574. package/src/record/gpu-pass-timing/index.ts +37 -0
  575. package/src/record/gpu-pass-timing/parser.ts +97 -0
  576. package/src/record/gpu-pass-timing/session.ts +938 -0
  577. package/src/record/gpu-timing.ts +112 -39
  578. package/src/record/helpers.ts +0 -58
  579. package/src/record/main-pass-geometry.ts +324 -119
  580. package/src/record/main-pass-material.ts +103 -10
  581. package/src/record/main-pass-sprite-draws.ts +99 -103
  582. package/src/record/main-pass.ts +71 -15
  583. package/src/record/mesh-ssbo.ts +47 -36
  584. package/src/record/render-context.ts +136 -3
  585. package/src/record/shadow-pass.ts +83 -68
  586. package/src/record/skybox-post-pass.ts +20 -4
  587. package/src/record/typed-frame-graph.ts +1034 -43
  588. package/src/record/view-ubo.ts +72 -47
  589. package/src/reflection/filter.ts +81 -0
  590. package/src/reflection/gpu-table.ts +44 -0
  591. package/src/reflection/inspection.ts +67 -0
  592. package/src/reflection/projection.ts +476 -0
  593. package/src/reflection/record-owner.ts +1283 -0
  594. package/src/render-contract.ts +93 -10
  595. package/src/render-graph-primitives.ts +9 -4
  596. package/src/render-pipeline.ts +122 -2
  597. package/src/render-system-extract.ts +1041 -225
  598. package/src/render-system.ts +1310 -85
  599. package/src/renderer.ts +222 -0
  600. package/src/scene/__tests__/changed-block-summary.candidate.test.ts +36 -0
  601. package/src/scene/probe-blend-record.ts +54 -0
  602. package/src/scene/probe-blend.ts +813 -0
  603. package/src/scene/render-scene-types.ts +0 -7
  604. package/src/scene/render-scene.ts +942 -171
  605. package/src/scene/visibility/bounds.ts +57 -0
  606. package/src/scene/visibility/budget.ts +40 -0
  607. package/src/scene/visibility/facet.ts +400 -0
  608. package/src/scene/visibility/gpu-frame-timing.ts +101 -0
  609. package/src/scene/visibility/gpu-lod.ts +119 -0
  610. package/src/scene/visibility/inspection.ts +313 -0
  611. package/src/scene/visibility/lod-selector.ts +84 -0
  612. package/src/scene/visibility/occlusion-confidence.ts +478 -0
  613. package/src/scene/visibility/occlusion-pass.ts +165 -0
  614. package/src/scene/visibility/occlusion-query-pool.ts +178 -0
  615. package/src/scene/visibility/occlusion-runtime.ts +672 -0
  616. package/src/scene/visibility/types.ts +50 -0
  617. package/src/shadow-atlas.ts +5 -5
  618. package/src/ssao-buffers.ts +9 -2
  619. package/src/ssr/admission.ts +451 -0
  620. package/src/ssr/composition.ts +73 -0
  621. package/src/ssr/errors.ts +76 -0
  622. package/src/ssr/identity.ts +12 -0
  623. package/src/systems/skin-palette-allocator.ts +1 -1
  624. package/src/targets/contracts.ts +182 -0
  625. package/src/targets/graph-projection.ts +169 -0
  626. package/src/targets/material-source.ts +143 -0
  627. package/src/targets/owner.ts +214 -0
  628. package/src/targets/physical.ts +18 -0
  629. package/src/targets/readback.ts +153 -0
  630. package/src/temporal/frame-coordinator.ts +26 -0
  631. package/src/temporal/frame.ts +14 -1
  632. package/src/temporal/view.ts +11 -0
  633. package/src/tilemap-chunk-extract-system.ts +4 -4
  634. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +59 -20
  635. package/src/typed-render-graph-primitives.ts +53 -3
  636. package/src/typed-shadow-passes.ts +46 -40
  637. package/src/volume/passes.ts +61 -58
  638. package/dist/.tsbuildinfo +0 -1
  639. package/dist/chunk-4XINDLAY.mjs.map +0 -1
  640. package/dist/chunk-CDTWTHZR.mjs.map +0 -1
  641. package/dist/chunk-M2MP4ZOU.mjs +0 -73
  642. package/dist/chunk-M2MP4ZOU.mjs.map +0 -1
  643. package/dist/chunk-PCHBPYML.mjs.map +0 -1
  644. package/dist/chunk-TBQJOK2L.mjs.map +0 -1
  645. package/dist/chunk-VFPLTKCU.mjs.map +0 -1
@@ -0,0 +1,214 @@
1
+ import type { RenderError } from '../errors/render';
2
+ import { RenderTargetOperationFailedError, RenderTargetStateInvalidError } from '../errors/render';
3
+ import type { RenderResult } from '../render-contract';
4
+ import type { RenderTarget, RenderTargetDescriptor } from './contracts';
5
+
6
+ export type RenderTargetOwnerState =
7
+ | 'uninitialized'
8
+ | 'candidate'
9
+ | 'active'
10
+ | 'rebuilding'
11
+ | 'destroyed';
12
+
13
+ export interface RenderTargetPhysicalCandidate {
14
+ readonly generation: number;
15
+ readonly descriptor: RenderTargetDescriptor;
16
+ }
17
+
18
+ export interface RenderTargetOwnerInspection {
19
+ readonly token: RenderTarget;
20
+ readonly state: RenderTargetOwnerState;
21
+ readonly generation: number;
22
+ readonly descriptor: RenderTargetDescriptor;
23
+ readonly candidate?: RenderTargetPhysicalCandidate;
24
+ }
25
+
26
+ export interface RenderTargetOwnerOptions {
27
+ readonly rendererId: symbol;
28
+ readonly initialGeneration: number;
29
+ }
30
+
31
+ export interface RenderTargetOwner {
32
+ create(descriptor: RenderTargetDescriptor): RenderResult<RenderTarget, RenderError>;
33
+ stage(
34
+ target: RenderTarget,
35
+ descriptor?: RenderTargetDescriptor,
36
+ ): RenderResult<RenderTargetPhysicalCandidate, RenderError>;
37
+ promote(target: RenderTarget, generation: number): RenderResult<void, RenderError>;
38
+ rejectCandidate(
39
+ target: RenderTarget,
40
+ generation: number,
41
+ stage: 'allocation' | 'compile' | 'write' | 'submit',
42
+ ): RenderResult<void, RenderError>;
43
+ beginRecovery(target: RenderTarget, generation: number): RenderResult<void, RenderError>;
44
+ finishRecovery(target: RenderTarget): RenderResult<void, RenderError>;
45
+ retire(target: RenderTarget, generation: number): RenderResult<void, RenderError>;
46
+ destroy(target: RenderTarget): RenderResult<void, RenderError>;
47
+ inspect(target: RenderTarget): RenderResult<RenderTargetOwnerInspection, RenderError>;
48
+ }
49
+
50
+ interface TargetState {
51
+ readonly target: RenderTarget;
52
+ readonly rendererId: symbol;
53
+ state: RenderTargetOwnerState;
54
+ generation: number;
55
+ descriptor: RenderTargetDescriptor;
56
+ candidate: RenderTargetPhysicalCandidate | undefined;
57
+ retiredGenerations: Set<number>;
58
+ }
59
+
60
+ function frozenDescriptor(descriptor: RenderTargetDescriptor): RenderTargetDescriptor {
61
+ return Object.freeze({ ...descriptor });
62
+ }
63
+
64
+ function invalid(
65
+ operation: 'inspect' | 'resize' | 'source' | 'readback' | 'destroy',
66
+ reason: 'foreign-renderer' | 'destroyed' | 'uninitialized' | 'generation-mismatch',
67
+ state: RenderTargetOwnerState,
68
+ generation: number,
69
+ ): RenderResult<never, RenderError> {
70
+ return {
71
+ ok: false,
72
+ error: new RenderTargetStateInvalidError({ operation, reason, state, generation }),
73
+ };
74
+ }
75
+
76
+ function token(): RenderTarget {
77
+ return Object.freeze({}) as RenderTarget;
78
+ }
79
+
80
+ export function createRenderTargetOwner(options: RenderTargetOwnerOptions): RenderTargetOwner {
81
+ const targets = new WeakMap<object, TargetState>();
82
+ const requireTarget = (
83
+ target: RenderTarget,
84
+ operation: 'inspect' | 'resize' | 'source' | 'readback' | 'destroy',
85
+ ): RenderResult<TargetState, RenderError> => {
86
+ const state = targets.get(target as object);
87
+ if (state === undefined) return invalid(operation, 'foreign-renderer', 'destroyed', 0);
88
+ if (state.rendererId !== options.rendererId) {
89
+ return invalid(operation, 'foreign-renderer', state.state, state.generation);
90
+ }
91
+ if (state.state === 'destroyed') {
92
+ return invalid(operation, 'destroyed', state.state, state.generation);
93
+ }
94
+ return { ok: true, value: state };
95
+ };
96
+
97
+ return {
98
+ create(descriptor) {
99
+ const target = token();
100
+ targets.set(target as object, {
101
+ target,
102
+ rendererId: options.rendererId,
103
+ state: 'uninitialized',
104
+ generation: 0,
105
+ descriptor: frozenDescriptor(descriptor),
106
+ candidate: undefined,
107
+ retiredGenerations: new Set(),
108
+ });
109
+ return { ok: true, value: target };
110
+ },
111
+ stage(target, descriptor) {
112
+ const found = requireTarget(target, 'resize');
113
+ if (!found.ok) return found;
114
+ const state = found.value;
115
+ if (state.state === 'rebuilding') {
116
+ return invalid('resize', 'generation-mismatch', state.state, state.generation);
117
+ }
118
+ const candidate = Object.freeze({
119
+ generation: state.state === 'uninitialized' ? options.initialGeneration : state.generation,
120
+ descriptor: frozenDescriptor(descriptor ?? state.descriptor),
121
+ });
122
+ state.candidate = candidate;
123
+ state.state = 'candidate';
124
+ return { ok: true, value: candidate };
125
+ },
126
+ promote(target, generation) {
127
+ const found = requireTarget(target, 'resize');
128
+ if (!found.ok) return found;
129
+ const state = found.value;
130
+ if (state.candidate?.generation !== generation) {
131
+ return invalid('resize', 'generation-mismatch', state.state, state.generation);
132
+ }
133
+ state.descriptor = state.candidate.descriptor;
134
+ state.generation = generation;
135
+ state.candidate = undefined;
136
+ state.state = 'active';
137
+ return { ok: true, value: undefined };
138
+ },
139
+ rejectCandidate(target, generation, stage) {
140
+ const found = requireTarget(target, 'resize');
141
+ if (!found.ok) return found;
142
+ const state = found.value;
143
+ if (state.candidate?.generation !== generation) {
144
+ return invalid('resize', 'generation-mismatch', state.state, state.generation);
145
+ }
146
+ state.candidate = undefined;
147
+ state.state = state.generation === 0 ? 'uninitialized' : 'active';
148
+ return {
149
+ ok: false,
150
+ error: new RenderTargetOperationFailedError({
151
+ operation: 'resize',
152
+ stage,
153
+ generation,
154
+ cause: new Error(`candidate ${generation} failed during ${stage}`),
155
+ recovery: state.generation === 0 ? 'retry' : 'retain-last-known-good',
156
+ }),
157
+ };
158
+ },
159
+ beginRecovery(target, generation) {
160
+ const found = requireTarget(target, 'resize');
161
+ if (!found.ok) return found;
162
+ const state = found.value;
163
+ if (state.state !== 'active' || generation <= state.generation) {
164
+ return invalid('resize', 'generation-mismatch', state.state, state.generation);
165
+ }
166
+ state.generation = generation;
167
+ state.candidate = undefined;
168
+ state.state = 'rebuilding';
169
+ return { ok: true, value: undefined };
170
+ },
171
+ finishRecovery(target) {
172
+ const found = requireTarget(target, 'resize');
173
+ if (!found.ok) return found;
174
+ const state = found.value;
175
+ if (state.state !== 'rebuilding') {
176
+ return invalid('resize', 'generation-mismatch', state.state, state.generation);
177
+ }
178
+ state.state = 'uninitialized';
179
+ return { ok: true, value: undefined };
180
+ },
181
+ retire(target, generation) {
182
+ const found = requireTarget(target, 'destroy');
183
+ if (!found.ok) return found;
184
+ found.value.retiredGenerations.add(generation);
185
+ return { ok: true, value: undefined };
186
+ },
187
+ destroy(target) {
188
+ const state = targets.get(target as object);
189
+ if (state === undefined) return invalid('destroy', 'foreign-renderer', 'destroyed', 0);
190
+ if (state.rendererId !== options.rendererId) {
191
+ return invalid('destroy', 'foreign-renderer', state.state, state.generation);
192
+ }
193
+ if (state.state === 'destroyed') return { ok: true, value: undefined };
194
+ state.candidate = undefined;
195
+ state.state = 'destroyed';
196
+ return { ok: true, value: undefined };
197
+ },
198
+ inspect(target) {
199
+ const found = requireTarget(target, 'inspect');
200
+ if (!found.ok) return found;
201
+ const state = found.value;
202
+ return {
203
+ ok: true,
204
+ value: Object.freeze({
205
+ token: state.target,
206
+ state: state.state,
207
+ generation: state.generation,
208
+ descriptor: state.descriptor,
209
+ ...(state.candidate === undefined ? {} : { candidate: state.candidate }),
210
+ }),
211
+ };
212
+ },
213
+ };
214
+ }
@@ -0,0 +1,18 @@
1
+ import type { Texture, TextureView } from '@forgeax/engine-rhi';
2
+ import type { RenderTargetDescriptor } from './contracts';
3
+
4
+ /** Renderer-private physical storage for one logical target generation. */
5
+ export interface RenderTargetPhysical {
6
+ readonly generation: number;
7
+ readonly descriptor: RenderTargetDescriptor;
8
+ readonly texture: Texture;
9
+ readonly view: TextureView;
10
+ readonly mipViews: readonly TextureView[];
11
+ readonly colorTextures: readonly Texture[];
12
+ readonly faceViews: readonly TextureView[];
13
+ readonly depthTextures: readonly Texture[];
14
+ readonly depthViews: readonly TextureView[];
15
+ readonly resolveTexture?: Texture;
16
+ readonly resolveView: TextureView;
17
+ readonly resolveFaceViews: readonly TextureView[];
18
+ }
@@ -0,0 +1,153 @@
1
+ import type { RenderError } from '../errors/render';
2
+ import { RenderTargetOperationFailedError, RenderTargetStateInvalidError } from '../errors/render';
3
+ import type { RenderResult } from '../render-contract';
4
+ import type { RenderTarget } from './contracts';
5
+
6
+ export interface RenderTargetReadbackReceipt {
7
+ readonly frameId: number;
8
+ readonly deviceGeneration: number;
9
+ }
10
+
11
+ export interface RenderTargetReadbackTicketInput {
12
+ readonly frameId?: number;
13
+ deviceGeneration: number;
14
+ readonly mipLevel: number;
15
+ readonly face?: number;
16
+ readonly width: number;
17
+ readonly height: number;
18
+ readonly bytesPerPixel: number;
19
+ }
20
+
21
+ export interface RenderTargetReadbackTicket {
22
+ readonly target: RenderTarget;
23
+ frameId: number | undefined;
24
+ deviceGeneration: number;
25
+ readonly mipLevel: number;
26
+ readonly face?: number;
27
+ readonly width: number;
28
+ readonly height: number;
29
+ readonly bytesPerRow: number;
30
+ readonly byteLength: number;
31
+ consumed: boolean;
32
+ }
33
+
34
+ export interface RenderTargetReadbackResult {
35
+ readonly bytes: Uint8Array;
36
+ readonly frameId: number;
37
+ readonly deviceGeneration: number;
38
+ readonly mipLevel: number;
39
+ readonly face?: number;
40
+ }
41
+
42
+ function invalidTicket(
43
+ ticket: RenderTargetReadbackTicket,
44
+ reason: 'uninitialized' | 'generation-mismatch' | 'destroyed',
45
+ ): RenderResult<never, RenderError> {
46
+ return {
47
+ ok: false,
48
+ error: new RenderTargetStateInvalidError({
49
+ operation: 'readback',
50
+ reason,
51
+ state: reason === 'destroyed' ? 'destroyed' : 'active',
52
+ generation: ticket.deviceGeneration,
53
+ }),
54
+ };
55
+ }
56
+
57
+ export function bindRenderTargetReadbackTicket(
58
+ ticket: RenderTargetReadbackTicket,
59
+ receipt: RenderTargetReadbackReceipt,
60
+ ): RenderResult<void, RenderError> {
61
+ if (ticket.consumed) return invalidTicket(ticket, 'destroyed');
62
+ if (ticket.frameId !== undefined) {
63
+ return invalidTicket(ticket, 'generation-mismatch');
64
+ }
65
+ ticket.frameId = receipt.frameId;
66
+ ticket.deviceGeneration = receipt.deviceGeneration;
67
+ return { ok: true, value: undefined };
68
+ }
69
+
70
+ export function createRenderTargetReadbackTicket(
71
+ target: RenderTarget,
72
+ input: RenderTargetReadbackTicketInput,
73
+ ): RenderResult<RenderTargetReadbackTicket, RenderError> {
74
+ if (
75
+ (input.frameId !== undefined && (!Number.isInteger(input.frameId) || input.frameId < 0)) ||
76
+ !Number.isInteger(input.deviceGeneration) ||
77
+ input.deviceGeneration < 0 ||
78
+ !Number.isInteger(input.mipLevel) ||
79
+ input.mipLevel < 0 ||
80
+ !Number.isInteger(input.width) ||
81
+ input.width < 1 ||
82
+ !Number.isInteger(input.height) ||
83
+ input.height < 1 ||
84
+ !Number.isInteger(input.bytesPerPixel) ||
85
+ input.bytesPerPixel < 1
86
+ ) {
87
+ return {
88
+ ok: false,
89
+ error: new RenderTargetOperationFailedError({
90
+ operation: 'readback',
91
+ stage: 'copy',
92
+ generation: input.deviceGeneration,
93
+ cause: new Error('readback dimensions and identity must be non-negative integers'),
94
+ recovery: 'retry',
95
+ }),
96
+ };
97
+ }
98
+ const unalignedRowBytes = input.width * input.bytesPerPixel;
99
+ const bytesPerRow = Math.ceil(unalignedRowBytes / 256) * 256;
100
+ return {
101
+ ok: true,
102
+ value: {
103
+ target,
104
+ frameId: input.frameId,
105
+ deviceGeneration: input.deviceGeneration,
106
+ mipLevel: input.mipLevel,
107
+ ...(input.face === undefined ? {} : { face: input.face }),
108
+ width: input.width,
109
+ height: input.height,
110
+ bytesPerRow,
111
+ byteLength: bytesPerRow * input.height,
112
+ consumed: false,
113
+ },
114
+ };
115
+ }
116
+
117
+ export function completeRenderTargetReadback(
118
+ ticket: RenderTargetReadbackTicket,
119
+ receipt: RenderTargetReadbackReceipt,
120
+ bytes: Uint8Array,
121
+ ): RenderResult<RenderTargetReadbackResult, RenderError> {
122
+ if (ticket.consumed) return invalidTicket(ticket, 'destroyed');
123
+ if (
124
+ ticket.frameId === undefined ||
125
+ receipt.frameId !== ticket.frameId ||
126
+ receipt.deviceGeneration !== ticket.deviceGeneration
127
+ ) {
128
+ return invalidTicket(ticket, 'generation-mismatch');
129
+ }
130
+ if (bytes.byteLength !== ticket.byteLength) {
131
+ return {
132
+ ok: false,
133
+ error: new RenderTargetOperationFailedError({
134
+ operation: 'readback',
135
+ stage: 'copy',
136
+ generation: ticket.deviceGeneration,
137
+ cause: new Error(`expected ${ticket.byteLength} bytes, received ${bytes.byteLength}`),
138
+ recovery: 'retry',
139
+ }),
140
+ };
141
+ }
142
+ ticket.consumed = true;
143
+ return {
144
+ ok: true,
145
+ value: {
146
+ bytes,
147
+ frameId: ticket.frameId,
148
+ deviceGeneration: ticket.deviceGeneration,
149
+ mipLevel: ticket.mipLevel,
150
+ ...(ticket.face === undefined ? {} : { face: ticket.face }),
151
+ },
152
+ };
153
+ }
@@ -70,6 +70,32 @@ export interface TemporalFrameReceipt<T = unknown> {
70
70
  readonly historyDirection: 'a-to-b' | 'b-to-a';
71
71
  }
72
72
 
73
+ export type ReflectionFallbackTemporalReset =
74
+ | { readonly reset: false }
75
+ | { readonly reset: true; readonly reason: 'reflection-fallback-generation' };
76
+
77
+ /** Maps committed producer generations into the existing temporal reset seam. */
78
+ export function resolveReflectionFallbackTemporalReset(
79
+ previousGeneration: number | undefined,
80
+ nextGeneration: number | undefined,
81
+ ): ReflectionFallbackTemporalReset {
82
+ if (previousGeneration === undefined || nextGeneration === undefined) return { reset: false };
83
+ return previousGeneration === nextGeneration
84
+ ? { reset: false }
85
+ : { reset: true, reason: 'reflection-fallback-generation' };
86
+ }
87
+
88
+ /**
89
+ * Keeps SSR admission on the existing producer-generation reset seam. The
90
+ * admission path never allocates or resolves temporal history itself.
91
+ */
92
+ export function resolveSsrAdmissionTemporalReset(
93
+ previousGeneration: number | undefined,
94
+ nextGeneration: number | undefined,
95
+ ): ReflectionFallbackTemporalReset {
96
+ return resolveReflectionFallbackTemporalReset(previousGeneration, nextGeneration);
97
+ }
98
+
73
99
  function failure(code: TemporalFrameErrorCode, hint: string): TemporalFrameError {
74
100
  return {
75
101
  code,
@@ -44,6 +44,8 @@ export interface TemporalFrameTransaction {
44
44
  stage(input: TemporalFrameInput): void;
45
45
  commit(submit: TemporalSubmitResult): Result<TemporalFrame, TemporalFrameSubmitError>;
46
46
  snapshot(): TemporalFrame;
47
+ /** Drop accepted/staged history after a producer or device generation cut. */
48
+ reset(reason?: Extract<TemporalResetReason, 'signature-change' | 'device-recovery'>): void;
47
49
  }
48
50
 
49
51
  function copyInput(input: TemporalFrameInput): TemporalFrameInput {
@@ -82,6 +84,7 @@ export function createTemporalFrameTransaction(options: {
82
84
  let accepted: TemporalFrame | undefined;
83
85
  let staged: TemporalFrameInput | undefined;
84
86
  let historyEpoch = 0;
87
+ let pendingResetReason: Exclude<TemporalResetReason, 'none' | 'queue-submit-failed'> | undefined;
85
88
 
86
89
  return {
87
90
  stage(input) {
@@ -96,7 +99,7 @@ export function createTemporalFrameTransaction(options: {
96
99
  return err(new TemporalFrameSubmitError('queue-submit-failed'));
97
100
  }
98
101
 
99
- const resetReason = submit.resetReason ?? staged.resetReason ?? 'none';
102
+ const resetReason = submit.resetReason ?? staged.resetReason ?? pendingResetReason ?? 'none';
100
103
  const shouldReset = resetReason !== 'none';
101
104
  if (shouldReset) historyEpoch += 1;
102
105
  const next: TemporalFrame = {
@@ -117,6 +120,7 @@ export function createTemporalFrameTransaction(options: {
117
120
  };
118
121
  accepted = next;
119
122
  staged = undefined;
123
+ pendingResetReason = undefined;
120
124
  return ok(copyFrame(next));
121
125
  },
122
126
  snapshot() {
@@ -124,5 +128,14 @@ export function createTemporalFrameTransaction(options: {
124
128
  throw new Error('TemporalFrame snapshot is unavailable before commit');
125
129
  return copyFrame(accepted);
126
130
  },
131
+ reset(reason = 'signature-change') {
132
+ accepted = undefined;
133
+ staged = undefined;
134
+ historyEpoch += 1;
135
+ // The reason is carried into the next accepted frame while clearing the
136
+ // committed frame prevents stale motion vectors from crossing the
137
+ // producer/device boundary.
138
+ pendingResetReason = reason;
139
+ },
127
140
  };
128
141
  }
@@ -38,6 +38,8 @@ export interface TemporalViewInput {
38
38
  readonly historyValid?: boolean;
39
39
  readonly currentUnjitteredViewProjection?: ArrayLike<number> | undefined;
40
40
  readonly previousUnjitteredViewProjection?: ArrayLike<number> | undefined;
41
+ readonly currentCameraPosition?: readonly [number, number, number] | undefined;
42
+ readonly previousCameraPosition?: readonly [number, number, number] | undefined;
41
43
  readonly resetReason?: TemporalResetReason | undefined;
42
44
  }
43
45
 
@@ -55,6 +57,8 @@ interface TemporalViewSnapshot {
55
57
  readonly historyValid: boolean;
56
58
  readonly currentUnjitteredViewProjection: ArrayLike<number> | undefined;
57
59
  readonly previousUnjitteredViewProjection: ArrayLike<number> | undefined;
60
+ readonly currentCameraPosition: readonly [number, number, number] | undefined;
61
+ readonly previousCameraPosition: readonly [number, number, number] | undefined;
58
62
  readonly resetReason: TemporalResetReason | undefined;
59
63
  }
60
64
 
@@ -70,6 +74,9 @@ export interface TemporalView {
70
74
  /** Unjittered matrices are supplied by the renderer projection owner. */
71
75
  readonly currentUnjitteredViewProjection: ArrayLike<number> | undefined;
72
76
  readonly previousUnjitteredViewProjection: ArrayLike<number> | undefined;
77
+ /** Camera origins follow the same accepted-submit boundary as the matrices. */
78
+ readonly currentCameraPosition: readonly [number, number, number] | undefined;
79
+ readonly previousCameraPosition: readonly [number, number, number] | undefined;
73
80
  readonly currentProjection: 'jittered' | 'unjittered';
74
81
  readonly previousProjection: 'unjittered';
75
82
  readonly historyRequired: boolean;
@@ -112,6 +119,8 @@ export function createTemporalView(input: TemporalViewInput): TemporalView {
112
119
  historyValid: input.historyValid ?? false,
113
120
  currentUnjitteredViewProjection: input.currentUnjitteredViewProjection,
114
121
  previousUnjitteredViewProjection: input.previousUnjitteredViewProjection,
122
+ currentCameraPosition: input.currentCameraPosition,
123
+ previousCameraPosition: input.previousCameraPosition,
115
124
  resetReason: input.resetReason,
116
125
  });
117
126
  const taa = input.antialias === 'taa';
@@ -135,6 +144,8 @@ export function createTemporalView(input: TemporalViewInput): TemporalView {
135
144
  temporalFrameIndex: frameIndex,
136
145
  currentUnjitteredViewProjection: input.currentUnjitteredViewProjection,
137
146
  previousUnjitteredViewProjection: input.previousUnjitteredViewProjection,
147
+ currentCameraPosition: input.currentCameraPosition,
148
+ previousCameraPosition: input.previousCameraPosition,
138
149
  currentProjection: taa ? 'jittered' : 'unjittered',
139
150
  previousProjection: 'unjittered',
140
151
  historyRequired: taa,
@@ -57,7 +57,7 @@ import {
57
57
  import type { EntityHandle, World } from '@forgeax/engine-ecs';
58
58
  import { decodeTileBits } from '@forgeax/engine-graphics-extras';
59
59
  import { type box3, frustum, mat4 } from '@forgeax/engine-math';
60
- import { ChildOf, Children, Transform } from '@forgeax/engine-scene';
60
+ import { ChildOf, Children, GlobalTransform, Transform } from '@forgeax/engine-scene';
61
61
  import {
62
62
  type Handle,
63
63
  type MaterialAsset,
@@ -874,13 +874,13 @@ function bucketTileLayer(
874
874
  * cull paths use byte-identical planes (charter P4 consistent abstraction).
875
875
  */
876
876
  function buildCameraFrustumPlanes(world: World): frustum.Frustum | null {
877
- const query = world.query({ with: [Camera, Transform] }).unwrap();
877
+ const query = world.query({ with: [Camera, Transform, GlobalTransform] }).unwrap();
878
878
  let result: frustum.Frustum | null = null;
879
879
  for (const row of query) {
880
880
  const camEntity = row.entity;
881
881
 
882
882
  const camRes = world.get(camEntity, Camera);
883
- const trRes = world.get(camEntity, Transform);
883
+ const trRes = world.get(camEntity, GlobalTransform);
884
884
  if (!camRes.ok || !trRes.ok) continue;
885
885
 
886
886
  const cam = camRes.value;
@@ -1081,7 +1081,7 @@ function evictDeadPerCellStreamingCaches(work: readonly LayerWork[], world: Worl
1081
1081
  /**
1082
1082
  * Walk every TileLayer ChildOf-ing a Tilemap, extract its non-zero cells
1083
1083
  * into derived render entities. A Renderer attaches this system to FrameEnd;
1084
- * World's final publication then resolves newly-created Transform.world values before the
1084
+ * World's final publication then resolves newly-created GlobalTransform.world values before the
1085
1085
  * read-only render walk begins.
1086
1086
  *
1087
1087
  * Two paths based on `TileLayer.sortScope`: