@forgeax/engine-render 0.1.6 → 0.1.19

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 (713) hide show
  1. package/README.md +279 -2
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/assembly/backend-contract.d.ts +12 -0
  4. package/dist/assembly/backend-contract.d.ts.map +1 -1
  5. package/dist/assembly/factory.d.ts +19 -2
  6. package/dist/assembly/factory.d.ts.map +1 -1
  7. package/dist/assembly/host-contract.d.ts +4 -0
  8. package/dist/assembly/host-contract.d.ts.map +1 -1
  9. package/dist/assembly/material/assembly.d.ts.map +1 -1
  10. package/dist/assembly/renderer-frame-transaction.d.ts +39 -0
  11. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -0
  12. package/dist/assembly/renderer-inspection.d.ts +22 -0
  13. package/dist/assembly/renderer-inspection.d.ts.map +1 -0
  14. package/dist/assembly/renderer-lifecycle.d.ts +4 -0
  15. package/dist/assembly/renderer-lifecycle.d.ts.map +1 -0
  16. package/dist/authoring.d.ts +1 -0
  17. package/dist/authoring.d.ts.map +1 -1
  18. package/dist/authoring.mjs +4 -2
  19. package/dist/authoring.mjs.map +1 -1
  20. package/dist/chunk-FJ6P52EE.mjs +46 -0
  21. package/dist/chunk-FJ6P52EE.mjs.map +1 -0
  22. package/dist/chunk-IPXCABEP.mjs +73 -0
  23. package/dist/chunk-IPXCABEP.mjs.map +1 -0
  24. package/dist/chunk-JDWARUOI.mjs +44 -0
  25. package/dist/chunk-JDWARUOI.mjs.map +1 -0
  26. package/dist/chunk-LOSO4CTV.mjs +901 -0
  27. package/dist/chunk-LOSO4CTV.mjs.map +1 -0
  28. package/dist/chunk-PCHBPYML.mjs +385 -0
  29. package/dist/chunk-PCHBPYML.mjs.map +1 -0
  30. package/dist/chunk-RJRUS55L.mjs +9323 -0
  31. package/dist/chunk-RJRUS55L.mjs.map +1 -0
  32. package/dist/{chunk-QC4VW3XJ.mjs → chunk-RXZ3RGOU.mjs} +4 -30
  33. package/dist/chunk-RXZ3RGOU.mjs.map +1 -0
  34. package/dist/{chunk-CQXZC5XI.mjs → chunk-VFPLTKCU.mjs} +79 -69
  35. package/dist/chunk-VFPLTKCU.mjs.map +1 -0
  36. package/dist/{chunk-SCRSAK5B.mjs → chunk-YTQ5C7YQ.mjs} +231 -127
  37. package/dist/chunk-YTQ5C7YQ.mjs.map +1 -0
  38. package/dist/components/atmosphere.d.ts +9 -0
  39. package/dist/components/atmosphere.d.ts.map +1 -0
  40. package/dist/components/camera.d.ts +2 -1
  41. package/dist/components/camera.d.ts.map +1 -1
  42. package/dist/components/fog.d.ts +8 -0
  43. package/dist/components/fog.d.ts.map +1 -0
  44. package/dist/components/index.d.ts +5 -0
  45. package/dist/components/index.d.ts.map +1 -1
  46. package/dist/components/lines.d.ts +5 -0
  47. package/dist/components/lines.d.ts.map +1 -0
  48. package/dist/components/motion-blur.d.ts +7 -0
  49. package/dist/components/motion-blur.d.ts.map +1 -0
  50. package/dist/components/points.d.ts +15 -0
  51. package/dist/components/points.d.ts.map +1 -0
  52. package/dist/construct-renderer.d.ts +2 -2
  53. package/dist/construct-renderer.d.ts.map +1 -1
  54. package/dist/construct-renderer.mjs +11419 -16442
  55. package/dist/construct-renderer.mjs.map +1 -1
  56. package/dist/device/device-scope.d.ts +4 -0
  57. package/dist/device/device-scope.d.ts.map +1 -1
  58. package/dist/environment/frame.d.ts +60 -0
  59. package/dist/environment/frame.d.ts.map +1 -0
  60. package/dist/environment/generation.d.ts +21 -0
  61. package/dist/environment/generation.d.ts.map +1 -0
  62. package/dist/environment/graph.d.ts +4 -0
  63. package/dist/environment/graph.d.ts.map +1 -0
  64. package/dist/environment/inspection.d.ts +48 -0
  65. package/dist/environment/inspection.d.ts.map +1 -0
  66. package/dist/environment/lifecycle.d.ts +39 -0
  67. package/dist/environment/lifecycle.d.ts.map +1 -0
  68. package/dist/environment/signature.d.ts +25 -0
  69. package/dist/environment/signature.d.ts.map +1 -0
  70. package/dist/errors/render.d.ts +217 -1
  71. package/dist/errors/render.d.ts.map +1 -1
  72. package/dist/extract/camera.d.ts +5 -0
  73. package/dist/extract/camera.d.ts.map +1 -0
  74. package/dist/extract/environment.d.ts +74 -0
  75. package/dist/extract/environment.d.ts.map +1 -0
  76. package/dist/extract/visibility.d.ts +1 -1
  77. package/dist/extract/visibility.d.ts.map +1 -1
  78. package/dist/features/host.d.ts +9 -2
  79. package/dist/features/host.d.ts.map +1 -1
  80. package/dist/features/motion-blur/motion-blur-feature.d.ts +16 -0
  81. package/dist/features/motion-blur/motion-blur-feature.d.ts.map +1 -0
  82. package/dist/features/motion-blur/motion-blur-params.d.ts +25 -0
  83. package/dist/features/motion-blur/motion-blur-params.d.ts.map +1 -0
  84. package/dist/features/plan.d.ts +17 -2
  85. package/dist/features/plan.d.ts.map +1 -1
  86. package/dist/features/prepared-gpu-work.d.ts +3 -1
  87. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  88. package/dist/features/prepared-graphics.d.ts +2 -1
  89. package/dist/features/prepared-graphics.d.ts.map +1 -1
  90. package/dist/features/render-graph-raster.d.ts +7 -2
  91. package/dist/features/render-graph-raster.d.ts.map +1 -1
  92. package/dist/features/targets.d.ts +3 -0
  93. package/dist/features/targets.d.ts.map +1 -1
  94. package/dist/features/types.d.ts +12 -0
  95. package/dist/features/types.d.ts.map +1 -1
  96. package/dist/fullscreen-post-process-pass.d.ts +7 -1
  97. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  98. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  99. package/dist/gpu-scene.d.ts +2 -0
  100. package/dist/gpu-scene.d.ts.map +1 -1
  101. package/dist/ibl/skylight-bind-group.d.ts +5 -6
  102. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  103. package/dist/index.d.ts +21 -6
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.mjs +8 -4
  106. package/dist/index.mjs.map +1 -1
  107. package/dist/inspection-types.d.ts +46 -1
  108. package/dist/inspection-types.d.ts.map +1 -1
  109. package/dist/internal.d.ts +2 -0
  110. package/dist/internal.d.ts.map +1 -1
  111. package/dist/internal.mjs +2 -0
  112. package/dist/materials.d.ts +22 -0
  113. package/dist/materials.d.ts.map +1 -1
  114. package/dist/pbr-pipeline.d.ts +12 -6
  115. package/dist/pbr-pipeline.d.ts.map +1 -1
  116. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  117. package/dist/pipeline/standard-pipeline.d.ts +3 -0
  118. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  119. package/dist/pipeline/standard-post.d.ts +48 -0
  120. package/dist/pipeline/standard-post.d.ts.map +1 -0
  121. package/dist/pipeline/standard-profile.d.ts +3 -6
  122. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  123. package/dist/pipeline-builder.d.ts +18 -0
  124. package/dist/pipeline-builder.d.ts.map +1 -1
  125. package/dist/pipeline-spec.d.ts.map +1 -1
  126. package/dist/plugin.d.ts.map +1 -1
  127. package/dist/points-lines/admission.d.ts +36 -0
  128. package/dist/points-lines/admission.d.ts.map +1 -0
  129. package/dist/points-lines/bounds.d.ts +8 -0
  130. package/dist/points-lines/bounds.d.ts.map +1 -0
  131. package/dist/points-lines/expansion-cache.d.ts +28 -0
  132. package/dist/points-lines/expansion-cache.d.ts.map +1 -0
  133. package/dist/points-lines/inspection.d.ts +53 -0
  134. package/dist/points-lines/inspection.d.ts.map +1 -0
  135. package/dist/points-lines/prepare.d.ts +67 -0
  136. package/dist/points-lines/prepare.d.ts.map +1 -0
  137. package/dist/points-lines/record.d.ts +60 -0
  138. package/dist/points-lines/record.d.ts.map +1 -0
  139. package/dist/points-lines/snapshot.d.ts +49 -0
  140. package/dist/points-lines/snapshot.d.ts.map +1 -0
  141. package/dist/record/frame-lighting.d.ts.map +1 -1
  142. package/dist/record/frame-snapshot.d.ts +100 -5
  143. package/dist/record/frame-snapshot.d.ts.map +1 -1
  144. package/dist/record/frame-targets.d.ts.map +1 -1
  145. package/dist/record/frame.d.ts +4 -2
  146. package/dist/record/frame.d.ts.map +1 -1
  147. package/dist/record/main-pass-geometry.d.ts +18 -0
  148. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  149. package/dist/record/main-pass-material.d.ts +8 -5
  150. package/dist/record/main-pass-material.d.ts.map +1 -1
  151. package/dist/record/main-pass-sprite-draws.d.ts +8 -1
  152. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  153. package/dist/record/main-pass.d.ts +2 -0
  154. package/dist/record/main-pass.d.ts.map +1 -1
  155. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  156. package/dist/record/render-context.d.ts +93 -18
  157. package/dist/record/render-context.d.ts.map +1 -1
  158. package/dist/record/shadow-pass.d.ts.map +1 -1
  159. package/dist/record/skybox-post-pass.d.ts +1 -11
  160. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  161. package/dist/record/typed-frame-graph.d.ts +26 -2
  162. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  163. package/dist/record/view-ubo.d.ts +10 -1
  164. package/dist/record/view-ubo.d.ts.map +1 -1
  165. package/dist/render-contract.d.ts +102 -10
  166. package/dist/render-contract.d.ts.map +1 -1
  167. package/dist/render-graph-primitives.d.ts.map +1 -1
  168. package/dist/render-pipeline.d.ts +50 -6
  169. package/dist/render-pipeline.d.ts.map +1 -1
  170. package/dist/render-system-extract.d.ts +32 -5
  171. package/dist/render-system-extract.d.ts.map +1 -1
  172. package/dist/render-system.d.ts +27 -5
  173. package/dist/render-system.d.ts.map +1 -1
  174. package/dist/scene/render-scene-types.d.ts +3 -0
  175. package/dist/scene/render-scene-types.d.ts.map +1 -1
  176. package/dist/scene/render-scene.d.ts +43 -2
  177. package/dist/scene/render-scene.d.ts.map +1 -1
  178. package/dist/temporal/coverage.d.ts +42 -0
  179. package/dist/temporal/coverage.d.ts.map +1 -0
  180. package/dist/temporal/frame-coordinator.d.ts +99 -0
  181. package/dist/temporal/frame-coordinator.d.ts.map +1 -0
  182. package/dist/temporal/gpu.d.ts +39 -0
  183. package/dist/temporal/gpu.d.ts.map +1 -0
  184. package/dist/temporal/history.d.ts +37 -0
  185. package/dist/temporal/history.d.ts.map +1 -0
  186. package/dist/temporal/index.d.ts +7 -0
  187. package/dist/temporal/index.d.ts.map +1 -0
  188. package/dist/temporal/index.mjs +8 -0
  189. package/dist/temporal/index.mjs.map +1 -0
  190. package/dist/temporal/inspection.d.ts +36 -0
  191. package/dist/temporal/inspection.d.ts.map +1 -0
  192. package/dist/temporal/scene-data-catalog.d.ts +48 -0
  193. package/dist/temporal/scene-data-catalog.d.ts.map +1 -0
  194. package/dist/temporal/scene-data.d.ts +43 -0
  195. package/dist/temporal/scene-data.d.ts.map +1 -0
  196. package/dist/temporal/standard-scene-data.d.ts +61 -0
  197. package/dist/temporal/standard-scene-data.d.ts.map +1 -0
  198. package/dist/temporal/taa-history-resources.d.ts +22 -0
  199. package/dist/temporal/taa-history-resources.d.ts.map +1 -0
  200. package/dist/temporal/taa-history-store.d.ts +27 -0
  201. package/dist/temporal/taa-history-store.d.ts.map +1 -0
  202. package/dist/temporal/taa-resolve.d.ts +15 -0
  203. package/dist/temporal/taa-resolve.d.ts.map +1 -0
  204. package/dist/temporal/temporal-view.d.ts +40 -0
  205. package/dist/temporal/temporal-view.d.ts.map +1 -0
  206. package/dist/temporal/transaction.d.ts +9 -0
  207. package/dist/temporal/transaction.d.ts.map +1 -0
  208. package/dist/temporal/view.d.ts +56 -0
  209. package/dist/temporal/view.d.ts.map +1 -0
  210. package/dist/transmission/backdrop.d.ts +147 -0
  211. package/dist/transmission/backdrop.d.ts.map +1 -0
  212. package/dist/transmission/inspection.d.ts +57 -0
  213. package/dist/transmission/inspection.d.ts.map +1 -0
  214. package/dist/transmission/oracle.d.ts +42 -0
  215. package/dist/transmission/oracle.d.ts.map +1 -0
  216. package/dist/transmission/projection.d.ts +37 -0
  217. package/dist/transmission/projection.d.ts.map +1 -0
  218. package/dist/typed-render-graph-primitives.d.ts +25 -2
  219. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  220. package/package.json +24 -19
  221. package/src/__tests__/ai-user-cold-start.integration.test.ts +59 -0
  222. package/src/__tests__/ai-user-public-surface.test-d.ts +45 -0
  223. package/src/__tests__/authoring-path.unit.test.ts +9 -0
  224. package/src/__tests__/bloom-exact-zero.unit.test.ts +202 -0
  225. package/src/__tests__/bloom-lifecycle.integration.test.ts +125 -0
  226. package/src/__tests__/construct-renderer-identity.unit.test.ts +4 -3
  227. package/src/__tests__/detached-inspection.integration.test.ts +177 -0
  228. package/src/__tests__/environment-fog-lanes.integration.test.ts +219 -0
  229. package/src/__tests__/environment-generation.integration.test.ts +141 -0
  230. package/src/__tests__/environment-selection.unit.test.ts +245 -0
  231. package/src/__tests__/factory-contract.integration.test.ts +1380 -9
  232. package/src/__tests__/frame-plan-contract.unit.test.ts +90 -0
  233. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +7 -0
  234. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +12 -2
  235. package/src/__tests__/gpu-driven-production.integration.test.ts +74 -22
  236. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +37 -0
  237. package/src/__tests__/gpu-scene.unit.test.ts +10 -0
  238. package/src/__tests__/injection-kind-owner.test-d.ts +2 -1
  239. package/src/__tests__/material-contract-inventory.unit.test.ts +62 -0
  240. package/src/__tests__/material-cooked-projection.unit.test.ts +18 -124
  241. package/src/__tests__/material-static-dynamic-route.unit.test.ts +28 -28
  242. package/src/__tests__/materials-transmission-validation.unit.test.ts +36 -0
  243. package/src/__tests__/morph-feature-plan.unit.test.ts +7 -0
  244. package/src/__tests__/motion-blur.pixel.integration.test.ts +121 -0
  245. package/src/__tests__/public-surface.test-d.ts +15 -1
  246. package/src/__tests__/render-error-code-owner.test-d.ts +15 -0
  247. package/src/__tests__/render-error-detail-ssot.test-d.ts +11 -2
  248. package/src/__tests__/render-error-exhaustive.test-d.ts +22 -0
  249. package/src/__tests__/render-feature-errors.unit.test.ts +33 -3
  250. package/src/__tests__/render-feature-gpu-work.integration.test.ts +44 -0
  251. package/src/__tests__/render-feature-plan.test-d.ts +22 -89
  252. package/src/__tests__/render-scene-projection.unit.test.ts +28 -0
  253. package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +26 -0
  254. package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +21 -0
  255. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +433 -1
  256. package/src/__tests__/renderer-frame-transaction.integration.test.ts +405 -0
  257. package/src/__tests__/renderer-lifecycle.integration.test.ts +22 -0
  258. package/src/__tests__/scene-data-catalog.unit.test.ts +59 -0
  259. package/src/__tests__/scene-data-consumer.integration.test.ts +67 -0
  260. package/src/__tests__/scene-data-contract.test-d.ts +35 -0
  261. package/src/__tests__/scene-data-inspection.unit.test.ts +41 -0
  262. package/src/__tests__/scene-data-public-surface.test-d.ts +34 -0
  263. package/src/__tests__/shader-manifest-fixture.ts +111 -0
  264. package/src/__tests__/skinned-shadow-caster.test.ts +102 -0
  265. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +24 -3
  266. package/src/__tests__/standard-pipeline.dawn.test.ts +15 -0
  267. package/src/__tests__/standard-pipeline.integration.test.ts +543 -1
  268. package/src/__tests__/standard-profile-oracle.unit.test.ts +10 -2
  269. package/src/__tests__/standard-temporal-producer.integration.test.ts +35 -0
  270. package/src/__tests__/surface-configuration.unit.test.ts +211 -12
  271. package/src/__tests__/taa-transaction.integration.test.ts +30 -0
  272. package/src/__tests__/temporal-admission.integration.test.ts +40 -0
  273. package/src/__tests__/temporal-coverage.unit.test.ts +35 -0
  274. package/src/__tests__/temporal-demand.unit.test.ts +44 -0
  275. package/src/__tests__/temporal-frame-coordinator.unit.test.ts +64 -0
  276. package/src/__tests__/temporal-graph-topology.unit.test.ts +51 -0
  277. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +170 -0
  278. package/src/__tests__/temporal-performance.integration.test.ts +615 -0
  279. package/src/__tests__/temporal-reset-matrix.unit.test.ts +97 -0
  280. package/src/__tests__/temporal-transaction.integration.test.ts +60 -0
  281. package/src/__tests__/temporal-view.unit.test.ts +152 -0
  282. package/src/__tests__/transmission-prewarm.unit.test.ts +93 -0
  283. package/src/__tests__/typed-pipeline-topology.unit.test.ts +230 -1
  284. package/src/__tests__/urp-pipeline-targets.unit.test.ts +25 -1
  285. package/src/__tests__/urp-pipeline.unit.test.ts +4 -3
  286. package/src/__tests__/visibility-extract.integration.test.ts +27 -1
  287. package/src/__tests__/visibility-producer-matrix.integration.test.ts +10 -0
  288. package/src/assembly/backend-contract.ts +47 -1
  289. package/src/assembly/factory.ts +1295 -507
  290. package/src/assembly/host-contract.ts +4 -0
  291. package/src/assembly/material/assembly.ts +2 -5
  292. package/src/assembly/renderer-frame-transaction.ts +75 -0
  293. package/src/assembly/renderer-inspection.ts +112 -0
  294. package/src/assembly/renderer-lifecycle.ts +6 -0
  295. package/src/authoring.ts +1 -0
  296. package/src/components/__tests__/motion-blur.unit.test.ts +14 -0
  297. package/src/components/__tests__/points-lines-admission.unit.test.ts +219 -0
  298. package/src/components/__tests__/points-lines-schema.unit.test.ts +56 -0
  299. package/src/components/__tests__/schema-contract.unit.test.ts +6 -1
  300. package/src/components/atmosphere.ts +10 -0
  301. package/src/components/camera.ts +2 -1
  302. package/src/components/fog.ts +9 -0
  303. package/src/components/index.ts +10 -0
  304. package/src/components/lines.ts +18 -0
  305. package/src/components/motion-blur.ts +8 -0
  306. package/src/components/points.ts +40 -0
  307. package/src/construct-renderer.ts +40 -3
  308. package/src/device/device-scope.ts +15 -1
  309. package/src/environment/frame.ts +185 -0
  310. package/src/environment/generation.ts +23 -0
  311. package/src/environment/graph.ts +9 -0
  312. package/src/environment/inspection.ts +87 -0
  313. package/src/environment/lifecycle.ts +250 -0
  314. package/src/environment/signature.ts +55 -0
  315. package/src/errors/render.ts +429 -1
  316. package/src/extract/camera.ts +78 -0
  317. package/src/extract/environment.ts +171 -0
  318. package/src/extract/visibility.ts +38 -19
  319. package/src/features/host.ts +36 -5
  320. package/src/features/motion-blur/__tests__/motion-blur-feature.unit.test.ts +67 -0
  321. package/src/features/motion-blur/__tests__/motion-blur-params.unit.test.ts +53 -0
  322. package/src/features/motion-blur/motion-blur-feature.ts +119 -0
  323. package/src/features/motion-blur/motion-blur-params.ts +89 -0
  324. package/src/features/plan.ts +32 -3
  325. package/src/features/prepared-gpu-work.ts +21 -6
  326. package/src/features/prepared-graphics.ts +2 -1
  327. package/src/features/render-graph-raster.ts +24 -4
  328. package/src/features/targets.ts +24 -2
  329. package/src/features/types.ts +13 -0
  330. package/src/fullscreen-post-process-pass.ts +34 -4
  331. package/src/gpu-driven/production-raster.ts +6 -1
  332. package/src/gpu-scene.ts +24 -0
  333. package/src/ibl/skylight-bind-group.ts +30 -38
  334. package/src/index.ts +83 -6
  335. package/src/inspection-types.ts +52 -0
  336. package/src/internal.ts +5 -0
  337. package/src/materials.ts +119 -24
  338. package/src/pbr-pipeline.ts +66 -20
  339. package/src/pipeline/standard-forward-lane.ts +158 -101
  340. package/src/pipeline/standard-pipeline.ts +156 -105
  341. package/src/pipeline/standard-post.ts +373 -0
  342. package/src/pipeline/standard-profile.ts +11 -11
  343. package/src/pipeline-builder.ts +102 -12
  344. package/src/pipeline-spec.ts +9 -0
  345. package/src/plugin.ts +6 -0
  346. package/src/points-lines/__tests__/bounds.unit.test.ts +21 -0
  347. package/src/points-lines/__tests__/cache-recovery.unit.test.ts +157 -0
  348. package/src/points-lines/__tests__/inspection-lanes.integration.test.ts +146 -0
  349. package/src/points-lines/__tests__/inspection.unit.test.ts +173 -0
  350. package/src/points-lines/__tests__/lane-structural.integration.test.ts +122 -0
  351. package/src/points-lines/__tests__/points-lines.bench.ts +400 -0
  352. package/src/points-lines/__tests__/raster-lane.integration.test.ts +44 -0
  353. package/src/points-lines/__tests__/snapshot.unit.test.ts +101 -0
  354. package/src/points-lines/__tests__/view-ubo.unit.test.ts +73 -0
  355. package/src/points-lines/admission.ts +238 -0
  356. package/src/points-lines/bounds.ts +23 -0
  357. package/src/points-lines/expansion-cache.ts +215 -0
  358. package/src/points-lines/inspection.ts +97 -0
  359. package/src/points-lines/prepare.ts +177 -0
  360. package/src/points-lines/record.ts +125 -0
  361. package/src/points-lines/snapshot.ts +130 -0
  362. package/src/record/__tests__/fullscreen-temporal-routing.unit.test.ts +25 -0
  363. package/src/record/__tests__/main-pass-geometry.unit.test.ts +47 -0
  364. package/src/record/__tests__/material-bg-cache.unit.test.ts +12 -1
  365. package/src/record/__tests__/material-pipeline-pending-cache.unit.test.ts +22 -0
  366. package/src/record/__tests__/sprite-material-abi.unit.test.ts +75 -0
  367. package/src/record/__tests__/standard-pbr-ubo-layout.unit.test.ts +67 -0
  368. package/src/record/__tests__/temporal-payload.unit.test.ts +164 -0
  369. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +127 -0
  370. package/src/record/frame-lighting.ts +14 -2
  371. package/src/record/frame-snapshot.ts +129 -5
  372. package/src/record/frame-targets.ts +15 -6
  373. package/src/record/frame.ts +119 -4
  374. package/src/record/main-pass-geometry.ts +178 -40
  375. package/src/record/main-pass-material.ts +114 -66
  376. package/src/record/main-pass-sprite-draws.ts +79 -102
  377. package/src/record/main-pass.ts +83 -7
  378. package/src/record/mesh-ssbo.ts +22 -3
  379. package/src/record/render-context.ts +209 -23
  380. package/src/record/shadow-pass.ts +129 -28
  381. package/src/record/skybox-post-pass.ts +99 -42
  382. package/src/record/typed-frame-graph.ts +582 -42
  383. package/src/record/view-ubo.ts +99 -4
  384. package/src/render-contract.ts +121 -7
  385. package/src/render-graph-primitives.ts +18 -1
  386. package/src/render-pipeline.ts +100 -27
  387. package/src/render-system-extract.ts +264 -77
  388. package/src/render-system.ts +786 -43
  389. package/src/scene/render-scene-types.ts +3 -0
  390. package/src/scene/render-scene.ts +307 -9
  391. package/src/temporal/__tests__/taa-history-resources.unit.test.ts +45 -0
  392. package/src/temporal/coverage.ts +76 -0
  393. package/src/temporal/frame-coordinator.ts +311 -0
  394. package/src/temporal/gpu.ts +287 -0
  395. package/src/temporal/history.ts +92 -0
  396. package/src/temporal/index.ts +6 -0
  397. package/src/temporal/inspection.ts +97 -0
  398. package/src/temporal/scene-data-catalog.ts +200 -0
  399. package/src/temporal/scene-data.ts +149 -0
  400. package/src/temporal/standard-scene-data.ts +182 -0
  401. package/src/temporal/taa-history-resources.ts +128 -0
  402. package/src/temporal/taa-history-store.ts +79 -0
  403. package/src/temporal/taa-resolve.ts +34 -0
  404. package/src/temporal/temporal-view.ts +169 -0
  405. package/src/temporal/transaction.ts +17 -0
  406. package/src/temporal/view.ts +161 -0
  407. package/src/transmission/__tests__/capability.unit.test.ts +83 -0
  408. package/src/transmission/__tests__/composition.integration.test.ts +161 -0
  409. package/src/transmission/__tests__/inspection.unit.test.ts +241 -0
  410. package/src/transmission/__tests__/lifecycle.integration.test.ts +96 -0
  411. package/src/transmission/__tests__/oracle.unit.test.ts +131 -0
  412. package/src/transmission/__tests__/projection.unit.test.ts +71 -0
  413. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +438 -0
  414. package/src/transmission/__tests__/transmission-backdrop-topology.unit.test.ts +109 -0
  415. package/src/transmission/__tests__/transmission-backdrop.dawn.test.ts +105 -0
  416. package/src/transmission/backdrop.ts +572 -0
  417. package/src/transmission/inspection.ts +190 -0
  418. package/src/transmission/oracle.ts +141 -0
  419. package/src/transmission/projection.ts +83 -0
  420. package/src/typed-render-graph-primitives.ts +162 -9
  421. package/dist/__tests__/authoring-path.unit.test.d.ts +0 -2
  422. package/dist/__tests__/authoring-path.unit.test.d.ts.map +0 -1
  423. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts +0 -2
  424. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts.map +0 -1
  425. package/dist/__tests__/callback-inference.test-d.d.ts +0 -2
  426. package/dist/__tests__/callback-inference.test-d.d.ts.map +0 -1
  427. package/dist/__tests__/cluster-binner.test.d.ts +0 -2
  428. package/dist/__tests__/cluster-binner.test.d.ts.map +0 -1
  429. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts +0 -2
  430. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts.map +0 -1
  431. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts +0 -2
  432. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts.map +0 -1
  433. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +0 -2
  434. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +0 -1
  435. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +0 -2
  436. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +0 -1
  437. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts +0 -2
  438. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts.map +0 -1
  439. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts +0 -2
  440. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts.map +0 -1
  441. package/dist/__tests__/factory-contract.integration.test.d.ts +0 -2
  442. package/dist/__tests__/factory-contract.integration.test.d.ts.map +0 -1
  443. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts +0 -2
  444. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts.map +0 -1
  445. package/dist/__tests__/frame-observation.contract.test.d.ts +0 -2
  446. package/dist/__tests__/frame-observation.contract.test.d.ts.map +0 -1
  447. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +0 -2
  448. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +0 -1
  449. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts +0 -2
  450. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts.map +0 -1
  451. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts +0 -6
  452. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +0 -1
  453. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts +0 -2
  454. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts.map +0 -1
  455. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts +0 -2
  456. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts.map +0 -1
  457. package/dist/__tests__/gpu-driven-production.integration.test.d.ts +0 -2
  458. package/dist/__tests__/gpu-driven-production.integration.test.d.ts.map +0 -1
  459. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts +0 -2
  460. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts.map +0 -1
  461. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +0 -18
  462. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +0 -1
  463. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts +0 -2
  464. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts.map +0 -1
  465. package/dist/__tests__/gpu-driven-view-reference.d.ts +0 -15
  466. package/dist/__tests__/gpu-driven-view-reference.d.ts.map +0 -1
  467. package/dist/__tests__/gpu-driven-view.browser.test.d.ts +0 -2
  468. package/dist/__tests__/gpu-driven-view.browser.test.d.ts.map +0 -1
  469. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts +0 -2
  470. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts.map +0 -1
  471. package/dist/__tests__/gpu-driven-view.unit.test.d.ts +0 -2
  472. package/dist/__tests__/gpu-driven-view.unit.test.d.ts.map +0 -1
  473. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts +0 -2
  474. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts.map +0 -1
  475. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts +0 -7
  476. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +0 -1
  477. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts +0 -2
  478. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts.map +0 -1
  479. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts +0 -2
  480. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts.map +0 -1
  481. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts +0 -2
  482. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts.map +0 -1
  483. package/dist/__tests__/gpu-scene.dawn.test.d.ts +0 -2
  484. package/dist/__tests__/gpu-scene.dawn.test.d.ts.map +0 -1
  485. package/dist/__tests__/gpu-scene.unit.test.d.ts +0 -2
  486. package/dist/__tests__/gpu-scene.unit.test.d.ts.map +0 -1
  487. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +0 -2
  488. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +0 -1
  489. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts +0 -2
  490. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts.map +0 -1
  491. package/dist/__tests__/injection-kind-owner.test-d.d.ts +0 -2
  492. package/dist/__tests__/injection-kind-owner.test-d.d.ts.map +0 -1
  493. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts +0 -2
  494. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts.map +0 -1
  495. package/dist/__tests__/light-buffer-layout.unit.test.d.ts +0 -2
  496. package/dist/__tests__/light-buffer-layout.unit.test.d.ts.map +0 -1
  497. package/dist/__tests__/material-contract-inventory.unit.test.d.ts +0 -2
  498. package/dist/__tests__/material-contract-inventory.unit.test.d.ts.map +0 -1
  499. package/dist/__tests__/material-cooked-projection.unit.test.d.ts +0 -2
  500. package/dist/__tests__/material-cooked-projection.unit.test.d.ts.map +0 -1
  501. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts +0 -2
  502. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts.map +0 -1
  503. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts +0 -2
  504. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts.map +0 -1
  505. package/dist/__tests__/material-stride-surface.unit.test.d.ts +0 -2
  506. package/dist/__tests__/material-stride-surface.unit.test.d.ts.map +0 -1
  507. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts +0 -2
  508. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts.map +0 -1
  509. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts +0 -2
  510. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts.map +0 -1
  511. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts +0 -2
  512. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts.map +0 -1
  513. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts +0 -2
  514. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts.map +0 -1
  515. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts +0 -2
  516. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts.map +0 -1
  517. package/dist/__tests__/morph-feature-plan.unit.test.d.ts +0 -2
  518. package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +0 -1
  519. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts +0 -2
  520. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts.map +0 -1
  521. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts +0 -2
  522. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts.map +0 -1
  523. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts +0 -2
  524. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts.map +0 -1
  525. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts +0 -2
  526. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts.map +0 -1
  527. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts +0 -2
  528. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts.map +0 -1
  529. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts +0 -2
  530. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts.map +0 -1
  531. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts +0 -2
  532. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts.map +0 -1
  533. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts +0 -2
  534. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts.map +0 -1
  535. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts +0 -2
  536. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts.map +0 -1
  537. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts +0 -2
  538. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts.map +0 -1
  539. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts +0 -2
  540. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts.map +0 -1
  541. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts +0 -2
  542. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts.map +0 -1
  543. package/dist/__tests__/profiler-default-off.test.d.ts +0 -2
  544. package/dist/__tests__/profiler-default-off.test.d.ts.map +0 -1
  545. package/dist/__tests__/profiler-phase-catalog.test.d.ts +0 -2
  546. package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +0 -1
  547. package/dist/__tests__/profiler-phase-integration.test.d.ts +0 -2
  548. package/dist/__tests__/profiler-phase-integration.test.d.ts.map +0 -1
  549. package/dist/__tests__/profiler-phase-token.test.d.ts +0 -2
  550. package/dist/__tests__/profiler-phase-token.test.d.ts.map +0 -1
  551. package/dist/__tests__/public-surface.test-d.d.ts +0 -2
  552. package/dist/__tests__/public-surface.test-d.d.ts.map +0 -1
  553. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts +0 -2
  554. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts.map +0 -1
  555. package/dist/__tests__/render-error-code-owner.test-d.d.ts +0 -2
  556. package/dist/__tests__/render-error-code-owner.test-d.d.ts.map +0 -1
  557. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts +0 -2
  558. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts.map +0 -1
  559. package/dist/__tests__/render-error-exhaustive.test-d.d.ts +0 -2
  560. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +0 -1
  561. package/dist/__tests__/render-feature-assembly.test-d.d.ts +0 -2
  562. package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +0 -1
  563. package/dist/__tests__/render-feature-context.test-d.d.ts +0 -2
  564. package/dist/__tests__/render-feature-context.test-d.d.ts.map +0 -1
  565. package/dist/__tests__/render-feature-contract.test-d.d.ts +0 -2
  566. package/dist/__tests__/render-feature-contract.test-d.d.ts.map +0 -1
  567. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts +0 -2
  568. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts.map +0 -1
  569. package/dist/__tests__/render-feature-docs.unit.test.d.ts +0 -2
  570. package/dist/__tests__/render-feature-docs.unit.test.d.ts.map +0 -1
  571. package/dist/__tests__/render-feature-errors.unit.test.d.ts +0 -2
  572. package/dist/__tests__/render-feature-errors.unit.test.d.ts.map +0 -1
  573. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts +0 -2
  574. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts.map +0 -1
  575. package/dist/__tests__/render-feature-plan.test-d.d.ts +0 -2
  576. package/dist/__tests__/render-feature-plan.test-d.d.ts.map +0 -1
  577. package/dist/__tests__/render-feature-plan.unit.test.d.ts +0 -2
  578. package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +0 -1
  579. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts +0 -2
  580. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts.map +0 -1
  581. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts +0 -2
  582. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts.map +0 -1
  583. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +0 -2
  584. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +0 -1
  585. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts +0 -2
  586. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts.map +0 -1
  587. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts +0 -2
  588. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts.map +0 -1
  589. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts +0 -2
  590. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts.map +0 -1
  591. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts +0 -2
  592. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts.map +0 -1
  593. package/dist/__tests__/render-feature-public-surface.test-d.d.ts +0 -2
  594. package/dist/__tests__/render-feature-public-surface.test-d.d.ts.map +0 -1
  595. package/dist/__tests__/render-feature-retry.unit.test.d.ts +0 -2
  596. package/dist/__tests__/render-feature-retry.unit.test.d.ts.map +0 -1
  597. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts +0 -2
  598. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts.map +0 -1
  599. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts +0 -2
  600. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts.map +0 -1
  601. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts +0 -2
  602. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts.map +0 -1
  603. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts +0 -2
  604. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts.map +0 -1
  605. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts +0 -2
  606. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts.map +0 -1
  607. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts +0 -2
  608. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts.map +0 -1
  609. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts +0 -7
  610. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts.map +0 -1
  611. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts +0 -2
  612. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts.map +0 -1
  613. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts +0 -2
  614. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts.map +0 -1
  615. package/dist/__tests__/render-graph-hzb-gpu.d.ts +0 -7
  616. package/dist/__tests__/render-graph-hzb-gpu.d.ts.map +0 -1
  617. package/dist/__tests__/render-graph-hzb.browser.test.d.ts +0 -2
  618. package/dist/__tests__/render-graph-hzb.browser.test.d.ts.map +0 -1
  619. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts +0 -2
  620. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts.map +0 -1
  621. package/dist/__tests__/render-graph-primitives.unit.test.d.ts +0 -2
  622. package/dist/__tests__/render-graph-primitives.unit.test.d.ts.map +0 -1
  623. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts +0 -12
  624. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts.map +0 -1
  625. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts +0 -2
  626. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts.map +0 -1
  627. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts +0 -2
  628. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts.map +0 -1
  629. package/dist/__tests__/render-scene-projection.unit.test.d.ts +0 -2
  630. package/dist/__tests__/render-scene-projection.unit.test.d.ts.map +0 -1
  631. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts +0 -2
  632. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts.map +0 -1
  633. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +0 -2
  634. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +0 -1
  635. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts +0 -2
  636. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts.map +0 -1
  637. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts +0 -2
  638. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts.map +0 -1
  639. package/dist/__tests__/shader-stage-surface.unit.test.d.ts +0 -2
  640. package/dist/__tests__/shader-stage-surface.unit.test.d.ts.map +0 -1
  641. package/dist/__tests__/ssao-config.unit.test.d.ts +0 -2
  642. package/dist/__tests__/ssao-config.unit.test.d.ts.map +0 -1
  643. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts +0 -2
  644. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts.map +0 -1
  645. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +0 -2
  646. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +0 -1
  647. package/dist/__tests__/standard-descriptors.test-d.d.ts +0 -2
  648. package/dist/__tests__/standard-descriptors.test-d.d.ts.map +0 -1
  649. package/dist/__tests__/standard-pipeline.dawn.test.d.ts +0 -2
  650. package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +0 -1
  651. package/dist/__tests__/standard-pipeline.integration.test.d.ts +0 -2
  652. package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +0 -1
  653. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +0 -2
  654. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +0 -1
  655. package/dist/__tests__/surface-configuration.unit.test.d.ts +0 -2
  656. package/dist/__tests__/surface-configuration.unit.test.d.ts.map +0 -1
  657. package/dist/__tests__/texture-usage-surface.unit.test.d.ts +0 -2
  658. package/dist/__tests__/texture-usage-surface.unit.test.d.ts.map +0 -1
  659. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts +0 -2
  660. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts.map +0 -1
  661. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts +0 -2
  662. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts.map +0 -1
  663. package/dist/__tests__/urp-pipeline.unit.test.d.ts +0 -2
  664. package/dist/__tests__/urp-pipeline.unit.test.d.ts.map +0 -1
  665. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts +0 -2
  666. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts.map +0 -1
  667. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts +0 -2
  668. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts.map +0 -1
  669. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts +0 -2
  670. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts.map +0 -1
  671. package/dist/__tests__/visibility-extract.integration.test.d.ts +0 -2
  672. package/dist/__tests__/visibility-extract.integration.test.d.ts.map +0 -1
  673. package/dist/__tests__/visibility-extract.perf.test.d.ts +0 -2
  674. package/dist/__tests__/visibility-extract.perf.test.d.ts.map +0 -1
  675. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts +0 -2
  676. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts.map +0 -1
  677. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts +0 -2
  678. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts.map +0 -1
  679. package/dist/__tests__/visibility-instances.integration.test.d.ts +0 -2
  680. package/dist/__tests__/visibility-instances.integration.test.d.ts.map +0 -1
  681. package/dist/__tests__/visibility-multi-world.integration.test.d.ts +0 -2
  682. package/dist/__tests__/visibility-multi-world.integration.test.d.ts.map +0 -1
  683. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts +0 -2
  684. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts.map +0 -1
  685. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts +0 -2
  686. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts.map +0 -1
  687. package/dist/__tests__/visibility-public-surface.test-d.d.ts +0 -2
  688. package/dist/__tests__/visibility-public-surface.test-d.d.ts.map +0 -1
  689. package/dist/__tests__/visibility-resolver.unit.test.d.ts +0 -2
  690. package/dist/__tests__/visibility-resolver.unit.test.d.ts.map +0 -1
  691. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +0 -2
  692. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +0 -1
  693. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts +0 -2
  694. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts.map +0 -1
  695. package/dist/__tests__/vocabulary.unit.test.d.ts +0 -2
  696. package/dist/__tests__/vocabulary.unit.test.d.ts.map +0 -1
  697. package/dist/chunk-CQXZC5XI.mjs.map +0 -1
  698. package/dist/chunk-QC4VW3XJ.mjs.map +0 -1
  699. package/dist/chunk-SCRSAK5B.mjs.map +0 -1
  700. package/dist/components/__tests__/schema-contract.unit.test.d.ts +0 -2
  701. package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +0 -1
  702. package/dist/components/__tests__/schema-parity.unit.test.d.ts +0 -2
  703. package/dist/components/__tests__/schema-parity.unit.test.d.ts.map +0 -1
  704. package/dist/components/__tests__/visibility-schema.unit.test.d.ts +0 -2
  705. package/dist/components/__tests__/visibility-schema.unit.test.d.ts.map +0 -1
  706. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts +0 -2
  707. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts.map +0 -1
  708. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts +0 -2
  709. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts.map +0 -1
  710. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +0 -2
  711. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +0 -1
  712. package/dist/record/__tests__/video-texture-view.unit.test.d.ts +0 -2
  713. package/dist/record/__tests__/video-texture-view.unit.test.d.ts.map +0 -1
