@forgeax/engine-render 0.1.21 → 0.1.24

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 (584) hide show
  1. package/README.md +281 -38
  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/bundler-contract.d.ts +9 -0
  5. package/dist/assembly/bundler-contract.d.ts.map +1 -0
  6. package/dist/assembly/device-feature-admission.d.ts +8 -0
  7. package/dist/assembly/device-feature-admission.d.ts.map +1 -1
  8. package/dist/assembly/extended-lighting-fallback.d.ts +13 -0
  9. package/dist/assembly/extended-lighting-fallback.d.ts.map +1 -0
  10. package/dist/assembly/factory.d.ts +7 -235
  11. package/dist/assembly/factory.d.ts.map +1 -1
  12. package/dist/assembly/host-contract.d.ts +10 -0
  13. package/dist/assembly/host-contract.d.ts.map +1 -1
  14. package/dist/assembly/material/assembly.d.ts +3 -2
  15. package/dist/assembly/material/assembly.d.ts.map +1 -1
  16. package/dist/assembly/material/standard-layer-projection.d.ts +10 -0
  17. package/dist/assembly/material/standard-layer-projection.d.ts.map +1 -0
  18. package/dist/assembly/material-shader-policy.d.ts +168 -0
  19. package/dist/assembly/material-shader-policy.d.ts.map +1 -0
  20. package/dist/assembly/material-shader-prewarm.d.ts +21 -0
  21. package/dist/assembly/material-shader-prewarm.d.ts.map +1 -0
  22. package/dist/assembly/mesh-ssbo-grow.d.ts +88 -0
  23. package/dist/assembly/mesh-ssbo-grow.d.ts.map +1 -0
  24. package/dist/assembly/recovery/device-loss-fanout.d.ts +14 -0
  25. package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -0
  26. package/dist/assembly/recovery/generation.d.ts +46 -0
  27. package/dist/assembly/recovery/generation.d.ts.map +1 -0
  28. package/dist/assembly/recovery/recovery-attempt.d.ts +63 -0
  29. package/dist/assembly/recovery/recovery-attempt.d.ts.map +1 -0
  30. package/dist/assembly/recovery/renderer-recover.d.ts +115 -0
  31. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -0
  32. package/dist/assembly/renderer-facade.d.ts +10 -0
  33. package/dist/assembly/renderer-facade.d.ts.map +1 -0
  34. package/dist/assembly/renderer-frame-transaction.d.ts +17 -0
  35. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  36. package/dist/assembly/renderer-helpers.d.ts +19 -0
  37. package/dist/assembly/renderer-helpers.d.ts.map +1 -0
  38. package/dist/assembly/renderer-lifecycle.d.ts +34 -0
  39. package/dist/assembly/renderer-lifecycle.d.ts.map +1 -1
  40. package/dist/assembly/shader-prewarm-policy.d.ts +15 -0
  41. package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -0
  42. package/dist/assembly/webgpu-ready-contract.d.ts +9 -0
  43. package/dist/assembly/webgpu-ready-contract.d.ts.map +1 -0
  44. package/dist/assembly/webgpu-ready.d.ts +55 -0
  45. package/dist/assembly/webgpu-ready.d.ts.map +1 -0
  46. package/dist/assembly/webgpu-renderer.d.ts +152 -0
  47. package/dist/assembly/webgpu-renderer.d.ts.map +1 -0
  48. package/dist/authoring.mjs +1 -1
  49. package/dist/{chunk-PCHBPYML.mjs → chunk-GE3SDD72.mjs} +37 -5
  50. package/dist/chunk-GE3SDD72.mjs.map +1 -0
  51. package/dist/chunk-KZFTK6DO.mjs +1191 -0
  52. package/dist/chunk-KZFTK6DO.mjs.map +1 -0
  53. package/dist/{chunk-FS2KNUQH.mjs → chunk-Q752SHI5.mjs} +332 -568
  54. package/dist/chunk-Q752SHI5.mjs.map +1 -0
  55. package/dist/{chunk-6OPXDQ2E.mjs → chunk-RR5L4SRS.mjs} +33 -294
  56. package/dist/chunk-RR5L4SRS.mjs.map +1 -0
  57. package/dist/chunk-TFH5I7JJ.mjs +296 -0
  58. package/dist/chunk-TFH5I7JJ.mjs.map +1 -0
  59. package/dist/chunk-UQYS7FRM.mjs +1003 -0
  60. package/dist/chunk-UQYS7FRM.mjs.map +1 -0
  61. package/dist/chunk-YKB5DQV7.mjs +345 -0
  62. package/dist/chunk-YKB5DQV7.mjs.map +1 -0
  63. package/dist/{chunk-5YADUCA7.mjs → chunk-YRUYGA4A.mjs} +1189 -1217
  64. package/dist/chunk-YRUYGA4A.mjs.map +1 -0
  65. package/dist/chunk-Z3YYH2MB.mjs +5082 -0
  66. package/dist/chunk-Z3YYH2MB.mjs.map +1 -0
  67. package/dist/cluster-binner.d.ts +5 -0
  68. package/dist/cluster-binner.d.ts.map +1 -1
  69. package/dist/components/index.d.ts +3 -0
  70. package/dist/components/index.d.ts.map +1 -1
  71. package/dist/components/light-helpers.d.ts +4 -0
  72. package/dist/components/light-helpers.d.ts.map +1 -1
  73. package/dist/components/light-probe.d.ts +9 -0
  74. package/dist/components/light-probe.d.ts.map +1 -0
  75. package/dist/components/rect-area-light.d.ts +12 -0
  76. package/dist/components/rect-area-light.d.ts.map +1 -0
  77. package/dist/components/scene-instance.d.ts +4 -0
  78. package/dist/components/scene-instance.d.ts.map +1 -1
  79. package/dist/components/spot-light.d.ts +3 -0
  80. package/dist/components/spot-light.d.ts.map +1 -1
  81. package/dist/construct-renderer.mjs +27276 -23232
  82. package/dist/construct-renderer.mjs.map +1 -1
  83. package/dist/device/device-scope.d.ts +2 -0
  84. package/dist/device/device-scope.d.ts.map +1 -1
  85. package/dist/device/gpu-residency.d.ts +32 -5
  86. package/dist/device/gpu-residency.d.ts.map +1 -1
  87. package/dist/device/lifecycle-transaction.d.ts +2 -0
  88. package/dist/device/lifecycle-transaction.d.ts.map +1 -0
  89. package/dist/environment/frame.d.ts +5 -0
  90. package/dist/environment/frame.d.ts.map +1 -1
  91. package/dist/environment/inspection.d.ts +7 -0
  92. package/dist/environment/inspection.d.ts.map +1 -1
  93. package/dist/environment/lifecycle.d.ts +20 -2
  94. package/dist/environment/lifecycle.d.ts.map +1 -1
  95. package/dist/errors/gpu-driven.d.ts +26 -0
  96. package/dist/errors/gpu-driven.d.ts.map +1 -0
  97. package/dist/errors/index.d.ts +1 -0
  98. package/dist/errors/index.d.ts.map +1 -1
  99. package/dist/errors/recover.d.ts +67 -3
  100. package/dist/errors/recover.d.ts.map +1 -1
  101. package/dist/errors/render.d.ts +39 -1
  102. package/dist/errors/render.d.ts.map +1 -1
  103. package/dist/extract/contracts.d.ts +899 -0
  104. package/dist/extract/contracts.d.ts.map +1 -0
  105. package/dist/extract/gpu-driven.d.ts +50 -0
  106. package/dist/extract/gpu-driven.d.ts.map +1 -0
  107. package/dist/extract/visibility.d.ts.map +1 -1
  108. package/dist/features/host.d.ts +2 -0
  109. package/dist/features/host.d.ts.map +1 -1
  110. package/dist/features/prepared-gpu-work.d.ts +3 -0
  111. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  112. package/dist/features/prepared-graphics-store.d.ts +2 -0
  113. package/dist/features/prepared-graphics-store.d.ts.map +1 -1
  114. package/dist/gpu-driven/batch-topology.d.ts +34 -0
  115. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  116. package/dist/gpu-driven/prepared-draw.d.ts +63 -0
  117. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -0
  118. package/dist/gpu-driven/production-raster.d.ts +126 -2
  119. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  120. package/dist/gpu-driven/view-gpu.d.ts +64 -1
  121. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  122. package/dist/gpu-scene-schema.d.ts +14 -0
  123. package/dist/gpu-scene-schema.d.ts.map +1 -1
  124. package/dist/gpu-scene.d.ts +9 -1
  125. package/dist/gpu-scene.d.ts.map +1 -1
  126. package/dist/gpu-usage.d.ts +0 -1
  127. package/dist/gpu-usage.d.ts.map +1 -1
  128. package/dist/hdrp-buffers.d.ts +3 -3
  129. package/dist/hdrp-buffers.d.ts.map +1 -1
  130. package/dist/ibl/IblPipelineCache.d.ts +7 -6
  131. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  132. package/dist/ibl/skylight-bind-group.d.ts +7 -1
  133. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  134. package/dist/index.d.ts +13 -2
  135. package/dist/index.d.ts.map +1 -1
  136. package/dist/index.mjs +90 -5
  137. package/dist/index.mjs.map +1 -1
  138. package/dist/inspection-types.d.ts +163 -1
  139. package/dist/inspection-types.d.ts.map +1 -1
  140. package/dist/internal.d.ts +9 -0
  141. package/dist/internal.d.ts.map +1 -1
  142. package/dist/internal.mjs +23 -2
  143. package/dist/internal.mjs.map +1 -1
  144. package/dist/light-buffer-layout.d.ts +60 -148
  145. package/dist/light-buffer-layout.d.ts.map +1 -1
  146. package/dist/materials.d.ts +34 -10
  147. package/dist/materials.d.ts.map +1 -1
  148. package/dist/mesh-material-bindings.d.ts +56 -0
  149. package/dist/mesh-material-bindings.d.ts.map +1 -1
  150. package/dist/occlusion-proxy.d.ts +4 -0
  151. package/dist/occlusion-proxy.d.ts.map +1 -0
  152. package/dist/pbr-pipeline.d.ts +58 -21
  153. package/dist/pbr-pipeline.d.ts.map +1 -1
  154. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  155. package/dist/pipeline/standard-lighting/graph.d.ts.map +1 -1
  156. package/dist/pipeline/standard-lighting/light-frame.d.ts +3 -3
  157. package/dist/pipeline/standard-lighting/light-frame.d.ts.map +1 -1
  158. package/dist/pipeline/standard-lighting/topology.d.ts +1 -1
  159. package/dist/pipeline/standard-lighting/topology.d.ts.map +1 -1
  160. package/dist/pipeline/standard-lighting/transport.d.ts.map +1 -1
  161. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  162. package/dist/pipeline-builder.d.ts +2 -0
  163. package/dist/pipeline-builder.d.ts.map +1 -1
  164. package/dist/pipeline-spec.d.ts +1 -1
  165. package/dist/pipeline-spec.d.ts.map +1 -1
  166. package/dist/plugin.d.ts.map +1 -1
  167. package/dist/points-lines/prepare.d.ts +3 -0
  168. package/dist/points-lines/prepare.d.ts.map +1 -1
  169. package/dist/points-lines/standard-owner.d.ts +33 -0
  170. package/dist/points-lines/standard-owner.d.ts.map +1 -0
  171. package/dist/prepare/extended-lighting/ltc-resources.d.ts +31 -0
  172. package/dist/prepare/extended-lighting/ltc-resources.d.ts.map +1 -0
  173. package/dist/prepare/extended-lighting/resources.d.ts +72 -0
  174. package/dist/prepare/extended-lighting/resources.d.ts.map +1 -0
  175. package/dist/prepare/extended-lighting/spot-modifiers.d.ts +42 -0
  176. package/dist/prepare/extended-lighting/spot-modifiers.d.ts.map +1 -0
  177. package/dist/prepare/extended-lighting/state.d.ts +24 -0
  178. package/dist/prepare/extended-lighting/state.d.ts.map +1 -0
  179. package/dist/record/frame-lighting.d.ts +8 -6
  180. package/dist/record/frame-lighting.d.ts.map +1 -1
  181. package/dist/record/frame-snapshot.d.ts +55 -10
  182. package/dist/record/frame-snapshot.d.ts.map +1 -1
  183. package/dist/record/frame-targets.d.ts.map +1 -1
  184. package/dist/record/frame.d.ts +21 -5
  185. package/dist/record/frame.d.ts.map +1 -1
  186. package/dist/record/gpu-timing.d.ts +19 -7
  187. package/dist/record/gpu-timing.d.ts.map +1 -1
  188. package/dist/record/helpers.d.ts +0 -20
  189. package/dist/record/helpers.d.ts.map +1 -1
  190. package/dist/record/main-pass-geometry.d.ts +20 -2
  191. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  192. package/dist/record/main-pass-material.d.ts +10 -18
  193. package/dist/record/main-pass-material.d.ts.map +1 -1
  194. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  195. package/dist/record/main-pass.d.ts.map +1 -1
  196. package/dist/record/mesh-ssbo.d.ts +11 -3
  197. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  198. package/dist/record/recovery-pipeline.d.ts +30 -0
  199. package/dist/record/recovery-pipeline.d.ts.map +1 -0
  200. package/dist/record/render-context.d.ts +82 -9
  201. package/dist/record/render-context.d.ts.map +1 -1
  202. package/dist/record/shadow-pass.d.ts.map +1 -1
  203. package/dist/record/typed-frame-graph.d.ts +49 -2
  204. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  205. package/dist/record/view-ubo.d.ts +1 -2
  206. package/dist/record/view-ubo.d.ts.map +1 -1
  207. package/dist/recovery/render-system-candidate.d.ts +65 -0
  208. package/dist/recovery/render-system-candidate.d.ts.map +1 -0
  209. package/dist/reflection/inspection.d.ts +10 -0
  210. package/dist/reflection/inspection.d.ts.map +1 -0
  211. package/dist/reflection/projection.d.ts +49 -0
  212. package/dist/reflection/projection.d.ts.map +1 -1
  213. package/dist/reflection/record-owner.d.ts +60 -0
  214. package/dist/reflection/record-owner.d.ts.map +1 -0
  215. package/dist/render-contract.d.ts +78 -15
  216. package/dist/render-contract.d.ts.map +1 -1
  217. package/dist/render-pipeline.d.ts +7 -0
  218. package/dist/render-pipeline.d.ts.map +1 -1
  219. package/dist/render-system-extract-tail.d.ts +12 -0
  220. package/dist/render-system-extract-tail.d.ts.map +1 -0
  221. package/dist/render-system-extract.d.ts +252 -30
  222. package/dist/render-system-extract.d.ts.map +1 -1
  223. package/dist/render-system.d.ts +140 -5
  224. package/dist/render-system.d.ts.map +1 -1
  225. package/dist/scene/probe-blend-record.d.ts +22 -0
  226. package/dist/scene/probe-blend-record.d.ts.map +1 -0
  227. package/dist/scene/probe-blend.d.ts +142 -0
  228. package/dist/scene/probe-blend.d.ts.map +1 -0
  229. package/dist/scene/render-scene-types.d.ts +0 -6
  230. package/dist/scene/render-scene-types.d.ts.map +1 -1
  231. package/dist/scene/render-scene.d.ts +122 -9
  232. package/dist/scene/render-scene.d.ts.map +1 -1
  233. package/dist/scene/visibility/bounds.d.ts +20 -0
  234. package/dist/scene/visibility/bounds.d.ts.map +1 -0
  235. package/dist/scene/visibility/budget.d.ts +16 -0
  236. package/dist/scene/visibility/budget.d.ts.map +1 -0
  237. package/dist/scene/visibility/facet.d.ts +73 -0
  238. package/dist/scene/visibility/facet.d.ts.map +1 -0
  239. package/dist/scene/visibility/gpu-frame-timing.d.ts +41 -0
  240. package/dist/scene/visibility/gpu-frame-timing.d.ts.map +1 -0
  241. package/dist/scene/visibility/gpu-lod.d.ts +46 -0
  242. package/dist/scene/visibility/gpu-lod.d.ts.map +1 -0
  243. package/dist/scene/visibility/inspection.d.ts +132 -0
  244. package/dist/scene/visibility/inspection.d.ts.map +1 -0
  245. package/dist/scene/visibility/lod-selector.d.ts +25 -0
  246. package/dist/scene/visibility/lod-selector.d.ts.map +1 -0
  247. package/dist/scene/visibility/occlusion-confidence.d.ts +81 -0
  248. package/dist/scene/visibility/occlusion-confidence.d.ts.map +1 -0
  249. package/dist/scene/visibility/occlusion-pass.d.ts +57 -0
  250. package/dist/scene/visibility/occlusion-pass.d.ts.map +1 -0
  251. package/dist/scene/visibility/occlusion-query-pool.d.ts +57 -0
  252. package/dist/scene/visibility/occlusion-query-pool.d.ts.map +1 -0
  253. package/dist/scene/visibility/occlusion-runtime.d.ts +96 -0
  254. package/dist/scene/visibility/occlusion-runtime.d.ts.map +1 -0
  255. package/dist/scene/visibility/types.d.ts +34 -0
  256. package/dist/scene/visibility/types.d.ts.map +1 -0
  257. package/dist/ssr/admission.d.ts +122 -0
  258. package/dist/ssr/admission.d.ts.map +1 -0
  259. package/dist/ssr/composition.d.ts +32 -0
  260. package/dist/ssr/composition.d.ts.map +1 -0
  261. package/dist/ssr/errors.d.ts +39 -0
  262. package/dist/ssr/errors.d.ts.map +1 -0
  263. package/dist/ssr/identity.d.ts +13 -0
  264. package/dist/ssr/identity.d.ts.map +1 -0
  265. package/dist/systems/skin-palette-allocator.d.ts +1 -1
  266. package/dist/temporal/frame-coordinator.d.ts +13 -0
  267. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  268. package/dist/temporal/frame.d.ts +2 -0
  269. package/dist/temporal/frame.d.ts.map +1 -1
  270. package/dist/temporal/index.mjs +6 -5
  271. package/dist/temporal/taa-history-store.d.ts +15 -1
  272. package/dist/temporal/taa-history-store.d.ts.map +1 -1
  273. package/dist/temporal/transaction.d.ts +5 -0
  274. package/dist/temporal/transaction.d.ts.map +1 -1
  275. package/dist/temporal/view.d.ts +7 -0
  276. package/dist/temporal/view.d.ts.map +1 -1
  277. package/dist/tilemap-chunk-extract-system.d.ts +1 -1
  278. package/dist/typed-render-graph-primitives.d.ts +4 -0
  279. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  280. package/dist/volume/passes.d.ts +8 -4
  281. package/dist/volume/passes.d.ts.map +1 -1
  282. package/package.json +20 -20
  283. package/src/__tests__/cluster-grid-default-surface.unit.test.ts +5 -0
  284. package/src/__tests__/detached-inspection.integration.test.ts +6 -0
  285. package/src/__tests__/device-feature-admission.unit.test.ts +19 -1
  286. package/src/__tests__/device-loss-fanout.unit.test.ts +107 -0
  287. package/src/__tests__/device-scope-lifecycle.unit.test.ts +21 -0
  288. package/src/__tests__/direct-light-snapshot.unit.test.ts +59 -3
  289. package/src/__tests__/environment-generation.integration.test.ts +39 -0
  290. package/src/__tests__/evidence-identity.ts +13 -0
  291. package/src/__tests__/evidence-identity.unit.test.ts +24 -0
  292. package/src/__tests__/expose-renderer-errors.unit.test.ts +34 -0
  293. package/src/__tests__/extended-lighting-recovery.browser.test.ts +14 -0
  294. package/src/__tests__/extended-lighting-recovery.dawn.test.ts +14 -0
  295. package/src/__tests__/extended-lighting-recovery.integration.test.ts +81 -0
  296. package/src/__tests__/extended-lighting-resources.unit.test.ts +51 -0
  297. package/src/__tests__/extended-lighting-zero-feature.integration.test.ts +52 -0
  298. package/src/__tests__/factory-contract.integration.test.ts +154 -6
  299. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +4 -1
  300. package/src/__tests__/frame-observation.contract.test.ts +15 -0
  301. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +146 -0
  302. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +1 -0
  303. package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +1 -0
  304. package/src/__tests__/gpu-driven-production.integration.test.ts +572 -9
  305. package/src/__tests__/gpu-driven-scaling.unit.test.ts +66 -2
  306. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +26 -1
  307. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +89 -2
  308. package/src/__tests__/gpu-driven-view.browser.test.ts +3 -3
  309. package/src/__tests__/gpu-driven-view.dawn.test.ts +3 -3
  310. package/src/__tests__/gpu-driven-view.unit.test.ts +50 -0
  311. package/src/__tests__/gpu-lod-evidence.ts +188 -0
  312. package/src/__tests__/gpu-lod-fallback.integration.test.ts +10 -0
  313. package/src/__tests__/gpu-lod-indirect.integration.test.ts +40 -0
  314. package/src/__tests__/gpu-lod-parity.dawn.test.ts +29 -0
  315. package/src/__tests__/gpu-lod-readiness.integration.test.ts +52 -0
  316. package/src/__tests__/gpu-lod-schema.unit.test.ts +66 -0
  317. package/src/__tests__/gpu-lod-selector.unit.test.ts +28 -0
  318. package/src/__tests__/gpu-lod-silhouette.browser.test.ts +13 -0
  319. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +66 -1
  320. package/src/__tests__/gpu-scene.dawn.test.ts +8 -1
  321. package/src/__tests__/gpu-scene.unit.test.ts +49 -3
  322. package/src/__tests__/ibl/face-uniforms.unit.test.ts +2 -0
  323. package/src/__tests__/ibl-residency-publication.unit.test.ts +113 -0
  324. package/src/__tests__/light-buffer-layout.unit.test.ts +113 -3
  325. package/src/__tests__/light-inspection.unit.test.ts +55 -0
  326. package/src/__tests__/light-resource-error.unit.test.ts +43 -0
  327. package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +109 -0
  328. package/src/__tests__/lod-bounds.unit.test.ts +42 -0
  329. package/src/__tests__/lod-cpu-lane.integration.test.ts +55 -0
  330. package/src/__tests__/lod-cpu-no-change.perf.test.ts +19 -0
  331. package/src/__tests__/lod-gpu-frame-timing.unit.test.ts +49 -0
  332. package/src/__tests__/lod-multi-view.integration.test.ts +63 -0
  333. package/src/__tests__/lod-occlusion-device-loss.integration.test.ts +27 -0
  334. package/src/__tests__/lod-occlusion-final-decision.integration.test.ts +47 -0
  335. package/src/__tests__/lod-occlusion-inspection.integration.test.ts +217 -0
  336. package/src/__tests__/lod-occlusion-inspection.schema.test-d.ts +14 -0
  337. package/src/__tests__/lod-occlusion-inspection.unit.test.ts +72 -0
  338. package/src/__tests__/lod-occlusion-visual-evidence.ts +91 -0
  339. package/src/__tests__/lod-occlusion.browser.test.ts +15 -0
  340. package/src/__tests__/lod-occlusion.dawn.test.ts +20 -0
  341. package/src/__tests__/lod-selector.profile.test.ts +35 -0
  342. package/src/__tests__/lod-selector.unit.test.ts +68 -0
  343. package/src/__tests__/lod-visibility-identity.unit.test.ts +198 -0
  344. package/src/__tests__/lod-visibility-lifecycle.integration.test.ts +132 -0
  345. package/src/__tests__/ltc-resources.unit.test.ts +32 -0
  346. package/src/__tests__/material-contract-inventory.unit.test.ts +41 -9
  347. package/src/__tests__/material-cooked-projection.unit.test.ts +19 -1
  348. package/src/__tests__/material-static-dynamic-route.unit.test.ts +29 -0
  349. package/src/__tests__/material-stride-surface.unit.test.ts +7 -3
  350. package/src/__tests__/materials-standard-contract.unit.test.ts +104 -0
  351. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +1 -1
  352. package/src/__tests__/occlusion-confidence.unit.test.ts +168 -0
  353. package/src/__tests__/occlusion-invalidation.integration.test.ts +37 -0
  354. package/src/__tests__/occlusion-pass-routing.unit.test.ts +16 -0
  355. package/src/__tests__/occlusion-pass.dawn.test.ts +20 -0
  356. package/src/__tests__/occlusion-pass.integration.test.ts +43 -0
  357. package/src/__tests__/occlusion-pass.rhi-null.test.ts +22 -0
  358. package/src/__tests__/occlusion-query-pool.rhi-null.test.ts +21 -0
  359. package/src/__tests__/occlusion-query-pool.unit.test.ts +95 -0
  360. package/src/__tests__/occlusion-query-ticket.integration.test.ts +47 -0
  361. package/src/__tests__/occlusion-query.dawn.test.ts +16 -0
  362. package/src/__tests__/occlusion-query.evidence.ts +178 -0
  363. package/src/__tests__/occlusion-query.rhi-null.test.ts +31 -0
  364. package/src/__tests__/occlusion-runtime.unit.test.ts +120 -0
  365. package/src/__tests__/physical-clearcoat.integration.test.ts +89 -0
  366. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +196 -0
  367. package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +1 -1
  368. package/src/__tests__/probe-bindings.unit.test.ts +200 -0
  369. package/src/__tests__/probe-blend-numeric.unit.test.ts +67 -0
  370. package/src/__tests__/probe-blend-oracle.unit.test.ts +136 -0
  371. package/src/__tests__/probe-capacity.integration.test.ts +97 -0
  372. package/src/__tests__/probe-recovery.integration.test.ts +104 -0
  373. package/src/__tests__/probe-scene-dirty.integration.test.ts +211 -0
  374. package/src/__tests__/profiler-phase-catalog.test.ts +4 -1
  375. package/src/__tests__/profiler-phase-token.test.ts +1 -0
  376. package/src/__tests__/recover-error-policy-owner.unit.test.ts +6 -3
  377. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +140 -0
  378. package/src/__tests__/rect-area-boundary.unit.test.ts +24 -0
  379. package/src/__tests__/reflection-fallback-graph.unit.test.ts +67 -0
  380. package/src/__tests__/reflection-fallback-inspection.unit.test.ts +77 -0
  381. package/src/__tests__/reflection-fallback-lifecycle.integration.test.ts +21 -0
  382. package/src/__tests__/reflection-fallback-projection.unit.test.ts +90 -0
  383. package/src/__tests__/reflection-fallback-source.unit.test.ts +32 -0
  384. package/src/__tests__/reflection-probe-owner-placement.unit.test.ts +39 -0
  385. package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +120 -0
  386. package/src/__tests__/render-error-code-owner.test-d.ts +1 -0
  387. package/src/__tests__/render-feature-docs.unit.test.ts +12 -7
  388. package/src/__tests__/render-graph-fallback.integration.test.ts +24 -0
  389. package/src/__tests__/render-perf/extended-lighting.bench.test.ts +66 -0
  390. package/src/__tests__/render-scene-projection.unit.test.ts +447 -18
  391. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +160 -17
  392. package/src/__tests__/renderer-frame-generation-fence.integration.test.ts +47 -0
  393. package/src/__tests__/renderer-generation-assembly.unit.test.ts +77 -0
  394. package/src/__tests__/renderer-generation-failure.unit.test.ts +108 -0
  395. package/src/__tests__/renderer-producer-root-matrix.integration.test.ts +33 -0
  396. package/src/__tests__/renderer-recovery-capability-matrix.unit.test.ts +59 -0
  397. package/src/__tests__/renderer-recovery-contract.unit.test.ts +73 -0
  398. package/src/__tests__/renderer-recovery-lifecycle.unit.test.ts +216 -0
  399. package/src/__tests__/renderer-target-history-recovery.integration.test.ts +80 -0
  400. package/src/__tests__/shader-manifest-fixture.ts +13 -16
  401. package/src/__tests__/shader-stage-surface.unit.test.ts +1 -1
  402. package/src/__tests__/skin-motion-regression.unit.test.ts +22 -0
  403. package/src/__tests__/skinned-shadow-caster.test.ts +2 -2
  404. package/src/__tests__/spot-modifier-projection.unit.test.ts +70 -0
  405. package/src/__tests__/ssr-admission-matrix.integration.test.ts +206 -0
  406. package/src/__tests__/ssr-composition.unit.test.ts +46 -0
  407. package/src/__tests__/ssr-fallback-zero-work.bench.test.ts +94 -0
  408. package/src/__tests__/ssr-recovery-errors.unit.test.ts +58 -0
  409. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +67 -0
  410. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +7 -0
  411. package/src/__tests__/standard-layer-projection.unit.test.ts +23 -0
  412. package/src/__tests__/standard-lighting-inspection.integration.test.ts +1 -1
  413. package/src/__tests__/standard-lighting-write.unit.test.ts +66 -2
  414. package/src/__tests__/temporal-fallback-generation.integration.test.ts +16 -0
  415. package/src/__tests__/temporal-view.unit.test.ts +3 -3
  416. package/src/__tests__/transmission-prewarm.unit.test.ts +111 -32
  417. package/src/__tests__/visibility-budget.integration.test.ts +140 -0
  418. package/src/__tests__/visibility-budget.unit.test.ts +70 -0
  419. package/src/__tests__/visibility-extract.integration.test.ts +11 -6
  420. package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +6 -3
  421. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +31 -28
  422. package/src/__tests__/volumetric-fog-topology.unit.test.ts +3 -1
  423. package/src/assembly/backend-contract.ts +13 -0
  424. package/src/assembly/bundler-contract.ts +9 -0
  425. package/src/assembly/device-feature-admission.ts +26 -9
  426. package/src/assembly/extended-lighting-fallback.ts +216 -0
  427. package/src/assembly/factory.ts +81 -9634
  428. package/src/assembly/host-contract.ts +10 -0
  429. package/src/assembly/material/assembly.ts +18 -2
  430. package/src/assembly/material/standard-layer-projection.ts +16 -0
  431. package/src/assembly/material-shader-policy.ts +854 -0
  432. package/src/assembly/material-shader-prewarm.ts +88 -0
  433. package/src/assembly/mesh-ssbo-grow.ts +270 -0
  434. package/src/assembly/recovery/device-loss-fanout.ts +89 -0
  435. package/src/assembly/recovery/generation.ts +141 -0
  436. package/src/assembly/recovery/recovery-attempt.ts +800 -0
  437. package/src/assembly/recovery/renderer-recover.ts +906 -0
  438. package/src/assembly/renderer-facade.ts +342 -0
  439. package/src/assembly/renderer-frame-transaction.ts +45 -0
  440. package/src/assembly/renderer-helpers.ts +99 -0
  441. package/src/assembly/renderer-lifecycle.ts +159 -0
  442. package/src/assembly/shader-prewarm-policy.ts +157 -0
  443. package/src/assembly/webgpu-ready-contract.ts +14 -0
  444. package/src/assembly/webgpu-ready.ts +4079 -0
  445. package/src/assembly/webgpu-renderer.ts +4095 -0
  446. package/src/cluster-binner.ts +31 -0
  447. package/src/components/__tests__/lighting-authoring.unit.test.ts +39 -0
  448. package/src/components/__tests__/rect-area-light.unit.test.ts +33 -0
  449. package/src/components/camera.ts +1 -1
  450. package/src/components/index.ts +3 -0
  451. package/src/components/light-helpers.ts +52 -1
  452. package/src/components/light-probe.ts +13 -0
  453. package/src/components/rect-area-light.ts +15 -0
  454. package/src/components/scene-instance.ts +6 -0
  455. package/src/components/spot-light.ts +3 -0
  456. package/src/debug-draw-glue.ts +1 -1
  457. package/src/device/__tests__/extended-lighting-recovery.unit.test.ts +24 -0
  458. package/src/device/device-scope.ts +35 -6
  459. package/src/device/gpu-residency.ts +334 -35
  460. package/src/device/lifecycle-transaction.ts +12 -0
  461. package/src/environment/frame.ts +6 -0
  462. package/src/environment/inspection.ts +10 -0
  463. package/src/environment/lifecycle.ts +122 -9
  464. package/src/errors/gpu-driven.ts +92 -0
  465. package/src/errors/index.ts +1 -0
  466. package/src/errors/recover.ts +108 -5
  467. package/src/errors/render.ts +72 -1
  468. package/src/extract/camera.ts +3 -3
  469. package/src/extract/contracts.ts +974 -0
  470. package/src/extract/gpu-driven.ts +108 -0
  471. package/src/extract/visibility.ts +0 -23
  472. package/src/features/host.ts +16 -0
  473. package/src/features/prepared-gpu-work.ts +20 -2
  474. package/src/features/prepared-graphics-store.ts +17 -0
  475. package/src/gpu-driven/batch-topology.ts +206 -28
  476. package/src/gpu-driven/prepared-draw.ts +208 -0
  477. package/src/gpu-driven/production-raster.ts +1046 -39
  478. package/src/gpu-driven/view-gpu.ts +411 -29
  479. package/src/gpu-scene-schema.ts +13 -0
  480. package/src/gpu-scene.ts +137 -67
  481. package/src/gpu-usage.ts +0 -1
  482. package/src/hdrp-buffers.ts +6 -6
  483. package/src/ibl/IblPipelineCache.ts +134 -50
  484. package/src/ibl/skylight-bind-group.ts +26 -0
  485. package/src/index.ts +83 -1
  486. package/src/inspection-types.ts +220 -1
  487. package/src/internal.ts +38 -0
  488. package/src/light-buffer-layout.ts +157 -324
  489. package/src/materials.ts +278 -47
  490. package/src/mesh-material-bindings.ts +59 -0
  491. package/src/occlusion-proxy.ts +64 -0
  492. package/src/pbr-pipeline.ts +290 -60
  493. package/src/pipeline/standard-forward-lane.ts +47 -0
  494. package/src/pipeline/standard-lighting/graph.ts +2 -1
  495. package/src/pipeline/standard-lighting/light-frame.ts +3 -2
  496. package/src/pipeline/standard-lighting/topology.ts +1 -1
  497. package/src/pipeline/standard-lighting/transport.ts +2 -1
  498. package/src/pipeline/standard-pipeline.ts +2 -0
  499. package/src/pipeline-builder.ts +5 -2
  500. package/src/pipeline-spec.ts +12 -1
  501. package/src/plugin.ts +4 -0
  502. package/src/points-lines/__tests__/cache-recovery.unit.test.ts +22 -0
  503. package/src/points-lines/prepare.ts +9 -0
  504. package/src/points-lines/standard-owner.ts +403 -0
  505. package/src/prepare/__tests__/extended-lighting-capability.unit.test.ts +56 -0
  506. package/src/prepare/extended-lighting/ltc-resources.ts +136 -0
  507. package/src/prepare/extended-lighting/resources.ts +389 -0
  508. package/src/prepare/extended-lighting/spot-modifiers.ts +194 -0
  509. package/src/prepare/extended-lighting/state.ts +92 -0
  510. package/src/record/__tests__/frame-targets-recovery.unit.test.ts +60 -0
  511. package/src/record/__tests__/gpu-timing.unit.test.ts +177 -0
  512. package/src/record/__tests__/main-pass-geometry.unit.test.ts +26 -1
  513. package/src/record/__tests__/mesh-ssbo.unit.test.ts +38 -0
  514. package/src/record/__tests__/recovery-pipeline.unit.test.ts +124 -0
  515. package/src/record/__tests__/sprite-material-abi.unit.test.ts +28 -13
  516. package/src/record/__tests__/standard-pbr-ubo-layout.unit.test.ts +47 -4
  517. package/src/record/__tests__/temporal-payload.unit.test.ts +29 -28
  518. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +21 -2
  519. package/src/record/frame-lighting.ts +252 -53
  520. package/src/record/frame-snapshot.ts +72 -12
  521. package/src/record/frame-targets.ts +11 -1
  522. package/src/record/frame.ts +416 -95
  523. package/src/record/gpu-timing.ts +108 -44
  524. package/src/record/helpers.ts +1 -59
  525. package/src/record/main-pass-geometry.ts +434 -44
  526. package/src/record/main-pass-material.ts +324 -210
  527. package/src/record/main-pass-sprite-draws.ts +58 -92
  528. package/src/record/main-pass.ts +94 -6
  529. package/src/record/mesh-ssbo.ts +79 -46
  530. package/src/record/recovery-pipeline.ts +695 -0
  531. package/src/record/render-context.ts +99 -7
  532. package/src/record/shadow-pass.ts +66 -40
  533. package/src/record/typed-frame-graph.ts +270 -84
  534. package/src/record/view-ubo.ts +17 -27
  535. package/src/recovery/render-system-candidate.ts +839 -0
  536. package/src/reflection/inspection.ts +67 -0
  537. package/src/reflection/projection.ts +196 -1
  538. package/src/reflection/record-owner.ts +1283 -0
  539. package/src/render-contract.ts +82 -12
  540. package/src/render-pipeline.ts +5 -0
  541. package/src/render-system-extract-tail.ts +2983 -0
  542. package/src/render-system-extract.ts +290 -2784
  543. package/src/render-system.ts +1597 -1192
  544. package/src/scene/__tests__/changed-block-summary.candidate.test.ts +36 -0
  545. package/src/scene/probe-blend-record.ts +54 -0
  546. package/src/scene/probe-blend.ts +813 -0
  547. package/src/scene/render-scene-types.ts +0 -7
  548. package/src/scene/render-scene.ts +972 -184
  549. package/src/scene/visibility/bounds.ts +57 -0
  550. package/src/scene/visibility/budget.ts +40 -0
  551. package/src/scene/visibility/facet.ts +400 -0
  552. package/src/scene/visibility/gpu-frame-timing.ts +101 -0
  553. package/src/scene/visibility/gpu-lod.ts +119 -0
  554. package/src/scene/visibility/inspection.ts +313 -0
  555. package/src/scene/visibility/lod-selector.ts +84 -0
  556. package/src/scene/visibility/occlusion-confidence.ts +478 -0
  557. package/src/scene/visibility/occlusion-pass.ts +165 -0
  558. package/src/scene/visibility/occlusion-query-pool.ts +178 -0
  559. package/src/scene/visibility/occlusion-runtime.ts +672 -0
  560. package/src/scene/visibility/types.ts +50 -0
  561. package/src/ssr/admission.ts +451 -0
  562. package/src/ssr/composition.ts +73 -0
  563. package/src/ssr/errors.ts +76 -0
  564. package/src/ssr/identity.ts +12 -0
  565. package/src/systems/skin-palette-allocator.ts +1 -1
  566. package/src/temporal/frame-coordinator.ts +30 -1
  567. package/src/temporal/frame.ts +14 -1
  568. package/src/temporal/taa-history-store.ts +46 -2
  569. package/src/temporal/temporal-view.ts +1 -1
  570. package/src/temporal/transaction.ts +9 -0
  571. package/src/temporal/view.ts +11 -0
  572. package/src/tilemap-chunk-extract-system.ts +5 -5
  573. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +19 -12
  574. package/src/typed-render-graph-primitives.ts +48 -0
  575. package/src/volume/passes.ts +46 -49
  576. package/dist/.tsbuildinfo +0 -1
  577. package/dist/chunk-5YADUCA7.mjs.map +0 -1
  578. package/dist/chunk-6OPXDQ2E.mjs.map +0 -1
  579. package/dist/chunk-BXBQQKFQ.mjs +0 -67
  580. package/dist/chunk-BXBQQKFQ.mjs.map +0 -1
  581. package/dist/chunk-FS2KNUQH.mjs.map +0 -1
  582. package/dist/chunk-PCHBPYML.mjs.map +0 -1
  583. package/dist/chunk-VFPLTKCU.mjs +0 -192
  584. package/dist/chunk-VFPLTKCU.mjs.map +0 -1
