@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
package/src/gpu-scene.ts CHANGED
@@ -37,6 +37,8 @@ interface PrimitiveAllocation {
37
37
  readonly instanceStart: number;
38
38
  readonly instanceCount: number;
39
39
  readonly transformStart: number;
40
+ readonly instanceTransformStart: number;
41
+ readonly instanceTransformCount: number;
40
42
  readonly drawStart: number;
41
43
  readonly drawCount: number;
42
44
  readonly materialStart: number;
@@ -85,8 +87,8 @@ class StableRangeAllocator {
85
87
  return this.next;
86
88
  }
87
89
 
88
- reset(): void {
89
- this.next = 0;
90
+ reset(start = 0): void {
91
+ this.next = start;
90
92
  this.free.length = 0;
91
93
  }
92
94
  }
@@ -177,7 +179,14 @@ function stableU32(value: string): number {
177
179
  function coalesceSlots(
178
180
  slots: readonly number[],
179
181
  ): readonly { readonly start: number; readonly end: number }[] {
180
- const ordered = [...new Set(slots)].sort((a, b) => a - b);
182
+ let alreadyOrdered = true;
183
+ for (let index = 1; index < slots.length; index += 1) {
184
+ if ((slots[index] ?? 0) <= (slots[index - 1] ?? 0)) {
185
+ alreadyOrdered = false;
186
+ break;
187
+ }
188
+ }
189
+ const ordered = alreadyOrdered ? slots : [...new Set(slots)].sort((a, b) => a - b);
181
190
  const ranges: Array<{ start: number; end: number }> = [];
182
191
  for (const slot of ordered) {
183
192
  const previous = ranges.at(-1);
@@ -193,6 +202,8 @@ function coalesceSlots(
193
202
  /** Persistent GPU tables derived only from renderer projection slots. */
194
203
  export class GpuScene {
195
204
  private tableBytes: Record<GpuSceneTableName, ArrayBuffer>;
205
+ private transformBytes: Uint8Array;
206
+ private transformView: DataView;
196
207
  private buffers: GpuSceneBuffers;
197
208
  private uploadRanges = 0;
198
209
  private uploadBytes = 0;
@@ -200,11 +211,19 @@ export class GpuScene {
200
211
  private fullRebuilds = 0;
201
212
  private clearedSlots = 0;
202
213
  private noChangeFrames = 0;
203
- private readonly allocations = new Map<number, PrimitiveAllocation>();
214
+ private identityUploaded = false;
215
+ private readonly allocations: Array<PrimitiveAllocation | undefined> = [];
204
216
  private readonly instances = new StableRangeAllocator();
205
217
  private readonly transforms = new StableRangeAllocator();
206
218
  private readonly draws = new StableRangeAllocator();
207
219
  private readonly materials = new StableRangeAllocator();
220
+ private readonly writesByTable: Record<GpuSceneTableName, number[]> = {
221
+ primitive: [],
222
+ instance: [],
223
+ transform: [],
224
+ drawTemplate: [],
225
+ material: [],
226
+ };
208
227
 
209
228
  private constructor(
210
229
  private readonly device: RhiDevice,
@@ -213,6 +232,10 @@ export class GpuScene {
213
232
  ) {
214
233
  this.buffers = buffers;
215
234
  this.tableBytes = this.allocateCpuTables(capacity);
235
+ this.transformBytes = new Uint8Array(this.tableBytes.transform);
236
+ this.transformView = new DataView(this.tableBytes.transform);
237
+ this.transforms.reset(1);
238
+ this.writeIdentityTransform();
216
239
  }
217
240
 
218
241
  static create(device: RhiDevice, initialCapacity = 256): Result<GpuSceneAvailability, RhiError> {
@@ -249,25 +272,33 @@ export class GpuScene {
249
272
  }
250
273
 
251
274
  sync(delta: RenderSceneApplyResult): Result<GpuSceneSyncResult, RhiError> {
252
- const writes = [...delta.createdSlots, ...delta.updatedSlots, ...delta.recreatedSlots];
253
- const changedSlots = [
254
- ...writes.map((record) => record.slot),
255
- ...delta.removedSlots.map((r) => r.slot),
256
- ];
257
- if (changedSlots.length === 0) {
275
+ if (
276
+ delta.createdSlots.length === 0 &&
277
+ delta.updatedSlots.length === 0 &&
278
+ delta.recreatedSlots.length === 0 &&
279
+ delta.removedSlots.length === 0
280
+ ) {
258
281
  this.noChangeFrames += 1;
259
282
  return ok({ ranges: 0, bytes: 0, grew: false, cleared: 0 });
260
283
  }
261
- const writesByTable: Record<GpuSceneTableName, number[]> = {
262
- primitive: [],
263
- instance: [],
264
- transform: [],
265
- drawTemplate: [],
266
- material: [],
267
- };
268
- for (const record of writes) this.ensureAllocation(record, writesByTable);
284
+ const writesByTable = this.writesByTable;
285
+ for (const name of TABLE_NAMES) writesByTable[name].length = 0;
286
+ if (!this.identityUploaded) writesByTable.transform.push(0);
287
+ let highestChangedSlot = -1;
288
+ for (const records of [delta.createdSlots, delta.recreatedSlots]) {
289
+ for (const record of records) {
290
+ this.ensureAllocation(record, writesByTable);
291
+ if (record.slot > highestChangedSlot) highestChangedSlot = record.slot;
292
+ }
293
+ }
294
+ for (const record of delta.updatedSlots) {
295
+ if (record.slot > highestChangedSlot) highestChangedSlot = record.slot;
296
+ }
297
+ for (const record of delta.removedSlots) {
298
+ if (record.slot > highestChangedSlot) highestChangedSlot = record.slot;
299
+ }
269
300
  const requiredCapacity = Math.max(
270
- Math.max(...changedSlots) + 1,
301
+ highestChangedSlot + 1,
271
302
  this.instances.requiredCapacity(),
272
303
  this.transforms.requiredCapacity(),
273
304
  this.draws.requiredCapacity(),
@@ -280,11 +311,12 @@ export class GpuScene {
280
311
  }
281
312
 
282
313
  for (const record of delta.createdSlots) this.writeSlot(record, true, writesByTable);
283
- for (const record of delta.updatedSlots) this.writeSlot(record, false, writesByTable);
314
+ for (const record of delta.updatedSlots) this.writeRootTransform(record, false, writesByTable);
284
315
  for (const record of delta.recreatedSlots) this.writeSlot(record, true, writesByTable);
285
316
  for (const record of delta.removedSlots) this.clearSlot(record.slot, writesByTable);
286
317
  const uploaded = this.uploadRows(writesByTable);
287
318
  if (!uploaded.ok) return uploaded;
319
+ this.identityUploaded = true;
288
320
  this.clearedSlots += delta.removedSlots.length;
289
321
  return ok({
290
322
  ranges: uploaded.value.ranges,
@@ -295,10 +327,11 @@ export class GpuScene {
295
327
  }
296
328
 
297
329
  /** Publish current transforms as previous only after a successful submit. */
298
- commitTemporalFrame(): Result<void, RhiError> {
330
+ commitTemporalFrame(enabled = true): Result<void, RhiError> {
331
+ if (!enabled) return ok(undefined);
299
332
  const nextTransform = this.tableBytes.transform.slice(0);
300
333
  const next = new Uint8Array(nextTransform);
301
- const current = new Uint8Array(this.tableBytes.transform);
334
+ const current = this.transformBytes;
302
335
  const currentOffset = offset(TRANSFORM, 'currentWorld');
303
336
  const previousOffset = offset(TRANSFORM, 'previousWorld');
304
337
  for (let index = 0; index < this.capacity; index += 1) {
@@ -313,15 +346,16 @@ export class GpuScene {
313
346
  const uploaded = this.device.queue.writeBuffer(this.buffers.transform, 0, next);
314
347
  if (!uploaded.ok) return uploaded;
315
348
  this.tableBytes.transform = nextTransform;
349
+ this.refreshTransformViews();
316
350
  this.uploadRanges += 1;
317
351
  this.uploadBytes += next.byteLength;
318
352
  return ok(undefined);
319
353
  }
320
354
 
321
355
  rebuild(slots: readonly RenderSceneSlot[]): Result<GpuSceneSyncResult, RhiError> {
322
- this.allocations.clear();
356
+ this.allocations.length = 0;
323
357
  this.instances.reset();
324
- this.transforms.reset();
358
+ this.transforms.reset(1);
325
359
  this.draws.reset();
326
360
  this.materials.reset();
327
361
  const writesByTable: Record<GpuSceneTableName, number[]> = {
@@ -347,6 +381,7 @@ export class GpuScene {
347
381
  grew = true;
348
382
  }
349
383
  for (const bytes of Object.values(this.tableBytes)) new Uint8Array(bytes).fill(0);
384
+ this.writeIdentityTransform();
350
385
  for (const slot of slots) this.writeSlot(slot, true, writesByTable);
351
386
  let bytes = 0;
352
387
  for (const name of TABLE_NAMES) {
@@ -358,6 +393,7 @@ export class GpuScene {
358
393
  this.uploadRanges += TABLE_NAMES.length;
359
394
  this.uploadBytes += bytes;
360
395
  this.fullRebuilds += 1;
396
+ this.identityUploaded = true;
361
397
  return ok({ ranges: TABLE_NAMES.length, bytes, grew, cleared: 0 });
362
398
  }
363
399
 
@@ -404,7 +440,7 @@ export class GpuScene {
404
440
  resetPrevious: boolean,
405
441
  writes: Record<GpuSceneTableName, number[]>,
406
442
  ): void {
407
- const allocation = this.allocations.get(record.slot);
443
+ const allocation = this.allocations[record.slot];
408
444
  if (allocation === undefined) throw new RangeError('GPU Scene allocation unavailable');
409
445
  const primitiveOffset = record.slot * PRIMITIVE.stride;
410
446
  const primitive = new DataView(this.tableBytes.primitive);
@@ -461,45 +497,34 @@ export class GpuScene {
461
497
  ]);
462
498
 
463
499
  const instance = new DataView(this.tableBytes.instance);
464
- const transform = new DataView(this.tableBytes.transform);
500
+ const transform = this.transformView;
465
501
  for (let ordinal = 0; ordinal < allocation.instanceCount; ordinal += 1) {
466
502
  const instanceIndex = allocation.instanceStart + ordinal;
467
503
  const instanceOffset = instanceIndex * INSTANCE.stride;
468
- const transformIndex = allocation.transformStart + 1 + ordinal;
504
+ const transformIndex =
505
+ allocation.instanceTransformCount === 0 ? 0 : allocation.instanceTransformStart + ordinal;
469
506
  instance.setUint32(instanceOffset + offset(INSTANCE, 'primitiveIndex'), record.slot, true);
470
507
  instance.setUint32(instanceOffset + offset(INSTANCE, 'transformIndex'), transformIndex, true);
471
508
  instance.setUint32(instanceOffset + offset(INSTANCE, 'customDataStart'), 0, true);
472
509
  instance.setUint32(instanceOffset + offset(INSTANCE, 'flags'), PRIMITIVE_ACTIVE, true);
473
- const local = record.snapshot.instances?.transforms.subarray(ordinal * 16, ordinal * 16 + 16);
474
- const localWorld = local?.length === 16 ? local : IDENTITY_MATRIX;
475
- const localOffset = transformIndex * TRANSFORM.stride;
476
- const localCurrentOffset = localOffset + offset(TRANSFORM, 'currentWorld');
477
- const localPreviousOffset = localOffset + offset(TRANSFORM, 'previousWorld');
478
- const priorLocal = new Uint8Array(
479
- this.tableBytes.transform.slice(localCurrentOffset, localCurrentOffset + 64),
480
- );
481
- writeMat4(transform, localCurrentOffset, localWorld);
482
- if (!resetPrevious && priorLocal.some((value) => value !== 0)) {
483
- new Uint8Array(this.tableBytes.transform, localPreviousOffset, 64).set(priorLocal);
484
- } else {
510
+ if (allocation.instanceTransformCount > 0) {
511
+ const local = record.snapshot.instances?.transforms.subarray(
512
+ ordinal * 16,
513
+ ordinal * 16 + 16,
514
+ );
515
+ const localWorld = local?.length === 16 ? local : IDENTITY_MATRIX;
516
+ const localOffset = transformIndex * TRANSFORM.stride;
517
+ const localCurrentOffset = localOffset + offset(TRANSFORM, 'currentWorld');
518
+ const localPreviousOffset = localOffset + offset(TRANSFORM, 'previousWorld');
519
+ writeMat4(transform, localCurrentOffset, localWorld);
485
520
  writeMat4(transform, localPreviousOffset, localWorld);
521
+ writes.transform.push(transformIndex);
486
522
  }
487
523
  writes.instance.push(instanceIndex);
488
- writes.transform.push(transformIndex);
489
524
  }
490
525
 
491
- const transformOffset = allocation.transformStart * TRANSFORM.stride;
492
- const currentOffset = transformOffset + offset(TRANSFORM, 'currentWorld');
493
- const previousOffset = transformOffset + offset(TRANSFORM, 'previousWorld');
494
- const priorCurrent = new Uint8Array(
495
- this.tableBytes.transform.slice(currentOffset, currentOffset + 64),
496
- );
497
- const hasPrior = !resetPrevious && priorCurrent.some((value) => value !== 0);
498
- writeMat4(transform, currentOffset, record.snapshot.transform.world);
499
- if (hasPrior) new Uint8Array(this.tableBytes.transform, previousOffset, 64).set(priorCurrent);
500
- else writeMat4(transform, previousOffset, record.snapshot.transform.world);
526
+ this.writeRootTransform(record, resetPrevious, writes);
501
527
  writes.primitive.push(record.slot);
502
- writes.transform.push(allocation.transformStart);
503
528
 
504
529
  const draw = new DataView(this.tableBytes.drawTemplate);
505
530
  const drawSnapshots = record.snapshot.gpuDrivenDraws ?? [];
@@ -509,7 +534,13 @@ export class GpuScene {
509
534
  const drawSnapshot = drawSnapshots[ordinal];
510
535
  draw.setUint32(
511
536
  drawOffset + offset(DRAW_TEMPLATE, 'pipelineClass'),
512
- drawSnapshot === undefined ? 0 : stableU32(drawSnapshot.pipelineClass),
537
+ drawSnapshot === undefined
538
+ ? 0
539
+ : stableU32(
540
+ drawSnapshot.prepared === undefined
541
+ ? drawSnapshot.pipelineClass
542
+ : `${drawSnapshot.prepared.identity.material}|${drawSnapshot.prepared.identity.geometry}|${drawSnapshot.prepared.identity.deformation}`,
543
+ ),
513
544
  true,
514
545
  );
515
546
  draw.setUint32(
@@ -519,17 +550,17 @@ export class GpuScene {
519
550
  );
520
551
  draw.setUint32(
521
552
  drawOffset + offset(DRAW_TEMPLATE, 'firstIndex'),
522
- drawSnapshot?.first ?? 0,
553
+ drawSnapshot?.prepared?.first ?? drawSnapshot?.first ?? 0,
523
554
  true,
524
555
  );
525
556
  draw.setUint32(
526
557
  drawOffset + offset(DRAW_TEMPLATE, 'indexCount'),
527
- drawSnapshot?.count ?? 0,
558
+ drawSnapshot?.prepared?.count ?? drawSnapshot?.count ?? 0,
528
559
  true,
529
560
  );
530
561
  draw.setInt32(
531
562
  drawOffset + offset(DRAW_TEMPLATE, 'baseVertex'),
532
- drawSnapshot?.baseVertex ?? 0,
563
+ drawSnapshot?.prepared?.baseVertex ?? drawSnapshot?.baseVertex ?? 0,
533
564
  true,
534
565
  );
535
566
  draw.setUint32(drawOffset + offset(DRAW_TEMPLATE, 'firstInstance'), 0, true);
@@ -591,16 +622,35 @@ export class GpuScene {
591
622
  }
592
623
  }
593
624
 
625
+ private writeRootTransform(
626
+ record: RenderSceneSlot,
627
+ resetPrevious: boolean,
628
+ writes: Record<GpuSceneTableName, number[]>,
629
+ ): void {
630
+ const allocation = this.allocations[record.slot];
631
+ if (allocation === undefined) throw new RangeError('GPU Scene allocation unavailable');
632
+ const transformOffset = allocation.transformStart * TRANSFORM.stride;
633
+ const currentOffset = transformOffset + offset(TRANSFORM, 'currentWorld');
634
+ const previousOffset = transformOffset + offset(TRANSFORM, 'previousWorld');
635
+ if (resetPrevious) {
636
+ writeMat4(this.transformView, previousOffset, record.snapshot.transform.world);
637
+ } else {
638
+ this.transformBytes.copyWithin(previousOffset, currentOffset, currentOffset + 64);
639
+ }
640
+ writeMat4(this.transformView, currentOffset, record.snapshot.transform.world);
641
+ writes.transform.push(allocation.transformStart);
642
+ }
643
+
594
644
  private clearSlot(slot: number, writes: Record<GpuSceneTableName, number[]>): void {
595
645
  for (const name of ['primitive'] as const) {
596
646
  const layout = TABLE_LAYOUTS[name];
597
647
  new Uint8Array(this.tableBytes[name], slot * layout.stride, layout.stride).fill(0);
598
648
  writes[name].push(slot);
599
649
  }
600
- const allocation = this.allocations.get(slot);
650
+ const allocation = this.allocations[slot];
601
651
  if (allocation === undefined) return;
602
652
  this.clearAllocation(allocation, writes);
603
- this.allocations.delete(slot);
653
+ this.allocations[slot] = undefined;
604
654
  }
605
655
 
606
656
  private uploadRows(
@@ -633,12 +683,22 @@ export class GpuScene {
633
683
  record: RenderSceneSlot,
634
684
  writes: Record<GpuSceneTableName, number[]>,
635
685
  ): void {
636
- const instanceCount = Math.max(1, record.snapshot.instances?.instanceCount ?? 1);
686
+ // A present Instances component is authoritative even when its array is
687
+ // empty: preserve zero so neither the GPU Scene nor the indirect topology
688
+ // turns it into a synthetic identity instance. Entities without the
689
+ // component retain the ordinary one-instance identity path.
690
+ const explicitInstances = record.snapshot.instances;
691
+ const instanceCount =
692
+ explicitInstances === undefined
693
+ ? 1
694
+ : Math.max(0, Math.floor(explicitInstances.instanceCount));
695
+ const instanceTransformCount = explicitInstances === undefined ? 0 : instanceCount;
637
696
  const drawCount = Math.max(1, record.snapshot.gpuDrivenDraws?.length ?? 0);
638
697
  const materialCount = Math.max(1, record.snapshot.materials.length);
639
- const existing = this.allocations.get(record.slot);
698
+ const existing = this.allocations[record.slot];
640
699
  if (
641
700
  existing?.instanceCount === instanceCount &&
701
+ existing.instanceTransformCount === instanceTransformCount &&
642
702
  existing.drawCount === drawCount &&
643
703
  existing.materialCount === materialCount
644
704
  ) {
@@ -648,13 +708,16 @@ export class GpuScene {
648
708
  const allocation = {
649
709
  instanceStart: this.instances.allocate(instanceCount),
650
710
  instanceCount,
651
- transformStart: this.transforms.allocate(instanceCount + 1),
711
+ transformStart: this.transforms.allocate(1),
712
+ instanceTransformStart:
713
+ instanceTransformCount === 0 ? 0 : this.transforms.allocate(instanceTransformCount),
714
+ instanceTransformCount,
652
715
  drawStart: this.draws.allocate(drawCount),
653
716
  drawCount,
654
717
  materialStart: this.materials.allocate(materialCount),
655
718
  materialCount,
656
719
  };
657
- this.allocations.set(record.slot, allocation);
720
+ this.allocations[record.slot] = allocation;
658
721
  }
659
722
 
660
723
  private clearAllocation(
@@ -670,8 +733,9 @@ export class GpuScene {
670
733
  ).fill(0);
671
734
  writes.instance.push(instanceIndex);
672
735
  }
673
- for (let ordinal = 0; ordinal <= allocation.instanceCount; ordinal += 1) {
674
- const transformIndex = allocation.transformStart + ordinal;
736
+ for (let ordinal = -1; ordinal < allocation.instanceTransformCount; ordinal += 1) {
737
+ const transformIndex =
738
+ ordinal < 0 ? allocation.transformStart : allocation.instanceTransformStart + ordinal;
675
739
  new Uint8Array(
676
740
  this.tableBytes.transform,
677
741
  transformIndex * TRANSFORM.stride,
@@ -698,7 +762,8 @@ export class GpuScene {
698
762
  writes.material.push(materialIndex);
699
763
  }
700
764
  this.instances.release(allocation.instanceStart, allocation.instanceCount);
701
- this.transforms.release(allocation.transformStart, allocation.instanceCount + 1);
765
+ this.transforms.release(allocation.transformStart, 1);
766
+ this.transforms.release(allocation.instanceTransformStart, allocation.instanceTransformCount);
702
767
  this.draws.release(allocation.drawStart, allocation.drawCount);
703
768
  this.materials.release(allocation.materialStart, allocation.materialCount);
704
769
  }
@@ -724,6 +789,7 @@ export class GpuScene {
724
789
  for (const buffer of Object.values(this.buffers)) this.device.destroyBuffer(buffer);
725
790
  this.buffers = nextBuffers.value;
726
791
  this.tableBytes = nextTables;
792
+ this.refreshTransformViews();
727
793
  this.capacity = nextCapacity;
728
794
  this.capacityGrows += 1;
729
795
  this.uploadRanges += TABLE_NAMES.length;
@@ -743,4 +809,14 @@ export class GpuScene {
743
809
  material: new ArrayBuffer(capacity * MATERIAL.stride),
744
810
  };
745
811
  }
812
+
813
+ private refreshTransformViews(): void {
814
+ this.transformBytes = new Uint8Array(this.tableBytes.transform);
815
+ this.transformView = new DataView(this.tableBytes.transform);
816
+ }
817
+
818
+ private writeIdentityTransform(): void {
819
+ writeMat4(this.transformView, offset(TRANSFORM, 'currentWorld'), IDENTITY_MATRIX);
820
+ writeMat4(this.transformView, offset(TRANSFORM, 'previousWorld'), IDENTITY_MATRIX);
821
+ }
746
822
  }
package/src/gpu-usage.ts CHANGED
@@ -12,5 +12,4 @@ export const GPU_BUFFER_USAGE_UNIFORM = 0x40;
12
12
  export const GPU_BUFFER_USAGE_STORAGE = 0x80;
13
13
  export const GPU_BUFFER_USAGE_INDIRECT = 0x100;
14
14
  export const GPU_BUFFER_USAGE_MAP_READ = 0x01;
15
- /** GPUBufferUsage.QUERY_RESOLVE, used by optional timestamp captures. */
16
15
  export const GPU_BUFFER_USAGE_QUERY_RESOLVE = 0x200;