@forgeax/engine-render 0.1.33 → 0.1.35

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 (624) hide show
  1. package/README.md +1062 -127
  2. package/dist/assembly/backend-contract.d.ts +2 -0
  3. package/dist/assembly/backend-contract.d.ts.map +1 -1
  4. package/dist/assembly/barrel-distortion-inspection.d.ts +3 -0
  5. package/dist/assembly/barrel-distortion-inspection.d.ts.map +1 -0
  6. package/dist/assembly/canvas-draw-guard.d.ts +3 -0
  7. package/dist/assembly/canvas-draw-guard.d.ts.map +1 -0
  8. package/dist/assembly/cloud-shadow-entry.d.ts +4 -0
  9. package/dist/assembly/cloud-shadow-entry.d.ts.map +1 -0
  10. package/dist/assembly/device-feature-admission.d.ts +2 -2
  11. package/dist/assembly/dynamic-geometry-host.d.ts +4 -1
  12. package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
  13. package/dist/assembly/dynamic-geometry-runtime.d.ts +1 -1
  14. package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -1
  15. package/dist/assembly/factory.d.ts +1 -1
  16. package/dist/assembly/factory.d.ts.map +1 -1
  17. package/dist/assembly/host-contract.d.ts +6 -5
  18. package/dist/assembly/host-contract.d.ts.map +1 -1
  19. package/dist/assembly/material/assembly.d.ts.map +1 -1
  20. package/dist/assembly/material/pipeline-helpers.d.ts +5 -0
  21. package/dist/assembly/material/pipeline-helpers.d.ts.map +1 -1
  22. package/dist/assembly/material-shader-policy.d.ts +16 -2
  23. package/dist/assembly/material-shader-policy.d.ts.map +1 -1
  24. package/dist/assembly/material-shader-prewarm.d.ts.map +1 -1
  25. package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -1
  26. package/dist/assembly/recovery/renderer-recover.d.ts +2 -0
  27. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  28. package/dist/assembly/render-feature-post-processes.d.ts +6 -0
  29. package/dist/assembly/render-feature-post-processes.d.ts.map +1 -0
  30. package/dist/assembly/render-target-host.d.ts +5 -0
  31. package/dist/assembly/render-target-host.d.ts.map +1 -1
  32. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  33. package/dist/assembly/renderer-feature-inspection.d.ts +1 -1
  34. package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -1
  35. package/dist/assembly/renderer-frame-transaction.d.ts +12 -0
  36. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  37. package/dist/assembly/renderer-inspection.d.ts +11 -0
  38. package/dist/assembly/renderer-inspection.d.ts.map +1 -1
  39. package/dist/assembly/webgpu-pbr-ready.d.ts +1 -0
  40. package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -1
  41. package/dist/assembly/webgpu-ready-per-pass.d.ts +39 -0
  42. package/dist/assembly/webgpu-ready-per-pass.d.ts.map +1 -0
  43. package/dist/assembly/webgpu-ready.d.ts +1 -1
  44. package/dist/assembly/webgpu-ready.d.ts.map +1 -1
  45. package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -1
  46. package/dist/assembly/webgpu-renderer-observation-owner.d.ts +35 -0
  47. package/dist/assembly/webgpu-renderer-observation-owner.d.ts.map +1 -0
  48. package/dist/assembly/webgpu-renderer.d.ts +2 -1
  49. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  50. package/dist/authoring.mjs +2 -4
  51. package/dist/authoring.mjs.map +1 -1
  52. package/dist/barrel-distortion.d.ts +47 -0
  53. package/dist/barrel-distortion.d.ts.map +1 -0
  54. package/dist/chunk-3XUBWRY2.mjs +1842 -0
  55. package/dist/chunk-3XUBWRY2.mjs.map +1 -0
  56. package/dist/{chunk-OO3DRYK7.mjs → chunk-G6HDNGY7.mjs} +2400 -1767
  57. package/dist/chunk-G6HDNGY7.mjs.map +1 -0
  58. package/dist/{chunk-ZDQWGQW7.mjs → chunk-LM5IE7GF.mjs} +4 -4
  59. package/dist/{chunk-ZDQWGQW7.mjs.map → chunk-LM5IE7GF.mjs.map} +1 -1
  60. package/dist/{chunk-VOZWDM3L.mjs → chunk-LNIUIKQ7.mjs} +1514 -498
  61. package/dist/chunk-LNIUIKQ7.mjs.map +1 -0
  62. package/dist/chunk-MXTWKZO4.mjs +3268 -0
  63. package/dist/chunk-MXTWKZO4.mjs.map +1 -0
  64. package/dist/chunk-MZ4C7EHF.mjs +6942 -0
  65. package/dist/chunk-MZ4C7EHF.mjs.map +1 -0
  66. package/dist/chunk-RIPAEGI6.mjs +48 -0
  67. package/dist/chunk-RIPAEGI6.mjs.map +1 -0
  68. package/dist/{chunk-LEAXOMYJ.mjs → chunk-SGPUJW3F.mjs} +117 -5
  69. package/dist/chunk-SGPUJW3F.mjs.map +1 -0
  70. package/dist/{chunk-PA5DRJNI.mjs → chunk-X2KA6WHM.mjs} +29 -4
  71. package/dist/chunk-X2KA6WHM.mjs.map +1 -0
  72. package/dist/{chunk-BLXGONR2.mjs → chunk-XSFB7XXQ.mjs} +51 -4
  73. package/dist/chunk-XSFB7XXQ.mjs.map +1 -0
  74. package/dist/cloud/density.d.ts +55 -0
  75. package/dist/cloud/density.d.ts.map +1 -0
  76. package/dist/cloud/extract.d.ts +25 -0
  77. package/dist/cloud/extract.d.ts.map +1 -0
  78. package/dist/cloud/feature.d.ts +57 -0
  79. package/dist/cloud/feature.d.ts.map +1 -0
  80. package/dist/cloud/frame-context.d.ts +8 -0
  81. package/dist/cloud/frame-context.d.ts.map +1 -0
  82. package/dist/cloud/inspection.d.ts +59 -0
  83. package/dist/cloud/inspection.d.ts.map +1 -0
  84. package/dist/cloud/optics.d.ts +56 -0
  85. package/dist/cloud/optics.d.ts.map +1 -0
  86. package/dist/cloud/parameters.d.ts +73 -0
  87. package/dist/cloud/parameters.d.ts.map +1 -0
  88. package/dist/cloud/resources.d.ts +60 -0
  89. package/dist/cloud/resources.d.ts.map +1 -0
  90. package/dist/cloud/shadow.d.ts +42 -0
  91. package/dist/cloud/shadow.d.ts.map +1 -0
  92. package/dist/cloud/temporal.d.ts +74 -0
  93. package/dist/cloud/temporal.d.ts.map +1 -0
  94. package/dist/components/barrel-distortion.d.ts +13 -0
  95. package/dist/components/barrel-distortion.d.ts.map +1 -0
  96. package/dist/components/cloud-layer.d.ts +29 -0
  97. package/dist/components/cloud-layer.d.ts.map +1 -0
  98. package/dist/components/index.d.ts +2 -0
  99. package/dist/components/index.d.ts.map +1 -1
  100. package/dist/components/instances.d.ts +20 -6
  101. package/dist/components/instances.d.ts.map +1 -1
  102. package/dist/construct-renderer.d.ts +1 -1
  103. package/dist/construct-renderer.d.ts.map +1 -1
  104. package/dist/construct-renderer.mjs +8406 -5785
  105. package/dist/construct-renderer.mjs.map +1 -1
  106. package/dist/device/gpu-residency.d.ts +19 -19
  107. package/dist/device/gpu-residency.d.ts.map +1 -1
  108. package/dist/dynamic-geometry.d.ts +5 -1
  109. package/dist/dynamic-geometry.d.ts.map +1 -1
  110. package/dist/errors/cloud.d.ts +59 -0
  111. package/dist/errors/cloud.d.ts.map +1 -0
  112. package/dist/errors/render.d.ts +20 -5
  113. package/dist/errors/render.d.ts.map +1 -1
  114. package/dist/examples/single-layer-medium-surface.d.ts +47 -0
  115. package/dist/examples/single-layer-medium-surface.d.ts.map +1 -0
  116. package/dist/extract/camera.d.ts.map +1 -1
  117. package/dist/extract/contracts.d.ts +5 -1
  118. package/dist/extract/contracts.d.ts.map +1 -1
  119. package/dist/extract/material-context.d.ts +7 -0
  120. package/dist/extract/material-context.d.ts.map +1 -0
  121. package/dist/features/barrel-distortion.d.ts +29 -0
  122. package/dist/features/barrel-distortion.d.ts.map +1 -0
  123. package/dist/features/error-reporting.d.ts +6 -2
  124. package/dist/features/error-reporting.d.ts.map +1 -1
  125. package/dist/features/host.d.ts +15 -0
  126. package/dist/features/host.d.ts.map +1 -1
  127. package/dist/features/plan.d.ts +10 -0
  128. package/dist/features/plan.d.ts.map +1 -1
  129. package/dist/features/render-graph-contribution.d.ts +5 -0
  130. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  131. package/dist/features/render-graph-raster.d.ts +1 -0
  132. package/dist/features/render-graph-raster.d.ts.map +1 -1
  133. package/dist/features/targets.d.ts +2 -0
  134. package/dist/features/targets.d.ts.map +1 -1
  135. package/dist/features/types.d.ts +48 -0
  136. package/dist/features/types.d.ts.map +1 -1
  137. package/dist/fullscreen-post-process-pass.d.ts +15 -7
  138. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  139. package/dist/glyph-text-layout-system.d.ts +1 -1
  140. package/dist/glyph-text-layout-system.d.ts.map +1 -1
  141. package/dist/gpu-dirty-ranges.d.ts +11 -0
  142. package/dist/gpu-dirty-ranges.d.ts.map +1 -0
  143. package/dist/gpu-driven/batch-topology.d.ts +17 -0
  144. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  145. package/dist/gpu-driven/material-artifacts.d.ts +6 -0
  146. package/dist/gpu-driven/material-artifacts.d.ts.map +1 -1
  147. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  148. package/dist/gpu-driven/production-raster-material.d.ts +178 -0
  149. package/dist/gpu-driven/production-raster-material.d.ts.map +1 -0
  150. package/dist/gpu-driven/production-raster.d.ts +47 -3
  151. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  152. package/dist/gpu-driven/resource-allocation.d.ts +31 -0
  153. package/dist/gpu-driven/resource-allocation.d.ts.map +1 -0
  154. package/dist/gpu-driven/shadow-ownership.d.ts +14 -0
  155. package/dist/gpu-driven/shadow-ownership.d.ts.map +1 -0
  156. package/dist/gpu-driven/view-gpu.d.ts +26 -2
  157. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  158. package/dist/gpu-scene.d.ts +5 -0
  159. package/dist/gpu-scene.d.ts.map +1 -1
  160. package/dist/hdrp-buffers.d.ts +2 -2
  161. package/dist/hdrp-buffers.d.ts.map +1 -1
  162. package/dist/ibl/frame-resources.d.ts.map +1 -1
  163. package/dist/ibl/skylight-bind-group.d.ts +14 -5
  164. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  165. package/dist/index.d.ts +30 -7
  166. package/dist/index.d.ts.map +1 -1
  167. package/dist/index.mjs +780 -9
  168. package/dist/index.mjs.map +1 -1
  169. package/dist/inspection-types.d.ts +135 -1
  170. package/dist/inspection-types.d.ts.map +1 -1
  171. package/dist/instance-buffer-cache.d.ts +4 -4
  172. package/dist/instance-buffer-cache.d.ts.map +1 -1
  173. package/dist/instances.d.ts +47 -100
  174. package/dist/instances.d.ts.map +1 -1
  175. package/dist/internal.mjs +7 -8
  176. package/dist/internal.mjs.map +1 -1
  177. package/dist/pbr-pipeline.d.ts +22 -4
  178. package/dist/pbr-pipeline.d.ts.map +1 -1
  179. package/dist/pipeline/single-layer-medium-passes.d.ts +73 -0
  180. package/dist/pipeline/single-layer-medium-passes.d.ts.map +1 -0
  181. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  182. package/dist/pipeline/standard-output/graph.d.ts.map +1 -1
  183. package/dist/pipeline/standard-output/lut-gpu.d.ts +2 -2
  184. package/dist/pipeline/standard-output/lut-gpu.d.ts.map +1 -1
  185. package/dist/pipeline/standard-output/resources.d.ts +2 -2
  186. package/dist/pipeline/standard-output/resources.d.ts.map +1 -1
  187. package/dist/pipeline/standard-output/types.d.ts +4 -2
  188. package/dist/pipeline/standard-output/types.d.ts.map +1 -1
  189. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  190. package/dist/pipeline/standard-post.d.ts.map +1 -1
  191. package/dist/pipeline-builder.d.ts +1 -1
  192. package/dist/pipeline-builder.d.ts.map +1 -1
  193. package/dist/plugin.d.ts.map +1 -1
  194. package/dist/prepare/prepared-graphics-resolver.d.ts +2 -0
  195. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  196. package/dist/publication/contract.d.ts +77 -0
  197. package/dist/publication/contract.d.ts.map +1 -0
  198. package/dist/publication/dependencies.d.ts +7 -0
  199. package/dist/publication/dependencies.d.ts.map +1 -0
  200. package/dist/publication/prepare-geometry.d.ts +9 -0
  201. package/dist/publication/prepare-geometry.d.ts.map +1 -0
  202. package/dist/publication/programs.d.ts +5 -0
  203. package/dist/publication/programs.d.ts.map +1 -0
  204. package/dist/publication/publisher.d.ts +33 -0
  205. package/dist/publication/publisher.d.ts.map +1 -0
  206. package/dist/publication/receiver.d.ts +29 -0
  207. package/dist/publication/receiver.d.ts.map +1 -0
  208. package/dist/publication/resource-scope.d.ts +18 -0
  209. package/dist/publication/resource-scope.d.ts.map +1 -0
  210. package/dist/publication/targets.d.ts +33 -0
  211. package/dist/publication/targets.d.ts.map +1 -0
  212. package/dist/publication/video.d.ts +5 -0
  213. package/dist/publication/video.d.ts.map +1 -0
  214. package/dist/record/barrel-distortion-frame.d.ts +15 -0
  215. package/dist/record/barrel-distortion-frame.d.ts.map +1 -0
  216. package/dist/record/dynamic-geometry-consumption.d.ts +10 -2
  217. package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -1
  218. package/dist/record/fold-buckets.d.ts +95 -0
  219. package/dist/record/fold-buckets.d.ts.map +1 -0
  220. package/dist/record/fold-instance-buffer.d.ts +6 -0
  221. package/dist/record/fold-instance-buffer.d.ts.map +1 -0
  222. package/dist/record/frame-lighting.d.ts +1 -0
  223. package/dist/record/frame-lighting.d.ts.map +1 -1
  224. package/dist/record/frame-snapshot.d.ts +43 -9
  225. package/dist/record/frame-snapshot.d.ts.map +1 -1
  226. package/dist/record/frame.d.ts +15 -65
  227. package/dist/record/frame.d.ts.map +1 -1
  228. package/dist/record/gpu-draw-receipts.d.ts +11 -0
  229. package/dist/record/gpu-draw-receipts.d.ts.map +1 -0
  230. package/dist/record/gpu-timing.d.ts +8 -0
  231. package/dist/record/gpu-timing.d.ts.map +1 -1
  232. package/dist/record/helpers.d.ts +2 -2
  233. package/dist/record/helpers.d.ts.map +1 -1
  234. package/dist/record/main-pass-geometry.d.ts +22 -6
  235. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  236. package/dist/record/main-pass-material.d.ts +14 -10
  237. package/dist/record/main-pass-material.d.ts.map +1 -1
  238. package/dist/record/main-pass-sprite-draws.d.ts +3 -16
  239. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  240. package/dist/record/main-pass.d.ts +13 -2
  241. package/dist/record/main-pass.d.ts.map +1 -1
  242. package/dist/record/motion-blur-receipt.d.ts +11 -0
  243. package/dist/record/motion-blur-receipt.d.ts.map +1 -0
  244. package/dist/record/prepared-material-bindings.d.ts +3 -3
  245. package/dist/record/prepared-material-bindings.d.ts.map +1 -1
  246. package/dist/record/probe-blend-buffer.d.ts +16 -0
  247. package/dist/record/probe-blend-buffer.d.ts.map +1 -0
  248. package/dist/record/recovery-pipeline.d.ts.map +1 -1
  249. package/dist/record/render-context.d.ts +24 -5
  250. package/dist/record/render-context.d.ts.map +1 -1
  251. package/dist/record/shadow-pass.d.ts +2 -0
  252. package/dist/record/shadow-pass.d.ts.map +1 -1
  253. package/dist/record/skybox-post-pass.d.ts +1 -1
  254. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  255. package/dist/record/sprite-instance-buffer.d.ts +31 -0
  256. package/dist/record/sprite-instance-buffer.d.ts.map +1 -0
  257. package/dist/record/target-capture-graph.d.ts +19 -0
  258. package/dist/record/target-capture-graph.d.ts.map +1 -0
  259. package/dist/record/typed-frame-graph.d.ts +24 -15
  260. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  261. package/dist/record/view-ubo.d.ts +11 -3
  262. package/dist/record/view-ubo.d.ts.map +1 -1
  263. package/dist/record/volume-params.d.ts +9 -0
  264. package/dist/record/volume-params.d.ts.map +1 -0
  265. package/dist/recovery/render-system-candidate.d.ts +14 -4
  266. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  267. package/dist/reflection/record-owner.d.ts.map +1 -1
  268. package/dist/render-contract.d.ts +46 -5
  269. package/dist/render-contract.d.ts.map +1 -1
  270. package/dist/render-graph-primitives.d.ts.map +1 -1
  271. package/dist/render-pipeline.d.ts +103 -2
  272. package/dist/render-pipeline.d.ts.map +1 -1
  273. package/dist/render-system-extract-tail.d.ts +3 -2
  274. package/dist/render-system-extract-tail.d.ts.map +1 -1
  275. package/dist/render-system-extract.d.ts +18 -9
  276. package/dist/render-system-extract.d.ts.map +1 -1
  277. package/dist/render-system-presentation.d.ts +23 -0
  278. package/dist/render-system-presentation.d.ts.map +1 -0
  279. package/dist/render-system-producer-roots.d.ts +10 -0
  280. package/dist/render-system-producer-roots.d.ts.map +1 -0
  281. package/dist/render-system-projections.d.ts +3 -2
  282. package/dist/render-system-projections.d.ts.map +1 -1
  283. package/dist/render-system-residency.d.ts +12 -0
  284. package/dist/render-system-residency.d.ts.map +1 -0
  285. package/dist/render-system.d.ts +22 -21
  286. package/dist/render-system.d.ts.map +1 -1
  287. package/dist/scene/probe-blend.d.ts +27 -0
  288. package/dist/scene/probe-blend.d.ts.map +1 -1
  289. package/dist/scene/render-scene.d.ts +18 -7
  290. package/dist/scene/render-scene.d.ts.map +1 -1
  291. package/dist/scene/render-source.d.ts +42 -0
  292. package/dist/scene/render-source.d.ts.map +1 -0
  293. package/dist/scene/source-systems.d.ts +6 -0
  294. package/dist/scene/source-systems.d.ts.map +1 -0
  295. package/dist/ssao-buffers.d.ts +9 -0
  296. package/dist/ssao-buffers.d.ts.map +1 -1
  297. package/dist/surface/dynamic-input.d.ts +133 -0
  298. package/dist/surface/dynamic-input.d.ts.map +1 -0
  299. package/dist/surface/gpu-driven.d.ts +41 -0
  300. package/dist/surface/gpu-driven.d.ts.map +1 -0
  301. package/dist/surface/submission-observation.d.ts +136 -0
  302. package/dist/surface/submission-observation.d.ts.map +1 -0
  303. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  304. package/dist/systems/skin-palette-types.d.ts +10 -0
  305. package/dist/systems/skin-palette-types.d.ts.map +1 -1
  306. package/dist/systems/transparent-dispatch.d.ts +2 -2
  307. package/dist/systems/transparent-dispatch.d.ts.map +1 -1
  308. package/dist/systems/transparent-sort-config.d.ts +2 -1
  309. package/dist/systems/transparent-sort-config.d.ts.map +1 -1
  310. package/dist/temporal/gpu.d.ts +13 -1
  311. package/dist/temporal/gpu.d.ts.map +1 -1
  312. package/dist/temporal/index.mjs +6 -7
  313. package/dist/temporal/inspection.d.ts.map +1 -1
  314. package/dist/temporal/standard-scene-data.d.ts.map +1 -1
  315. package/dist/temporal/target-coverage-attachment.d.ts.map +1 -1
  316. package/dist/transmission/single-layer-medium.d.ts +89 -0
  317. package/dist/transmission/single-layer-medium.d.ts.map +1 -0
  318. package/dist/typed-render-graph-primitives.d.ts +14 -2
  319. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  320. package/dist/volume/component.d.ts +9 -4
  321. package/dist/volume/component.d.ts.map +1 -1
  322. package/dist/volume/extract.d.ts +1 -1
  323. package/dist/volume/extract.d.ts.map +1 -1
  324. package/dist/volume/inspection.d.ts +2 -0
  325. package/dist/volume/inspection.d.ts.map +1 -1
  326. package/dist/volume/passes.d.ts +4 -1
  327. package/dist/volume/passes.d.ts.map +1 -1
  328. package/dist/volume/resources.d.ts.map +1 -1
  329. package/package.json +22 -21
  330. package/src/__tests__/atmosphere-daylight.dawn.test.ts +72 -0
  331. package/src/__tests__/auto-exposure-transaction.integration.test.ts +4 -9
  332. package/src/__tests__/barrel-distortion-lkg.integration.test.ts +353 -0
  333. package/src/__tests__/barrel-distortion.dawn.test.ts +41 -0
  334. package/src/__tests__/barrel-distortion.unit.test.ts +364 -0
  335. package/src/__tests__/construct-renderer-identity.unit.test.ts +49 -0
  336. package/src/__tests__/detached-recovery-graph.unit.test.ts +277 -0
  337. package/src/__tests__/device-feature-admission.unit.test.ts +3 -2
  338. package/src/__tests__/device-loss-fanout.unit.test.ts +36 -1
  339. package/src/__tests__/docs-gate-green.unit.test.ts +112 -1
  340. package/src/__tests__/factory-contract.integration.test.ts +295 -45
  341. package/src/__tests__/feature-depth-input.dawn.test.ts +129 -2
  342. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +14 -3
  343. package/src/__tests__/gpu-dirty-ranges.unit.test.ts +22 -0
  344. package/src/__tests__/gpu-driven-baseline.characterization.test.ts +16 -3
  345. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +12 -0
  346. package/src/__tests__/gpu-driven-material-artifacts.unit.test.ts +143 -0
  347. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +5 -6
  348. package/src/__tests__/gpu-driven-production.integration.test.ts +482 -3
  349. package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +6 -5
  350. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +94 -6
  351. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +18 -2
  352. package/src/__tests__/gpu-driven-view.browser.test.ts +5 -8
  353. package/src/__tests__/gpu-driven-view.dawn.test.ts +6 -2
  354. package/src/__tests__/gpu-driven-view.unit.test.ts +1 -1
  355. package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +1 -0
  356. package/src/__tests__/gpu-pass-timing.browser.test.ts +6 -4
  357. package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +1 -0
  358. package/src/__tests__/gpu-scene.unit.test.ts +119 -9
  359. package/src/__tests__/instance-allocation-failure.unit.test.ts +57 -0
  360. package/src/__tests__/instances-culling.integration.test.ts +10 -36
  361. package/src/__tests__/instances-store.unit.test.ts +97 -305
  362. package/src/__tests__/instances-world-ownership.integration.test.ts +62 -0
  363. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +4 -1
  364. package/src/__tests__/main-pass-material-medium-selection.unit.test.ts +145 -0
  365. package/src/__tests__/material-shader-prewarm.unit.test.ts +59 -0
  366. package/src/__tests__/material-snapshot-mutation.integration.test.ts +39 -1
  367. package/src/__tests__/materials-standard-contract.unit.test.ts +0 -1
  368. package/src/__tests__/morph-culling-reentry.dawn.test.ts +5 -5
  369. package/src/__tests__/morph-visual-evidence.integration.test.ts +8 -7
  370. package/src/__tests__/motion-blur-compute.dawn.test.ts +13 -7
  371. package/src/__tests__/motion-blur.pixel.integration.test.ts +2 -2
  372. package/src/__tests__/nineslice-handle-surface.unit.test.ts +4 -4
  373. package/src/__tests__/pbr-view-layout.unit.test.ts +9 -0
  374. package/src/__tests__/physical-clearcoat.integration.test.ts +66 -8
  375. package/src/__tests__/physical-material-budget.unit.test.ts +40 -0
  376. package/src/__tests__/prepared-graphics-capability.unit.test.ts +66 -2
  377. package/src/__tests__/probe-bindings.unit.test.ts +582 -1
  378. package/src/__tests__/probe-scene-dirty.integration.test.ts +28 -1
  379. package/src/__tests__/receipt-observation-retirement.unit.test.ts +65 -0
  380. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +69 -0
  381. package/src/__tests__/render-error-code-owner.test-d.ts +8 -0
  382. package/src/__tests__/render-feature-diagnostics.unit.test.ts +15 -2
  383. package/src/__tests__/render-feature-error-reporting.unit.test.ts +21 -1
  384. package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +10 -1
  385. package/src/__tests__/render-feature-retry.unit.test.ts +12 -1
  386. package/src/__tests__/render-scene-mixed-updates.integration.test.ts +145 -19
  387. package/src/__tests__/render-scene-projection.unit.test.ts +36 -11
  388. package/src/__tests__/render-scene-temporal-retry.unit.test.ts +20 -20
  389. package/src/__tests__/render-target-probe-soak.perf.test.ts +2 -2
  390. package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +3 -3
  391. package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +5 -2
  392. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +42 -8
  393. package/src/__tests__/renderer-frame-generation-fence.integration.test.ts +16 -0
  394. package/src/__tests__/renderer-frame-transaction.integration.test.ts +26 -10
  395. package/src/__tests__/resource-allocation.unit.test.ts +123 -0
  396. package/src/__tests__/single-layer-medium-passes.unit.test.ts +275 -0
  397. package/src/__tests__/skin-motion-regression.unit.test.ts +70 -1
  398. package/src/__tests__/skin-palette-recycling.dawn.test.ts +97 -0
  399. package/src/__tests__/skinned-shadow-caster.test.ts +15 -0
  400. package/src/__tests__/ssr-carrier-public-contract.unit.test.ts +21 -0
  401. package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +4 -4
  402. package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +2 -2
  403. package/src/__tests__/ssr-gpu-dispatch.ts +1 -1
  404. package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +6 -2
  405. package/src/__tests__/standard-output-chain-contract.unit.test.ts +28 -0
  406. package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +46 -1
  407. package/src/__tests__/standard-pipeline.integration.test.ts +182 -1
  408. package/src/__tests__/surface-dynamic-buffer-lifecycle.unit.test.ts +506 -0
  409. package/src/__tests__/surface-submission-observation.unit.test.ts +812 -0
  410. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +32 -0
  411. package/src/__tests__/temporal-performance.integration.test.ts +3 -3
  412. package/src/__tests__/visibility-instances.integration.test.ts +7 -19
  413. package/src/__tests__/visibility-producer-matrix.integration.test.ts +9 -20
  414. package/src/__tests__/volume-optics-oracle.unit.test.ts +4 -2
  415. package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +30 -20
  416. package/src/__tests__/volumetric-fog-errors.unit.test.ts +4 -3
  417. package/src/__tests__/volumetric-fog-multiple.unit.test.ts +55 -0
  418. package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +1 -1
  419. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +113 -9
  420. package/src/__tests__/volumetric-fog-topology.unit.test.ts +5 -3
  421. package/src/assembly/backend-contract.ts +30 -0
  422. package/src/assembly/barrel-distortion-inspection.ts +22 -0
  423. package/src/assembly/canvas-draw-guard.ts +11 -0
  424. package/src/assembly/cloud-shadow-entry.ts +22 -0
  425. package/src/assembly/device-feature-admission.ts +2 -2
  426. package/src/assembly/dynamic-geometry-host.ts +65 -37
  427. package/src/assembly/dynamic-geometry-runtime.ts +7 -1
  428. package/src/assembly/factory.ts +2 -30
  429. package/src/assembly/host-contract.ts +8 -5
  430. package/src/assembly/material/assembly.ts +25 -13
  431. package/src/assembly/material/pipeline-helpers.ts +53 -12
  432. package/src/assembly/material-shader-policy.ts +55 -0
  433. package/src/assembly/material-shader-prewarm.ts +21 -10
  434. package/src/assembly/recovery/device-loss-fanout.ts +13 -0
  435. package/src/assembly/recovery/renderer-recover.ts +50 -18
  436. package/src/assembly/render-feature-post-processes.ts +54 -0
  437. package/src/assembly/render-target-host.ts +57 -47
  438. package/src/assembly/renderer-facade.ts +7 -2
  439. package/src/assembly/renderer-feature-inspection.ts +8 -2
  440. package/src/assembly/renderer-frame-transaction.ts +23 -0
  441. package/src/assembly/renderer-inspection.ts +28 -0
  442. package/src/assembly/skin-palette-owner.ts +1 -1
  443. package/src/assembly/temporal-post-process-prewarm.ts +3 -3
  444. package/src/assembly/webgpu-pbr-ready.ts +9 -1
  445. package/src/assembly/webgpu-ready-per-pass.ts +104 -0
  446. package/src/assembly/webgpu-ready.ts +116 -62
  447. package/src/assembly/webgpu-renderer-bootstrap.ts +0 -12
  448. package/src/assembly/webgpu-renderer-observation-owner.ts +222 -0
  449. package/src/assembly/webgpu-renderer.ts +303 -313
  450. package/src/assembly/webgpu-vertex-layouts.ts +1 -1
  451. package/src/barrel-distortion.ts +247 -0
  452. package/src/cloud/__tests__/cloud-density-parity.dawn.test.ts +173 -0
  453. package/src/cloud/__tests__/cloud-layer-framebuffer-y.dawn.test.ts +265 -0
  454. package/src/cloud/__tests__/cloud-layer.browser.test.ts +432 -0
  455. package/src/cloud/__tests__/cloud-layer.unit.test.ts +634 -0
  456. package/src/cloud/density.ts +600 -0
  457. package/src/cloud/extract.ts +110 -0
  458. package/src/cloud/feature.ts +1810 -0
  459. package/src/cloud/frame-context.ts +42 -0
  460. package/src/cloud/inspection.ts +130 -0
  461. package/src/cloud/optics.ts +285 -0
  462. package/src/cloud/parameters.ts +255 -0
  463. package/src/cloud/resources.ts +122 -0
  464. package/src/cloud/shadow.ts +167 -0
  465. package/src/cloud/temporal.ts +226 -0
  466. package/src/components/barrel-distortion.ts +46 -0
  467. package/src/components/cloud-layer.ts +47 -0
  468. package/src/components/index.ts +2 -0
  469. package/src/components/instances.ts +18 -45
  470. package/src/components/sprite-instances.ts +1 -1
  471. package/src/construct-renderer.ts +1 -1
  472. package/src/device/gpu-residency.ts +26 -25
  473. package/src/dynamic-geometry.ts +12 -1
  474. package/src/errors/cloud.ts +103 -0
  475. package/src/errors/render.ts +47 -8
  476. package/src/examples/single-layer-medium-surface.ts +59 -0
  477. package/src/extract/camera.ts +15 -1
  478. package/src/extract/contracts.ts +5 -0
  479. package/src/extract/material-context.ts +21 -0
  480. package/src/features/barrel-distortion.ts +172 -0
  481. package/src/features/error-reporting.ts +26 -6
  482. package/src/features/host.ts +128 -19
  483. package/src/features/plan.ts +10 -0
  484. package/src/features/render-graph-contribution.ts +9 -0
  485. package/src/features/render-graph-raster.ts +45 -3
  486. package/src/features/targets.ts +66 -0
  487. package/src/features/types.ts +51 -0
  488. package/src/fullscreen-post-process-pass.ts +41 -9
  489. package/src/glyph-text-layout-system.ts +2 -2
  490. package/src/gpu-dirty-ranges.ts +48 -0
  491. package/src/gpu-driven/batch-topology.ts +53 -0
  492. package/src/gpu-driven/material-artifacts.ts +33 -25
  493. package/src/gpu-driven/prepared-draw.ts +12 -4
  494. package/src/gpu-driven/production-raster-material.ts +1894 -0
  495. package/src/gpu-driven/production-raster.ts +825 -784
  496. package/src/gpu-driven/resource-allocation.ts +142 -0
  497. package/src/gpu-driven/shadow-ownership.ts +71 -0
  498. package/src/gpu-driven/view-gpu.ts +164 -10
  499. package/src/gpu-scene.ts +75 -84
  500. package/src/hdrp-buffers.ts +4 -3
  501. package/src/ibl/frame-resources.ts +0 -1
  502. package/src/ibl/skylight-bind-group.ts +62 -32
  503. package/src/index.ts +205 -9
  504. package/src/inspection-types.ts +162 -0
  505. package/src/instance-buffer-cache.ts +4 -4
  506. package/src/instances.ts +152 -569
  507. package/src/pbr-pipeline.ts +230 -30
  508. package/src/pipeline/single-layer-medium-passes.ts +267 -0
  509. package/src/pipeline/standard-forward-lane.ts +313 -57
  510. package/src/pipeline/standard-output/graph.ts +8 -2
  511. package/src/pipeline/standard-output/lut-gpu.ts +3 -3
  512. package/src/pipeline/standard-output/resources.ts +2 -2
  513. package/src/pipeline/standard-output/types.ts +12 -1
  514. package/src/pipeline/standard-pipeline.ts +291 -18
  515. package/src/pipeline/standard-post.ts +90 -24
  516. package/src/pipeline-builder.ts +1 -1
  517. package/src/plugin.ts +4 -0
  518. package/src/points-lines/__tests__/points-lines.bench.ts +17 -8
  519. package/src/prepare/prepared-graphics-resolver.ts +2 -0
  520. package/src/publication/__tests__/derived-geometry.integration.test.ts +177 -0
  521. package/src/publication/__tests__/features.integration.test.ts +122 -0
  522. package/src/publication/__tests__/programs.unit.test.ts +25 -0
  523. package/src/publication/__tests__/publication.integration.test.ts +370 -0
  524. package/src/publication/__tests__/targets.integration.test.ts +120 -0
  525. package/src/publication/__tests__/video.browser.test.ts +50 -0
  526. package/src/publication/contract.ts +104 -0
  527. package/src/publication/dependencies.ts +54 -0
  528. package/src/publication/prepare-geometry.ts +94 -0
  529. package/src/publication/programs.ts +45 -0
  530. package/src/publication/publisher.ts +618 -0
  531. package/src/publication/receiver.ts +297 -0
  532. package/src/publication/resource-scope.ts +31 -0
  533. package/src/publication/targets.ts +182 -0
  534. package/src/publication/video.ts +33 -0
  535. package/src/record/__tests__/main-pass-geometry.unit.test.ts +30 -0
  536. package/src/record/__tests__/material-bg-cache.unit.test.ts +15 -1
  537. package/src/record/__tests__/sprite-material-abi.unit.test.ts +9 -11
  538. package/src/record/__tests__/temporal-payload.unit.test.ts +1 -1
  539. package/src/record/__tests__/transparent-group2-selection.unit.test.ts +11 -0
  540. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +1 -0
  541. package/src/record/__tests__/video-texture-view.unit.test.ts +9 -9
  542. package/src/record/__tests__/view-ubo-layout.unit.test.ts +4 -3
  543. package/src/record/barrel-distortion-frame.ts +110 -0
  544. package/src/record/dynamic-geometry-consumption.ts +39 -9
  545. package/src/record/fold-buckets.ts +855 -0
  546. package/src/record/fold-instance-buffer.ts +51 -0
  547. package/src/record/frame-lighting.ts +36 -2
  548. package/src/record/frame-snapshot.ts +45 -9
  549. package/src/record/frame.ts +258 -1105
  550. package/src/record/gpu-draw-receipts.ts +38 -0
  551. package/src/record/gpu-timing.ts +48 -5
  552. package/src/record/helpers.ts +2 -2
  553. package/src/record/main-pass-geometry.ts +272 -84
  554. package/src/record/main-pass-material.ts +102 -36
  555. package/src/record/main-pass-sprite-draws.ts +13 -217
  556. package/src/record/main-pass.ts +164 -27
  557. package/src/record/motion-blur-receipt.ts +91 -0
  558. package/src/record/prepared-material-bindings.ts +11 -6
  559. package/src/record/probe-blend-buffer.ts +180 -0
  560. package/src/record/recovery-pipeline.ts +35 -3
  561. package/src/record/render-context.ts +41 -5
  562. package/src/record/shadow-pass.ts +30 -4
  563. package/src/record/skybox-post-pass.ts +28 -4
  564. package/src/record/sprite-instance-buffer.ts +155 -0
  565. package/src/record/target-capture-graph.ts +258 -0
  566. package/src/record/typed-frame-graph.ts +776 -340
  567. package/src/record/view-ubo.ts +27 -4
  568. package/src/record/volume-params.ts +225 -0
  569. package/src/recovery/render-system-candidate.ts +243 -50
  570. package/src/reflection/record-owner.ts +7 -3
  571. package/src/render-contract.ts +54 -5
  572. package/src/render-graph-primitives.ts +7 -1
  573. package/src/render-pipeline.ts +130 -0
  574. package/src/render-system-extract-tail.ts +90 -78
  575. package/src/render-system-extract.ts +76 -76
  576. package/src/render-system-presentation.ts +56 -0
  577. package/src/render-system-producer-roots.ts +96 -0
  578. package/src/render-system-projections.ts +3 -2
  579. package/src/render-system-residency.ts +159 -0
  580. package/src/render-system.ts +421 -408
  581. package/src/scene/probe-blend.ts +96 -4
  582. package/src/scene/render-scene.ts +416 -337
  583. package/src/scene/render-source.ts +90 -0
  584. package/src/scene/source-systems.ts +33 -0
  585. package/src/ssao-buffers.ts +95 -2
  586. package/src/surface/__tests__/dynamic-input.unit.test.ts +374 -0
  587. package/src/surface/__tests__/gpu-driven.unit.test.ts +87 -0
  588. package/src/surface/dynamic-input.ts +658 -0
  589. package/src/surface/gpu-driven.ts +147 -0
  590. package/src/surface/submission-observation.ts +517 -0
  591. package/src/systems/skin-palette-allocator.ts +5 -1
  592. package/src/systems/skin-palette-types.ts +11 -0
  593. package/src/systems/transparent-dispatch.ts +2 -2
  594. package/src/systems/transparent-sort-config.ts +3 -1
  595. package/src/temporal/gpu.ts +101 -17
  596. package/src/temporal/inspection.ts +7 -1
  597. package/src/temporal/standard-scene-data.ts +5 -0
  598. package/src/temporal/target-coverage-attachment.ts +4 -0
  599. package/src/transmission/__tests__/single-layer-medium.unit.test.ts +149 -0
  600. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +12 -11
  601. package/src/transmission/single-layer-medium.ts +322 -0
  602. package/src/typed-render-graph-primitives.ts +70 -2
  603. package/src/volume/component.ts +10 -9
  604. package/src/volume/extract.ts +11 -5
  605. package/src/volume/inspection.ts +3 -0
  606. package/src/volume/passes.ts +87 -4
  607. package/src/volume/resources.ts +2 -1
  608. package/dist/chunk-3RTCJTH4.mjs +0 -1610
  609. package/dist/chunk-3RTCJTH4.mjs.map +0 -1
  610. package/dist/chunk-BLXGONR2.mjs.map +0 -1
  611. package/dist/chunk-ILQ5MEZF.mjs +0 -32
  612. package/dist/chunk-ILQ5MEZF.mjs.map +0 -1
  613. package/dist/chunk-LEAXOMYJ.mjs.map +0 -1
  614. package/dist/chunk-NB2S7ZRX.mjs +0 -1783
  615. package/dist/chunk-NB2S7ZRX.mjs.map +0 -1
  616. package/dist/chunk-NNQL7CB3.mjs +0 -1713
  617. package/dist/chunk-NNQL7CB3.mjs.map +0 -1
  618. package/dist/chunk-OO3DRYK7.mjs.map +0 -1
  619. package/dist/chunk-PA5DRJNI.mjs.map +0 -1
  620. package/dist/chunk-PLAXOOX5.mjs +0 -1907
  621. package/dist/chunk-PLAXOOX5.mjs.map +0 -1
  622. package/dist/chunk-RXZ3RGOU.mjs +0 -53
  623. package/dist/chunk-RXZ3RGOU.mjs.map +0 -1
  624. package/dist/chunk-VOZWDM3L.mjs.map +0 -1
