@forgeax/engine-render 0.1.7 → 0.1.20

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 (777) hide show
  1. package/README.md +140 -2
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/assembly/backend-contract.d.ts +12 -0
  4. package/dist/assembly/backend-contract.d.ts.map +1 -1
  5. package/dist/assembly/factory.d.ts +26 -5
  6. package/dist/assembly/factory.d.ts.map +1 -1
  7. package/dist/assembly/host-contract.d.ts +4 -0
  8. package/dist/assembly/host-contract.d.ts.map +1 -1
  9. package/dist/assembly/renderer-frame-transaction.d.ts +39 -0
  10. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -0
  11. package/dist/assembly/renderer-inspection.d.ts +22 -0
  12. package/dist/assembly/renderer-inspection.d.ts.map +1 -0
  13. package/dist/assembly/renderer-lifecycle.d.ts +4 -0
  14. package/dist/assembly/renderer-lifecycle.d.ts.map +1 -0
  15. package/dist/authoring.mjs +4 -2
  16. package/dist/authoring.mjs.map +1 -1
  17. package/dist/chunk-4XINDLAY.mjs +9404 -0
  18. package/dist/chunk-4XINDLAY.mjs.map +1 -0
  19. package/dist/chunk-CDTWTHZR.mjs +752 -0
  20. package/dist/chunk-CDTWTHZR.mjs.map +1 -0
  21. package/dist/chunk-FJ6P52EE.mjs +46 -0
  22. package/dist/chunk-FJ6P52EE.mjs.map +1 -0
  23. package/dist/chunk-JDWARUOI.mjs +44 -0
  24. package/dist/chunk-JDWARUOI.mjs.map +1 -0
  25. package/dist/chunk-M2MP4ZOU.mjs +73 -0
  26. package/dist/chunk-M2MP4ZOU.mjs.map +1 -0
  27. package/dist/chunk-PCHBPYML.mjs +385 -0
  28. package/dist/chunk-PCHBPYML.mjs.map +1 -0
  29. package/dist/chunk-RXZ3RGOU.mjs +53 -0
  30. package/dist/chunk-RXZ3RGOU.mjs.map +1 -0
  31. package/dist/{chunk-YEJIUW7D.mjs → chunk-TBQJOK2L.mjs} +356 -543
  32. package/dist/chunk-TBQJOK2L.mjs.map +1 -0
  33. package/dist/{chunk-CQXZC5XI.mjs → chunk-VFPLTKCU.mjs} +79 -69
  34. package/dist/chunk-VFPLTKCU.mjs.map +1 -0
  35. package/dist/components/atmosphere.d.ts +9 -0
  36. package/dist/components/atmosphere.d.ts.map +1 -0
  37. package/dist/components/camera.d.ts +2 -1
  38. package/dist/components/camera.d.ts.map +1 -1
  39. package/dist/components/fog.d.ts +8 -0
  40. package/dist/components/fog.d.ts.map +1 -0
  41. package/dist/components/index.d.ts +3 -0
  42. package/dist/components/index.d.ts.map +1 -1
  43. package/dist/components/light-helpers.d.ts.map +1 -1
  44. package/dist/components/motion-blur.d.ts +7 -0
  45. package/dist/components/motion-blur.d.ts.map +1 -0
  46. package/dist/components/spot-light.d.ts +12 -0
  47. package/dist/components/spot-light.d.ts.map +1 -1
  48. package/dist/construct-renderer.d.ts +2 -2
  49. package/dist/construct-renderer.d.ts.map +1 -1
  50. package/dist/construct-renderer.mjs +11146 -14507
  51. package/dist/construct-renderer.mjs.map +1 -1
  52. package/dist/device/device-scope.d.ts +4 -0
  53. package/dist/device/device-scope.d.ts.map +1 -1
  54. package/dist/device/gpu-residency.d.ts +19 -2
  55. package/dist/device/gpu-residency.d.ts.map +1 -1
  56. package/dist/environment/frame.d.ts +60 -0
  57. package/dist/environment/frame.d.ts.map +1 -0
  58. package/dist/environment/generation.d.ts +21 -0
  59. package/dist/environment/generation.d.ts.map +1 -0
  60. package/dist/environment/graph.d.ts +4 -0
  61. package/dist/environment/graph.d.ts.map +1 -0
  62. package/dist/environment/inspection.d.ts +48 -0
  63. package/dist/environment/inspection.d.ts.map +1 -0
  64. package/dist/environment/lifecycle.d.ts +39 -0
  65. package/dist/environment/lifecycle.d.ts.map +1 -0
  66. package/dist/environment/signature.d.ts +25 -0
  67. package/dist/environment/signature.d.ts.map +1 -0
  68. package/dist/errors/render.d.ts +204 -1
  69. package/dist/errors/render.d.ts.map +1 -1
  70. package/dist/extract/camera.d.ts +5 -0
  71. package/dist/extract/camera.d.ts.map +1 -0
  72. package/dist/extract/environment.d.ts +74 -0
  73. package/dist/extract/environment.d.ts.map +1 -0
  74. package/dist/extract/visibility.d.ts +1 -1
  75. package/dist/extract/visibility.d.ts.map +1 -1
  76. package/dist/features/host.d.ts +9 -2
  77. package/dist/features/host.d.ts.map +1 -1
  78. package/dist/features/motion-blur/motion-blur-feature.d.ts +16 -0
  79. package/dist/features/motion-blur/motion-blur-feature.d.ts.map +1 -0
  80. package/dist/features/motion-blur/motion-blur-params.d.ts +25 -0
  81. package/dist/features/motion-blur/motion-blur-params.d.ts.map +1 -0
  82. package/dist/features/plan.d.ts +17 -2
  83. package/dist/features/plan.d.ts.map +1 -1
  84. package/dist/features/prepared-gpu-work.d.ts +3 -1
  85. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  86. package/dist/features/prepared-graphics.d.ts +2 -1
  87. package/dist/features/prepared-graphics.d.ts.map +1 -1
  88. package/dist/features/render-graph-raster.d.ts +2 -1
  89. package/dist/features/render-graph-raster.d.ts.map +1 -1
  90. package/dist/features/targets.d.ts +3 -0
  91. package/dist/features/targets.d.ts.map +1 -1
  92. package/dist/features/types.d.ts +12 -0
  93. package/dist/features/types.d.ts.map +1 -1
  94. package/dist/fullscreen-post-process-pass.d.ts +7 -1
  95. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  96. package/dist/gpu-scene.d.ts +2 -0
  97. package/dist/gpu-scene.d.ts.map +1 -1
  98. package/dist/gpu-usage.d.ts +2 -0
  99. package/dist/gpu-usage.d.ts.map +1 -1
  100. package/dist/ibl/skylight-bind-group.d.ts +5 -6
  101. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  102. package/dist/index.d.ts +24 -7
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.mjs +6 -4
  105. package/dist/index.mjs.map +1 -1
  106. package/dist/inspection-types.d.ts +43 -1
  107. package/dist/inspection-types.d.ts.map +1 -1
  108. package/dist/internal.d.ts +2 -0
  109. package/dist/internal.d.ts.map +1 -1
  110. package/dist/internal.mjs +2 -0
  111. package/dist/light-buffer-layout.d.ts +20 -12
  112. package/dist/light-buffer-layout.d.ts.map +1 -1
  113. package/dist/materials.d.ts +22 -0
  114. package/dist/materials.d.ts.map +1 -1
  115. package/dist/pbr-pipeline.d.ts +16 -9
  116. package/dist/pbr-pipeline.d.ts.map +1 -1
  117. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  118. package/dist/pipeline/standard-pipeline.d.ts +3 -0
  119. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  120. package/dist/pipeline/standard-post.d.ts +48 -0
  121. package/dist/pipeline/standard-post.d.ts.map +1 -0
  122. package/dist/pipeline/standard-profile.d.ts +12 -2
  123. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  124. package/dist/pipeline-builder.d.ts +18 -0
  125. package/dist/pipeline-builder.d.ts.map +1 -1
  126. package/dist/pipeline-spec.d.ts.map +1 -1
  127. package/dist/plugin.d.ts.map +1 -1
  128. package/dist/record/frame-lighting.d.ts +2 -0
  129. package/dist/record/frame-lighting.d.ts.map +1 -1
  130. package/dist/record/frame-snapshot.d.ts +137 -6
  131. package/dist/record/frame-snapshot.d.ts.map +1 -1
  132. package/dist/record/frame-targets.d.ts.map +1 -1
  133. package/dist/record/frame.d.ts +6 -3
  134. package/dist/record/frame.d.ts.map +1 -1
  135. package/dist/record/gpu-timing.d.ts +32 -0
  136. package/dist/record/gpu-timing.d.ts.map +1 -0
  137. package/dist/record/main-pass-geometry.d.ts +11 -0
  138. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  139. package/dist/record/main-pass-material.d.ts +9 -6
  140. package/dist/record/main-pass-material.d.ts.map +1 -1
  141. package/dist/record/main-pass-sprite-draws.d.ts +8 -1
  142. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  143. package/dist/record/main-pass.d.ts +2 -0
  144. package/dist/record/main-pass.d.ts.map +1 -1
  145. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  146. package/dist/record/render-context.d.ts +81 -19
  147. package/dist/record/render-context.d.ts.map +1 -1
  148. package/dist/record/shadow-pass.d.ts.map +1 -1
  149. package/dist/record/skybox-post-pass.d.ts +1 -11
  150. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  151. package/dist/record/typed-frame-graph.d.ts +36 -4
  152. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  153. package/dist/record/view-ubo.d.ts +4 -1
  154. package/dist/record/view-ubo.d.ts.map +1 -1
  155. package/dist/render-contract.d.ts +157 -8
  156. package/dist/render-contract.d.ts.map +1 -1
  157. package/dist/render-data.d.ts +10 -6
  158. package/dist/render-data.d.ts.map +1 -1
  159. package/dist/render-graph-primitives.d.ts.map +1 -1
  160. package/dist/render-pipeline.d.ts +86 -6
  161. package/dist/render-pipeline.d.ts.map +1 -1
  162. package/dist/render-system-extract.d.ts +84 -8
  163. package/dist/render-system-extract.d.ts.map +1 -1
  164. package/dist/render-system.d.ts +30 -5
  165. package/dist/render-system.d.ts.map +1 -1
  166. package/dist/renderer-inspect.d.ts +29 -0
  167. package/dist/renderer-inspect.d.ts.map +1 -0
  168. package/dist/scene/render-scene.d.ts +36 -2
  169. package/dist/scene/render-scene.d.ts.map +1 -1
  170. package/dist/temporal/coverage.d.ts +42 -0
  171. package/dist/temporal/coverage.d.ts.map +1 -0
  172. package/dist/temporal/frame-coordinator.d.ts +99 -0
  173. package/dist/temporal/frame-coordinator.d.ts.map +1 -0
  174. package/dist/temporal/frame.d.ts +44 -0
  175. package/dist/temporal/frame.d.ts.map +1 -0
  176. package/dist/temporal/gpu.d.ts +39 -0
  177. package/dist/temporal/gpu.d.ts.map +1 -0
  178. package/dist/temporal/history.d.ts +37 -0
  179. package/dist/temporal/history.d.ts.map +1 -0
  180. package/dist/temporal/index.d.ts +7 -0
  181. package/dist/temporal/index.d.ts.map +1 -0
  182. package/dist/temporal/index.mjs +8 -0
  183. package/dist/temporal/index.mjs.map +1 -0
  184. package/dist/temporal/inspection.d.ts +36 -0
  185. package/dist/temporal/inspection.d.ts.map +1 -0
  186. package/dist/temporal/scene-data-catalog.d.ts +48 -0
  187. package/dist/temporal/scene-data-catalog.d.ts.map +1 -0
  188. package/dist/temporal/scene-data.d.ts +43 -0
  189. package/dist/temporal/scene-data.d.ts.map +1 -0
  190. package/dist/temporal/standard-scene-data.d.ts +61 -0
  191. package/dist/temporal/standard-scene-data.d.ts.map +1 -0
  192. package/dist/temporal/taa-history-resources.d.ts +22 -0
  193. package/dist/temporal/taa-history-resources.d.ts.map +1 -0
  194. package/dist/temporal/taa-history-store.d.ts +27 -0
  195. package/dist/temporal/taa-history-store.d.ts.map +1 -0
  196. package/dist/temporal/taa-resolve.d.ts +15 -0
  197. package/dist/temporal/taa-resolve.d.ts.map +1 -0
  198. package/dist/temporal/temporal-view.d.ts +40 -0
  199. package/dist/temporal/temporal-view.d.ts.map +1 -0
  200. package/dist/temporal/transaction.d.ts +9 -0
  201. package/dist/temporal/transaction.d.ts.map +1 -0
  202. package/dist/temporal/view.d.ts +56 -0
  203. package/dist/temporal/view.d.ts.map +1 -0
  204. package/dist/transmission/backdrop.d.ts +147 -0
  205. package/dist/transmission/backdrop.d.ts.map +1 -0
  206. package/dist/transmission/inspection.d.ts +57 -0
  207. package/dist/transmission/inspection.d.ts.map +1 -0
  208. package/dist/transmission/oracle.d.ts +42 -0
  209. package/dist/transmission/oracle.d.ts.map +1 -0
  210. package/dist/transmission/projection.d.ts +37 -0
  211. package/dist/transmission/projection.d.ts.map +1 -0
  212. package/dist/typed-render-graph-primitives.d.ts +30 -2
  213. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  214. package/dist/typed-shadow-atlas.d.ts +10 -0
  215. package/dist/typed-shadow-atlas.d.ts.map +1 -0
  216. package/dist/typed-shadow-passes.d.ts.map +1 -1
  217. package/dist/volume/capability.d.ts +57 -0
  218. package/dist/volume/capability.d.ts.map +1 -0
  219. package/dist/volume/component.d.ts +61 -0
  220. package/dist/volume/component.d.ts.map +1 -0
  221. package/dist/volume/extract.d.ts +11 -0
  222. package/dist/volume/extract.d.ts.map +1 -0
  223. package/dist/volume/inspection.d.ts +38 -0
  224. package/dist/volume/inspection.d.ts.map +1 -0
  225. package/dist/volume/passes.d.ts +38 -0
  226. package/dist/volume/passes.d.ts.map +1 -0
  227. package/dist/volume/recovery.d.ts +38 -0
  228. package/dist/volume/recovery.d.ts.map +1 -0
  229. package/dist/volume/resources.d.ts +57 -0
  230. package/dist/volume/resources.d.ts.map +1 -0
  231. package/dist/volume/temporal.d.ts +35 -0
  232. package/dist/volume/temporal.d.ts.map +1 -0
  233. package/package.json +24 -19
  234. package/src/__tests__/ai-user-cold-start.integration.test.ts +59 -0
  235. package/src/__tests__/ai-user-public-surface.test-d.ts +45 -0
  236. package/src/__tests__/bloom-exact-zero.unit.test.ts +202 -0
  237. package/src/__tests__/bloom-lifecycle.integration.test.ts +125 -0
  238. package/src/__tests__/construct-renderer-identity.unit.test.ts +4 -3
  239. package/src/__tests__/detached-inspection.integration.test.ts +177 -0
  240. package/src/__tests__/environment-fog-lanes.integration.test.ts +219 -0
  241. package/src/__tests__/environment-generation.integration.test.ts +141 -0
  242. package/src/__tests__/environment-selection.unit.test.ts +245 -0
  243. package/src/__tests__/factory-contract.integration.test.ts +1380 -9
  244. package/src/__tests__/frame-plan-contract.unit.test.ts +90 -0
  245. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +7 -0
  246. package/src/__tests__/gpu-driven-production.integration.test.ts +74 -22
  247. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +37 -0
  248. package/src/__tests__/gpu-scene.unit.test.ts +10 -0
  249. package/src/__tests__/injection-kind-owner.test-d.ts +2 -1
  250. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +14 -14
  251. package/src/__tests__/material-contract-inventory.unit.test.ts +62 -0
  252. package/src/__tests__/material-cooked-projection.unit.test.ts +18 -146
  253. package/src/__tests__/materials-transmission-validation.unit.test.ts +36 -0
  254. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +1 -1
  255. package/src/__tests__/morph-feature-plan.unit.test.ts +7 -0
  256. package/src/__tests__/motion-blur.pixel.integration.test.ts +121 -0
  257. package/src/__tests__/public-surface.test-d.ts +15 -1
  258. package/src/__tests__/render-error-code-owner.test-d.ts +14 -0
  259. package/src/__tests__/render-error-detail-ssot.test-d.ts +11 -2
  260. package/src/__tests__/render-error-exhaustive.test-d.ts +3 -0
  261. package/src/__tests__/render-feature-errors.unit.test.ts +33 -3
  262. package/src/__tests__/render-feature-gpu-work.integration.test.ts +44 -0
  263. package/src/__tests__/render-feature-plan.test-d.ts +22 -89
  264. package/src/__tests__/render-scene-projection.unit.test.ts +28 -0
  265. package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +26 -0
  266. package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +21 -0
  267. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +423 -1
  268. package/src/__tests__/renderer-frame-transaction.integration.test.ts +405 -0
  269. package/src/__tests__/renderer-lifecycle.integration.test.ts +22 -0
  270. package/src/__tests__/scene-data-catalog.unit.test.ts +59 -0
  271. package/src/__tests__/scene-data-consumer.integration.test.ts +67 -0
  272. package/src/__tests__/scene-data-contract.test-d.ts +35 -0
  273. package/src/__tests__/scene-data-inspection.unit.test.ts +41 -0
  274. package/src/__tests__/scene-data-public-surface.test-d.ts +34 -0
  275. package/src/__tests__/shader-manifest-fixture.ts +111 -0
  276. package/src/__tests__/skinned-shadow-caster.test.ts +123 -0
  277. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +24 -3
  278. package/src/__tests__/standard-pipeline.dawn.test.ts +15 -0
  279. package/src/__tests__/standard-pipeline.integration.test.ts +543 -1
  280. package/src/__tests__/standard-profile-oracle.unit.test.ts +12 -2
  281. package/src/__tests__/standard-temporal-producer.integration.test.ts +35 -0
  282. package/src/__tests__/surface-configuration.unit.test.ts +211 -12
  283. package/src/__tests__/taa-transaction.integration.test.ts +30 -0
  284. package/src/__tests__/temporal-admission.integration.test.ts +40 -0
  285. package/src/__tests__/temporal-coverage.unit.test.ts +35 -0
  286. package/src/__tests__/temporal-demand.unit.test.ts +44 -0
  287. package/src/__tests__/temporal-frame-coordinator.unit.test.ts +64 -0
  288. package/src/__tests__/temporal-graph-topology.unit.test.ts +51 -0
  289. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +170 -0
  290. package/src/__tests__/temporal-performance.integration.test.ts +615 -0
  291. package/src/__tests__/temporal-reset-matrix.unit.test.ts +97 -0
  292. package/src/__tests__/temporal-transaction.integration.test.ts +60 -0
  293. package/src/__tests__/temporal-view.unit.test.ts +152 -0
  294. package/src/__tests__/transmission-prewarm.unit.test.ts +93 -0
  295. package/src/__tests__/typed-pipeline-topology.unit.test.ts +230 -1
  296. package/src/__tests__/urp-pipeline-targets.unit.test.ts +25 -1
  297. package/src/__tests__/urp-pipeline.unit.test.ts +4 -3
  298. package/src/__tests__/visibility-extract.integration.test.ts +27 -1
  299. package/src/__tests__/visibility-producer-matrix.integration.test.ts +10 -0
  300. package/src/__tests__/volume-optics-oracle.unit.test.ts +85 -0
  301. package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +655 -0
  302. package/src/__tests__/volumetric-fog-component.unit.test.ts +71 -0
  303. package/src/__tests__/volumetric-fog-composite-stage-readback.dawn.test.ts +376 -0
  304. package/src/__tests__/volumetric-fog-errors.unit.test.ts +51 -0
  305. package/src/__tests__/volumetric-fog-inspection.unit.test.ts +77 -0
  306. package/src/__tests__/volumetric-fog-light-capability.unit.test.ts +19 -0
  307. package/src/__tests__/volumetric-fog-light-consumers.integration.test.ts +18 -0
  308. package/src/__tests__/volumetric-fog-light-errors.unit.test.ts +17 -0
  309. package/src/__tests__/volumetric-fog-light-topology.unit.test.ts +21 -0
  310. package/src/__tests__/volumetric-fog-light-transaction.integration.test.ts +53 -0
  311. package/src/__tests__/volumetric-fog-m9-watcher.integration.test.ts +27 -0
  312. package/src/__tests__/volumetric-fog-point-light-owner.integration.test.ts +44 -0
  313. package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +49 -0
  314. package/src/__tests__/volumetric-fog-point-spot-contract.unit.test.ts +28 -0
  315. package/src/__tests__/volumetric-fog-point-spot-lkg.integration.test.ts +65 -0
  316. package/src/__tests__/volumetric-fog-point-spot-selection.integration.test.ts +49 -0
  317. package/src/__tests__/volumetric-fog-point-spot-temporal.unit.test.ts +55 -0
  318. package/src/__tests__/volumetric-fog-projector-contract.unit.test.ts +22 -0
  319. package/src/__tests__/volumetric-fog-projector-inspection.unit.test.ts +12 -0
  320. package/src/__tests__/volumetric-fog-projector-surface-volume.integration.test.ts +11 -0
  321. package/src/__tests__/volumetric-fog-projector-transaction.integration.test.ts +26 -0
  322. package/src/__tests__/volumetric-fog-recovery.integration.test.ts +47 -0
  323. package/src/__tests__/volumetric-fog-selected-light-resolution.integration.test.ts +63 -0
  324. package/src/__tests__/volumetric-fog-spot-closure.integration.test.ts +26 -0
  325. package/src/__tests__/volumetric-fog-spot-contract.test-d.ts +21 -0
  326. package/src/__tests__/volumetric-fog-spot-contract.unit.test.ts +27 -0
  327. package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +14 -0
  328. package/src/__tests__/volumetric-fog-spot-optics.integration.test.ts +29 -0
  329. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +550 -0
  330. package/src/__tests__/volumetric-fog-temporal-selected-light.unit.test.ts +33 -0
  331. package/src/__tests__/volumetric-fog-temporal.unit.test.ts +45 -0
  332. package/src/__tests__/volumetric-fog-topology.unit.test.ts +237 -0
  333. package/src/__tests__/volumetric-fog-transparent.integration.test.ts +27 -0
  334. package/src/assembly/backend-contract.ts +47 -1
  335. package/src/assembly/factory.ts +1480 -505
  336. package/src/assembly/host-contract.ts +4 -0
  337. package/src/assembly/renderer-frame-transaction.ts +75 -0
  338. package/src/assembly/renderer-inspection.ts +112 -0
  339. package/src/assembly/renderer-lifecycle.ts +6 -0
  340. package/src/components/__tests__/motion-blur.unit.test.ts +14 -0
  341. package/src/components/__tests__/schema-contract.unit.test.ts +6 -1
  342. package/src/components/atmosphere.ts +10 -0
  343. package/src/components/camera.ts +2 -1
  344. package/src/components/fog.ts +9 -0
  345. package/src/components/index.ts +3 -0
  346. package/src/components/light-helpers.ts +4 -0
  347. package/src/components/motion-blur.ts +8 -0
  348. package/src/components/spot-light.ts +22 -3
  349. package/src/construct-renderer.ts +40 -3
  350. package/src/device/device-scope.ts +15 -1
  351. package/src/device/gpu-residency.ts +168 -58
  352. package/src/environment/frame.ts +185 -0
  353. package/src/environment/generation.ts +23 -0
  354. package/src/environment/graph.ts +9 -0
  355. package/src/environment/inspection.ts +87 -0
  356. package/src/environment/lifecycle.ts +250 -0
  357. package/src/environment/signature.ts +55 -0
  358. package/src/errors/render.ts +404 -1
  359. package/src/extract/camera.ts +78 -0
  360. package/src/extract/environment.ts +171 -0
  361. package/src/extract/visibility.ts +38 -19
  362. package/src/features/host.ts +36 -5
  363. package/src/features/motion-blur/__tests__/motion-blur-feature.unit.test.ts +67 -0
  364. package/src/features/motion-blur/__tests__/motion-blur-params.unit.test.ts +53 -0
  365. package/src/features/motion-blur/motion-blur-feature.ts +119 -0
  366. package/src/features/motion-blur/motion-blur-params.ts +89 -0
  367. package/src/features/plan.ts +32 -3
  368. package/src/features/prepared-gpu-work.ts +21 -6
  369. package/src/features/prepared-graphics.ts +2 -1
  370. package/src/features/render-graph-raster.ts +2 -1
  371. package/src/features/targets.ts +24 -2
  372. package/src/features/types.ts +13 -0
  373. package/src/fullscreen-post-process-pass.ts +34 -4
  374. package/src/gpu-scene.ts +24 -0
  375. package/src/gpu-usage.ts +2 -0
  376. package/src/ibl/skylight-bind-group.ts +30 -38
  377. package/src/index.ts +104 -7
  378. package/src/inspection-types.ts +48 -0
  379. package/src/internal.ts +5 -0
  380. package/src/light-buffer-layout.ts +59 -26
  381. package/src/materials.ts +119 -24
  382. package/src/pbr-pipeline.ts +91 -29
  383. package/src/pipeline/standard-forward-lane.ts +178 -101
  384. package/src/pipeline/standard-pipeline.ts +176 -105
  385. package/src/pipeline/standard-post.ts +373 -0
  386. package/src/pipeline/standard-profile.ts +26 -3
  387. package/src/pipeline-builder.ts +102 -12
  388. package/src/pipeline-spec.ts +9 -0
  389. package/src/plugin.ts +2 -0
  390. package/src/record/__tests__/fullscreen-temporal-routing.unit.test.ts +25 -0
  391. package/src/record/__tests__/main-pass-geometry.unit.test.ts +47 -0
  392. package/src/record/__tests__/material-bg-cache.unit.test.ts +12 -1
  393. package/src/record/__tests__/material-pipeline-pending-cache.unit.test.ts +22 -0
  394. package/src/record/__tests__/sprite-material-abi.unit.test.ts +75 -0
  395. package/src/record/__tests__/standard-pbr-ubo-layout.unit.test.ts +67 -0
  396. package/src/record/__tests__/temporal-payload.unit.test.ts +164 -0
  397. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +127 -0
  398. package/src/record/frame-lighting.ts +103 -89
  399. package/src/record/frame-snapshot.ts +170 -6
  400. package/src/record/frame-targets.ts +21 -8
  401. package/src/record/frame.ts +1014 -7
  402. package/src/record/gpu-timing.ts +224 -0
  403. package/src/record/main-pass-geometry.ts +86 -40
  404. package/src/record/main-pass-material.ts +120 -68
  405. package/src/record/main-pass-sprite-draws.ts +78 -101
  406. package/src/record/main-pass.ts +77 -4
  407. package/src/record/mesh-ssbo.ts +22 -3
  408. package/src/record/render-context.ts +194 -23
  409. package/src/record/shadow-pass.ts +197 -58
  410. package/src/record/skybox-post-pass.ts +97 -41
  411. package/src/record/typed-frame-graph.ts +704 -30
  412. package/src/record/view-ubo.ts +52 -4
  413. package/src/render-contract.ts +181 -6
  414. package/src/render-data.ts +50 -22
  415. package/src/render-graph-primitives.ts +18 -1
  416. package/src/render-pipeline.ts +144 -27
  417. package/src/render-system-extract.ts +522 -72
  418. package/src/render-system.ts +561 -41
  419. package/src/renderer-inspect.ts +66 -0
  420. package/src/scene/render-scene.ts +252 -7
  421. package/src/temporal/__tests__/taa-history-resources.unit.test.ts +45 -0
  422. package/src/temporal/coverage.ts +76 -0
  423. package/src/temporal/frame-coordinator.ts +311 -0
  424. package/src/temporal/frame.ts +128 -0
  425. package/src/temporal/gpu.ts +287 -0
  426. package/src/temporal/history.ts +92 -0
  427. package/src/temporal/index.ts +6 -0
  428. package/src/temporal/inspection.ts +97 -0
  429. package/src/temporal/scene-data-catalog.ts +200 -0
  430. package/src/temporal/scene-data.ts +149 -0
  431. package/src/temporal/standard-scene-data.ts +182 -0
  432. package/src/temporal/taa-history-resources.ts +128 -0
  433. package/src/temporal/taa-history-store.ts +79 -0
  434. package/src/temporal/taa-resolve.ts +34 -0
  435. package/src/temporal/temporal-view.ts +169 -0
  436. package/src/temporal/transaction.ts +17 -0
  437. package/src/temporal/view.ts +161 -0
  438. package/src/transmission/__tests__/capability.unit.test.ts +83 -0
  439. package/src/transmission/__tests__/composition.integration.test.ts +161 -0
  440. package/src/transmission/__tests__/inspection.unit.test.ts +241 -0
  441. package/src/transmission/__tests__/lifecycle.integration.test.ts +96 -0
  442. package/src/transmission/__tests__/oracle.unit.test.ts +131 -0
  443. package/src/transmission/__tests__/projection.unit.test.ts +71 -0
  444. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +437 -0
  445. package/src/transmission/__tests__/transmission-backdrop-topology.unit.test.ts +109 -0
  446. package/src/transmission/__tests__/transmission-backdrop.dawn.test.ts +105 -0
  447. package/src/transmission/backdrop.ts +572 -0
  448. package/src/transmission/inspection.ts +190 -0
  449. package/src/transmission/oracle.ts +141 -0
  450. package/src/transmission/projection.ts +83 -0
  451. package/src/typed-render-graph-primitives.ts +194 -11
  452. package/src/typed-shadow-atlas.ts +17 -0
  453. package/src/typed-shadow-passes.ts +6 -5
  454. package/src/volume/capability.ts +173 -0
  455. package/src/volume/component.ts +110 -0
  456. package/src/volume/extract.ts +21 -0
  457. package/src/volume/inspection.ts +78 -0
  458. package/src/volume/passes.ts +680 -0
  459. package/src/volume/recovery.ts +86 -0
  460. package/src/volume/resources.ts +236 -0
  461. package/src/volume/temporal.ts +89 -0
  462. package/dist/__tests__/authoring-path.unit.test.d.ts +0 -2
  463. package/dist/__tests__/authoring-path.unit.test.d.ts.map +0 -1
  464. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts +0 -2
  465. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts.map +0 -1
  466. package/dist/__tests__/callback-inference.test-d.d.ts +0 -2
  467. package/dist/__tests__/callback-inference.test-d.d.ts.map +0 -1
  468. package/dist/__tests__/cluster-binner.test.d.ts +0 -2
  469. package/dist/__tests__/cluster-binner.test.d.ts.map +0 -1
  470. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts +0 -2
  471. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts.map +0 -1
  472. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts +0 -2
  473. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts.map +0 -1
  474. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +0 -2
  475. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +0 -1
  476. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +0 -2
  477. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +0 -1
  478. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts +0 -2
  479. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts.map +0 -1
  480. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts +0 -2
  481. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts.map +0 -1
  482. package/dist/__tests__/factory-contract.integration.test.d.ts +0 -2
  483. package/dist/__tests__/factory-contract.integration.test.d.ts.map +0 -1
  484. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts +0 -2
  485. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts.map +0 -1
  486. package/dist/__tests__/frame-observation.contract.test.d.ts +0 -2
  487. package/dist/__tests__/frame-observation.contract.test.d.ts.map +0 -1
  488. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +0 -2
  489. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +0 -1
  490. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts +0 -2
  491. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts.map +0 -1
  492. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts +0 -6
  493. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +0 -1
  494. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts +0 -2
  495. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts.map +0 -1
  496. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts +0 -2
  497. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts.map +0 -1
  498. package/dist/__tests__/gpu-driven-production.integration.test.d.ts +0 -2
  499. package/dist/__tests__/gpu-driven-production.integration.test.d.ts.map +0 -1
  500. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts +0 -2
  501. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts.map +0 -1
  502. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +0 -18
  503. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +0 -1
  504. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts +0 -2
  505. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts.map +0 -1
  506. package/dist/__tests__/gpu-driven-view-reference.d.ts +0 -15
  507. package/dist/__tests__/gpu-driven-view-reference.d.ts.map +0 -1
  508. package/dist/__tests__/gpu-driven-view.browser.test.d.ts +0 -2
  509. package/dist/__tests__/gpu-driven-view.browser.test.d.ts.map +0 -1
  510. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts +0 -2
  511. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts.map +0 -1
  512. package/dist/__tests__/gpu-driven-view.unit.test.d.ts +0 -2
  513. package/dist/__tests__/gpu-driven-view.unit.test.d.ts.map +0 -1
  514. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts +0 -2
  515. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts.map +0 -1
  516. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts +0 -7
  517. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +0 -1
  518. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts +0 -2
  519. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts.map +0 -1
  520. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts +0 -2
  521. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts.map +0 -1
  522. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts +0 -2
  523. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts.map +0 -1
  524. package/dist/__tests__/gpu-scene.dawn.test.d.ts +0 -2
  525. package/dist/__tests__/gpu-scene.dawn.test.d.ts.map +0 -1
  526. package/dist/__tests__/gpu-scene.unit.test.d.ts +0 -2
  527. package/dist/__tests__/gpu-scene.unit.test.d.ts.map +0 -1
  528. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +0 -2
  529. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +0 -1
  530. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts +0 -2
  531. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts.map +0 -1
  532. package/dist/__tests__/injection-kind-owner.test-d.d.ts +0 -2
  533. package/dist/__tests__/injection-kind-owner.test-d.d.ts.map +0 -1
  534. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts +0 -2
  535. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts.map +0 -1
  536. package/dist/__tests__/light-buffer-layout.unit.test.d.ts +0 -2
  537. package/dist/__tests__/light-buffer-layout.unit.test.d.ts.map +0 -1
  538. package/dist/__tests__/material-contract-inventory.unit.test.d.ts +0 -2
  539. package/dist/__tests__/material-contract-inventory.unit.test.d.ts.map +0 -1
  540. package/dist/__tests__/material-cooked-projection.unit.test.d.ts +0 -2
  541. package/dist/__tests__/material-cooked-projection.unit.test.d.ts.map +0 -1
  542. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts +0 -2
  543. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts.map +0 -1
  544. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts +0 -2
  545. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts.map +0 -1
  546. package/dist/__tests__/material-stride-surface.unit.test.d.ts +0 -2
  547. package/dist/__tests__/material-stride-surface.unit.test.d.ts.map +0 -1
  548. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts +0 -2
  549. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts.map +0 -1
  550. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts +0 -2
  551. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts.map +0 -1
  552. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts +0 -2
  553. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts.map +0 -1
  554. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts +0 -2
  555. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts.map +0 -1
  556. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts +0 -2
  557. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts.map +0 -1
  558. package/dist/__tests__/morph-feature-plan.unit.test.d.ts +0 -2
  559. package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +0 -1
  560. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts +0 -2
  561. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts.map +0 -1
  562. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts +0 -2
  563. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts.map +0 -1
  564. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts +0 -2
  565. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts.map +0 -1
  566. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts +0 -2
  567. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts.map +0 -1
  568. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts +0 -2
  569. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts.map +0 -1
  570. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts +0 -2
  571. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts.map +0 -1
  572. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts +0 -2
  573. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts.map +0 -1
  574. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts +0 -2
  575. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts.map +0 -1
  576. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts +0 -2
  577. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts.map +0 -1
  578. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts +0 -2
  579. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts.map +0 -1
  580. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts +0 -2
  581. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts.map +0 -1
  582. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts +0 -2
  583. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts.map +0 -1
  584. package/dist/__tests__/profiler-default-off.test.d.ts +0 -2
  585. package/dist/__tests__/profiler-default-off.test.d.ts.map +0 -1
  586. package/dist/__tests__/profiler-phase-catalog.test.d.ts +0 -2
  587. package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +0 -1
  588. package/dist/__tests__/profiler-phase-integration.test.d.ts +0 -2
  589. package/dist/__tests__/profiler-phase-integration.test.d.ts.map +0 -1
  590. package/dist/__tests__/profiler-phase-token.test.d.ts +0 -2
  591. package/dist/__tests__/profiler-phase-token.test.d.ts.map +0 -1
  592. package/dist/__tests__/public-surface.test-d.d.ts +0 -2
  593. package/dist/__tests__/public-surface.test-d.d.ts.map +0 -1
  594. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts +0 -2
  595. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts.map +0 -1
  596. package/dist/__tests__/render-error-code-owner.test-d.d.ts +0 -2
  597. package/dist/__tests__/render-error-code-owner.test-d.d.ts.map +0 -1
  598. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts +0 -2
  599. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts.map +0 -1
  600. package/dist/__tests__/render-error-exhaustive.test-d.d.ts +0 -2
  601. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +0 -1
  602. package/dist/__tests__/render-feature-assembly.test-d.d.ts +0 -2
  603. package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +0 -1
  604. package/dist/__tests__/render-feature-context.test-d.d.ts +0 -2
  605. package/dist/__tests__/render-feature-context.test-d.d.ts.map +0 -1
  606. package/dist/__tests__/render-feature-contract.test-d.d.ts +0 -2
  607. package/dist/__tests__/render-feature-contract.test-d.d.ts.map +0 -1
  608. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts +0 -2
  609. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts.map +0 -1
  610. package/dist/__tests__/render-feature-docs.unit.test.d.ts +0 -2
  611. package/dist/__tests__/render-feature-docs.unit.test.d.ts.map +0 -1
  612. package/dist/__tests__/render-feature-errors.unit.test.d.ts +0 -2
  613. package/dist/__tests__/render-feature-errors.unit.test.d.ts.map +0 -1
  614. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts +0 -2
  615. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts.map +0 -1
  616. package/dist/__tests__/render-feature-plan.test-d.d.ts +0 -2
  617. package/dist/__tests__/render-feature-plan.test-d.d.ts.map +0 -1
  618. package/dist/__tests__/render-feature-plan.unit.test.d.ts +0 -2
  619. package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +0 -1
  620. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts +0 -2
  621. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts.map +0 -1
  622. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts +0 -2
  623. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts.map +0 -1
  624. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +0 -2
  625. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +0 -1
  626. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts +0 -2
  627. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts.map +0 -1
  628. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts +0 -2
  629. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts.map +0 -1
  630. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts +0 -2
  631. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts.map +0 -1
  632. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts +0 -2
  633. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts.map +0 -1
  634. package/dist/__tests__/render-feature-public-surface.test-d.d.ts +0 -2
  635. package/dist/__tests__/render-feature-public-surface.test-d.d.ts.map +0 -1
  636. package/dist/__tests__/render-feature-retry.unit.test.d.ts +0 -2
  637. package/dist/__tests__/render-feature-retry.unit.test.d.ts.map +0 -1
  638. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts +0 -2
  639. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts.map +0 -1
  640. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts +0 -2
  641. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts.map +0 -1
  642. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts +0 -2
  643. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts.map +0 -1
  644. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts +0 -2
  645. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts.map +0 -1
  646. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts +0 -2
  647. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts.map +0 -1
  648. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts +0 -2
  649. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts.map +0 -1
  650. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts +0 -7
  651. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts.map +0 -1
  652. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts +0 -2
  653. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts.map +0 -1
  654. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts +0 -2
  655. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts.map +0 -1
  656. package/dist/__tests__/render-graph-hzb-gpu.d.ts +0 -7
  657. package/dist/__tests__/render-graph-hzb-gpu.d.ts.map +0 -1
  658. package/dist/__tests__/render-graph-hzb.browser.test.d.ts +0 -2
  659. package/dist/__tests__/render-graph-hzb.browser.test.d.ts.map +0 -1
  660. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts +0 -2
  661. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts.map +0 -1
  662. package/dist/__tests__/render-graph-primitives.unit.test.d.ts +0 -2
  663. package/dist/__tests__/render-graph-primitives.unit.test.d.ts.map +0 -1
  664. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts +0 -12
  665. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts.map +0 -1
  666. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts +0 -2
  667. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts.map +0 -1
  668. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts +0 -2
  669. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts.map +0 -1
  670. package/dist/__tests__/render-scene-projection.unit.test.d.ts +0 -2
  671. package/dist/__tests__/render-scene-projection.unit.test.d.ts.map +0 -1
  672. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts +0 -2
  673. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts.map +0 -1
  674. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +0 -2
  675. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +0 -1
  676. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts +0 -2
  677. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts.map +0 -1
  678. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts +0 -2
  679. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts.map +0 -1
  680. package/dist/__tests__/shader-stage-surface.unit.test.d.ts +0 -2
  681. package/dist/__tests__/shader-stage-surface.unit.test.d.ts.map +0 -1
  682. package/dist/__tests__/ssao-config.unit.test.d.ts +0 -2
  683. package/dist/__tests__/ssao-config.unit.test.d.ts.map +0 -1
  684. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts +0 -2
  685. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts.map +0 -1
  686. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +0 -2
  687. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +0 -1
  688. package/dist/__tests__/standard-descriptors.test-d.d.ts +0 -2
  689. package/dist/__tests__/standard-descriptors.test-d.d.ts.map +0 -1
  690. package/dist/__tests__/standard-pipeline.dawn.test.d.ts +0 -2
  691. package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +0 -1
  692. package/dist/__tests__/standard-pipeline.integration.test.d.ts +0 -2
  693. package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +0 -1
  694. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +0 -2
  695. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +0 -1
  696. package/dist/__tests__/surface-configuration.unit.test.d.ts +0 -2
  697. package/dist/__tests__/surface-configuration.unit.test.d.ts.map +0 -1
  698. package/dist/__tests__/texture-usage-surface.unit.test.d.ts +0 -2
  699. package/dist/__tests__/texture-usage-surface.unit.test.d.ts.map +0 -1
  700. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts +0 -2
  701. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts.map +0 -1
  702. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts +0 -2
  703. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts.map +0 -1
  704. package/dist/__tests__/urp-pipeline.unit.test.d.ts +0 -2
  705. package/dist/__tests__/urp-pipeline.unit.test.d.ts.map +0 -1
  706. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts +0 -2
  707. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts.map +0 -1
  708. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts +0 -2
  709. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts.map +0 -1
  710. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts +0 -2
  711. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts.map +0 -1
  712. package/dist/__tests__/visibility-extract.integration.test.d.ts +0 -2
  713. package/dist/__tests__/visibility-extract.integration.test.d.ts.map +0 -1
  714. package/dist/__tests__/visibility-extract.perf.test.d.ts +0 -2
  715. package/dist/__tests__/visibility-extract.perf.test.d.ts.map +0 -1
  716. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts +0 -2
  717. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts.map +0 -1
  718. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts +0 -2
  719. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts.map +0 -1
  720. package/dist/__tests__/visibility-instances.integration.test.d.ts +0 -2
  721. package/dist/__tests__/visibility-instances.integration.test.d.ts.map +0 -1
  722. package/dist/__tests__/visibility-multi-world.integration.test.d.ts +0 -2
  723. package/dist/__tests__/visibility-multi-world.integration.test.d.ts.map +0 -1
  724. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts +0 -2
  725. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts.map +0 -1
  726. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts +0 -2
  727. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts.map +0 -1
  728. package/dist/__tests__/visibility-public-surface.test-d.d.ts +0 -2
  729. package/dist/__tests__/visibility-public-surface.test-d.d.ts.map +0 -1
  730. package/dist/__tests__/visibility-resolver.unit.test.d.ts +0 -2
  731. package/dist/__tests__/visibility-resolver.unit.test.d.ts.map +0 -1
  732. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +0 -2
  733. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +0 -1
  734. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts +0 -2
  735. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts.map +0 -1
  736. package/dist/__tests__/vocabulary.unit.test.d.ts +0 -2
  737. package/dist/__tests__/vocabulary.unit.test.d.ts.map +0 -1
  738. package/dist/chunk-CQXZC5XI.mjs.map +0 -1
  739. package/dist/chunk-HCOGPHKS.mjs +0 -93
  740. package/dist/chunk-HCOGPHKS.mjs.map +0 -1
  741. package/dist/chunk-YEJIUW7D.mjs.map +0 -1
  742. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts +0 -2
  743. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts.map +0 -1
  744. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts +0 -2
  745. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts.map +0 -1
  746. package/dist/components/__tests__/schema-contract.unit.test.d.ts +0 -2
  747. package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +0 -1
  748. package/dist/components/__tests__/schema-parity.unit.test.d.ts +0 -2
  749. package/dist/components/__tests__/schema-parity.unit.test.d.ts.map +0 -1
  750. package/dist/components/__tests__/visibility-schema.unit.test.d.ts +0 -2
  751. package/dist/components/__tests__/visibility-schema.unit.test.d.ts.map +0 -1
  752. package/dist/points-lines/__tests__/bounds.unit.test.d.ts +0 -2
  753. package/dist/points-lines/__tests__/bounds.unit.test.d.ts.map +0 -1
  754. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts +0 -2
  755. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts.map +0 -1
  756. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts +0 -2
  757. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts.map +0 -1
  758. package/dist/points-lines/__tests__/inspection.unit.test.d.ts +0 -2
  759. package/dist/points-lines/__tests__/inspection.unit.test.d.ts.map +0 -1
  760. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts +0 -2
  761. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts.map +0 -1
  762. package/dist/points-lines/__tests__/points-lines.bench.d.ts +0 -2
  763. package/dist/points-lines/__tests__/points-lines.bench.d.ts.map +0 -1
  764. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts +0 -2
  765. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts.map +0 -1
  766. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts +0 -2
  767. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts.map +0 -1
  768. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts +0 -2
  769. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts.map +0 -1
  770. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts +0 -2
  771. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts.map +0 -1
  772. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts +0 -2
  773. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts.map +0 -1
  774. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +0 -2
  775. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +0 -1
  776. package/dist/record/__tests__/video-texture-view.unit.test.d.ts +0 -2
  777. package/dist/record/__tests__/video-texture-view.unit.test.d.ts.map +0 -1
