@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
@@ -1,4 +1,8 @@
1
- import type { CompiledRenderGraphInfo, GraphTextureDescriptor } from '@forgeax/engine-render-graph';
1
+ import type {
2
+ CompiledRenderGraphInfo,
3
+ GraphTextureDescriptor,
4
+ GraphTextureView,
5
+ } from '@forgeax/engine-render-graph';
2
6
  import { RenderGraphError } from '@forgeax/engine-render-graph';
3
7
  import { err, ok, type Result } from '@forgeax/engine-types';
4
8
  import { addTypedDebugOverlayPass } from '../debug-draw-glue';
@@ -25,6 +29,12 @@ import {
25
29
  TYPED_BLOOM_PASS_NAMES,
26
30
  type TypedTemporalResolveTargets,
27
31
  } from '../typed-render-graph-primitives';
32
+ import {
33
+ addAutoExposureExposurePass,
34
+ addAutoExposureGraphPasses,
35
+ } from './standard-output/auto-exposure/gpu';
36
+ import { createStandardOutputPlan } from './standard-output/graph';
37
+ import { addStandardColorLutPass } from './standard-output/lut-gpu';
28
38
 
29
39
  interface StandardPostSurface {
30
40
  readonly display?: RenderPipelineTarget;
@@ -159,20 +169,33 @@ export function addStandardPost(
159
169
  depth: RenderPipelineTarget,
160
170
  surface: StandardPostSurface,
161
171
  sceneTemporal?: RenderPipelineTarget,
172
+ secondaryReactivity?: GraphTextureView,
173
+ coverage?: RenderPipelineTarget,
174
+ coverageDepth?: RenderPipelineTarget,
162
175
  ): Result<void, RenderPipelineBuildError> {
163
176
  const clearOnly = topology.clearOnly === true;
177
+ const outputPlan = createStandardOutputPlan({
178
+ lane: topology.standardProfile?.renderPath === 'deferred' ? 'clustered' : 'direct',
179
+ temporal: !clearOnly && topology.camera.antialias === 'taa',
180
+ meter: topology.output?.autoExposure === true,
181
+ bloom: !clearOnly && topology.camera.bloom === 'on' && topology.camera.tonemap !== 'none',
182
+ exposure: topology.output?.autoExposure === true,
183
+ whiteBalance: topology.output?.whiteBalance === true,
184
+ lut: topology.output?.colorLut === true,
185
+ fxaa: !clearOnly && topology.camera.antialias === 'fxaa',
186
+ outputEncoding: 'explicit-oetf',
187
+ });
164
188
  const hdr =
165
189
  !clearOnly && (topology.camera.tonemap !== 'none' || topology.camera.antialias === 'taa');
166
190
  // Bloom is an HDR-domain effect and its recorders intentionally no-op when
167
191
  // tone mapping is disabled. Keep the graph in the same no-op state for the
168
192
  // TAA + tonemap:none combination; otherwise the declared Bloom composite is
169
193
  // left clear and the following Output Transform presents a black frame.
170
- const bloomActive = hdr && topology.camera.bloom === 'on' && topology.camera.tonemap !== 'none';
171
- const fxaa = !clearOnly && topology.camera.antialias === 'fxaa';
172
- // All non-clear Standard frames use the graph-owned float scene target and
173
- // the shared Output Transform, even when AA is disabled or the backend has
174
- // no storage buffers. This keeps the final dither at one owner-level
175
- // surface boundary instead of making no-AA/WebGL2 a silent bypass.
194
+ const bloomActive = hdr && outputPlan.features.bloom;
195
+ const fxaa = outputPlan.features.fxaa;
196
+ // Keep the graph-owned output transform on every non-HDR frame, including
197
+ // structural lanes without storage buffers; the final writer remains the
198
+ // single display-encoding owner.
176
199
  const linearLdr = !clearOnly && !hdr;
177
200
  const rawOnly = !clearOnly && topology.surface.profile?.kind === 'raw-only';
178
201
  const outputDither = resolveOutputDither(topology.config);
@@ -194,7 +217,19 @@ export function addStandardPost(
194
217
  // single Output Transform performs the first 8-bit quantization.
195
218
  const finalPresent = surface.storage;
196
219
  let postInput = scene;
220
+ let postTemporal = sceneTemporal;
197
221
 
222
+ const autoExposure = context.standardOutput?.autoExposure;
223
+ if (outputPlan.features.exposure && autoExposure === undefined) {
224
+ return err(
225
+ new RenderGraphError({
226
+ code: 'resource-resolution-failed',
227
+ expected: 'a prepared same-frame auto-exposure producer projection',
228
+ hint: 'prepare device-scoped auto-exposure resources before compiling Standard output',
229
+ detail: { resourceLabel: 'standard-auto-exposure' },
230
+ }),
231
+ );
232
+ }
198
233
  if (topology.camera.antialias === 'taa') {
199
234
  if (sceneTemporal === undefined) {
200
235
  return err(missingTemporalContributor(topology, 'forgeax::standard::scene-data'));
@@ -207,14 +242,22 @@ export function addStandardPost(
207
242
  scene,
208
243
  depth,
209
244
  currentTemporal: sceneTemporal,
245
+ ...(coverage === undefined ? {} : { coverage }),
246
+ ...(coverageDepth === undefined ? {} : { coverageDepth }),
247
+ ...(secondaryReactivity === undefined ? {} : { secondaryReactivity }),
210
248
  historyColor: history.previousColor,
211
249
  historyTemporal: history.previousTemporal,
250
+ historyStability: history.previousStability,
212
251
  writeColor: history.currentColor,
213
252
  writeTemporal: history.currentTemporal,
253
+ writeStability: history.currentStability,
214
254
  };
215
255
  const resolve = addTypedTemporalResolvePass(context.graph, resolveTargets);
216
256
  if (!resolve.ok) return resolve;
217
257
  postInput = history.currentColor;
258
+ // TAA resolves both outputs to the unjittered lattice. Later effects must
259
+ // consume its matching temporal attachment, not raw jittered coverage.
260
+ postTemporal = history.currentTemporal;
218
261
  }
219
262
 
220
263
  // Feature projection and the built-in fallback share one target contract.
@@ -238,7 +281,7 @@ export function addStandardPost(
238
281
  },
239
282
  ];
240
283
  if (motionBlur) {
241
- if (sceneTemporal === undefined) {
284
+ if (postTemporal === undefined) {
242
285
  return err(
243
286
  new Error('Motion Blur requires the Standard scene-data producer') as RenderGraphError,
244
287
  );
@@ -249,7 +292,7 @@ export function addStandardPost(
249
292
  domain: hdr ? 'linear-hdr' : 'linear-ldr',
250
293
  });
251
294
  if (!blurred.ok) return blurred;
252
- const features = context.contributeFeatures(featureTargets, [sceneTemporal], {
295
+ const features = context.contributeFeatures(featureTargets, [postTemporal], {
253
296
  'motion-input': postInput,
254
297
  'motion-output': blurred.value,
255
298
  });
@@ -257,7 +300,7 @@ export function addStandardPost(
257
300
  if (context.hasFeature?.('forgeax.motion-blur') === true) {
258
301
  postInput = blurred.value;
259
302
  } else {
260
- const fallback = addMotionBlurPass(context.graph, postInput, sceneTemporal, blurred.value);
303
+ const fallback = addMotionBlurPass(context.graph, postInput, postTemporal, blurred.value);
261
304
  if (!fallback.ok) return fallback;
262
305
  postInput = blurred.value;
263
306
  }
@@ -270,6 +313,18 @@ export function addStandardPost(
270
313
  }
271
314
  }
272
315
 
316
+ // Meter the temporally resolved color before Bloom. This preserves the
317
+ // Standard order: temporal -> meter -> bloom -> exposure/WB -> tone -> LUT.
318
+ if (outputPlan.features.exposure && autoExposure !== undefined) {
319
+ const added = addAutoExposureGraphPasses(context, {
320
+ source: postInput,
321
+ resources: autoExposure,
322
+ width: topology.surface.width,
323
+ height: topology.surface.height,
324
+ });
325
+ if (!added.ok) return added;
326
+ }
327
+
273
328
  if (bloomActive) {
274
329
  const composited = target(
275
330
  context,
@@ -306,6 +361,86 @@ export function addStandardPost(
306
361
  postInput = composited.value;
307
362
  }
308
363
 
364
+ if (outputPlan.features.exposure || outputPlan.features.whiteBalance) {
365
+ const exposureOutput = target(context, 'standard-exposure-white-balance', {
366
+ format: 'rgba16float',
367
+ size: 'surface',
368
+ domain: 'linear-hdr',
369
+ });
370
+ if (!exposureOutput.ok) return exposureOutput;
371
+ const exposurePass = addAutoExposureExposurePass(
372
+ context,
373
+ postInput,
374
+ exposureOutput.value,
375
+ outputPlan.features.exposure ? autoExposure : undefined,
376
+ {
377
+ temperature: topology.output?.temperature ?? 6504,
378
+ tint: topology.output?.tint ?? 0,
379
+ },
380
+ );
381
+ if (!exposurePass.ok) return exposurePass;
382
+ postInput = exposureOutput.value;
383
+ }
384
+
385
+ // Auto exposure changes the HDR source before tone mapping, so it needs the
386
+ // same explicit linear-LDR boundary as the LUT route even when no LUT is
387
+ // bound. Keep the manual/LUT0 route combined so disabling auto exposure
388
+ // remains exact-zero.
389
+ const splitOutput =
390
+ outputPlan.features.lut ||
391
+ outputPlan.features.exposure ||
392
+ outputPlan.features.whiteBalance ||
393
+ // A receipt-bound observation request is an explicit producer demand, not
394
+ // a new authored color feature. When a caller asks for the linear-LDR
395
+ // domain on the ordinary ACES path, retain the same tone/output boundary
396
+ // that the LUT and auto-exposure routes already use so the graph can
397
+ // capture it without changing unobserved frames.
398
+ context.observationCaptureDomains?.includes('linear-ldr') === true;
399
+
400
+ // Tone mapping and output encoding are separate entry points when a LUT is
401
+ // enabled or auto exposure is active: the LUT must sample linear LDR, and
402
+ // the single OETF writer runs only after LUT and optional FXAA.
403
+ const toneOutput = splitOutput
404
+ ? target(context, 'standard-tone-output', {
405
+ format: 'rgba16float',
406
+ size: 'surface',
407
+ domain: 'linear-ldr',
408
+ })
409
+ : undefined;
410
+ if (toneOutput !== undefined) {
411
+ if (!toneOutput.ok) return toneOutput;
412
+ const transformed = addTypedOutputTransformPass(context.graph, postInput, toneOutput.value, {
413
+ dither: false,
414
+ name: 'standard-tone',
415
+ fragmentEntryPoint: 'fs_tone_only',
416
+ });
417
+ if (!transformed.ok) return transformed;
418
+ postInput = toneOutput.value;
419
+ }
420
+
421
+ if (outputPlan.features.lut) {
422
+ const colorLut = context.standardOutput?.colorLut;
423
+ if (colorLut === undefined) {
424
+ return err(
425
+ new RenderGraphError({
426
+ code: 'resource-resolution-failed',
427
+ expected: 'a prepared resident Standard color LUT projection',
428
+ hint: 'resolve and admit the TextureAsset LUT before compiling Standard output',
429
+ detail: { resourceLabel: 'standard-color-lut' },
430
+ }),
431
+ );
432
+ }
433
+ const lutOutput = target(context, 'standard-color-lut', {
434
+ format: 'rgba16float',
435
+ size: 'surface',
436
+ domain: 'linear-ldr',
437
+ });
438
+ if (!lutOutput.ok) return lutOutput;
439
+ const lutPass = addStandardColorLutPass(context.graph, postInput, lutOutput.value, colorLut);
440
+ if (!lutPass.ok) return lutPass;
441
+ postInput = lutOutput.value;
442
+ }
443
+
309
444
  if (rawOnly) {
310
445
  const overlay = addTypedDebugOverlayPass(context.graph, postInput);
311
446
  if (!overlay.ok) return overlay;
@@ -313,27 +448,44 @@ export function addStandardPost(
313
448
 
314
449
  if (hdr || linearLdr || fxaa || rawOnly || motionBlur) {
315
450
  if (fxaa) {
316
- const output = target(context, 'standard-output-color', {
317
- format: 'rgba16float',
318
- size: 'surface',
319
- usage: GPU_TEXTURE_USAGE_COPY_SRC,
320
- domain: 'display-encoded',
321
- });
451
+ const output = splitOutput
452
+ ? target(context, 'standard-fxaa-output', {
453
+ format: 'rgba16float',
454
+ size: 'surface',
455
+ domain: 'linear-ldr',
456
+ })
457
+ : target(context, 'standard-output-color', {
458
+ format: 'rgba16float',
459
+ size: 'surface',
460
+ usage: GPU_TEXTURE_USAGE_COPY_SRC,
461
+ domain: 'display-encoded',
462
+ });
322
463
  if (!output.ok) return output;
323
- // FXAA samples this display-encoded intermediate; leave dither to the
324
- // final FXAA writer so the same pixel is not dithered twice.
325
- const outputTransform = addTypedOutputTransformPass(context.graph, postInput, output.value, {
326
- dither: false,
327
- });
328
- if (!outputTransform.ok) return outputTransform;
464
+ if (!splitOutput) {
465
+ // FXAA samples this display-encoded intermediate; leave dither to the
466
+ // final FXAA writer so the same pixel is not dithered twice.
467
+ const outputTransform = addTypedOutputTransformPass(
468
+ context.graph,
469
+ postInput,
470
+ output.value,
471
+ { dither: false },
472
+ );
473
+ if (!outputTransform.ok) return outputTransform;
474
+ }
329
475
  const aa = addTypedFullscreenPass(context.graph, {
330
476
  name: 'fxaa',
331
477
  shader: 'fxaa',
332
- input: output.value,
333
- output: rawOnlyPostInput !== undefined ? rawOnlyPostInput.value : finalPresent,
478
+ input: splitOutput ? postInput : output.value,
479
+ output: splitOutput ? output.value : (rawOnlyPostInput?.value ?? finalPresent),
480
+ ...(splitOutput
481
+ ? {
482
+ paramsTransform: (): Uint8Array => new Uint8Array(16),
483
+ }
484
+ : {}),
334
485
  });
335
486
  if (!aa.ok) return aa;
336
- } else if (rawOnlyPostInput !== undefined) {
487
+ if (splitOutput) postInput = output.value;
488
+ } else if (rawOnlyPostInput !== undefined && !splitOutput) {
337
489
  const transformed = addTypedOutputTransformPass(
338
490
  context.graph,
339
491
  postInput,
@@ -343,12 +495,12 @@ export function addStandardPost(
343
495
  },
344
496
  );
345
497
  if (!transformed.ok) return transformed;
346
- } else if (rawOnly || linearLdr) {
498
+ } else if ((rawOnly || linearLdr) && !splitOutput) {
347
499
  const transformed = addTypedOutputTransformPass(context.graph, postInput, finalPresent, {
348
500
  dither: outputDither,
349
501
  });
350
502
  if (!transformed.ok) return transformed;
351
- } else {
503
+ } else if (!splitOutput) {
352
504
  const outputTransform = addTypedOutputTransformPass(context.graph, postInput, finalPresent, {
353
505
  dither: outputDither,
354
506
  });
@@ -356,6 +508,17 @@ export function addStandardPost(
356
508
  }
357
509
  }
358
510
 
511
+ if (splitOutput) {
512
+ const encodedOutput = rawOnlyPostInput?.value ?? finalPresent;
513
+ const outputTransform = addTypedOutputTransformPass(context.graph, postInput, encodedOutput, {
514
+ dither: outputDither,
515
+ name: 'standard-output-encoding',
516
+ fragmentEntryPoint: 'fs_encode_only',
517
+ });
518
+ if (!outputTransform.ok) return outputTransform;
519
+ postInput = encodedOutput;
520
+ }
521
+
359
522
  if (topology.lane.storageBuffer && postEffects.length > 0) {
360
523
  const postInputTarget = rawOnly
361
524
  ? rawOnlyPostInput?.value
@@ -1,3 +1,4 @@
1
+ import type { SsaoParameterConfig } from '../ssao-config';
1
2
  export const STANDARD_PIPELINE_ID = 'forgeax::standard' as const;
2
3
  export const STANDARD_LIGHT_COUNTS = [1, 32, 256] as const;
3
4
  export {
@@ -34,7 +35,7 @@ export interface StandardProfile {
34
35
  readonly shadows: StandardShadowMode;
35
36
  readonly pbr: boolean;
36
37
  readonly ibl: boolean;
37
- readonly ssao: boolean;
38
+ readonly ssao: boolean | SsaoParameterConfig;
38
39
  /** Renderer-owned 1080p volume profile; tile width/height remain surface-derived. */
39
40
  readonly volumetricFog?: StandardVolumetricFogProfile | undefined;
40
41
  readonly postStages: typeof STANDARD_POST_STAGE_NAMES;
@@ -124,6 +124,7 @@ export interface PipelineBuilderContext {
124
124
  readonly colorFormat: GPUTextureFormat;
125
125
  /** Additional color targets for an MRT pass; the first target is colorFormat. */
126
126
  readonly colorFormats?: readonly GPUTextureFormat[] | undefined;
127
+ readonly fragmentConstants?: Readonly<Record<string, number>> | undefined;
127
128
  /** Depth attachment format, or `undefined` for a color-only pass. */
128
129
  readonly depthFormat: GPUTextureFormat | undefined;
129
130
  /**
@@ -134,7 +135,7 @@ export interface PipelineBuilderContext {
134
135
  */
135
136
  readonly vertexBuffers: readonly GPUVertexBufferLayout[];
136
137
  /** Explicit layout family selected by the renderer assembly. */
137
- readonly layoutKind?: 'pbr-skin' | undefined;
138
+ readonly layoutKind?: 'pbr-skin' | 'gpu-driven-skin' | undefined;
138
139
  /** Pipeline label (for GPU debug captures); defaults to `pbr-pipeline-${id}`. */
139
140
  readonly label?: string | undefined;
140
141
  /**
@@ -160,6 +161,8 @@ export interface PipelineBuilderContext {
160
161
  readonly storageBuffer: boolean;
161
162
  readonly rgba16floatRenderable: boolean;
162
163
  };
164
+ /** The output-domain binary coverage variant uses an r8unorm attachment. */
165
+ readonly coverageOnly?: boolean | undefined;
163
166
  }
164
167
 
165
168
  /**
@@ -174,7 +177,10 @@ export interface PipelineBuilderContext {
174
177
  */
175
178
  export function validateTemporalPipelineContract(
176
179
  source: string,
177
- ctx: Pick<PipelineBuilderContext, 'colorFormat' | 'depthFormat' | 'capabilities'>,
180
+ ctx: Pick<
181
+ PipelineBuilderContext,
182
+ 'colorFormat' | 'depthFormat' | 'capabilities' | 'coverageOnly'
183
+ >,
178
184
  ): Result<void, RhiError> {
179
185
  if (!source.includes('fn vs_temporal') || !source.includes('fn fs_temporal')) {
180
186
  return err(
@@ -185,12 +191,16 @@ export function validateTemporalPipelineContract(
185
191
  }),
186
192
  );
187
193
  }
188
- if (ctx.colorFormat !== 'rgba16float') {
194
+ const validCoverageTarget = ctx.coverageOnly === true && ctx.colorFormat === 'r8unorm';
195
+ if (ctx.colorFormat !== 'rgba16float' && !validCoverageTarget) {
189
196
  return err(
190
197
  new RhiError({
191
198
  code: 'shader-compile-failed',
192
199
  expected: 'temporal material target format is rgba16float',
193
- hint: `temporal producer received color format ${ctx.colorFormat}; use its physical rgba16float target`,
200
+ hint:
201
+ ctx.coverageOnly === true
202
+ ? `coverage temporal producer received unsupported color format ${ctx.colorFormat}; use r8unorm`
203
+ : `temporal producer received color format ${ctx.colorFormat}; use its physical rgba16float target`,
194
204
  }),
195
205
  );
196
206
  }
@@ -367,6 +377,7 @@ export function buildPipelineForMaterialShader(
367
377
  ? {
368
378
  module: shaderModule,
369
379
  entryPoint: fsEntry,
380
+ ...(ctx.fragmentConstants === undefined ? {} : { constants: ctx.fragmentConstants }),
370
381
  targets: [],
371
382
  }
372
383
  : undefined,
@@ -376,11 +387,18 @@ export function buildPipelineForMaterialShader(
376
387
  frontFace: renderState?.frontFace ?? 'ccw',
377
388
  },
378
389
  depthStencil: {
379
- // depth32float (matches shadow RT format), NOT ctx.depthFormat
380
- // (which is depth24plus-stencil8 for the main pass).
381
- format: 'depth32float',
382
- depthWriteEnabled: true,
383
- depthCompare: 'less',
390
+ // Shadow passes default to depth32float, while prepared depth-only
391
+ // feature passes may target the renderer's depth24plus-stencil8
392
+ // attachment. The pipeline context carries the resolved format so
393
+ // the PSO and render pass cannot drift.
394
+ format: ctx.depthFormat ?? 'depth32float',
395
+ // Shadow-caster remains the default policy for the legacy depth pass,
396
+ // while an explicit prepared depth-only feature is allowed to carry
397
+ // its own compare/write contract (for example an occlusion prepass
398
+ // using `always` + write-off). Do not infer policy from the absence of
399
+ // color targets alone.
400
+ depthWriteEnabled: renderState?.depthWriteEnabled ?? true,
401
+ depthCompare: renderState?.depthCompare ?? 'less',
384
402
  },
385
403
  multisample: sampleCount > 1 ? { count: sampleCount } : undefined,
386
404
  });
@@ -430,6 +448,7 @@ export function buildPipelineForMaterialShader(
430
448
  fragment: {
431
449
  module: shaderModule,
432
450
  entryPoint: fsEntry,
451
+ ...(ctx.fragmentConstants === undefined ? {} : { constants: ctx.fragmentConstants }),
433
452
  targets: forwardSpec.attachments.colorFormats.map((format) => ({
434
453
  format,
435
454
  ...(renderState?.blend === undefined ? {} : { blend: renderState.blend }),
@@ -12,6 +12,8 @@ export interface PipelineSpec {
12
12
  readonly variantSet: string | undefined;
13
13
  readonly vertexEntry?: string;
14
14
  readonly fragmentEntry?: string;
15
+ /** Pipeline-time fragment overrides; not runtime WGSL feature defines. */
16
+ readonly fragmentConstants?: Readonly<Record<string, number>> | undefined;
15
17
  };
16
18
  readonly attachments: {
17
19
  readonly colorFormats: readonly GPUTextureFormat[];
@@ -24,6 +26,8 @@ export interface PipelineSpec {
24
26
  readonly vertexLayout: VertexAttributeMap;
25
27
  /** Geometry-owned immutable descriptor projection, when already derived. */
26
28
  readonly vertexLayoutProjection?: VertexLayoutProjection | undefined;
29
+ /** Explicit multi-stream layout supplied by the prepared-graphics owner. */
30
+ readonly vertexBuffers?: readonly GPUVertexBufferLayout[];
27
31
  readonly shaderUvSetCount?: number | undefined;
28
32
  };
29
33
  readonly renderState: MaterialRenderState | undefined;
@@ -18,6 +18,7 @@
18
18
  // P4: consistent abstraction — 4-axis aligns with wgpu/Bevy/Three.js
19
19
 
20
20
  import {
21
+ DEFAULT_VERTEX_ATTRIBUTE_MAP,
21
22
  deriveVertexBufferLayout,
22
23
  deriveVertexBufferLayoutFromProjection,
23
24
  deriveVertexLayoutProjection,
@@ -30,7 +31,6 @@ import {
30
31
  ok,
31
32
  type PrimitiveTopology,
32
33
  type Result,
33
- type VertexAttributeMap,
34
34
  } from '@forgeax/engine-types';
35
35
  import { VertexColorVariantConflictError } from './errors/render';
36
36
 
@@ -226,6 +226,24 @@ export function cacheKeyOf(spec: PipelineSpec): string {
226
226
 
227
227
  const uvSetCountSegment =
228
228
  geometry.shaderUvSetCount !== undefined ? `:uvsc${geometry.shaderUvSetCount}` : '';
229
+ // Prepared graphics may publish an explicit multi-stream layout (particle
230
+ // material-input lanes are the canonical example). The attribute map alone
231
+ // cannot describe those streams or their lane stride, so include the
232
+ // normalized descriptors in the cache identity as well.
233
+ const vertexBuffersSegment =
234
+ geometry.vertexBuffers === undefined
235
+ ? ''
236
+ : `:vbs:${JSON.stringify(
237
+ geometry.vertexBuffers.map((buffer) => ({
238
+ arrayStride: buffer.arrayStride,
239
+ stepMode: buffer.stepMode ?? 'vertex',
240
+ attributes: [...buffer.attributes].map((attribute) => ({
241
+ shaderLocation: attribute.shaderLocation,
242
+ offset: attribute.offset,
243
+ format: attribute.format,
244
+ })),
245
+ })),
246
+ )}`;
229
247
 
230
248
  // bug-20260708 M2 (b): sentinel `~` distinguishes `variantSet=undefined`
231
249
  // (no-variant / default-variant request) from canonical all-true key `''`
@@ -249,7 +267,15 @@ export function cacheKeyOf(spec: PipelineSpec): string {
249
267
  `vl:${vlDigest}`,
250
268
  renderStateHash(renderState),
251
269
  ].join(':') +
270
+ vertexBuffersSegment +
252
271
  uvSetCountSegment +
272
+ (shader.fragmentConstants === undefined
273
+ ? ''
274
+ : `:fragment-constants:${JSON.stringify(
275
+ Object.entries(shader.fragmentConstants).sort(([left], [right]) =>
276
+ left.localeCompare(right),
277
+ ),
278
+ )}`) +
253
279
  (shader.vertexEntry === undefined && shader.fragmentEntry === undefined
254
280
  ? ''
255
281
  : `:entries:${JSON.stringify([shader.vertexEntry ?? null, shader.fragmentEntry ?? null])}`)
@@ -292,22 +318,13 @@ export function variantSetFromVertexLayoutProjection(
292
318
  return ok(parts.join('+'));
293
319
  }
294
320
 
295
- /**
296
- * Derive the capability axes shared by every Standard PBR draw owner.
297
- *
298
- * The all-true key is the canonical empty key used by the shader manifest;
299
- * every other capability pair stays explicit so a no-local-light frame on a
300
- * device without storage buffers cannot accidentally select a storage-backed
301
- * PSO. Vertex-color is supplied here because the empty-key rule is only valid
302
- * when that geometry-owned axis is also true.
303
- */
321
+ /** Explicit geometry and lighting facts survive composition before manifest key canonicalization. */
304
322
  export function standardCapabilityVariantSet(
305
323
  clustered: boolean,
306
324
  storageBuffer: boolean,
307
325
  vertexColorAvailable: boolean,
308
326
  ): string {
309
- if (clustered && storageBuffer && vertexColorAvailable) return '';
310
- return `CLUSTER_FORWARD_AVAILABLE=${clustered}+STORAGE_BUFFER_AVAILABLE=${storageBuffer}`;
327
+ return `CLUSTER_FORWARD_AVAILABLE=${clustered}+STORAGE_BUFFER_AVAILABLE=${storageBuffer}+VERTEX_COLOR_AVAILABLE=${vertexColorAvailable}`;
311
328
  }
312
329
 
313
330
  /**
@@ -332,15 +349,7 @@ export function standardTopologyVariantSet(
332
349
  vertexColorAvailable,
333
350
  );
334
351
  if (!probeBlendAvailable || !storageBuffer) return capabilityVariantSet;
335
- // The canonical empty key cannot carry the clustered=true fact through
336
- // resolveMaterialShaderVariantSet (an omitted cluster axis means false).
337
- // Expand that base before adding the object-level Probe ABI axis so shader,
338
- // group(3) bind group, and pipeline layout remain one exact variant.
339
- const explicitCapabilityVariantSet =
340
- capabilityVariantSet === ''
341
- ? 'CLUSTER_FORWARD_AVAILABLE=true+STORAGE_BUFFER_AVAILABLE=true'
342
- : capabilityVariantSet;
343
- return `${explicitCapabilityVariantSet}+PROBE_BLEND_AVAILABLE=true`;
352
+ return `${capabilityVariantSet}+PROBE_BLEND_AVAILABLE=true`;
344
353
  }
345
354
 
346
355
  /**
@@ -406,7 +415,8 @@ export function buildPipelineDescriptor(
406
415
  // A supplied projection is the geometry owner's immutable GPU descriptor.
407
416
  // Do not re-derive it from a possibly stale attribute map.
408
417
  const vertexBuffers =
409
- geometry.vertexLayoutProjection === undefined
418
+ geometry.vertexBuffers ??
419
+ (geometry.vertexLayoutProjection === undefined
410
420
  ? deriveVertexBufferLayout(geometry.vertexLayout, {
411
421
  ...(geometry.shaderUvSetCount !== undefined
412
422
  ? { shaderUvSetCount: geometry.shaderUvSetCount }
@@ -416,7 +426,7 @@ export function buildPipelineDescriptor(
416
426
  ...(geometry.shaderUvSetCount !== undefined
417
427
  ? { shaderUvSetCount: geometry.shaderUvSetCount }
418
428
  : {}),
419
- });
429
+ }));
420
430
 
421
431
  const descriptor: Record<string, unknown> = {
422
432
  vertex: {
@@ -431,6 +441,9 @@ export function buildPipelineDescriptor(
431
441
  descriptor.fragment = {
432
442
  module: modules.fragment,
433
443
  entryPoint: spec.shader.fragmentEntry ?? modules.fragmentEntryPoint ?? 'fs_main',
444
+ ...(spec.shader.fragmentConstants === undefined
445
+ ? {}
446
+ : { constants: spec.shader.fragmentConstants }),
434
447
  targets: attachments.colorFormats.map((fmt) => {
435
448
  const target: Record<string, unknown> = { format: fmt };
436
449
  if (renderState?.blend !== undefined) {
@@ -952,12 +965,7 @@ export function getOrBuildPipeline(
952
965
  // SPEC_CONST_TABLE — 12 boot-time pre-warm variants (M1-T5)
953
966
  // ══════════════════════════════════════════════════════════════════════════════
954
967
 
955
- const PROCEDURAL_ATTR_LAYOUT: VertexAttributeMap = {
956
- position: new Float32Array(0),
957
- normal: new Float32Array(0),
958
- uv: new Float32Array(0),
959
- tangent: new Float32Array(0),
960
- };
968
+ const PROCEDURAL_ATTR_LAYOUT = DEFAULT_VERTEX_ATTRIBUTE_MAP;
961
969
 
962
970
  const HDR_FORMAT: GPUTextureFormat = 'rgba16float';
963
971
  const DEPTH_DS: GPUTextureFormat = 'depth24plus-stencil8';
package/src/plugin.ts CHANGED
@@ -3,12 +3,14 @@ import type { Plugin } from '@forgeax/engine-plugin';
3
3
  import { Atmosphere } from './components/atmosphere';
4
4
  import { Camera } from './components/camera';
5
5
  import { DirectionalLight } from './components/directional-light';
6
+ import { DynamicResolution } from './components/dynamic-resolution';
6
7
  import { Instances } from './components/instances';
7
8
  import { Layer } from './components/layer';
8
9
  import { LightProbe } from './components/light-probe';
9
10
  import { Lines } from './components/lines';
10
11
  import { MeshFilter } from './components/mesh-filter';
11
12
  import { MeshRenderer } from './components/mesh-renderer';
13
+ import { MotionBlur } from './components/motion-blur';
12
14
  import { PointLight } from './components/point-light';
13
15
  import { PointLightShadow } from './components/point-light-shadow';
14
16
  import { Points } from './components/points';
@@ -30,11 +32,13 @@ const RENDER_COMPONENTS: readonly Component[] = [
30
32
  Atmosphere,
31
33
  Camera,
32
34
  DirectionalLight,
35
+ DynamicResolution,
33
36
  Instances,
34
37
  Layer,
35
38
  LightProbe,
36
39
  MeshFilter,
37
40
  MeshRenderer,
41
+ MotionBlur,
38
42
  PointLight,
39
43
  PointLightShadow,
40
44
  Points,
@@ -1,5 +1,8 @@
1
1
  import { resolveAssetHandle } from '@forgeax/engine-assets-runtime';
2
- import { deriveVertexLayoutProjection } from '@forgeax/engine-geometry';
2
+ import {
3
+ DEFAULT_VERTEX_ATTRIBUTE_MAP,
4
+ deriveVertexLayoutProjection,
5
+ } from '@forgeax/engine-geometry';
3
6
  import { err, ok } from '@forgeax/engine-rhi';
4
7
  import type { MaterialAsset, MeshAsset } from '@forgeax/engine-types';
5
8
  import { toShared } from '@forgeax/engine-types';
@@ -15,7 +18,7 @@ import type {
15
18
  PointsLinesRecordSubmission,
16
19
  RenderSystemInternals,
17
20
  } from '../record/render-context';
18
- import type { RecoveryPointsLinesCandidate } from '../render-system';
21
+ import type { RecoveryPointsLinesCandidate } from '../recovery/types';
19
22
  import { admitPointsLines } from './admission';
20
23
  import { PointsLinesExpansionCache } from './expansion-cache';
21
24
  import type { PointsLinesInspection, PointsLinesSourceError } from './inspection';
@@ -50,12 +53,7 @@ export class StandardPointsLinesOwner implements PointsLinesRecordOwner {
50
53
  private readonly cache = new PointsLinesExpansionCache();
51
54
  private readonly preparations = new Map<string, PointsLinesPreparationAdapter>();
52
55
  private readonly active = new Map<string, PointsLinesInspection>();
53
- private readonly layoutProjection = deriveVertexLayoutProjection({
54
- position: new Float32Array(0),
55
- normal: new Float32Array(0),
56
- uv: new Float32Array(0),
57
- tangent: new Float32Array(0),
58
- });
56
+ private readonly layoutProjection = deriveVertexLayoutProjection(DEFAULT_VERTEX_ATTRIBUTE_MAP);
59
57
 
60
58
  constructor(private readonly internals: RenderSystemInternals) {}
61
59
 
@@ -193,14 +191,8 @@ export class StandardPointsLinesOwner implements PointsLinesRecordOwner {
193
191
  const prepKey = `${geometryKey}:${lane}:${backend}`;
194
192
  let preparation = preparations.get(prepKey);
195
193
  if (preparation === undefined) {
196
- // A new expansion is visible cold upload work. Candidate preparation
197
- // uses an unarmed runtime and stages the result; the published runtime
198
- // is armed, so a missing staged resource fails before any RHI create.
199
- runtime.recoveryColdWorkGuard?.noteUploadColdWork();
200
194
  preparation = this.createPreparation(runtime, geometryKey, lane, backend);
201
195
  preparations.set(prepKey, preparation);
202
- } else if (preparation.lastKnownGood()?.geometry.key !== geometryKey) {
203
- runtime.recoveryColdWorkGuard?.noteUploadColdWork();
204
196
  }
205
197
  const prepared = preparation.prepare(snapshot, meshResult.value);
206
198
  if (!prepared.ok) {