@forgeax/engine-render 0.1.28 → 0.1.30

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 (768) hide show
  1. package/README.md +856 -126
  2. package/dist/assembly/atmosphere-shader-prewarm.d.ts +6 -0
  3. package/dist/assembly/atmosphere-shader-prewarm.d.ts.map +1 -0
  4. package/dist/assembly/device-feature-admission.d.ts +4 -3
  5. package/dist/assembly/device-feature-admission.d.ts.map +1 -1
  6. package/dist/assembly/dynamic-geometry-host.d.ts +27 -0
  7. package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
  8. package/dist/assembly/dynamic-geometry-runtime.d.ts +20 -0
  9. package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -0
  10. package/dist/assembly/factory.d.ts +3 -1
  11. package/dist/assembly/factory.d.ts.map +1 -1
  12. package/dist/assembly/gpu-driven-owner.d.ts +10 -0
  13. package/dist/assembly/gpu-driven-owner.d.ts.map +1 -0
  14. package/dist/assembly/host-contract.d.ts +14 -0
  15. package/dist/assembly/host-contract.d.ts.map +1 -1
  16. package/dist/assembly/material/assembly.d.ts +31 -1
  17. package/dist/assembly/material/assembly.d.ts.map +1 -1
  18. package/dist/assembly/material/pipeline-helpers.d.ts +24 -0
  19. package/dist/assembly/material/pipeline-helpers.d.ts.map +1 -0
  20. package/dist/assembly/material-shader-policy.d.ts +3 -1
  21. package/dist/assembly/material-shader-policy.d.ts.map +1 -1
  22. package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -1
  23. package/dist/assembly/recovery/failure-location.d.ts +12 -0
  24. package/dist/assembly/recovery/failure-location.d.ts.map +1 -0
  25. package/dist/assembly/recovery/recovery-attempt.d.ts +1 -6
  26. package/dist/assembly/recovery/recovery-attempt.d.ts.map +1 -1
  27. package/dist/assembly/recovery/renderer-recover.d.ts +7 -4
  28. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  29. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  30. package/dist/assembly/renderer-feature-inspection.d.ts +5 -0
  31. package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -0
  32. package/dist/assembly/renderer-frame-transaction.d.ts +19 -0
  33. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  34. package/dist/assembly/renderer-helpers.d.ts +3 -0
  35. package/dist/assembly/renderer-helpers.d.ts.map +1 -1
  36. package/dist/assembly/renderer-inspection.d.ts +4 -0
  37. package/dist/assembly/renderer-inspection.d.ts.map +1 -1
  38. package/dist/assembly/shader-prewarm-policy.d.ts +7 -1
  39. package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -1
  40. package/dist/assembly/skin-palette-owner.d.ts +8 -0
  41. package/dist/assembly/skin-palette-owner.d.ts.map +1 -0
  42. package/dist/assembly/ssr-shader-prewarm.d.ts +6 -0
  43. package/dist/assembly/ssr-shader-prewarm.d.ts.map +1 -0
  44. package/dist/assembly/webgpu-device-loss.d.ts +15 -0
  45. package/dist/assembly/webgpu-device-loss.d.ts.map +1 -0
  46. package/dist/assembly/webgpu-pbr-ready.d.ts +38 -0
  47. package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -0
  48. package/dist/assembly/webgpu-ready-mipmap.d.ts +11 -0
  49. package/dist/assembly/webgpu-ready-mipmap.d.ts.map +1 -0
  50. package/dist/assembly/webgpu-ready.d.ts +7 -3
  51. package/dist/assembly/webgpu-ready.d.ts.map +1 -1
  52. package/dist/assembly/webgpu-renderer-bootstrap.d.ts +10 -0
  53. package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -0
  54. package/dist/assembly/webgpu-renderer-contract.d.ts +62 -0
  55. package/dist/assembly/webgpu-renderer-contract.d.ts.map +1 -0
  56. package/dist/assembly/webgpu-renderer-guards.d.ts +9 -0
  57. package/dist/assembly/webgpu-renderer-guards.d.ts.map +1 -0
  58. package/dist/assembly/webgpu-renderer-observation.d.ts +6 -0
  59. package/dist/assembly/webgpu-renderer-observation.d.ts.map +1 -0
  60. package/dist/assembly/webgpu-renderer-recovery-failure.d.ts +12 -0
  61. package/dist/assembly/webgpu-renderer-recovery-failure.d.ts.map +1 -0
  62. package/dist/assembly/webgpu-renderer.d.ts +7 -141
  63. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  64. package/dist/assembly/webgpu-vertex-layouts.d.ts +28 -84
  65. package/dist/assembly/webgpu-vertex-layouts.d.ts.map +1 -1
  66. package/dist/authoring.mjs +2 -2
  67. package/dist/capture/scene-projection.d.ts +41 -0
  68. package/dist/capture/scene-projection.d.ts.map +1 -0
  69. package/dist/{chunk-J52NMQKR.mjs → chunk-7MQ3XBSP.mjs} +1098 -844
  70. package/dist/chunk-7MQ3XBSP.mjs.map +1 -0
  71. package/dist/{chunk-GF523LHF.mjs → chunk-BLXGONR2.mjs} +30 -12
  72. package/dist/chunk-BLXGONR2.mjs.map +1 -0
  73. package/dist/{chunk-VSL23LZE.mjs → chunk-C3DDSXYK.mjs} +1188 -463
  74. package/dist/chunk-C3DDSXYK.mjs.map +1 -0
  75. package/dist/{chunk-IQMKJLNU.mjs → chunk-FUUO4UND.mjs} +443 -30
  76. package/dist/chunk-FUUO4UND.mjs.map +1 -0
  77. package/dist/{chunk-J6KACNOH.mjs → chunk-JRBDO2KB.mjs} +617 -7
  78. package/dist/chunk-JRBDO2KB.mjs.map +1 -0
  79. package/dist/{chunk-GE3SDD72.mjs → chunk-MDQJPY3T.mjs} +20 -40
  80. package/dist/chunk-MDQJPY3T.mjs.map +1 -0
  81. package/dist/{chunk-MYJ5RPJO.mjs → chunk-NO4WZCAH.mjs} +3 -3
  82. package/dist/chunk-NO4WZCAH.mjs.map +1 -0
  83. package/dist/{chunk-RBDBZ5R7.mjs → chunk-PA5DRJNI.mjs} +2 -2
  84. package/dist/chunk-PA5DRJNI.mjs.map +1 -0
  85. package/dist/{chunk-MBU4ZVE7.mjs → chunk-PSEQ6QPH.mjs} +4655 -892
  86. package/dist/chunk-PSEQ6QPH.mjs.map +1 -0
  87. package/dist/{chunk-JAASCMXA.mjs → chunk-S5UE2T5P.mjs} +289 -41
  88. package/dist/chunk-S5UE2T5P.mjs.map +1 -0
  89. package/dist/components/camera.d.ts +62 -2
  90. package/dist/components/camera.d.ts.map +1 -1
  91. package/dist/components/directional-light.d.ts +2 -2
  92. package/dist/components/dynamic-resolution.d.ts +15 -0
  93. package/dist/components/dynamic-resolution.d.ts.map +1 -0
  94. package/dist/components/index.d.ts +2 -0
  95. package/dist/components/index.d.ts.map +1 -1
  96. package/dist/components/instances.d.ts +6 -20
  97. package/dist/components/instances.d.ts.map +1 -1
  98. package/dist/components/light-helpers.d.ts.map +1 -1
  99. package/dist/components/reflection-probe.d.ts +1 -0
  100. package/dist/components/reflection-probe.d.ts.map +1 -1
  101. package/dist/components/scene-instance.d.ts +2 -1
  102. package/dist/components/scene-instance.d.ts.map +1 -1
  103. package/dist/components/screen-space-reflection.d.ts +14 -0
  104. package/dist/components/screen-space-reflection.d.ts.map +1 -0
  105. package/dist/components/skylight.d.ts +4 -1
  106. package/dist/components/skylight.d.ts.map +1 -1
  107. package/dist/construct-renderer.mjs +14809 -7570
  108. package/dist/construct-renderer.mjs.map +1 -1
  109. package/dist/device/device-scope.d.ts +2 -0
  110. package/dist/device/device-scope.d.ts.map +1 -1
  111. package/dist/device/gpu-residency.d.ts +3 -14
  112. package/dist/device/gpu-residency.d.ts.map +1 -1
  113. package/dist/dynamic-geometry.d.ts.map +1 -1
  114. package/dist/environment/background.d.ts +7 -0
  115. package/dist/environment/background.d.ts.map +1 -0
  116. package/dist/environment/ibl.d.ts +11 -0
  117. package/dist/environment/ibl.d.ts.map +1 -0
  118. package/dist/environment/storage.d.ts +14 -0
  119. package/dist/environment/storage.d.ts.map +1 -0
  120. package/dist/errors/gpu-driven.d.ts +6 -3
  121. package/dist/errors/gpu-driven.d.ts.map +1 -1
  122. package/dist/errors/render.d.ts +41 -4
  123. package/dist/errors/render.d.ts.map +1 -1
  124. package/dist/extract/camera.d.ts.map +1 -1
  125. package/dist/extract/contracts.d.ts +7 -0
  126. package/dist/extract/contracts.d.ts.map +1 -1
  127. package/dist/extract/gpu-driven.d.ts +50 -3
  128. package/dist/extract/gpu-driven.d.ts.map +1 -1
  129. package/dist/features/host.d.ts +23 -1
  130. package/dist/features/host.d.ts.map +1 -1
  131. package/dist/features/noise-texture.d.ts +17 -0
  132. package/dist/features/noise-texture.d.ts.map +1 -0
  133. package/dist/features/plan.d.ts +83 -2
  134. package/dist/features/plan.d.ts.map +1 -1
  135. package/dist/features/prepared-gpu-work.d.ts +37 -4
  136. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  137. package/dist/features/prepared-graphics-store.d.ts.map +1 -1
  138. package/dist/features/prepared-graphics.d.ts +5 -0
  139. package/dist/features/prepared-graphics.d.ts.map +1 -1
  140. package/dist/features/render-graph-compute.d.ts +5 -3
  141. package/dist/features/render-graph-compute.d.ts.map +1 -1
  142. package/dist/features/render-graph-contribution.d.ts +11 -3
  143. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  144. package/dist/features/render-graph-raster.d.ts +19 -3
  145. package/dist/features/render-graph-raster.d.ts.map +1 -1
  146. package/dist/features/types.d.ts +11 -0
  147. package/dist/features/types.d.ts.map +1 -1
  148. package/dist/fullscreen-post-process-pass.d.ts +2 -0
  149. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  150. package/dist/gpu-driven/batch-topology.d.ts +34 -1
  151. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  152. package/dist/gpu-driven/material-artifacts.d.ts +24 -0
  153. package/dist/gpu-driven/material-artifacts.d.ts.map +1 -0
  154. package/dist/gpu-driven/material-bindings.d.ts +7 -0
  155. package/dist/gpu-driven/material-bindings.d.ts.map +1 -0
  156. package/dist/gpu-driven/pbr-program.d.ts +10 -0
  157. package/dist/gpu-driven/pbr-program.d.ts.map +1 -0
  158. package/dist/gpu-driven/prepared-draw.d.ts +2 -0
  159. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  160. package/dist/gpu-driven/production-raster.d.ts +169 -27
  161. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  162. package/dist/gpu-driven/shadow-views.d.ts +126 -0
  163. package/dist/gpu-driven/shadow-views.d.ts.map +1 -0
  164. package/dist/gpu-driven/view-gpu.d.ts +18 -2
  165. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  166. package/dist/gpu-resource.d.ts +5 -2
  167. package/dist/gpu-resource.d.ts.map +1 -1
  168. package/dist/gpu-scene-schema.d.ts +2 -8
  169. package/dist/gpu-scene-schema.d.ts.map +1 -1
  170. package/dist/gpu-scene.d.ts +14 -0
  171. package/dist/gpu-scene.d.ts.map +1 -1
  172. package/dist/gpu-texture-usage.d.ts +1 -0
  173. package/dist/gpu-texture-usage.d.ts.map +1 -1
  174. package/dist/hdrp-buffers.d.ts +9 -0
  175. package/dist/hdrp-buffers.d.ts.map +1 -1
  176. package/dist/ibl/IblPipelineCache.d.ts +2 -0
  177. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  178. package/dist/ibl/frame-resources.d.ts +8 -0
  179. package/dist/ibl/frame-resources.d.ts.map +1 -0
  180. package/dist/ibl/skylight-bind-group.d.ts +3 -1
  181. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  182. package/dist/index.d.ts +87 -75
  183. package/dist/index.d.ts.map +1 -1
  184. package/dist/index.mjs +10 -8
  185. package/dist/index.mjs.map +1 -1
  186. package/dist/inspection-types.d.ts +180 -1
  187. package/dist/inspection-types.d.ts.map +1 -1
  188. package/dist/instances-derived-bounds.d.ts +11 -0
  189. package/dist/instances-derived-bounds.d.ts.map +1 -1
  190. package/dist/instances.d.ts +89 -44
  191. package/dist/instances.d.ts.map +1 -1
  192. package/dist/internal.d.ts +3 -0
  193. package/dist/internal.d.ts.map +1 -1
  194. package/dist/internal.mjs +117 -9
  195. package/dist/internal.mjs.map +1 -1
  196. package/dist/lifecycle.d.ts +2 -1
  197. package/dist/lifecycle.d.ts.map +1 -1
  198. package/dist/material-row.d.ts +15 -0
  199. package/dist/material-row.d.ts.map +1 -0
  200. package/dist/materials.d.ts +15 -0
  201. package/dist/materials.d.ts.map +1 -1
  202. package/dist/pbr-pipeline.d.ts +23 -5
  203. package/dist/pbr-pipeline.d.ts.map +1 -1
  204. package/dist/pipeline/render-extent.d.ts +51 -0
  205. package/dist/pipeline/render-extent.d.ts.map +1 -0
  206. package/dist/pipeline/standard-build-context.d.ts +7 -0
  207. package/dist/pipeline/standard-build-context.d.ts.map +1 -0
  208. package/dist/pipeline/standard-forward-lane.d.ts +3 -2
  209. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  210. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts +12 -0
  211. package/dist/pipeline/standard-output/auto-exposure/capability.d.ts.map +1 -0
  212. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts +70 -0
  213. package/dist/pipeline/standard-output/auto-exposure/gpu.d.ts.map +1 -0
  214. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts +75 -0
  215. package/dist/pipeline/standard-output/auto-exposure/graph.d.ts.map +1 -0
  216. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts +111 -0
  217. package/dist/pipeline/standard-output/auto-exposure/inspection.d.ts.map +1 -0
  218. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts +16 -0
  219. package/dist/pipeline/standard-output/auto-exposure/oracle.d.ts.map +1 -0
  220. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts +14 -0
  221. package/dist/pipeline/standard-output/auto-exposure/preset.d.ts.map +1 -0
  222. package/dist/pipeline/standard-output/auto-exposure/state.d.ts +46 -0
  223. package/dist/pipeline/standard-output/auto-exposure/state.d.ts.map +1 -0
  224. package/dist/pipeline/standard-output/color-transform.d.ts +27 -0
  225. package/dist/pipeline/standard-output/color-transform.d.ts.map +1 -0
  226. package/dist/pipeline/standard-output/graph.d.ts +15 -0
  227. package/dist/pipeline/standard-output/graph.d.ts.map +1 -0
  228. package/dist/pipeline/standard-output/lut-admission.d.ts +29 -0
  229. package/dist/pipeline/standard-output/lut-admission.d.ts.map +1 -0
  230. package/dist/pipeline/standard-output/lut-gpu.d.ts +48 -0
  231. package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -0
  232. package/dist/pipeline/standard-output/lut-state.d.ts +68 -0
  233. package/dist/pipeline/standard-output/lut-state.d.ts.map +1 -0
  234. package/dist/pipeline/standard-output/resources.d.ts +10 -0
  235. package/dist/pipeline/standard-output/resources.d.ts.map +1 -0
  236. package/dist/pipeline/standard-output/types.d.ts +39 -0
  237. package/dist/pipeline/standard-output/types.d.ts.map +1 -0
  238. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  239. package/dist/pipeline/standard-post.d.ts +2 -2
  240. package/dist/pipeline/standard-post.d.ts.map +1 -1
  241. package/dist/pipeline/standard-profile.d.ts +2 -1
  242. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  243. package/dist/pipeline-builder.d.ts +5 -2
  244. package/dist/pipeline-builder.d.ts.map +1 -1
  245. package/dist/pipeline-spec-types.d.ts +4 -0
  246. package/dist/pipeline-spec-types.d.ts.map +1 -1
  247. package/dist/pipeline-spec.d.ts +1 -9
  248. package/dist/pipeline-spec.d.ts.map +1 -1
  249. package/dist/plugin.d.ts.map +1 -1
  250. package/dist/points-lines/standard-owner.d.ts +1 -1
  251. package/dist/points-lines/standard-owner.d.ts.map +1 -1
  252. package/dist/post-process-errors.d.ts +9 -2
  253. package/dist/post-process-errors.d.ts.map +1 -1
  254. package/dist/prepare/extended-lighting/resources.d.ts +3 -3
  255. package/dist/prepare/prepared-graphics-resolver.d.ts +6 -1
  256. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  257. package/dist/record/dynamic-geometry-consumption.d.ts +15 -0
  258. package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -0
  259. package/dist/record/frame-lighting.d.ts +3 -3
  260. package/dist/record/frame-lighting.d.ts.map +1 -1
  261. package/dist/record/frame-snapshot.d.ts +109 -13
  262. package/dist/record/frame-snapshot.d.ts.map +1 -1
  263. package/dist/record/frame-targets.d.ts.map +1 -1
  264. package/dist/record/frame.d.ts +41 -5
  265. package/dist/record/frame.d.ts.map +1 -1
  266. package/dist/record/main-pass-geometry.d.ts +13 -9
  267. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  268. package/dist/record/main-pass-material.d.ts +43 -3
  269. package/dist/record/main-pass-material.d.ts.map +1 -1
  270. package/dist/record/main-pass-sprite-draws.d.ts +2 -10
  271. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  272. package/dist/record/main-pass.d.ts +14 -2
  273. package/dist/record/main-pass.d.ts.map +1 -1
  274. package/dist/record/mesh-ssbo.d.ts +15 -6
  275. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  276. package/dist/record/prepared-material-bindings.d.ts +19 -0
  277. package/dist/record/prepared-material-bindings.d.ts.map +1 -0
  278. package/dist/record/recovery-pipeline.d.ts +1 -0
  279. package/dist/record/recovery-pipeline.d.ts.map +1 -1
  280. package/dist/record/render-context.d.ts +101 -22
  281. package/dist/record/render-context.d.ts.map +1 -1
  282. package/dist/record/shadow-pass.d.ts +62 -7
  283. package/dist/record/shadow-pass.d.ts.map +1 -1
  284. package/dist/record/skybox-post-pass.d.ts +1 -1
  285. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  286. package/dist/record/typed-frame-graph.d.ts +39 -8
  287. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  288. package/dist/record/view-ubo.d.ts +1 -0
  289. package/dist/record/view-ubo.d.ts.map +1 -1
  290. package/dist/recovery/render-system-candidate.d.ts +10 -2
  291. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  292. package/dist/recovery/render-system-roots.d.ts +11 -0
  293. package/dist/recovery/render-system-roots.d.ts.map +1 -0
  294. package/dist/recovery/types.d.ts +76 -0
  295. package/dist/recovery/types.d.ts.map +1 -0
  296. package/dist/reflection/background.d.ts +14 -0
  297. package/dist/reflection/background.d.ts.map +1 -0
  298. package/dist/reflection/filter.d.ts.map +1 -1
  299. package/dist/reflection/projection.d.ts +1 -0
  300. package/dist/reflection/projection.d.ts.map +1 -1
  301. package/dist/reflection/record-owner.d.ts +4 -4
  302. package/dist/reflection/record-owner.d.ts.map +1 -1
  303. package/dist/render-contract.d.ts +211 -53
  304. package/dist/render-contract.d.ts.map +1 -1
  305. package/dist/render-graph-primitives.d.ts +1 -0
  306. package/dist/render-graph-primitives.d.ts.map +1 -1
  307. package/dist/render-pipeline.d.ts +81 -6
  308. package/dist/render-pipeline.d.ts.map +1 -1
  309. package/dist/render-system-extract-tail.d.ts +15 -6
  310. package/dist/render-system-extract-tail.d.ts.map +1 -1
  311. package/dist/render-system-extract.d.ts +128 -41
  312. package/dist/render-system-extract.d.ts.map +1 -1
  313. package/dist/render-system-projections.d.ts +22 -0
  314. package/dist/render-system-projections.d.ts.map +1 -0
  315. package/dist/render-system.d.ts +27 -77
  316. package/dist/render-system.d.ts.map +1 -1
  317. package/dist/scene/render-scene-types.d.ts +14 -7
  318. package/dist/scene/render-scene-types.d.ts.map +1 -1
  319. package/dist/scene/render-scene.d.ts +31 -11
  320. package/dist/scene/render-scene.d.ts.map +1 -1
  321. package/dist/scene/shadow-visibility.d.ts +5 -0
  322. package/dist/scene/shadow-visibility.d.ts.map +1 -0
  323. package/dist/ssao-config.d.ts +8 -6
  324. package/dist/ssao-config.d.ts.map +1 -1
  325. package/dist/ssr/admission.d.ts +70 -1
  326. package/dist/ssr/admission.d.ts.map +1 -1
  327. package/dist/ssr/compose.d.ts +13 -0
  328. package/dist/ssr/compose.d.ts.map +1 -0
  329. package/dist/ssr/errors.d.ts +35 -0
  330. package/dist/ssr/errors.d.ts.map +1 -1
  331. package/dist/ssr/graph.d.ts +60 -0
  332. package/dist/ssr/graph.d.ts.map +1 -0
  333. package/dist/ssr/history.d.ts +97 -0
  334. package/dist/ssr/history.d.ts.map +1 -0
  335. package/dist/ssr/hiz.d.ts +37 -0
  336. package/dist/ssr/hiz.d.ts.map +1 -0
  337. package/dist/ssr/inspection.d.ts +42 -0
  338. package/dist/ssr/inspection.d.ts.map +1 -0
  339. package/dist/ssr/resources.d.ts +58 -0
  340. package/dist/ssr/resources.d.ts.map +1 -0
  341. package/dist/ssr/temporal.d.ts +38 -0
  342. package/dist/ssr/temporal.d.ts.map +1 -0
  343. package/dist/systems/skin-palette-allocator.d.ts +32 -10
  344. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  345. package/dist/systems/skin-palette-types.d.ts +15 -0
  346. package/dist/systems/skin-palette-types.d.ts.map +1 -1
  347. package/dist/systems/transparent-dispatch.d.ts +9 -0
  348. package/dist/systems/transparent-dispatch.d.ts.map +1 -0
  349. package/dist/targets/material-source.d.ts +7 -0
  350. package/dist/targets/material-source.d.ts.map +1 -1
  351. package/dist/temporal/frame-coordinator.d.ts +7 -0
  352. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  353. package/dist/temporal/gpu.d.ts +8 -0
  354. package/dist/temporal/gpu.d.ts.map +1 -1
  355. package/dist/temporal/history.d.ts.map +1 -1
  356. package/dist/temporal/index.mjs +6 -6
  357. package/dist/temporal/inspection.d.ts.map +1 -1
  358. package/dist/temporal/standard-scene-data.d.ts +4 -2
  359. package/dist/temporal/standard-scene-data.d.ts.map +1 -1
  360. package/dist/temporal/target-coverage-attachment.d.ts +15 -0
  361. package/dist/temporal/target-coverage-attachment.d.ts.map +1 -0
  362. package/dist/temporal/temporal-view.d.ts +6 -0
  363. package/dist/temporal/temporal-view.d.ts.map +1 -1
  364. package/dist/temporal/view.d.ts +6 -0
  365. package/dist/temporal/view.d.ts.map +1 -1
  366. package/dist/typed-render-graph-primitives.d.ts +41 -1
  367. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  368. package/dist/typed-shadow-passes.d.ts +3 -1
  369. package/dist/typed-shadow-passes.d.ts.map +1 -1
  370. package/dist/volume/component.d.ts +1 -0
  371. package/dist/volume/component.d.ts.map +1 -1
  372. package/dist/volume/temporal.d.ts +6 -0
  373. package/dist/volume/temporal.d.ts.map +1 -1
  374. package/package.json +21 -20
  375. package/src/__tests__/auto-exposure-gpu-evidence.ts +291 -0
  376. package/src/__tests__/auto-exposure-inspection.unit.test.ts +80 -0
  377. package/src/__tests__/auto-exposure-transaction.integration.test.ts +99 -0
  378. package/src/__tests__/auto-exposure.browser.test.ts +33 -0
  379. package/src/__tests__/auto-exposure.dawn.test.ts +33 -0
  380. package/src/__tests__/capture-scene-projection.unit.test.ts +24 -0
  381. package/src/__tests__/detached-inspection.integration.test.ts +5 -0
  382. package/src/__tests__/device-feature-admission.unit.test.ts +15 -24
  383. package/src/__tests__/device-loss-fanout.unit.test.ts +43 -0
  384. package/src/__tests__/device-scope-lifecycle.unit.test.ts +18 -0
  385. package/src/__tests__/device-scope-stale-matrix.unit.test.ts +18 -0
  386. package/src/__tests__/docs-gate-green.unit.test.ts +3 -3
  387. package/src/__tests__/dynamic-geometry-batch.unit.test.ts +157 -0
  388. package/src/__tests__/dynamic-geometry.unit.test.ts +36 -0
  389. package/src/__tests__/dynamic-resolution-plugin.integration.test.ts +81 -0
  390. package/src/__tests__/factory-contract.integration.test.ts +231 -9
  391. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +19 -0
  392. package/src/__tests__/feature-depth-input.dawn.test.ts +121 -0
  393. package/src/__tests__/feature-noise.unit.test.ts +38 -0
  394. package/src/__tests__/fixtures/taa-resolve-pinned-baseline.wgsl +301 -0
  395. package/src/__tests__/frame-camera-selection.unit.test.ts +131 -0
  396. package/src/__tests__/frame-observation.contract.test.ts +21 -0
  397. package/src/__tests__/frame-plan-contract.unit.test.ts +24 -0
  398. package/src/__tests__/frame-targets.unit.test.ts +24 -0
  399. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +3 -0
  400. package/src/__tests__/gpu-driven-baseline.characterization.test.ts +79 -0
  401. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +307 -7
  402. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +122 -142
  403. package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +10 -1
  404. package/src/__tests__/gpu-driven-lod-cache.unit.test.ts +261 -0
  405. package/src/__tests__/gpu-driven-mesh-world-identity.unit.test.ts +346 -0
  406. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +1422 -0
  407. package/src/__tests__/gpu-driven-pbr.integration.test.ts +21 -0
  408. package/src/__tests__/gpu-driven-production-fixture.ts +96 -0
  409. package/src/__tests__/gpu-driven-production.integration.test.ts +1076 -106
  410. package/src/__tests__/gpu-driven-scaling.unit.test.ts +1 -3
  411. package/src/__tests__/gpu-driven-shadow-views.browser.test.ts +63 -0
  412. package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +294 -0
  413. package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +97 -0
  414. package/src/__tests__/gpu-driven-shadow-views.unit.test.ts +168 -0
  415. package/src/__tests__/gpu-driven-skin-contract.test-d.ts +11 -0
  416. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +72 -20
  417. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +30 -9
  418. package/src/__tests__/gpu-driven-view.unit.test.ts +160 -52
  419. package/src/__tests__/gpu-pass-timing-browser-runner.ts +15 -0
  420. package/src/__tests__/gpu-pass-timing.browser.test.ts +20 -2
  421. package/src/__tests__/gpu-resource-scope.unit.test.ts +71 -0
  422. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +42 -0
  423. package/src/__tests__/gpu-scene-render-graph-gpu.ts +19 -5
  424. package/src/__tests__/gpu-scene.dawn.test.ts +40 -13
  425. package/src/__tests__/gpu-scene.unit.test.ts +613 -33
  426. package/src/__tests__/instances-culling.integration.test.ts +36 -10
  427. package/src/__tests__/instances-derived-bounds.unit.test.ts +54 -0
  428. package/src/__tests__/instances-store.unit.test.ts +242 -39
  429. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +6 -0
  430. package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +13 -16
  431. package/src/__tests__/lut-lkg-transaction.integration.test.ts +122 -0
  432. package/src/__tests__/material-contract-inventory.unit.test.ts +5 -6
  433. package/src/__tests__/material-dispatch-shader-id.unit.test.ts +51 -0
  434. package/src/__tests__/material-lane-selection.unit.test.ts +60 -0
  435. package/src/__tests__/material-numeric-upload.unit.test.ts +53 -0
  436. package/src/__tests__/material-texture-handles.unit.test.ts +18 -0
  437. package/src/__tests__/material-texture-source.unit.test.ts +87 -0
  438. package/src/__tests__/materials-authoring-validation.unit.test.ts +41 -0
  439. package/src/__tests__/materials-standard-contract.unit.test.ts +57 -3
  440. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +4 -0
  441. package/src/__tests__/mesh-submission-lifetime.unit.test.ts +8 -0
  442. package/src/__tests__/morph-neutral-admission.unit.test.ts +19 -0
  443. package/src/__tests__/normal-fallback.dawn.test.ts +122 -0
  444. package/src/__tests__/particle-material-input-layout.unit.test.ts +104 -0
  445. package/src/__tests__/physical-clearcoat.integration.test.ts +42 -3
  446. package/src/__tests__/pipeline-texture-specialization.unit.test.ts +138 -0
  447. package/src/__tests__/point-shadow-inspection.unit.test.ts +2 -0
  448. package/src/__tests__/post-process-error-policy-owner.unit.test.ts +6 -5
  449. package/src/__tests__/prepared-gpu-driven-pbr-contract.test-d.ts +31 -0
  450. package/src/__tests__/prepared-gpu-driven-pbr-contract.unit.test.ts +39 -0
  451. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +251 -9
  452. package/src/__tests__/prepared-graphics-capability.unit.test.ts +21 -0
  453. package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +6 -2
  454. package/src/__tests__/profiler-phase-catalog.test.ts +5 -0
  455. package/src/__tests__/public-surface.test-d.ts +3 -0
  456. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +30 -12
  457. package/src/__tests__/reflection-fallback-async-publication.unit.test.ts +171 -0
  458. package/src/__tests__/reflection-probe-authoring.unit.test.ts +12 -10
  459. package/src/__tests__/reflection-probe-box.dawn.test.ts +71 -0
  460. package/src/__tests__/reflection-probe-filter.unit.test.ts +9 -0
  461. package/src/__tests__/reflection-probe-orientation.dawn.test.ts +294 -0
  462. package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +5 -14
  463. package/src/__tests__/reflection-probe-updates.unit.test.ts +129 -0
  464. package/src/__tests__/render-error-code-owner.test-d.ts +7 -0
  465. package/src/__tests__/render-error-detail-ssot.test-d.ts +27 -1
  466. package/src/__tests__/render-error-exhaustive.test-d.ts +15 -0
  467. package/src/__tests__/render-extent.unit.test.ts +63 -0
  468. package/src/__tests__/render-feature-gpu-work.integration.test.ts +285 -2
  469. package/src/__tests__/render-feature-plan.unit.test.ts +245 -0
  470. package/src/__tests__/render-feature-shadow-order.unit.test.ts +228 -0
  471. package/src/__tests__/render-feature-zero-work.unit.test.ts +35 -1
  472. package/src/__tests__/render-graph-fallback.integration.test.ts +2 -2
  473. package/src/__tests__/render-owner-cohesion.unit.test.ts +55 -0
  474. package/src/__tests__/render-scene-mixed-updates.integration.test.ts +426 -0
  475. package/src/__tests__/render-scene-projection.unit.test.ts +915 -23
  476. package/src/__tests__/render-scene-resource-updates.integration.test.ts +214 -0
  477. package/src/__tests__/render-scene-skin-lifecycle.integration.test.ts +173 -0
  478. package/src/__tests__/render-scene-temporal-retry.unit.test.ts +133 -0
  479. package/src/__tests__/render-target-material-source.test-d.ts +27 -3
  480. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +233 -9
  481. package/src/__tests__/renderer-frame-transaction.integration.test.ts +923 -5
  482. package/src/__tests__/shader-manifest-fixture.ts +45 -0
  483. package/src/__tests__/skin-motion-regression.unit.test.ts +0 -33
  484. package/src/__tests__/skin-palette-persistent.integration.test.ts +28 -0
  485. package/src/__tests__/skin-palette-persistent.unit.test.ts +247 -0
  486. package/src/__tests__/skinned-shadow-caster.test.ts +125 -14
  487. package/src/__tests__/specular-environment-scale.dawn.test.ts +158 -0
  488. package/src/__tests__/ssao-config.unit.test.ts +7 -0
  489. package/src/__tests__/ssao-surface.dawn.test.ts +252 -0
  490. package/src/__tests__/ssr-admission-matrix.integration.test.ts +7 -1
  491. package/src/__tests__/ssr-confidence-compose.unit.test.ts +84 -0
  492. package/src/__tests__/ssr-coordinate-oracle.unit.test.ts +28 -0
  493. package/src/__tests__/ssr-cube-silhouette.dawn.test.ts +270 -0
  494. package/src/__tests__/ssr-format-probe-gating.integration.test.ts +82 -0
  495. package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +99 -0
  496. package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +116 -0
  497. package/src/__tests__/ssr-gpu-dispatch.ts +951 -0
  498. package/src/__tests__/ssr-graph-topology.unit.test.ts +104 -0
  499. package/src/__tests__/ssr-history-filter.dawn.test.ts +198 -0
  500. package/src/__tests__/ssr-hit-color.dawn.test.ts +273 -0
  501. package/src/__tests__/ssr-hiz-odd-reduction.dawn.test.ts +569 -0
  502. package/src/__tests__/ssr-hiz-rescue.dawn.test.ts +279 -0
  503. package/src/__tests__/ssr-hiz.browser.test.ts +150 -0
  504. package/src/__tests__/ssr-hiz.dawn.test.ts +150 -0
  505. package/src/__tests__/ssr-hiz.unit.test.ts +56 -0
  506. package/src/__tests__/ssr-inspection.unit.test.ts +105 -0
  507. package/src/__tests__/ssr-memory-budget.unit.test.ts +45 -0
  508. package/src/__tests__/ssr-performance-sequence-aggregation.unit.test.ts +15 -0
  509. package/src/__tests__/ssr-public-surface.test-d.ts +37 -0
  510. package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +387 -0
  511. package/src/__tests__/ssr-reflection-mip-reducer.dawn.test.ts +309 -0
  512. package/src/__tests__/ssr-reprojection-probe.ts +90 -0
  513. package/src/__tests__/ssr-roughness-mip.dawn.test.ts +163 -0
  514. package/src/__tests__/ssr-shader-prewarm.unit.test.ts +59 -0
  515. package/src/__tests__/ssr-spatial.integration.test.ts +141 -0
  516. package/src/__tests__/ssr-stable-lattice.dawn.test.ts +475 -0
  517. package/src/__tests__/ssr-temporal-history.unit.test.ts +202 -0
  518. package/src/__tests__/ssr-texel-crossing.dawn.test.ts +448 -0
  519. package/src/__tests__/ssr-zero-work.integration.test.ts +87 -0
  520. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +84 -12
  521. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +29 -0
  522. package/src/__tests__/standard-output-chain-contract.unit.test.ts +99 -0
  523. package/src/__tests__/standard-output-chain.integration.test.ts +73 -0
  524. package/src/__tests__/standard-output-gpu-evidence.ts +205 -0
  525. package/src/__tests__/standard-output.browser.test.ts +15 -0
  526. package/src/__tests__/standard-output.dawn.test.ts +15 -0
  527. package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +275 -0
  528. package/src/__tests__/standard-pipeline.integration.test.ts +320 -3
  529. package/src/__tests__/standard-profile-oracle.unit.test.ts +49 -0
  530. package/src/__tests__/standard-surface-lighting.unit.test.ts +41 -0
  531. package/src/__tests__/standard-texture-specialization.dawn.test.ts +141 -0
  532. package/src/__tests__/surface-adjacent-regressions.integration.test.ts +6 -3
  533. package/src/__tests__/taa-coverage-edge.dawn.test.ts +199 -0
  534. package/src/__tests__/taa-history-clipping.dawn.test.ts +328 -0
  535. package/src/__tests__/taa-neighborhood-equivalence.dawn.test.ts +782 -0
  536. package/src/__tests__/taa-stability-feedback.browser.test.ts +23 -0
  537. package/src/__tests__/taa-stability-feedback.dawn.test.ts +68 -0
  538. package/src/__tests__/taa-stability-feedback.ts +342 -0
  539. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +49 -7
  540. package/src/__tests__/temporal-reset-matrix.unit.test.ts +9 -0
  541. package/src/__tests__/temporal-transaction.integration.test.ts +28 -0
  542. package/src/__tests__/temporal-view.unit.test.ts +17 -0
  543. package/src/__tests__/texture-usage-surface.unit.test.ts +4 -2
  544. package/src/__tests__/transmission-prewarm.unit.test.ts +57 -0
  545. package/src/__tests__/typed-pipeline-topology.unit.test.ts +109 -4
  546. package/src/__tests__/typed-scene-pass-material-cache.integration.test.ts +126 -0
  547. package/src/__tests__/vertex-layouts-ssot.unit.test.ts +47 -0
  548. package/src/__tests__/visibility-extract.perf.test.ts +20 -8
  549. package/src/__tests__/visibility-instances.integration.test.ts +19 -7
  550. package/src/__tests__/visibility-producer-matrix.integration.test.ts +20 -9
  551. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +62 -13
  552. package/src/__tests__/volumetric-fog-topology.unit.test.ts +7 -7
  553. package/src/assembly/atmosphere-shader-prewarm.ts +39 -0
  554. package/src/assembly/device-feature-admission.ts +9 -4
  555. package/src/assembly/dynamic-geometry-host.ts +284 -163
  556. package/src/assembly/dynamic-geometry-runtime.ts +71 -0
  557. package/src/assembly/factory.ts +4 -0
  558. package/src/assembly/gpu-driven-owner.ts +29 -0
  559. package/src/assembly/host-contract.ts +19 -0
  560. package/src/assembly/material/assembly.ts +383 -1
  561. package/src/assembly/material/pipeline-helpers.ts +100 -0
  562. package/src/assembly/material-shader-policy.ts +110 -46
  563. package/src/assembly/recovery/device-loss-fanout.ts +5 -0
  564. package/src/assembly/recovery/failure-location.ts +62 -0
  565. package/src/assembly/recovery/recovery-attempt.ts +2 -29
  566. package/src/assembly/recovery/renderer-recover.ts +16 -17
  567. package/src/assembly/renderer-facade.ts +34 -1
  568. package/src/assembly/renderer-feature-inspection.ts +13 -0
  569. package/src/assembly/renderer-frame-transaction.ts +63 -0
  570. package/src/assembly/renderer-helpers.ts +26 -0
  571. package/src/assembly/renderer-inspection.ts +6 -0
  572. package/src/assembly/shader-prewarm-policy.ts +46 -1
  573. package/src/assembly/skin-palette-owner.ts +21 -0
  574. package/src/assembly/ssr-shader-prewarm.ts +41 -0
  575. package/src/assembly/webgpu-device-loss.ts +75 -0
  576. package/src/assembly/webgpu-pbr-ready.ts +232 -0
  577. package/src/assembly/webgpu-ready-mipmap.ts +26 -0
  578. package/src/assembly/webgpu-ready.ts +161 -131
  579. package/src/assembly/webgpu-renderer-bootstrap.ts +85 -0
  580. package/src/assembly/webgpu-renderer-contract.ts +69 -0
  581. package/src/assembly/webgpu-renderer-guards.ts +32 -0
  582. package/src/assembly/webgpu-renderer-observation.ts +43 -0
  583. package/src/assembly/webgpu-renderer-recovery-failure.ts +62 -0
  584. package/src/assembly/webgpu-renderer.ts +744 -730
  585. package/src/assembly/webgpu-vertex-layouts.ts +233 -87
  586. package/src/capture/scene-projection.ts +37 -0
  587. package/src/components/__tests__/camera-exposure.contract.unit.test.ts +153 -0
  588. package/src/components/__tests__/dynamic-resolution-schema.unit.test.ts +65 -0
  589. package/src/components/__tests__/light-radius.integration.test.ts +59 -0
  590. package/src/components/camera.ts +287 -7
  591. package/src/components/directional-light.ts +3 -3
  592. package/src/components/dynamic-resolution.ts +67 -0
  593. package/src/components/index.ts +2 -0
  594. package/src/components/instances.ts +45 -18
  595. package/src/components/light-helpers.ts +6 -1
  596. package/src/components/reflection-probe.ts +1 -0
  597. package/src/components/scene-instance.ts +2 -1
  598. package/src/components/screen-space-reflection.ts +21 -0
  599. package/src/components/skylight.ts +4 -1
  600. package/src/components/sprite-animation.ts +2 -2
  601. package/src/components/sprite-instances.ts +1 -1
  602. package/src/device/device-scope.ts +13 -7
  603. package/src/device/gpu-residency.ts +45 -42
  604. package/src/dynamic-geometry.ts +13 -8
  605. package/src/environment/background.ts +281 -0
  606. package/src/environment/ibl.ts +211 -0
  607. package/src/environment/storage.ts +63 -0
  608. package/src/errors/gpu-driven.ts +49 -8
  609. package/src/errors/render.ts +91 -3
  610. package/src/extract/camera.ts +37 -1
  611. package/src/extract/contracts.ts +10 -0
  612. package/src/extract/gpu-driven.ts +240 -10
  613. package/src/features/host.ts +237 -19
  614. package/src/features/noise-texture.ts +91 -0
  615. package/src/features/plan.ts +553 -24
  616. package/src/features/prepared-gpu-work.ts +631 -49
  617. package/src/features/prepared-graphics-store.ts +31 -0
  618. package/src/features/prepared-graphics.ts +5 -0
  619. package/src/features/render-graph-compute.ts +41 -8
  620. package/src/features/render-graph-contribution.ts +141 -3
  621. package/src/features/render-graph-raster.ts +143 -30
  622. package/src/features/types.ts +11 -0
  623. package/src/fullscreen-post-process-pass.ts +3 -0
  624. package/src/gpu-driven/batch-topology.ts +452 -108
  625. package/src/gpu-driven/material-artifacts.ts +179 -0
  626. package/src/gpu-driven/material-bindings.ts +41 -0
  627. package/src/gpu-driven/pbr-program.ts +31 -0
  628. package/src/gpu-driven/prepared-draw.ts +42 -6
  629. package/src/gpu-driven/production-raster.ts +2806 -716
  630. package/src/gpu-driven/shadow-views.ts +539 -0
  631. package/src/gpu-driven/view-gpu.ts +188 -41
  632. package/src/gpu-resource.ts +21 -2
  633. package/src/gpu-scene-schema.ts +61 -11
  634. package/src/gpu-scene.ts +197 -99
  635. package/src/gpu-texture-usage.ts +1 -0
  636. package/src/hdrp-buffers.ts +141 -36
  637. package/src/ibl/IblPipelineCache.ts +5 -0
  638. package/src/ibl/frame-resources.ts +38 -0
  639. package/src/ibl/skylight-bind-group.ts +32 -21
  640. package/src/index.ts +194 -75
  641. package/src/inspection-types.ts +207 -1
  642. package/src/instances-derived-bounds.ts +258 -34
  643. package/src/instances.ts +459 -150
  644. package/src/internal.ts +22 -0
  645. package/src/lifecycle.ts +2 -0
  646. package/src/material-row.ts +194 -0
  647. package/src/materials.ts +44 -8
  648. package/src/pbr-pipeline.ts +172 -19
  649. package/src/pipeline/render-extent.ts +111 -0
  650. package/src/pipeline/standard-build-context.ts +7 -0
  651. package/src/pipeline/standard-forward-lane.ts +74 -29
  652. package/src/pipeline/standard-output/__tests__/lut-admission.unit.test.ts +103 -0
  653. package/src/pipeline/standard-output/auto-exposure/__tests__/capability.unit.test.ts +40 -0
  654. package/src/pipeline/standard-output/auto-exposure/__tests__/gpu.contract.unit.test.ts +125 -0
  655. package/src/pipeline/standard-output/auto-exposure/__tests__/graph.contract.unit.test.ts +94 -0
  656. package/src/pipeline/standard-output/auto-exposure/__tests__/oracle.test.ts +108 -0
  657. package/src/pipeline/standard-output/auto-exposure/__tests__/preset.test.ts +26 -0
  658. package/src/pipeline/standard-output/auto-exposure/capability.ts +38 -0
  659. package/src/pipeline/standard-output/auto-exposure/gpu.ts +567 -0
  660. package/src/pipeline/standard-output/auto-exposure/graph.ts +221 -0
  661. package/src/pipeline/standard-output/auto-exposure/inspection.ts +231 -0
  662. package/src/pipeline/standard-output/auto-exposure/oracle.ts +291 -0
  663. package/src/pipeline/standard-output/auto-exposure/preset.ts +28 -0
  664. package/src/pipeline/standard-output/auto-exposure/state.ts +156 -0
  665. package/src/pipeline/standard-output/color-transform.ts +124 -0
  666. package/src/pipeline/standard-output/graph.ts +139 -0
  667. package/src/pipeline/standard-output/lut-admission.ts +121 -0
  668. package/src/pipeline/standard-output/lut-gpu.ts +399 -0
  669. package/src/pipeline/standard-output/lut-state.ts +176 -0
  670. package/src/pipeline/standard-output/resources.ts +121 -0
  671. package/src/pipeline/standard-output/types.ts +58 -0
  672. package/src/pipeline/standard-pipeline.ts +232 -70
  673. package/src/pipeline/standard-post.ts +190 -27
  674. package/src/pipeline/standard-profile.ts +2 -1
  675. package/src/pipeline-builder.ts +28 -9
  676. package/src/pipeline-spec-types.ts +4 -0
  677. package/src/pipeline-spec.ts +37 -29
  678. package/src/plugin.ts +4 -0
  679. package/src/points-lines/standard-owner.ts +6 -14
  680. package/src/post-process-errors.ts +26 -18
  681. package/src/prepare/__tests__/extended-lighting-capability.unit.test.ts +2 -2
  682. package/src/prepare/extended-lighting/resources.ts +3 -3
  683. package/src/prepare/prepared-graphics-resolver.ts +9 -2
  684. package/src/record/__tests__/main-pass-geometry.unit.test.ts +68 -0
  685. package/src/record/__tests__/material-bg-cache.unit.test.ts +45 -0
  686. package/src/record/__tests__/material-slot-plan.unit.test.ts +57 -0
  687. package/src/record/__tests__/mesh-ssbo.unit.test.ts +40 -1
  688. package/src/record/__tests__/recovery-pipeline.unit.test.ts +20 -1
  689. package/src/record/__tests__/sprite-material-abi.unit.test.ts +41 -6
  690. package/src/record/__tests__/temporal-payload.unit.test.ts +2 -0
  691. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +45 -0
  692. package/src/record/__tests__/view-ubo-layout.unit.test.ts +5 -0
  693. package/src/record/dynamic-geometry-consumption.ts +59 -0
  694. package/src/record/frame-lighting.ts +15 -12
  695. package/src/record/frame-snapshot.ts +146 -34
  696. package/src/record/frame-targets.ts +9 -0
  697. package/src/record/frame.ts +838 -170
  698. package/src/record/main-pass-geometry.ts +209 -103
  699. package/src/record/main-pass-material.ts +157 -40
  700. package/src/record/main-pass-sprite-draws.ts +16 -107
  701. package/src/record/main-pass.ts +141 -12
  702. package/src/record/material-uniforms.ts +1 -1
  703. package/src/record/mesh-ssbo.ts +59 -15
  704. package/src/record/prepared-material-bindings.ts +238 -0
  705. package/src/record/recovery-pipeline.ts +69 -90
  706. package/src/record/render-context.ts +123 -24
  707. package/src/record/shadow-pass.ts +1389 -230
  708. package/src/record/skybox-post-pass.ts +14 -3
  709. package/src/record/typed-frame-graph.ts +1064 -47
  710. package/src/record/view-ubo.ts +12 -1
  711. package/src/recovery/render-system-candidate.ts +135 -68
  712. package/src/recovery/render-system-roots.ts +113 -0
  713. package/src/recovery/types.ts +77 -0
  714. package/src/reflection/background.ts +151 -0
  715. package/src/reflection/filter.ts +3 -0
  716. package/src/reflection/projection.ts +16 -6
  717. package/src/reflection/record-owner.ts +308 -140
  718. package/src/render-contract.ts +237 -49
  719. package/src/render-graph-primitives.ts +34 -5
  720. package/src/render-pipeline.ts +90 -2
  721. package/src/render-system-extract-tail.ts +431 -162
  722. package/src/render-system-extract.ts +478 -119
  723. package/src/render-system-projections.ts +241 -0
  724. package/src/render-system.ts +715 -828
  725. package/src/scene/render-scene-types.ts +13 -4
  726. package/src/scene/render-scene.ts +577 -355
  727. package/src/scene/shadow-visibility.ts +21 -0
  728. package/src/ssao-config.ts +25 -8
  729. package/src/ssr/admission.ts +380 -14
  730. package/src/ssr/compose.ts +144 -0
  731. package/src/ssr/errors.ts +48 -0
  732. package/src/ssr/graph.ts +797 -0
  733. package/src/ssr/history.ts +436 -0
  734. package/src/ssr/hiz.ts +124 -0
  735. package/src/ssr/inspection.ts +124 -0
  736. package/src/ssr/resources.ts +202 -0
  737. package/src/ssr/temporal.ts +164 -0
  738. package/src/systems/skin-palette-allocator.ts +495 -148
  739. package/src/systems/skin-palette-types.ts +17 -0
  740. package/src/systems/transparent-dispatch.ts +90 -0
  741. package/src/targets/material-source.ts +34 -0
  742. package/src/temporal/coverage.ts +1 -1
  743. package/src/temporal/frame-coordinator.ts +23 -2
  744. package/src/temporal/gpu.ts +79 -12
  745. package/src/temporal/history.ts +3 -1
  746. package/src/temporal/inspection.ts +2 -1
  747. package/src/temporal/standard-scene-data.ts +10 -2
  748. package/src/temporal/target-coverage-attachment.ts +72 -0
  749. package/src/temporal/temporal-view.ts +11 -2
  750. package/src/temporal/view.ts +12 -2
  751. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +219 -139
  752. package/src/typed-render-graph-primitives.ts +304 -74
  753. package/src/typed-shadow-passes.ts +122 -12
  754. package/src/volume/component.ts +1 -0
  755. package/src/volume/passes.ts +3 -3
  756. package/src/volume/temporal.ts +10 -0
  757. package/dist/chunk-GE3SDD72.mjs.map +0 -1
  758. package/dist/chunk-GF523LHF.mjs.map +0 -1
  759. package/dist/chunk-IQMKJLNU.mjs.map +0 -1
  760. package/dist/chunk-J52NMQKR.mjs.map +0 -1
  761. package/dist/chunk-J6KACNOH.mjs.map +0 -1
  762. package/dist/chunk-JAASCMXA.mjs.map +0 -1
  763. package/dist/chunk-MBU4ZVE7.mjs.map +0 -1
  764. package/dist/chunk-MYJ5RPJO.mjs.map +0 -1
  765. package/dist/chunk-RBDBZ5R7.mjs.map +0 -1
  766. package/dist/chunk-VSL23LZE.mjs.map +0 -1
  767. package/src/__tests__/instances-world-ownership.integration.test.ts +0 -62
  768. package/src/scene/__tests__/changed-block-summary.candidate.test.ts +0 -36