@@ -7,7 +7,7 @@ import {
7
7
  type RhiQueue,
8
8
  type RhiRenderPassEncoder,
9
9
  } from '@forgeax/engine-rhi';
10
- import type { PassSelector } from '@forgeax/engine-types';
10
+ import type { MaterialRenderState, PassSelector } from '@forgeax/engine-types';
11
11
  import { GpuBuffer } from '../gpu-resource';
12
12
  import {
13
13
  GPU_BUFFER_USAGE_COPY_DST,
@@ -16,7 +16,11 @@ import {
16
16
  } from '../gpu-usage';
17
17
  import { assembleMaterialWithSkylightEntries } from '../ibl/skylight-bind-group';
18
18
  import type { InstanceBufferCacheEntry } from '../instance-buffer-cache';
19
- import { buildPbrMaterialUserRegionEntries } from '../pbr-pipeline';
19
+ import {
20
+ buildPbrMaterialUserRegionEntries,
21
+ SHADOW_CASTER_SHADER_ID,
22
+ shadowCasterVariantSet,
23
+ } from '../pbr-pipeline';
20
24
  import type { DispatchEntry, ExtractedLights } from '../render-system-extract';
21
25
  import { matchPass } from '../systems/pass-selector';
22
26
  import { worldEntityKey } from './frame-snapshot';
@@ -25,6 +29,8 @@ import {
25
29
  getOrCreatePerEntity,
26
30
  MAX_UNIFORM_INSTANCES,
27
31
  MESH_PER_ENTITY_STRIDE,
32
+ MESH_SSBO_BYTES,
33
+ MESH_UBO_FULL_ARRAY_BYTES,
28
34
  packInstanceStorageBuffer,
29
35
  } from './mesh-ssbo';
30
36
  import type { _InternalRenderPipelineContext } from './render-context';
@@ -75,6 +81,7 @@ function ensureTypedShadowViewBg(
75
81
  const { runtime, frameState, pipelineState } = c;
76
82
  const shadowSampler = pipelineState.perPassResources.shadowSampler;
77
83
  if (shadowSampler === null) return null;
84
+ const projectorAvailable = pipelineState.projectorAvailable !== false;
78
85
  try {
79
86
  return getOrCreateFromChain(
80
87
  frameState.viewBindGroupCache,
@@ -88,6 +95,9 @@ function ensureTypedShadowViewBg(
88
95
  pipelineState.shadowParamsBuffer,
89
96
  pipelineState.shadowCasterCascadeBuffer,
90
97
  pipelineState.shadowFallbackTextureView,
98
+ ...(projectorAvailable
99
+ ? [pipelineState.defaultWhiteTextureView, pipelineState.defaultSampler]
100
+ : []),
91
101
  pipelineState.pointsLinesViewBuffer ?? pipelineState.viewUniformBuffer,
92
102
  ],
93
103
  variant,
@@ -159,6 +169,21 @@ function ensureTypedShadowViewBg(
159
169
  },
160
170
  },
161
171
  },
172
+ ...(projectorAvailable
173
+ ? [
174
+ {
175
+ binding: 11,
176
+ resource: {
177
+ kind: 'textureView' as const,
178
+ value: pipelineState.defaultWhiteTextureView,
179
+ },
180
+ },
181
+ {
182
+ binding: 12,
183
+ resource: { kind: 'sampler' as const, value: pipelineState.defaultSampler },
184
+ },
185
+ ]
186
+ : []),
162
187
  ],
163
188
  });