@@ -0,0 +1,297 @@
1
+ import type { AssetReader } from '@forgeax/engine-assets-runtime';
2
+ import { AssetGuid } from '@forgeax/engine-pack/guid';
3
+ import { type Asset, AssetError, err, type Handle, ok, type Result } from '@forgeax/engine-types';
4
+ import type { DispatchEntry, ExtractedFrame, RenderableSnapshot } from '../render-system-extract';
5
+ import type { RenderSceneOperation } from '../scene/render-scene-types';
6
+ import {
7
+ type RenderPublication,
8
+ RenderPublicationError,
9
+ type RenderPublicationIdentity,
10
+ } from './contract';
11
+ import { publicationDependencies, publicationFrameDependencies } from './dependencies';
12
+ import type { PublishedRenderResources } from './resource-scope';
13
+
14
+ export interface PreparedRenderPublication {
15
+ readonly resources: PublishedRenderResources;
16
+ readonly packet: RenderPublication;
17
+ readonly operations: readonly RenderSceneOperation[];
18
+ readonly frame: ExtractedFrame;
19
+ readonly onFeatureSourceSubmitted?: (identity: string, feedback: unknown) => void;
20
+ }
21
+
22
+ /** Assets live for this source session; the Renderer owns all retained scene/GPU state. */
23
+ export class RenderPublicationReceiver {
24
+ private revision = 0;
25
+ private videoFrames = new Map<string, VideoFrame>();
26
+ private readonly entities = new Set<number>();
27
+ private readonly assets = new Map<Handle<string, 'shared'>, Asset>();
28
+ private readonly resources: PublishedRenderResources;
29
+ private readonly guidHandles = new Map<string, Handle<string, 'shared'>>();
30
+
31
+ constructor(private readonly identity: RenderPublicationIdentity) {
32
+ const resolveAsset: AssetReader['resolveAsset'] = <T extends Asset>(
33
+ handle: Handle<string, 'shared'>,
34
+ ) => {
35
+ const value = this.assets.get(handle);
36
+ return value === undefined
37
+ ? err(
38
+ new AssetError({
39
+ code: 'asset-not-found',
40
+ expected: 'the accepted publication contains the referenced asset generation',
41
+ hint: 'publish the asset closure before drawing its consumer',
42
+ }),
43
+ )
44
+ : ok(value as T);
45
+ };
46
+ this.resources = {
47
+ identity: `${identity.source}:${identity.epoch}`,
48
+ time: { delta: 0, elapsed: 0, maxDeltaSeconds: 0 },
49
+ transparentSort: { mode: 0, yzAlpha: 1 },
50
+ resolveAsset,
51
+ videoFrame: (entity, clip) => this.videoFrames.get(`${entity}:${clip}`),
52
+ handleForGuid: (guid) => this.guidHandles.get(guid.toLowerCase()),
53
+ lookupAsset: <T extends Asset>(guid: string): T | undefined => {
54
+ const handle = this.guidHandles.get(guid.toLowerCase());
55
+ return handle === undefined ? undefined : (this.assets.get(handle) as T | undefined);
56
+ },
57
+ };
58
+ }
59
+
60
+ accept(packet: RenderPublication): Result<PreparedRenderPublication, RenderPublicationError> {
61
+ const reject = (reason: RenderPublicationError['detail']['reason'], subject: string) =>
62
+ err(new RenderPublicationError({ reason, subject }));
63
+ if (packet.source !== this.identity.source || packet.epoch !== this.identity.epoch)
64
+ return reject('identity', 'source/epoch');
65
+ if (packet.base !== this.revision || packet.baseline !== (this.revision === 0))
66
+ return reject('base', 'accepted revision');
67
+ if (!Number.isSafeInteger(packet.revision) || packet.revision !== this.revision + 1)
68
+ return reject('revision', 'next revision');
69
+ if (
70
+ !(packet.upserts instanceof Uint32Array) ||
71
+ packet.upserts.length % 2 !== 0 ||
72
+ !(packet.removed instanceof Uint32Array) ||
73
+ !(packet.transformEntities instanceof Uint32Array) ||
74
+ !(packet.transforms instanceof Float32Array) ||
75
+ packet.transforms.length !== packet.transformEntities.length * 16 ||
76
+ !packet.transforms.every(Number.isFinite) ||
77
+ !Number.isFinite(packet.sampleTimeSeconds)
78
+ )
79
+ return reject('shape', 'numeric columns');
80
+ if (
81
+ !Array.isArray(packet.videoFrames) ||
82
+ !Array.isArray(packet.targets) ||
83
+ !Array.isArray(packet.targetSources) ||
84
+ !Array.isArray(packet.features) ||
85
+ !Array.isArray(packet.templates) ||
86
+ !Array.isArray(packet.programs) ||
87
+ !Array.isArray(packet.assets) ||
88
+ !Array.isArray(packet.retiredAssets) ||
89
+ !Array.isArray(packet.invalidatedAssets) ||
90
+ packet.metadata === null ||
91
+ typeof packet.metadata !== 'object' ||
92
+ !Array.isArray(packet.metadata.cameras) ||
93
+ !Number.isFinite(packet.time?.elapsed) ||
94
+ !Number.isFinite(packet.time?.delta)
95
+ )
96
+ return reject('shape', 'frame metadata');
97
+ const videoKeys = new Set<string>();
98
+ for (const row of packet.videoFrames) {
99
+ const key = `${row.entity}:${row.clip}`;
100
+ if (
101
+ !Number.isSafeInteger(row.entity) ||
102
+ !Number.isSafeInteger(row.clip) ||
103
+ typeof VideoFrame === 'undefined' ||
104
+ !(row.frame instanceof VideoFrame) ||
105
+ row.frame.displayWidth <= 0 ||
106
+ row.frame.displayHeight <= 0 ||
107
+ videoKeys.has(key)
108
+ )
109
+ return reject('shape', 'video frame');
110
+ videoKeys.add(key);
111
+ }
112
+ const targetIds = new Set<number>();
113
+ const targetTokens = new Set<object>();
114
+ for (const row of packet.targets) {
115
+ if (
116
+ !Number.isSafeInteger(row.id) ||
117
+ row.id <= 0 ||
118
+ targetIds.has(row.id) ||
119
+ typeof row.token !== 'object' ||
120
+ row.token === null ||
121
+ targetTokens.has(row.token) ||
122
+ typeof row.descriptor !== 'object' ||
123
+ row.descriptor === null
124
+ )
125
+ return reject('shape', 'target identity/descriptor');
126
+ targetIds.add(row.id);
127
+ targetTokens.add(row.token);
128
+ }
129
+ for (const camera of [
130
+ ...packet.metadata.cameras,
131
+ ...packet.metadata.auxiliaryCameras,
132
+ ...packet.metadata.cubeCameras,
133
+ ])
134
+ if (camera.target !== undefined && !targetTokens.has(camera.target))
135
+ return reject('shape', 'missing target descriptor');
136
+ const sourceTokens = new Set<object>();
137
+ for (const row of packet.targetSources) {
138
+ if (
139
+ !targetTokens.has(row.target) ||
140
+ typeof row.token !== 'object' ||
141
+ row.token === null ||
142
+ sourceTokens.has(row.token)
143
+ )
144
+ return reject('shape', 'target source');
145
+ sourceTokens.add(row.token);
146
+ }
147
+ const featureIdentities = new Set<string>();
148
+ for (const row of packet.features) {
149
+ if (typeof row.identity !== 'string' || featureIdentities.has(row.identity))
150
+ return reject('shape', 'feature identity');
151
+ featureIdentities.add(row.identity);
152
+ }
153
+ const matrices = new Map<number, Float32Array>();
154
+ for (let i = 0; i < packet.transformEntities.length; i++) {
155
+ const entity = packet.transformEntities[i] as number;
156
+ if (matrices.has(entity)) return reject('shape', 'duplicate transform identity');
157
+ matrices.set(entity, packet.transforms.slice(i * 16, i * 16 + 16));
158
+ }
159
+ const operations: RenderSceneOperation[] = [];
160
+ const renderables: RenderableSnapshot[] = [];
161
+ const dispatch: DispatchEntry[] = [];
162
+ const updated = new Set<number>();
163
+ for (let i = 0; i < packet.upserts.length; i += 2) {
164
+ const entityKey = packet.upserts[i] as number;
165
+ const template = packet.templates[packet.upserts[i + 1] as number];
166
+ const world = matrices.get(entityKey);
167
+ if (template === undefined || world === undefined || updated.has(entityKey))
168
+ return reject('shape', 'upsert template/transform');
169
+ if (!Array.isArray(template.snapshot?.materials) || !Array.isArray(template.dispatch))
170
+ return reject('shape', 'template');
171
+ for (const material of template.snapshot.materials)
172
+ for (const source of material.textureSources?.values() ?? [])
173
+ if (!sourceTokens.has(source)) return reject('shape', 'missing target source');
174
+ if (template.snapshot.skin !== undefined) return reject('shape', 'source GPU skin receipt');
175
+ const pose = template.snapshot.skinPose;
176
+ if (
177
+ pose !== undefined &&
178
+ (!Number.isInteger(pose.jointCount) ||
179
+ pose.jointCount <= 0 ||
180
+ pose.inverseBindMatrices.length !== pose.jointCount ||
181
+ pose.jointWorlds.length !== pose.jointCount ||
182
+ [...pose.inverseBindMatrices, ...pose.jointWorlds].some(
183
+ (matrix) =>
184
+ !(matrix instanceof Float32Array) ||
185
+ matrix.length !== 16 ||
186
+ !matrix.every(Number.isFinite),
187
+ ))
188
+ )
189
+ return reject('shape', 'skin pose');
190
+ updated.add(entityKey);
191
+ const snapshot: RenderableSnapshot = {
192
+ ...template.snapshot,
193
+ worldId: 0,
194
+ entityKey,
195
+ transform: { world },
196
+ };
197
+ for (const item of template.dispatch)
198
+ dispatch.push({ ...item, entityIndex: entityKey, renderableIndex: renderables.length });
199
+ renderables.push(snapshot);
200
+ operations.push({ kind: 'update', worldId: 0, entityKey, snapshot });
201
+ }
202
+ const removed = new Set<number>();
203
+ for (const entityKey of packet.removed) {
204
+ if (!this.entities.has(entityKey) || updated.has(entityKey) || removed.has(entityKey))
205
+ return reject('shape', 'duplicate removal');
206
+ removed.add(entityKey);
207
+ operations.push({ kind: 'remove', worldId: 0, entityKey });
208
+ }
209
+ for (const [entityKey, world] of matrices) {
210
+ if (removed.has(entityKey)) return reject('shape', 'removed transform');
211
+ if (!updated.has(entityKey) && !this.entities.has(entityKey))
212
+ return reject('shape', 'unknown transform identity');
213
+ if (!updated.has(entityKey))
214
+ operations.push({ kind: 'update', worldId: 0, entityKey, world });
215
+ }
216
+ // Validate the complete packet before changing the accepted asset namespace.
217
+ const assetHandles = new Set<number>();
218
+ for (const row of packet.assets) {
219
+ if (
220
+ row.value === null ||
221
+ typeof row.value !== 'object' ||
222
+ !Number.isSafeInteger(row.handle) ||
223
+ assetHandles.has(row.handle) ||
224
+ packet.retiredAssets.includes(row.handle)
225
+ )
226
+ return reject('shape', 'asset payload');
227
+ assetHandles.add(row.handle);
228
+ }
229
+ for (const handles of [
230
+ publicationFrameDependencies(packet.metadata),
231
+ ...renderables.map(publicationDependencies),
232
+ ]) {
233
+ if (
234
+ handles.some(
235
+ (handle) =>
236
+ !assetHandles.has(handle) &&
237
+ (!this.assets.has(handle as Handle<string, 'shared'>) ||
238
+ packet.retiredAssets.includes(handle as Handle<string, 'shared'>)),
239
+ )
240
+ )
241
+ return reject('shape', 'missing asset dependency');
242
+ }
243
+ const guidHandles = new Map(this.guidHandles);
244
+ for (const [guid, handle] of guidHandles)
245
+ if (packet.retiredAssets.includes(handle)) guidHandles.delete(guid);
246
+ for (const row of packet.assets)
247
+ if (row.guid !== undefined) guidHandles.set(row.guid.toLowerCase(), row.handle);
248
+ for (const row of renderables)
249
+ if (row.lods?.some((lod) => !guidHandles.has(AssetGuid.format(lod.mesh).toLowerCase())))
250
+ return reject('shape', 'missing LOD dependency');
251
+ for (const entity of removed) this.entities.delete(entity);
252
+ for (const entity of updated) this.entities.add(entity);
253
+ if (packet.baseline) this.assets.clear();
254
+ this.guidHandles.clear();
255
+ for (const [guid, handle] of guidHandles) this.guidHandles.set(guid, handle);
256
+ for (const handle of packet.retiredAssets) this.assets.delete(handle);
257
+ for (const row of packet.assets) this.assets.set(row.handle, row.value);
258
+ Object.assign(this.resources, { time: packet.time, transparentSort: packet.transparentSort });
259
+ this.releaseVideoFrames();
260
+ this.videoFrames = new Map(
261
+ packet.videoFrames.map((row) => [`${row.entity}:${row.clip}`, row.frame]),
262
+ );
263
+ this.revision = packet.revision;
264
+ return ok({
265
+ resources: this.resources,
266
+ packet,
267
+ operations,
268
+ frame: {
269
+ ...packet.metadata,
270
+ renderables,
271
+ dispatch,
272
+ visibilitySnapshots: [],
273
+ featureVisibilitySnapshots: [],
274
+ hiddenEntityReports: [],
275
+ shadowCasterEntityKeys: new Set(),
276
+ shadowCasterDrawKeys: new Set(),
277
+ },
278
+ });
279
+ }
280
+
281
+ /** copyExternalImageToTexture consumes native sources synchronously during draw. */
282
+ releaseVideoFrames(): void {
283
+ for (const frame of this.videoFrames.values()) frame.close();
284
+ this.videoFrames.clear();
285
+ }
286
+
287
+ dispose(): void {
288
+ this.releaseVideoFrames();
289
+ this.assets.clear();
290
+ this.guidHandles.clear();
291
+ this.entities.clear();
292
+ }
293
+
294
+ get acceptedRevision(): number {
295
+ return this.revision;
296
+ }
297
+ }
@@ -0,0 +1,31 @@
1
+ import type { AssetReader, AssetRegistry } from '@forgeax/engine-assets-runtime';
2
+ import { Time, type TimeResource, type World } from '@forgeax/engine-ecs';
3
+ import { AssetGuid } from '@forgeax/engine-pack/guid';
4
+ import type { Asset, Handle } from '@forgeax/engine-types';
5
+ import type { TransparentSortConfig } from '../systems/transparent-sort-config';
6
+
7
+ /** Owned data in a receiver, or a synchronously borrowed source World. */
8
+ export interface PublishedRenderResources extends AssetReader {
9
+ readonly time: TimeResource;
10
+ readonly transparentSort: TransparentSortConfig;
11
+ lookupAsset<T extends Asset>(guid: string): T | undefined;
12
+ videoFrame(entity: number, clip: number): VideoFrame | undefined;
13
+ handleForGuid(guid: string): Handle<string, 'shared'> | undefined;
14
+ }
15
+
16
+ export type RenderResourceScope = World | PublishedRenderResources;
17
+
18
+ export function renderTime(source: RenderResourceScope): TimeResource {
19
+ return 'resolveAsset' in source ? source.time : source.getResource(Time);
20
+ }
21
+
22
+ /** GUID consumers use the same accepted resource namespace as handle consumers. */
23
+ export function renderAssetByGuid<T extends Asset>(
24
+ source: RenderResourceScope,
25
+ assets: AssetRegistry,
26
+ guid: string | Parameters<typeof AssetGuid.format>[0],
27
+ ): T | undefined {
28
+ return 'resolveAsset' in source
29
+ ? source.lookupAsset<T>(typeof guid === 'string' ? guid : AssetGuid.format(guid))
30
+ : assets.lookup<T>(guid);
31
+ }
@@ -0,0 +1,182 @@
1
+ import { createRenderTargetHost, type RenderTargetHost } from '../assembly/render-target-host';
2
+ import type {
3
+ RenderTarget,
4
+ RenderTargetDescriptor,
5
+ RenderTargetTextureSource,
6
+ RenderTargetTextureSourceOptions,
7
+ } from '../targets/contracts';
8
+ import { resolveRenderTargetMaterialSource } from '../targets/material-source';
9
+ import type { RenderPublicationTemplate } from './contract';
10
+ import { RenderPublicationError } from './contract';
11
+ import type { PreparedRenderPublication } from './receiver';
12
+
13
+ /** Author descriptions synchronously; the consuming Renderer owns physical resources. */
14
+ export type RenderTargetAuthoring = Pick<
15
+ RenderTargetHost,
16
+ | 'createRenderTarget'
17
+ | 'resizeRenderTarget'
18
+ | 'createRenderTargetTextureSource'
19
+ | 'destroyRenderTarget'
20
+ >;
21
+ export interface PublishedRenderTarget {
22
+ readonly id: number;
23
+ readonly token: RenderTarget;
24
+ readonly descriptor: RenderTargetDescriptor;
25
+ }
26
+ export interface PublishedRenderTargetSource {
27
+ readonly token: RenderTargetTextureSource;
28
+ readonly target: RenderTarget;
29
+ readonly options: RenderTargetTextureSourceOptions;
30
+ }
31
+ export class RenderPublicationTargetOwner {
32
+ private readonly host = createRenderTargetHost();
33
+ private readonly ids = new WeakMap<object, number>();
34
+ private nextId = 0;
35
+ readonly authoring: RenderTargetAuthoring = this.host;
36
+ snapshot(): readonly PublishedRenderTarget[] {
37
+ return this.host.descriptions().map(({ target, descriptor }) => {
38
+ let id = this.ids.get(target);
39
+ if (id === undefined) {
40
+ id = ++this.nextId;
41
+ this.ids.set(target, id);
42
+ }
43
+ return { id, token: target, descriptor };
44
+ });
45
+ }
46
+ dispose(): void {
47
+ this.host.dispose();
48
+ }
49
+ }
50
+
51
+ export function publicationTargetSources(
52
+ templates: readonly RenderPublicationTemplate[],
53
+ ): readonly PublishedRenderTargetSource[] {
54
+ const sources = new Map<RenderTargetTextureSource, PublishedRenderTargetSource>();
55
+ for (const template of templates)
56
+ for (const material of template.snapshot.materials) {
57
+ for (const source of material.textureSources?.values() ?? []) {
58
+ if (sources.has(source)) continue;
59
+ const binding = resolveRenderTargetMaterialSource(source);
60
+ if (binding === undefined)
61
+ throw new RenderPublicationError({
62
+ reason: 'shape',
63
+ subject: 'unknown material target source',
64
+ });
65
+ sources.set(source, {
66
+ token: source,
67
+ target: binding.target,
68
+ options: {
69
+ aspect: 'color',
70
+ dimension: binding.view.dimension,
71
+ mipLevel: binding.view.mipLevel,
72
+ },
73
+ });
74
+ }
75
+ }
76
+ return [...sources.values()];
77
+ }
78
+
79
+ interface ReceivedTarget {
80
+ readonly target: RenderTarget;
81
+ descriptor: RenderTargetDescriptor;
82
+ readonly sources: Map<string, RenderTargetTextureSource>;
83
+ }
84
+
85
+ /** Translate logical references once at receive time; no source GPU handle crosses realms. */
86
+ export class RenderPublicationTargetReceiver {
87
+ private readonly targets = new Map<number, ReceivedTarget>();
88
+ constructor(private readonly host: RenderTargetAuthoring) {}
89
+ apply(input: PreparedRenderPublication): PreparedRenderPublication {
90
+ const packet = input.packet;
91
+ if (packet.targets.length === 0 && packet.targetSources.length === 0 && this.targets.size === 0)
92
+ return input;
93
+ const tokens = new Map<RenderTarget, RenderTarget>();
94
+ const records = new Map<RenderTarget, ReceivedTarget>();
95
+ const active = new Set(packet.targets.map((row) => row.id));
96
+ for (const [id, record] of this.targets)
97
+ if (!active.has(id)) {
98
+ const destroyed = this.host.destroyRenderTarget(record.target);
99
+ if (!destroyed.ok) throw destroyed.error;
100
+ this.targets.delete(id);
101
+ }
102
+ for (const row of packet.targets) {
103
+ let record = this.targets.get(row.id);
104
+ if (record === undefined) {
105
+ const created = this.host.createRenderTarget(row.descriptor);
106
+ if (!created.ok) throw created.error;
107
+ record = { target: created.value, descriptor: row.descriptor, sources: new Map() };
108
+ this.targets.set(row.id, record);
109
+ } else if (JSON.stringify(record.descriptor) !== JSON.stringify(row.descriptor)) {
110
+ const resized = this.host.resizeRenderTarget(record.target, row.descriptor);
111
+ if (!resized.ok) throw resized.error;
112
+ record.descriptor = row.descriptor;
113
+ record.sources.clear();
114
+ }
115
+ tokens.set(row.token, record.target);
116
+ records.set(row.token, record);
117
+ }
118
+ const resolve = (token: RenderTarget): RenderTarget => {
119
+ const target = tokens.get(token);
120
+ if (target === undefined)
121
+ throw new RenderPublicationError({ reason: 'shape', subject: 'missing target descriptor' });
122
+ return target;
123
+ };
124
+ const sources = new Map<RenderTargetTextureSource, RenderTargetTextureSource>();
125
+ for (const row of packet.targetSources) {
126
+ const record = records.get(row.target);
127
+ if (record === undefined)
128
+ throw new RenderPublicationError({ reason: 'shape', subject: 'missing material target' });
129
+ const key = JSON.stringify(row.options);
130
+ let source = record.sources.get(key);
131
+ if (source === undefined) {
132
+ const created = this.host.createRenderTargetTextureSource(record.target, row.options);
133
+ if (!created.ok) throw created.error;
134
+ source = created.value;
135
+ record.sources.set(key, source);
136
+ }
137
+ sources.set(row.token, source);
138
+ }
139
+ const camera = <T extends { readonly target?: RenderTarget }>(row: T): T =>
140
+ row.target === undefined ? row : { ...row, target: resolve(row.target) };
141
+ const renderables = input.frame.renderables.map((row) => {
142
+ const materials = row.materials.map((material) => {
143
+ if (material.textureSources === undefined) return material;
144
+ const textureSources = new Map(
145
+ [...material.textureSources].map(([name, token]) => {
146
+ const source = sources.get(token);
147
+ if (source === undefined)
148
+ throw new RenderPublicationError({
149
+ reason: 'shape',
150
+ subject: 'missing material target source',
151
+ });
152
+ return [name, source] as const;
153
+ }),
154
+ );
155
+ return { ...material, textureSources };
156
+ });
157
+ const first = row.materials.indexOf(row.material);
158
+ return { ...row, materials, material: materials[Math.max(0, first)] ?? row.material };
159
+ });
160
+ const snapshots = new Map(renderables.map((row) => [row.entityKey, row]));
161
+ return {
162
+ ...input,
163
+ frame: {
164
+ ...input.frame,
165
+ renderables,
166
+ cameras: input.frame.cameras.map(camera),
167
+ auxiliaryCameras: input.frame.auxiliaryCameras.map(camera),
168
+ cubeCameras: input.frame.cubeCameras.map(camera),
169
+ },
170
+ operations: input.operations.map((operation) => {
171
+ if (operation.kind === 'remove' || operation.snapshot === undefined) return operation;
172
+ const snapshot = snapshots.get(operation.entityKey);
173
+ if (snapshot === undefined)
174
+ throw new RenderPublicationError({
175
+ reason: 'shape',
176
+ subject: 'missing remapped snapshot',
177
+ });
178
+ return { ...operation, snapshot };
179
+ }),
180
+ };
181
+ }
182
+ }
@@ -0,0 +1,33 @@
1
+ import type { EntityHandle, World } from '@forgeax/engine-ecs';
2
+ import {
3
+ VIDEO_SOURCE_PROVIDER_KEY,
4
+ type VideoSourceProvider,
5
+ videoSourceExtent,
6
+ } from '@forgeax/engine-graphics-extras';
7
+ import type { Handle } from '@forgeax/engine-types';
8
+ import type { RenderPublication } from './contract';
9
+
10
+ /** Native VideoFrame cloning shares decoded pixels; it never copies source ECS storage. */
11
+ export function publicationVideoFrames(
12
+ world: World,
13
+ consumers: ReadonlyMap<number, readonly number[]>,
14
+ ): RenderPublication['videoFrames'] {
15
+ if (consumers.size === 0 || !world.hasResource(VIDEO_SOURCE_PROVIDER_KEY)) return [];
16
+ const provider = world.getResource<VideoSourceProvider>(VIDEO_SOURCE_PROVIDER_KEY);
17
+ const frames: RenderPublication['videoFrames'][number][] = [];
18
+ try {
19
+ for (const [entity, clips] of consumers)
20
+ for (const clip of clips) {
21
+ const source = provider.getSource(
22
+ entity as EntityHandle,
23
+ clip as Handle<'VideoAsset', 'shared'>,
24
+ );
25
+ if (source === undefined || videoSourceExtent(source) === undefined) continue;
26
+ frames.push({ entity, clip, frame: new VideoFrame(source) });
27
+ }
28
+ return frames;
29
+ } catch (cause) {
30
+ for (const row of frames) row.frame.close();
31
+ throw cause;
32
+ }
33
+ }
@@ -1,6 +1,7 @@
1
1
  import { describe, expect, it } from 'vitest';