@@ -0,0 +1,50 @@
1
+ /** Closed view roles used by the renderer-owned visibility facet. */
2
+ export type VisibilityViewRole = 'main' | 'shadow' | 'reflection' | 'probe';
3
+
4
+ export interface ViewKey {
5
+ readonly attachmentId: string;
6
+ readonly cameraEntity: number;
7
+ readonly viewRole: VisibilityViewRole;
8
+ readonly viewGeneration: number;
9
+ }
10
+
11
+ export interface PrimitiveKey {
12
+ readonly attachmentId: string;
13
+ readonly worldGeneration: number;
14
+ readonly primitiveSlot: number;
15
+ readonly slotGeneration: number;
16
+ }
17
+
18
+ export interface VisibilityCandidate {
19
+ readonly level: number;
20
+ readonly confidence: number;
21
+ }
22
+
23
+ export interface VisibilityFacetInspection {
24
+ readonly owner: 'persistent-render-scene';
25
+ readonly activeViews: number;
26
+ readonly facetRows: number;
27
+ }
28
+
29
+ export interface VisibilityFacetInput {
30
+ readonly view: ViewKey;
31
+ readonly primitive: PrimitiveKey;
32
+ readonly epoch: number;
33
+ readonly candidate: VisibilityCandidate;
34
+ }
35
+
36
+ export function viewKeyId(key: ViewKey): string {
37
+ return `${key.attachmentId}:${key.cameraEntity}:${key.viewRole}:${key.viewGeneration}`;
38
+ }
39
+
40
+ export function primitiveKeyId(key: PrimitiveKey): string {
41
+ return `${key.attachmentId}:${key.worldGeneration}:${key.primitiveSlot}:${key.slotGeneration}`;
42
+ }
43
+
44
+ export function viewKey(input: ViewKey): ViewKey {
45
+ return Object.freeze({ ...input });
46
+ }
47
+
48
+ export function primitiveKey(input: PrimitiveKey): PrimitiveKey {
49
+ return Object.freeze({ ...input });
50
+ }
@@ -0,0 +1,451 @@
1
+ /**
2
+ * Consumer-only SSR M0 admission.
3
+ *
4
+ * This module consumes detached producer receipts. It owns no capture,
5
+ * device, graph, or recovery handle and therefore cannot repair a missing
6
+ * producer. A complete receipt set is the only route to an admitted result.
7
+ */
8
+
9
+ import {
10
+ type RhiTextureFormatCapabilityReceipt,
11
+ validateR32FloatReceipt,
12
+ } from '@forgeax/engine-rhi';
13
+ import type { ReflectionFallbackReceipt } from '../inspection-types';
14
+ import type { SsrOwnerRecoveryAction } from './errors';
15
+ import type { SsrAdmissionIdentity } from './identity';
16
+
17
+ export const SSR_FORMAT_PROFILE = 'r32float-mip-sampled-storage' as const;
18
+
19
+ export const SSR_FORMAT_STAGES = Object.freeze([
20
+ 'texture-create',
21
+ 'mip-view',
22
+ 'sampled-storage-bind-group',
23
+ 'pipeline-bind',
24
+ 'finish',
25
+ 'submit',
26
+ 'completion',
27
+ 'readback',
28
+ ] as const);
29
+
30
+ export type { SsrAdmissionIdentity } from './identity';
31
+
32
+ export type SsrFormatStage = (typeof SSR_FORMAT_STAGES)[number];
33
+
34
+ /**
35
+ * The admission input is the real renderer owner receipt plus the one
36
+ * integration identity supplied by the host. It deliberately does not
37
+ * recreate submitted/source/LKG boolean flags.
38
+ */
39
+ export type SsrReflectionFallbackReceipt = ReflectionFallbackReceipt & {
40
+ readonly identity: SsrAdmissionIdentity;
41
+ };
42
+
43
+ /** RHI capability receipt with the same host-supplied integration identity. */
44
+ export type SsrFormatReceipt = RhiTextureFormatCapabilityReceipt & {
45
+ readonly identity: SsrAdmissionIdentity;
46
+ };
47
+
48
+ export interface SsrTemporalReceipt {
49
+ readonly identity: SsrAdmissionIdentity;
50
+ readonly successfulSubmit: true;
51
+ readonly generation: number;
52
+ }
53
+
54
+ export interface SsrAdmissionWork {
55
+ readonly attachmentCount: number;
56
+ readonly passCount: number;
57
+ readonly bindingCount: number;
58
+ readonly resourceCount: number;
59
+ readonly historyCount: 0;
60
+ readonly temporalDemand: 0;
61
+ }
62
+
63
+ export interface SsrAdmissionBudget {
64
+ readonly probeExecutions: 0 | 1;
65
+ readonly resetCount: 0;
66
+ readonly rebuildCount: 0;
67
+ }
68
+
69
+ export interface SsrAdmissionFailure {
70
+ readonly code:
71
+ | 'ssr-not-requested'
72
+ | 'ssr-reflection-fallback-unavailable'
73
+ | 'ssr-format-unavailable'
74
+ | 'ssr-temporal-unavailable'
75
+ | 'ssr-receipt-identity-mismatch'
76
+ | 'ssr-receipt-stale';
77
+ readonly expected: string;
78
+ readonly hint: string;
79
+ readonly detail: Readonly<{
80
+ readonly owner: 'producer' | 'format' | 'temporal' | 'consumer';
81
+ /** Owner-directed action an AI consumer can take without parsing hint text. */
82
+ readonly action: SsrOwnerRecoveryAction;
83
+ readonly generation?: number;
84
+ readonly identityField?: keyof SsrAdmissionIdentity;
85
+ }>;
86
+ }
87
+
88
+ export type SsrAdmissionResult =
89
+ | {
90
+ readonly status: 'admitted';
91
+ readonly identity: SsrAdmissionIdentity | undefined;
92
+ readonly generation: number;
93
+ readonly work: SsrAdmissionWork;
94
+ readonly budget: SsrAdmissionBudget;
95
+ readonly failure?: undefined;
96
+ }
97
+ | {
98
+ readonly status: 'fallback-only';
99
+ readonly identity: SsrAdmissionIdentity | undefined;
100
+ readonly generation: number;
101
+ readonly work: SsrAdmissionWork;
102
+ readonly budget: SsrAdmissionBudget;
103
+ readonly failure: SsrAdmissionFailure;
104
+ };
105
+
106
+ export interface SsrAdmissionInput {
107
+ readonly requested: boolean;
108
+ readonly identity: SsrAdmissionIdentity;
109
+ readonly reflectionFallback?: SsrReflectionFallbackReceipt;
110
+ readonly format?: SsrFormatReceipt;
111
+ readonly temporal?: SsrTemporalReceipt;
112
+ readonly previousGeneration?: number;
113
+ }
114
+
115
+ /** Public renderer projection consumed by the parent SSR feature. */
116
+ export interface SsrDependenciesInspection {
117
+ readonly status: 'admitted' | 'fallback-only';
118
+ /** Absent until the host binds an exact source/tree/lock/build identity. */
119
+ readonly identity: SsrAdmissionIdentity | undefined;
120
+ readonly requested: boolean;
121
+ readonly reflectionFallback: ReflectionFallbackReceipt | undefined;
122
+ readonly format: SsrFormatReceipt | undefined;
123
+ readonly temporal: SsrTemporalReceipt | undefined;
124
+ readonly admission: SsrAdmissionResult;
125
+ readonly work: SsrAdmissionWork;
126
+ readonly budget: SsrAdmissionBudget;
127
+ readonly failure: SsrAdmissionFailure | undefined;
128
+ }
129
+
130
+ const ZERO_WORK: SsrAdmissionWork = Object.freeze({
131
+ attachmentCount: 0,
132
+ passCount: 0,
133
+ bindingCount: 0,
134
+ resourceCount: 0,
135
+ historyCount: 0,
136
+ temporalDemand: 0,
137
+ });
138
+
139
+ const ADMITTED_WORK: SsrAdmissionWork = Object.freeze({
140
+ attachmentCount: 1,
141
+ passCount: 1,
142
+ bindingCount: 1,
143
+ resourceCount: 1,
144
+ historyCount: 0,
145
+ temporalDemand: 0,
146
+ });
147
+
148
+ const ZERO_BUDGET: SsrAdmissionBudget = Object.freeze({
149
+ probeExecutions: 0,
150
+ resetCount: 0,
151
+ rebuildCount: 0,
152
+ });
153
+
154
+ const ADMITTED_BUDGET: SsrAdmissionBudget = Object.freeze({
155
+ probeExecutions: 1,
156
+ resetCount: 0,
157
+ rebuildCount: 0,
158
+ });
159
+
160
+ function identityFieldMismatch(
161
+ expected: SsrAdmissionIdentity,
162
+ actual: SsrAdmissionIdentity,
163
+ ): keyof SsrAdmissionIdentity | undefined {
164
+ for (const field of ['sourceHead', 'sourceTree', 'lockSha256', 'buildSha256'] as const) {
165
+ if (expected[field] !== actual[field]) return field;
166
+ }
167
+ return undefined;
168
+ }
169
+
170
+ function blocked(
171
+ identity: SsrAdmissionIdentity | undefined,
172
+ failure: SsrAdmissionFailure,
173
+ generation = 0,
174
+ ): SsrAdmissionResult {
175
+ return Object.freeze({
176
+ status: 'fallback-only',
177
+ identity,
178
+ generation,
179
+ work: ZERO_WORK,
180
+ budget: ZERO_BUDGET,
181
+ failure,
182
+ });
183
+ }
184
+
185
+ function failure(
186
+ code: SsrAdmissionFailure['code'],
187
+ owner: SsrAdmissionFailure['detail']['owner'],
188
+ hint: string,
189
+ detail: Omit<SsrAdmissionFailure['detail'], 'owner' | 'action'> = {},
190
+ ): SsrAdmissionFailure {
191
+ const action: SsrOwnerRecoveryAction = recoveryActionFor(code);
192
+ return Object.freeze({
193
+ code,
194
+ expected: 'all producer, format, and temporal receipts share one admitted identity',
195
+ hint,
196
+ detail: Object.freeze({ owner, action, ...detail }),
197
+ });
198
+ }
199
+
200
+ function recoveryActionFor(code: SsrAdmissionFailure['code']): SsrOwnerRecoveryAction {
201
+ switch (code) {
202
+ case 'ssr-reflection-fallback-unavailable':
203
+ case 'ssr-receipt-identity-mismatch':
204
+ return 'rebuild';
205
+ case 'ssr-not-requested':
206
+ case 'ssr-format-unavailable':
207
+ case 'ssr-temporal-unavailable':
208
+ case 'ssr-receipt-stale':
209
+ return 'retry';
210
+ }
211
+ }
212
+
213
+ function receiptFailure(
214
+ input: SsrAdmissionInput,
215
+ receipt: { readonly identity: SsrAdmissionIdentity },
216
+ owner: SsrAdmissionFailure['detail']['owner'],
217
+ ): SsrAdmissionResult | undefined {
218
+ const field = identityFieldMismatch(input.identity, receipt.identity);
219
+ if (field === undefined) return undefined;
220
+ return blocked(
221
+ input.identity,
222
+ failure('ssr-receipt-identity-mismatch', owner, 'rebuild the owner receipt for this identity', {
223
+ identityField: field,
224
+ }),
225
+ );
226
+ }
227
+
228
+ function validFallback(receipt: SsrReflectionFallbackReceipt | undefined): boolean {
229
+ return (
230
+ receipt !== undefined &&
231
+ receipt.candidateVisible === false &&
232
+ Number.isFinite(receipt.coverage) &&
233
+ receipt.coverage >= 0 &&
234
+ receipt.coverage <= 1 &&
235
+ (receipt.sourceKey === undefined || receipt.sourceKey.length > 0) &&
236
+ (receipt.extent === undefined ||
237
+ (receipt.extent.length === 3 &&
238
+ receipt.extent.every((value) => Number.isFinite(value) && value > 0))) &&
239
+ Number.isInteger(receipt.sourceGeneration) &&
240
+ receipt.sourceGeneration >= 0 &&
241
+ Number.isInteger(receipt.projectionGeneration) &&
242
+ receipt.projectionGeneration >= 0 &&
243
+ Number.isInteger(receipt.deviceGeneration) &&
244
+ receipt.deviceGeneration >= 0 &&
245
+ receipt.brdfSignature === 'standard-pbr-ibl-v1' &&
246
+ ((receipt.source === 'probe' && (receipt.state === 'active' || receipt.state === 'lkg')) ||
247
+ (receipt.source === 'skylight' && (receipt.state === 'active' || receipt.state === 'lkg')) ||
248
+ (receipt.source === 'neutral' && receipt.state === 'neutral'))
249
+ );
250
+ }
251
+
252
+ function validFormat(receipt: SsrFormatReceipt | undefined): boolean {
253
+ if (
254
+ receipt?.profile !== SSR_FORMAT_PROFILE ||
255
+ receipt.verdict !== 'admitted' ||
256
+ receipt.evidence !== 'real' ||
257
+ !Number.isInteger(receipt.deviceGeneration) ||
258
+ receipt.deviceGeneration < 0
259
+ ) {
260
+ return false;
261
+ }
262
+ if (
263
+ !SSR_FORMAT_STAGES.every((stage) =>
264
+ receipt.stages.some((entry) => entry.stage === stage && entry.verdict === 'admitted'),
265
+ )
266
+ ) {
267
+ return false;
268
+ }
269
+ return validateR32FloatReceipt(receipt).ok;
270
+ }
271
+
272
+ function validTemporal(receipt: SsrTemporalReceipt | undefined): boolean {
273
+ return (
274
+ receipt?.successfulSubmit === true &&
275
+ Number.isInteger(receipt.generation) &&
276
+ receipt.generation >= 0
277
+ );
278
+ }
279
+
280
+ export function admitSsrM0(input: SsrAdmissionInput): SsrAdmissionResult {
281
+ if (!input.requested) {
282
+ return blocked(
283
+ input.identity,
284
+ failure('ssr-not-requested', 'consumer', 'request SSR before evaluating M0 admission'),
285
+ );
286
+ }
287
+ if (input.reflectionFallback === undefined) {
288
+ return blocked(
289
+ input.identity,
290
+ failure('ssr-reflection-fallback-unavailable', 'producer', 'use LKG, Skylight, or neutral'),
291
+ );
292
+ }
293
+ const fallbackIdentityFailure = receiptFailure(input, input.reflectionFallback, 'producer');
294
+ if (fallbackIdentityFailure !== undefined) return fallbackIdentityFailure;
295
+ if (!validFallback(input.reflectionFallback)) {
296
+ return blocked(
297
+ input.identity,
298
+ failure(
299
+ 'ssr-reflection-fallback-unavailable',
300
+ 'producer',
301
+ 'inspect and rebuild the producer receipt',
302
+ ),
303
+ input.reflectionFallback.projectionGeneration,
304
+ );
305
+ }
306
+ if (input.format === undefined) {
307
+ return blocked(
308
+ input.identity,
309
+ failure('ssr-format-unavailable', 'format', 'probe the exact format profile for this device'),
310
+ input.reflectionFallback.projectionGeneration,
311
+ );
312
+ }
313
+ const formatIdentityFailure = receiptFailure(input, input.format, 'format');
314
+ if (formatIdentityFailure !== undefined) return formatIdentityFailure;
315
+ if (!validFormat(input.format)) {
316
+ return blocked(
317
+ input.identity,
318
+ failure('ssr-format-unavailable', 'format', 'complete the full r32float profile probe'),
319
+ input.reflectionFallback.projectionGeneration,
320
+ );
321
+ }
322
+ if (input.temporal === undefined) {
323
+ return blocked(
324
+ input.identity,
325
+ failure(
326
+ 'ssr-temporal-unavailable',
327
+ 'temporal',
328
+ 'submit the matching temporal producer receipt',
329
+ ),
330
+ input.reflectionFallback.projectionGeneration,
331
+ );
332
+ }
333
+ const temporalIdentityFailure = receiptFailure(input, input.temporal, 'temporal');
334
+ if (temporalIdentityFailure !== undefined) return temporalIdentityFailure;
335
+ if (!validTemporal(input.temporal)) {
336
+ return blocked(
337
+ input.identity,
338
+ failure('ssr-temporal-unavailable', 'temporal', 'inspect and rebuild the temporal receipt'),
339
+ input.reflectionFallback.projectionGeneration,
340
+ );
341
+ }
342
+ if (
343
+ input.previousGeneration !== undefined &&
344
+ input.previousGeneration !== input.reflectionFallback.projectionGeneration
345
+ ) {
346
+ return blocked(
347
+ input.identity,
348
+ failure(
349
+ 'ssr-receipt-stale',
350
+ 'consumer',
351
+ 'discard stale completion and reinspect the owners',
352
+ {
353
+ generation: input.reflectionFallback.projectionGeneration,
354
+ },
355
+ ),
356
+ input.reflectionFallback.projectionGeneration,
357
+ );
358
+ }
359
+ return Object.freeze({
360
+ status: 'admitted',
361
+ identity: input.identity,
362
+ generation: input.reflectionFallback.projectionGeneration,
363
+ work: ADMITTED_WORK,
364
+ budget: ADMITTED_BUDGET,
365
+ });
366
+ }
367
+
368
+ /**
369
+ * Joins the live owner projections at the renderer boundary. The only casts
370
+ * here add the host identity to receipts that otherwise remain canonical RHI
371
+ * or ReflectionProbe PODs; no producer fact is copied or renamed.
372
+ */
373
+ export function projectSsrDependencies(input: {
374
+ readonly requested: boolean;
375
+ readonly identity: SsrAdmissionIdentity | undefined;
376
+ readonly reflectionFallback: ReflectionFallbackReceipt | undefined;
377
+ readonly format: RhiTextureFormatCapabilityReceipt | undefined;
378
+ readonly temporal: { readonly successfulSubmit: true; readonly generation: number } | undefined;
379
+ readonly previousGeneration?: number;
380
+ }): SsrDependenciesInspection {
381
+ const identity = input.identity;
382
+ const reflectionFallback =
383
+ identity === undefined || input.reflectionFallback?.identity === undefined
384
+ ? undefined
385
+ : (input.reflectionFallback as SsrReflectionFallbackReceipt);
386
+ const format =
387
+ identity === undefined || input.format === undefined
388
+ ? undefined
389
+ : ({ ...input.format, identity } satisfies SsrFormatReceipt);
390
+ const temporal =
391
+ identity === undefined || input.temporal === undefined
392
+ ? undefined
393
+ : ({ identity, ...input.temporal } satisfies SsrTemporalReceipt);
394
+ const admission =
395
+ identity === undefined
396
+ ? blocked(
397
+ undefined,
398
+ failure(
399
+ input.requested ? 'ssr-receipt-identity-mismatch' : 'ssr-not-requested',
400
+ 'consumer',
401
+ input.requested
402
+ ? 'bind the exact source, tree, lock, and build identity before admission'
403
+ : 'request SSR before evaluating M0 admission',
404
+ input.requested ? { identityField: 'sourceHead' } : {},
405
+ ),
406
+ )
407
+ : admitSsrM0({
408
+ requested: input.requested,
409
+ identity,
410
+ ...(reflectionFallback === undefined ? {} : { reflectionFallback }),
411
+ ...(format === undefined ? {} : { format }),
412
+ ...(temporal === undefined ? {} : { temporal }),
413
+ ...(input.previousGeneration === undefined
414
+ ? {}
415
+ : { previousGeneration: input.previousGeneration }),
416
+ });
417
+ return Object.freeze({
418
+ status: admission.status,
419
+ identity,
420
+ requested: input.requested,
421
+ reflectionFallback: input.reflectionFallback,
422
+ format,
423
+ temporal,
424
+ admission,
425
+ work: admission.work,
426
+ budget: admission.budget,
427
+ failure: admission.failure,
428
+ });
429
+ }
430
+
431
+ export function zeroSsrAdmissionWork(): SsrAdmissionWork {
432
+ return ZERO_WORK;
433
+ }
434
+
435
+ /**
436
+ * Projects the admission decision into the existing temporal reset seam.
437
+ * Admission never creates temporal history; only a changed committed
438
+ * producer generation can request a reset through the coordinator.
439
+ */
440
+ export function resolveSsrAdmissionGeneration(
441
+ previousGeneration: number | undefined,
442
+ nextGeneration: number | undefined,
443
+ ): { readonly changed: boolean; readonly generation: number | undefined } {
444
+ return {
445
+ changed:
446
+ previousGeneration !== undefined &&
447
+ nextGeneration !== undefined &&
448
+ previousGeneration !== nextGeneration,
449
+ generation: nextGeneration,
450
+ };
451
+ }
@@ -0,0 +1,73 @@
1
+ import { err, ok, type Result } from '@forgeax/engine-types';
2
+
3
+ /** Linear HDR RGB used by the M0 composition contract. */
4
+ export type SsrReflectionColor = readonly [number, number, number];
5
+
6
+ export interface SsrCompositionInput {
7
+ /** Screen-hit confidence. The parent SSR consumer supplies 0..1. */
8
+ readonly c: number;
9
+ /** The Standard BRDF specular lobe before SSR replacement. */
10
+ readonly baseSpecular: SsrReflectionColor;
11
+ /** The same-source BRDF-projected screen contribution. */
12
+ readonly screenSpecular: SsrReflectionColor;
13
+ /** The committed producer-owned environment contribution. */
14
+ readonly fallbackSpecular: SsrReflectionColor;
15
+ }
16
+
17
+ export interface SsrCompositionInputError {
18
+ readonly code: 'ssr-composition-input-invalid';
19
+ readonly expected: string;
20
+ readonly hint: string;
21
+ readonly detail: Readonly<{
22
+ readonly field: 'c' | 'baseSpecular' | 'screenSpecular' | 'fallbackSpecular';
23
+ }>;
24
+ }
25
+
26
+ export type SsrCompositionResult = Result<SsrReflectionColor, SsrCompositionInputError>;
27
+
28
+ function finiteColor(value: SsrReflectionColor): boolean {
29
+ return value.length === 3 && value.every(Number.isFinite);
30
+ }
31
+
32
+ function invalid(
33
+ field: SsrCompositionInputError['detail']['field'],
34
+ expected: string,
35
+ ): SsrCompositionResult {
36
+ return err({
37
+ code: 'ssr-composition-input-invalid',
38
+ expected,
39
+ hint: 'preserve linear HDR and the bounded SSR confidence before composing',
40
+ detail: Object.freeze({ field }),
41
+ });
42
+ }
43
+
44
+ /**
45
+ * Apply the M0 reflection replacement contract without owning an SSR pass.
46
+ *
47
+ * `c=0` returns the base Standard specular lobe. `c=1` replaces only that
48
+ * lobe with the same-source screen contribution, subtracting the committed
49
+ * environment contribution once. Hi-Z traversal, history and graph wiring
50
+ * remain owned by the parent SSR feature.
51
+ */
52
+ export function composeSsrReflection(input: SsrCompositionInput): SsrCompositionResult {
53
+ if (!Number.isFinite(input.c) || input.c < 0 || input.c > 1) {
54
+ return invalid('c', 'a finite confidence in the inclusive range 0..1');
55
+ }
56
+ for (const [field, value] of [
57
+ ['baseSpecular', input.baseSpecular],
58
+ ['screenSpecular', input.screenSpecular],
59
+ ['fallbackSpecular', input.fallbackSpecular],
60
+ ] as const) {
61
+ if (!finiteColor(value)) {
62
+ return invalid(field, 'three finite linear HDR RGB channels');
63
+ }
64
+ }
65
+ const c = input.c;
66
+ return ok(
67
+ Object.freeze([
68
+ input.baseSpecular[0] + c * (input.screenSpecular[0] - input.fallbackSpecular[0]),
69
+ input.baseSpecular[1] + c * (input.screenSpecular[1] - input.fallbackSpecular[1]),
70
+ input.baseSpecular[2] + c * (input.screenSpecular[2] - input.fallbackSpecular[2]),
71
+ ]) as SsrReflectionColor,
72
+ );
73
+ }
@@ -0,0 +1,76 @@
1
+ /** Closed, consumer-facing failures for the detached SSR M0 contract. */
2
+ export type SsrAdmissionErrorCode =
3
+ | 'ssr-not-requested'
4
+ | 'ssr-reflection-fallback-unavailable'
5
+ | 'ssr-format-unavailable'
6
+ | 'ssr-temporal-unavailable'
7
+ | 'ssr-receipt-identity-mismatch'
8
+ | 'ssr-receipt-stale';
9
+
10
+ export type SsrOwnerRecoveryAction =
11
+ | 'use-LKG'
12
+ | 'use-Skylight'
13
+ | 'use-neutral'
14
+ | 'recapture'
15
+ | 'rebuild'
16
+ | 'retry';
17
+
18
+ export type SsrAdmissionErrorDetail =
19
+ | {
20
+ readonly code: 'ssr-not-requested';
21
+ readonly owner: 'consumer';
22
+ readonly action: 'retry';
23
+ }
24
+ | {
25
+ readonly code: 'ssr-reflection-fallback-unavailable';
26
+ readonly owner: 'producer';
27
+ readonly action: 'use-LKG' | 'use-Skylight' | 'use-neutral' | 'recapture' | 'rebuild';
28
+ }
29
+ | {
30
+ readonly code: 'ssr-format-unavailable';
31
+ readonly owner: 'format';
32
+ readonly action: 'rebuild' | 'retry';
33
+ readonly stage?: string;
34
+ }
35
+ | {
36
+ readonly code: 'ssr-temporal-unavailable';
37
+ readonly owner: 'temporal';
38
+ readonly action: 'rebuild' | 'retry';
39
+ }
40
+ | {
41
+ readonly code: 'ssr-receipt-identity-mismatch';
42
+ readonly owner: 'producer' | 'format' | 'temporal';
43
+ readonly action: 'rebuild';
44
+ readonly identityField: 'sourceHead' | 'sourceTree' | 'lockSha256' | 'buildSha256';
45
+ }
46
+ | {
47
+ readonly code: 'ssr-receipt-stale';
48
+ readonly owner: 'consumer';
49
+ readonly action: 'retry';
50
+ readonly generation: number;
51
+ };
52
+
53
+ export interface SsrAdmissionError {
54
+ readonly code: SsrAdmissionErrorCode;
55
+ readonly expected: string;
56
+ readonly hint: string;
57
+ readonly detail: SsrAdmissionErrorDetail;
58
+ }
59
+
60
+ const EXPECTED = 'all detached SSR dependency receipts share one admitted identity';
61
+
62
+ export function createSsrAdmissionError(detail: SsrAdmissionErrorDetail): SsrAdmissionError {
63
+ const hint =
64
+ detail.action === 'use-LKG'
65
+ ? 'use the producer last-known-good receipt before retrying admission'
66
+ : detail.action === 'use-Skylight'
67
+ ? 'use the producer Skylight receipt before retrying admission'
68
+ : detail.action === 'use-neutral'
69
+ ? 'use the producer neutral receipt before retrying admission'
70
+ : detail.action === 'recapture'
71
+ ? 'ask the producer owner to recapture and publish a detached receipt'
72
+ : detail.action === 'rebuild'
73
+ ? 'ask the owning producer to rebuild and publish a matching detached receipt'
74
+ : 'retry after the owner publishes a matching detached receipt';
75
+ return Object.freeze({ code: detail.code, expected: EXPECTED, hint, detail });
76
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Exact source/build identity shared by the producer, RHI and SSR consumer.
3
+ *
4
+ * Keeping the POD in its own leaf avoids a second copy of the identity shape
5
+ * in the owner inspection types and in the admission module.
6
+ */
7
+ export type SsrAdmissionIdentity = Readonly<{
8
+ readonly sourceHead: string;
9
+ readonly sourceTree: string;
10
+ readonly lockSha256: string;
11
+ readonly buildSha256: string;
12
+ }>;
@@ -103,7 +103,7 @@ export interface SkinPaletteAllocator {
103
103
  * Computes M_i = jointWorldTransforms[i] * ibm[i] per joint.
104
104
  *
105
105
  * `jointWorlds[i]` is taken straight from `Skin.joints[i]` entity's
106
- * `Transform.world` view (a 16-float column-major Float32Array
106
+ * `GlobalTransform.world` view (a 16-float column-major Float32Array
107
107
  * written by propagateTransforms); zero recompose, premultiplies
108
108
  * directly against the IBM.
109
109
  */