164
189
  if (!created.ok) throw created.error;
@@ -175,11 +200,26 @@ function ensureTypedShadowViewBg(
175
200
  }
176
201
  }
177
202
 
178
- function shadowShaderMap(c: _InternalRenderPipelineContext): ReadonlyMap<number, string> {
179
- const shaders = new Map<number, string>();
203
+ interface ShadowDispatch {
204
+ readonly materialShaderId: string;
205
+ readonly renderState: MaterialRenderState | undefined;
206
+ }
207
+
208
+ type ShadowDispatchMap = ReadonlyMap<number, ReadonlyMap<number, ShadowDispatch>>;
209
+
210
+ function shadowShaderMap(c: _InternalRenderPipelineContext): ShadowDispatchMap {
211
+ const shaders = new Map<number, Map<number, ShadowDispatch>>();
180
212
  for (const entry of c.dispatch) {
181
213
  if (entry.tags.LightMode === 'ShadowCaster' && entry.materialShaderId !== undefined) {
182
- shaders.set(entry.renderableIndex, entry.materialShaderId);
214
+ let byMaterial = shaders.get(entry.renderableIndex);
215
+ if (byMaterial === undefined) {
216
+ byMaterial = new Map<number, ShadowDispatch>();
217
+ shaders.set(entry.renderableIndex, byMaterial);
218
+ }
219
+ byMaterial.set(entry.materialHandle, {
220
+ materialShaderId: entry.materialShaderId,
221
+ renderState: entry.renderState,
222
+ });
183
223
  }
184
224
  }
185
225
  return shaders;
@@ -188,17 +228,97 @@ function shadowShaderMap(c: _InternalRenderPipelineContext): ReadonlyMap<number,
188
228
  function shadowPipeline(c: _InternalRenderPipelineContext): RenderPipeline | null {
189
229
  return (
190
230
  c.runtime.getMaterialShaderPipeline?.(
191
- 'forgeax::default-shadow-caster',
231
+ SHADOW_CASTER_SHADER_ID,
192
232
  false,
193
233
  undefined,
194
234
  'triangle-list',
195
235
  undefined,
236
+ shadowCasterVariantSet(c.runtime.device.caps.storageBuffer, false),
237
+ 'shadow-caster',
238
+ undefined,
239
+ undefined,
240
+ undefined,
241
+ undefined,
242
+ undefined,
243
+ undefined,
244
+ undefined,
196
245
  undefined,
246
+ 'pbr',
247
+ ) ?? null
248
+ );
249
+ }
250
+
251
+ function skinnedShadowPipeline(
252
+ c: _InternalRenderPipelineContext,
253
+ entry: _InternalRenderPipelineContext['validatedOrdered'][number],
254
+ ): RenderPipeline | null {
255
+ return (
256
+ c.runtime.getMaterialShaderPipeline?.(
257
+ SHADOW_CASTER_SHADER_ID,
258
+ false,
259
+ undefined,
260
+ entry.mesh.submeshes[0]?.topology ?? 'triangle-list',
261
+ entry.mesh.indexFormat,
262
+ shadowCasterVariantSet(c.runtime.device.caps.storageBuffer, true),
197
263
  'shadow-caster',
264
+ undefined,
265
+ 1,
266
+ undefined,
267
+ undefined,
268
+ undefined,
269
+ undefined,
270
+ entry.mesh.layoutProjection,
271
+ undefined,
272
+ 'pbr-skin',
198
273
  ) ?? null
199
274
  );
200
275
  }
201
276
 
277
+ function skinnedShadowMeshBindGroup(
278
+ c: _InternalRenderPipelineContext,
279
+ entry: _InternalRenderPipelineContext['validatedOrdered'][number],
280
+ ): BindGroup | null {
281
+ const skin = entry.source.skin;
282
+ const layout = c.pipelineState.pbrSkinMeshBindGroupLayout;
283
+ const allocator = c.pipelineState.skinPaletteAllocator;
284
+ if (skin === undefined || layout === null || allocator === null) return null;
285
+ return getOrCreateFromChain(
286
+ c.frameState.meshBindGroupCache,
287
+ [c.pipelineState.meshStorageBuffer.buffer, skin.buffer],
288
+ 'shadow-pbr-skin-mesh',
289
+ () => {
290
+ const created = c.runtime.device.createBindGroup({
291
+ label: 'shadow-pbr-skin-mesh-bg',
292
+ layout,
293
+ entries: [
294
+ {
295
+ binding: 0,
296
+ resource: {
297
+ kind: 'buffer',
298
+ value: {
299
+ buffer: c.pipelineState.meshStorageBuffer.buffer,
300
+ size: c.runtime.device.caps.storageBuffer
301
+ ? MESH_SSBO_BYTES
302
+ : MESH_UBO_FULL_ARRAY_BYTES,
303
+ },
304
+ },
305
+ },
306
+ {
307
+ binding: 1,
308
+ resource: {
309
+ kind: 'buffer',
310
+ value: { buffer: skin.buffer, size: allocator.bindingWindowBytes },
311
+ },
312
+ },
313
+ ],
314
+ });
315
+ if (!created.ok) throw created.error;
316
+ return created.value;
317
+ },
318
+ c.bindGroupCounts,
319
+ );
320
+ }
321
+
202
322
  export function encodeDirectionalShadowPass(
203
323
  c: _InternalRenderPipelineContext,
204
324
  pass: RhiRenderPassEncoder,
@@ -402,8 +522,8 @@ export function buildMatchedMaterialHandlesByRenderable(
402
522
  * groups (@group 0/1) are already set by the caller; this loop owns @group
403
523
  * 2/3 + the vertex/index/pipeline de-dup state. Receives the explicit
404
524
  * `_InternalRenderPipelineContext` (`c`) plus the caller-resolved shadow
405
- * pipeline, mesh bind group, pass-selector match set, and per-renderable
406
- * custom-caster shader map so no cross-function mutable state is introduced.
525
+ * pipeline, mesh bind group, pass-selector match set, and per-material
526
+ * ShadowCaster dispatch map so no cross-function mutable state is introduced.
407
527
  */
408
528
  function recordShadowCasterDraws(
409
529
  c: _InternalRenderPipelineContext,
@@ -411,7 +531,7 @@ function recordShadowCasterDraws(
411
531
  shadowPipeline: RenderPipeline,
412
532
  shadowMeshBindGroup: BindGroup,
413
533
  matchedIndices: Set<number> | null,
414
- shadowShaderByRenderableIdx: ReadonlyMap<number, string>,
534
+ shadowDispatchByRenderableIdx: ShadowDispatchMap,
415
535
  ): void {
416
536
  const { runtime, pipelineState, validatedOrdered } = c;
417
537
  // M-3 / w12: vertexBuffer/indexBuffer state locals migrate to GpuBuffer
@@ -434,37 +554,14 @@ function recordShadowCasterDraws(
434
554
  // feat-20260609 M2: skip entities that don't match the pass selector.
435
555
  if (matchedIndices !== null && !matchedIndices.has(entry.renderableIndex)) continue;
436
556
 
437
- // bug-20260619-csm RC-3 (AC-10, D-3): resolve the per-entity shadow
438
- // PSO from its ShadowCaster shader id. Default casters keep the
439
- // vertex-only `forgeax::default-shadow-caster` PSO bound above; a
440
- // material with a custom ShadowCaster shader (cutout alpha-test) gets
441
- // its own fragment-carrying PSO so `discard` runs in the depth pass.
442
- const entryShadowShaderId = shadowShaderByRenderableIdx.get(entry.renderableIndex);
443
- let entryShadowPipeline = shadowPipeline;
444
- if (
445
- entryShadowShaderId !== undefined &&
446
- entryShadowShaderId !== 'forgeax::default-shadow-caster'
447
- ) {
448
- // Custom ShadowCaster PSO; same cache path as the default above
449
- // (passKind 'shadow-caster'). On a cache miss (async build in
450
- // flight / build failure) fall back to the default PSO so the
451
- // caster still writes depth rather than dropping its draw.
452
- entryShadowPipeline =
453
- runtime.getMaterialShaderPipeline?.(
454
- entryShadowShaderId,
455
- false, // isHdr — shadow depth pass is always LDR
456
- undefined, // renderState
457
- 'triangle-list', // topology — shadow PSO targets triangle-list
458
- undefined, // indexFormat
459
- undefined, // variantSet — shadow caster has no variant axes
460
- 'shadow-caster', // passKind
461
- ) ?? shadowPipeline;
462
- }
463
- if (entryShadowPipeline !== shadowLastPipeline && entryShadowPipeline !== null) {
464
- shadowPass.setPipeline(entryShadowPipeline);
465
- shadowLastPipeline = entryShadowPipeline;
557
+ if (entry.source.skin !== undefined) {
558
+ const skinPipeline = skinnedShadowPipeline(c, entry);
559
+ if (skinPipeline === null) continue;
560
+ if (skinPipeline !== shadowLastPipeline) {
561
+ shadowPass.setPipeline(skinPipeline);
562
+ shadowLastPipeline = skinPipeline;
563
+ }
466
564
  }
467
-
468
565
  // feat-20260604-mesh-topology-debug-draw M5 / w14 (AC-09, D-A6): the
469
566
  // shadow caster PSO is triangle-list; it only projects triangle faces.
470
567
  // line-list / line-strip / point-list meshes have no surface to cast a
@@ -494,7 +591,16 @@ function recordShadowCasterDraws(
494
591
  }
495
592
  }
496
593
 
497
- shadowPass.setBindGroup(2, shadowMeshBindGroup, [i * MESH_PER_ENTITY_STRIDE]);
594
+ if (entry.source.skin !== undefined) {
595
+ const skinMeshBindGroup = skinnedShadowMeshBindGroup(c, entry);
596
+ if (skinMeshBindGroup === null) continue;
597
+ shadowPass.setBindGroup(2, skinMeshBindGroup, [
598
+ i * MESH_PER_ENTITY_STRIDE,
599
+ entry.source.skin.byteOffset,
600
+ ]);
601
+ } else {
602
+ shadowPass.setBindGroup(2, shadowMeshBindGroup, [i * MESH_PER_ENTITY_STRIDE]);
603
+ }
498
604
 
499
605
  // C1 + C2 (w12): per-entity instance buffer + instanceCount
500
606
  let shadowInstanceBuffer: Buffer = pipelineState.identityInstanceBuffer;
@@ -609,6 +715,48 @@ function recordShadowCasterDraws(
609
715
  if (sm.topology !== 'triangle-list' && sm.topology !== 'triangle-strip') {
610
716
  continue;
611
717
  }
718
+
719
+ // Resolve the ShadowCaster PSO for the material bound to this submesh.
720
+ // Built-in materials normally use the shared vertex-only caster, but an
721
+ // authored `cullMode:'none'`/`frontFace` must still reach that PSO so
722
+ // two-sided casters (such as the Three.js teapot) populate the atlas
723
+ // from both faces. Custom ShadowCaster shaders retain their own path.
724
+ const submeshMaterial = entry.source.materials[sm.materialSlot] ?? entry.source.material;
725
+ const shadowDispatch = shadowDispatchByRenderableIdx
726
+ .get(entry.renderableIndex)
727
+ ?.get(submeshMaterial.materialHandle ?? 0);
728
+ const entryShadowShaderId = shadowDispatch?.materialShaderId;
729
+ const entryShadowRenderState = shadowDispatch?.renderState;
730
+ // A skinned caster's pipeline was selected above together with its
731
+ // two-binding mesh/palette group. Keep that pairing for every submesh;
732
+ // resetting to the static shadow pipeline here would bind the skin
733
+ // group against `pbr-pl` and Dawn rejects the draw at submit time.
734
+ let entryShadowPipeline =
735
+ entry.source.skin !== undefined ? shadowLastPipeline : shadowPipeline;
736
+ if (
737
+ entry.source.skin === undefined &&
738
+ entryShadowShaderId !== undefined &&
739
+ (entryShadowShaderId !== 'forgeax::default-shadow-caster' ||
740
+ entryShadowRenderState !== undefined)
741
+ ) {
742
+ // On a cache miss (async build in flight / build failure), fall back
743
+ // to the default PSO so the caster still writes depth rather than
744
+ // dropping its draw.
745
+ entryShadowPipeline =
746
+ runtime.getMaterialShaderPipeline?.(
747
+ entryShadowShaderId,
748
+ false, // isHdr — shadow depth pass is always LDR
749
+ entryShadowRenderState,
750
+ 'triangle-list', // topology — shadow PSO targets triangle-list
751
+ undefined, // indexFormat
752
+ undefined, // variantSet — shadow caster has no variant axes
753
+ 'shadow-caster', // passKind
754
+ ) ?? shadowPipeline;
755
+ }
756
+ if (entryShadowPipeline !== shadowLastPipeline && entryShadowPipeline !== null) {
757
+ shadowPass.setPipeline(entryShadowPipeline);
758
+ shadowLastPipeline = entryShadowPipeline;
759
+ }
612
760
  if (entry.mesh.indexed) {
613
761
  shadowPass.drawIndexed(sm.indexCount, shadowInstanceCount, sm.indexOffset, 0, 0);
614
762
  } else {
@@ -663,24 +811,15 @@ function ensureSpotShadowMaterialBg(c: _InternalRenderPipelineContext): BindGrou
663
811
  });
664
812
  const merged =
665
813
  fb !== null
666
- ? assembleMaterialWithSkylightEntries(
667
- fallbackEntries,
668
- {
669
- irradianceView: fb.irradianceView,
670
- irradianceSampler: fb.sampler,
671
- prefilterView: fb.prefilterView,
672
- prefilterSampler: fb.sampler,
673
- brdfLutView: fb.brdfLutView,
674
- brdfLutSampler: fb.sampler,
675
- intensityBuffer: fb.intensityBuffer,
676
- },
677
- {
678
- emissiveSampler: pipelineState.defaultSampler,
679
- emissiveView: pipelineState.defaultWhiteTextureView,
680
- occlusionSampler: pipelineState.defaultSampler,
681
- occlusionView: pipelineState.defaultWhiteTextureView,
682
- },
683
- )
814
+ ? assembleMaterialWithSkylightEntries(fallbackEntries, {
815
+ irradianceView: fb.irradianceView,
816
+ irradianceSampler: fb.sampler,
817
+ prefilterView: fb.prefilterView,
818
+ prefilterSampler: fb.sampler,
819
+ brdfLutView: fb.brdfLutView,
820
+ brdfLutSampler: fb.sampler,
821
+ intensityBuffer: fb.intensityBuffer,
822
+ })
684
823
  : fallbackEntries;
685
824
  const r = runtime.device.createBindGroup({
686
825
  label: 'shadow-material-bg',
@@ -1,7 +1,8 @@
1
1
  import type { ResolveContext } from '@forgeax/engine-render-graph';
2
- import type { RhiRenderPassEncoder, TextureView } from '@forgeax/engine-rhi';
2
+ import { RhiError, type RhiRenderPassEncoder, type TextureView } from '@forgeax/engine-rhi';
3
3
  import { toShared } from '@forgeax/engine-types';
4
4
  import { buildBeginRenderPassDescriptor } from '../pipeline-spec';
5
+ import type { BloomFrameReceipts } from './frame-snapshot';
5
6
  import { getOrCreateFromChain } from './mesh-ssbo';
6
7
  import type { _InternalRenderPipelineContext } from './render-context';
7
8
  import { VIEW_UNIFORM_BYTES } from './view-ubo';
@@ -177,30 +178,72 @@ export function encodeSkyboxPass(
177
178
  // Gate: bloom === 'off' || !tonemapActive => early-return (AC-04/AC-05).
178
179
  // The closures receive RenderPipelineContext and route to w15 record functions.
179
180
 
181
+ const EMPTY_BLOOM_RECEIPTS: BloomFrameReceipts = {
182
+ uploadCount: 0,
183
+ bindGroupCount: 0,
184
+ encodeCount: 0,
185
+ };
186
+
187
+ function updateBloomReceipts(
188
+ c: _InternalRenderPipelineContext,
189
+ field: keyof BloomFrameReceipts,
190
+ ): void {
191
+ const current = c.frameState.bloomFrameReceipts ?? EMPTY_BLOOM_RECEIPTS;
192
+ c.frameState.bloomFrameReceipts = {
193
+ ...current,
194
+ [field]: current[field] + 1,
195
+ };
196
+ }
197
+
198
+ function stageBloomUpload(c: _InternalRenderPipelineContext): void {
199
+ updateBloomReceipts(c, 'uploadCount');
200
+ }
201
+
202
+ function stageBloomBindGroup(c: _InternalRenderPipelineContext): void {
203
+ updateBloomReceipts(c, 'bindGroupCount');
204
+ }
205
+
206
+ function stageBloomEncode(c: _InternalRenderPipelineContext): void {
207
+ updateBloomReceipts(c, 'encodeCount');
208
+ }
209
+
210
+ function throwBloomRecordFailure(expected: string): never {
211
+ throw new RhiError({
212
+ code: 'webgpu-runtime-error',
213
+ expected,
214
+ hint: 'repair the Bloom candidate resources before retrying the frame',
215
+ });
216
+ }
217
+
180
218
  export function recordBloomBrightPass(
181
219
  _c: _InternalRenderPipelineContext,
182
220
  resolve?: ResolveContext,
183
221
  graphPass?: RhiRenderPassEncoder,
184
222
  ): void {
185
- const { runtime, pipelineState, encoder, camera, tonemapActive, frameState, bindGroupCounts } =
186
- _c;
187
- const pp = pipelineState.perPassResources;
223
+ const { runtime, encoder, camera, tonemapActive, frameState, bindGroupCounts } = _c;
224
+ const pp = _c.bloomResources;
188
225
 
189
226
  // Double gate: bloom=off => zero-overhead; tonemap=none => no HDR domain
190
227
  if (camera.bloom !== 'on' || !tonemapActive) return;
228
+ if (pp === null || pp === undefined) {
229
+ throwBloomRecordFailure('Bloom persistent resources are ready before bright-pass encoding');
230
+ }
191
231
  if (
192
232
  pp.bloomBrightPipeline === null ||
193
233
  pp.bloomBrightBindGroupLayout === null ||
194
234
  pp.bloomSampler === null ||
195
235
  pp.bloomBrightParamsBuffer === null
196
- )
197
- return;
236
+ ) {
237
+ throwBloomRecordFailure('Bloom bright pass has pipeline, layout, sampler, and params buffer');
238
+ }
198
239
 
199
240
  // M1 / w7: bloom intermediate textures owned by render-graph. Resolve
200
241
  // the GPU TextureView via the resolve context passed by graph.execute().
201
242
  const bloomBrightView = resolve?.resolve('bloomBright') as TextureView | undefined;
202
243
  const hdrColorView = resolve?.resolve('hdrColor') as TextureView | undefined;
203
- if (!bloomBrightView || !hdrColorView) return;
244
+ if (!bloomBrightView || !hdrColorView) {
245
+ throwBloomRecordFailure('Bloom bright pass resolves its source and target views');
246
+ }
204
247
  const bglBright = pp.bloomBrightBindGroupLayout;
205
248
  const bloomSampler = pp.bloomSampler;
206
249
  const paramsBuffer = pp.bloomBrightParamsBuffer;
@@ -213,6 +256,7 @@ export function recordBloomBrightPass(
213
256
  brightParams[3] = 0;
214
257
  const paramsWrite = runtime.device.queue.writeBuffer(paramsBuffer, 0, brightParams);
215
258
  if (!paramsWrite.ok) throw paramsWrite.error;
259
+ stageBloomUpload(_c);
216
260
 
217
261
  // 3. Identity-cached BindGroup (1 tex + 1 sampler + 1 UBO). Keyed on the
218
262
  // graph-resolved hdrColor TextureView: resize retires hdrColor and the new
@@ -249,7 +293,9 @@ export function recordBloomBrightPass(
249
293
  );
250
294
  pass.setPipeline(pp.bloomBrightPipeline);
251
295
  pass.setBindGroup(0, bindGroup);
296
+ stageBloomBindGroup(_c);
252
297
  pass.draw(3, 1, 0, 0);
298
+ stageBloomEncode(_c);
253
299
  if (graphPass === undefined) pass.end();
254
300
  }
255
301
 
@@ -258,32 +304,29 @@ export function recordBloomBlurHPass(
258
304
  resolve?: ResolveContext,
259
305
  graphPass?: RhiRenderPassEncoder,
260
306
  ): void {
261
- const {
262
- runtime,
263
- pipelineState,
264
- encoder,
265
- camera,
266
- targetW,
267
- tonemapActive,
268
- frameState,
269
- bindGroupCounts,
270
- } = _c;
271
- const pp = pipelineState.perPassResources;
307
+ const { runtime, encoder, camera, targetW, tonemapActive, frameState, bindGroupCounts } = _c;
308
+ const pp = _c.bloomResources;
272
309
 
273
310
  if (camera.bloom !== 'on' || !tonemapActive) return;
311
+ if (pp === null || pp === undefined) {
312
+ throwBloomRecordFailure('Bloom persistent resources are ready before blur-H encoding');
313
+ }
274
314
  if (
275
315
  pp.bloomBlurHPipeline === null ||
276
316
  pp.bloomBlurBindGroupLayout === null ||
277
317
  pp.bloomSampler === null ||
278
318
  pp.bloomBlurHParamsBuffer === null
279
- )
280
- return;
319
+ ) {
320
+ throwBloomRecordFailure('Bloom blur-H pass has pipeline, layout, sampler, and params buffer');
321
+ }
281
322
 
282
323
  // M1 / w7: bloom intermediate textures owned by render-graph. Resolve
283
324
  // via the resolve context passed by graph.execute().
284
325
  const bloomBlurHView = resolve?.resolve('bloomBlurH') as TextureView | undefined;
285
326
  const bloomBrightView = resolve?.resolve('bloomBright') as TextureView | undefined;
286
- if (!bloomBlurHView || !bloomBrightView) return;
327
+ if (!bloomBlurHView || !bloomBrightView) {
328
+ throwBloomRecordFailure('Bloom blur-H pass resolves its source and target views');
329
+ }
287
330
  const bglBlur = pp.bloomBlurBindGroupLayout;
288
331
  const bloomSampler = pp.bloomSampler;
289
332
  const paramsBuffer = pp.bloomBlurHParamsBuffer;
@@ -299,6 +342,7 @@ export function recordBloomBlurHPass(
299
342
  blurParams[3] = 0;
300
343
  const paramsWrite = runtime.device.queue.writeBuffer(paramsBuffer, 0, blurParams);
301
344
  if (!paramsWrite.ok) throw paramsWrite.error;
345
+ stageBloomUpload(_c);
302
346
 
303
347
  // 3. Identity-cached BindGroup (reads bloomBright from graph). Keyed on the
304
348
  // graph-resolved bloomBright view so resize rebuilds against the new texture.
@@ -334,7 +378,9 @@ export function recordBloomBlurHPass(
334
378
  );
335
379
  pass.setPipeline(pp.bloomBlurHPipeline);
336
380
  pass.setBindGroup(0, bindGroup);
381
+ stageBloomBindGroup(_c);
337
382
  pass.draw(3, 1, 0, 0);
383
+ stageBloomEncode(_c);
338
384
  if (graphPass === undefined) pass.end();
339
385
  }
340
386
 
@@ -343,32 +389,29 @@ export function recordBloomBlurVPass(
343
389
  resolve?: ResolveContext,
344
390
  graphPass?: RhiRenderPassEncoder,
345
391
  ): void {
346
- const {
347
- runtime,
348
- pipelineState,
349
- encoder,
350
- camera,
351
- targetH,
352
- tonemapActive,
353
- frameState,
354
- bindGroupCounts,
355
- } = _c;
356
- const pp = pipelineState.perPassResources;
392
+ const { runtime, encoder, camera, targetH, tonemapActive, frameState, bindGroupCounts } = _c;
393
+ const pp = _c.bloomResources;
357
394
 
358
395
  if (camera.bloom !== 'on' || !tonemapActive) return;
396
+ if (pp === null || pp === undefined) {
397
+ throwBloomRecordFailure('Bloom persistent resources are ready before blur-V encoding');
398
+ }
359
399
  if (
360
400
  pp.bloomBlurVPipeline === null ||
361
401
  pp.bloomBlurBindGroupLayout === null ||
362
402
  pp.bloomSampler === null ||
363
403
  pp.bloomBlurVParamsBuffer === null
364
- )
365
- return;
404
+ ) {
405
+ throwBloomRecordFailure('Bloom blur-V pass has pipeline, layout, sampler, and params buffer');
406
+ }
366
407
 
367
408
  // M1 / w7: bloom intermediate textures owned by render-graph. Resolve
368
409
  // via the resolve context passed by graph.execute().
369
410
  const bloomBlurVView = resolve?.resolve('bloomBlurV') as TextureView | undefined;
370
411
  const bloomBlurHView = resolve?.resolve('bloomBlurH') as TextureView | undefined;
371
- if (!bloomBlurVView || !bloomBlurHView) return;
412
+ if (!bloomBlurVView || !bloomBlurHView) {
413
+ throwBloomRecordFailure('Bloom blur-V pass resolves its source and target views');
414
+ }
372
415
  const bglBlur = pp.bloomBlurBindGroupLayout;
373
416
  const bloomSampler = pp.bloomSampler;
374
417
  const paramsBuffer = pp.bloomBlurVParamsBuffer;
@@ -384,6 +427,7 @@ export function recordBloomBlurVPass(
384
427
  blurParams[3] = 0;
385
428
  const paramsWrite = runtime.device.queue.writeBuffer(paramsBuffer, 0, blurParams);
386
429
  if (!paramsWrite.ok) throw paramsWrite.error;
430
+ stageBloomUpload(_c);
387
431
 
388
432
  // 3. Identity-cached BindGroup (reads bloomBlurH from graph). Keyed on the
389
433
  // graph-resolved bloomBlurH view so resize rebuilds against the new texture.
@@ -419,7 +463,9 @@ export function recordBloomBlurVPass(
419
463
  );
420
464
  pass.setPipeline(pp.bloomBlurVPipeline);
421
465
  pass.setBindGroup(0, bindGroup);
466
+ stageBloomBindGroup(_c);
422
467
  pass.draw(3, 1, 0, 0);
468
+ stageBloomEncode(_c);
423
469
  if (graphPass === undefined) pass.end();
424
470
  }
425
471
 
@@ -428,18 +474,23 @@ export function recordBloomCompositePass(
428
474
  resolve?: ResolveContext,
429
475
  graphPass?: RhiRenderPassEncoder,
430
476
  ): void {
431
- const { runtime, pipelineState, encoder, camera, tonemapActive, frameState, bindGroupCounts } =
432
- _c;
433
- const pp = pipelineState.perPassResources;
477
+ const { runtime, encoder, camera, tonemapActive, frameState, bindGroupCounts } = _c;
478
+ const pp = _c.bloomResources;
434
479
 
435
480
  if (camera.bloom !== 'on' || !tonemapActive) return;
481
+ if (pp === null || pp === undefined) {
482
+ throwBloomRecordFailure('Bloom persistent resources are ready before composite encoding');
483
+ }
436
484
  if (
437
485
  pp.bloomCompositePipeline === null ||
438
486
  pp.bloomCompositeBindGroupLayout === null ||
439
487
  pp.bloomSampler === null ||
440
488
  pp.bloomCompositeParamsBuffer === null
441
- )
442
- return;
489
+ ) {
490
+ throwBloomRecordFailure(
491
+ 'Bloom composite pass has pipeline, layout, sampler, and params buffer',
492
+ );
493
+ }
443
494
 
444
495
  // M1 / w7: hdrColor + bloomBlurV textures owned by render-graph.
445
496
  // bug-20260625: composite READS hdrColor (scene, binding 0) and WRITES the
@@ -447,7 +498,9 @@ export function recordBloomCompositePass(
447
498
  const hdrColorView = resolve?.resolve('hdrColor') as TextureView | undefined;
448
499
  const bloomBlurVView = resolve?.resolve('bloomBlurV') as TextureView | undefined;
449
500
  const hdrCompositedView = resolve?.resolve('hdrComposited') as TextureView | undefined;
450
- if (!hdrColorView || !bloomBlurVView || !hdrCompositedView) return;
501
+ if (!hdrColorView || !bloomBlurVView || !hdrCompositedView) {
502
+ throwBloomRecordFailure('Bloom composite pass resolves its source and target views');
503
+ }
451
504
  const bglComposite = pp.bloomCompositeBindGroupLayout;
452
505
  const bloomSampler = pp.bloomSampler;
453
506
  const paramsBuffer = pp.bloomCompositeParamsBuffer;
@@ -460,6 +513,7 @@ export function recordBloomCompositePass(
460
513
  compositeParams[3] = 0;
461
514
  const paramsWrite = runtime.device.queue.writeBuffer(paramsBuffer, 0, compositeParams);
462
515
  if (!paramsWrite.ok) throw paramsWrite.error;
516
+ stageBloomUpload(_c);
463
517
 
464
518
  // 2. Identity-cached BindGroup (2 tex: hdrColor + bloomBlurV, 1 sampler,
465
519
  // 1 UBO). Keys on both sampled views: resize retires both hdrColor and
@@ -505,7 +559,9 @@ export function recordBloomCompositePass(
505
559
  );
506
560
  pass.setPipeline(pp.bloomCompositePipeline);
507
561
  pass.setBindGroup(0, bindGroup);
562
+ stageBloomBindGroup(_c);
508
563
  pass.draw(3, 1, 0, 0);
564
+ stageBloomEncode(_c);
509
565
  if (graphPass === undefined) pass.end();
510
566
  }
511
567