@forgeax/engine-render 0.1.20 → 0.1.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (645) hide show
  1. package/README.md +365 -29
  2. package/dist/assembly/backend-contract.d.ts +13 -0
  3. package/dist/assembly/backend-contract.d.ts.map +1 -1
  4. package/dist/assembly/device-feature-admission.d.ts +18 -0
  5. package/dist/assembly/device-feature-admission.d.ts.map +1 -0
  6. package/dist/assembly/directional-shadow-inspection.d.ts +38 -0
  7. package/dist/assembly/directional-shadow-inspection.d.ts.map +1 -0
  8. package/dist/assembly/factory.d.ts +30 -19
  9. package/dist/assembly/factory.d.ts.map +1 -1
  10. package/dist/assembly/host-contract.d.ts +19 -0
  11. package/dist/assembly/host-contract.d.ts.map +1 -1
  12. package/dist/assembly/render-target-host.d.ts +46 -0
  13. package/dist/assembly/render-target-host.d.ts.map +1 -0
  14. package/dist/assets/render-asset-port.d.ts.map +1 -1
  15. package/dist/authoring.mjs +4 -1
  16. package/dist/authoring.mjs.map +1 -1
  17. package/dist/capture/cube-views.d.ts +21 -0
  18. package/dist/capture/cube-views.d.ts.map +1 -0
  19. package/dist/capture/scheduler.d.ts +54 -0
  20. package/dist/capture/scheduler.d.ts.map +1 -0
  21. package/dist/{chunk-PCHBPYML.mjs → chunk-4L3P6DT5.mjs} +2 -2
  22. package/dist/chunk-4L3P6DT5.mjs.map +1 -0
  23. package/dist/{chunk-VFPLTKCU.mjs → chunk-4NPUASZR.mjs} +15 -4
  24. package/dist/chunk-4NPUASZR.mjs.map +1 -0
  25. package/dist/chunk-DIYW3M5D.mjs +5085 -0
  26. package/dist/chunk-DIYW3M5D.mjs.map +1 -0
  27. package/dist/chunk-FBC4R44J.mjs +1003 -0
  28. package/dist/chunk-FBC4R44J.mjs.map +1 -0
  29. package/dist/{chunk-CDTWTHZR.mjs → chunk-FF7K3FSO.mjs} +474 -168
  30. package/dist/chunk-FF7K3FSO.mjs.map +1 -0
  31. package/dist/chunk-HZUPSYW7.mjs +1104 -0
  32. package/dist/chunk-HZUPSYW7.mjs.map +1 -0
  33. package/dist/{chunk-TBQJOK2L.mjs → chunk-QODA5UKU.mjs} +321 -269
  34. package/dist/chunk-QODA5UKU.mjs.map +1 -0
  35. package/dist/chunk-YALPS44A.mjs +296 -0
  36. package/dist/chunk-YALPS44A.mjs.map +1 -0
  37. package/dist/{chunk-4XINDLAY.mjs → chunk-ZUWKAZ2I.mjs} +1963 -2178
  38. package/dist/chunk-ZUWKAZ2I.mjs.map +1 -0
  39. package/dist/cluster-binner.d.ts +5 -0
  40. package/dist/cluster-binner.d.ts.map +1 -1
  41. package/dist/components/camera.d.ts +1 -0
  42. package/dist/components/camera.d.ts.map +1 -1
  43. package/dist/components/cube-camera.d.ts +20 -0
  44. package/dist/components/cube-camera.d.ts.map +1 -0
  45. package/dist/components/directional-light.d.ts +11 -2
  46. package/dist/components/directional-light.d.ts.map +1 -1
  47. package/dist/components/directional-shadow-filter.d.ts +25 -0
  48. package/dist/components/directional-shadow-filter.d.ts.map +1 -0
  49. package/dist/components/index.d.ts +5 -0
  50. package/dist/components/index.d.ts.map +1 -1
  51. package/dist/components/light-helpers.d.ts +4 -0
  52. package/dist/components/light-helpers.d.ts.map +1 -1
  53. package/dist/components/light-probe.d.ts +9 -0
  54. package/dist/components/light-probe.d.ts.map +1 -0
  55. package/dist/components/rect-area-light.d.ts +12 -0
  56. package/dist/components/rect-area-light.d.ts.map +1 -0
  57. package/dist/components/reflection-probe.d.ts +17 -0
  58. package/dist/components/reflection-probe.d.ts.map +1 -0
  59. package/dist/components/scene-instance.d.ts +4 -0
  60. package/dist/components/scene-instance.d.ts.map +1 -1
  61. package/dist/components/spot-light.d.ts +3 -0
  62. package/dist/components/spot-light.d.ts.map +1 -1
  63. package/dist/construct-renderer.mjs +14836 -9620
  64. package/dist/construct-renderer.mjs.map +1 -1
  65. package/dist/device/gpu-residency.d.ts +8 -1
  66. package/dist/device/gpu-residency.d.ts.map +1 -1
  67. package/dist/device/lifecycle-transaction.d.ts +2 -0
  68. package/dist/device/lifecycle-transaction.d.ts.map +1 -0
  69. package/dist/environment/frame.d.ts.map +1 -1
  70. package/dist/environment/lifecycle.d.ts +5 -0
  71. package/dist/environment/lifecycle.d.ts.map +1 -1
  72. package/dist/errors/gpu-driven.d.ts +26 -0
  73. package/dist/errors/gpu-driven.d.ts.map +1 -0
  74. package/dist/errors/index.d.ts +1 -0
  75. package/dist/errors/index.d.ts.map +1 -1
  76. package/dist/errors/recover.d.ts +9 -1
  77. package/dist/errors/recover.d.ts.map +1 -1
  78. package/dist/errors/render.d.ts +166 -93
  79. package/dist/errors/render.d.ts.map +1 -1
  80. package/dist/extract/directional-shadow-projection.d.ts +23 -0
  81. package/dist/extract/directional-shadow-projection.d.ts.map +1 -0
  82. package/dist/extract/environment.d.ts +14 -0
  83. package/dist/extract/environment.d.ts.map +1 -1
  84. package/dist/extract/gpu-driven.d.ts +50 -0
  85. package/dist/extract/gpu-driven.d.ts.map +1 -0
  86. package/dist/extract/visibility.d.ts.map +1 -1
  87. package/dist/features/fullscreen.d.ts.map +1 -1
  88. package/dist/features/targets.d.ts.map +1 -1
  89. package/dist/features/types.d.ts +10 -0
  90. package/dist/features/types.d.ts.map +1 -1
  91. package/dist/fullscreen-post-process-pass.d.ts +13 -2
  92. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  93. package/dist/gpu-driven/batch-topology.d.ts +34 -0
  94. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  95. package/dist/gpu-driven/prepared-draw.d.ts +63 -0
  96. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -0
  97. package/dist/gpu-driven/production-raster.d.ts +97 -2
  98. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  99. package/dist/gpu-driven/view-gpu.d.ts +64 -1
  100. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  101. package/dist/gpu-scene-schema.d.ts +14 -0
  102. package/dist/gpu-scene-schema.d.ts.map +1 -1
  103. package/dist/gpu-scene.d.ts +8 -1
  104. package/dist/gpu-scene.d.ts.map +1 -1
  105. package/dist/gpu-usage.d.ts +0 -1
  106. package/dist/gpu-usage.d.ts.map +1 -1
  107. package/dist/hdrp-buffers.d.ts +21 -19
  108. package/dist/hdrp-buffers.d.ts.map +1 -1
  109. package/dist/ibl/IblPipelineCache.d.ts +4 -0
  110. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  111. package/dist/ibl/kernel-cache.d.ts +36 -0
  112. package/dist/ibl/kernel-cache.d.ts.map +1 -0
  113. package/dist/index.d.ts +39 -3
  114. package/dist/index.d.ts.map +1 -1
  115. package/dist/index.mjs +91 -6
  116. package/dist/index.mjs.map +1 -1
  117. package/dist/inspection-types.d.ts +214 -1
  118. package/dist/inspection-types.d.ts.map +1 -1
  119. package/dist/instances-derived-bounds.d.ts +50 -0
  120. package/dist/instances-derived-bounds.d.ts.map +1 -0
  121. package/dist/internal.d.ts +9 -0
  122. package/dist/internal.d.ts.map +1 -1
  123. package/dist/internal.mjs +23 -2
  124. package/dist/internal.mjs.map +1 -1
  125. package/dist/light-buffer-layout.d.ts +58 -140
  126. package/dist/light-buffer-layout.d.ts.map +1 -1
  127. package/dist/materials.d.ts.map +1 -1
  128. package/dist/mesh-material-bindings.d.ts +54 -0
  129. package/dist/mesh-material-bindings.d.ts.map +1 -1
  130. package/dist/pbr-pipeline.d.ts +38 -14
  131. package/dist/pbr-pipeline.d.ts.map +1 -1
  132. package/dist/pipeline/standard-forward-lane.d.ts +2 -1
  133. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  134. package/dist/pipeline/standard-lighting/errors.d.ts +4 -0
  135. package/dist/pipeline/standard-lighting/errors.d.ts.map +1 -0
  136. package/dist/pipeline/standard-lighting/graph.d.ts +24 -0
  137. package/dist/pipeline/standard-lighting/graph.d.ts.map +1 -0
  138. package/dist/pipeline/standard-lighting/inspection.d.ts +38 -0
  139. package/dist/pipeline/standard-lighting/inspection.d.ts.map +1 -0
  140. package/dist/pipeline/standard-lighting/layout.d.ts +28 -0
  141. package/dist/pipeline/standard-lighting/layout.d.ts.map +1 -0
  142. package/dist/pipeline/standard-lighting/light-frame.d.ts +33 -0
  143. package/dist/pipeline/standard-lighting/light-frame.d.ts.map +1 -0
  144. package/dist/pipeline/standard-lighting/membership.d.ts +14 -0
  145. package/dist/pipeline/standard-lighting/membership.d.ts.map +1 -0
  146. package/dist/pipeline/standard-lighting/prepare.d.ts +16 -0
  147. package/dist/pipeline/standard-lighting/prepare.d.ts.map +1 -0
  148. package/dist/pipeline/standard-lighting/topology.d.ts +45 -0
  149. package/dist/pipeline/standard-lighting/topology.d.ts.map +1 -0
  150. package/dist/pipeline/standard-lighting/transport.d.ts +36 -0
  151. package/dist/pipeline/standard-lighting/transport.d.ts.map +1 -0
  152. package/dist/pipeline/standard-pipeline.d.ts +4 -13
  153. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  154. package/dist/pipeline/standard-post.d.ts.map +1 -1
  155. package/dist/pipeline/standard-profile.d.ts +5 -26
  156. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  157. package/dist/pipeline-builder.d.ts +2 -0
  158. package/dist/pipeline-builder.d.ts.map +1 -1
  159. package/dist/pipeline-spec.d.ts +40 -7
  160. package/dist/pipeline-spec.d.ts.map +1 -1
  161. package/dist/plugin.d.ts.map +1 -1
  162. package/dist/point-shadow-inspection.d.ts +21 -0
  163. package/dist/point-shadow-inspection.d.ts.map +1 -0
  164. package/dist/prepare/extended-lighting/ltc-resources.d.ts +31 -0
  165. package/dist/prepare/extended-lighting/ltc-resources.d.ts.map +1 -0
  166. package/dist/prepare/extended-lighting/resources.d.ts +72 -0
  167. package/dist/prepare/extended-lighting/resources.d.ts.map +1 -0
  168. package/dist/prepare/extended-lighting/spot-modifiers.d.ts +42 -0
  169. package/dist/prepare/extended-lighting/spot-modifiers.d.ts.map +1 -0
  170. package/dist/prepare/extended-lighting/state.d.ts +24 -0
  171. package/dist/prepare/extended-lighting/state.d.ts.map +1 -0
  172. package/dist/record/frame-lighting.d.ts +33 -36
  173. package/dist/record/frame-lighting.d.ts.map +1 -1
  174. package/dist/record/frame-snapshot.d.ts +78 -24
  175. package/dist/record/frame-snapshot.d.ts.map +1 -1
  176. package/dist/record/frame-targets.d.ts +5 -0
  177. package/dist/record/frame-targets.d.ts.map +1 -1
  178. package/dist/record/frame.d.ts +16 -6
  179. package/dist/record/frame.d.ts.map +1 -1
  180. package/dist/record/gpu-pass-timing/contract.d.ts +96 -0
  181. package/dist/record/gpu-pass-timing/contract.d.ts.map +1 -0
  182. package/dist/record/gpu-pass-timing/errors.d.ts +18 -0
  183. package/dist/record/gpu-pass-timing/errors.d.ts.map +1 -0
  184. package/dist/record/gpu-pass-timing/index.d.ts +8 -0
  185. package/dist/record/gpu-pass-timing/index.d.ts.map +1 -0
  186. package/dist/record/gpu-pass-timing/parser.d.ts +11 -0
  187. package/dist/record/gpu-pass-timing/parser.d.ts.map +1 -0
  188. package/dist/record/gpu-pass-timing/session.d.ts +43 -0
  189. package/dist/record/gpu-pass-timing/session.d.ts.map +1 -0
  190. package/dist/record/gpu-timing.d.ts +20 -3
  191. package/dist/record/gpu-timing.d.ts.map +1 -1
  192. package/dist/record/helpers.d.ts +0 -20
  193. package/dist/record/helpers.d.ts.map +1 -1
  194. package/dist/record/main-pass-geometry.d.ts +6 -1
  195. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  196. package/dist/record/main-pass-material.d.ts +25 -2
  197. package/dist/record/main-pass-material.d.ts.map +1 -1
  198. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  199. package/dist/record/main-pass.d.ts +2 -0
  200. package/dist/record/main-pass.d.ts.map +1 -1
  201. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  202. package/dist/record/render-context.d.ts +98 -6
  203. package/dist/record/render-context.d.ts.map +1 -1
  204. package/dist/record/shadow-pass.d.ts.map +1 -1
  205. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  206. package/dist/record/typed-frame-graph.d.ts +119 -4
  207. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  208. package/dist/record/view-ubo.d.ts +7 -5
  209. package/dist/record/view-ubo.d.ts.map +1 -1
  210. package/dist/reflection/filter.d.ts +22 -0
  211. package/dist/reflection/filter.d.ts.map +1 -0
  212. package/dist/reflection/gpu-table.d.ts +25 -0
  213. package/dist/reflection/gpu-table.d.ts.map +1 -0
  214. package/dist/reflection/inspection.d.ts +10 -0
  215. package/dist/reflection/inspection.d.ts.map +1 -0
  216. package/dist/reflection/projection.d.ts +140 -0
  217. package/dist/reflection/projection.d.ts.map +1 -0
  218. package/dist/reflection/record-owner.d.ts +60 -0
  219. package/dist/reflection/record-owner.d.ts.map +1 -0
  220. package/dist/render-contract.d.ts +62 -14
  221. package/dist/render-contract.d.ts.map +1 -1
  222. package/dist/render-graph-primitives.d.ts +1 -0
  223. package/dist/render-graph-primitives.d.ts.map +1 -1
  224. package/dist/render-pipeline.d.ts +49 -2
  225. package/dist/render-pipeline.d.ts.map +1 -1
  226. package/dist/render-system-extract.d.ts +160 -31
  227. package/dist/render-system-extract.d.ts.map +1 -1
  228. package/dist/render-system.d.ts +28 -2
  229. package/dist/render-system.d.ts.map +1 -1
  230. package/dist/renderer.d.ts +43 -0
  231. package/dist/renderer.d.ts.map +1 -0
  232. package/dist/scene/probe-blend-record.d.ts +22 -0
  233. package/dist/scene/probe-blend-record.d.ts.map +1 -0
  234. package/dist/scene/probe-blend.d.ts +142 -0
  235. package/dist/scene/probe-blend.d.ts.map +1 -0
  236. package/dist/scene/render-scene-types.d.ts +0 -6
  237. package/dist/scene/render-scene-types.d.ts.map +1 -1
  238. package/dist/scene/render-scene.d.ts +117 -9
  239. package/dist/scene/render-scene.d.ts.map +1 -1
  240. package/dist/scene/visibility/bounds.d.ts +20 -0
  241. package/dist/scene/visibility/bounds.d.ts.map +1 -0
  242. package/dist/scene/visibility/budget.d.ts +16 -0
  243. package/dist/scene/visibility/budget.d.ts.map +1 -0
  244. package/dist/scene/visibility/facet.d.ts +73 -0
  245. package/dist/scene/visibility/facet.d.ts.map +1 -0
  246. package/dist/scene/visibility/gpu-frame-timing.d.ts +41 -0
  247. package/dist/scene/visibility/gpu-frame-timing.d.ts.map +1 -0
  248. package/dist/scene/visibility/gpu-lod.d.ts +46 -0
  249. package/dist/scene/visibility/gpu-lod.d.ts.map +1 -0
  250. package/dist/scene/visibility/inspection.d.ts +132 -0
  251. package/dist/scene/visibility/inspection.d.ts.map +1 -0
  252. package/dist/scene/visibility/lod-selector.d.ts +25 -0
  253. package/dist/scene/visibility/lod-selector.d.ts.map +1 -0
  254. package/dist/scene/visibility/occlusion-confidence.d.ts +81 -0
  255. package/dist/scene/visibility/occlusion-confidence.d.ts.map +1 -0
  256. package/dist/scene/visibility/occlusion-pass.d.ts +57 -0
  257. package/dist/scene/visibility/occlusion-pass.d.ts.map +1 -0
  258. package/dist/scene/visibility/occlusion-query-pool.d.ts +57 -0
  259. package/dist/scene/visibility/occlusion-query-pool.d.ts.map +1 -0
  260. package/dist/scene/visibility/occlusion-runtime.d.ts +96 -0
  261. package/dist/scene/visibility/occlusion-runtime.d.ts.map +1 -0
  262. package/dist/scene/visibility/types.d.ts +34 -0
  263. package/dist/scene/visibility/types.d.ts.map +1 -0
  264. package/dist/shadow-atlas.d.ts +3 -3
  265. package/dist/shadow-atlas.d.ts.map +1 -1
  266. package/dist/ssao-buffers.d.ts +3 -0
  267. package/dist/ssao-buffers.d.ts.map +1 -1
  268. package/dist/ssr/admission.d.ts +122 -0
  269. package/dist/ssr/admission.d.ts.map +1 -0
  270. package/dist/ssr/composition.d.ts +32 -0
  271. package/dist/ssr/composition.d.ts.map +1 -0
  272. package/dist/ssr/errors.d.ts +39 -0
  273. package/dist/ssr/errors.d.ts.map +1 -0
  274. package/dist/ssr/identity.d.ts +13 -0
  275. package/dist/ssr/identity.d.ts.map +1 -0
  276. package/dist/systems/skin-palette-allocator.d.ts +1 -1
  277. package/dist/targets/contracts.d.ts +66 -0
  278. package/dist/targets/contracts.d.ts.map +1 -0
  279. package/dist/targets/graph-projection.d.ts +29 -0
  280. package/dist/targets/graph-projection.d.ts.map +1 -0
  281. package/dist/targets/material-source.d.ts +34 -0
  282. package/dist/targets/material-source.d.ts.map +1 -0
  283. package/dist/targets/owner.d.ts +32 -0
  284. package/dist/targets/owner.d.ts.map +1 -0
  285. package/dist/targets/physical.d.ts +18 -0
  286. package/dist/targets/physical.d.ts.map +1 -0
  287. package/dist/targets/readback.d.ts +39 -0
  288. package/dist/targets/readback.d.ts.map +1 -0
  289. package/dist/temporal/frame-coordinator.d.ts +13 -0
  290. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  291. package/dist/temporal/frame.d.ts +2 -0
  292. package/dist/temporal/frame.d.ts.map +1 -1
  293. package/dist/temporal/index.mjs +6 -5
  294. package/dist/temporal/view.d.ts +7 -0
  295. package/dist/temporal/view.d.ts.map +1 -1
  296. package/dist/tilemap-chunk-extract-system.d.ts +1 -1
  297. package/dist/typed-render-graph-primitives.d.ts +5 -1
  298. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  299. package/dist/typed-shadow-passes.d.ts +1 -1
  300. package/dist/typed-shadow-passes.d.ts.map +1 -1
  301. package/dist/volume/passes.d.ts +9 -5
  302. package/dist/volume/passes.d.ts.map +1 -1
  303. package/package.json +20 -20
  304. package/src/__tests__/bloom-exact-zero.unit.test.ts +48 -19
  305. package/src/__tests__/bloom-lifecycle.integration.test.ts +41 -13
  306. package/src/__tests__/camera-target-consumption.unit.test.ts +53 -0
  307. package/src/__tests__/cluster-binner.unit.test.ts +35 -0
  308. package/src/__tests__/cluster-grid-default-surface.unit.test.ts +12 -2
  309. package/src/__tests__/cube-camera-scheduler.unit.test.ts +70 -0
  310. package/src/__tests__/cube-camera-single-submit.perf.test.ts +75 -0
  311. package/src/__tests__/cube-camera-view-matrices.unit.test.ts +41 -0
  312. package/src/__tests__/cube-camera-vocabulary.unit.test.ts +47 -0
  313. package/src/__tests__/cube-camera.integration.test.ts +42 -0
  314. package/src/__tests__/detached-inspection.integration.test.ts +6 -0
  315. package/src/__tests__/device-feature-admission.unit.test.ts +85 -0
  316. package/src/__tests__/direct-light-snapshot.unit.test.ts +62 -6
  317. package/src/__tests__/docs-gate-green.unit.test.ts +38 -0
  318. package/src/__tests__/environment-generation.integration.test.ts +16 -0
  319. package/src/__tests__/evidence-identity.ts +13 -0
  320. package/src/__tests__/evidence-identity.unit.test.ts +24 -0
  321. package/src/__tests__/extended-lighting-recovery.browser.test.ts +14 -0
  322. package/src/__tests__/extended-lighting-recovery.dawn.test.ts +14 -0
  323. package/src/__tests__/extended-lighting-recovery.integration.test.ts +81 -0
  324. package/src/__tests__/extended-lighting-resources.unit.test.ts +51 -0
  325. package/src/__tests__/extended-lighting-zero-feature.integration.test.ts +52 -0
  326. package/src/__tests__/factory-contract.integration.test.ts +288 -29
  327. package/src/__tests__/fog-component.unit.test.ts +67 -0
  328. package/src/__tests__/fog.integration.test.ts +86 -0
  329. package/src/__tests__/frame-observation.contract.test.ts +15 -0
  330. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +37 -0
  331. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +146 -0
  332. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +10 -8
  333. package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +18 -1
  334. package/src/__tests__/gpu-driven-production.integration.test.ts +579 -17
  335. package/src/__tests__/gpu-driven-scaling.unit.test.ts +66 -2
  336. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +26 -1
  337. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +101 -6
  338. package/src/__tests__/gpu-driven-view.browser.test.ts +3 -3
  339. package/src/__tests__/gpu-driven-view.dawn.test.ts +3 -3
  340. package/src/__tests__/gpu-driven-view.unit.test.ts +50 -0
  341. package/src/__tests__/gpu-lod-evidence.ts +188 -0
  342. package/src/__tests__/gpu-lod-fallback.integration.test.ts +10 -0
  343. package/src/__tests__/gpu-lod-indirect.integration.test.ts +40 -0
  344. package/src/__tests__/gpu-lod-parity.dawn.test.ts +29 -0
  345. package/src/__tests__/gpu-lod-readiness.integration.test.ts +52 -0
  346. package/src/__tests__/gpu-lod-schema.unit.test.ts +66 -0
  347. package/src/__tests__/gpu-lod-selector.unit.test.ts +28 -0
  348. package/src/__tests__/gpu-lod-silhouette.browser.test.ts +13 -0
  349. package/src/__tests__/gpu-pass-timing-browser-runner.ts +281 -0
  350. package/src/__tests__/gpu-pass-timing-coexistence.integration.test.ts +80 -0
  351. package/src/__tests__/gpu-pass-timing-contract.unit.test.ts +243 -0
  352. package/src/__tests__/gpu-pass-timing-exact-zero.unit.test.ts +131 -0
  353. package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +230 -0
  354. package/src/__tests__/gpu-pass-timing-observation.unit.test.ts +233 -0
  355. package/src/__tests__/gpu-pass-timing-session.unit.test.ts +438 -0
  356. package/src/__tests__/gpu-pass-timing.browser.test.ts +26 -0
  357. package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +125 -0
  358. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +66 -1
  359. package/src/__tests__/gpu-scene.dawn.test.ts +8 -1
  360. package/src/__tests__/gpu-scene.unit.test.ts +49 -3
  361. package/src/__tests__/hdrp-group2-visibility.unit.test.ts +24 -0
  362. package/src/__tests__/instances-culling.integration.test.ts +94 -0
  363. package/src/__tests__/instances-derived-bounds.unit.test.ts +118 -0
  364. package/src/__tests__/light-buffer-layout.unit.test.ts +113 -3
  365. package/src/__tests__/light-inspection.unit.test.ts +55 -0
  366. package/src/__tests__/light-resource-error.unit.test.ts +43 -0
  367. package/src/__tests__/lighting-scene-roundtrip.integration.test.ts +109 -0
  368. package/src/__tests__/lod-bounds.unit.test.ts +42 -0
  369. package/src/__tests__/lod-cpu-lane.integration.test.ts +55 -0
  370. package/src/__tests__/lod-cpu-no-change.perf.test.ts +19 -0
  371. package/src/__tests__/lod-gpu-frame-timing.unit.test.ts +49 -0
  372. package/src/__tests__/lod-multi-view.integration.test.ts +63 -0
  373. package/src/__tests__/lod-occlusion-device-loss.integration.test.ts +27 -0
  374. package/src/__tests__/lod-occlusion-final-decision.integration.test.ts +47 -0
  375. package/src/__tests__/lod-occlusion-inspection.integration.test.ts +217 -0
  376. package/src/__tests__/lod-occlusion-inspection.schema.test-d.ts +14 -0
  377. package/src/__tests__/lod-occlusion-inspection.unit.test.ts +72 -0
  378. package/src/__tests__/lod-occlusion-visual-evidence.ts +91 -0
  379. package/src/__tests__/lod-occlusion.browser.test.ts +15 -0
  380. package/src/__tests__/lod-occlusion.dawn.test.ts +20 -0
  381. package/src/__tests__/lod-selector.profile.test.ts +35 -0
  382. package/src/__tests__/lod-selector.unit.test.ts +68 -0
  383. package/src/__tests__/lod-visibility-identity.unit.test.ts +198 -0
  384. package/src/__tests__/lod-visibility-lifecycle.integration.test.ts +132 -0
  385. package/src/__tests__/ltc-resources.unit.test.ts +32 -0
  386. package/src/__tests__/material-contract-inventory.unit.test.ts +17 -0
  387. package/src/__tests__/material-observation.integration.test.ts +101 -0
  388. package/src/__tests__/occlusion-confidence.unit.test.ts +168 -0
  389. package/src/__tests__/occlusion-invalidation.integration.test.ts +37 -0
  390. package/src/__tests__/occlusion-pass-routing.unit.test.ts +16 -0
  391. package/src/__tests__/occlusion-pass.dawn.test.ts +20 -0
  392. package/src/__tests__/occlusion-pass.integration.test.ts +43 -0
  393. package/src/__tests__/occlusion-pass.rhi-null.test.ts +22 -0
  394. package/src/__tests__/occlusion-query-pool.rhi-null.test.ts +21 -0
  395. package/src/__tests__/occlusion-query-pool.unit.test.ts +95 -0
  396. package/src/__tests__/occlusion-query-ticket.integration.test.ts +47 -0
  397. package/src/__tests__/occlusion-query.dawn.test.ts +16 -0
  398. package/src/__tests__/occlusion-query.evidence.ts +178 -0
  399. package/src/__tests__/occlusion-query.rhi-null.test.ts +31 -0
  400. package/src/__tests__/occlusion-runtime.unit.test.ts +120 -0
  401. package/src/__tests__/pbr-view-layout.unit.test.ts +16 -0
  402. package/src/__tests__/point-shadow-inspection.unit.test.ts +60 -0
  403. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +196 -0
  404. package/src/__tests__/probe-bindings.unit.test.ts +200 -0
  405. package/src/__tests__/probe-blend-numeric.unit.test.ts +67 -0
  406. package/src/__tests__/probe-blend-oracle.unit.test.ts +136 -0
  407. package/src/__tests__/probe-capacity.integration.test.ts +97 -0
  408. package/src/__tests__/probe-recovery.integration.test.ts +104 -0
  409. package/src/__tests__/probe-scene-dirty.integration.test.ts +211 -0
  410. package/src/__tests__/profiler-phase-catalog.test.ts +4 -1
  411. package/src/__tests__/profiler-phase-token.test.ts +1 -0
  412. package/src/__tests__/public-surface.test-d.ts +10 -0
  413. package/src/__tests__/rect-area-boundary.unit.test.ts +24 -0
  414. package/src/__tests__/reflection-fallback-graph.unit.test.ts +67 -0
  415. package/src/__tests__/reflection-fallback-inspection.unit.test.ts +77 -0
  416. package/src/__tests__/reflection-fallback-lifecycle.integration.test.ts +21 -0
  417. package/src/__tests__/reflection-fallback-projection.unit.test.ts +90 -0
  418. package/src/__tests__/reflection-fallback-source.unit.test.ts +32 -0
  419. package/src/__tests__/reflection-probe-authoring.unit.test.ts +71 -0
  420. package/src/__tests__/reflection-probe-filter.unit.test.ts +54 -0
  421. package/src/__tests__/reflection-probe-ibl-topology.unit.test.ts +45 -0
  422. package/src/__tests__/reflection-probe-owner-placement.unit.test.ts +39 -0
  423. package/src/__tests__/reflection-probe-pass-encode.integration.test.ts +101 -0
  424. package/src/__tests__/reflection-probe-performance.perf.test.ts +60 -0
  425. package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +120 -0
  426. package/src/__tests__/reflection-probe-recovery.integration.test.ts +55 -0
  427. package/src/__tests__/reflection-probe-selection.unit.test.ts +46 -0
  428. package/src/__tests__/render-error-code-owner.test-d.ts +19 -3
  429. package/src/__tests__/render-feature-docs.unit.test.ts +12 -7
  430. package/src/__tests__/render-graph-fallback.integration.test.ts +24 -0
  431. package/src/__tests__/render-perf/extended-lighting.bench.test.ts +66 -0
  432. package/src/__tests__/render-scene-projection.unit.test.ts +447 -18
  433. package/src/__tests__/render-target-admission.unit.test.ts +80 -0
  434. package/src/__tests__/render-target-graph-projection.unit.test.ts +102 -0
  435. package/src/__tests__/render-target-inspection.unit.test.ts +52 -0
  436. package/src/__tests__/render-target-material-source.test-d.ts +30 -0
  437. package/src/__tests__/render-target-material-source.unit.test.ts +97 -0
  438. package/src/__tests__/render-target-owner-placement.unit.test.ts +203 -0
  439. package/src/__tests__/render-target-owner.unit.test.ts +122 -0
  440. package/src/__tests__/render-target-probe-soak.perf.test.ts +94 -0
  441. package/src/__tests__/render-target-public-schema.json +107 -0
  442. package/src/__tests__/render-target-public-schema.unit.test.ts +91 -0
  443. package/src/__tests__/render-target-public-surface.test-d.ts +83 -0
  444. package/src/__tests__/render-target-readback.integration.test.ts +90 -0
  445. package/src/__tests__/render-target-recovery.integration.test.ts +85 -0
  446. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +124 -0
  447. package/src/__tests__/renderer-lifecycle.integration.test.ts +14 -0
  448. package/src/__tests__/shader-stage-surface.unit.test.ts +19 -4
  449. package/src/__tests__/skin-motion-regression.unit.test.ts +154 -0
  450. package/src/__tests__/skinned-shadow-caster.test.ts +13 -4
  451. package/src/__tests__/spot-modifier-projection.unit.test.ts +70 -0
  452. package/src/__tests__/ssr-admission-matrix.integration.test.ts +206 -0
  453. package/src/__tests__/ssr-composition.unit.test.ts +46 -0
  454. package/src/__tests__/ssr-fallback-zero-work.bench.test.ts +94 -0
  455. package/src/__tests__/ssr-recovery-errors.unit.test.ts +58 -0
  456. package/src/__tests__/standard-cluster-capability.integration.test.ts +63 -0
  457. package/src/__tests__/standard-cluster-transport.unit.test.ts +121 -0
  458. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +299 -0
  459. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +15 -5
  460. package/src/__tests__/standard-lighting-inspection.integration.test.ts +138 -0
  461. package/src/__tests__/standard-lighting-ssot.unit.test.ts +18 -0
  462. package/src/__tests__/standard-lighting-write.unit.test.ts +441 -0
  463. package/src/__tests__/standard-lighting.integration.test.ts +67 -0
  464. package/src/__tests__/standard-pipeline.dawn.test.ts +206 -5
  465. package/src/__tests__/standard-pipeline.integration.test.ts +181 -150
  466. package/src/__tests__/standard-probe-binding.unit.test.ts +25 -0
  467. package/src/__tests__/standard-profile-oracle.unit.test.ts +23 -38
  468. package/src/__tests__/temporal-fallback-generation.integration.test.ts +16 -0
  469. package/src/__tests__/temporal-view.unit.test.ts +3 -3
  470. package/src/__tests__/transmission-prewarm.unit.test.ts +69 -0
  471. package/src/__tests__/typed-pipeline-topology.unit.test.ts +395 -14
  472. package/src/__tests__/urp-pipeline-targets.unit.test.ts +2 -2
  473. package/src/__tests__/visibility-budget.integration.test.ts +140 -0
  474. package/src/__tests__/visibility-budget.unit.test.ts +70 -0
  475. package/src/__tests__/visibility-extract.integration.test.ts +11 -6
  476. package/src/__tests__/visibility-resolver.unit.test.ts +15 -0
  477. package/src/__tests__/volumetric-fog-point-spot-accumulation.integration.test.ts +6 -3
  478. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +31 -28
  479. package/src/assembly/backend-contract.ts +13 -0
  480. package/src/assembly/device-feature-admission.ts +80 -0
  481. package/src/assembly/directional-shadow-inspection.ts +122 -0
  482. package/src/assembly/factory.ts +1411 -366
  483. package/src/assembly/host-contract.ts +35 -0
  484. package/src/assembly/render-target-host.ts +847 -0
  485. package/src/assets/asset-decoders.ts +1 -1
  486. package/src/assets/render-asset-port.ts +7 -1
  487. package/src/capture/cube-views.ts +69 -0
  488. package/src/capture/scheduler.ts +265 -0
  489. package/src/cluster-binner.ts +31 -0
  490. package/src/components/__tests__/lighting-authoring.unit.test.ts +39 -0
  491. package/src/components/__tests__/rect-area-light.unit.test.ts +33 -0
  492. package/src/components/__tests__/schema-contract.unit.test.ts +12 -0
  493. package/src/components/__tests__/schema-parity.unit.test.ts +9 -0
  494. package/src/components/camera.ts +4 -0
  495. package/src/components/cube-camera.ts +52 -0
  496. package/src/components/directional-light.ts +22 -2
  497. package/src/components/directional-shadow-filter.ts +57 -0
  498. package/src/components/index.ts +5 -0
  499. package/src/components/light-helpers.ts +133 -8
  500. package/src/components/light-probe.ts +13 -0
  501. package/src/components/rect-area-light.ts +15 -0
  502. package/src/components/reflection-probe.ts +49 -0
  503. package/src/components/scene-instance.ts +6 -0
  504. package/src/components/spot-light.ts +3 -0
  505. package/src/device/__tests__/extended-lighting-recovery.unit.test.ts +24 -0
  506. package/src/device/gpu-residency.ts +140 -9
  507. package/src/device/lifecycle-transaction.ts +12 -0
  508. package/src/environment/frame.ts +6 -24
  509. package/src/environment/lifecycle.ts +20 -1
  510. package/src/errors/gpu-driven.ts +92 -0
  511. package/src/errors/index.ts +1 -0
  512. package/src/errors/recover.ts +32 -0
  513. package/src/errors/render.ts +341 -143
  514. package/src/extract/camera.ts +3 -3
  515. package/src/extract/directional-shadow-projection.ts +61 -0
  516. package/src/extract/environment.ts +57 -0
  517. package/src/extract/gpu-driven.ts +108 -0
  518. package/src/extract/visibility.ts +2 -1
  519. package/src/features/fullscreen.ts +3 -0
  520. package/src/features/targets.ts +4 -1
  521. package/src/features/types.ts +10 -0
  522. package/src/fullscreen-post-process-pass.ts +43 -2
  523. package/src/gpu-driven/batch-topology.ts +207 -28
  524. package/src/gpu-driven/prepared-draw.ts +208 -0
  525. package/src/gpu-driven/production-raster.ts +953 -43
  526. package/src/gpu-driven/view-gpu.ts +411 -29
  527. package/src/gpu-scene-schema.ts +13 -0
  528. package/src/gpu-scene.ts +140 -64
  529. package/src/gpu-usage.ts +0 -1
  530. package/src/hdrp-buffers.ts +169 -63
  531. package/src/ibl/IblPipelineCache.ts +11 -0
  532. package/src/ibl/kernel-cache.ts +88 -0
  533. package/src/index.ts +222 -0
  534. package/src/inspection-types.ts +276 -1
  535. package/src/instances-derived-bounds.ts +171 -0
  536. package/src/internal.ts +38 -0
  537. package/src/light-buffer-layout.ts +155 -310
  538. package/src/materials.ts +16 -2
  539. package/src/mesh-material-bindings.ts +132 -0
  540. package/src/pbr-pipeline.ts +255 -60
  541. package/src/pipeline/standard-forward-lane.ts +93 -16
  542. package/src/pipeline/standard-lighting/errors.ts +6 -0
  543. package/src/pipeline/standard-lighting/graph.ts +158 -0
  544. package/src/pipeline/standard-lighting/inspection.ts +88 -0
  545. package/src/pipeline/standard-lighting/layout.ts +31 -0
  546. package/src/pipeline/standard-lighting/light-frame.ts +35 -0
  547. package/src/pipeline/standard-lighting/membership.ts +43 -0
  548. package/src/pipeline/standard-lighting/prepare.ts +37 -0
  549. package/src/pipeline/standard-lighting/topology.ts +120 -0
  550. package/src/pipeline/standard-lighting/transport.ts +78 -0
  551. package/src/pipeline/standard-pipeline.ts +124 -193
  552. package/src/pipeline/standard-post.ts +26 -7
  553. package/src/pipeline/standard-profile.ts +17 -47
  554. package/src/pipeline-builder.ts +5 -2
  555. package/src/pipeline-spec.ts +95 -21
  556. package/src/plugin.ts +4 -0
  557. package/src/point-shadow-inspection.ts +55 -0
  558. package/src/prepare/__tests__/extended-lighting-capability.unit.test.ts +56 -0
  559. package/src/prepare/extended-lighting/ltc-resources.ts +136 -0
  560. package/src/prepare/extended-lighting/resources.ts +389 -0
  561. package/src/prepare/extended-lighting/spot-modifiers.ts +194 -0
  562. package/src/prepare/extended-lighting/state.ts +92 -0
  563. package/src/record/__tests__/gpu-timing.unit.test.ts +177 -0
  564. package/src/record/__tests__/temporal-payload.unit.test.ts +64 -1
  565. package/src/record/__tests__/transparent-group2-selection.unit.test.ts +73 -0
  566. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +20 -1
  567. package/src/record/__tests__/view-ubo-layout.unit.test.ts +40 -0
  568. package/src/record/frame-lighting.ts +591 -452
  569. package/src/record/frame-snapshot.ts +92 -39
  570. package/src/record/frame-targets.ts +17 -0
  571. package/src/record/frame.ts +662 -158
  572. package/src/record/gpu-pass-timing/contract.ts +180 -0
  573. package/src/record/gpu-pass-timing/errors.ts +34 -0
  574. package/src/record/gpu-pass-timing/index.ts +37 -0
  575. package/src/record/gpu-pass-timing/parser.ts +97 -0
  576. package/src/record/gpu-pass-timing/session.ts +938 -0
  577. package/src/record/gpu-timing.ts +112 -39
  578. package/src/record/helpers.ts +0 -58
  579. package/src/record/main-pass-geometry.ts +324 -119
  580. package/src/record/main-pass-material.ts +103 -10
  581. package/src/record/main-pass-sprite-draws.ts +99 -103
  582. package/src/record/main-pass.ts +71 -15
  583. package/src/record/mesh-ssbo.ts +47 -36
  584. package/src/record/render-context.ts +136 -3
  585. package/src/record/shadow-pass.ts +83 -68
  586. package/src/record/skybox-post-pass.ts +20 -4
  587. package/src/record/typed-frame-graph.ts +1034 -43
  588. package/src/record/view-ubo.ts +72 -47
  589. package/src/reflection/filter.ts +81 -0
  590. package/src/reflection/gpu-table.ts +44 -0
  591. package/src/reflection/inspection.ts +67 -0
  592. package/src/reflection/projection.ts +476 -0
  593. package/src/reflection/record-owner.ts +1283 -0
  594. package/src/render-contract.ts +93 -10
  595. package/src/render-graph-primitives.ts +9 -4
  596. package/src/render-pipeline.ts +122 -2
  597. package/src/render-system-extract.ts +1041 -225
  598. package/src/render-system.ts +1310 -85
  599. package/src/renderer.ts +222 -0
  600. package/src/scene/__tests__/changed-block-summary.candidate.test.ts +36 -0
  601. package/src/scene/probe-blend-record.ts +54 -0
  602. package/src/scene/probe-blend.ts +813 -0
  603. package/src/scene/render-scene-types.ts +0 -7
  604. package/src/scene/render-scene.ts +942 -171
  605. package/src/scene/visibility/bounds.ts +57 -0
  606. package/src/scene/visibility/budget.ts +40 -0
  607. package/src/scene/visibility/facet.ts +400 -0
  608. package/src/scene/visibility/gpu-frame-timing.ts +101 -0
  609. package/src/scene/visibility/gpu-lod.ts +119 -0
  610. package/src/scene/visibility/inspection.ts +313 -0
  611. package/src/scene/visibility/lod-selector.ts +84 -0
  612. package/src/scene/visibility/occlusion-confidence.ts +478 -0
  613. package/src/scene/visibility/occlusion-pass.ts +165 -0
  614. package/src/scene/visibility/occlusion-query-pool.ts +178 -0
  615. package/src/scene/visibility/occlusion-runtime.ts +672 -0
  616. package/src/scene/visibility/types.ts +50 -0
  617. package/src/shadow-atlas.ts +5 -5
  618. package/src/ssao-buffers.ts +9 -2
  619. package/src/ssr/admission.ts +451 -0
  620. package/src/ssr/composition.ts +73 -0
  621. package/src/ssr/errors.ts +76 -0
  622. package/src/ssr/identity.ts +12 -0
  623. package/src/systems/skin-palette-allocator.ts +1 -1
  624. package/src/targets/contracts.ts +182 -0
  625. package/src/targets/graph-projection.ts +169 -0
  626. package/src/targets/material-source.ts +143 -0
  627. package/src/targets/owner.ts +214 -0
  628. package/src/targets/physical.ts +18 -0
  629. package/src/targets/readback.ts +153 -0
  630. package/src/temporal/frame-coordinator.ts +26 -0
  631. package/src/temporal/frame.ts +14 -1
  632. package/src/temporal/view.ts +11 -0
  633. package/src/tilemap-chunk-extract-system.ts +4 -4
  634. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +59 -20
  635. package/src/typed-render-graph-primitives.ts +53 -3
  636. package/src/typed-shadow-passes.ts +46 -40
  637. package/src/volume/passes.ts +61 -58
  638. package/dist/.tsbuildinfo +0 -1
  639. package/dist/chunk-4XINDLAY.mjs.map +0 -1
  640. package/dist/chunk-CDTWTHZR.mjs.map +0 -1
  641. package/dist/chunk-M2MP4ZOU.mjs +0 -73
  642. package/dist/chunk-M2MP4ZOU.mjs.map +0 -1
  643. package/dist/chunk-PCHBPYML.mjs.map +0 -1
  644. package/dist/chunk-TBQJOK2L.mjs.map +0 -1
  645. package/dist/chunk-VFPLTKCU.mjs.map +0 -1