@@ -10,7 +10,9 @@ import {
10
10
  RhiError,
11
11
  type RhiRenderPassEncoder,
12
12
  } from '@forgeax/engine-rhi';
13
+ import { STANDARD_TEXTURE_MASK_OVERRIDE } from '@forgeax/engine-shader';
13
14
  import type { ParamSchemaEntry, PassKind, PrimitiveTopology } from '@forgeax/engine-types';
15
+ import { gpuDrivenDrawKey, gpuDrivenSourceDrawItemIndex } from '../extract/gpu-driven';
14
16
  import { GpuBuffer } from '../gpu-resource';
15
17
  import {
16
18
  GPU_BUFFER_USAGE_COPY_DST,
@@ -19,11 +21,7 @@ import {
19
21
  } from '../gpu-usage';
20
22
  import { createHdrpSkinUnifiedBindGroup, getOrCreateHdrpBuffers } from '../hdrp-buffers';
21
23
  import type { InstanceBufferCacheEntry } from '../instance-buffer-cache';
22
- import {
23
- type InstanceCollectionFailureCode,
24
- recordInstanceFailure,
25
- recordInstanceResidency,
26
- } from '../instances';
24
+ import { type InstanceCollectionFailureCode, instanceUploadRangesForResident } from '../instances';
27
25
  import { SPRITE_PREMULTIPLIED_ALPHA_BLEND } from '../materials';
28
26
  import {
29
27
  createPbrSkinMeshBindGroupEntries,
@@ -75,6 +73,23 @@ import type { _InternalRenderPipelineContext, MaterialShaderPipelineEntry } from
75
73
  import { MATERIAL_PER_ENTITY_STRIDE } from './render-context';
76
74
  import { POINTS_LINES_VIEW_SLOT_STRIDE, writePointsLinesViewUbo } from './view-ubo';
77
75
 
76
+ /** Temporal ignores authored color entry points; opaque duplicates are idempotent. */
77
+ export function sameOpaqueTemporalDraw(a: DispatchEntry, b: DispatchEntry): boolean {
78
+ return (
79
+ (isStandardPbrMaterialShader(a.materialShaderId) ||
80
+ (a.tags.SurfaceKind === 'standard' &&
81
+ b.tags.SurfaceKind === 'standard' &&
82
+ a.tags.SurfaceModule === b.tags.SurfaceModule)) &&
83
+ a.materialShaderId === b.materialShaderId &&
84
+ a.renderState?.blend === undefined &&
85
+ b.renderState?.blend === undefined &&
86
+ a.renderState?.stencil === undefined &&
87
+ b.renderState?.stencil === undefined &&
88
+ a.stencilReference === b.stencilReference &&
89
+ renderStateHash(a.renderState) === renderStateHash(b.renderState)
90
+ );
91
+ }
92
+
78
93
  type GeometryInstanceDraw = {
79
94
  readonly instanceBuffer: Buffer;
80
95
  readonly instanceBindGroup: BindGroup;
@@ -127,6 +142,7 @@ type MaterialPipelineLookup = {
127
142
  readonly sampleCount: number;
128
143
  readonly colorFormatOverride: GPUTextureFormat | undefined;
129
144
  readonly additionalColorFormats: readonly GPUTextureFormat[] | undefined;
145
+ readonly textureMask: number | undefined;
130
146
  readonly handle: MaterialShaderPipelineEntry | null;
131
147
  };
132
148
 
@@ -134,6 +150,86 @@ type GeometryRecordProfileSegment = 'material-bind-groups' | 'pipeline-selection
134
150
 
135
151
  type GeometryRenderState = ReturnType<typeof geometryRenderStateForTopology>;
136
152
 
153
+ /** Coverage is a dedicated temporal material variant, not a color/alpha tap. */
154
+ export function variantSetForCoveragePass(
155
+ variantSet: string | undefined,
156
+ coverageOnly: boolean,
157
+ ): string | undefined {
158
+ if (!coverageOnly) return variantSet;
159
+ if (variantSet?.includes('COVERAGE_ONLY=')) return variantSet;
160
+ return variantSet === undefined || variantSet === ''
161
+ ? 'COVERAGE_ONLY=true'
162
+ : `${variantSet}+COVERAGE_ONLY=true`;
163
+ }
164
+
165
+ export function isHdrGeometryTarget(
166
+ tonemapActive: boolean,
167
+ colorFormatOverride: GPUTextureFormat | undefined,
168
+ ): boolean {
169
+ return colorFormatOverride === undefined ? tonemapActive : colorFormatOverride === 'rgba16float';
170
+ }
171
+
172
+ function gpuDrivenDrawIndicesBySubmesh(
173
+ source: RenderableSnapshot,
174
+ mesh: _InternalRenderPipelineContext['validatedOrdered'][number]['mesh'],
175
+ ): ReadonlyMap<number, number> {
176
+ const draws = source.gpuDrivenDraws;
177
+ if (draws === undefined || draws.length === 0) return new Map();
178
+ const indices = new Map<number, number>();
179
+ let hasStableSourceIdentity = false;
180
+ for (const [compactIndex, draw] of draws.entries()) {
181
+ const drawItemIndex = draw.drawItemIndex;
182
+ if (drawItemIndex === undefined) continue;
183
+ hasStableSourceIdentity = true;
184
+ if (mesh.submeshes[drawItemIndex] !== undefined) indices.set(drawItemIndex, compactIndex);
185
+ }
186
+ if (hasStableSourceIdentity) return indices;
187
+
188
+ // Legacy snapshots predating drawItemIndex are matched by their compact
189
+ // geometry facts. New extracted snapshots never take this path.
190
+ let nonIndexedFirst = 0;
191
+ let drawCursor = 0;
192
+ for (const [submeshIndex, submesh] of mesh.submeshes.entries()) {
193
+ const first = mesh.indexed ? submesh.indexOffset : nonIndexedFirst;
194
+ const count = mesh.indexed ? submesh.indexCount : submesh.vertexCount;
195
+ if (!mesh.indexed) nonIndexedFirst += submesh.vertexCount;
196
+ const draw = draws[drawCursor];
197
+ if (
198
+ draw !== undefined &&
199
+ draw.first === first &&
200
+ draw.count === count &&
201
+ draw.materialSlot === submesh.materialSlot &&
202
+ draw.topology === submesh.topology
203
+ ) {
204
+ indices.set(submeshIndex, drawCursor);
205
+ drawCursor += 1;
206
+ }
207
+ }
208
+ return indices;
209
+ }
210
+
211
+ function isGpuDrivenMainClaimedSubmesh(
212
+ c: _InternalRenderPipelineContext,
213
+ source: RenderableSnapshot,
214
+ submeshIndex: number,
215
+ drawIndices: ReadonlyMap<number, number>,
216
+ ): boolean {
217
+ const drawItemIndex = drawIndices.get(submeshIndex);
218
+ const draw = drawItemIndex === undefined ? undefined : source.gpuDrivenDraws?.[drawItemIndex];
219
+ if (drawItemIndex === undefined || draw === undefined) return false;
220
+ const material = source.materials[draw.materialSlot] ?? source.material;
221
+ const sourceDrawItemIndex = gpuDrivenSourceDrawItemIndex(draw, drawItemIndex);
222
+ return (
223
+ c.gpuDrivenDrawKeys?.has(
224
+ gpuDrivenDrawKey(
225
+ worldEntityKey(source.worldId, source.entityKey),
226
+ material.materialHandle ?? -1,
227
+ sourceDrawItemIndex,
228
+ ),
229
+ ) === true
230
+ );
231
+ }
232
+
137
233
  /**
138
234
  * Select the transmission shader axis from authored material data, not the
139
235
  * canonical boot schema. The latter reserves transmission fields for the
@@ -252,18 +348,19 @@ export function effectiveMaterialLayoutIdentity(
252
348
  /**
253
349
  * Resolve the depth contract for a geometry pass without changing the base
254
350
  * material state. Temporal scene-data shares the main pass depth attachment:
255
- * it is read-only and accepts the equal depth produced by the unjittered
256
- * temporal projection, while still rejecting fragments behind the visible
351
+ * it is read-only and accepts the equal depth produced by the shared raster
352
+ * projection, while motion varyings remain unjittered. It rejects fragments behind the visible
257
353
  * surface.
258
354
  */
259
355
  export function geometryRenderStateForPass(
260
356
  base: GeometryRenderState,
261
357
  passKind: PassKind,
358
+ coverageOnly = false,
262
359
  ): GeometryRenderState {
263
360
  if (passKind !== 'temporal') return base;
264
361
  return {
265
362
  ...base,
266
- depthWriteEnabled: false,
363
+ depthWriteEnabled: coverageOnly,
267
364
  depthCompare: 'less-equal' as const,
268
365
  };
269
366
  }
@@ -373,6 +470,8 @@ export function recordGeometryDraws(
373
470
  ) => BindGroup,
374
471
  passKind: PassKind = 'forward',
375
472
  selectedDispatch?: readonly DispatchEntry[],
473
+ colorFormats: readonly GPUTextureFormat[] = [],
474
+ coverageOnly = false,
376
475
  ): void {
377
476
  const {
378
477
  runtime,
@@ -396,7 +495,11 @@ export function recordGeometryDraws(
396
495
  }
397
496
  const passes = byMaterial.get(dispatch.materialHandle);
398
497
  if (passes === undefined) byMaterial.set(dispatch.materialHandle, [dispatch]);
399
- else passes.push(dispatch);
498
+ else if (
499
+ passKind !== 'temporal' ||
500
+ !passes.some((previous) => sameOpaqueTemporalDraw(previous, dispatch))
501
+ )
502
+ passes.push(dispatch);
400
503
  }
401
504
  const diagnosticsEnabled = materialDiagnosticsEnabled();
402
505
  const colorFormatOverride = c.transparentColorFormat as GPUTextureFormat | undefined;
@@ -409,7 +512,9 @@ export function recordGeometryDraws(
409
512
  // numeric domain rather than the camera's tone-map switch, otherwise the
410
513
  // LDR/OETF fragment entry point is encoded once here and again by the
411
514
  // output transform.
412
- const isHdrTarget = tonemapActive || colorFormatOverride === 'rgba16float';
515
+ const isHdrTarget = isHdrGeometryTarget(tonemapActive, colorFormatOverride);
516
+ const withCoverageVariant = (variantSet: string | undefined): string | undefined =>
517
+ variantSetForCoveragePass(variantSet, coverageOnly);
413
518
  let lastVertexBuffer: GpuBuffer | null = null;
414
519
  let lastIndexBuffer: GpuBuffer | null = null;
415
520
  const bindingState: GeometryBindingState = {
@@ -457,7 +562,9 @@ export function recordGeometryDraws(
457
562
  layoutProjection: import('@forgeax/engine-geometry').VertexLayoutProjection,
458
563
  vertexEntry?: string,
459
564
  fragmentEntry?: string,
565
+ textureMask?: number,
460
566
  ): MaterialShaderPipelineEntry | null => {
567
+ const pipelineVariantSet = withCoverageVariant(variantSet);
461
568
  // The fallback MRT is an extension of the built-in Standard PBR output
462
569
  // contract only. The render pass may carry a second attachment whenever
463
570
  // another renderable needs S_fallback, but shaders such as unlit, sprite,
@@ -469,7 +576,9 @@ export function recordGeometryDraws(
469
576
  const reflectionFallbackFormats =
470
577
  materialShaderId === 'forgeax::default-standard-pbr' &&
471
578
  c.reflectionFallbackColorFormat !== undefined
472
- ? [c.reflectionFallbackColorFormat]
579
+ ? passKind === 'deferred'
580
+ ? colorFormats.slice(1)
581
+ : [c.reflectionFallbackColorFormat]
473
582
  : undefined;
474
583
  const renderStateKey = renderStateHash(renderState);
475
584
  const shaderLookupCache = materialPipelineLookupCache.get(materialShaderId);
@@ -481,9 +590,10 @@ export function recordGeometryDraws(
481
590
  cached.renderStateKey === renderStateKey &&
482
591
  cached.topology === topology &&
483
592
  cached.indexFormat === indexFormat &&
484
- cached.variantSet === variantSet &&
593
+ cached.variantSet === pipelineVariantSet &&
485
594
  cached.vertexEntry === vertexEntry &&
486
595
  cached.fragmentEntry === fragmentEntry &&
596
+ cached.textureMask === textureMask &&
487
597
  cached.passKind === passKind &&
488
598
  cached.layoutProjection.digest === layoutProjection.digest &&
489
599
  cached.sampleCount === sampleCount &&
@@ -497,10 +607,10 @@ export function recordGeometryDraws(
497
607
  const resolvedVariantSetResult =
498
608
  runtime.getMaterialArtifact?.(materialShaderId) !== undefined
499
609
  ? ({ ok: true, value: undefined } as const)
500
- : variantSet === undefined &&
610
+ : pipelineVariantSet === undefined &&
501
611
  (materialShaderId === 'forgeax::sprite' || materialShaderId === 'forgeax::sprite-lit')
502
612
  ? ({ ok: true, value: undefined } as const)
503
- : variantSetFromVertexLayoutProjection(layoutProjection, variantSet);
613
+ : variantSetFromVertexLayoutProjection(layoutProjection, pipelineVariantSet);
504
614
  if (!resolvedVariantSetResult.ok) {
505
615
  runtime.errorRegistry.fire(resolvedVariantSetResult.error);
506
616
  return null;
@@ -530,9 +640,12 @@ export function recordGeometryDraws(
530
640
  layoutProjection,
531
641
  undefined,
532
642
  undefined,
643
+ undefined,
533
644
  reflectionFallbackFormats,
534
645
  vertexEntry,
535
646
  fragmentEntry,
647
+ undefined,
648
+ textureMask === undefined ? undefined : { [STANDARD_TEXTURE_MASK_OVERRIDE]: textureMask },
536
649
  ) ?? null;
537
650
  const handle =
538
651
  profilePhase === undefined
@@ -552,7 +665,7 @@ export function recordGeometryDraws(
552
665
  renderStateKey,
553
666
  topology,
554
667
  indexFormat,
555
- variantSet,
668
+ variantSet: pipelineVariantSet,
556
669
  vertexEntry,
557
670
  fragmentEntry,
558
671
  passKind,
@@ -560,6 +673,7 @@ export function recordGeometryDraws(
560
673
  sampleCount,
561
674
  colorFormatOverride: colorFormat,
562
675
  additionalColorFormats: reflectionFallbackFormats,
676
+ textureMask,
563
677
  handle,
564
678
  };
565
679
  if (shaderLookupCache === undefined) {
@@ -579,7 +693,6 @@ export function recordGeometryDraws(
579
693
  for (let i = 0; i < validatedOrdered.length; i++) {
580
694
  const entry = validatedOrdered[i];
581
695
  if (entry === undefined) continue;
582
-
583
696
  // Points/Lines share the Standard geometry pass. Their retained source
584
697
  // is prepared once by the renderer owner, while this loop remains the
585
698
  // sole pass/draw submission owner and preserves the authored topology.
@@ -587,18 +700,6 @@ export function recordGeometryDraws(
587
700
  if (entry.source.pointsLines !== undefined && pointsLinesSubmission?.plan.drawCount !== 1)
588
701
  continue;
589
702
 
590
- if (
591
- passKind === 'forward' &&
592
- c.gpuDrivenEntityKeys.has(
593
- worldEntityKey(
594
- c.gpuDrivenWorldKeys?.[entry.source.worldId] ?? entry.source.worldId,
595
- entry.source.entityKey,
596
- ),
597
- )
598
- ) {
599
- continue;
600
- }
601
-
602
703
  // feat-20260609 M2: skip entities that don't match the pass selector.
603
704
  if (matchedMaterials !== null && !matchedMaterials.has(entry.renderableIndex)) continue;
604
705
 
@@ -822,7 +923,9 @@ export function recordGeometryDraws(
822
923
  ),
823
924
  );
824
925
  if (!skinVariantSetResult.ok) runtime.errorRegistry.fire(skinVariantSetResult.error);
825
- const skinVariantSet = skinVariantSetResult.ok ? skinVariantSetResult.value : undefined;
926
+ const skinVariantSet = skinVariantSetResult.ok
927
+ ? withCoverageVariant(skinVariantSetResult.value)
928
+ : undefined;
826
929
  const skinPsoProbe =
827
930
  skinResources !== null && skinVariantSetResult.ok
828
931
  ? (runtime.getMaterialShaderPipeline?.(
@@ -987,6 +1090,7 @@ export function recordGeometryDraws(
987
1090
  // — the same placeholders the unlit path already used. The generic
988
1091
  // branch below builds the per-submesh BG.
989
1092
  let perSubmeshBg: BindGroup | null = null;
1093
+ const gpuDrivenDrawIndices = gpuDrivenDrawIndicesBySubmesh(entry.source, entry.mesh);
990
1094
  // feat-20260608 M4 / w16: per-submesh pipeline selection + draw loop.
991
1095
  // Each submesh carries its own topology, so pipeline selection is per-submesh.
992
1096
  // Vertex/index buffers and bind groups are set once (shared across all submeshes).
@@ -1004,6 +1108,12 @@ export function recordGeometryDraws(
1004
1108
  const materialHandle = submeshMaterial.materialHandle ?? 0;
1005
1109
  if (materialHandles === undefined || !materialHandles.has(materialHandle)) continue;
1006
1110
  }
1111
+ if (
1112
+ passKind === 'forward' &&
1113
+ isGpuDrivenMainClaimedSubmesh(c, entry.source, smIdx, gpuDrivenDrawIndices)
1114
+ ) {
1115
+ continue;
1116
+ }
1007
1117
  const draws: readonly (DispatchEntry | undefined)[] =
1008
1118
  selectedDispatch === undefined
1009
1119
  ? [undefined]
@@ -1133,7 +1243,11 @@ export function recordGeometryDraws(
1133
1243
  blend: selectedRenderState?.blend ?? SPRITE_PREMULTIPLIED_ALPHA_BLEND,
1134
1244
  }
1135
1245
  : geometryRenderStateForTopology(smTopology, selectedRenderState);
1136
- const pipelineRenderState = geometryRenderStateForPass(basePipelineRenderState, passKind);
1246
+ const pipelineRenderState = geometryRenderStateForPass(
1247
+ basePipelineRenderState,
1248
+ passKind,
1249
+ coverageOnly,
1250
+ );
1137
1251
  let smPipelineHandle: typeof pipelineState.unlitPipeline;
1138
1252
  let materialGroup2Contract: 'mesh' | 'skin' | 'cluster' | 'skin-cluster' | undefined;
1139
1253
  let materialPipelineEntry: MaterialShaderPipelineEntry | null = null;
@@ -1163,6 +1277,7 @@ export function recordGeometryDraws(
1163
1277
  entry.mesh.layoutProjection,
1164
1278
  vertexEntry,
1165
1279
  fragmentEntry,
1280
+ submeshMaterial.standardTextureMask,
1166
1281
  );
1167
1282
  materialPipelineEntry = unlitRsp;
1168
1283
  smPipelineHandle =
@@ -1202,7 +1317,7 @@ export function recordGeometryDraws(
1202
1317
  const transmissionAvailable = requestsStandardTransmissionVariant(submeshMaterial);
1203
1318
  const materialCapabilityVariantSet =
1204
1319
  transmissionAvailable && !capabilityVariantSet.includes('TRANSMISSION_AVAILABLE=')
1205
- ? `${capabilityVariantSet === '' ? '' : `${capabilityVariantSet}+`}TRANSMISSION_AVAILABLE=true`
1320
+ ? `${capabilityVariantSet}+TRANSMISSION_AVAILABLE=true`
1206
1321
  : capabilityVariantSet;
1207
1322
  // Sprite's base request must retain the boot-selected artifact. Only
1208
1323
  // SpriteInstances uses the explicit empty key for the
@@ -1215,9 +1330,7 @@ export function recordGeometryDraws(
1215
1330
  : undefined
1216
1331
  : entry.variantSet === undefined
1217
1332
  ? materialCapabilityVariantSet
1218
- : capabilityVariantSet === ''
1219
- ? entry.variantSet
1220
- : `${capabilityVariantSet}+${entry.variantSet}`;
1333
+ : `${materialCapabilityVariantSet}+${entry.variantSet}`;
1221
1334
  const cachedPipeline = resolveMaterialPipeline(
1222
1335
  smMaterialShaderId,
1223
1336
  pipelineRenderState,
@@ -1228,6 +1341,7 @@ export function recordGeometryDraws(
1228
1341
  entry.mesh.layoutProjection,
1229
1342
  vertexEntry,
1230
1343
  fragmentEntry,
1344
+ submeshMaterial.standardTextureMask,
1231
1345
  );
1232
1346
  // feat-20260615-pipeline-spec-ssot M6-T1: cache miss resolves to
1233
1347
  // null uniformly across URP / HDRP / skin shaders. Charter P3
@@ -1361,10 +1475,7 @@ export function recordGeometryDraws(
1361
1475
  * @internal
1362
1476
  */
1363
1477
  function uploadInstanceRanges(
1364
- c: Pick<
1365
- _InternalRenderPipelineContext,
1366
- 'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
1367
- >,
1478
+ c: _InternalRenderPipelineContext,
1368
1479
  inst: NonNullable<RenderableSnapshot['instances']>,
1369
1480
  buffer: Buffer,
1370
1481
  ranges: readonly { readonly start: number; readonly end: number }[],
@@ -1396,10 +1507,7 @@ function uploadInstanceRanges(
1396
1507
  }
1397
1508
 
1398
1509
  export function reportInstanceResidency(
1399
- c: Pick<
1400
- _InternalRenderPipelineContext,
1401
- 'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
1402
- >,
1510
+ c: _InternalRenderPipelineContext,
1403
1511
  inst: NonNullable<RenderableSnapshot['instances']>,
1404
1512
  input: {
1405
1513
  readonly lane: 'direct-storage' | 'chunked-storage' | 'direct-uniform' | 'chunked-uniform';
@@ -1409,8 +1517,8 @@ export function reportInstanceResidency(
1409
1517
  readonly uploadedBytes: number;
1410
1518
  },
1411
1519
  ): void {
1412
- if (inst.collectionId === undefined || c.frameState.instanceResidency === undefined) return;
1413
- recordInstanceResidency(c.frameState.instanceResidency, {
1520
+ if (inst.collectionId === undefined) return;
1521
+ c.frameState.instanceCollections?._reportResidency({
1414
1522
  collectionId: inst.collectionId,
1415
1523
  frameNumber: c.frameState.frameNumber,
1416
1524
  residentGeneration: c.runtime.deviceScope.generation,
@@ -1424,10 +1532,7 @@ export function reportInstanceResidency(
1424
1532
  }
1425
1533
 
1426
1534
  function reportInstanceFailure(
1427
- c: Pick<
1428
- _InternalRenderPipelineContext,
1429
- 'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
1430
- >,
1535
+ c: _InternalRenderPipelineContext,
1431
1536
  inst: NonNullable<RenderableSnapshot['instances']>,
1432
1537
  error: {
1433
1538
  readonly code: InstanceCollectionFailureCode;
@@ -1437,8 +1542,8 @@ function reportInstanceFailure(
1437
1542
  requestedBytes: number,
1438
1543
  supportedBytes: number | undefined,
1439
1544
  ): void {
1440
- if (inst.collectionId === undefined || c.frameState.instanceResidency === undefined) return;
1441
- recordInstanceFailure(c.frameState.instanceResidency, {
1545
+ if (inst.collectionId === undefined) return;
1546
+ c.frameState.instanceCollections?._reportFailure({
1442
1547
  collectionId: inst.collectionId,
1443
1548
  code: error.code,
1444
1549
  expected: error.expected,
@@ -1454,13 +1559,7 @@ function reportInstanceFailure(
1454
1559
  });
1455
1560
  }
1456
1561
 
1457
- function clearInstanceChunksForOwner(
1458
- c: Pick<
1459
- _InternalRenderPipelineContext,
1460
- 'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
1461
- >,
1462
- ownerKey: number,
1463
- ): void {
1562
+ function clearInstanceChunksForOwner(c: _InternalRenderPipelineContext, ownerKey: number): void {
1464
1563
  const chunks = c.frameState.instanceBufferChunks;
1465
1564
  if (chunks === undefined) return;
1466
1565
  const prefix = `${ownerKey}:`;
@@ -1475,10 +1574,7 @@ function clearInstanceChunksForOwner(
1475
1574
  }
1476
1575
 
1477
1576
  export function resolveStorageInstanceChunks(
1478
- c: Pick<
1479
- _InternalRenderPipelineContext,
1480
- 'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
1481
- >,
1577
+ c: _InternalRenderPipelineContext,
1482
1578
  entry: _InternalRenderPipelineContext['validatedOrdered'][number],
1483
1579
  inst: NonNullable<RenderableSnapshot['instances']>,
1484
1580
  cap: number,
@@ -1516,6 +1612,7 @@ export function resolveStorageInstanceChunks(
1516
1612
  const draws: GeometryInstanceDraw[] = [];
1517
1613
  const uploadedRanges: { start: number; end: number }[] = [];
1518
1614
  let uploadedBytes = 0;
1615
+ const dirtyRanges = inst.dirtyRanges ?? [{ start: 0, end: inst.instanceCount } as const];
1519
1616
  for (let start = 0; start < inst.instanceCount; start += chunkCapacity) {
1520
1617
  const end = Math.min(inst.instanceCount, start + chunkCapacity);
1521
1618
  const count = end - start;
@@ -1557,14 +1654,17 @@ export function resolveStorageInstanceChunks(
1557
1654
  if (chunks === undefined) frameState.transientInstanceBuffers.push(active);
1558
1655
  }
1559
1656
  if (active === undefined) return null;
1560
- const needsUpload =
1561
- activeIsNew || active.uploadedRevision !== (inst.revision ?? inst.archVersion);
1562
- const rangesToUpload = [
1563
- {
1564
- start: 0,
1565
- end: count,
1566
- },
1567
- ];
1657
+ const localRanges = dirtyRanges
1658
+ .map((range) => ({
1659
+ start: Math.max(start, range.start) - start,
1660
+ end: Math.min(end, range.end) - start,
1661
+ }))
1662
+ .filter((range) => range.end > range.start);
1663
+ const needsUpload = activeIsNew || active.uploadedRevision !== inst.revision;
1664
+ const rangesToUpload = instanceUploadRangesForResident(activeIsNew, localRanges, {
1665
+ start: 0,
1666
+ end: count,
1667
+ });
1568
1668
  if (needsUpload && rangesToUpload.length > 0) {
1569
1669
  const upload = uploadInstanceRanges(
1570
1670
  c,
@@ -1584,8 +1684,7 @@ export function resolveStorageInstanceChunks(
1584
1684
  inst,
1585
1685
  {
1586
1686
  code: 'queue-write-buffer-failed',
1587
- expected:
1588
- 'the renderer-owned instance storage buffer accepts the complete instance payload',
1687
+ expected: 'the renderer-owned instance storage buffer accepts the dirty range',
1589
1688
  hint: 'retry after the active device is healthy or recover the renderer',
1590
1689
  },
1591
1690
  inst.instanceCount * strideBytes,
@@ -1595,8 +1694,8 @@ export function resolveStorageInstanceChunks(
1595
1694
  }
1596
1695
  }
1597
1696
  if (needsUpload) {
1598
- {
1599
- const published = { ...active, uploadedRevision: inst.revision ?? inst.archVersion };
1697
+ if (inst.revision !== undefined) {
1698
+ const published = { ...active, uploadedRevision: inst.revision };
1600
1699
  active = published;
1601
1700
  chunks?.set(chunkKey, published);
1602
1701
  }
@@ -1634,11 +1733,8 @@ export function resolveStorageInstanceChunks(
1634
1733
  return draws;
1635
1734
  }
1636
1735
 
1637
- export function resolveGeometryInstanceBuffer(
1638
- c: Pick<
1639
- _InternalRenderPipelineContext,
1640
- 'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
1641
- >,
1736
+ function resolveGeometryInstanceBuffer(
1737
+ c: _InternalRenderPipelineContext,
1642
1738
  entry: _InternalRenderPipelineContext['validatedOrdered'][number],
1643
1739
  identityInstanceDraws: readonly GeometryInstanceDraw[],
1644
1740
  useProbeBlend: boolean,
@@ -1674,9 +1770,12 @@ export function resolveGeometryInstanceBuffer(
1674
1770
  // the shared identity buffer, which would silently render one instance.
1675
1771
  if (inst.instanceCount === 0) return [];
1676
1772
  const entityCacheKey = instanceCollectionCacheKey(entry.source.worldId, inst);
1677
- const revision = inst.revision ?? inst.archVersion;
1773
+ const revision = inst.revision;
1774
+ const dirtyRanges = inst.dirtyRanges;
1678
1775
  const sameRevision = (cached: InstanceBufferCacheEntry): boolean =>
1679
- cached.uploadedRevision === revision;
1776
+ revision === undefined
1777
+ ? cached.uploadedRevision === undefined
1778
+ : cached.uploadedRevision === revision;
1680
1779
  const fullRange = [{ start: 0, end: inst.instanceCount }] as const;
1681
1780
  let instanceBuffer: Buffer = pipelineState.identityInstanceBuffer;
1682
1781
  let instanceCount = 1;
@@ -1694,6 +1793,7 @@ export function resolveGeometryInstanceBuffer(
1694
1793
  const activeKeys = new Set<string>();
1695
1794
  const draws: GeometryInstanceDraw[] = [];
1696
1795
  const uniformStrideBytes = 16 * Float32Array.BYTES_PER_ELEMENT;
1796
+ const dirty = inst.dirtyRanges ?? fullRange;
1697
1797
  const uploadedRanges: { start: number; end: number }[] = [];
1698
1798
  let uploadedBytes = 0;
1699
1799
  for (let start = 0; start < inst.instanceCount; start += MAX_UNIFORM_INSTANCES) {
@@ -1739,13 +1839,17 @@ export function resolveGeometryInstanceBuffer(
1739
1839
  chunks?.set(chunkKey, active);
1740
1840
  if (chunks === undefined) frameState.transientInstanceBuffers.push(active);
1741
1841
  }
1842
+ const localRanges = dirty
1843
+ .map((range) => ({
1844
+ start: Math.max(start, range.start) - start,
1845
+ end: Math.min(start + count, range.end) - start,
1846
+ }))
1847
+ .filter((range) => range.end > range.start);
1742
1848
  const needsUpload = activeIsNew || !sameRevision(active);
1743
- const rangesToUpload = [
1744
- {
1745
- start: 0,
1746
- end: count,
1747
- },
1748
- ];
1849
+ const rangesToUpload = instanceUploadRangesForResident(activeIsNew, localRanges, {
1850
+ start: 0,
1851
+ end: count,
1852
+ });
1749
1853
  if (needsUpload && rangesToUpload.length > 0) {
1750
1854
  const upload = uploadInstanceRanges(
1751
1855
  c,
@@ -1765,8 +1869,7 @@ export function resolveGeometryInstanceBuffer(
1765
1869
  inst,
1766
1870
  {
1767
1871
  code: 'queue-write-buffer-failed',
1768
- expected:
1769
- 'the renderer-owned instance uniform buffer accepts the complete instance payload',
1872
+ expected: 'the renderer-owned instance uniform buffer accepts the dirty range',
1770
1873
  hint: 'retry after the active device is healthy or recover the renderer',
1771
1874
  },
1772
1875
  inst.instanceCount * uniformStrideBytes,
@@ -1776,7 +1879,8 @@ export function resolveGeometryInstanceBuffer(
1776
1879
  }
1777
1880
  }
1778
1881
  if (needsUpload) {
1779
- const published = { ...active, uploadedRevision: revision };
1882
+ const published =
1883
+ revision === undefined ? active : { ...active, uploadedRevision: revision };
1780
1884
  active = published;
1781
1885
  chunks?.set(chunkKey, published);
1782
1886
  }
@@ -1857,7 +1961,6 @@ export function resolveGeometryInstanceBuffer(
1857
1961
  if (!bufRes.ok) {
1858
1962
  runtime.errorRegistry.fire(bufRes.error);
1859
1963
  reportInstanceFailure(c, inst, bufRes.error, requestedBytes, cap);
1860
- return null;
1861
1964
  } else {
1862
1965
  // feat-20260619 M4 / F12: destroy the old cached buffer
1863
1966
  // before replacing it with the new one (D-6).
@@ -1880,7 +1983,11 @@ export function resolveGeometryInstanceBuffer(
1880
1983
  }
1881
1984
  if (active !== null) {
1882
1985
  const needsUpload = activeIsNew || !sameRevision(active);
1883
- const ranges = [fullRange[0]];
1986
+ const ranges = instanceUploadRangesForResident(
1987
+ activeIsNew,
1988
+ dirtyRanges ?? fullRange,
1989
+ fullRange[0],
1990
+ );
1884
1991
  let uploadRanges: readonly { readonly start: number; readonly end: number }[] = [];
1885
1992
  let uploadedBytes = 0;
1886
1993
  if (needsUpload && ranges.length > 0) {
@@ -1899,8 +2006,7 @@ export function resolveGeometryInstanceBuffer(
1899
2006
  inst,
1900
2007
  {
1901
2008
  code: 'queue-write-buffer-failed',
1902
- expected:
1903
- 'the renderer-owned instance buffer accepts the complete instance payloads',
2009
+ expected: 'the renderer-owned instance buffer accepts the dirty ranges',
1904
2010
  hint: 'retry after the active device is healthy or recover the renderer',
1905
2011
  },
1906
2012
  requestedBytes,
@@ -1914,7 +2020,8 @@ export function resolveGeometryInstanceBuffer(
1914
2020
  }
1915
2021
  }
1916
2022
  if (needsUpload) {
1917
- const published = { ...active, uploadedRevision: revision };
2023
+ const published =
2024
+ revision === undefined ? active : { ...active, uploadedRevision: revision };
1918
2025
  frameState.instanceBuffers.set(entityCacheKey, published);
1919
2026
  active = published;
1920
2027
  }
@@ -1949,10 +2056,7 @@ export function resolveGeometryInstanceBuffer(
1949
2056
  }
1950
2057
 
1951
2058
  export function resolveProbeBlendBuffer(
1952
- c: Pick<
1953
- _InternalRenderPipelineContext,
1954
- 'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
1955
- >,
2059
+ c: _InternalRenderPipelineContext,
1956
2060
  record: import('../scene/probe-blend-record').ProbeBlendRecord | undefined,
1957
2061
  entityKey?: number,
1958
2062
  ): { readonly buffer: Buffer; readonly offset: number } {
@@ -2000,10 +2104,7 @@ export function resolveProbeBlendBuffer(
2000
2104
  }
2001
2105
 
2002
2106
  export function resolveGeometryInstancesBindGroup(
2003
- c: Pick<
2004
- _InternalRenderPipelineContext,
2005
- 'runtime' | 'pipelineState' | 'frameState' | 'bindGroupCounts'
2006
- >,
2107
+ c: _InternalRenderPipelineContext,
2007
2108
  instanceBuffer: Buffer,
2008
2109
  probeBuffer?: Buffer,
2009
2110
  ): BindGroup {
@@ -2013,8 +2114,13 @@ export function resolveGeometryInstancesBindGroup(
2013
2114
  ? pipelineState.instancesBindGroupLayout
2014
2115
  : pipelineState.probeInstancesBindGroupLayout;
2015
2116
  if (layout === undefined) throw new Error('probe instances bind-group layout is unavailable');
2117
+ // A few record-only fixtures construct a minimal frame state and omit the
2118
+ // shared bind-group cache. Production frames always provide it, but keeping
2119
+ // this resolver total lets those fixtures exercise the same binding path
2120
+ // without weakening the production cache contract.
2121
+ const instancesBgShared = frameState.instancesBgShared ?? new WeakMap<object, unknown>();
2016
2122
  return getOrCreateFromChain(
2017
- frameState.instancesBgShared,
2123
+ instancesBgShared,
2018
2124
  probeBuffer === undefined ? [layout, instanceBuffer] : [layout, instanceBuffer, probeBuffer],
2019
2125
  probeBuffer === undefined ? 'instances-no-probe' : 'instances-probe',
2020
2126
  () => {