@forgeax/engine-render 0.1.2

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 (1172) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +1019 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/__tests__/analytic-sky-contract.test.d.ts +2 -0
  5. package/dist/__tests__/analytic-sky-contract.test.d.ts.map +1 -0
  6. package/dist/__tests__/analytic-sky-falsify.test.d.ts +2 -0
  7. package/dist/__tests__/analytic-sky-falsify.test.d.ts.map +1 -0
  8. package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts +2 -0
  9. package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts.map +1 -0
  10. package/dist/__tests__/authoring-path.unit.test.d.ts +2 -0
  11. package/dist/__tests__/authoring-path.unit.test.d.ts.map +1 -0
  12. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts +2 -0
  13. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts.map +1 -0
  14. package/dist/__tests__/backend-selection.integration.test.d.ts +2 -0
  15. package/dist/__tests__/backend-selection.integration.test.d.ts.map +1 -0
  16. package/dist/__tests__/callback-inference.test-d.d.ts +2 -0
  17. package/dist/__tests__/callback-inference.test-d.d.ts.map +1 -0
  18. package/dist/__tests__/camera-temporal.test-d.d.ts +2 -0
  19. package/dist/__tests__/camera-temporal.test-d.d.ts.map +1 -0
  20. package/dist/__tests__/camera-temporal.test.d.ts +2 -0
  21. package/dist/__tests__/camera-temporal.test.d.ts.map +1 -0
  22. package/dist/__tests__/cluster-binner.test.d.ts +2 -0
  23. package/dist/__tests__/cluster-binner.test.d.ts.map +1 -0
  24. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts +2 -0
  25. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts.map +1 -0
  26. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts +2 -0
  27. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts.map +1 -0
  28. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts +2 -0
  29. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts.map +1 -0
  30. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts +2 -0
  31. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts.map +1 -0
  32. package/dist/__tests__/directional-shadow-probe-atlas-layout.unit.test.d.ts +2 -0
  33. package/dist/__tests__/directional-shadow-probe-atlas-layout.unit.test.d.ts.map +1 -0
  34. package/dist/__tests__/environment-inspection.test.d.ts +2 -0
  35. package/dist/__tests__/environment-inspection.test.d.ts.map +1 -0
  36. package/dist/__tests__/factory-contract.integration.test.d.ts +2 -0
  37. package/dist/__tests__/factory-contract.integration.test.d.ts.map +1 -0
  38. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts +2 -0
  39. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts.map +1 -0
  40. package/dist/__tests__/fog-ai-user.fixture.d.ts +2 -0
  41. package/dist/__tests__/fog-ai-user.fixture.d.ts.map +1 -0
  42. package/dist/__tests__/fog-custom-render-feature.fixture.d.ts +16 -0
  43. package/dist/__tests__/fog-custom-render-feature.fixture.d.ts.map +1 -0
  44. package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts +2 -0
  45. package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts.map +1 -0
  46. package/dist/__tests__/fog-inspection.integration.test.d.ts +2 -0
  47. package/dist/__tests__/fog-inspection.integration.test.d.ts.map +1 -0
  48. package/dist/__tests__/fog-owner-state.integration.test.d.ts +2 -0
  49. package/dist/__tests__/fog-owner-state.integration.test.d.ts.map +1 -0
  50. package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts +2 -0
  51. package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts.map +1 -0
  52. package/dist/__tests__/fog-public-surface.integration.test.d.ts +2 -0
  53. package/dist/__tests__/fog-public-surface.integration.test.d.ts.map +1 -0
  54. package/dist/__tests__/fog-ray-contract.integration.test.d.ts +2 -0
  55. package/dist/__tests__/fog-ray-contract.integration.test.d.ts.map +1 -0
  56. package/dist/__tests__/fog-source-absence.integration.test.d.ts +2 -0
  57. package/dist/__tests__/fog-source-absence.integration.test.d.ts.map +1 -0
  58. package/dist/__tests__/fog-temporal.integration.test.d.ts +2 -0
  59. package/dist/__tests__/fog-temporal.integration.test.d.ts.map +1 -0
  60. package/dist/__tests__/frame-chain.unit.test.d.ts +2 -0
  61. package/dist/__tests__/frame-chain.unit.test.d.ts.map +1 -0
  62. package/dist/__tests__/frame-observation.contract.test.d.ts +2 -0
  63. package/dist/__tests__/frame-observation.contract.test.d.ts.map +1 -0
  64. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts +2 -0
  65. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts.map +1 -0
  66. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts +6 -0
  67. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +1 -0
  68. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts +2 -0
  69. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts.map +1 -0
  70. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts +2 -0
  71. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts.map +1 -0
  72. package/dist/__tests__/gpu-driven-production.integration.test.d.ts +2 -0
  73. package/dist/__tests__/gpu-driven-production.integration.test.d.ts.map +1 -0
  74. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts +2 -0
  75. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts.map +1 -0
  76. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +12 -0
  77. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +1 -0
  78. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts +2 -0
  79. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts.map +1 -0
  80. package/dist/__tests__/gpu-driven-view.browser.test.d.ts +2 -0
  81. package/dist/__tests__/gpu-driven-view.browser.test.d.ts.map +1 -0
  82. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts +2 -0
  83. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts.map +1 -0
  84. package/dist/__tests__/gpu-driven-view.unit.test.d.ts +2 -0
  85. package/dist/__tests__/gpu-driven-view.unit.test.d.ts.map +1 -0
  86. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts +2 -0
  87. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts.map +1 -0
  88. package/dist/__tests__/gpu-scene-field-type-owner.test-d.d.ts +2 -0
  89. package/dist/__tests__/gpu-scene-field-type-owner.test-d.d.ts.map +1 -0
  90. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts +7 -0
  91. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +1 -0
  92. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts +2 -0
  93. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts.map +1 -0
  94. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts +2 -0
  95. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts.map +1 -0
  96. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts +2 -0
  97. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts.map +1 -0
  98. package/dist/__tests__/gpu-scene.dawn.test.d.ts +2 -0
  99. package/dist/__tests__/gpu-scene.dawn.test.d.ts.map +1 -0
  100. package/dist/__tests__/gpu-scene.unit.test.d.ts +2 -0
  101. package/dist/__tests__/gpu-scene.unit.test.d.ts.map +1 -0
  102. package/dist/__tests__/hdrp-pipeline.unit.test.d.ts +2 -0
  103. package/dist/__tests__/hdrp-pipeline.unit.test.d.ts.map +1 -0
  104. package/dist/__tests__/ibl/ibl-fallback.unit.test.d.ts +2 -0
  105. package/dist/__tests__/ibl/ibl-fallback.unit.test.d.ts.map +1 -0
  106. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts +2 -0
  107. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts.map +1 -0
  108. package/dist/__tests__/injection-kind-owner.test-d.d.ts +2 -0
  109. package/dist/__tests__/injection-kind-owner.test-d.d.ts.map +1 -0
  110. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts +2 -0
  111. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts.map +1 -0
  112. package/dist/__tests__/light-buffer-layout.unit.test.d.ts +2 -0
  113. package/dist/__tests__/light-buffer-layout.unit.test.d.ts.map +1 -0
  114. package/dist/__tests__/material-contract-inventory.unit.test.d.ts +2 -0
  115. package/dist/__tests__/material-contract-inventory.unit.test.d.ts.map +1 -0
  116. package/dist/__tests__/material-cooked-projection.unit.test.d.ts +2 -0
  117. package/dist/__tests__/material-cooked-projection.unit.test.d.ts.map +1 -0
  118. package/dist/__tests__/material-derived-error-stop-draw.integration.test.d.ts +2 -0
  119. package/dist/__tests__/material-derived-error-stop-draw.integration.test.d.ts.map +1 -0
  120. package/dist/__tests__/material-derived-payload.integration.test.d.ts +2 -0
  121. package/dist/__tests__/material-derived-payload.integration.test.d.ts.map +1 -0
  122. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts +2 -0
  123. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts.map +1 -0
  124. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts +2 -0
  125. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts.map +1 -0
  126. package/dist/__tests__/material-stride-surface.unit.test.d.ts +2 -0
  127. package/dist/__tests__/material-stride-surface.unit.test.d.ts.map +1 -0
  128. package/dist/__tests__/materials.unit.test.d.ts +2 -0
  129. package/dist/__tests__/materials.unit.test.d.ts.map +1 -0
  130. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts +2 -0
  131. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts.map +1 -0
  132. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts +2 -0
  133. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts.map +1 -0
  134. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts +2 -0
  135. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts.map +1 -0
  136. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts +2 -0
  137. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts.map +1 -0
  138. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts +2 -0
  139. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts.map +1 -0
  140. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts +2 -0
  141. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts.map +1 -0
  142. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts +2 -0
  143. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts.map +1 -0
  144. package/dist/__tests__/param-schema-projection-census.unit.test.d.ts +2 -0
  145. package/dist/__tests__/param-schema-projection-census.unit.test.d.ts.map +1 -0
  146. package/dist/__tests__/persistent-render-scene.unit.test.d.ts +2 -0
  147. package/dist/__tests__/persistent-render-scene.unit.test.d.ts.map +1 -0
  148. package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts +2 -0
  149. package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts.map +1 -0
  150. package/dist/__tests__/pipeline-pass-trace.test.d.ts +2 -0
  151. package/dist/__tests__/pipeline-pass-trace.test.d.ts.map +1 -0
  152. package/dist/__tests__/pipeline-stage-owner.test-d.d.ts +2 -0
  153. package/dist/__tests__/pipeline-stage-owner.test-d.d.ts.map +1 -0
  154. package/dist/__tests__/plugin.test.d.ts +2 -0
  155. package/dist/__tests__/plugin.test.d.ts.map +1 -0
  156. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts +2 -0
  157. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts.map +1 -0
  158. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts +2 -0
  159. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts.map +1 -0
  160. package/dist/__tests__/prepared-graphics-backend-matrix.unit.test.d.ts +2 -0
  161. package/dist/__tests__/prepared-graphics-backend-matrix.unit.test.d.ts.map +1 -0
  162. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts +2 -0
  163. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts.map +1 -0
  164. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts +2 -0
  165. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts.map +1 -0
  166. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts +2 -0
  167. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts.map +1 -0
  168. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts +2 -0
  169. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts.map +1 -0
  170. package/dist/__tests__/prepared-graphics-resolver-recording.unit.test.d.ts +2 -0
  171. package/dist/__tests__/prepared-graphics-resolver-recording.unit.test.d.ts.map +1 -0
  172. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts +2 -0
  173. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts.map +1 -0
  174. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts +2 -0
  175. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts.map +1 -0
  176. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts +2 -0
  177. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts.map +1 -0
  178. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts +2 -0
  179. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts.map +1 -0
  180. package/dist/__tests__/profiler-default-off.test.d.ts +2 -0
  181. package/dist/__tests__/profiler-default-off.test.d.ts.map +1 -0
  182. package/dist/__tests__/profiler-phase-catalog.test.d.ts +2 -0
  183. package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +1 -0
  184. package/dist/__tests__/profiler-phase-integration.test.d.ts +2 -0
  185. package/dist/__tests__/profiler-phase-integration.test.d.ts.map +1 -0
  186. package/dist/__tests__/profiler-phase-token.test.d.ts +2 -0
  187. package/dist/__tests__/profiler-phase-token.test.d.ts.map +1 -0
  188. package/dist/__tests__/public-pipeline-id.test-d.d.ts +2 -0
  189. package/dist/__tests__/public-pipeline-id.test-d.d.ts.map +1 -0
  190. package/dist/__tests__/public-surface.test-d.d.ts +2 -0
  191. package/dist/__tests__/public-surface.test-d.d.ts.map +1 -0
  192. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts +2 -0
  193. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts.map +1 -0
  194. package/dist/__tests__/render-dispatch-membership.unit.test.d.ts +2 -0
  195. package/dist/__tests__/render-dispatch-membership.unit.test.d.ts.map +1 -0
  196. package/dist/__tests__/render-error-code-owner.test-d.d.ts +2 -0
  197. package/dist/__tests__/render-error-code-owner.test-d.d.ts.map +1 -0
  198. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts +2 -0
  199. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts.map +1 -0
  200. package/dist/__tests__/render-error-exhaustive.test-d.d.ts +2 -0
  201. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +1 -0
  202. package/dist/__tests__/render-feature-assembly.test-d.d.ts +2 -0
  203. package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +1 -0
  204. package/dist/__tests__/render-feature-construction.unit.test.d.ts +2 -0
  205. package/dist/__tests__/render-feature-construction.unit.test.d.ts.map +1 -0
  206. package/dist/__tests__/render-feature-context.test-d.d.ts +2 -0
  207. package/dist/__tests__/render-feature-context.test-d.d.ts.map +1 -0
  208. package/dist/__tests__/render-feature-contract.test-d.d.ts +2 -0
  209. package/dist/__tests__/render-feature-contract.test-d.d.ts.map +1 -0
  210. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts +2 -0
  211. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts.map +1 -0
  212. package/dist/__tests__/render-feature-docs.unit.test.d.ts +2 -0
  213. package/dist/__tests__/render-feature-docs.unit.test.d.ts.map +1 -0
  214. package/dist/__tests__/render-feature-error-code-owner.test-d.d.ts +2 -0
  215. package/dist/__tests__/render-feature-error-code-owner.test-d.d.ts.map +1 -0
  216. package/dist/__tests__/render-feature-errors.unit.test.d.ts +2 -0
  217. package/dist/__tests__/render-feature-errors.unit.test.d.ts.map +1 -0
  218. package/dist/__tests__/render-feature-gpu-buffer-usage-owner.test-d.d.ts +2 -0
  219. package/dist/__tests__/render-feature-gpu-buffer-usage-owner.test-d.d.ts.map +1 -0
  220. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts +2 -0
  221. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts.map +1 -0
  222. package/dist/__tests__/render-feature-graph.integration.test.d.ts +2 -0
  223. package/dist/__tests__/render-feature-graph.integration.test.d.ts.map +1 -0
  224. package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts +2 -0
  225. package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts.map +1 -0
  226. package/dist/__tests__/render-feature-order.unit.test.d.ts +2 -0
  227. package/dist/__tests__/render-feature-order.unit.test.d.ts.map +1 -0
  228. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts +2 -0
  229. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts.map +1 -0
  230. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts +2 -0
  231. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts.map +1 -0
  232. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +2 -0
  233. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +1 -0
  234. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts +2 -0
  235. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts.map +1 -0
  236. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts +2 -0
  237. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts.map +1 -0
  238. package/dist/__tests__/render-feature-prepared-graphics-recording.unit.test.d.ts +2 -0
  239. package/dist/__tests__/render-feature-prepared-graphics-recording.unit.test.d.ts.map +1 -0
  240. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts +2 -0
  241. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts.map +1 -0
  242. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts +2 -0
  243. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts.map +1 -0
  244. package/dist/__tests__/render-feature-public-surface.test-d.d.ts +2 -0
  245. package/dist/__tests__/render-feature-public-surface.test-d.d.ts.map +1 -0
  246. package/dist/__tests__/render-feature-retry.unit.test.d.ts +2 -0
  247. package/dist/__tests__/render-feature-retry.unit.test.d.ts.map +1 -0
  248. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts +2 -0
  249. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts.map +1 -0
  250. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts +2 -0
  251. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts.map +1 -0
  252. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts +2 -0
  253. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts.map +1 -0
  254. package/dist/__tests__/render-feature-staging.unit.test.d.ts +2 -0
  255. package/dist/__tests__/render-feature-staging.unit.test.d.ts.map +1 -0
  256. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts +2 -0
  257. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts.map +1 -0
  258. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts +2 -0
  259. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts.map +1 -0
  260. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts +2 -0
  261. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts.map +1 -0
  262. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts +7 -0
  263. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts.map +1 -0
  264. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts +2 -0
  265. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts.map +1 -0
  266. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts +2 -0
  267. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts.map +1 -0
  268. package/dist/__tests__/render-graph-hzb-gpu.d.ts +7 -0
  269. package/dist/__tests__/render-graph-hzb-gpu.d.ts.map +1 -0
  270. package/dist/__tests__/render-graph-hzb.browser.test.d.ts +2 -0
  271. package/dist/__tests__/render-graph-hzb.browser.test.d.ts.map +1 -0
  272. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts +2 -0
  273. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts.map +1 -0
  274. package/dist/__tests__/render-graph-primitives.unit.test.d.ts +2 -0
  275. package/dist/__tests__/render-graph-primitives.unit.test.d.ts.map +1 -0
  276. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts +12 -0
  277. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts.map +1 -0
  278. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts +2 -0
  279. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts.map +1 -0
  280. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts +2 -0
  281. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts.map +1 -0
  282. package/dist/__tests__/render-scene-projection.unit.test.d.ts +2 -0
  283. package/dist/__tests__/render-scene-projection.unit.test.d.ts.map +1 -0
  284. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts +2 -0
  285. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts.map +1 -0
  286. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +2 -0
  287. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +1 -0
  288. package/dist/__tests__/renderer-render-scene-public.test-d.d.ts +2 -0
  289. package/dist/__tests__/renderer-render-scene-public.test-d.d.ts.map +1 -0
  290. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts +2 -0
  291. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts.map +1 -0
  292. package/dist/__tests__/scene-temporal-coverage.unit.test.d.ts +2 -0
  293. package/dist/__tests__/scene-temporal-coverage.unit.test.d.ts.map +1 -0
  294. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts +2 -0
  295. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts.map +1 -0
  296. package/dist/__tests__/shader-stage-surface.unit.test.d.ts +2 -0
  297. package/dist/__tests__/shader-stage-surface.unit.test.d.ts.map +1 -0
  298. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts +2 -0
  299. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts.map +1 -0
  300. package/dist/__tests__/sun-snapshot-consumers.test.d.ts +2 -0
  301. package/dist/__tests__/sun-snapshot-consumers.test.d.ts.map +1 -0
  302. package/dist/__tests__/surface-backend-kind-owner.test-d.d.ts +2 -0
  303. package/dist/__tests__/surface-backend-kind-owner.test-d.d.ts.map +1 -0
  304. package/dist/__tests__/surface-configuration.unit.test.d.ts +2 -0
  305. package/dist/__tests__/surface-configuration.unit.test.d.ts.map +1 -0
  306. package/dist/__tests__/taa-history-store.unit.test.d.ts +2 -0
  307. package/dist/__tests__/taa-history-store.unit.test.d.ts.map +1 -0
  308. package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts +2 -0
  309. package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts.map +1 -0
  310. package/dist/__tests__/temporal-inspection.unit.test.d.ts +2 -0
  311. package/dist/__tests__/temporal-inspection.unit.test.d.ts.map +1 -0
  312. package/dist/__tests__/texture-usage-surface.unit.test.d.ts +2 -0
  313. package/dist/__tests__/texture-usage-surface.unit.test.d.ts.map +1 -0
  314. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts +2 -0
  315. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts.map +1 -0
  316. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts +2 -0
  317. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts.map +1 -0
  318. package/dist/__tests__/urp-pipeline.unit.test.d.ts +2 -0
  319. package/dist/__tests__/urp-pipeline.unit.test.d.ts.map +1 -0
  320. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts +2 -0
  321. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts.map +1 -0
  322. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts +2 -0
  323. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts.map +1 -0
  324. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts +2 -0
  325. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts.map +1 -0
  326. package/dist/__tests__/visibility-extract.integration.test.d.ts +2 -0
  327. package/dist/__tests__/visibility-extract.integration.test.d.ts.map +1 -0
  328. package/dist/__tests__/visibility-extract.perf.test.d.ts +2 -0
  329. package/dist/__tests__/visibility-extract.perf.test.d.ts.map +1 -0
  330. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts +2 -0
  331. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts.map +1 -0
  332. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts +2 -0
  333. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts.map +1 -0
  334. package/dist/__tests__/visibility-instances.integration.test.d.ts +2 -0
  335. package/dist/__tests__/visibility-instances.integration.test.d.ts.map +1 -0
  336. package/dist/__tests__/visibility-multi-world.integration.test.d.ts +2 -0
  337. package/dist/__tests__/visibility-multi-world.integration.test.d.ts.map +1 -0
  338. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts +2 -0
  339. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts.map +1 -0
  340. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts +2 -0
  341. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts.map +1 -0
  342. package/dist/__tests__/visibility-public-surface.test-d.d.ts +2 -0
  343. package/dist/__tests__/visibility-public-surface.test-d.d.ts.map +1 -0
  344. package/dist/__tests__/visibility-resolver.unit.test.d.ts +2 -0
  345. package/dist/__tests__/visibility-resolver.unit.test.d.ts.map +1 -0
  346. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts +2 -0
  347. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts.map +1 -0
  348. package/dist/__tests__/vocabulary.unit.test.d.ts +2 -0
  349. package/dist/__tests__/vocabulary.unit.test.d.ts.map +1 -0
  350. package/dist/assets/__tests__/asset-decoders.unit.test.d.ts +2 -0
  351. package/dist/assets/__tests__/asset-decoders.unit.test.d.ts.map +1 -0
  352. package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts +2 -0
  353. package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts.map +1 -0
  354. package/dist/assets/__tests__/render-asset-port.unit.test.d.ts +2 -0
  355. package/dist/assets/__tests__/render-asset-port.unit.test.d.ts.map +1 -0
  356. package/dist/assets/__tests__/resolve-render-asset.unit.test.d.ts +2 -0
  357. package/dist/assets/__tests__/resolve-render-asset.unit.test.d.ts.map +1 -0
  358. package/dist/assets/asset-decoders.d.ts +5 -0
  359. package/dist/assets/asset-decoders.d.ts.map +1 -0
  360. package/dist/assets/render-asset-port.d.ts +17 -0
  361. package/dist/assets/render-asset-port.d.ts.map +1 -0
  362. package/dist/assets/resolve-render-asset.d.ts +6 -0
  363. package/dist/assets/resolve-render-asset.d.ts.map +1 -0
  364. package/dist/authoring.d.ts +12 -0
  365. package/dist/authoring.d.ts.map +1 -0
  366. package/dist/authoring.mjs +5 -0
  367. package/dist/authoring.mjs.map +1 -0
  368. package/dist/chunk-33UF5SAO.mjs +7397 -0
  369. package/dist/chunk-33UF5SAO.mjs.map +1 -0
  370. package/dist/chunk-A5QCJSNL.mjs +29913 -0
  371. package/dist/chunk-A5QCJSNL.mjs.map +1 -0
  372. package/dist/chunk-JMSB7AR4.mjs +3 -0
  373. package/dist/chunk-JMSB7AR4.mjs.map +1 -0
  374. package/dist/chunk-LXNGO6AO.mjs +569 -0
  375. package/dist/chunk-LXNGO6AO.mjs.map +1 -0
  376. package/dist/chunk-QRXPSX4X.mjs +659 -0
  377. package/dist/chunk-QRXPSX4X.mjs.map +1 -0
  378. package/dist/chunk-YAKEQPWO.mjs +1439 -0
  379. package/dist/chunk-YAKEQPWO.mjs.map +1 -0
  380. package/dist/cluster-binner.d.ts +152 -0
  381. package/dist/cluster-binner.d.ts.map +1 -0
  382. package/dist/components/__tests__/atmosphere-red.test.d.ts +2 -0
  383. package/dist/components/__tests__/atmosphere-red.test.d.ts.map +1 -0
  384. package/dist/components/__tests__/atmosphere.test.d.ts +2 -0
  385. package/dist/components/__tests__/atmosphere.test.d.ts.map +1 -0
  386. package/dist/components/__tests__/fog.test-d.d.ts +2 -0
  387. package/dist/components/__tests__/fog.test-d.d.ts.map +1 -0
  388. package/dist/components/__tests__/fog.test.d.ts +2 -0
  389. package/dist/components/__tests__/fog.test.d.ts.map +1 -0
  390. package/dist/components/__tests__/schema-parity.unit.test.d.ts +2 -0
  391. package/dist/components/__tests__/schema-parity.unit.test.d.ts.map +1 -0
  392. package/dist/components/__tests__/visibility-schema.unit.test.d.ts +2 -0
  393. package/dist/components/__tests__/visibility-schema.unit.test.d.ts.map +1 -0
  394. package/dist/components/atmosphere.d.ts +18 -0
  395. package/dist/components/atmosphere.d.ts.map +1 -0
  396. package/dist/components/camera.d.ts +311 -0
  397. package/dist/components/camera.d.ts.map +1 -0
  398. package/dist/components/directional-light.d.ts +76 -0
  399. package/dist/components/directional-light.d.ts.map +1 -0
  400. package/dist/components/environment.d.ts +116 -0
  401. package/dist/components/environment.d.ts.map +1 -0
  402. package/dist/components/glyph-text.d.ts +26 -0
  403. package/dist/components/glyph-text.d.ts.map +1 -0
  404. package/dist/components/index.d.ts +22 -0
  405. package/dist/components/index.d.ts.map +1 -0
  406. package/dist/components/instances.d.ts +41 -0
  407. package/dist/components/instances.d.ts.map +1 -0
  408. package/dist/components/layer.d.ts +34 -0
  409. package/dist/components/layer.d.ts.map +1 -0
  410. package/dist/components/light-helpers.d.ts +53 -0
  411. package/dist/components/light-helpers.d.ts.map +1 -0
  412. package/dist/components/mesh-filter.d.ts +24 -0
  413. package/dist/components/mesh-filter.d.ts.map +1 -0
  414. package/dist/components/mesh-renderer.d.ts +33 -0
  415. package/dist/components/mesh-renderer.d.ts.map +1 -0
  416. package/dist/components/point-light-shadow.d.ts +27 -0
  417. package/dist/components/point-light-shadow.d.ts.map +1 -0
  418. package/dist/components/point-light.d.ts +35 -0
  419. package/dist/components/point-light.d.ts.map +1 -0
  420. package/dist/components/post-process-params.d.ts +5 -0
  421. package/dist/components/post-process-params.d.ts.map +1 -0
  422. package/dist/components/scene-instance.d.ts +140 -0
  423. package/dist/components/scene-instance.d.ts.map +1 -0
  424. package/dist/components/sort-key.d.ts +44 -0
  425. package/dist/components/sort-key.d.ts.map +1 -0
  426. package/dist/components/spot-light.d.ts +81 -0
  427. package/dist/components/spot-light.d.ts.map +1 -0
  428. package/dist/components/sprite-animation.d.ts +75 -0
  429. package/dist/components/sprite-animation.d.ts.map +1 -0
  430. package/dist/components/sprite-instances.d.ts +51 -0
  431. package/dist/components/sprite-instances.d.ts.map +1 -0
  432. package/dist/components/sprite-playback-mode.d.ts +37 -0
  433. package/dist/components/sprite-playback-mode.d.ts.map +1 -0
  434. package/dist/components/sprite-region-override.d.ts +47 -0
  435. package/dist/components/sprite-region-override.d.ts.map +1 -0
  436. package/dist/components/tile-layer.d.ts +101 -0
  437. package/dist/components/tile-layer.d.ts.map +1 -0
  438. package/dist/components/tilemap.d.ts +25 -0
  439. package/dist/components/tilemap.d.ts.map +1 -0
  440. package/dist/components/visibility.d.ts +22 -0
  441. package/dist/components/visibility.d.ts.map +1 -0
  442. package/dist/construct-renderer.d.ts +2 -0
  443. package/dist/construct-renderer.d.ts.map +1 -0
  444. package/dist/construct-renderer.mjs +6 -0
  445. package/dist/construct-renderer.mjs.map +1 -0
  446. package/dist/debug-draw-glue.d.ts +56 -0
  447. package/dist/debug-draw-glue.d.ts.map +1 -0
  448. package/dist/deferred-lighting.d.ts +13 -0
  449. package/dist/deferred-lighting.d.ts.map +1 -0
  450. package/dist/dynamic-texture-store.d.ts +42 -0
  451. package/dist/dynamic-texture-store.d.ts.map +1 -0
  452. package/dist/engine-metrics.d.ts +23 -0
  453. package/dist/engine-metrics.d.ts.map +1 -0
  454. package/dist/environment/__tests__/failure-injection.test.d.ts +2 -0
  455. package/dist/environment/__tests__/failure-injection.test.d.ts.map +1 -0
  456. package/dist/environment/__tests__/generation-red.test.d.ts +2 -0
  457. package/dist/environment/__tests__/generation-red.test.d.ts.map +1 -0
  458. package/dist/environment/__tests__/generation.test.d.ts +2 -0
  459. package/dist/environment/__tests__/generation.test.d.ts.map +1 -0
  460. package/dist/environment/__tests__/graph-transaction.test.d.ts +2 -0
  461. package/dist/environment/__tests__/graph-transaction.test.d.ts.map +1 -0
  462. package/dist/environment/__tests__/inspection-red.test.d.ts +2 -0
  463. package/dist/environment/__tests__/inspection-red.test.d.ts.map +1 -0
  464. package/dist/environment/__tests__/lifecycle-evidence.test.d.ts +2 -0
  465. package/dist/environment/__tests__/lifecycle-evidence.test.d.ts.map +1 -0
  466. package/dist/environment/__tests__/pipeline-topology.test.d.ts +2 -0
  467. package/dist/environment/__tests__/pipeline-topology.test.d.ts.map +1 -0
  468. package/dist/environment/__tests__/readiness.test.d.ts +2 -0
  469. package/dist/environment/__tests__/readiness.test.d.ts.map +1 -0
  470. package/dist/environment/__tests__/recovery.test.d.ts +2 -0
  471. package/dist/environment/__tests__/recovery.test.d.ts.map +1 -0
  472. package/dist/environment/__tests__/resize-dispose.test.d.ts +2 -0
  473. package/dist/environment/__tests__/resize-dispose.test.d.ts.map +1 -0
  474. package/dist/environment/__tests__/signature-red.test.d.ts +2 -0
  475. package/dist/environment/__tests__/signature-red.test.d.ts.map +1 -0
  476. package/dist/environment/__tests__/signature.test.d.ts +2 -0
  477. package/dist/environment/__tests__/signature.test.d.ts.map +1 -0
  478. package/dist/environment/descriptors.d.ts +2 -0
  479. package/dist/environment/descriptors.d.ts.map +1 -0
  480. package/dist/environment/extracted-environment.d.ts +53 -0
  481. package/dist/environment/extracted-environment.d.ts.map +1 -0
  482. package/dist/environment/generation.d.ts +62 -0
  483. package/dist/environment/generation.d.ts.map +1 -0
  484. package/dist/environment/gpu-bundle.d.ts +23 -0
  485. package/dist/environment/gpu-bundle.d.ts.map +1 -0
  486. package/dist/environment/graph.d.ts +108 -0
  487. package/dist/environment/graph.d.ts.map +1 -0
  488. package/dist/environment/inspection.d.ts +48 -0
  489. package/dist/environment/inspection.d.ts.map +1 -0
  490. package/dist/environment/lifecycle.d.ts +22 -0
  491. package/dist/environment/lifecycle.d.ts.map +1 -0
  492. package/dist/environment/readiness.d.ts +29 -0
  493. package/dist/environment/readiness.d.ts.map +1 -0
  494. package/dist/environment/signature.d.ts +70 -0
  495. package/dist/environment/signature.d.ts.map +1 -0
  496. package/dist/errors/ecs-validation.d.ts +3 -0
  497. package/dist/errors/ecs-validation.d.ts.map +1 -0
  498. package/dist/errors/index.d.ts +4 -0
  499. package/dist/errors/index.d.ts.map +1 -0
  500. package/dist/errors/recover.d.ts +78 -0
  501. package/dist/errors/recover.d.ts.map +1 -0
  502. package/dist/errors/render.d.ts +633 -0
  503. package/dist/errors/render.d.ts.map +1 -0
  504. package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts +2 -0
  505. package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts.map +1 -0
  506. package/dist/extract/__tests__/environment-source.test.d.ts +2 -0
  507. package/dist/extract/__tests__/environment-source.test.d.ts.map +1 -0
  508. package/dist/extract/__tests__/schema-readers.unit.test.d.ts +2 -0
  509. package/dist/extract/__tests__/schema-readers.unit.test.d.ts.map +1 -0
  510. package/dist/extract/directional-csm.d.ts +129 -0
  511. package/dist/extract/directional-csm.d.ts.map +1 -0
  512. package/dist/extract/index.d.ts +5 -0
  513. package/dist/extract/index.d.ts.map +1 -0
  514. package/dist/extract/material-interface.d.ts +56 -0
  515. package/dist/extract/material-interface.d.ts.map +1 -0
  516. package/dist/extract/schema-readers.d.ts +20 -0
  517. package/dist/extract/schema-readers.d.ts.map +1 -0
  518. package/dist/extract/visibility.d.ts +26 -0
  519. package/dist/extract/visibility.d.ts.map +1 -0
  520. package/dist/features/graph-contribution.d.ts +64 -0
  521. package/dist/features/graph-contribution.d.ts.map +1 -0
  522. package/dist/features/host.d.ts +100 -0
  523. package/dist/features/host.d.ts.map +1 -0
  524. package/dist/features/index.d.ts +21 -0
  525. package/dist/features/index.d.ts.map +1 -0
  526. package/dist/features/morph/index.d.ts +3 -0
  527. package/dist/features/morph/index.d.ts.map +1 -0
  528. package/dist/features/morph/morph-bounds.d.ts +42 -0
  529. package/dist/features/morph/morph-bounds.d.ts.map +1 -0
  530. package/dist/features/morph/morph-feature.d.ts +45 -0
  531. package/dist/features/morph/morph-feature.d.ts.map +1 -0
  532. package/dist/features/prepared-gpu-work.d.ts +113 -0
  533. package/dist/features/prepared-gpu-work.d.ts.map +1 -0
  534. package/dist/features/prepared-graphics-store.d.ts +65 -0
  535. package/dist/features/prepared-graphics-store.d.ts.map +1 -0
  536. package/dist/features/prepared-graphics.d.ts +225 -0
  537. package/dist/features/prepared-graphics.d.ts.map +1 -0
  538. package/dist/features/render-graph-compute.d.ts +13 -0
  539. package/dist/features/render-graph-compute.d.ts.map +1 -0
  540. package/dist/features/render-graph-contribution.d.ts +15 -0
  541. package/dist/features/render-graph-contribution.d.ts.map +1 -0
  542. package/dist/features/render-graph-raster.d.ts +34 -0
  543. package/dist/features/render-graph-raster.d.ts.map +1 -0
  544. package/dist/features/render-graph-resources.d.ts +11 -0
  545. package/dist/features/render-graph-resources.d.ts.map +1 -0
  546. package/dist/features/scene-temporal.d.ts +45 -0
  547. package/dist/features/scene-temporal.d.ts.map +1 -0
  548. package/dist/features/taa-resolve.d.ts +21 -0
  549. package/dist/features/taa-resolve.d.ts.map +1 -0
  550. package/dist/features/targets.d.ts +32 -0
  551. package/dist/features/targets.d.ts.map +1 -0
  552. package/dist/features/types.d.ts +247 -0
  553. package/dist/features/types.d.ts.map +1 -0
  554. package/dist/frame-chain.d.ts +14 -0
  555. package/dist/frame-chain.d.ts.map +1 -0
  556. package/dist/fullscreen-post-process-pass.d.ts +178 -0
  557. package/dist/fullscreen-post-process-pass.d.ts.map +1 -0
  558. package/dist/glyph-text-layout-system.d.ts +18 -0
  559. package/dist/glyph-text-layout-system.d.ts.map +1 -0
  560. package/dist/gpu-driven/batch-topology.d.ts +124 -0
  561. package/dist/gpu-driven/batch-topology.d.ts.map +1 -0
  562. package/dist/gpu-driven/production-raster.d.ts +150 -0
  563. package/dist/gpu-driven/production-raster.d.ts.map +1 -0
  564. package/dist/gpu-driven/view-gpu.d.ts +141 -0
  565. package/dist/gpu-driven/view-gpu.d.ts.map +1 -0
  566. package/dist/gpu-driven/view-reference.d.ts +15 -0
  567. package/dist/gpu-driven/view-reference.d.ts.map +1 -0
  568. package/dist/gpu-resource-store.d.ts +294 -0
  569. package/dist/gpu-resource-store.d.ts.map +1 -0
  570. package/dist/gpu-resource.d.ts +73 -0
  571. package/dist/gpu-resource.d.ts.map +1 -0
  572. package/dist/gpu-scene-schema.d.ts +171 -0
  573. package/dist/gpu-scene-schema.d.ts.map +1 -0
  574. package/dist/gpu-scene.d.ts +81 -0
  575. package/dist/gpu-scene.d.ts.map +1 -0
  576. package/dist/gpu-stage.d.ts +4 -0
  577. package/dist/gpu-stage.d.ts.map +1 -0
  578. package/dist/gpu-texture-usage.d.ts +6 -0
  579. package/dist/gpu-texture-usage.d.ts.map +1 -0
  580. package/dist/gpu-usage.d.ts +9 -0
  581. package/dist/gpu-usage.d.ts.map +1 -0
  582. package/dist/hdrp-buffers.d.ts +213 -0
  583. package/dist/hdrp-buffers.d.ts.map +1 -0
  584. package/dist/hdrp-cluster-membership.d.ts +2 -0
  585. package/dist/hdrp-cluster-membership.d.ts.map +1 -0
  586. package/dist/hdrp-pipeline.d.ts +36 -0
  587. package/dist/hdrp-pipeline.d.ts.map +1 -0
  588. package/dist/ibl/IblPipelineCache.d.ts +274 -0
  589. package/dist/ibl/IblPipelineCache.d.ts.map +1 -0
  590. package/dist/ibl/cubemap-projection.d.ts +23 -0
  591. package/dist/ibl/cubemap-projection.d.ts.map +1 -0
  592. package/dist/ibl/face-uniforms.d.ts +65 -0
  593. package/dist/ibl/face-uniforms.d.ts.map +1 -0
  594. package/dist/ibl/skylight-bind-group.d.ts +130 -0
  595. package/dist/ibl/skylight-bind-group.d.ts.map +1 -0
  596. package/dist/index.d.ts +57 -0
  597. package/dist/index.d.ts.map +1 -0
  598. package/dist/index.mjs +5 -0
  599. package/dist/index.mjs.map +1 -0
  600. package/dist/instance-buffer-cache.d.ts +59 -0
  601. package/dist/instance-buffer-cache.d.ts.map +1 -0
  602. package/dist/internal.d.ts +74 -0
  603. package/dist/internal.d.ts.map +1 -0
  604. package/dist/internal.mjs +45 -0
  605. package/dist/internal.mjs.map +1 -0
  606. package/dist/lifecycle.d.ts +28 -0
  607. package/dist/lifecycle.d.ts.map +1 -0
  608. package/dist/light-buffer-layout.d.ts +164 -0
  609. package/dist/light-buffer-layout.d.ts.map +1 -0
  610. package/dist/materials.d.ts +50 -0
  611. package/dist/materials.d.ts.map +1 -0
  612. package/dist/mesh-material-bindings.d.ts +44 -0
  613. package/dist/mesh-material-bindings.d.ts.map +1 -0
  614. package/dist/mesh-update-errors.d.ts +71 -0
  615. package/dist/mesh-update-errors.d.ts.map +1 -0
  616. package/dist/mipmap-generator.d.ts +39 -0
  617. package/dist/mipmap-generator.d.ts.map +1 -0
  618. package/dist/param-schema-projection-census.d.ts +18 -0
  619. package/dist/param-schema-projection-census.d.ts.map +1 -0
  620. package/dist/pbr-pipeline.d.ts +253 -0
  621. package/dist/pbr-pipeline.d.ts.map +1 -0
  622. package/dist/persistent-render-scene.d.ts +158 -0
  623. package/dist/persistent-render-scene.d.ts.map +1 -0
  624. package/dist/pipeline/index.d.ts +11 -0
  625. package/dist/pipeline/index.d.ts.map +1 -0
  626. package/dist/pipeline-builder.d.ts +122 -0
  627. package/dist/pipeline-builder.d.ts.map +1 -0
  628. package/dist/pipeline-errors.d.ts +110 -0
  629. package/dist/pipeline-errors.d.ts.map +1 -0
  630. package/dist/pipeline-spec.d.ts +506 -0
  631. package/dist/pipeline-spec.d.ts.map +1 -0
  632. package/dist/plugin.d.ts +17 -0
  633. package/dist/plugin.d.ts.map +1 -0
  634. package/dist/post-process-errors.d.ts +182 -0
  635. package/dist/post-process-errors.d.ts.map +1 -0
  636. package/dist/prepare/__tests__/schema-readers.unit.test.d.ts +2 -0
  637. package/dist/prepare/__tests__/schema-readers.unit.test.d.ts.map +1 -0
  638. package/dist/prepare/index.d.ts +4 -0
  639. package/dist/prepare/index.d.ts.map +1 -0
  640. package/dist/prepare/prepared-graphics-resolver.d.ts +62 -0
  641. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -0
  642. package/dist/prepare/schema-readers.d.ts +11 -0
  643. package/dist/prepare/schema-readers.d.ts.map +1 -0
  644. package/dist/record/__tests__/environment-record.test.d.ts +2 -0
  645. package/dist/record/__tests__/environment-record.test.d.ts.map +1 -0
  646. package/dist/record/__tests__/frame-targets.unit.test.d.ts +2 -0
  647. package/dist/record/__tests__/frame-targets.unit.test.d.ts.map +1 -0
  648. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts +2 -0
  649. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts.map +1 -0
  650. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts +2 -0
  651. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts.map +1 -0
  652. package/dist/record/__tests__/membership-timing.unit.test.d.ts +2 -0
  653. package/dist/record/__tests__/membership-timing.unit.test.d.ts.map +1 -0
  654. package/dist/record/__tests__/render-submission.integration.test.d.ts +2 -0
  655. package/dist/record/__tests__/render-submission.integration.test.d.ts.map +1 -0
  656. package/dist/record/__tests__/render-submission.perf.test.d.ts +2 -0
  657. package/dist/record/__tests__/render-submission.perf.test.d.ts.map +1 -0
  658. package/dist/record/__tests__/shadow-submit-mode.unit.test.d.ts +2 -0
  659. package/dist/record/__tests__/shadow-submit-mode.unit.test.d.ts.map +1 -0
  660. package/dist/record/__tests__/video-texture-view.unit.test.d.ts +2 -0
  661. package/dist/record/__tests__/video-texture-view.unit.test.d.ts.map +1 -0
  662. package/dist/record/__tests__/view-ubo-layout.unit.test.d.ts +2 -0
  663. package/dist/record/__tests__/view-ubo-layout.unit.test.d.ts.map +1 -0
  664. package/dist/record/frame-lighting.d.ts +187 -0
  665. package/dist/record/frame-lighting.d.ts.map +1 -0
  666. package/dist/record/frame-observation.d.ts +38 -0
  667. package/dist/record/frame-observation.d.ts.map +1 -0
  668. package/dist/record/frame-snapshot.d.ts +429 -0
  669. package/dist/record/frame-snapshot.d.ts.map +1 -0
  670. package/dist/record/frame-targets.d.ts +53 -0
  671. package/dist/record/frame-targets.d.ts.map +1 -0
  672. package/dist/record/frame.d.ts +59 -0
  673. package/dist/record/frame.d.ts.map +1 -0
  674. package/dist/record/helpers.d.ts +101 -0
  675. package/dist/record/helpers.d.ts.map +1 -0
  676. package/dist/record/index.d.ts +15 -0
  677. package/dist/record/index.d.ts.map +1 -0
  678. package/dist/record/main-pass-geometry.d.ts +20 -0
  679. package/dist/record/main-pass-geometry.d.ts.map +1 -0
  680. package/dist/record/main-pass-material.d.ts +173 -0
  681. package/dist/record/main-pass-material.d.ts.map +1 -0
  682. package/dist/record/main-pass-skin.d.ts +46 -0
  683. package/dist/record/main-pass-skin.d.ts.map +1 -0
  684. package/dist/record/main-pass-sprite-draws.d.ts +18 -0
  685. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -0
  686. package/dist/record/main-pass-sprite.d.ts +69 -0
  687. package/dist/record/main-pass-sprite.d.ts.map +1 -0
  688. package/dist/record/main-pass.d.ts +20 -0
  689. package/dist/record/main-pass.d.ts.map +1 -0
  690. package/dist/record/material-payload.d.ts +43 -0
  691. package/dist/record/material-payload.d.ts.map +1 -0
  692. package/dist/record/material-slot-plan.d.ts +26 -0
  693. package/dist/record/material-slot-plan.d.ts.map +1 -0
  694. package/dist/record/membership-timing.d.ts +232 -0
  695. package/dist/record/membership-timing.d.ts.map +1 -0
  696. package/dist/record/mesh-ssbo.d.ts +173 -0
  697. package/dist/record/mesh-ssbo.d.ts.map +1 -0
  698. package/dist/record/shadow-caster-uniform.d.ts +8 -0
  699. package/dist/record/shadow-caster-uniform.d.ts.map +1 -0
  700. package/dist/record/shadow-pass.d.ts +125 -0
  701. package/dist/record/shadow-pass.d.ts.map +1 -0
  702. package/dist/record/shadow-submit-mode.d.ts +66 -0
  703. package/dist/record/shadow-submit-mode.d.ts.map +1 -0
  704. package/dist/record/skybox-post-pass.d.ts +33 -0
  705. package/dist/record/skybox-post-pass.d.ts.map +1 -0
  706. package/dist/record/typed-frame-graph.d.ts +13 -0
  707. package/dist/record/typed-frame-graph.d.ts.map +1 -0
  708. package/dist/record/view-ubo.d.ts +39 -0
  709. package/dist/record/view-ubo.d.ts.map +1 -0
  710. package/dist/render-data.d.ts +143 -0
  711. package/dist/render-data.d.ts.map +1 -0
  712. package/dist/render-dispatch-membership.d.ts +47 -0
  713. package/dist/render-dispatch-membership.d.ts.map +1 -0
  714. package/dist/render-graph-primitives.d.ts +424 -0
  715. package/dist/render-graph-primitives.d.ts.map +1 -0
  716. package/dist/render-pipeline-context.d.ts +289 -0
  717. package/dist/render-pipeline-context.d.ts.map +1 -0
  718. package/dist/render-pipeline-target.d.ts +16 -0
  719. package/dist/render-pipeline-target.d.ts.map +1 -0
  720. package/dist/render-pipeline.d.ts +149 -0
  721. package/dist/render-pipeline.d.ts.map +1 -0
  722. package/dist/render-scene-projection.d.ts +174 -0
  723. package/dist/render-scene-projection.d.ts.map +1 -0
  724. package/dist/render-system-extract.d.ts +1096 -0
  725. package/dist/render-system-extract.d.ts.map +1 -0
  726. package/dist/render-system-fold.d.ts +266 -0
  727. package/dist/render-system-fold.d.ts.map +1 -0
  728. package/dist/render-system.d.ts +814 -0
  729. package/dist/render-system.d.ts.map +1 -0
  730. package/dist/renderer/asset-service.d.ts +10 -0
  731. package/dist/renderer/asset-service.d.ts.map +1 -0
  732. package/dist/renderer/backend-selection.d.ts +26 -0
  733. package/dist/renderer/backend-selection.d.ts.map +1 -0
  734. package/dist/renderer/environment-classify.d.ts +6 -0
  735. package/dist/renderer/environment-classify.d.ts.map +1 -0
  736. package/dist/renderer/environment-error.d.ts +13 -0
  737. package/dist/renderer/environment-error.d.ts.map +1 -0
  738. package/dist/renderer/material/assembly.d.ts +22 -0
  739. package/dist/renderer/material/assembly.d.ts.map +1 -0
  740. package/dist/renderer/material/pipeline-projection.d.ts +91 -0
  741. package/dist/renderer/material/pipeline-projection.d.ts.map +1 -0
  742. package/dist/renderer/renderer-factory.d.ts +283 -0
  743. package/dist/renderer/renderer-factory.d.ts.map +1 -0
  744. package/dist/renderer.d.ts +771 -0
  745. package/dist/renderer.d.ts.map +1 -0
  746. package/dist/scene-instances/post-spawn-resolve-joints.d.ts +33 -0
  747. package/dist/scene-instances/post-spawn-resolve-joints.d.ts.map +1 -0
  748. package/dist/scene-utils/collect-subtree.d.ts +11 -0
  749. package/dist/scene-utils/collect-subtree.d.ts.map +1 -0
  750. package/dist/shadow-atlas.d.ts +117 -0
  751. package/dist/shadow-atlas.d.ts.map +1 -0
  752. package/dist/ssao-buffers.d.ts +31 -0
  753. package/dist/ssao-buffers.d.ts.map +1 -0
  754. package/dist/ssao-config.d.ts +28 -0
  755. package/dist/ssao-config.d.ts.map +1 -0
  756. package/dist/ssao-data.d.ts +34 -0
  757. package/dist/ssao-data.d.ts.map +1 -0
  758. package/dist/surface-format.d.ts +10 -0
  759. package/dist/surface-format.d.ts.map +1 -0
  760. package/dist/systems/active-camera.d.ts +53 -0
  761. package/dist/systems/active-camera.d.ts.map +1 -0
  762. package/dist/systems/pass-selector.d.ts +24 -0
  763. package/dist/systems/pass-selector.d.ts.map +1 -0
  764. package/dist/systems/skin-palette-allocator.d.ts +51 -0
  765. package/dist/systems/skin-palette-allocator.d.ts.map +1 -0
  766. package/dist/systems/transparent-sort-config.d.ts +91 -0
  767. package/dist/systems/transparent-sort-config.d.ts.map +1 -0
  768. package/dist/taa-history-store.d.ts +88 -0
  769. package/dist/taa-history-store.d.ts.map +1 -0
  770. package/dist/temporal-coverage.d.ts +35 -0
  771. package/dist/temporal-coverage.d.ts.map +1 -0
  772. package/dist/temporal-frame-transaction.d.ts +92 -0
  773. package/dist/temporal-frame-transaction.d.ts.map +1 -0
  774. package/dist/temporal-inspection.d.ts +57 -0
  775. package/dist/temporal-inspection.d.ts.map +1 -0
  776. package/dist/temporal-view.d.ts +43 -0
  777. package/dist/temporal-view.d.ts.map +1 -0
  778. package/dist/tilemap/resolve-tileset-runtime.d.ts +23 -0
  779. package/dist/tilemap/resolve-tileset-runtime.d.ts.map +1 -0
  780. package/dist/tilemap-chunk-extract-system.d.ts +142 -0
  781. package/dist/tilemap-chunk-extract-system.d.ts.map +1 -0
  782. package/dist/typed-render-graph-primitives.d.ts +59 -0
  783. package/dist/typed-render-graph-primitives.d.ts.map +1 -0
  784. package/dist/typed-shadow-passes.d.ts +11 -0
  785. package/dist/typed-shadow-passes.d.ts.map +1 -0
  786. package/dist/urp-pipeline.d.ts +4 -0
  787. package/dist/urp-pipeline.d.ts.map +1 -0
  788. package/package.json +94 -0
  789. package/src/__tests__/analytic-sky-contract.test.ts +27 -0
  790. package/src/__tests__/analytic-sky-falsify-carriers.mjs +43 -0
  791. package/src/__tests__/analytic-sky-falsify.test.ts +94 -0
  792. package/src/__tests__/assets-runtime-handoff.integration.test.ts +36 -0
  793. package/src/__tests__/authoring-path.unit.test.ts +14 -0
  794. package/src/__tests__/backend-selection-rhi-capture.test-d.ts +21 -0
  795. package/src/__tests__/backend-selection.integration.test.ts +11 -0
  796. package/src/__tests__/callback-inference.test-d.ts +5 -0
  797. package/src/__tests__/camera-temporal.test-d.ts +8 -0
  798. package/src/__tests__/camera-temporal.test.ts +188 -0
  799. package/src/__tests__/cluster-binner.test.ts +272 -0
  800. package/src/__tests__/cluster-grid-default-surface.unit.test.ts +17 -0
  801. package/src/__tests__/construct-renderer-identity.unit.test.ts +10 -0
  802. package/src/__tests__/direct-extract-consumer-contract.test-d.ts +34 -0
  803. package/src/__tests__/direct-light-snapshot.unit.test.ts +71 -0
  804. package/src/__tests__/directional-shadow-probe-atlas-layout.unit.test.ts +18 -0
  805. package/src/__tests__/environment-inspection.test.ts +45 -0
  806. package/src/__tests__/factory-contract.integration.test.ts +331 -0
  807. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +18 -0
  808. package/src/__tests__/fog-ai-user.fixture.ts +350 -0
  809. package/src/__tests__/fog-custom-render-feature.fixture.ts +33 -0
  810. package/src/__tests__/fog-custom-render-feature.integration.test.ts +76 -0
  811. package/src/__tests__/fog-inspection.integration.test.ts +127 -0
  812. package/src/__tests__/fog-owner-state.integration.test.ts +112 -0
  813. package/src/__tests__/fog-pipeline-topology.integration.test.ts +93 -0
  814. package/src/__tests__/fog-public-surface.integration.test.ts +60 -0
  815. package/src/__tests__/fog-ray-contract.integration.test.ts +73 -0
  816. package/src/__tests__/fog-source-absence.integration.test.ts +51 -0
  817. package/src/__tests__/fog-temporal.integration.test.ts +115 -0
  818. package/src/__tests__/frame-chain.unit.test.ts +26 -0
  819. package/src/__tests__/frame-observation.contract.test.ts +103 -0
  820. package/src/__tests__/glyph-text-layout-recovery.unit.test.ts +172 -0
  821. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +347 -0
  822. package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +12 -0
  823. package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +16 -0
  824. package/src/__tests__/gpu-driven-production.integration.test.ts +609 -0
  825. package/src/__tests__/gpu-driven-scaling.unit.test.ts +90 -0
  826. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +192 -0
  827. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +128 -0
  828. package/src/__tests__/gpu-driven-view.browser.test.ts +19 -0
  829. package/src/__tests__/gpu-driven-view.dawn.test.ts +17 -0
  830. package/src/__tests__/gpu-driven-view.unit.test.ts +455 -0
  831. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +59 -0
  832. package/src/__tests__/gpu-scene-field-type-owner.test-d.ts +27 -0
  833. package/src/__tests__/gpu-scene-render-graph-gpu.ts +309 -0
  834. package/src/__tests__/gpu-scene-render-graph.browser.test.ts +19 -0
  835. package/src/__tests__/gpu-scene-render-graph.dawn.test.ts +19 -0
  836. package/src/__tests__/gpu-scene-schema.unit.test.ts +16 -0
  837. package/src/__tests__/gpu-scene.dawn.test.ts +209 -0
  838. package/src/__tests__/gpu-scene.unit.test.ts +161 -0
  839. package/src/__tests__/hdrp-pipeline.unit.test.ts +100 -0
  840. package/src/__tests__/ibl/ibl-fallback.unit.test.ts +23 -0
  841. package/src/__tests__/infinite-grid-no-vertex-probe.unit.test.ts +124 -0
  842. package/src/__tests__/injection-kind-owner.test-d.ts +14 -0
  843. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +719 -0
  844. package/src/__tests__/light-buffer-layout.unit.test.ts +85 -0
  845. package/src/__tests__/material-contract-inventory.unit.test.ts +24 -0
  846. package/src/__tests__/material-cooked-projection.unit.test.ts +177 -0
  847. package/src/__tests__/material-derived-error-stop-draw.integration.test.ts +69 -0
  848. package/src/__tests__/material-derived-payload.integration.test.ts +164 -0
  849. package/src/__tests__/material-snapshot-mutation.integration.test.ts +58 -0
  850. package/src/__tests__/material-static-dynamic-route.unit.test.ts +113 -0
  851. package/src/__tests__/material-stride-surface.unit.test.ts +32 -0
  852. package/src/__tests__/materials.unit.test.ts +25 -0
  853. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +107 -0
  854. package/src/__tests__/mesh-material-bindings.unit.test.ts +89 -0
  855. package/src/__tests__/mesh-stride-surface.unit.test.ts +16 -0
  856. package/src/__tests__/morph-culling-reentry.dawn.test.ts +166 -0
  857. package/src/__tests__/morph-feature-gpu-work.integration.test.ts +78 -0
  858. package/src/__tests__/morph-visual-evidence.integration.test.ts +66 -0
  859. package/src/__tests__/nineslice-handle-surface.unit.test.ts +14 -0
  860. package/src/__tests__/param-schema-projection-census.unit.test.ts +40 -0
  861. package/src/__tests__/persistent-render-scene.unit.test.ts +1311 -0
  862. package/src/__tests__/pipeline-error-policy-owner.unit.test.ts +167 -0
  863. package/src/__tests__/pipeline-pass-trace.test.ts +92 -0
  864. package/src/__tests__/pipeline-stage-owner.test-d.ts +13 -0
  865. package/src/__tests__/plugin.test.ts +25 -0
  866. package/src/__tests__/post-process-error-policy-owner.unit.test.ts +208 -0
  867. package/src/__tests__/prepared-buffer-kind-owner.test-d.ts +29 -0
  868. package/src/__tests__/prepared-graphics-backend-matrix.unit.test.ts +129 -0
  869. package/src/__tests__/prepared-graphics-capability.unit.test.ts +140 -0
  870. package/src/__tests__/prepared-graphics-generation.unit.test.ts +175 -0
  871. package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +206 -0
  872. package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +29 -0
  873. package/src/__tests__/prepared-graphics-resolver-recording.unit.test.ts +180 -0
  874. package/src/__tests__/prepared-graphics-resolver.unit.test.ts +287 -0
  875. package/src/__tests__/prepared-graphics-snapshot.unit.test.ts +105 -0
  876. package/src/__tests__/prepared-graphics-store.unit.test.ts +154 -0
  877. package/src/__tests__/prepared-graphics-validation.unit.test.ts +176 -0
  878. package/src/__tests__/profiler-default-off.test.ts +22 -0
  879. package/src/__tests__/profiler-phase-catalog.test.ts +66 -0
  880. package/src/__tests__/profiler-phase-integration.test.ts +70 -0
  881. package/src/__tests__/profiler-phase-token.test.ts +84 -0
  882. package/src/__tests__/public-pipeline-id.test-d.ts +6 -0
  883. package/src/__tests__/public-surface.test-d.ts +32 -0
  884. package/src/__tests__/recover-error-policy-owner.unit.test.ts +127 -0
  885. package/src/__tests__/render-dispatch-membership.unit.test.ts +117 -0
  886. package/src/__tests__/render-error-code-owner.test-d.ts +115 -0
  887. package/src/__tests__/render-error-detail-ssot.test-d.ts +234 -0
  888. package/src/__tests__/render-error-exhaustive.test-d.ts +84 -0
  889. package/src/__tests__/render-feature-assembly.test-d.ts +51 -0
  890. package/src/__tests__/render-feature-construction.unit.test.ts +124 -0
  891. package/src/__tests__/render-feature-context.test-d.ts +81 -0
  892. package/src/__tests__/render-feature-contract.test-d.ts +58 -0
  893. package/src/__tests__/render-feature-diagnostics.unit.test.ts +151 -0
  894. package/src/__tests__/render-feature-docs.unit.test.ts +88 -0
  895. package/src/__tests__/render-feature-error-code-owner.test-d.ts +27 -0
  896. package/src/__tests__/render-feature-errors.unit.test.ts +47 -0
  897. package/src/__tests__/render-feature-gpu-buffer-usage-owner.test-d.ts +46 -0
  898. package/src/__tests__/render-feature-gpu-work.integration.test.ts +377 -0
  899. package/src/__tests__/render-feature-graph.integration.test.ts +205 -0
  900. package/src/__tests__/render-feature-graphics-staging.unit.test.ts +200 -0
  901. package/src/__tests__/render-feature-order.unit.test.ts +66 -0
  902. package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +101 -0
  903. package/src/__tests__/render-feature-prepared-errors.test-d.ts +82 -0
  904. package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +141 -0
  905. package/src/__tests__/render-feature-prepared-graphics-isolation.unit.test.ts +122 -0
  906. package/src/__tests__/render-feature-prepared-graphics-negative.test-d.ts +59 -0
  907. package/src/__tests__/render-feature-prepared-graphics-recording.unit.test.ts +107 -0
  908. package/src/__tests__/render-feature-prepared-graphics.test-d.ts +96 -0
  909. package/src/__tests__/render-feature-prepared-graphics.unit.test.ts +121 -0
  910. package/src/__tests__/render-feature-public-surface.test-d.ts +75 -0
  911. package/src/__tests__/render-feature-retry.unit.test.ts +128 -0
  912. package/src/__tests__/render-feature-scheduling.unit.test.ts +122 -0
  913. package/src/__tests__/render-feature-stage-failed-policy-owner.unit.test.ts +146 -0
  914. package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +236 -0
  915. package/src/__tests__/render-feature-staging.unit.test.ts +94 -0
  916. package/src/__tests__/render-feature-visibility-context.test-d.ts +38 -0
  917. package/src/__tests__/render-feature-visibility-context.unit.test.ts +38 -0
  918. package/src/__tests__/render-feature-zero-work.unit.test.ts +82 -0
  919. package/src/__tests__/render-graph-compute-raster-gpu.ts +342 -0
  920. package/src/__tests__/render-graph-compute-raster.browser.test.ts +16 -0
  921. package/src/__tests__/render-graph-compute-raster.dawn.test.ts +22 -0
  922. package/src/__tests__/render-graph-hzb-gpu.ts +239 -0
  923. package/src/__tests__/render-graph-hzb.browser.test.ts +16 -0
  924. package/src/__tests__/render-graph-hzb.dawn.test.ts +23 -0
  925. package/src/__tests__/render-graph-primitives.unit.test.ts +22 -0
  926. package/src/__tests__/render-graph-storage-indirect-gpu.ts +162 -0
  927. package/src/__tests__/render-graph-storage-indirect.browser.test.ts +21 -0
  928. package/src/__tests__/render-graph-storage-indirect.dawn.test.ts +28 -0
  929. package/src/__tests__/render-scene-projection.unit.test.ts +206 -0
  930. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +125 -0
  931. package/src/__tests__/renderer-lifecycle.integration.test.ts +10 -0
  932. package/src/__tests__/renderer-render-scene-public.test-d.ts +27 -0
  933. package/src/__tests__/rhi-backend-package-boundary.unit.test.ts +11 -0
  934. package/src/__tests__/scene-temporal-coverage.unit.test.ts +259 -0
  935. package/src/__tests__/scriptable-pack-consumer.test-d.ts +14 -0
  936. package/src/__tests__/shader-stage-surface.unit.test.ts +38 -0
  937. package/src/__tests__/ssao-kernel-surface.unit.test.ts +15 -0
  938. package/src/__tests__/sun-snapshot-consumers.test.ts +35 -0
  939. package/src/__tests__/surface-backend-kind-owner.test-d.ts +42 -0
  940. package/src/__tests__/surface-configuration.unit.test.ts +92 -0
  941. package/src/__tests__/taa-history-store.unit.test.ts +196 -0
  942. package/src/__tests__/temporal-frame-transaction.integration.test.ts +537 -0
  943. package/src/__tests__/temporal-inspection.unit.test.ts +138 -0
  944. package/src/__tests__/texture-usage-surface.unit.test.ts +61 -0
  945. package/src/__tests__/typed-pipeline-topology.unit.test.ts +389 -0
  946. package/src/__tests__/urp-pipeline-targets.unit.test.ts +52 -0
  947. package/src/__tests__/urp-pipeline.unit.test.ts +14 -0
  948. package/src/__tests__/vertex-color-pipeline.unit.test.ts +124 -0
  949. package/src/__tests__/vertex-layout-consumer.unit.test.ts +25 -0
  950. package/src/__tests__/visibility-diagnostics.integration.test.ts +66 -0
  951. package/src/__tests__/visibility-extract.integration.test.ts +89 -0
  952. package/src/__tests__/visibility-extract.perf.test.ts +96 -0
  953. package/src/__tests__/visibility-feature-dedup.integration.test.ts +57 -0
  954. package/src/__tests__/visibility-hidden-report.unit.test.ts +37 -0
  955. package/src/__tests__/visibility-instances.integration.test.ts +50 -0
  956. package/src/__tests__/visibility-multi-world.integration.test.ts +54 -0
  957. package/src/__tests__/visibility-producer-matrix.integration.test.ts +191 -0
  958. package/src/__tests__/visibility-producer-matrix.unit.test.ts +96 -0
  959. package/src/__tests__/visibility-public-surface.test-d.ts +26 -0
  960. package/src/__tests__/visibility-resolver.unit.test.ts +84 -0
  961. package/src/__tests__/visibility-snapshot-contract.unit.test.ts +59 -0
  962. package/src/__tests__/vocabulary.unit.test.ts +21 -0
  963. package/src/assets/__tests__/asset-decoders.unit.test.ts +92 -0
  964. package/src/assets/__tests__/mipmap-generator.unit.test.ts +52 -0
  965. package/src/assets/__tests__/render-asset-port.unit.test.ts +54 -0
  966. package/src/assets/__tests__/resolve-render-asset.unit.test.ts +47 -0
  967. package/src/assets/asset-decoders.ts +158 -0
  968. package/src/assets/render-asset-port.ts +44 -0
  969. package/src/assets/resolve-render-asset.ts +13 -0
  970. package/src/authoring.ts +24 -0
  971. package/src/cluster-binner.ts +700 -0
  972. package/src/components/__tests__/atmosphere-red.test.ts +51 -0
  973. package/src/components/__tests__/atmosphere.test.ts +79 -0
  974. package/src/components/__tests__/fog.test-d.ts +49 -0
  975. package/src/components/__tests__/fog.test.ts +60 -0
  976. package/src/components/__tests__/schema-parity.unit.test.ts +25 -0
  977. package/src/components/__tests__/visibility-schema.unit.test.ts +35 -0
  978. package/src/components/atmosphere.ts +64 -0
  979. package/src/components/camera.ts +512 -0
  980. package/src/components/directional-light.ts +120 -0
  981. package/src/components/environment.ts +206 -0
  982. package/src/components/glyph-text.ts +63 -0
  983. package/src/components/index.ts +49 -0
  984. package/src/components/instances.ts +207 -0
  985. package/src/components/layer.ts +69 -0
  986. package/src/components/light-helpers.ts +188 -0
  987. package/src/components/mesh-filter.ts +59 -0
  988. package/src/components/mesh-renderer.ts +61 -0
  989. package/src/components/point-light-shadow.ts +43 -0
  990. package/src/components/point-light.ts +65 -0
  991. package/src/components/post-process-params.ts +35 -0
  992. package/src/components/scene-instance.ts +193 -0
  993. package/src/components/sort-key.ts +75 -0
  994. package/src/components/spot-light.ts +124 -0
  995. package/src/components/sprite-animation.ts +169 -0
  996. package/src/components/sprite-instances.ts +179 -0
  997. package/src/components/sprite-playback-mode.ts +73 -0
  998. package/src/components/sprite-region-override.ts +106 -0
  999. package/src/components/tile-layer.ts +161 -0
  1000. package/src/components/tilemap.ts +48 -0
  1001. package/src/components/visibility.ts +53 -0
  1002. package/src/construct-renderer.ts +4 -0
  1003. package/src/debug-draw-glue.ts +169 -0
  1004. package/src/deferred-lighting.ts +92 -0
  1005. package/src/dynamic-texture-store.ts +111 -0
  1006. package/src/engine-metrics.ts +89 -0
  1007. package/src/environment/README.md +76 -0
  1008. package/src/environment/__tests__/failure-injection.test.ts +50 -0
  1009. package/src/environment/__tests__/generation-red.test.ts +64 -0
  1010. package/src/environment/__tests__/generation.test.ts +37 -0
  1011. package/src/environment/__tests__/graph-transaction.test.ts +85 -0
  1012. package/src/environment/__tests__/inspection-red.test.ts +53 -0
  1013. package/src/environment/__tests__/lifecycle-evidence.test.ts +40 -0
  1014. package/src/environment/__tests__/pipeline-topology.test.ts +33 -0
  1015. package/src/environment/__tests__/readiness.test.ts +42 -0
  1016. package/src/environment/__tests__/recovery.test.ts +62 -0
  1017. package/src/environment/__tests__/resize-dispose.test.ts +30 -0
  1018. package/src/environment/__tests__/signature-red.test.ts +45 -0
  1019. package/src/environment/__tests__/signature.test.ts +60 -0
  1020. package/src/environment/descriptors.ts +7 -0
  1021. package/src/environment/extracted-environment.ts +239 -0
  1022. package/src/environment/generation.ts +158 -0
  1023. package/src/environment/gpu-bundle.ts +144 -0
  1024. package/src/environment/graph.ts +588 -0
  1025. package/src/environment/inspection.ts +107 -0
  1026. package/src/environment/lifecycle.ts +124 -0
  1027. package/src/environment/readiness.ts +76 -0
  1028. package/src/environment/signature.ts +185 -0
  1029. package/src/errors/ecs-validation.ts +16 -0
  1030. package/src/errors/index.ts +3 -0
  1031. package/src/errors/recover.ts +119 -0
  1032. package/src/errors/render.ts +1244 -0
  1033. package/src/extract/__tests__/directional-csm-domain.unit.test.ts +391 -0
  1034. package/src/extract/__tests__/environment-source.test.ts +105 -0
  1035. package/src/extract/__tests__/schema-readers.unit.test.ts +16 -0
  1036. package/src/extract/directional-csm.ts +959 -0
  1037. package/src/extract/index.ts +10 -0
  1038. package/src/extract/material-interface.ts +604 -0
  1039. package/src/extract/schema-readers.ts +27 -0
  1040. package/src/extract/visibility.ts +120 -0
  1041. package/src/features/graph-contribution.ts +577 -0
  1042. package/src/features/host.ts +1097 -0
  1043. package/src/features/index.ts +100 -0
  1044. package/src/features/morph/index.ts +24 -0
  1045. package/src/features/morph/morph-bounds.ts +123 -0
  1046. package/src/features/morph/morph-feature.ts +287 -0
  1047. package/src/features/prepared-gpu-work.ts +902 -0
  1048. package/src/features/prepared-graphics-store.ts +435 -0
  1049. package/src/features/prepared-graphics.ts +479 -0
  1050. package/src/features/render-graph-compute.ts +60 -0
  1051. package/src/features/render-graph-contribution.ts +95 -0
  1052. package/src/features/render-graph-raster.ts +308 -0
  1053. package/src/features/render-graph-resources.ts +36 -0
  1054. package/src/features/scene-temporal.ts +274 -0
  1055. package/src/features/taa-resolve.ts +244 -0
  1056. package/src/features/targets.ts +83 -0
  1057. package/src/features/types.ts +291 -0
  1058. package/src/frame-chain.ts +21 -0
  1059. package/src/fullscreen-post-process-pass.ts +406 -0
  1060. package/src/glyph-text-layout-system.ts +447 -0
  1061. package/src/gpu-driven/batch-topology.ts +423 -0
  1062. package/src/gpu-driven/production-raster.ts +1705 -0
  1063. package/src/gpu-driven/view-gpu.ts +849 -0
  1064. package/src/gpu-driven/view-reference.ts +110 -0
  1065. package/src/gpu-resource-store.ts +1921 -0
  1066. package/src/gpu-resource.ts +159 -0
  1067. package/src/gpu-scene-schema.ts +224 -0
  1068. package/src/gpu-scene.ts +855 -0
  1069. package/src/gpu-stage.ts +9 -0
  1070. package/src/gpu-texture-usage.ts +12 -0
  1071. package/src/gpu-usage.ts +14 -0
  1072. package/src/hdrp-buffers.ts +689 -0
  1073. package/src/hdrp-cluster-membership.ts +70 -0
  1074. package/src/hdrp-pipeline.ts +525 -0
  1075. package/src/ibl/IblPipelineCache.ts +1246 -0
  1076. package/src/ibl/cubemap-projection.ts +60 -0
  1077. package/src/ibl/face-uniforms.ts +150 -0
  1078. package/src/ibl/skylight-bind-group.ts +513 -0
  1079. package/src/index.ts +271 -0
  1080. package/src/instance-buffer-cache.ts +123 -0
  1081. package/src/internal.ts +88 -0
  1082. package/src/lifecycle.ts +123 -0
  1083. package/src/light-buffer-layout.ts +346 -0
  1084. package/src/materials.ts +236 -0
  1085. package/src/mesh-material-bindings.ts +104 -0
  1086. package/src/mesh-update-errors.ts +113 -0
  1087. package/src/mipmap-generator.ts +244 -0
  1088. package/src/param-schema-projection-census.ts +73 -0
  1089. package/src/pbr-pipeline.ts +749 -0
  1090. package/src/persistent-render-scene.ts +1752 -0
  1091. package/src/pipeline/index.ts +40 -0
  1092. package/src/pipeline-builder.ts +386 -0
  1093. package/src/pipeline-errors.ts +172 -0
  1094. package/src/pipeline-spec.ts +1768 -0
  1095. package/src/plugin.ts +137 -0
  1096. package/src/post-process-errors.ts +304 -0
  1097. package/src/prepare/__tests__/schema-readers.unit.test.ts +16 -0
  1098. package/src/prepare/index.ts +8 -0
  1099. package/src/prepare/prepared-graphics-resolver.ts +455 -0
  1100. package/src/prepare/schema-readers.ts +20 -0
  1101. package/src/record/__tests__/environment-record.test.ts +35 -0
  1102. package/src/record/__tests__/frame-targets.unit.test.ts +54 -0
  1103. package/src/record/__tests__/material-bg-cache.unit.test.ts +41 -0
  1104. package/src/record/__tests__/material-slot-plan.unit.test.ts +76 -0
  1105. package/src/record/__tests__/membership-timing.unit.test.ts +524 -0
  1106. package/src/record/__tests__/render-submission.integration.test.ts +76 -0
  1107. package/src/record/__tests__/render-submission.perf.test.ts +141 -0
  1108. package/src/record/__tests__/shadow-submit-mode.unit.test.ts +88 -0
  1109. package/src/record/__tests__/video-texture-view.unit.test.ts +90 -0
  1110. package/src/record/__tests__/view-ubo-layout.unit.test.ts +101 -0
  1111. package/src/record/frame-lighting.ts +1183 -0
  1112. package/src/record/frame-observation.ts +122 -0
  1113. package/src/record/frame-snapshot.ts +515 -0
  1114. package/src/record/frame-targets.ts +372 -0
  1115. package/src/record/frame.ts +1874 -0
  1116. package/src/record/helpers.ts +289 -0
  1117. package/src/record/index.ts +15 -0
  1118. package/src/record/main-pass-geometry.ts +1014 -0
  1119. package/src/record/main-pass-material.ts +716 -0
  1120. package/src/record/main-pass-skin.ts +51 -0
  1121. package/src/record/main-pass-sprite-draws.ts +1056 -0
  1122. package/src/record/main-pass-sprite.ts +166 -0
  1123. package/src/record/main-pass.ts +588 -0
  1124. package/src/record/material-payload.ts +292 -0
  1125. package/src/record/material-slot-plan.ts +68 -0
  1126. package/src/record/membership-timing.ts +1012 -0
  1127. package/src/record/mesh-ssbo.ts +406 -0
  1128. package/src/record/shadow-caster-uniform.ts +37 -0
  1129. package/src/record/shadow-pass.ts +2387 -0
  1130. package/src/record/shadow-submit-mode.ts +277 -0
  1131. package/src/record/skybox-post-pass.ts +594 -0
  1132. package/src/record/typed-frame-graph.ts +499 -0
  1133. package/src/record/view-ubo.ts +206 -0
  1134. package/src/render-data.ts +385 -0
  1135. package/src/render-dispatch-membership.ts +155 -0
  1136. package/src/render-graph-primitives.ts +1586 -0
  1137. package/src/render-pipeline-context.ts +332 -0
  1138. package/src/render-pipeline-target.ts +96 -0
  1139. package/src/render-pipeline.ts +343 -0
  1140. package/src/render-scene-projection.ts +1738 -0
  1141. package/src/render-system-extract.ts +5203 -0
  1142. package/src/render-system-fold.ts +531 -0
  1143. package/src/render-system.ts +3258 -0
  1144. package/src/renderer/asset-service.ts +32 -0
  1145. package/src/renderer/backend-selection.ts +121 -0
  1146. package/src/renderer/environment-classify.ts +30 -0
  1147. package/src/renderer/environment-error.ts +19 -0
  1148. package/src/renderer/material/assembly.ts +53 -0
  1149. package/src/renderer/material/pipeline-projection.ts +140 -0
  1150. package/src/renderer/renderer-factory.ts +9062 -0
  1151. package/src/renderer.ts +940 -0
  1152. package/src/scene-instances/post-spawn-resolve-joints.ts +168 -0
  1153. package/src/scene-utils/collect-subtree.ts +40 -0
  1154. package/src/shadow-atlas.ts +244 -0
  1155. package/src/ssao-buffers.ts +175 -0
  1156. package/src/ssao-config.ts +61 -0
  1157. package/src/ssao-data.ts +106 -0
  1158. package/src/surface-format.ts +37 -0
  1159. package/src/systems/active-camera.ts +116 -0
  1160. package/src/systems/pass-selector.ts +49 -0
  1161. package/src/systems/skin-palette-allocator.ts +294 -0
  1162. package/src/systems/transparent-sort-config.ts +211 -0
  1163. package/src/taa-history-store.ts +429 -0
  1164. package/src/temporal-coverage.ts +106 -0
  1165. package/src/temporal-frame-transaction.ts +301 -0
  1166. package/src/temporal-inspection.ts +194 -0
  1167. package/src/temporal-view.ts +174 -0
  1168. package/src/tilemap/resolve-tileset-runtime.ts +72 -0
  1169. package/src/tilemap-chunk-extract-system.ts +1307 -0
  1170. package/src/typed-render-graph-primitives.ts +530 -0
  1171. package/src/typed-shadow-passes.ts +195 -0
  1172. package/src/urp-pipeline.ts +340 -0