@@ -325,6 +325,8 @@ export function isMeshSsboDevMode(): boolean {
325
325
  * @internal
326
326
  */
327
327
  let _meshSsboScratch = new Uint8Array(0);
328
+ /** @internal */
329
+ let _meshSsboScratchFloats = new Float32Array(0);
328
330
 
329
331
  /**
330
332
  * feat-20260704 M3/w21: per-renderable `entity_world` upload (batched). All N
@@ -358,60 +360,69 @@ export function uploadMeshSsboBatch(
358
360
  // Grow the module-scoped scratch monotonically; zero the used range.
359
361
  if (_meshSsboScratch.length < neededBytes) {
360
362
  _meshSsboScratch = new Uint8Array(neededBytes);
363
+ _meshSsboScratchFloats = new Float32Array(_meshSsboScratch.buffer);
361
364
  } else {
362
365
  _meshSsboScratch.fill(0, 0, neededBytes);
363
366
  }
364
367
  const normalMatrixScratch = mat3.create();
368
+ const strideFloats = MESH_PER_ENTITY_STRIDE / Float32Array.BYTES_PER_ELEMENT;
365
369
  for (let i = 0; i < slotCount; i++) {
366
370
  const entry = validatedOrdered[i];
367
371
  if (entry === undefined) continue;
368
- // Float32Array view into this entity's 256-byte slot (current world,
369
- // normal, previous world, and reactive metadata use 45 floats; the
370
- // remaining padding stays zero). Byte offset i*256 is always
371
- // 4-byte aligned since MESH_PER_ENTITY_STRIDE=256 is divisible by 4.
372
- const slot = new Float32Array(_meshSsboScratch.buffer, i * MESH_PER_ENTITY_STRIDE, 48);
372
+ // Address the reusable flat view directly. Constructing one typed-array
373
+ // wrapper per visible entity made this otherwise contiguous upload create
374
+ // tens of thousands of short-lived JS objects every frame.
375
+ const slot = i * strideFloats;
373
376
  const isFoldHead = foldDispatchPlan?.headBuckets.has(i) === true;
374
377
  if (isFoldHead) {
375
378
  // identity mat4
376
- slot[0] = 1;
377
- slot[5] = 1;
378
- slot[10] = 1;
379
- slot[15] = 1;
379
+ _meshSsboScratchFloats[slot] = 1;
380
+ _meshSsboScratchFloats[slot + 5] = 1;
381
+ _meshSsboScratchFloats[slot + 10] = 1;
382
+ _meshSsboScratchFloats[slot + 15] = 1;
380
383
  // identity mat3 normal (cols at slot offsets 16/20/24)
381
- slot[16] = 1;
382
- slot[20] = 1;
383
- slot[24] = 1;
384
+ _meshSsboScratchFloats[slot + 16] = 1;
385
+ _meshSsboScratchFloats[slot + 20] = 1;
386
+ _meshSsboScratchFloats[slot + 24] = 1;
384
387
  // Fold heads use the instance storage path; keep the mesh temporal
385
388
  // fields deterministic for shader variants that still read the slot.
386
- slot[28] = 1;
387
- slot[33] = 1;
388
- slot[38] = 1;
389
- slot[43] = 1;
390
- slot[44] = 1;
389
+ _meshSsboScratchFloats[slot + 28] = 1;
390
+ _meshSsboScratchFloats[slot + 33] = 1;
391
+ _meshSsboScratchFloats[slot + 38] = 1;
392
+ _meshSsboScratchFloats[slot + 43] = 1;
393
+ _meshSsboScratchFloats[slot + 44] = 1;
391
394
  } else {
392
395
  const worldFromLocal = entry.source.transform.world;
393
- for (let k = 0; k < 16; k++) slot[k] = worldFromLocal[k] ?? 0;
396
+ for (let k = 0; k < 16; k++) _meshSsboScratchFloats[slot + k] = worldFromLocal[k] ?? 0;
394
397
  const normal = mat3.normalMatrix(normalMatrixScratch, worldFromLocal);
395
- slot[16] = normal[0] ?? 0;
396
- slot[17] = normal[1] ?? 0;
397
- slot[18] = normal[2] ?? 0;
398
- slot[20] = normal[3] ?? 0;
399
- slot[21] = normal[4] ?? 0;
400
- slot[22] = normal[5] ?? 0;
401
- slot[24] = normal[6] ?? 0;
402
- slot[25] = normal[7] ?? 0;
403
- slot[26] = normal[8] ?? 0;
398
+ _meshSsboScratchFloats[slot + 16] = normal[0] ?? 0;
399
+ _meshSsboScratchFloats[slot + 17] = normal[1] ?? 0;
400
+ _meshSsboScratchFloats[slot + 18] = normal[2] ?? 0;
401
+ _meshSsboScratchFloats[slot + 20] = normal[3] ?? 0;
402
+ _meshSsboScratchFloats[slot + 21] = normal[4] ?? 0;
403
+ _meshSsboScratchFloats[slot + 22] = normal[5] ?? 0;
404
+ _meshSsboScratchFloats[slot + 24] = normal[6] ?? 0;
405
+ _meshSsboScratchFloats[slot + 25] = normal[7] ?? 0;
406
+ _meshSsboScratchFloats[slot + 26] = normal[8] ?? 0;
404
407
  const previousWorld = entry.source.temporal?.previousTransform.world ?? worldFromLocal;
405
- for (let k = 0; k < 16; k++) slot[28 + k] = previousWorld[k] ?? 0;
406
- const reactiveMaterial = entry.source.materials.some(
407
- (material) =>
408
+ for (let k = 0; k < 16; k++) {
409
+ _meshSsboScratchFloats[slot + 28 + k] = previousWorld[k] ?? 0;
410
+ }
411
+ let reactiveMaterial = false;
412
+ for (const material of entry.source.materials) {
413
+ const shader = material.materialShaderId;
414
+ if (
408
415
  material.transparent === true ||
409
- material.materialShaderId === 'forgeax::sprite' ||
410
- material.materialShaderId === 'forgeax::sprite-lit' ||
411
- (material.materialShaderId !== undefined &&
412
- !material.materialShaderId.startsWith('forgeax::')),
413
- );
414
- slot[44] = entry.source.temporal?.reactive === true || reactiveMaterial ? 1 : 0;
416
+ shader === 'forgeax::sprite' ||
417
+ shader === 'forgeax::sprite-lit' ||
418
+ (shader !== undefined && !shader.startsWith('forgeax::'))
419
+ ) {
420
+ reactiveMaterial = true;
421
+ break;
422
+ }
423
+ }
424
+ _meshSsboScratchFloats[slot + 44] =
425
+ entry.source.temporal?.reactive === true || reactiveMaterial ? 1 : 0;
415
426
  }
416
427
  }
417
428
  if (neededBytes > 0) {
@@ -11,6 +11,7 @@ import type {
11
11
  PipelineLayout,
12
12
  Result,
13
13
  RhiCanvasContext,
14
+ RhiCommandEncoder,
14
15
  RhiDevice,
15
16
  RenderPipeline as RhiRenderPipeline,
16
17
  Sampler,
@@ -19,7 +20,7 @@ import type {
19
20
  TextureView,
20
21
  } from '@forgeax/engine-rhi';
21
22
  import { err, ok, RhiError } from '@forgeax/engine-rhi';
22
- import type { MaterialRuntimeArtifact } from '@forgeax/engine-shader';
23
+ import type { MaterialRuntimeArtifact, MaterialShaderArtifact } from '@forgeax/engine-shader';
23
24
  import type {
24
25
  MaterialRenderState,
25
26
  ParamSchemaEntry,
@@ -41,10 +42,21 @@ import {
41
42
  import type { SkylightFallback } from '../ibl/skylight-bind-group';
42
43
  import type { BloomInspection } from '../inspection-types';
43
44
  import type { HealthListenerRegistry, RhiErrorListenerRegistry } from '../lifecycle';
45
+ import type { PipelineGroup2Contract } from '../pbr-pipeline';
46
+ import type { StandardTopologyInputValue } from '../pipeline/standard-lighting/topology';
44
47
  import type { StandardProfile } from '../pipeline/standard-profile';
45
48
  import type { PipelineBuilderShaderModuleFactory } from '../pipeline-builder';
46
49
  import type { PointsLinesInspection } from '../points-lines/inspection';
47
50
  import type { PointsLinesRecordPlan } from '../points-lines/record';
51
+ import type { ReflectionProbeTable } from '../reflection/gpu-table';
52
+ import type { ReflectionProbeSelectionResult } from '../reflection/projection';
53
+ import type { SsrAdmissionIdentity } from '../ssr/identity';
54
+ import type { GpuPassTimingReason } from './gpu-pass-timing/errors';
55
+ import type {
56
+ GpuPassTimingCapture,
57
+ GpuPassTimingFrameIdentity,
58
+ GpuPassTimingSession,
59
+ } from './gpu-pass-timing/session';
48
60
 
49
61
  export interface PointsLinesRecordSubmission {
50
62
  readonly plan: PointsLinesRecordPlan;
@@ -53,6 +65,44 @@ export interface PointsLinesRecordSubmission {
53
65
  readonly layoutProjection: VertexLayoutProjection;
54
66
  }
55
67
 
68
+ export interface ReflectionProbeRecordState {
69
+ readonly table: ReflectionProbeTable;
70
+ readonly selections: ReadonlyMap<string, ReflectionProbeSelectionResult>;
71
+ readonly graph: import('./typed-frame-graph').ReflectionProbeGraphState;
72
+ /** Detached committed fallback projections joined by main-pass renderable key. */
73
+ readonly fallbackProjections?: ReadonlyMap<
74
+ string,
75
+ import('../inspection-types').ReflectionFallbackReceipt
76
+ >;
77
+ /** Demand is derived from this frame's renderable/source selection. */
78
+ readonly fallbackDemand?: boolean;
79
+ /** True when at least one selected row must prove a non-zero readback. */
80
+ readonly fallbackHasNonNeutral?: boolean;
81
+ readonly completeSubmission: (
82
+ submitted: boolean,
83
+ completed?: Promise<unknown>,
84
+ fallbackOutput?: {
85
+ readonly format: TextureFormat;
86
+ readonly size: { readonly width: number; readonly height: number };
87
+ readonly frameId: number;
88
+ readonly graphGeneration: number;
89
+ readonly textureIdentity: number;
90
+ readonly readback?: Promise<{
91
+ readonly linearHdr: readonly [number, number, number, number];
92
+ readonly hash: string;
93
+ readonly graphGeneration: number;
94
+ readonly textureIdentity: number;
95
+ }>;
96
+ },
97
+ fallbackRequested?: boolean,
98
+ ) => Promise<void>;
99
+ }
100
+
101
+ export interface MaterialShaderPipelineEntry {
102
+ readonly pipeline: RhiRenderPipeline;
103
+ readonly group2Contract: PipelineGroup2Contract;
104
+ }
105
+
56
106
  import type {
57
107
  RenderDebugOverlay,
58
108
  RenderPipelineContext,
@@ -66,6 +116,8 @@ import type {
66
116
  SkylightSnapshot,
67
117
  } from '../render-system-extract';
68
118
  import type { SkinPaletteAllocator } from '../systems/skin-palette-allocator';
119
+ import type { RenderTarget } from '../targets/contracts';
120
+ import type { RenderTargetPhysical } from '../targets/physical';
69
121
  import type {
70
122
  BindGroupCounts,
71
123
  BloomFrameReceipts,
@@ -78,12 +130,18 @@ import type { FoldDispatchPlan } from './mesh-ssbo';
78
130
 
79
131
  export interface RenderSystemRuntime {
80
132
  readonly device: RhiDevice;
133
+ /** Internal backend-fixture hook evaluated at the submit transaction edge. */
134
+ readonly beforeSubmit?: ((device: RhiDevice) => RhiError | undefined) | undefined;
81
135
  readonly deviceScope: DeviceScope;
82
136
  readonly errorRegistry: RhiErrorListenerRegistry;
83
137
  readonly debugOverlay?: RenderDebugOverlay | undefined;
84
138
  readonly healthRegistry: HealthListenerRegistry;
85
139
  readonly getMaterialProjection?: (materialGuid: string) => MaterialRenderProjection | undefined;
86
140
  readonly getMaterialArtifact?: (specializationKey: string) => MaterialRuntimeArtifact | undefined;
141
+ /** Producer-owned cooked Standard PBR artifact used by GPU-driven projection. */
142
+ readonly getMaterialShaderArtifact?: (
143
+ materialShaderId: string,
144
+ ) => MaterialShaderArtifact | undefined;
87
145
  readonly getMaterialShaderPipeline?: (
88
146
  materialShaderId: string,
89
147
  isHdr: boolean,
@@ -101,7 +159,27 @@ export interface RenderSystemRuntime {
101
159
  vertexLayoutProjection?: VertexLayoutProjection,
102
160
  shaderModuleMode?: RenderFeatureShaderModuleMode,
103
161
  layoutKindOverride?: 'pbr' | 'pbr-skin',
162
+ additionalColorFormats?: readonly GPUTextureFormat[],
104
163
  ) => RhiRenderPipeline | null;
164
+ readonly getMaterialShaderPipelineEntry?: (
165
+ materialShaderId: string,
166
+ isHdr: boolean,
167
+ renderState?: MaterialRenderState,
168
+ topology?: PrimitiveTopology,
169
+ indexFormat?: 'uint16' | 'uint32',
170
+ variantSet?: string,
171
+ passKind?: PassKind,
172
+ meshAttributes?: VertexAttributeMap,
173
+ sampleCount?: number,
174
+ colorFormatOverride?: GPUTextureFormat,
175
+ shaderUvSetCount?: number,
176
+ depthFormatOverride?: GPUTextureFormat | null,
177
+ vertexLayout?: string,
178
+ vertexLayoutProjection?: VertexLayoutProjection,
179
+ shaderModuleMode?: RenderFeatureShaderModuleMode,
180
+ layoutKindOverride?: 'pbr' | 'pbr-skin',
181
+ additionalColorFormats?: readonly GPUTextureFormat[],
182
+ ) => MaterialShaderPipelineEntry | null;
105
183
  readonly getMaterialShaderBindingContract?: (
106
184
  materialShaderId: string,
107
185
  ) => 'group-0' | 'group-0-resource' | 'view-only' | 'view-and-scene-depth' | 'render-material';
@@ -116,10 +194,15 @@ export interface RenderSystemRuntime {
116
194
  id: string,
117
195
  bgl: BindGroupLayout,
118
196
  colorFormat: GPUTextureFormat,
197
+ entry?: import('../fullscreen-post-process-pass').PostProcessShaderEntry,
119
198
  ) => RhiRenderPipeline | null;
120
199
  readonly clearPostProcessPipelineCache?: (id: string) => void;
121
200
  readonly invalidateShaderModule?: (label: string) => void;
122
201
  readonly dynamicTextureStore?: DynamicTextureStore | undefined;
202
+ /** Resolves a render-target source to the active generation-owned GPU view. */
203
+ readonly resolveRenderTargetTextureSource?: (
204
+ source: import('../targets/contracts').RenderTargetTextureSource,
205
+ ) => import('../targets/material-source').RenderTargetMaterialSourceBinding | undefined;
123
206
  }
124
207
 
125
208
  /** Renderer-owned bridge from retained Points/Lines facts into main geometry. */
@@ -231,6 +314,8 @@ export interface BloomPersistentBundle {
231
314
  }
232
315
 
233
316
  export interface PipelineState {
317
+ /** Device that owns every opaque handle in this pipeline state. */
318
+ readonly device: RhiDevice;
234
319
  readonly meshes: ReadonlyMap<number, MeshGpuHandles>;
235
320
  readonly format: TextureFormat;
236
321
  readonly colorAttachmentFormat: TextureFormat;
@@ -246,9 +331,9 @@ export interface PipelineState {
246
331
  readonly shadowCasterCascadeBuffer: Buffer;
247
332
  readonly materialUniformBuffer: { readonly buffer: Buffer; readonly sizeInBytes: number };
248
333
  readonly meshStorageBuffer: { readonly buffer: Buffer; readonly sizeInBytes: number };
249
- readonly pointLightsBuffer: Buffer;
250
- readonly spotLightsBuffer: Buffer;
251
334
  readonly instancesBindGroupLayout: BindGroupLayout;
335
+ /** Probe-enabled slot-3 layout; omitted from no-probe bind groups. */
336
+ readonly probeInstancesBindGroupLayout?: BindGroupLayout;
252
337
  readonly identityInstanceBuffer: Buffer;
253
338
  readonly defaultSampler: Sampler;
254
339
  readonly nearestSampler: Sampler;
@@ -258,17 +343,35 @@ export interface PipelineState {
258
343
  readonly unlitPipelineMsaa: RhiRenderPipeline | null;
259
344
  readonly unlitPipelineHdrMsaa: RhiRenderPipeline | null;
260
345
  readonly pbrPipelineLayout: PipelineLayout | null;
346
+ readonly pbrProbePipelineLayout?: PipelineLayout | null;
261
347
  readonly hdrpPbrPipelineLayout: PipelineLayout | null;
348
+ readonly hdrpProbePbrPipelineLayout?: PipelineLayout | null;
262
349
  readonly hdrpClusterMembershipPipeline: ComputePipeline | null;
263
350
  readonly hdrpClusterMembershipBindGroupLayout: BindGroupLayout | null;
264
351
  readonly pbrSkinPipelineLayout: PipelineLayout | null;
352
+ readonly pbrSkinProbePipelineLayout?: PipelineLayout | null;
265
353
  readonly pbrSkinMeshBindGroupLayout: BindGroupLayout | null;
354
+ readonly hdrpSkinPipelineLayout: PipelineLayout | null;
355
+ readonly hdrpSkinMeshBindGroupLayout: BindGroupLayout | null;
266
356
  readonly skinPaletteAllocator: SkinPaletteAllocator | null;
267
357
  readonly defaultWhiteTextureView: TextureView;
268
358
  readonly defaultNormalTextureView: TextureView;
269
359
  readonly unlitPipelineHdr: RhiRenderPipeline | null;
270
360
  readonly shadowFallbackTextureView: TextureView;
271
361
  readonly shadowAtlasFallbackTextureView: TextureView;
362
+ readonly extendedLightingAvailable?: boolean;
363
+ readonly iesProfileTexture?: Texture;
364
+ readonly cookieTexture?: Texture;
365
+ readonly cookieMatrixBuffer?: Buffer;
366
+ spotModifierUploadState?: {
367
+ readonly ies: Map<number, number>;
368
+ readonly cookie: Map<number, number>;
369
+ readonly cookieMatrix: Map<number, number>;
370
+ };
371
+ readonly iesProfileTextureView?: TextureView;
372
+ readonly cookieTextureView?: TextureView;
373
+ readonly ltcLambertTextureView?: TextureView;
374
+ readonly ltcGgxTextureView?: TextureView;
272
375
  readonly shadowParamsBuffer: Buffer;
273
376
  readonly skylightFallback: SkylightFallback | null;
274
377
  readonly perPassResources: PerPassResources;
@@ -276,10 +379,20 @@ export interface PipelineState {
276
379
 
277
380
  export interface RenderSystemInternals extends RenderSystemRuntime {
278
381
  readonly canvas: HTMLCanvasElement | OffscreenCanvas;
382
+ /** Build identity injected by the host's build-tool adapter. */
383
+ readonly build?: string | undefined;
384
+ /** Host identity binding for the renderer-owned SSR dependency seam. */
385
+ readonly ssrIdentity?: SsrAdmissionIdentity | undefined;
279
386
  readonly standardProfile?: StandardProfile | undefined;
280
387
  readonly standardPipeline: RenderFrameState['activePipeline'];
281
388
  readonly featureHost?: RenderFeatureHost | undefined;
282
389
  readonly shaderModuleFactory?: PipelineBuilderShaderModuleFactory;
390
+ readonly createShaderModule?: (
391
+ device: import('@forgeax/engine-rhi').RhiDevice,
392
+ descriptor: { readonly code: string; readonly label?: string },
393
+ ) => Promise<
394
+ Result<import('@forgeax/engine-rhi').ShaderModule, import('@forgeax/engine-rhi').RhiError>
395
+ >;
283
396
  /** Optional handle-first factory for feature-owned generated shader programs. */
284
397
  readonly immediateShaderModuleFactory?: PipelineBuilderShaderModuleFactory;
285
398
  readonly profiler?: Profiler | undefined;
@@ -305,6 +418,16 @@ export interface RenderSystemInternals extends RenderSystemRuntime {
305
418
  label: string,
306
419
  ) => RhiRenderPipeline | null)
307
420
  | undefined;
421
+ gpuPassTimingSession?: GpuPassTimingSession | undefined;
422
+ gpuPassTimingCapture?: GpuPassTimingCapture | undefined;
423
+ gpuPassTimingSubmittedWork?: Promise<void> | undefined;
424
+ gpuPassTimingFrameIdentity?: GpuPassTimingFrameIdentity | undefined;
425
+ gpuPassTimingBeginReason?: GpuPassTimingReason | undefined;
426
+ readonly getRenderTargetPhysical?: (target: RenderTarget) => RenderTargetPhysical | undefined;
427
+ readonly encodeRenderTargetReadbacks?: (
428
+ encoder: RhiCommandEncoder,
429
+ faces?: readonly number[],
430
+ ) => void;
308
431
  /** Composed renderer utility sources installed atomically at build-ready. */
309
432
  volumetricFogShaders?: VolumetricFogShaderSources | undefined;
310
433
  }
@@ -318,6 +441,8 @@ export interface _StandardForwardSceneView {
318
441
  readonly validated: readonly ValidatedRenderable[];
319
442
  readonly validatedOrdered: readonly ValidatedRenderable[];
320
443
  readonly viewBindGroup: BindGroup | null;
444
+ /** Dynamic View-UBO slot used by auxiliary cube/probe face cameras. */
445
+ readonly viewBindGroupDynamicOffset?: number;
321
446
  readonly meshBindGroup: BindGroup | null;
322
447
  readonly frameState: RenderFrameState;
323
448
  readonly dispatchCounts: DispatchCounts;
@@ -329,6 +454,8 @@ export interface _StandardForwardSceneView {
329
454
  readonly directionalShadowCacheReuse: boolean;
330
455
  readonly world: World;
331
456
  readonly gpuDrivenEntityKeys: ReadonlySet<number>;
457
+ /** Renderer-local world namespace paired with gpuDrivenEntityKeys. */
458
+ readonly gpuDrivenWorldKeys?: readonly number[];
332
459
  readonly tonemapActive: boolean;
333
460
  readonly geometryColorView: TextureView | null;
334
461
  readonly geometryDepthView: TextureView | null;
@@ -337,9 +464,13 @@ export interface _StandardForwardSceneView {
337
464
  readonly splitLdrSprite: boolean;
338
465
  readonly ldrSpritePassView: TextureView | null;
339
466
  readonly transparentColorFormat?: GPUTextureFormat;
467
+ /** Second Standard main-pass attachment used by the fallback producer. */
468
+ readonly reflectionFallbackColorFormat?: GPUTextureFormat;
340
469
  readonly dispatch: readonly DispatchEntry[];
341
470
  readonly hdrpClusterBindGroup: BindGroup | null;
342
471
  readonly hdrpClusterMembershipBindGroup: BindGroup | null;
472
+ /** Prepared Standard lighting declaration accepted by this graph frame. */
473
+ readonly standardLighting?: StandardTopologyInputValue;
343
474
  readonly foldDispatchPlan: FoldDispatchPlan | null;
344
475
  readonly materialSlotIndices: readonly (readonly number[])[];
345
476
  readonly materialSlots: readonly MaterialSnapshot[];
@@ -347,12 +478,14 @@ export interface _StandardForwardSceneView {
347
478
  readonly materialSlotCount: number;
348
479
  readonly pointsLines: PointsLinesRecordOwner | undefined;
349
480
  readonly materialBgAssemblyCache: Map<string, MaterialBgAssemblyCacheEntry>;
481
+ readonly reflectionProbes?: ReflectionProbeRecordState;
350
482
  materialUboPayloadCache?: {
351
483
  readonly materialSlots: readonly MaterialSnapshot[];
352
484
  readonly materialSlotCount: number;
353
485
  readonly payload: Uint8Array;
354
486
  };
355
487
  hdrpSsaoBlurredView?: TextureView;
488
+ readonly occlusion?: import('../scene/visibility/occlusion-runtime').OcclusionFrameProjection;
356
489
  }
357
490
 
358
491
  export type _InternalRenderPipelineContext = RenderPipelineContext & _StandardForwardSceneView;
@@ -18,15 +18,18 @@ import { assembleMaterialWithSkylightEntries } from '../ibl/skylight-bind-group'
18
18
  import type { InstanceBufferCacheEntry } from '../instance-buffer-cache';
19
19
  import {
20
20
  buildPbrMaterialUserRegionEntries,
21
+ createPbrSkinMeshBindGroupEntries,
22
+ pbrSkinMeshDynamicOffsets,
21
23
  SHADOW_CASTER_SHADER_ID,
22
24
  shadowCasterVariantSet,
23
25
  } from '../pbr-pipeline';
26
+ import { COOKIE_MATRIX_BYTES } from '../prepare/extended-lighting/resources';
24
27
  import type { DispatchEntry, ExtractedLights } from '../render-system-extract';
25
28
  import { matchPass } from '../systems/pass-selector';
26
29
  import { worldEntityKey } from './frame-snapshot';
30
+ import { resolveGeometryInstancesBindGroup } from './main-pass-geometry';
27
31
  import {
28
32
  getOrCreateFromChain,
29
- getOrCreatePerEntity,
30
33
  MAX_UNIFORM_INSTANCES,
31
34
  MESH_PER_ENTITY_STRIDE,
32
35
  MESH_SSBO_BYTES,
@@ -81,23 +84,79 @@ function ensureTypedShadowViewBg(
81
84
  const { runtime, frameState, pipelineState } = c;
82
85
  const shadowSampler = pipelineState.perPassResources.shadowSampler;
83
86
  if (shadowSampler === null) return null;
87
+ const extendedLighting = pipelineState.extendedLightingAvailable ?? false;
88
+ const iesProfileTextureView = pipelineState.iesProfileTextureView;
89
+ const cookieTextureView = pipelineState.cookieTextureView;
90
+ const cookieMatrixBuffer = pipelineState.cookieMatrixBuffer;
91
+ const ltcLambertTextureView = pipelineState.ltcLambertTextureView;
92
+ const ltcGgxTextureView = pipelineState.ltcGgxTextureView;
93
+ const extendedLightingCacheKeys: object[] = [];
94
+ const extendedLightingEntries: BindGroupEntry[] = [];
95
+ if (extendedLighting) {
96
+ if (
97
+ iesProfileTextureView === undefined ||
98
+ cookieTextureView === undefined ||
99
+ cookieMatrixBuffer === undefined ||
100
+ ltcLambertTextureView === undefined ||
101
+ ltcGgxTextureView === undefined
102
+ ) {
103
+ return null;
104
+ }
105
+ extendedLightingCacheKeys.push(
106
+ pipelineState.defaultSampler,
107
+ iesProfileTextureView,
108
+ cookieTextureView,
109
+ ltcLambertTextureView,
110
+ ltcGgxTextureView,
111
+ cookieMatrixBuffer,
112
+ );
113
+ extendedLightingEntries.push(
114
+ {
115
+ binding: 9,
116
+ resource: { kind: 'sampler', value: pipelineState.defaultSampler },
117
+ },
118
+ {
119
+ binding: 11,
120
+ resource: { kind: 'textureView', value: iesProfileTextureView },
121
+ },
122
+ {
123
+ binding: 12,
124
+ resource: { kind: 'textureView', value: cookieTextureView },
125
+ },
126
+ {
127
+ binding: 13,
128
+ resource: { kind: 'textureView', value: ltcLambertTextureView },
129
+ },
130
+ {
131
+ binding: 14,
132
+ resource: { kind: 'textureView', value: ltcGgxTextureView },
133
+ },
134
+ {
135
+ binding: 15,
136
+ resource: {
137
+ kind: 'buffer',
138
+ value: { buffer: cookieMatrixBuffer, size: COOKIE_MATRIX_BYTES },
139
+ },
140
+ },
141
+ );
142
+ }
84
143
  const projectorAvailable = pipelineState.projectorAvailable !== false;
85
144
  try {
86
145
  return getOrCreateFromChain(
87
146
  frameState.viewBindGroupCache,
88
147
  [
89
148
  pipelineState.viewUniformBuffer,
90
- pipelineState.pointLightsBuffer,
91
- pipelineState.spotLightsBuffer,
92
149
  pipelineState.shadowFallbackTextureView,
93
150
  shadowSampler,
94
151
  pipelineState.shadowAtlasFallbackTextureView,
95
152
  pipelineState.shadowParamsBuffer,
96
153
  pipelineState.shadowCasterCascadeBuffer,
97
154
  pipelineState.shadowFallbackTextureView,
98
- ...(projectorAvailable
99
- ? [pipelineState.defaultWhiteTextureView, pipelineState.defaultSampler]
100
- : []),
155
+ ...(extendedLighting
156
+ ? extendedLightingCacheKeys
157
+ : projectorAvailable
158
+ ? [pipelineState.defaultWhiteTextureView, pipelineState.defaultSampler]
159
+ : []),
101
160
  pipelineState.pointsLinesViewBuffer ?? pipelineState.viewUniformBuffer,
102
161
  ],
103
162
  variant,
@@ -117,14 +176,6 @@ function ensureTypedShadowViewBg(
117
176
  },
118
177
  },
119
178
  },
120
- {
121
- binding: 1,
122
- resource: { kind: 'buffer', value: { buffer: pipelineState.pointLightsBuffer } },
123
- },
124
- {
125
- binding: 2,
126
- resource: { kind: 'buffer', value: { buffer: pipelineState.spotLightsBuffer } },
127
- },
128
179
  {
129
180
  binding: 3,
130
181
  resource: { kind: 'textureView', value: pipelineState.shadowFallbackTextureView },
@@ -159,6 +210,7 @@ function ensureTypedShadowViewBg(
159
210
  binding: 8,
160
211
  resource: { kind: 'textureView', value: pipelineState.shadowFallbackTextureView },
161
212
  },
213
+ ...extendedLightingEntries,
162
214
  {
163
215
  binding: 10,
164
216
  resource: {
@@ -169,7 +221,7 @@ function ensureTypedShadowViewBg(
169
221
  },
170
222
  },
171
223
  },
172
- ...(projectorAvailable
224
+ ...(!extendedLighting && projectorAvailable
173
225
  ? [
174
226
  {
175
227
  binding: 11,
@@ -290,27 +342,12 @@ function skinnedShadowMeshBindGroup(
290
342
  const created = c.runtime.device.createBindGroup({
291
343
  label: 'shadow-pbr-skin-mesh-bg',
292
344
  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
- ],
345
+ entries: createPbrSkinMeshBindGroupEntries(
346
+ c.pipelineState.meshStorageBuffer.buffer,
347
+ c.runtime.device.caps.storageBuffer ? MESH_SSBO_BYTES : MESH_UBO_FULL_ARRAY_BYTES,
348
+ skin.buffer,
349
+ allocator.bindingWindowBytes,
350
+ ),
314
351
  });
315
352
  if (!created.ok) throw created.error;
316
353
  return created.value;
@@ -338,7 +375,7 @@ export function encodeDirectionalShadowPass(
338
375
  c.frameState.directionalShadowCacheRecorded = true;
339
376
  pass.setViewport(viewport.x, viewport.y, viewport.w, viewport.h, 0, 1);
340
377
  pass.setPipeline(pipeline);
341
- pass.setBindGroup(0, viewBg, [0]);
378
+ pass.setBindGroup(0, viewBg, [0, 0]);
342
379
  pass.setBindGroup(1, materialBg, [0]);
343
380
  recordShadowCasterDraws(
344
381
  c,
@@ -368,7 +405,7 @@ export function encodePointShadowPass(
368
405
  const materialBg = ensureSpotShadowMaterialBg(c);
369
406
  if (pipeline === null || viewBg === null || materialBg === null) return;
370
407
  pass.setPipeline(pipeline);
371
- pass.setBindGroup(0, viewBg, [0]);
408
+ pass.setBindGroup(0, viewBg, [0, 0]);
372
409
  pass.setBindGroup(1, materialBg, [0]);
373
410
  recordShadowCasterDraws(
374
411
  c,
@@ -416,7 +453,7 @@ export function encodeSpotShadowPass(
416
453
  1,
417
454
  );
418
455
  pass.setPipeline(pipeline);
419
- pass.setBindGroup(0, viewBg, [0]);
456
+ pass.setBindGroup(0, viewBg, [0, 0]);
420
457
  pass.setBindGroup(1, materialBg, [0]);
421
458
  // Reuse the shared caster recorder. The compact spot-only loop used to
422
459
  // depend on instance bindings created by a directional pass, so a scene
@@ -594,10 +631,11 @@ function recordShadowCasterDraws(
594
631
  if (entry.source.skin !== undefined) {
595
632
  const skinMeshBindGroup = skinnedShadowMeshBindGroup(c, entry);
596
633
  if (skinMeshBindGroup === null) continue;
597
- shadowPass.setBindGroup(2, skinMeshBindGroup, [
598
- i * MESH_PER_ENTITY_STRIDE,
599
- entry.source.skin.byteOffset,
600
- ]);
634
+ shadowPass.setBindGroup(
635
+ 2,
636
+ skinMeshBindGroup,
637
+ pbrSkinMeshDynamicOffsets(i * MESH_PER_ENTITY_STRIDE, entry.source.skin.byteOffset),
638
+ );
601
639
  } else {
602
640
  shadowPass.setBindGroup(2, shadowMeshBindGroup, [i * MESH_PER_ENTITY_STRIDE]);
603
641
  }
@@ -606,6 +644,7 @@ function recordShadowCasterDraws(
606
644
  let shadowInstanceBuffer: Buffer = pipelineState.identityInstanceBuffer;
607
645
  let shadowInstanceCount = 1;
608
646
  const shadowInst = entry.source.instances;
647
+ if (shadowInst?.instanceCount === 0) continue;
609
648
  if (shadowInst !== undefined) {
610
649
  const uniformFallback = runtime.device.caps.storageBuffer === false;
611
650
  // Over-cap uniform fallback can't fit the per-instance window — bind
@@ -682,31 +721,7 @@ function recordShadowCasterDraws(
682
721
  // handle = shadowInstanceBuffer; the HDRP main pass read end (:3820 below)
683
722
  // must look up the same (compositeKey, instBuffer) leaf or the shadow
684
723
  // instances silently drop.
685
- const shadowInstancesBg = getOrCreatePerEntity(
686
- c.frameState.instancesBgPerEntity,
687
- worldEntityKey(entry.source.worldId, entry.source.entityKey),
688
- [shadowInstanceBuffer],
689
- 'shadow-instances',
690
- () => {
691
- const result = runtime.device.createBindGroup({
692
- label: 'shadow-instances-bg',
693
- layout: pipelineState.instancesBindGroupLayout,
694
- entries: [
695
- {
696
- binding: 0,
697
- resource: {
698
- kind: 'buffer',
699
- value: { buffer: shadowInstanceBuffer },
700
- },
701
- },
702
- ],
703
- });
704
- if (!result.ok) throw result.error;
705
- return result.value;
706
- },
707
- c.bindGroupCounts,
708
- );
709
-
724
+ const shadowInstancesBg = resolveGeometryInstancesBindGroup(c, shadowInstanceBuffer);
710
725
  shadowPass.setBindGroup(3, shadowInstancesBg);
711
726
  // feat-20260608 M4 / w16: per-submesh shadow draw loop.
712
727
  // Only draw submeshes whose topology is triangle-list or triangle-strip