@@ -20,6 +20,7 @@ import {
20
20
  import {
21
21
  DEFAULT_MSDF_TEXT_PARAM_SCHEMA,
22
22
  DEFAULT_SPRITE_PARAM_SCHEMA,
23
+ DEFAULT_STANDARD_PBR_PARAM_SCHEMA,
23
24
  DEFAULT_UNLIT_PARAM_SCHEMA,
24
25
  } from '@forgeax/engine-shader';
25
26
  import type {
@@ -36,8 +37,8 @@ import type { GpuResidencyCache } from '../device/gpu-residency';
36
37
  import { VideoUploadUnsupportedError } from '../errors/render';
37
38
  import {
38
39
  assembleMaterialWithSkylightEntries,
39
- type EmissiveAoBindGroupResources,
40
40
  type SkylightBindGroupResources,
41
+ type TransmissionBindGroupResources,
41
42
  } from '../ibl/skylight-bind-group';
42
43
  import { isStandardPbrMaterialShader } from '../pbr-pipeline';
43
44
  import { deriveTextureExtent } from '../render-data';
@@ -376,10 +377,16 @@ export const BUILTIN_USER_REGION_TEXTURE_FIELDS: readonly string[] = [
376
377
  'specularTintTexture',
377
378
  'emissiveTexture',
378
379
  'occlusionTexture',
380
+ 'transmissionTexture',
381
+ 'thicknessTexture',
379
382
  ];
380
383
 
381
384
  const LEGACY_MATERIAL_TEXTURE_SCALE_OFFSET = 80;
382
- const STANDARD_PBR_TEXTURE_SCALE_OFFSET = 96;
385
+ // The Standard schema owns five transmission numeric fields between
386
+ // normalScale and the engine-owned coordinate records. Keep this fallback
387
+ // aligned with derive(DEFAULT_STANDARD_PBR_PARAM_SCHEMA): the first record is
388
+ // at byte 128, not the pre-transmission byte 96.
389
+ const STANDARD_PBR_TEXTURE_SCALE_OFFSET = 128;
383
390
  const MATERIAL_TEXTURE_SCALE_FIELDS = [
384
391
  'baseColorTexture',
385
392
  'metallicRoughnessTexture',
@@ -387,6 +394,8 @@ const MATERIAL_TEXTURE_SCALE_FIELDS = [
387
394
  'specularTintTexture',
388
395
  'emissiveTexture',
389
396
  'occlusionTexture',
397
+ 'transmissionTexture',
398
+ 'thicknessTexture',
390
399
  ] as const;
391
400
  const LEGACY_MATERIAL_TEXTURE_SCALE_FIELDS = [
392
401
  'baseColorTexture',
@@ -395,12 +404,12 @@ const LEGACY_MATERIAL_TEXTURE_SCALE_FIELDS = [
395
404
  'emissiveTexture',
396
405
  'occlusionTexture',
397
406
  ] as const;
398
- const STANDARD_PBR_TEXTURE_COORDINATE_OFFSET = 96;
407
+ const STANDARD_PBR_TEXTURE_COORDINATE_OFFSET = 128;
399
408
  const STANDARD_PBR_TEXTURE_COORDINATE_STRIDE = 8;
400
409
  const DEFAULT_LEGACY_TEXTURE_SCALES = new Float32Array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1]);
401
410
  const DEFAULT_STANDARD_TEXTURE_COORDINATES = new Float32Array([
402
411
  0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0,
403
- 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1,
412
+ 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1,
404
413
  ]);
405
414
 
406
415
  /** Derives the logical-content UV scale for an uploaded material texture. */
@@ -465,9 +474,9 @@ export function applyMaterialTextureUvScales(
465
474
  }
466
475
  return;
467
476
  }
468
- // Standard PBR grew two authored coat fields before the engine-owned UV
469
- // tail. Sprite, sprite-lit, unlit, and text keep their own 80-byte tail
470
- // position because their WGSL layouts do not carry clearcoat.
477
+ // Standard PBR has a schema-derived 128-byte authored region before the
478
+ // engine-owned UV records. Sprite, sprite-lit, unlit, and text keep their
479
+ // own legacy tail positions because their WGSL layouts differ.
471
480
  const textureScaleOffset = isStandardPbrMaterialShader(material.materialShaderId)
472
481
  ? STANDARD_PBR_TEXTURE_SCALE_OFFSET
473
482
  : LEGACY_MATERIAL_TEXTURE_SCALE_OFFSET;
@@ -523,6 +532,12 @@ export function applyMaterialTextureUvScales(
523
532
  function materialCoordinateSchema(
524
533
  material: MaterialSnapshot,
525
534
  ): readonly ParamSchemaEntry[] | undefined {
535
+ if (
536
+ isStandardPbrMaterialShader(material.materialShaderId) &&
537
+ material.paramSnapshot !== undefined
538
+ ) {
539
+ return DEFAULT_STANDARD_PBR_PARAM_SCHEMA;
540
+ }
526
541
  if (material.materialParamSchema !== undefined && material.materialParamSchema.length > 0) {
527
542
  return material.materialParamSchema;
528
543
  }
@@ -543,15 +558,16 @@ function materialCoordinateSchema(
543
558
  * feat-20260621-learn-render-5-5-parallax M2 / w8 (D-3): ordered user-region
544
559
  * texture field names for a material's bind-group assembly, derived from the
545
560
  * shader's paramSchema via the `derive()` SSOT (insertion order = sampler/
546
- * texture pair order in derive().bglEntries). Falls back to the built-in 4
547
- * fields when the schema is unavailable.
561
+ * texture pair order in derive().bglEntries). Falls back to the built-in
562
+ * fields only when the schema is unavailable; an explicit empty schema means
563
+ * the authored material has no user-region textures.
548
564
  */
549
565
  export function userRegionTextureFieldOrder(
550
566
  schema: Parameters<typeof derive>[0] | undefined,
551
567
  ): readonly string[] {
552
- if (schema === undefined || schema.length === 0) return BUILTIN_USER_REGION_TEXTURE_FIELDS;
568
+ if (schema === undefined) return BUILTIN_USER_REGION_TEXTURE_FIELDS;
553
569
  const fields = [...derivedParamSchema(schema).textureFieldNames];
554
- return fields.length === 0 ? BUILTIN_USER_REGION_TEXTURE_FIELDS : fields;
570
+ return fields;
555
571
  }
556
572
 
557
573
  /**
@@ -613,7 +629,7 @@ export function detectNineSliceScaleTooSmall(
613
629
  }
614
630
 
615
631
  /**
616
- * Build the 128-byte Material UBO payload for a PBR / unlit material entry
632
+ * Build the 384-byte Material UBO payload for a PBR / unlit material entry
617
633
  * (feat-20260527-sprite-nineslice M2 / w11; D-7 regression-net helper).
618
634
  *
619
635
  * Byte-for-byte equivalent to the legacy hard-coded PBR write path; each
@@ -634,7 +650,7 @@ export function buildPbrMaterialUboPayload(material: MaterialSnapshot): Uint8Arr
634
650
  *
635
651
  * The allocating wrapper above remains the byte-stable test/helper surface,
636
652
  * while the frame recorder reuses one scratch slot for all materials. A
637
- * scene with thousands of submeshes otherwise allocates one 304-byte
653
+ * scene with thousands of submeshes otherwise allocates one 384-byte
638
654
  * Uint8Array per material per frame, creating avoidable GC pressure without
639
655
  * changing GPU-visible bytes.
640
656
  */
@@ -667,9 +683,13 @@ export function writePbrMaterialUboPayload(
667
683
  // f32[18] clearcoat (offset 72)
668
684
  // f32[19] clearcoatRoughness (offset 76)
669
685
  // f32[20..22] specularTint (offset 80, vec3)
670
- // (offset 92..95 alignment pad)
671
- // f32[24..71] engine-owned texture coordinate records (offset 96)
672
- // f32[72] normalScale (offset 288)
686
+ // f32[23] normalScale (offset 92)
687
+ // f32[24] transmission (offset 96)
688
+ // f32[25] ior (offset 100)
689
+ // f32[26] thickness (offset 104)
690
+ // f32[28..30] attenuationColor (offset 112, vec3)
691
+ // f32[31] attenuationDistance(offset 124)
692
+ // f32[32..95] engine-owned texture coordinate records (offset 128)
673
693
  f32[0] = material.baseColor[0] ?? 0;
674
694
  f32[1] = material.baseColor[1] ?? 0;
675
695
  f32[2] = material.baseColor[2] ?? 0;
@@ -700,7 +720,28 @@ export function writePbrMaterialUboPayload(
700
720
  f32[20] = specularTint?.[0] ?? 1;
701
721
  f32[21] = specularTint?.[1] ?? 1;
702
722
  f32[22] = specularTint?.[2] ?? 1;
703
- f32[72] = material.normalScale ?? 1;
723
+ const snapshotNumber = (name: string, fallback: number): number => {
724
+ const value = material.paramSnapshot?.[name];
725
+ return typeof value === 'number' ? value : fallback;
726
+ };
727
+ const snapshotVec3 = (
728
+ name: string,
729
+ fallback: readonly [number, number, number],
730
+ ): readonly [number, number, number] => {
731
+ const value = material.paramSnapshot?.[name];
732
+ return Array.isArray(value)
733
+ ? [value[0] ?? fallback[0], value[1] ?? fallback[1], value[2] ?? fallback[2]]
734
+ : fallback;
735
+ };
736
+ f32[23] = material.normalScale ?? snapshotNumber('normalScale', 1);
737
+ f32[24] = snapshotNumber('transmission', 0);
738
+ f32[25] = snapshotNumber('ior', 1.5);
739
+ f32[26] = snapshotNumber('thickness', 0);
740
+ const attenuationColor = snapshotVec3('attenuationColor', [1, 1, 1]);
741
+ f32[28] = attenuationColor[0];
742
+ f32[29] = attenuationColor[1];
743
+ f32[30] = attenuationColor[2];
744
+ f32[31] = snapshotNumber('attenuationDistance', 0);
704
745
  // Schema-driven paramSnapshot overlay (feat-20260523 M9-T05, AC-14):
705
746
  // for user-shaders with a paramSnapshot, project the first vec4/color
706
747
  // entry onto slot 0 and the first two f32 entries onto slot 1's first
@@ -780,7 +821,13 @@ export function applyParamSnapshotToUbo(
780
821
  if (paramSchema === undefined) return;
781
822
  if (paramSnapshot === undefined) return;
782
823
  const f32 = materialUboFloatView(payload);
783
- const { uboLayout } = derivedParamSchema(paramSchema);
824
+ const effectiveSchema =
825
+ Object.hasOwn(paramSnapshot, 'transmission') &&
826
+ Object.hasOwn(paramSnapshot, 'ior') &&
827
+ Object.hasOwn(paramSnapshot, 'thickness')
828
+ ? DEFAULT_STANDARD_PBR_PARAM_SCHEMA
829
+ : paramSchema;
830
+ const { uboLayout } = derivedParamSchema(effectiveSchema);
784
831
  for (const entry of uboLayout.entries) {
785
832
  const value = paramSnapshot[entry.name];
786
833
  if (value === undefined) continue;
@@ -837,6 +884,8 @@ export interface PerSubmeshMaterialBgDeps {
837
884
  readonly materialBgShared: Map<string, WeakMap<object, unknown>>;
838
885
  /** Cross-frame final BG reuse keyed by the stable source material handle. */
839
886
  readonly materialBgAssemblyCache: Map<string, MaterialBgAssemblyCacheEntry>;
887
+ /** Active transmission backdrop; undefined/null means layout placeholder. */
888
+ readonly transmissionBackdropView?: TextureView | null;
840
889
  readonly bindGroupCounts: BindGroupCounts;
841
890
  }
842
891
 
@@ -848,7 +897,9 @@ export function isMaterialBgAssemblyCacheHit(
848
897
  materialBuffer: Buffer,
849
898
  skylightResources: SkylightBindGroupResources,
850
899
  materialResourceEpoch: number,
900
+ transmissionBackdropView?: TextureView | null,
851
901
  ): cached is MaterialBgAssemblyCacheEntry {
902
+ if (transmissionBackdropView != null) return false;
852
903
  return (
853
904
  cached?.material === material &&
854
905
  cached.materialResourceEpoch === materialResourceEpoch &&
@@ -879,6 +930,7 @@ export function buildPerSubmeshMaterialBg(
879
930
  skylightResources,
880
931
  materialBgShared,
881
932
  materialBgAssemblyCache,
933
+ transmissionBackdropView,
882
934
  bindGroupCounts,
883
935
  } = deps;
884
936
  const smMaterialHandle = submeshMaterial.materialHandle;
@@ -889,7 +941,8 @@ export function buildPerSubmeshMaterialBg(
889
941
  const smPerShaderBgl =
890
942
  smShaderId !== undefined ? runtime.getMaterialBindGroupLayout?.(smShaderId) : undefined;
891
943
  const smMaterialBgl = smPerShaderBgl ?? pipelineState.materialBindGroupLayout;
892
- if (smMaterialHandle !== undefined && !smHasVideoFields) {
944
+ const hasActiveTransmissionBackdrop = transmissionBackdropView != null;
945
+ if (smMaterialHandle !== undefined && !smHasVideoFields && !hasActiveTransmissionBackdrop) {
893
946
  const cached =
894
947
  materialCacheKey === undefined ? undefined : materialBgAssemblyCache.get(materialCacheKey);
895
948
  if (
@@ -900,6 +953,7 @@ export function buildPerSubmeshMaterialBg(
900
953
  pipelineState.materialUniformBuffer.buffer,
901
954
  skylightResources,
902
955
  store.materialResourceEpoch,
956
+ transmissionBackdropView,
903
957
  )
904
958
  ) {
905
959
  return cached.bindGroup;
@@ -908,12 +962,11 @@ export function buildPerSubmeshMaterialBg(
908
962
  const smSchema =
909
963
  submeshMaterial.materialParamSchema ??
910
964
  (smShaderId !== undefined ? runtime.getParamSchema?.(smShaderId) : undefined);
911
- // The shipped PBR shaders always own the six texture pairs declared by the
912
- // standard shader artifact. Authored material snapshots may intentionally
913
- // carry a compact four-field schema because emissive/occlusion are engine
914
- // injected values, but the runtime PBR BGL still exposes bindings 9..12 for
915
- // those pairs. Keep the record projection on the shader-owned layout so IBL
916
- // starts at binding 13 rather than colliding with emissiveSampler.
965
+ // The shipped PBR shaders always own the eight texture pairs declared by the
966
+ // standard shader artifact. The runtime PBR BGL exposes those pairs directly;
967
+ // emissive and occlusion are not duplicated in an engine injection region.
968
+ // Keep the record projection on the shader-owned layout so IBL starts at
969
+ // binding 17 rather than colliding with transmissionSampler.
917
970
  const smUserRegionFields =
918
971
  smPerShaderBgl === undefined || isStandardPbrMaterialShader(smShaderId)
919
972
  ? BUILTIN_USER_REGION_TEXTURE_FIELDS
@@ -986,48 +1039,43 @@ export function buildPerSubmeshMaterialBg(
986
1039
  },
987
1040
  );
988
1041
  }
989
- let smEmissiveView: TextureView = pipelineState.defaultWhiteTextureView;
990
- const smEmissiveHandle = submeshMaterial.emissiveTexture;
991
- if (smEmissiveHandle !== undefined) {
992
- const view = residentTextureView(materialWorld, store, runtime, smEmissiveHandle);
993
- if (view !== undefined) smEmissiveView = view;
994
- else materialResourcesResident = false;
995
- }
996
- let smOcclusionView: TextureView = pipelineState.defaultWhiteTextureView;
997
- const smOcclusionHandle = submeshMaterial.occlusionTexture;
998
- if (smOcclusionHandle !== undefined) {
999
- const view = residentTextureView(materialWorld, store, runtime, smOcclusionHandle);
1000
- if (view !== undefined) smOcclusionView = view;
1001
- else materialResourcesResident = false;
1002
- }
1003
- const smEmissiveAo: EmissiveAoBindGroupResources = {
1004
- emissiveSampler: smSamplerForField('emissiveTexture'),
1005
- emissiveView: smEmissiveView,
1006
- occlusionSampler: smSamplerForField('occlusionTexture'),
1007
- occlusionView: smOcclusionView,
1042
+ // The backdrop is a full mip-chain view owned by the pipeline. Reuse the
1043
+ // pipeline's existing filtering/clamp sampler for screen-space sampling;
1044
+ // the material default sampler intentionally keeps repeat addressing for
1045
+ // authored UV textures and is not a backdrop sampler.
1046
+ const transmissionSampler =
1047
+ transmissionBackdropView != null
1048
+ ? skylightResources.prefilterSampler
1049
+ : pipelineState.defaultSampler;
1050
+ const smMergedEntries = assembleMaterialWithSkylightEntries(smBaseEntries, skylightResources, {
1051
+ sampler: transmissionSampler,
1052
+ ...(transmissionBackdropView === undefined ? {} : { backdropView: transmissionBackdropView }),
1053
+ } satisfies TransmissionBindGroupResources);
1054
+ const createBindGroup = (): BindGroup => {
1055
+ const result = runtime.device.createBindGroup({
1056
+ label: 'pbr-material-skylight-bg',
1057
+ layout: smMaterialBgl,
1058
+ entries: smMergedEntries,
1059
+ });
1060
+ if (!result.ok) throw result.error;
1061
+ return result.value;
1008
1062
  };
1009
- const smMergedEntries = assembleMaterialWithSkylightEntries(
1010
- smBaseEntries,
1011
- skylightResources,
1012
- smEmissiveAo,
1013
- );
1014
- const smBindGroup = getOrCreatePerEntity(
1015
- materialBgShared,
1016
- smShaderId ?? '',
1017
- smMergedEntries.map((e) => extractEntryResourceHandle(e)),
1018
- 'material-shared',
1019
- () => {
1020
- const result = runtime.device.createBindGroup({
1021
- label: 'pbr-material-skylight-bg',
1022
- layout: smMaterialBgl,
1023
- entries: smMergedEntries,
1024
- });
1025
- if (!result.ok) throw result.error;
1026
- return result.value;
1027
- },
1028
- bindGroupCounts,
1029
- );
1030
- if (smMaterialHandle !== undefined && !smHasVideoFields && materialResourcesResident) {
1063
+ const smBindGroup = hasActiveTransmissionBackdrop
1064
+ ? createBindGroup()
1065
+ : getOrCreatePerEntity(
1066
+ materialBgShared,
1067
+ smShaderId ?? '',
1068
+ smMergedEntries.map((e) => extractEntryResourceHandle(e)),
1069
+ 'material-shared',
1070
+ createBindGroup,
1071
+ bindGroupCounts,
1072
+ );
1073
+ if (
1074
+ smMaterialHandle !== undefined &&
1075
+ !smHasVideoFields &&
1076
+ materialResourcesResident &&
1077
+ !hasActiveTransmissionBackdrop
1078
+ ) {
1031
1079
  if (materialCacheKey !== undefined) {
1032
1080
  materialBgAssemblyCache.set(materialCacheKey, {
1033
1081
  material: submeshMaterial,
@@ -5,10 +5,12 @@
5
5
  import type { World } from '@forgeax/engine-ecs';
6
6
  import {
7
7
  type BindGroup,
8
+ type BindGroupEntry,
8
9
  type Buffer,
9
10
  type RenderPipeline,
10
11
  RhiError,
11
12
  type RhiRenderPassEncoder,
13
+ type TextureView,
12
14
  } from '@forgeax/engine-rhi';
13
15
  import type { Handle, MaterialRenderState } from '@forgeax/engine-types';
14
16
  import { GpuBuffer } from '../gpu-resource';
@@ -19,7 +21,6 @@ import {
19
21
  } from '../gpu-usage';
20
22
  import {
21
23
  assembleMaterialWithSkylightEntries,
22
- type EmissiveAoBindGroupResources,
23
24
  type SkylightBindGroupResources,
24
25
  } from '../ibl/skylight-bind-group';
25
26
  import type { InstanceBufferCacheEntry } from '../instance-buffer-cache';
@@ -31,7 +32,12 @@ import {
31
32
  } from '../pipeline-spec';
32
33
  import type { MaterialSnapshot, SpriteInstancesSnapshot } from '../render-system-extract';
33
34
  import { worldEntityKey } from './frame-snapshot';
34
- import { entityHasTransparentSubmesh, residentTextureView } from './main-pass-material';
35
+ import {
36
+ BUILTIN_USER_REGION_TEXTURE_FIELDS,
37
+ defaultViewForUserRegionField,
38
+ entityHasTransparentSubmesh,
39
+ residentTextureView,
40
+ } from './main-pass-material';
35
41
  import {
36
42
  extractEntryResourceHandle,
37
43
  getOrCreatePerEntity,
@@ -44,6 +50,51 @@ import { MATERIAL_PER_ENTITY_STRIDE, STANDARD_PBR_UBO_SIZE } from './render-cont
44
50
 
45
51
  export type { SpriteInstancesSnapshot };
46
52
 
53
+ /**
54
+ * Build the sprite material's Standard user-region from the shared field-order
55
+ * owner. The sprite shader uses the same Standard material bind-group layout;
56
+ * keeping this projection derived from the shared list prevents IBL injection
57
+ * from moving ahead of newly added material texture pairs.
58
+ */
59
+ export function buildSpritePassBaseMaterialEntries(
60
+ pipelineState: _InternalRenderPipelineContext['pipelineState'],
61
+ spriteTexView: TextureView,
62
+ ): BindGroupEntry[] {
63
+ const entries: BindGroupEntry[] = [
64
+ {
65
+ binding: 0,
66
+ resource: {
67
+ kind: 'buffer' as const,
68
+ value: {
69
+ buffer: pipelineState.materialUniformBuffer.buffer,
70
+ offset: 0,
71
+ size: STANDARD_PBR_UBO_SIZE,
72
+ },
73
+ },
74
+ },
75
+ ];
76
+ for (const [index, field] of BUILTIN_USER_REGION_TEXTURE_FIELDS.entries()) {
77
+ const view =
78
+ field === 'baseColorTexture'
79
+ ? spriteTexView
80
+ : defaultViewForUserRegionField(field, pipelineState);
81
+ entries.push(
82
+ {
83
+ binding: 1 + index * 2,
84
+ resource: {
85
+ kind: 'sampler' as const,
86
+ value: index === 0 ? pipelineState.nearestSampler : pipelineState.defaultSampler,
87
+ },
88
+ },
89
+ {
90
+ binding: 2 + index * 2,
91
+ resource: { kind: 'textureView' as const, value: view },
92
+ },
93
+ );
94
+ }
95
+ return entries;
96
+ }
97
+
47
98
  /**
48
99
  * Build the interleaved sprite instance payload consumed by this record owner.
49
100
  * The extract stage validates the two packed arrays before they reach this
@@ -159,6 +210,12 @@ export function recordSpritePass(
159
210
  viewBindGroup,
160
211
  splitLdrSprite,
161
212
  } = c;
213
+ // The split pass is also used by the no-tone linear-LDR route. That route
214
+ // keeps transparent draws in the graph-owned rgba16float attachment, so
215
+ // sprite shaders must use their linear/HDR fragment entry point even though
216
+ // the camera itself has no tone map enabled.
217
+ const spriteIsHdr =
218
+ c.tonemapActive || transparentPassColorFormat(c, pipelineState) === 'rgba16float';
162
219
  let geometryPassEnded = false;
163
220
  if (splitLdrSprite && (graphPass !== undefined || ldrSpritePassView !== null)) {
164
221
  if (graphPass === undefined) {
@@ -203,7 +260,7 @@ export function recordSpritePass(
203
260
  ) as never,
204
261
  );
205
262
 
206
- spritePass.setBindGroup(0, viewBindGroup as BindGroup);
263
+ spritePass.setBindGroup(0, viewBindGroup as BindGroup, [0]);
207
264
 
208
265
  // feat-20260625-refactor-sprite-as-transparent-mesh M3 / w14 (D-7):
209
266
  // sprite PSO resolution migrated from the dedicated boot-time PSO
@@ -253,7 +310,7 @@ export function recordSpritePass(
253
310
  const spritePH =
254
311
  runtime.getMaterialShaderPipeline?.(
255
312
  'forgeax::sprite',
256
- /* isHdr */ false,
313
+ spriteIsHdr,
257
314
  spritePremulBlend,
258
315
  'triangle-list',
259
316
  undefined,
@@ -273,7 +330,7 @@ export function recordSpritePass(
273
330
  const spritePH_withRegion =
274
331
  runtime.getMaterialShaderPipeline?.(
275
332
  'forgeax::sprite',
276
- /* isHdr */ false,
333
+ spriteIsHdr,
277
334
  spritePremulBlend,
278
335
  'triangle-list',
279
336
  undefined,
@@ -296,7 +353,6 @@ export function recordSpritePass(
296
353
  // present), then fall through to the PBR loop. A PBR-only transparent
297
354
  // scene (e.g. a glTF BLEND decal, no sprites) renders regardless of
298
355
  // whether sprite.wgsl is in the manifest.
299
- const spriteUnavailable = spritePH === null;
300
356
  let spriteUnavailableReported = false;
301
357
  const reportSpriteUnavailable = (): void => {
302
358
  if (spriteUnavailableReported) return;
@@ -316,7 +372,7 @@ export function recordSpritePass(
316
372
  const spriteLitPH =
317
373
  runtime.getMaterialShaderPipeline?.(
318
374
  'forgeax::sprite-lit',
319
- /* isHdr */ false,
375
+ spriteIsHdr,
320
376
  spritePremulBlend,
321
377
  'triangle-list',
322
378
  undefined,
@@ -326,7 +382,6 @@ export function recordSpritePass(
326
382
  msaaActive ? 4 : 1,
327
383
  transparentPassColorFormat(c) as GPUTextureFormat,
328
384
  ) ?? null;
329
-
330
385
  recordSpriteEntityDraws(
331
386
  c,
332
387
  spritePass,
@@ -335,7 +390,6 @@ export function recordSpritePass(
335
390
  spritePH,
336
391
  spritePH_withRegion,
337
392
  spriteLitPH,
338
- spriteUnavailable,
339
393
  reportSpriteUnavailable,
340
394
  );
341
395
 
@@ -397,6 +451,8 @@ function recordSpriteTransparentPbrDraws(
397
451
  ): void {
398
452
  const { runtime, pipelineState, frameState, bindGroupCounts, validatedOrdered, meshBindGroup } =
399
453
  c;
454
+ const isHdrTarget =
455
+ c.tonemapActive || transparentPassColorFormat(c, pipelineState) === 'rgba16float';
400
456
  let lastPbrSubPipelineHandle: typeof pipelineState.unlitPipeline = null;
401
457
  let lastPbrSubVertexBuffer: GpuBuffer | null = null;
402
458
  let lastPbrSubIndexBuffer: GpuBuffer | null = null;
@@ -495,7 +551,7 @@ function recordSpriteTransparentPbrDraws(
495
551
  const subPipeline =
496
552
  runtime.getMaterialShaderPipeline?.(
497
553
  smShaderId,
498
- /* isHdr */ false,
554
+ isHdrTarget,
499
555
  submeshMaterial.renderState,
500
556
  sm.topology,
501
557
  entry.mesh.indexFormat,
@@ -546,7 +602,6 @@ function recordSpriteEntityDraws(
546
602
  spritePH: RenderPipeline | null,
547
603
  spritePH_withRegion: RenderPipeline | null,
548
604
  spriteLitPH: RenderPipeline | null,
549
- spriteUnavailable: boolean,
550
605
  reportSpriteUnavailable: () => void,
551
606
  ): void {
552
607
  const {
@@ -582,22 +637,18 @@ function recordSpriteEntityDraws(
582
637
  const isSpriteShader = sid === 'forgeax::sprite' || sid === 'forgeax::sprite-lit';
583
638
  if (!isSpriteShader) continue;
584
639
  }
585
- // Sprite PSO unavailable (sprite.wgsl absent / still compiling): skip
586
- // sprite entities and report once, but do NOT abort the sub-pass — the
587
- // PBR transparent loop below is independent of the sprite shader.
588
- if (spriteUnavailable) {
589
- reportSpriteUnavailable();
590
- continue;
591
- }
592
-
593
640
  // feat-20260622-chunk-gpu-instancing-sprite-tilemap M1 / w4-record-swap
594
641
  // (D-1): fold-bucket non-head member — skip; the bucket head emits one
595
642
  // instanced drawIndexed covering all members.
596
- if (foldDispatchPlan?.skipIndices.has(i) === true) continue;
643
+ if (foldDispatchPlan?.skipIndices.has(i) === true) {
644
+ continue;
645
+ }
597
646
  const foldHeadBucket = foldDispatchPlan?.headBuckets.get(i);
598
647
 
599
648
  // feat-20260609 M2: skip entities that don't match the pass selector.
600
- if (matchedIndices !== null && !matchedIndices.has(spriteEntry.renderableIndex)) continue;
649
+ if (matchedIndices !== null && !matchedIndices.has(spriteEntry.renderableIndex)) {
650
+ continue;
651
+ }
601
652
 
602
653
  // feat-20260624 M1' / t7: select sprite vs sprite-lit PSO per
603
654
  // entity. Both paths share the LDR sub-pass + the same UBO
@@ -629,7 +680,9 @@ function recordSpriteEntityDraws(
629
680
  // way fail-safe-skip is the closest the renderer can get to
630
681
  // "show nothing visibly wrong" without ending the sprite pass
631
682
  // (which would drop remaining sprite entities for the frame).
632
- if (entityShaderId === 'forgeax::sprite-lit') {
683
+ if (entityShaderId === 'forgeax::sprite') {
684
+ reportSpriteUnavailable();
685
+ } else if (entityShaderId === 'forgeax::sprite-lit') {
633
686
  runtime.errorRegistry.fire(
634
687
  new RhiError({
635
688
  code: 'shader-compile-failed',
@@ -919,89 +972,13 @@ function recordSpriteEntityDraws(
919
972
  const tv = residentTextureView(spriteEntry.world ?? world, store, runtime, spriteTexHandle);
920
973
  if (tv !== undefined) spriteTexView = tv as never;
921
974
  }
922
- const spritePassBaseMaterialEntries = [
923
- {
924
- binding: 0,
925
- resource: {
926
- kind: 'buffer' as const,
927
- value: {
928
- buffer: pipelineState.materialUniformBuffer.buffer,
929
- offset: 0,
930
- size: STANDARD_PBR_UBO_SIZE,
931
- },
932
- },
933
- },
934
- {
935
- binding: 1,
936
- resource: { kind: 'sampler' as const, value: pipelineState.nearestSampler },
937
- },
938
- { binding: 2, resource: { kind: 'textureView' as const, value: spriteTexView } },
939
- {
940
- binding: 3,
941
- resource: { kind: 'sampler' as const, value: pipelineState.defaultSampler },
942
- },
943
- {
944
- binding: 4,
945
- resource: {
946
- kind: 'textureView' as const,
947
- value: pipelineState.defaultWhiteTextureView,
948
- },
949
- },
950
- {
951
- binding: 5,
952
- resource: { kind: 'sampler' as const, value: pipelineState.defaultSampler },
953
- },
954
- {
955
- binding: 6,
956
- resource: {
957
- kind: 'textureView' as const,
958
- value: pipelineState.defaultNormalTextureView,
959
- },
960
- },
961
- {
962
- binding: 7,
963
- resource: { kind: 'sampler' as const, value: pipelineState.defaultSampler },
964
- },
965
- {
966
- binding: 8,
967
- resource: {
968
- kind: 'textureView' as const,
969
- value: pipelineState.defaultWhiteTextureView,
970
- },
971
- },
972
- {
973
- binding: 9,
974
- resource: { kind: 'sampler' as const, value: pipelineState.defaultSampler },
975
- },
976
- {
977
- binding: 10,
978
- resource: {
979
- kind: 'textureView' as const,
980
- value: pipelineState.defaultWhiteTextureView,
981
- },
982
- },
983
- {
984
- binding: 11,
985
- resource: { kind: 'sampler' as const, value: pipelineState.defaultSampler },
986
- },
987
- {
988
- binding: 12,
989
- resource: {
990
- kind: 'textureView' as const,
991
- value: pipelineState.defaultWhiteTextureView,
992
- },
993
- },
994
- ];
995
- const spritePassEmissiveAo: EmissiveAoBindGroupResources = {
996
- emissiveSampler: pipelineState.defaultSampler,
997
- emissiveView: pipelineState.defaultWhiteTextureView,
998
- occlusionSampler: pipelineState.defaultSampler,
999
- occlusionView: pipelineState.defaultWhiteTextureView,
1000
- };
975
+ const spritePassBaseMaterialEntries = buildSpritePassBaseMaterialEntries(
976
+ pipelineState,
977
+ spriteTexView,
978
+ );
1001
979
  const spritePassMergedEntries = assembleMaterialWithSkylightEntries(
1002
980
  spritePassBaseMaterialEntries,
1003
981
  skylightResources,
1004
- spritePassEmissiveAo,
1005
982
  );
1006
983
 
1007
984
  // Sprite-pass material BG cache: keyed on shader id (shared across all