@@ -0,0 +1,1056 @@
1
+ // @forgeax/engine-runtime - RenderSystem record stage: main-pass sprite draws.
2
+ // feat-20260704 M5/w31: further-split from main-pass.ts (AC-05 <=1500 lines/file).
3
+ // recordSpritePass + sprite entity/transparent/instance-buffer helpers, moved verbatim.
4
+
5
+ import {
6
+ type BindGroup,
7
+ type Buffer,
8
+ type RenderPipeline,
9
+ RhiError,
10
+ type RhiRenderPassEncoder,
11
+ } from '@forgeax/engine-rhi';
12
+ import type { Handle, MaterialRenderState } from '@forgeax/engine-types';
13
+ import { GpuBuffer } from '../gpu-resource';
14
+ import {
15
+ GPU_BUFFER_USAGE_COPY_DST,
16
+ GPU_BUFFER_USAGE_STORAGE,
17
+ GPU_BUFFER_USAGE_UNIFORM,
18
+ } from '../gpu-usage';
19
+ import {
20
+ assembleMaterialWithSkylightEntries,
21
+ type SkylightBindGroupResources,
22
+ } from '../ibl/skylight-bind-group';
23
+ import type { InstanceBufferCacheEntry } from '../instance-buffer-cache';
24
+ import { SPRITE_PREMULTIPLIED_ALPHA_BLEND } from '../materials';
25
+ import { SPRITE_PASS_PER_INSTANCE_REGION_VARIANT_SET } from '../pbr-pipeline';
26
+ import { variantSetFromVertexLayoutProjection } from '../pipeline';
27
+ import { buildBeginRenderPassDescriptor } from '../pipeline-spec';
28
+ import type { _InternalRenderPipelineContext } from '../render-pipeline-context';
29
+ import { MATERIAL_PER_ENTITY_STRIDE } from '../render-system';
30
+ import type { MaterialSnapshot, SpriteInstancesSnapshot } from '../render-system-extract';
31
+ import { worldEntityKey } from './frame-snapshot';
32
+ import { entityHasTransparentSubmesh, residentTextureView } from './main-pass-material';
33
+ import { interleaveSpriteInstanceBuffer, spriteInstancesCacheHit } from './main-pass-sprite';
34
+ import {
35
+ extractEntryResourceHandle,
36
+ getOrCreatePerEntity,
37
+ MAX_UNIFORM_INSTANCES,
38
+ MESH_PER_ENTITY_STRIDE,
39
+ } from './mesh-ssbo';
40
+
41
+ /**
42
+ * feat-20260704 M3/w19: LDR sprite split sub-pass, extracted verbatim from
43
+ * recordMainPass. Runs after the geometry pass when there are sprite / LDR
44
+ * transparent entities and the split path is active (splitLdrSprite && a raw
45
+ * unorm swap-chain view exists). Ends the geometry `pass`, opens a `spritePass`
46
+ * on the resolved transparent-pass view (loadOp=load), draws the sprite / sprite-lit
47
+ * entities (fold-instanced where possible) then the generic per-submesh
48
+ * transparent PBR submeshes, and ends the sprite pass. Returns the updated
49
+ * `geometryPassEnded` flag so the caller skips the unconditional pass.end().
50
+ *
51
+ * @internal
52
+ */
53
+ export function recordSpritePass(
54
+ c: _InternalRenderPipelineContext,
55
+ pass: RhiRenderPassEncoder,
56
+ matchedIndices: Set<number> | null,
57
+ materialSlotIndices: readonly (readonly number[])[],
58
+ sampleCount: number,
59
+ resolveMaterialBindGroup: (
60
+ materialSlot: number,
61
+ submeshMaterial: MaterialSnapshot,
62
+ entityKey: number,
63
+ ) => BindGroup,
64
+ skylightResources: SkylightBindGroupResources,
65
+ graphPass?: RhiRenderPassEncoder,
66
+ ): boolean {
67
+ const {
68
+ runtime,
69
+ pipelineState,
70
+ encoder,
71
+ msaaActive,
72
+ ldrSpritePassView,
73
+ ldrSpriteColorView,
74
+ geometryDepthView,
75
+ viewBindGroup,
76
+ splitLdrSprite,
77
+ } = c;
78
+ let geometryPassEnded = false;
79
+ if (splitLdrSprite && (graphPass !== undefined || ldrSpritePassView !== null)) {
80
+ if (graphPass === undefined) {
81
+ pass.end();
82
+ geometryPassEnded = true;
83
+ }
84
+
85
+ // feat-20260604 M2 / w9 (F-1): under MSAA the sprite sub-pass writes the
86
+ // count=4 transparent-pass view of the SAME multisample texture the
87
+ // geometry pass wrote (loadOp=load preserves geometry under sprites) and
88
+ // resolves the combined result to the single-sample transparent-pass
89
+ // view at this (last) pass end. Depth reuses the shared count=4
90
+ // multisample depth (depthLoadOp=load preserves sprite-vs-mesh occlusion).
91
+ // The single-
92
+ // sample path is byte-for-byte unchanged (writes the swap-chain view).
93
+ const spriteColorView = msaaActive ? ldrSpriteColorView : ldrSpritePassView;
94
+ // A native-capability URP frame renders LDR scenes into the graph-owned
95
+ // rgba16float target before the final output OETF. Sprite shaders have
96
+ // separate entry points because their LDR entry performs that OETF
97
+ // itself for the raw swap-chain path; select the linear-target entry when
98
+ // the transparent attachment is the graph-owned float target.
99
+ const spriteUsesLinearAttachment = transparentPassColorFormat(c) === 'rgba16float';
100
+ // sprite-split sub-pass: forward shape with both color and depth loaded
101
+ // (preserves prior content from the main forward pass under the sprites).
102
+ // Stencil ops auto-emitted by the helper because depthFormat carries
103
+ // stencil8.
104
+ const spritePass: RhiRenderPassEncoder =
105
+ graphPass ??
106
+ encoder.beginRenderPass(
107
+ buildBeginRenderPassDescriptor(
108
+ {
109
+ // SSOT for the sprite-pass color format is the resolved transparent
110
+ // attachment. Native linear-LDR frames use graph-owned `ldrColor`
111
+ // (possibly rgba16float); swap-chain fallback frames use their raw
112
+ // storage format. WebGPU requires the attachment format and PSO
113
+ // target to match, so both are resolved by the same helper.
114
+ colorFormats: [transparentPassColorFormat(c) as unknown as GPUTextureFormat],
115
+ depthFormat: 'depth24plus-stencil8',
116
+ sampleCount: msaaActive ? 4 : 1,
117
+ },
118
+ {
119
+ colorViews: [spriteColorView],
120
+ depthView: geometryDepthView,
121
+ ...(msaaActive ? { resolveTargets: [ldrSpritePassView] } : {}),
122
+ },
123
+ 'forward',
124
+ { colorLoadOp: 'load', depthLoadOp: 'load' },
125
+ ) as never,
126
+ );
127
+
128
+ spritePass.setBindGroup(0, viewBindGroup as BindGroup);
129
+
130
+ // feat-20260625-refactor-sprite-as-transparent-mesh M3 / w14 (D-7):
131
+ // sprite PSO resolution migrated from the dedicated boot-time PSO
132
+ // fields (deleted) to the generic per-MaterialShader pipeline cache.
133
+ // feat-20260626-collapse M2 / M2-T2: blend factor pair literal moved
134
+ // to the public `SPRITE_PREMULTIPLIED_ALPHA_BLEND` named constant
135
+ // (re-exported from `@forgeax/engine-runtime`) so any AI user
136
+ // building a transparent material declares the same blend by
137
+ // reference; the previous implicit blend-state factory helper is
138
+ // gone. Cache miss still surfaces as a structured
139
+ // `shader-compile-failed` RhiError mirroring the pre-w14 behaviour.
140
+ //
141
+ // feat-20260608-tilemap-object-layer-rendering M2 / m2-t6 (D-8): sprite
142
+ // pipeline cullMode='none'. H/V flip via negative scale x/y (tilemap
143
+ // per-cell entity TRS form) inverts the triangle winding; cullMode='back'
144
+ // would throw the flipped quad away. The sprite pass runs in the
145
+ // alpha-blend transparent bucket back-to-front already, so cullMode='none'
146
+ // adds no overdraw cost. Pre-feat-20260625 the dedicated spritePipeline
147
+ // hard-coded 'none' (deleted in w14); the generic path must replicate
148
+ // it here or the cullmode-flip dawn smoke goes black on negative-scale.
149
+ const spritePremulBlend: MaterialRenderState = {
150
+ depthWriteEnabled: false,
151
+ depthCompare: 'less-equal',
152
+ cullMode: 'none',
153
+ blend: SPRITE_PREMULTIPLIED_ALPHA_BLEND,
154
+ };
155
+ // bug-20260629: PR #526 added PER_INSTANCE_REGION as a second variant
156
+ // axis on sprite.wgsl. Build BOTH variants here; the per-entity loop
157
+ // picks the right one based on whether the entity carries a
158
+ // SpriteInstances snapshot:
159
+ // - spritePH (PER_INSTANCE_REGION=false): regular per-entity sprites
160
+ // + fold-bucket instanced draws (64-byte mat4 only instance buf);
161
+ // UV region comes from the material UBO `region` slot.
162
+ // - spritePH_withRegion (PER_INSTANCE_REGION=true): SpriteInstances
163
+ // entities with 80-byte interleaved (mat4 64B + region 16B) per
164
+ // instance; UV region comes from `instances[idx].region`.
165
+ //
166
+ // Without spritePH_withRegion the SpriteInstances data was uploaded
167
+ // but the shader read bytes 64-79 as region=0 → black quads.
168
+ //
169
+ // feat-20260624-sprite-lit-shading-model-pure-2d-lighting M1' / t7:
170
+ // sprite-lit walks the same LDR transparent split pass with mirror
171
+ // PSO request shape (only materialShaderId string differs). The
172
+ // sprite-lit PSO is fetched lazily per-entity below since the pass
173
+ // mixes sprite + sprite-lit transparent entities. PSO cache strings
174
+ // are isolated by `materialShaderId` (D-11), no slot collision.
175
+ const spritePH =
176
+ runtime.getMaterialShaderPipeline?.(
177
+ 'forgeax::sprite',
178
+ spriteUsesLinearAttachment,
179
+ spritePremulBlend,
180
+ 'triangle-list',
181
+ undefined,
182
+ undefined,
183
+ 'forward',
184
+ undefined,
185
+ msaaActive ? 4 : 1,
186
+ // feat-20260625-refactor-sprite-as-transparent-mesh R2 fix-up:
187
+ // the split sub-pass PSO must use the same attachment format as the
188
+ // encoder. Native linear-LDR frames resolve graph-owned `ldrColor`
189
+ // (possibly rgba16float); swap-chain fallback frames resolve their raw
190
+ // storage format. `transparentPassColorFormat` is the single owner for
191
+ // this format so lazy PSO construction cannot fall back to the geometry
192
+ // sRGB view.
193
+ transparentPassColorFormat(c, pipelineState) as unknown as GPUTextureFormat,
194
+ undefined,
195
+ undefined,
196
+ undefined,
197
+ undefined,
198
+ spriteUsesLinearAttachment ? 'fs_main_hdr' : undefined,
199
+ ) ?? null;
200
+ const spritePH_withRegion =
201
+ runtime.getMaterialShaderPipeline?.(
202
+ 'forgeax::sprite',
203
+ spriteUsesLinearAttachment,
204
+ spritePremulBlend,
205
+ 'triangle-list',
206
+ undefined,
207
+ SPRITE_PASS_PER_INSTANCE_REGION_VARIANT_SET,
208
+ 'forward',
209
+ undefined,
210
+ msaaActive ? 4 : 1,
211
+ transparentPassColorFormat(c) as unknown as GPUTextureFormat,
212
+ undefined,
213
+ undefined,
214
+ undefined,
215
+ undefined,
216
+ spriteUsesLinearAttachment ? 'fs_main_hdr' : undefined,
217
+ ) ?? null;
218
+
219
+ // bug-20260629: spritePH===null check moved OUTSIDE the entity loop so the
220
+ // sprite pass is properly ended before returning. Inside the loop the early
221
+ // `return` left spritePass open → render-pass-not-ended error every frame
222
+ // where the pipeline is still being compiled (frame 0 on first load).
223
+ //
224
+ // feat-city-glb Bug 5: a missing sprite PSO must NOT abort the whole
225
+ // sub-pass — the generic per-submesh PBR transparent loop below does not
226
+ // depend on the sprite shader. Only skip the sprite ENTITIES when spritePH
227
+ // is null (fire the diagnostic once, iff a sprite entity is actually
228
+ // present), then fall through to the PBR loop. A PBR-only transparent
229
+ // scene (e.g. a glTF BLEND decal, no sprites) renders regardless of
230
+ // whether sprite.wgsl is in the manifest.
231
+ const spriteUnavailable = spritePH === null;
232
+ let spriteUnavailableReported = false;
233
+ const reportSpriteUnavailable = (): void => {
234
+ if (spriteUnavailableReported) return;
235
+ spriteUnavailableReported = true;
236
+ runtime.errorRegistry.fire(
237
+ new RhiError({
238
+ code: 'shader-compile-failed',
239
+ expected:
240
+ 'manifest entries include sprite.wgsl + the engine triple (pbr + unlit + tonemap)',
241
+ hint: 'verify @forgeax/engine-vite-plugin-shader emits manifest.json with the 4 engine entries (sprite.wgsl is required when spawning sprite materials); check vite plugin engineEntries option',
242
+ }),
243
+ );
244
+ };
245
+
246
+ // feat-20260624 M1' / t7: parallel sprite-lit PSO request — same
247
+ // arg shape, only materialShaderId differs.
248
+ const spriteLitPH =
249
+ runtime.getMaterialShaderPipeline?.(
250
+ 'forgeax::sprite-lit',
251
+ spriteUsesLinearAttachment,
252
+ spritePremulBlend,
253
+ 'triangle-list',
254
+ undefined,
255
+ undefined,
256
+ 'forward',
257
+ undefined,
258
+ msaaActive ? 4 : 1,
259
+ transparentPassColorFormat(c) as unknown as GPUTextureFormat,
260
+ undefined,
261
+ undefined,
262
+ undefined,
263
+ undefined,
264
+ spriteUsesLinearAttachment ? 'fs_main_hdr' : undefined,
265
+ ) ?? null;
266
+
267
+ recordSpriteEntityDraws(
268
+ c,
269
+ spritePass,
270
+ matchedIndices,
271
+ skylightResources,
272
+ spritePH,
273
+ spritePH_withRegion,
274
+ spriteLitPH,
275
+ spriteUnavailable,
276
+ reportSpriteUnavailable,
277
+ );
278
+
279
+ // feat-city-glb Bug 5 (per-submesh transparency): generic per-submesh PBR
280
+ // draws in the LDR blend sub-pass. The sprite loop above handles only true
281
+ // sprite / sprite-lit entities (whole-mesh sprite PSO). EVERY non-sprite
282
+ // transparent material — built-in PBR, single- or multi-submesh, incl.
283
+ // glTF alphaMode=BLEND (the crosswalk decal submesh AND the 4.3-blending
284
+ // window quad) — is drawn here with its real shader + per-submesh
285
+ // geometry, reusing the geometry pass's PBR machinery but rendering into
286
+ // the resolved transparent attachment (colorFormatOverride =
287
+ // transparentPassColorFormat(c)).
288
+ // Opaque submeshes of a mixed mesh were already drawn in the geometry pass
289
+ // (per-submesh skip there).
290
+ //
291
+ // Non-skinned, non-instanced (glTF static meshes): group 2 = the shared
292
+ // frame meshBindGroup with the per-entity dynamic offset; group 3 = the
293
+ // identity instance BG (drawIndexed instanceCount=1). Skinned / instanced
294
+ // transparent submeshes are OOS here (no such content) and fall through.
295
+ recordSpriteTransparentPbrDraws(
296
+ c,
297
+ spritePass,
298
+ matchedIndices,
299
+ materialSlotIndices,
300
+ sampleCount,
301
+ resolveMaterialBindGroup,
302
+ );
303
+
304
+ if (graphPass === undefined) spritePass.end();
305
+ }
306
+ return geometryPassEnded;
307
+ }
308
+
309
+ /**
310
+ * feat-20260704 M3/w19: generic per-submesh transparent PBR draws in the LDR
311
+ * blend sub-pass, extracted verbatim from the sprite split pass. Every
312
+ * non-sprite transparent material (built-in PBR, single- or multi-submesh, incl.
313
+ * glTF alphaMode=BLEND) draws here with its real shader + per-submesh geometry,
314
+ * reusing the geometry pass's PBR machinery but rendering into the resolved
315
+ * transparent attachment (colorFormatOverride = transparentPassColorFormat(c)). Opaque submeshes of a
316
+ * mixed mesh were already drawn in the geometry pass (per-submesh skip there).
317
+ * Sprites are handled by the sprite loop; skinned / instanced transparent
318
+ * submeshes are OOS here and fall through.
319
+ *
320
+ * @internal
321
+ */
322
+ function recordSpriteTransparentPbrDraws(
323
+ c: _InternalRenderPipelineContext,
324
+ spritePass: RhiRenderPassEncoder,
325
+ matchedIndices: Set<number> | null,
326
+ materialSlotIndices: readonly (readonly number[])[],
327
+ sampleCount: number,
328
+ resolveMaterialBindGroup: (
329
+ materialSlot: number,
330
+ submeshMaterial: MaterialSnapshot,
331
+ entityKey: number,
332
+ ) => BindGroup,
333
+ ): void {
334
+ const { runtime, pipelineState, frameState, bindGroupCounts, validatedOrdered, meshBindGroup } =
335
+ c;
336
+ let lastPbrSubPipelineHandle: typeof pipelineState.unlitPipeline = null;
337
+ let lastPbrSubVertexBuffer: GpuBuffer | null = null;
338
+ let lastPbrSubIndexBuffer: GpuBuffer | null = null;
339
+ for (let i = 0; i < validatedOrdered.length; i++) {
340
+ const entry = validatedOrdered[i];
341
+ if (entry === undefined) continue;
342
+ if (matchedIndices !== null && !matchedIndices.has(entry.renderableIndex)) continue;
343
+ // Sprites are handled by the sprite loop above; skip them here.
344
+ const entShaderId = entry.source.material.materialShaderId;
345
+ const entIsSprite = entShaderId === 'forgeax::sprite' || entShaderId === 'forgeax::sprite-lit';
346
+ if (entIsSprite) continue;
347
+ // Only entities that carry at least one transparent submesh reach a draw
348
+ // (single-submesh transparent PBR and mixed opaque+transparent meshes).
349
+ if (!entityHasTransparentSubmesh(entry.source)) continue;
350
+ // Skinned / instanced transparent submeshes are not supported in this
351
+ // sub-pass path (no such content today); skip to avoid mis-binding.
352
+ if (entry.source.skin !== undefined || entry.source.instances !== undefined) continue;
353
+
354
+ const matsForRebind = entry.source.materials;
355
+ if (entry.mesh.vertexBuffer !== lastPbrSubVertexBuffer) {
356
+ spritePass.setVertexBuffer(0, entry.mesh.vertexBuffer.handle);
357
+ lastPbrSubVertexBuffer = entry.mesh.vertexBuffer;
358
+ }
359
+ if (
360
+ entry.mesh.indexed &&
361
+ entry.mesh.indexBuffer !== null &&
362
+ entry.mesh.indexBuffer !== lastPbrSubIndexBuffer
363
+ ) {
364
+ spritePass.setIndexBuffer(entry.mesh.indexBuffer.handle, entry.mesh.indexFormat);
365
+ lastPbrSubIndexBuffer = entry.mesh.indexBuffer;
366
+ }
367
+ spritePass.setBindGroup(2, meshBindGroup as BindGroup, [i * MESH_PER_ENTITY_STRIDE]);
368
+ // Identity instance BG (instanceCount=1); reuse the per-entity cache.
369
+ const identityInstBg: BindGroup = getOrCreatePerEntity(
370
+ frameState.instancesBgPerEntity,
371
+ worldEntityKey(entry.source.worldId, entry.source.entityKey),
372
+ [pipelineState.identityInstanceBuffer],
373
+ 'instances',
374
+ () => {
375
+ const result = runtime.device.createBindGroup({
376
+ label: 'pbr-transparent-sub-instances-bg',
377
+ layout: pipelineState.instancesBindGroupLayout,
378
+ entries: [
379
+ {
380
+ binding: 0,
381
+ resource: {
382
+ kind: 'buffer',
383
+ value: { buffer: pipelineState.identityInstanceBuffer },
384
+ },
385
+ },
386
+ ],
387
+ });
388
+ if (!result.ok) throw result.error;
389
+ return result.value;
390
+ },
391
+ bindGroupCounts,
392
+ );
393
+ spritePass.setBindGroup(3, identityInstBg);
394
+
395
+ const subVariantSet = frameState.isHdrpActive
396
+ ? ''
397
+ : 'CLUSTER_FORWARD_AVAILABLE=false+STORAGE_BUFFER_AVAILABLE=true';
398
+ const projectionVariantSetResult = variantSetFromVertexLayoutProjection(
399
+ entry.mesh.layoutProjection,
400
+ subVariantSet,
401
+ );
402
+ if (!projectionVariantSetResult.ok) {
403
+ runtime.errorRegistry.fire(projectionVariantSetResult.error);
404
+ continue;
405
+ }
406
+ const projectionVariantSet = projectionVariantSetResult.value;
407
+ for (let smIdx = 0; smIdx < entry.mesh.submeshes.length; smIdx++) {
408
+ const sm = entry.mesh.submeshes[smIdx];
409
+ if (sm === undefined) continue;
410
+ const matSlotIdx = sm.materialSlot;
411
+ const submeshMaterial = matsForRebind[matSlotIdx] ?? entry.source.material;
412
+ // Only transparent submeshes belong in this blend sub-pass; opaque
413
+ // submeshes were drawn in the geometry pass.
414
+ if (submeshMaterial.transparent !== true) continue;
415
+ const smShaderId = submeshMaterial.materialShaderId;
416
+ if (smShaderId === undefined) continue;
417
+
418
+ // Bind the per-submesh material BG first (mirrors the geometry pass
419
+ // order), then resolve the PSO; a first-frame async-compile miss skips
420
+ // only the draw, not the BG (one transient frame, PSO flows in next).
421
+ const materialSlot = materialSlotIndices[i]?.[matSlotIdx] ?? materialSlotIndices[i]?.[0] ?? 0;
422
+ const subBg = resolveMaterialBindGroup(materialSlot, submeshMaterial, entry.source.entityKey);
423
+ spritePass.setBindGroup(1, subBg, [materialSlot * MATERIAL_PER_ENTITY_STRIDE]);
424
+
425
+ const subPipeline =
426
+ runtime.getMaterialShaderPipeline?.(
427
+ smShaderId,
428
+ /* isHdr */ false,
429
+ submeshMaterial.renderState,
430
+ sm.topology,
431
+ entry.mesh.indexFormat,
432
+ projectionVariantSet,
433
+ 'forward',
434
+ undefined,
435
+ sampleCount,
436
+ // Non-sRGB blend view (same override the sprite path uses).
437
+ transparentPassColorFormat(c) as unknown as GPUTextureFormat,
438
+ undefined,
439
+ undefined,
440
+ undefined,
441
+ undefined,
442
+ undefined,
443
+ entry.mesh.layoutProjection,
444
+ ) ?? null;
445
+ if (subPipeline === null) continue;
446
+
447
+ if (lastPbrSubPipelineHandle !== subPipeline) {
448
+ // biome-ignore lint/suspicious/noExplicitAny: opaque RHI pipeline handle
449
+ spritePass.setPipeline(subPipeline as any);
450
+ lastPbrSubPipelineHandle = subPipeline;
451
+ }
452
+ if (entry.mesh.indexed) {
453
+ spritePass.drawIndexed(sm.indexCount, 1, sm.indexOffset, 0, 0);
454
+ } else {
455
+ spritePass.draw(sm.vertexCount, 1, 0, 0);
456
+ }
457
+ }
458
+ }
459
+ }
460
+
461
+ /**
462
+ * feat-20260704 M3/w19: per-entity sprite / sprite-lit draw loop for the LDR
463
+ * blend sub-pass, extracted verbatim from the sprite split pass. Selects the
464
+ * sprite vs sprite-lit PSO per entity, resolves the per-entity / fold-bucket
465
+ * instance buffer (fold-instanced drawIndexed where a fold bucket applies and
466
+ * the entity has no explicit Instances), uploads the per-entity sprite material
467
+ * UBO slice, binds view / material / mesh / instances groups, and issues the
468
+ * draw. Non-sprite transparent submeshes are drawn separately
469
+ * (recordSpriteTransparentPbrDraws). The loop-invariant sprite PSO handles + the
470
+ * once-per-frame sprite-unavailable diagnostic are threaded in.
471
+ *
472
+ * @internal
473
+ */
474
+ function recordSpriteEntityDraws(
475
+ c: _InternalRenderPipelineContext,
476
+ spritePass: RhiRenderPassEncoder,
477
+ matchedIndices: Set<number> | null,
478
+ skylightResources: SkylightBindGroupResources,
479
+ spritePH: RenderPipeline | null,
480
+ spritePH_withRegion: RenderPipeline | null,
481
+ spriteLitPH: RenderPipeline | null,
482
+ spriteUnavailable: boolean,
483
+ reportSpriteUnavailable: () => void,
484
+ ): void {
485
+ const {
486
+ runtime,
487
+ world,
488
+ store,
489
+ pipelineState,
490
+ frameState,
491
+ bindGroupCounts,
492
+ validatedOrdered,
493
+ meshBindGroup,
494
+ foldDispatchPlan,
495
+ materialSlotIndices,
496
+ } = c;
497
+ // biome-ignore lint/suspicious/noExplicitAny: opaque RHI pipeline handle
498
+ let lastSpritePipelineHandle: any = null;
499
+ let lastSpriteVertexBuffer: GpuBuffer | null = null;
500
+ let lastSpriteIndexBuffer: GpuBuffer | null = null;
501
+ for (let i = 0; i < validatedOrdered.length; i++) {
502
+ const spriteEntry = validatedOrdered[i];
503
+ // feat-20260625 M3 / w13: sub-pass entity filter migrated from
504
+ // `shadingModel === 'sprite'` to `transparent === true` — the
505
+ // shadingModel arm is gone post-feat (plan-strategy D-3).
506
+ if (spriteEntry === undefined || spriteEntry.source.material.transparent !== true) continue;
507
+ // feat-city-glb Bug 5 (per-submesh transparency): this loop is the
508
+ // SPRITE path (whole-mesh sprite / sprite-lit PSO). Non-sprite
509
+ // transparent materials (built-in PBR, incl. glTF alphaMode=BLEND) are
510
+ // drawn per-submesh with their real shader in the dedicated PBR loop
511
+ // below — so skip them here. Previously the 4.3-blending window (a PBR
512
+ // material) was drawn through here with the sprite shader; it now flows
513
+ // through the PBR loop, which is both correct and multi-submesh-capable.
514
+ {
515
+ const sid = spriteEntry.source.material.materialShaderId;
516
+ const isSpriteShader = sid === 'forgeax::sprite' || sid === 'forgeax::sprite-lit';
517
+ if (!isSpriteShader) continue;
518
+ }
519
+ // Sprite PSO unavailable (sprite.wgsl absent / still compiling): skip
520
+ // sprite entities and report once, but do NOT abort the sub-pass — the
521
+ // PBR transparent loop below is independent of the sprite shader.
522
+ if (spriteUnavailable) {
523
+ reportSpriteUnavailable();
524
+ continue;
525
+ }
526
+
527
+ // feat-20260622-chunk-gpu-instancing-sprite-tilemap M1 / w4-record-swap
528
+ // (D-1): fold-bucket non-head member — skip; the bucket head emits one
529
+ // instanced drawIndexed covering all members.
530
+ if (foldDispatchPlan?.skipIndices.has(i) === true) continue;
531
+ const foldHeadBucket = foldDispatchPlan?.headBuckets.get(i);
532
+
533
+ // feat-20260609 M2: skip entities that don't match the pass selector.
534
+ if (matchedIndices !== null && !matchedIndices.has(spriteEntry.renderableIndex)) continue;
535
+
536
+ // feat-20260624 M1' / t7: select sprite vs sprite-lit PSO per
537
+ // entity. Both paths share the LDR sub-pass + the same UBO
538
+ // layout; only the shader module + fragment math differ. PSO
539
+ // cache strings are isolated by materialShaderId (D-11) so
540
+ // routing here keeps the cache slots disjoint.
541
+ //
542
+ // bug-20260629: SpriteInstances entities additionally need the
543
+ // PER_INSTANCE_REGION=true variant so the shader reads UV region
544
+ // from the 80B-per-instance interleaved buffer rather than from
545
+ // the material UBO. Only the base sprite path has the per-instance
546
+ // region variant compiled; sprite-lit + non-instances entities
547
+ // keep the PER_INSTANCE_REGION=false variant.
548
+ const entityShaderId = spriteEntry.source.material.materialShaderId;
549
+ const useRegionVariant =
550
+ entityShaderId !== 'forgeax::sprite-lit' && spriteEntry.source.spriteInstances !== undefined;
551
+ const activeSpritePH =
552
+ entityShaderId === 'forgeax::sprite-lit'
553
+ ? spriteLitPH
554
+ : useRegionVariant
555
+ ? spritePH_withRegion
556
+ : spritePH;
557
+ if (activeSpritePH === null) {
558
+ // Variant not yet compiled — for PER_INSTANCE_REGION=true the
559
+ // variant cache fill is async on first use (mirrors the
560
+ // spritePH===null guard above); falling back to the non-region
561
+ // variant would render black quads (region read returns 0).
562
+ // For sprite-lit the manifest may lack sprite-lit.wgsl; either
563
+ // way fail-safe-skip is the closest the renderer can get to
564
+ // "show nothing visibly wrong" without ending the sprite pass
565
+ // (which would drop remaining sprite entities for the frame).
566
+ if (entityShaderId === 'forgeax::sprite-lit') {
567
+ runtime.errorRegistry.fire(
568
+ new RhiError({
569
+ code: 'shader-compile-failed',
570
+ expected:
571
+ 'manifest entries include sprite.wgsl + sprite-lit.wgsl (when sprite-lit materials are used) + the engine triple (pbr + unlit + tonemap)',
572
+ hint: 'verify @forgeax/engine-vite-plugin-shader emits manifest.json with sprite.wgsl AND sprite-lit.wgsl entries; check vite plugin engineEntries option',
573
+ }),
574
+ );
575
+ }
576
+ continue;
577
+ }
578
+ if (lastSpritePipelineHandle !== activeSpritePH) {
579
+ // biome-ignore lint/suspicious/noExplicitAny: opaque RHI pipeline handle
580
+ spritePass.setPipeline(activeSpritePH as any);
581
+ lastSpritePipelineHandle = activeSpritePH;
582
+ }
583
+
584
+ if (spriteEntry.mesh.vertexBuffer !== lastSpriteVertexBuffer) {
585
+ spritePass.setVertexBuffer(0, spriteEntry.mesh.vertexBuffer.handle);
586
+ lastSpriteVertexBuffer = spriteEntry.mesh.vertexBuffer;
587
+ }
588
+ if (
589
+ spriteEntry.mesh.indexBuffer !== null &&
590
+ spriteEntry.mesh.indexBuffer !== lastSpriteIndexBuffer
591
+ ) {
592
+ spritePass.setIndexBuffer(spriteEntry.mesh.indexBuffer.handle, spriteEntry.mesh.indexFormat);
593
+ lastSpriteIndexBuffer = spriteEntry.mesh.indexBuffer;
594
+ }
595
+
596
+ // Instance buffer resolution: same cap-gate logic as the geometry
597
+ // pass entity loop; sprites with Instances (e.g. hello-sprite-atlas
598
+ // 100-instance walk-cycle) require per-entity storage buffer upload.
599
+ // SSOT mirror of geometry pass instances block above (~line 1610):
600
+ // identical cap-gate sequence (storageBuffer cap → limit-exceeded →
601
+ // cache-lookup → createBuffer → writeBuffer); variable names carry
602
+ // "sprite" prefix; logic divergence would be a bug.
603
+ //
604
+ // feat-20260622-chunk-gpu-instancing-sprite-tilemap M1 / w4-record-swap
605
+ // (D-1): when `foldHeadBucket !== undefined` AND the sprite entity has
606
+ // no explicit Instances component, assemble the bucket transforms into
607
+ // a transient instance buffer + override `spriteInstanceCount =
608
+ // bucket.bucketSize`. The mesh slot at `i*MESH_PER_ENTITY_STRIDE` was
609
+ // already overwritten to identity in the mesh SSBO upload loop above,
610
+ // so the shader computes `world = identity * bucket.transforms[idx] *
611
+ // pos`, per-instance correct. Entities with explicit Instances bypass
612
+ // fold (their per-entity Instances semantic wins); bucket key forces
613
+ // such an entity to be a singleton bucket in practice because its
614
+ // material is distinct or unfolded, but defensively check here as a
615
+ // belt-and-suspenders guard.
616
+ let spriteInstanceBuffer: Buffer = pipelineState.identityInstanceBuffer;
617
+ let spriteInstanceCount = 1;
618
+ const spriteInst = spriteEntry.source.instances;
619
+ const useFold = foldHeadBucket !== undefined && spriteInst === undefined;
620
+ if (useFold && foldHeadBucket !== undefined) {
621
+ // w6 (D-8): bucket transient buffer reuse — composite cacheKey from
622
+ // (materialHandle, layer, validatedOrdered head index) so the
623
+ // existing `frameState.instanceBuffers` byteLength/archVersion path
624
+ // covers static steady-state upload-skip. Numeric Map<number,…> key
625
+ // requires a 32-bit-safe fold; we use a negative number-space prefix
626
+ // (-1, -2, ...) by `((materialHandle << 16) | i)` shifted into the
627
+ // negative half so it never collides with positive entity-Instances
628
+ // cacheKeys (which are extracted from Instances component cacheKey
629
+ // numeric ids, always non-negative). The `archVersion` proxy is
630
+ // bucketSize (a structural-shape signal) so static frames hit the
631
+ // cache.
632
+ const bucketCacheKey = -1 - (((foldHeadBucket.materialHandle & 0xffff) << 16) | (i & 0xffff));
633
+ const bucketBytes = foldHeadBucket.transforms.byteLength;
634
+ const uniformFallback = runtime.device.caps.storageBuffer === false;
635
+ const bucketBufUsage = uniformFallback
636
+ ? GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST
637
+ : GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST;
638
+ const cachedBucket = frameState.instanceBuffers.get(bucketCacheKey);
639
+ let activeBucket: InstanceBufferCacheEntry | null = null;
640
+ if (
641
+ cachedBucket !== undefined &&
642
+ cachedBucket.uploadedArchVersion === foldHeadBucket.bucketSize &&
643
+ cachedBucket.uploadedByteLength === bucketBytes
644
+ ) {
645
+ activeBucket = cachedBucket;
646
+ } else if (bucketBytes > 0) {
647
+ const bufRes = runtime.device.createBuffer({
648
+ size: bucketBytes,
649
+ usage: bucketBufUsage,
650
+ mappedAtCreation: false,
651
+ });
652
+ if (!bufRes.ok) {
653
+ runtime.errorRegistry.fire(bufRes.error);
654
+ } else {
655
+ if (cachedBucket !== undefined && !cachedBucket.buffer.isDestroyed) {
656
+ const r = cachedBucket.buffer.destroy();
657
+ if (!r.ok) runtime.errorRegistry.fire(r.error);
658
+ }
659
+ const newBuf = new GpuBuffer(runtime.device, bufRes.value);
660
+ activeBucket = {
661
+ buffer: newBuf,
662
+ uploadedArchVersion: foldHeadBucket.bucketSize,
663
+ uploadedByteLength: bucketBytes,
664
+ };
665
+ frameState.instanceBuffers.set(bucketCacheKey, activeBucket);
666
+ }
667
+ }
668
+ if (activeBucket !== null) {
669
+ const writeRes = runtime.device.queue.writeBuffer(
670
+ activeBucket.buffer.handle,
671
+ 0,
672
+ foldHeadBucket.transforms,
673
+ );
674
+ if (!writeRes.ok) {
675
+ runtime.errorRegistry.fire(writeRes.error);
676
+ } else {
677
+ spriteInstanceBuffer = activeBucket.buffer.handle;
678
+ spriteInstanceCount = foldHeadBucket.bucketSize;
679
+ }
680
+ }
681
+ } else if (spriteInst !== undefined) {
682
+ const uniformFallback = runtime.device.caps.storageBuffer === false;
683
+ let spriteBufUsage = GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST;
684
+
685
+ if (uniformFallback) {
686
+ if (spriteInst.instanceCount > MAX_UNIFORM_INSTANCES) {
687
+ runtime.errorRegistry.fire(
688
+ new RhiError({
689
+ code: 'limit-exceeded',
690
+ expected: `instance count <= ${MAX_UNIFORM_INSTANCES} (uniform fallback cap)`,
691
+ hint: `reduce instance count to ${MAX_UNIFORM_INSTANCES} or use a WebGPU-capable backend`,
692
+ detail: {
693
+ maxStorageBufferBindingSize: MAX_UNIFORM_INSTANCES * 64,
694
+ requestedBytes: spriteInst.instanceCount * 64,
695
+ },
696
+ }),
697
+ );
698
+ spriteInstanceCount = spriteInst.instanceCount;
699
+ spriteInstanceBuffer = pipelineState.identityInstanceBuffer;
700
+ const spriteInstBgResult = runtime.device.createBindGroup({
701
+ label: 'sprite-pass-instances-bg',
702
+ layout: pipelineState.instancesBindGroupLayout,
703
+ entries: [
704
+ {
705
+ binding: 0,
706
+ resource: {
707
+ kind: 'buffer',
708
+ value: { buffer: spriteInstanceBuffer },
709
+ },
710
+ },
711
+ ],
712
+ // biome-ignore lint/suspicious/noExplicitAny: opaque RHI descriptor
713
+ }) as any;
714
+ if (!spriteInstBgResult.ok) throw spriteInstBgResult.error;
715
+ spritePass.setBindGroup(3, spriteInstBgResult.value as BindGroup);
716
+ spritePass.drawIndexed(spriteEntry.mesh.indexCount, spriteInstanceCount, 0, 0, 0);
717
+ continue;
718
+ }
719
+ spriteBufUsage = GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST;
720
+ }
721
+
722
+ {
723
+ const requestedBytes = spriteInst.transforms.byteLength;
724
+ const cap = runtime.device.limits.maxStorageBufferBindingSize;
725
+ if (typeof cap === 'number' && requestedBytes > cap) {
726
+ runtime.errorRegistry.fire(
727
+ new RhiError({
728
+ code: 'limit-exceeded',
729
+ expected: `requestedBytes (${requestedBytes}) <= maxStorageBufferBindingSize (${cap})`,
730
+ hint: 'reduce instance count to fit within device.limits.maxStorageBufferBindingSize, or split transforms across multiple Instances entries',
731
+ detail: {
732
+ maxStorageBufferBindingSize: cap,
733
+ requestedBytes,
734
+ },
735
+ }),
736
+ );
737
+ } else {
738
+ const cachedSprite = frameState.instanceBuffers.get(
739
+ worldEntityKey(spriteEntry.source.worldId, spriteInst.cacheKey),
740
+ );
741
+ let activeSprite: InstanceBufferCacheEntry | null = null;
742
+ if (
743
+ cachedSprite !== undefined &&
744
+ cachedSprite.uploadedArchVersion === spriteInst.archVersion &&
745
+ cachedSprite.uploadedByteLength === requestedBytes
746
+ ) {
747
+ activeSprite = cachedSprite;
748
+ } else if (requestedBytes > 0) {
749
+ const bufRes = runtime.device.createBuffer({
750
+ size: requestedBytes,
751
+ usage: spriteBufUsage,
752
+ mappedAtCreation: false,
753
+ });
754
+ if (!bufRes.ok) {
755
+ runtime.errorRegistry.fire(bufRes.error);
756
+ } else {
757
+ // feat-20260619 M4 / F12: destroy the old cached buffer
758
+ // before replacing it with the new one (D-6).
759
+ if (cachedSprite !== undefined && !cachedSprite.buffer.isDestroyed) {
760
+ const r = cachedSprite.buffer.destroy();
761
+ if (!r.ok) runtime.errorRegistry.fire(r.error);
762
+ }
763
+ const newBuf = new GpuBuffer(runtime.device, bufRes.value);
764
+ activeSprite = {
765
+ buffer: newBuf,
766
+ uploadedArchVersion: spriteInst.archVersion,
767
+ uploadedByteLength: requestedBytes,
768
+ };
769
+ frameState.instanceBuffers.set(
770
+ worldEntityKey(spriteEntry.source.worldId, spriteInst.cacheKey),
771
+ activeSprite,
772
+ );
773
+ }
774
+ }
775
+ if (activeSprite !== null) {
776
+ const writeRes = runtime.device.queue.writeBuffer(
777
+ activeSprite.buffer.handle,
778
+ 0,
779
+ spriteInst.transforms,
780
+ );
781
+ if (!writeRes.ok) {
782
+ runtime.errorRegistry.fire(writeRes.error);
783
+ } else {
784
+ spriteInstanceBuffer = activeSprite.buffer.handle;
785
+ spriteInstanceCount = Math.max(1, spriteInst.instanceCount);
786
+ }
787
+ }
788
+ }
789
+ }
790
+ }
791
+
792
+ // feat-20260625-sprite-instances-and-tilemap-terrain-static-batch
793
+ // M3 / w11: SpriteInstances 80B-per-instance interleaved upload path.
794
+ // SSOT for the per-entity 2D mat4 + per-instance UV region buffer
795
+ // (plan-strategy D-1 interleaved single buffer + single binding slot;
796
+ // D-9 cacheKey = entity packed u32). The extract-stage validator
797
+ // (M3 / w10) enforces the XOR contract `Instances XOR SpriteInstances`
798
+ // (sprite-instances-mutually-exclusive-with-instances), so the
799
+ // legacy `spriteInst` block above and this block are never both
800
+ // active for the same entity.
801
+ const _si = resolveSpriteInstancesBuffer(
802
+ c,
803
+ spriteEntry,
804
+ spriteInstanceBuffer,
805
+ spriteInstanceCount,
806
+ );
807
+ spriteInstanceBuffer = _si.buffer;
808
+ spriteInstanceCount = _si.count;
809
+
810
+ // M3 / w12: LDR sprite split pass per-entity instances BG cache.
811
+ // Same pattern as #7.
812
+ const spriteInstancesBg: BindGroup = getOrCreatePerEntity(
813
+ frameState.instancesBgPerEntity,
814
+ worldEntityKey(spriteEntry.source.worldId, spriteEntry.source.entityKey),
815
+ [spriteInstanceBuffer],
816
+ 'instances',
817
+ () => {
818
+ const result = runtime.device.createBindGroup({
819
+ label: 'sprite-pass-instances-bg',
820
+ layout: pipelineState.instancesBindGroupLayout,
821
+ entries: [
822
+ {
823
+ binding: 0,
824
+ resource: {
825
+ kind: 'buffer',
826
+ value: { buffer: spriteInstanceBuffer },
827
+ },
828
+ },
829
+ ],
830
+ });
831
+ if (!result.ok) throw result.error;
832
+ return result.value;
833
+ },
834
+ bindGroupCounts,
835
+ );
836
+
837
+ spritePass.setBindGroup(2, meshBindGroup as BindGroup, [i * MESH_PER_ENTITY_STRIDE]);
838
+
839
+ // Per-entity sprite material bind group: use the shader's schema-derived
840
+ // material layout when the renderer exposes it. The shared PBR layout is
841
+ // retained only for render-system contexts without that owner.
842
+ const spriteMaterialShaderId =
843
+ spriteEntry.source.material.materialShaderId ?? 'forgeax::sprite';
844
+ const spriteMaterialBgl =
845
+ runtime.getMaterialBindGroupLayout?.(spriteMaterialShaderId) ??
846
+ pipelineState.materialBindGroupLayout;
847
+ const spriteUsesDerivedMaterialLayout =
848
+ runtime.getMaterialBindGroupLayout?.(spriteMaterialShaderId) !== undefined;
849
+ const spriteTexHandle = spriteEntry.source.material.baseColorTexture as
850
+ | Handle<'TextureAsset', 'shared'>
851
+ | undefined;
852
+ let spriteTexView = pipelineState.defaultWhiteTextureView;
853
+ if (spriteTexHandle !== undefined) {
854
+ const tv = residentTextureView(world, store, runtime, spriteTexHandle);
855
+ if (tv !== undefined) spriteTexView = tv as never;
856
+ }
857
+ const spritePassBaseMaterialEntries = [
858
+ {
859
+ binding: 0,
860
+ resource: {
861
+ kind: 'buffer' as const,
862
+ value: {
863
+ buffer: pipelineState.materialUniformBuffer.buffer,
864
+ offset: 0,
865
+ size: MATERIAL_PER_ENTITY_STRIDE,
866
+ },
867
+ },
868
+ },
869
+ {
870
+ binding: 1,
871
+ resource: { kind: 'sampler' as const, value: pipelineState.nearestSampler },
872
+ },
873
+ { binding: 2, resource: { kind: 'textureView' as const, value: spriteTexView } },
874
+ ];
875
+ if (!spriteUsesDerivedMaterialLayout) {
876
+ spritePassBaseMaterialEntries.push(
877
+ {
878
+ binding: 3,
879
+ resource: { kind: 'sampler' as const, value: pipelineState.defaultSampler },
880
+ },
881
+ {
882
+ binding: 4,
883
+ resource: {
884
+ kind: 'textureView' as const,
885
+ value: pipelineState.defaultWhiteTextureView,
886
+ },
887
+ },
888
+ {
889
+ binding: 5,
890
+ resource: { kind: 'sampler' as const, value: pipelineState.defaultSampler },
891
+ },
892
+ {
893
+ binding: 6,
894
+ resource: {
895
+ kind: 'textureView' as const,
896
+ value: pipelineState.defaultNormalTextureView,
897
+ },
898
+ },
899
+ {
900
+ binding: 7,
901
+ resource: { kind: 'sampler' as const, value: pipelineState.defaultSampler },
902
+ },
903
+ {
904
+ binding: 8,
905
+ resource: {
906
+ kind: 'textureView' as const,
907
+ value: pipelineState.defaultWhiteTextureView,
908
+ },
909
+ },
910
+ );
911
+ }
912
+ const spritePassMergedEntries = assembleMaterialWithSkylightEntries(
913
+ spritePassBaseMaterialEntries,
914
+ skylightResources,
915
+ spriteUsesDerivedMaterialLayout
916
+ ? undefined
917
+ : {
918
+ emissiveSampler: pipelineState.defaultSampler,
919
+ emissiveView: pipelineState.defaultWhiteTextureView,
920
+ occlusionSampler: pipelineState.defaultSampler,
921
+ occlusionView: pipelineState.defaultWhiteTextureView,
922
+ },
923
+ );
924
+
925
+ // Sprite-pass material BG cache: keyed on shader id (shared across all
926
+ // sprite entities) so entities using the same atlas texture share one
927
+ // BindGroup instead of creating one per entity (O5 fix — inner WeakMap
928
+ // chain naturally deduplicates by GPU resource object identity, so two
929
+ // entities with different atlases still get distinct BGs).
930
+ const spritePassBg: BindGroup = getOrCreatePerEntity(
931
+ frameState.materialBgShared,
932
+ spriteMaterialShaderId,
933
+ spritePassMergedEntries.map((e) => extractEntryResourceHandle(e)),
934
+ 'sprite-pass-material',
935
+ () => {
936
+ const result = runtime.device.createBindGroup({
937
+ label: 'sprite-pass-material-bg',
938
+ layout: spriteMaterialBgl,
939
+ entries: spritePassMergedEntries,
940
+ });
941
+ if (!result.ok) throw result.error;
942
+ return result.value;
943
+ },
944
+ bindGroupCounts,
945
+ );
946
+
947
+ const materialSlot = materialSlotIndices[i]?.[0] ?? 0;
948
+ spritePass.setBindGroup(1, spritePassBg, [materialSlot * MATERIAL_PER_ENTITY_STRIDE]);
949
+ spritePass.setBindGroup(3, spriteInstancesBg);
950
+ spritePass.drawIndexed(spriteEntry.mesh.indexCount, spriteInstanceCount, 0, 0, 0);
951
+ }
952
+ }
953
+
954
+ /**
955
+ * feat-20260704 M3/w19: resolve the interleaved SpriteInstances (@group(3))
956
+ * buffer + instanceCount for a sprite entity in the LDR blend sub-pass,
957
+ * extracted verbatim from recordSpriteEntityDraws. Uploads the interleaved
958
+ * mat4 + per-instance UV region transforms (cache-keyed on the snapshot); on
959
+ * over-cap fires the structured limit-exceeded error and leaves the passed-in
960
+ * fallback buffer/count. Returns the resolved (or unchanged) buffer + count.
961
+ *
962
+ * @internal
963
+ */
964
+ function resolveSpriteInstancesBuffer(
965
+ c: _InternalRenderPipelineContext,
966
+ spriteEntry: _InternalRenderPipelineContext['validatedOrdered'][number],
967
+ fallbackBuffer: Buffer,
968
+ fallbackCount: number,
969
+ ): { buffer: Buffer; count: number } {
970
+ const { runtime, frameState } = c;
971
+ let buffer = fallbackBuffer;
972
+ let count = fallbackCount;
973
+ const spriteInstancesSnap: SpriteInstancesSnapshot | undefined =
974
+ spriteEntry.source.spriteInstances;
975
+ if (spriteInstancesSnap !== undefined) {
976
+ const includePrevious = runtime.device.caps.storageBuffer;
977
+ const requestedBytes =
978
+ spriteInstancesSnap.transforms.byteLength * (includePrevious ? 2 : 1) +
979
+ spriteInstancesSnap.regions.byteLength;
980
+ const cap = runtime.device.limits.maxStorageBufferBindingSize;
981
+ if (typeof cap === 'number' && requestedBytes > cap) {
982
+ runtime.errorRegistry.fire(
983
+ new RhiError({
984
+ code: 'limit-exceeded',
985
+ expected: `requestedBytes (${requestedBytes}) <= maxStorageBufferBindingSize (${cap})`,
986
+ hint: 'reduce SpriteInstances instance count to fit within device.limits.maxStorageBufferBindingSize (80 bytes per instance: mat4 64B + region 16B)',
987
+ detail: {
988
+ maxStorageBufferBindingSize: cap,
989
+ requestedBytes,
990
+ },
991
+ }),
992
+ );
993
+ } else {
994
+ const cachedSpriteInst = frameState.instanceBuffers.get(
995
+ worldEntityKey(spriteEntry.source.worldId, spriteInstancesSnap.cacheKey),
996
+ );
997
+ let activeSpriteInst: InstanceBufferCacheEntry | null = null;
998
+ if (spriteInstancesCacheHit(cachedSpriteInst, spriteInstancesSnap, requestedBytes)) {
999
+ activeSpriteInst = cachedSpriteInst ?? null;
1000
+ } else if (requestedBytes > 0) {
1001
+ const bufRes = runtime.device.createBuffer({
1002
+ size: requestedBytes,
1003
+ usage: GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST,
1004
+ mappedAtCreation: false,
1005
+ });
1006
+ if (!bufRes.ok) {
1007
+ runtime.errorRegistry.fire(bufRes.error);
1008
+ } else {
1009
+ if (cachedSpriteInst !== undefined && !cachedSpriteInst.buffer.isDestroyed) {
1010
+ const r = cachedSpriteInst.buffer.destroy();
1011
+ if (!r.ok) runtime.errorRegistry.fire(r.error);
1012
+ }
1013
+ const newBuf = new GpuBuffer(runtime.device, bufRes.value);
1014
+ activeSpriteInst = {
1015
+ buffer: newBuf,
1016
+ uploadedArchVersion: spriteInstancesSnap.archVersion,
1017
+ uploadedByteLength: requestedBytes,
1018
+ };
1019
+ frameState.instanceBuffers.set(
1020
+ worldEntityKey(spriteEntry.source.worldId, spriteInstancesSnap.cacheKey),
1021
+ activeSpriteInst,
1022
+ );
1023
+ }
1024
+ }
1025
+ if (activeSpriteInst !== null && requestedBytes > 0) {
1026
+ const interleaved = interleaveSpriteInstanceBuffer(
1027
+ spriteInstancesSnap.transforms,
1028
+ spriteInstancesSnap.regions,
1029
+ undefined,
1030
+ includePrevious,
1031
+ );
1032
+ const writeRes = runtime.device.queue.writeBuffer(
1033
+ activeSpriteInst.buffer.handle,
1034
+ 0,
1035
+ interleaved,
1036
+ );
1037
+ if (!writeRes.ok) {
1038
+ runtime.errorRegistry.fire(writeRes.error);
1039
+ } else {
1040
+ buffer = activeSpriteInst.buffer.handle;
1041
+ count = spriteInstancesSnap.instanceCount;
1042
+ }
1043
+ }
1044
+ }
1045
+ }
1046
+ return { buffer, count };
1047
+ }
1048
+
1049
+ function transparentPassColorFormat(
1050
+ c: _InternalRenderPipelineContext,
1051
+ pipelineState: _InternalRenderPipelineContext['pipelineState'] = c.pipelineState,
1052
+ ): string {
1053
+ if (c.transparentColorFormat !== undefined) return c.transparentColorFormat;
1054
+ if (!c.runtime.device.caps.storageBuffer) return pipelineState.colorAttachmentFormat;
1055
+ return pipelineState.format;
1056
+ }