2
2
  import type { DispatchEntry } from '../../render-system-extract';
3
3
  import {
4
+ authoredTransparentDepthWrite,
4
5
  geometryRenderStateForPass,
5
6
  requestsStandardTransmissionVariant,
6
7
  sameOpaqueTemporalDraw,
@@ -21,6 +22,35 @@ describe('geometry pass render state', () => {
21
22
  });
22
23
  });
23
24
 
25
+ it('does not force depth writes for alpha smoke while allowing authored water depth', () => {
26
+ expect(
27
+ authoredTransparentDepthWrite(true, {
28
+ blend: {
29
+ color: {
30
+ srcFactor: 'src-alpha',
31
+ dstFactor: 'one-minus-src-alpha',
32
+ operation: 'add',
33
+ },
34
+ alpha: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },
35
+ },
36
+ }),
37
+ ).toBe(false);
38
+ expect(
39
+ authoredTransparentDepthWrite(true, {
40
+ depthWriteEnabled: true,
41
+ depthCompare: 'less-equal',
42
+ blend: {
43
+ color: {
44
+ srcFactor: 'src-alpha',
45
+ dstFactor: 'one-minus-src-alpha',
46
+ operation: 'add',
47
+ },
48
+ alpha: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },
49
+ },
50
+ }),
51
+ ).toBe(true);
52
+ });
53
+
24
54
  it('does not rewrite the base state for colour passes', () => {
25
55
  const base = {
26
56
  cullMode: 'none' as const,
@@ -1,6 +1,7 @@
1
1
  import type { BindGroup, BindGroupLayout, Buffer, TextureView } from '@forgeax/engine-rhi';
2
2
  import { describe, expect, it } from 'vitest';
3
3
  import type { MaterialSnapshot } from '../../render-system-extract';
4
+ import type { RenderTargetTextureSource } from '../../targets/contracts';
4
5
  import type { MaterialBgAssemblyCacheEntry } from '../frame-snapshot';
5
6
  import { isMaterialBgAssemblyCacheHit } from '../main-pass-material';
6
7
 
@@ -16,7 +17,6 @@ describe('material bind-group assembly cache', () => {
16
17
  prefilterView: {},
17
18
  prefilterSampler: {},
18
19
  brdfLutView: {},
19
- brdfLutSampler: {},
20
20
  intensityBuffer: {},
21
21
  } as MaterialBgAssemblyCacheEntry['skylightResources'];
22
22
  const cached: MaterialBgAssemblyCacheEntry = {
@@ -44,6 +44,20 @@ describe('material bind-group assembly cache', () => {
44
44
  7,
45
45
  ),
46
46
  ).toBe(false);
47
+ const targetMaterial = {
48
+ ...material,
49
+ textureSources: new Map([['baseColorTexture', {} as RenderTargetTextureSource]]),
50
+ };
51
+ expect(
52
+ isMaterialBgAssemblyCacheHit(
53
+ { ...cached, material: targetMaterial },
54
+ targetMaterial,
55
+ materialBgl,
56
+ oldBuffer,
57
+ skylightResources,
58
+ 7,
59
+ ),
60
+ ).toBe(false);
47
61
  const sceneCached = { ...cached, sceneMaterialBuffer: oldBuffer };
48
62
  expect(
49
63
  isMaterialBgAssemblyCacheHit(
@@ -38,7 +38,7 @@ describe('sprite Standard material ABI', () => {
38
38
 
39
39
  // Sprite no longer owns a parallel material-entry builder. Preserve the
40
40
  // shared user-region/IBL layout gate; actual sampler selection is covered
41
- // by the source-derived 300-frame Sprite raster smoke in both tone lanes.
41
+ // by the source-derived 60-frame Sprite raster smoke in both tone lanes.
42
42
  const entries: BindGroupEntry[] = [
43
43
  { binding: 0, resource: { kind: 'buffer', value: { buffer: {} as Buffer } } },
44
44
  ];
@@ -72,22 +72,21 @@ describe('sprite Standard material ABI', () => {
72
72
  prefilterView: {} as TextureView,
73
73
  prefilterSampler: sampler,
74
74
  brdfLutView: {} as TextureView,
75
- brdfLutSampler: sampler,
76
75
  intensityBuffer: {} as Buffer,
77
76
  });
78
77
  expect(merged[15]).toMatchObject({
79
78
  binding: 15,
80
79
  resource: { kind: 'textureView' },
81
80
  });
82
- expect(merged[22]).toMatchObject({
83
- binding: 22,
81
+ expect(merged[21]).toMatchObject({
82
+ binding: 21,
84
83
  resource: { kind: 'sampler', value: sampler },
85
84
  });
86
- expect(merged[23]).toMatchObject({
87
- binding: 23,
85
+ expect(merged[22]).toMatchObject({
86
+ binding: 22,
88
87
  resource: { kind: 'textureView' },
89
88
  });
90
- expect(merged).toHaveLength(25);
89
+ expect(merged).toHaveLength(24);
91
90
  expect(merged.find((entry) => entry.binding === 47)?.resource.kind).toBe('textureView');
92
91
 
93
92
  const complete = [
@@ -97,7 +96,7 @@ describe('sprite Standard material ABI', () => {
97
96
  resource: { kind: 'buffer' as const, value: { buffer: {} as Buffer } },
98
97
  },
99
98
  ];
100
- expect(complete).toHaveLength(26);
99
+ expect(complete).toHaveLength(25);
101
100
  expect(complete.find((entry) => entry.binding === 46)).toMatchObject({
102
101
  binding: 46,
103
102
  resource: { kind: 'buffer' },
@@ -112,13 +111,12 @@ describe('sprite Standard material ABI', () => {
112
111
  prefilterView: {} as TextureView,
113
112
  prefilterSampler: sampler,
114
113
  brdfLutView: {} as TextureView,
115
- brdfLutSampler: sampler,
116
114
  intensityBuffer: {} as Buffer,
117
115
  },
118
116
  { sampler, backdropView: backdrop },
119
117
  );
120
- expect(active[23]).toMatchObject({
121
- binding: 23,
118
+ expect(active[22]).toMatchObject({
119
+ binding: 22,
122
120
  resource: { kind: 'textureView', value: backdrop },
123
121
  });
124
122
  });