@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,1014 @@
1
+ // @forgeax/engine-runtime - RenderSystem record stage: main-pass geometry draws.
2
+ // feat-20260704 M5/w31: further-split from main-pass.ts (AC-05 <=1500 lines/file).
3
+ // recordGeometryDraws + resolveGeometryInstanceBuffer, 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 { PassKind, PrimitiveTopology } 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
+ type InstanceBufferCacheEntry,
21
+ packTemporalInstanceTransforms,
22
+ } from '../instance-buffer-cache';
23
+ import { SPRITE_PREMULTIPLIED_ALPHA_BLEND } from '../materials';
24
+ import { SKIN_MATERIAL_SHADER_ID } from '../pbr-pipeline';
25
+ import { variantSetFromVertexLayoutProjection } from '../pipeline';
26
+ import { renderStateHash } from '../pipeline-spec';
27
+ import type { _InternalRenderPipelineContext } from '../render-pipeline-context';
28
+ import { MATERIAL_PER_ENTITY_STRIDE } from '../render-system';
29
+ import type { MaterialSnapshot } from '../render-system-extract';
30
+ import type { RenderRecordPhase } from '../renderer';
31
+ import { routeMaterialReadiness } from '../renderer/material/pipeline-projection';
32
+ import { rasterItemKey, worldEntityKey } from './frame-snapshot';
33
+ import { isEntityFullyTransparent, selectGeometryPipeline } from './main-pass-material';
34
+ import { interleaveSpriteInstanceBuffer } from './main-pass-sprite';
35
+ import {
36
+ getOrCreateFromChain,
37
+ INSTANCE_UBO_FULL_ARRAY_BYTES,
38
+ MAX_UNIFORM_INSTANCES,
39
+ MESH_PER_ENTITY_STRIDE,
40
+ MESH_SSBO_BYTES,
41
+ MESH_UBO_FULL_ARRAY_BYTES,
42
+ } from './mesh-ssbo';
43
+
44
+ type GeometryInstanceDraw = {
45
+ readonly instanceBuffer: Buffer;
46
+ readonly instanceBindGroup: BindGroup;
47
+ readonly instanceCount: number;
48
+ };
49
+
50
+ type GeometryBindingState = {
51
+ pipeline: RenderPipeline | null;
52
+ instancesBuffer: Buffer | null;
53
+ };
54
+
55
+ type MaterialPipelineLookup = {
56
+ readonly materialShaderId: string;
57
+ readonly tonemapActive: boolean;
58
+ readonly renderStateKey: string;
59
+ readonly topology: PrimitiveTopology;
60
+ readonly indexFormat: 'uint16' | 'uint32';
61
+ readonly variantSet: string | undefined;
62
+ readonly passKind: PassKind;
63
+ readonly layoutProjection: import('@forgeax/engine-geometry').VertexLayoutProjection;
64
+ readonly sampleCount: number;
65
+ readonly colorFormatOverride: GPUTextureFormat | undefined;
66
+ readonly handle: RenderPipeline | null;
67
+ };
68
+
69
+ type GeometryRecordProfileSegment = 'material-bind-groups' | 'pipeline-selection' | 'draw-submit';
70
+
71
+ function geometryRecordPhase(
72
+ passKind: PassKind,
73
+ segment: GeometryRecordProfileSegment,
74
+ ): RenderRecordPhase {
75
+ const pass =
76
+ passKind === 'deferred' ? 'g-buffer' : passKind === 'temporal' ? 'scene-temporal' : 'forward';
77
+ return `record/graph-execute/${pass}/${segment}` as RenderRecordPhase;
78
+ }
79
+
80
+ function profileGeometrySegment<T>(
81
+ c: _InternalRenderPipelineContext,
82
+ passKind: PassKind,
83
+ segment: GeometryRecordProfileSegment,
84
+ action: () => T,
85
+ ): T {
86
+ const profilePhase = c.profilePhase;
87
+ return profilePhase === undefined
88
+ ? action()
89
+ : profilePhase(geometryRecordPhase(passKind, segment), action);
90
+ }
91
+
92
+ function submitSubmeshDraws(
93
+ pass: RhiRenderPassEncoder,
94
+ state: GeometryBindingState,
95
+ pipeline: RenderPipeline,
96
+ instanceDraws: readonly GeometryInstanceDraw[],
97
+ indexed: boolean,
98
+ indexCount: number,
99
+ vertexCount: number,
100
+ indexOffset: number,
101
+ ): void {
102
+ if (state.pipeline !== pipeline) {
103
+ pass.setPipeline(pipeline);
104
+ state.pipeline = pipeline;
105
+ }
106
+ for (const instanceDraw of instanceDraws) {
107
+ if (instanceDraw.instanceBuffer !== state.instancesBuffer) {
108
+ pass.setBindGroup(3, instanceDraw.instanceBindGroup);
109
+ state.instancesBuffer = instanceDraw.instanceBuffer;
110
+ }
111
+ if (indexed) {
112
+ pass.drawIndexed(indexCount, instanceDraw.instanceCount, indexOffset, 0, 0);
113
+ } else {
114
+ pass.draw(vertexCount, instanceDraw.instanceCount, 0, 0);
115
+ }
116
+ }
117
+ }
118
+
119
+ /**
120
+ * feat-20260704 M3/w19: per-entity geometry (main colour) draw loop, extracted
121
+ * verbatim from recordMainPass. Walks `c.validatedOrdered`, selects the
122
+ * per-entity / per-submesh PBR / unlit / skin pipeline, uploads the per-submesh
123
+ * material UBO slices, binds view / material / mesh / instances bind groups, and
124
+ * issues the per-submesh draws into the already-begun geometry `pass`. Fully-
125
+ * transparent entities are skipped here (drawn in the LDR blend sub-pass);
126
+ * mixed meshes draw their opaque submeshes here and skip transparent submeshes.
127
+ * The pass-selector match set, per-entity material-slot start table, MSAA sample
128
+ * count, group(2) bind group, and the shared per-submesh material BG builder are
129
+ * threaded in explicitly.
130
+ *
131
+ * @internal
132
+ */
133
+ export function recordGeometryDraws(
134
+ c: _InternalRenderPipelineContext,
135
+ pass: RhiRenderPassEncoder,
136
+ matchedIndices: Set<number> | null,
137
+ materialSlotIndices: readonly (readonly number[])[],
138
+ sampleCount: number,
139
+ meshGroup2: BindGroup | null,
140
+ resolveMaterialBindGroup: (
141
+ materialSlot: number,
142
+ submeshMaterial: MaterialSnapshot,
143
+ entityKey: number,
144
+ ) => BindGroup,
145
+ passKind: PassKind = 'forward',
146
+ ): void {
147
+ const {
148
+ runtime,
149
+ pipelineState,
150
+ frameState,
151
+ bindGroupCounts,
152
+ dispatchCounts,
153
+ tonemapActive,
154
+ msaaActive,
155
+ validatedOrdered,
156
+ splitLdrSprite,
157
+ } = c;
158
+ const colorFormatOverride = c.transparentColorFormat as GPUTextureFormat | undefined;
159
+ let lastVertexBuffer: GpuBuffer | null = null;
160
+ let lastIndexBuffer: GpuBuffer | null = null;
161
+ const bindingState: GeometryBindingState = {
162
+ pipeline: null,
163
+ instancesBuffer: null,
164
+ };
165
+ const identityInstanceBuffer = pipelineState.identityInstanceBuffer;
166
+ const identityInstanceDraws: readonly GeometryInstanceDraw[] = [
167
+ {
168
+ instanceBuffer: identityInstanceBuffer,
169
+ instanceBindGroup: resolveGeometryInstancesBindGroup(c, identityInstanceBuffer),
170
+ instanceCount: 1,
171
+ },
172
+ ];
173
+ const profilePhase = c.profilePhase;
174
+ const materialGroup1DynamicOffsets = new Uint32Array(1);
175
+ const meshGroup2DynamicOffsets = [0];
176
+ const skinGroup2DynamicOffsets = [0, 0, 0];
177
+ let lastStencilReference: number | null = null;
178
+ // feat-20260625-refactor-sprite-as-transparent-mesh M3 / w14 (D-7):
179
+ // sprite PSO selection no longer maintains a dedicated tag — the
180
+ // generic materialShaderId path covers sprite via the same per-
181
+ // MaterialShader pipeline cache PBR / unlit use. The 4-placeholder
182
+ // BG bindings (D-1 candidate b) still apply via the generic per-
183
+ // submesh BG construction below; sprite's `forgeax::sprite` shader
184
+ // module ships through the same cache key formula.
185
+ // Pipeline identity does not include material parameters or the material
186
+ // asset handle. Keying this cache by material handle therefore misses for
187
+ // every distinct asset even when all assets use the same PSO. The nested
188
+ // table keeps lookup O(1) by shader and immutable render-state identity; the
189
+ // renderer's authoritative cache still owns lifetime/invalidation, while
190
+ // this frame-local table removes the hot call/lookup overhead.
191
+ const materialPipelineLookupCache = new Map<string, Map<string, MaterialPipelineLookup[]>>();
192
+ const resolveMaterialPipeline = (
193
+ materialShaderId: string,
194
+ renderState: MaterialSnapshot['renderState'],
195
+ topology: PrimitiveTopology,
196
+ indexFormat: 'uint16' | 'uint32',
197
+ variantSet: string | undefined,
198
+ colorFormat: GPUTextureFormat | undefined,
199
+ layoutProjection: import('@forgeax/engine-geometry').VertexLayoutProjection,
200
+ materialGuid?: string,
201
+ ): RenderPipeline | null => {
202
+ const renderStateKey = renderStateHash(renderState);
203
+ const shaderLookupCache = materialPipelineLookupCache.get(materialShaderId);
204
+ const cachedLookups = shaderLookupCache?.get(renderStateKey);
205
+ if (cachedLookups !== undefined) {
206
+ for (const cached of cachedLookups) {
207
+ if (
208
+ cached.tonemapActive === tonemapActive &&
209
+ cached.renderStateKey === renderStateKey &&
210
+ cached.topology === topology &&
211
+ cached.indexFormat === indexFormat &&
212
+ cached.variantSet === variantSet &&
213
+ cached.passKind === passKind &&
214
+ cached.layoutProjection.digest === layoutProjection.digest &&
215
+ cached.sampleCount === sampleCount &&
216
+ cached.colorFormatOverride === colorFormat
217
+ ) {
218
+ return cached.handle;
219
+ }
220
+ }
221
+ }
222
+ const resolvedVariantSetResult = variantSetFromVertexLayoutProjection(
223
+ layoutProjection,
224
+ variantSet,
225
+ );
226
+ if (!resolvedVariantSetResult.ok) {
227
+ runtime.errorRegistry.fire(resolvedVariantSetResult.error);
228
+ return null;
229
+ }
230
+ const resolvedVariantSet = resolvedVariantSetResult.value;
231
+ const resolvePipeline = () =>
232
+ runtime.getMaterialShaderPipeline?.(
233
+ materialShaderId,
234
+ tonemapActive,
235
+ renderState,
236
+ topology,
237
+ indexFormat,
238
+ resolvedVariantSet,
239
+ passKind,
240
+ undefined,
241
+ sampleCount,
242
+ colorFormat,
243
+ undefined,
244
+ undefined,
245
+ undefined,
246
+ materialGuid,
247
+ undefined,
248
+ layoutProjection,
249
+ ) ?? null;
250
+ const handle =
251
+ profilePhase === undefined
252
+ ? resolvePipeline()
253
+ : profileGeometrySegment(c, passKind, 'pipeline-selection', resolvePipeline);
254
+ const nextLookup: MaterialPipelineLookup = {
255
+ materialShaderId,
256
+ tonemapActive,
257
+ renderStateKey,
258
+ topology,
259
+ indexFormat,
260
+ variantSet: resolvedVariantSet,
261
+ passKind,
262
+ layoutProjection,
263
+ sampleCount,
264
+ colorFormatOverride: colorFormat,
265
+ handle,
266
+ };
267
+ if (shaderLookupCache === undefined) {
268
+ materialPipelineLookupCache.set(materialShaderId, new Map([[renderStateKey, [nextLookup]]]));
269
+ } else if (cachedLookups === undefined) {
270
+ shaderLookupCache.set(renderStateKey, [nextLookup]);
271
+ } else {
272
+ cachedLookups.push(nextLookup);
273
+ }
274
+ return handle;
275
+ };
276
+
277
+ for (let i = 0; i < validatedOrdered.length; i++) {
278
+ const entry = validatedOrdered[i];
279
+ if (entry === undefined) continue;
280
+
281
+ // feat-20260609 M2: skip entities that don't match the pass selector.
282
+ if (matchedIndices !== null && !matchedIndices.has(entry.renderableIndex)) continue;
283
+
284
+ // D-2 generalised feat-20260625 M2 / w7: transparent entities are
285
+ // dispatched in the separate sub-pass (bgra8unorm unorm view,
286
+ // loadOp=load) so they must NOT be drawn here in the geometry pass
287
+ // (bgra8unorm-srgb sRGB view, loadOp=clear). In the HDR path
288
+ // (tonemapActive=true) or when there are no transparent entries,
289
+ // splitLdrSprite=false and this guard is a no-op. Post-w13 the
290
+ // legacy shadingModel arm is gone; transparent is the single SSOT
291
+ // mirrored on `computeSplitLdrSprite`.
292
+ //
293
+ // feat-city-glb Bug 5 (per-submesh transparency): only skip the WHOLE
294
+ // entity here when EVERY submesh is transparent (the sprite / fully-
295
+ // transparent-mesh fast path, byte-identical to the pre-fix behavior for
296
+ // single-material entities). A mixed mesh (opaque road submesh + BLEND
297
+ // decal submesh) is NOT skipped at the entity level; its opaque submeshes
298
+ // draw here and the per-submesh loop below skips the transparent ones
299
+ // (they are drawn in the blend sub-pass instead).
300
+ if (passKind === 'forward' && splitLdrSprite && isEntityFullyTransparent(entry.source))
301
+ continue;
302
+
303
+ const pipelineTag: 'unlit' = 'unlit';
304
+
305
+ // w10: setStencilReference per draw when the dispatch entry carries
306
+ // a stencil reference value (plan-strategy D-3: draw-call dynamic
307
+ // state after setPipeline). Defaults to 0 when no reference is set
308
+ // (WebGPU stencil reference default, semantically a no-op).
309
+ const stencilReference = entry.stencilReference ?? 0;
310
+ if (stencilReference !== lastStencilReference) {
311
+ pass.setStencilReference(stencilReference);
312
+ lastStencilReference = stencilReference;
313
+ }
314
+
315
+ if (entry.mesh.vertexBuffer !== lastVertexBuffer) {
316
+ pass.setVertexBuffer(0, entry.mesh.vertexBuffer.handle);
317
+ lastVertexBuffer = entry.mesh.vertexBuffer;
318
+ }
319
+ // feat-20260604 M4 / w11: vertex-only meshes (indexed === false) carry no
320
+ // index buffer; skip setIndexBuffer entirely and dispatch via pass.draw
321
+ // below. Indexed meshes keep the existing setIndexBuffer path unchanged.
322
+ if (entry.mesh.indexed && entry.mesh.indexBuffer !== lastIndexBuffer) {
323
+ if (entry.mesh.indexBuffer !== null) {
324
+ pass.setIndexBuffer(entry.mesh.indexBuffer.handle, entry.mesh.indexFormat);
325
+ lastIndexBuffer = entry.mesh.indexBuffer;
326
+ }
327
+ }
328
+
329
+ // Dispatch counter bump — sprite folds into the same 2-bucket
330
+ // surface for now (`pipelineDispatchCounts.{unlit, standard}`
331
+ // mirror the original 2-pipeline scope; sprite-bucket counters
332
+ // can land in a follow-up if AI users need them separately).
333
+ // sprite entries do not bump either counter — the bench (M-4)
334
+ // can read sprite render counts via the transparent bucket
335
+ // length instead.
336
+ if (pipelineTag === 'unlit') dispatchCounts.unlit += 1;
337
+
338
+ const instanceDraws = resolveGeometryInstanceBuffer(c, entry, identityInstanceDraws);
339
+ if (instanceDraws === null) continue;
340
+
341
+ // feat-20260611 R2 / M8 / w28 (IS-14): skin entries need a 3-binding
342
+ // group(2) BG matching `pbr-skin-pl` (binding 0 mesh-array UBO plus
343
+ // bindings 1/2 current/previous palette UBOs). Building this here -- not in the
344
+ // `meshBindGroup` factory above -- because the binding-shape
345
+ // (1-entry vs 3-entry) is per-entry, not per-frame. URP / HDRP
346
+ // entries keep using `meshGroup2` (1-entry mesh-array or HDRP
347
+ // unified). The skin-variant cache key includes both buffer
348
+ // identities so a future allocator-driven palette buffer rotation
349
+ // invalidates the BG without manual eviction.
350
+ //
351
+ // PSO-availability gate: only swap to the skin BG when (a) the
352
+ // skin pipeline layout itself was built (charter P3 fail-stop on
353
+ // BGL-build failure), AND (b) the skin PSO cache returns a non-null
354
+ // pipeline for this entry. Without (b), the per-submesh selector
355
+ // below falls back to URP `standardPipeline` (`pbr-pl` layout,
356
+ // 1-entry mesh-array BGL); binding the 2-entry skin BG against
357
+ // that pipeline reproduces the exact `pbr-mesh-array-bgl ... does
358
+ // not match layout pbr-skin-mesh-array-bgl` device error R1
359
+ // captured. Mirrors the uniform null skip-draw pattern (M6-T1).
360
+ let group2BindGroup: BindGroup = meshGroup2 as BindGroup;
361
+ // feat-20260612-skin-palette-per-frame-upload M3 / m3-2: dyn-offset
362
+ // tuple sourced from `_computeSkinGroup2DynOffsets`. Defaults to the
363
+ // length-1 non-skin shape; the skin branch below re-computes with the
364
+ // per-entity `entry.source.skin.byteOffset` cursor.
365
+ meshGroup2DynamicOffsets[0] = i * MESH_PER_ENTITY_STRIDE;
366
+ let group2DynamicOffsets: readonly number[] = meshGroup2DynamicOffsets;
367
+ const isSkinEntry = entry.source.skin !== undefined;
368
+ // feat-20260612-skin-palette-per-frame-upload M1 / m1-3 + M6: the
369
+ // record stage reads the GPU buffer reference through
370
+ // `entry.source.skin.buffer` (per-slice carrier set at extract time
371
+ // by allocateSlice). On the storage path every slice carries the
372
+ // same shared buffer pointer, so the BG cache key collapses to one
373
+ // entry per frame (miss=1 + hit=N-1). On the uniform fallback path
374
+ // each slice carries its own per-entity 16320 B UBO, so the BG
375
+ // cache key naturally splits per entity (one BG per buffer pointer)
376
+ // -- there is no shared-buffer assumption to break under
377
+ // 16 KiB UBO cap. Charter P3 explicit failure preserved: skin
378
+ // entries skip when the pipeline layout is missing OR the slice
379
+ // failed to allocate (no buffer field). dynOffset[1] = byteOffset
380
+ // is 0 on the uniform path (entry already covers the full buffer)
381
+ // and walks 0, 1536, 3072, ... on the storage path.
382
+ const skinAllocator = pipelineState.skinPaletteAllocator;
383
+ const skinSlice = entry.source.skin;
384
+ const skinResources =
385
+ isSkinEntry &&
386
+ pipelineState.pbrSkinMeshBindGroupLayout !== null &&
387
+ skinAllocator !== null &&
388
+ skinSlice !== undefined
389
+ ? {
390
+ meshArrayBgl: pipelineState.pbrSkinMeshBindGroupLayout,
391
+ paletteBuffer: skinSlice.buffer,
392
+ previousPaletteBuffer: skinSlice.previousBuffer ?? skinSlice.buffer,
393
+ paletteBindingWindowBytes: skinAllocator.bindingWindowBytes,
394
+ }
395
+ : null;
396
+ // Probe the skin PSO cache up front so we can decide whether to swap
397
+ // to the 3-binding skin BG. The same probe + selector is repeated in
398
+ // the per-submesh loop below (the loop's variantSet derivation is
399
+ // identical -- skin shader registers a single all-true variant so
400
+ // the canonical empty-key rule applies on HDRP and the URP key is
401
+ // the explicit expanded form, mirroring the standard PBR path).
402
+ const skinVariantSetResult = variantSetFromVertexLayoutProjection(
403
+ entry.mesh.layoutProjection,
404
+ frameState.isHdrpActive
405
+ ? ''
406
+ : 'CLUSTER_FORWARD_AVAILABLE=false+STORAGE_BUFFER_AVAILABLE=true',
407
+ );
408
+ if (!skinVariantSetResult.ok) runtime.errorRegistry.fire(skinVariantSetResult.error);
409
+ const skinVariantSet = skinVariantSetResult.ok ? skinVariantSetResult.value : undefined;
410
+ const skinPsoProbe =
411
+ skinResources !== null && skinVariantSetResult.ok
412
+ ? (runtime.getMaterialShaderPipeline?.(
413
+ SKIN_MATERIAL_SHADER_ID,
414
+ tonemapActive,
415
+ entry.source.material.renderState,
416
+ entry.mesh.submeshes[0]?.topology ?? 'triangle-list',
417
+ entry.mesh.indexFormat,
418
+ skinVariantSet,
419
+ passKind,
420
+ undefined, // meshAttributes — skin probe uses first submesh, derive from entry
421
+ sampleCount,
422
+ colorFormatOverride,
423
+ undefined,
424
+ undefined,
425
+ undefined,
426
+ undefined,
427
+ undefined,
428
+ entry.mesh.layoutProjection,
429
+ ) ?? null)
430
+ : null;
431
+ if (skinResources !== null && skinPsoProbe !== null) {
432
+ const meshBindSize = runtime.device.caps.storageBuffer
433
+ ? MESH_SSBO_BYTES
434
+ : MESH_UBO_FULL_ARRAY_BYTES;
435
+ // m3-2 / D-8: skin BG cache miss / hit instrumentation. The chain
436
+ // walk no longer exposes a string key to `.has()`, so we derive
437
+ // hit/miss from the w7 `bindGroupCounts.createBindGroup` accounting:
438
+ // snapshot the counter, run `getOrCreateFromChain`, and compare. A
439
+ // delta of 1 means the factory ran (miss); 0 means a chain hit. This
440
+ // publishes the per-frame counter the m3-1 acceptanceCheck reads
441
+ // (miss=1 + hit=N-1 across N skin entries sharing one allocator
442
+ // buffer + mesh SSBO). Field is optional + opt-in (read via
443
+ // structural cast so prod paths that omit the counter pay nothing).
444
+ const skinStats = (pipelineState as { _skinBgCacheStats?: { miss: number; hit: number } })
445
+ ._skinBgCacheStats;
446
+ const skinMissesBefore = bindGroupCounts.createBindGroup;
447
+ const skinBindGroup: BindGroup = getOrCreateFromChain(
448
+ frameState.meshBindGroupCache,
449
+ [
450
+ pipelineState.meshStorageBuffer.buffer,
451
+ skinResources.paletteBuffer,
452
+ skinResources.previousPaletteBuffer,
453
+ ],
454
+ 'pbr-skin-mesh',
455
+ () => {
456
+ const result = runtime.device.createBindGroup({
457
+ label: 'pbr-skin-mesh-bg',
458
+ layout: skinResources.meshArrayBgl,
459
+ entries: [
460
+ {
461
+ binding: 0,
462
+ resource: {
463
+ kind: 'buffer',
464
+ value: {
465
+ buffer: pipelineState.meshStorageBuffer.buffer,
466
+ offset: 0,
467
+ size: meshBindSize,
468
+ },
469
+ },
470
+ },
471
+ {
472
+ binding: 1,
473
+ resource: {
474
+ kind: 'buffer',
475
+ value: {
476
+ buffer: skinResources.paletteBuffer,
477
+ offset: 0,
478
+ // M6 SSOT: static BG entry size (= MAX_JOINTS * 64 =
479
+ // 16320 B) sourced from the allocator. The per-draw
480
+ // window slides via `group2DynamicOffsets[1]`
481
+ // (= entry.source.skin.byteOffset) so this size
482
+ // stays at the worst case across all skin entries
483
+ // -- one BG covers every skinned draw in the frame
484
+ // (m3-1b miss=1 + hit=N-1 contract). The allocator
485
+ // guarantees `buffer.size >= byteOffset + this size`
486
+ // so dynOffset[1] passes WebGPU validation.
487
+ size: skinResources.paletteBindingWindowBytes,
488
+ },
489
+ },
490
+ },
491
+ {
492
+ binding: 2,
493
+ resource: {
494
+ kind: 'buffer',
495
+ value: {
496
+ buffer: skinResources.previousPaletteBuffer,
497
+ offset: 0,
498
+ size: skinResources.paletteBindingWindowBytes,
499
+ },
500
+ },
501
+ },
502
+ ],
503
+ });
504
+ if (!result.ok) throw result.error;
505
+ return result.value;
506
+ },
507
+ bindGroupCounts,
508
+ );
509
+ if (skinStats !== undefined) {
510
+ if (bindGroupCounts.createBindGroup > skinMissesBefore) skinStats.miss += 1;
511
+ else skinStats.hit += 1;
512
+ }
513
+ group2BindGroup = skinBindGroup;
514
+ // m3-2: dyn-offset tuple via `_computeSkinGroup2DynOffsets` with the
515
+ // per-entity palette cursor M2 m2-6 wrote at the extract stage.
516
+ // Replaces the prior PR #353 hard-coded `0` second slot -- every
517
+ // skin entry now points the palette window at its own slice while
518
+ // sharing the worst-case BG entry size above.
519
+ skinGroup2DynamicOffsets[0] = i * MESH_PER_ENTITY_STRIDE;
520
+ skinGroup2DynamicOffsets[1] = entry.source.skin?.byteOffset ?? 0;
521
+ skinGroup2DynamicOffsets[2] = entry.source.skin?.byteOffset ?? 0;
522
+ group2DynamicOffsets = skinGroup2DynamicOffsets;
523
+ } else if (isSkinEntry) {
524
+ // Skin entry but skin PSO not ready (cache miss / async build pending,
525
+ // or skin pipeline layout failed at boot). Skip the draw rather than
526
+ // fall back to URP `pbr-pl` against the 6-attribute skin VBO -- that
527
+ // path produced the layer-3 / layer-4 device errors R1 captured. Once
528
+ // the async PSO compile resolves the cache hits and the next frame
529
+ // routes the skin BG + skin pipeline together. Mirrors the uniform
530
+ // null skip-draw shape (M6-T1, charter P3 explicit failure).
531
+ continue;
532
+ }
533
+ pass.setBindGroup(2, group2BindGroup, group2DynamicOffsets);
534
+
535
+ // feat-20260520-2d-sprite-layer-mvp M-3 / w25 (@fallback sprite
536
+ // bucket): sprite entries get a per-entity material BindGroup so
537
+ // each sprite carries its own texture binding at @group(1) @binding(2).
538
+ // Bindings 3..6 (metallicRoughness sampler/texture + normal
539
+ // sampler/texture) bind `pipelineState.defaultSampler` +
540
+ // `pipelineState.defaultWhiteTextureView` placeholders (D-1
541
+ // candidate b — zero new GPU resource; the 1x1 white view was
542
+ // already provisioned for unlit / standard fallback so the sprite
543
+ // path adds 4 binding references, no new resource code).
544
+ //
545
+ // Missing-texture fallback (AC-18 path 4 + R7 isolation): when the
546
+ // sprite texture has no GPU view, the binding uses
547
+ // `defaultWhiteTextureView` as the fallback texture and the
548
+ // material UBO upload above wrote debug-pink colorTint so the
549
+ // sprite is visually distinct. The warn-once + RhiError surface
550
+ // fires inside the upload loop. R7 isolation: this does NOT change
551
+ // the existing unlit / standard bucket missing-texture handling —
552
+ // those keep their silent-white fallback (a future
553
+ // `feat-future-pbr-missing-texture-fallback-explicit` will retrofit).
554
+ // bug-20260610 layer 7d: BG is per-submesh — each iteration of
555
+ // the submesh draw loop below builds (or cache-hits) a BG with
556
+ // matsForRebind[smIdx]'s 5 textureViews (baseColor / MR / normal /
557
+ // emissive / occlusion). Cache key is 14-handle-id only (entityKey
558
+ // dropped) so identical-material submeshes / entities dedup
559
+ // globally. Sprite path is unchanged (single spriteBg, sprite
560
+ // per-submesh OOS-1). The non-sprite branch leaves perSubmeshBg
561
+ // declared but null; the submesh loop reassigns it per iteration
562
+ // and the source-grep gate in skylight-fallback-path.test.ts /
563
+ // systems.unit.test.ts continues to match
564
+ // `setBindGroup\s*\(\s*1\s*,\s*perSubmeshBg\b` on the in-loop call.
565
+ // feat-20260625-refactor-sprite-as-transparent-mesh M3 / w13 (D-1
566
+ // candidate b): the sprite-specific BG construction is gone — sprite
567
+ // materials reuse the same per-submesh BG path PBR / unlit use. The
568
+ // 7-entry BGL is byte-for-byte shared (binding 0 = Material UBO,
569
+ // 1 = baseColorSampler, 2 = baseColorTexture, 3-6 = filler samplers /
570
+ // textureViews). Sprite's "no metallic/normal/emissive/occlusion
571
+ // texture" simply falls through to `defaultWhite` / `defaultNormal`
572
+ // — the same placeholders the unlit path already used. The generic
573
+ // branch below builds the per-submesh BG.
574
+ let perSubmeshBg: BindGroup | null = null;
575
+ // feat-20260608 M4 / w16: per-submesh pipeline selection + draw loop.
576
+ // Each submesh carries its own topology, so pipeline selection is per-submesh.
577
+ // Vertex/index buffers and bind groups are set once (shared across all submeshes).
578
+ // feat-20260608 M5 amend / w16-a: the material UBO bind (group=1)
579
+ // ALSO moves into the loop -- the j-th submesh sees the j-th
580
+ // material slot via dynamic offset (entitySlotStart + j) * 256.
581
+ const matsForRebind = entry.source.materials;
582
+ for (let smIdx = 0; smIdx < entry.mesh.submeshes.length; smIdx++) {
583
+ const sm = entry.mesh.submeshes[smIdx];
584
+ if (sm === undefined) continue;
585
+ const gpuDrivenDraw = entry.source.gpuDrivenDraws?.find(
586
+ (draw) => draw.submeshIndex === smIdx,
587
+ );
588
+ if (
589
+ passKind === 'forward' &&
590
+ gpuDrivenDraw !== undefined &&
591
+ c.gpuDrivenItemKeys.has(
592
+ rasterItemKey(
593
+ entry.source.worldId,
594
+ entry.source.entityKey,
595
+ gpuDrivenDraw.submeshIndex,
596
+ gpuDrivenDraw.passIndex,
597
+ ),
598
+ )
599
+ ) {
600
+ continue;
601
+ }
602
+ const matSlotIdx = sm.materialSlot;
603
+ const submeshMaterial = matsForRebind[matSlotIdx] ?? entry.source.material;
604
+ // feat-city-glb Bug 5 (per-submesh transparency): in the LDR split, a
605
+ // transparent submesh is drawn in the blend sub-pass (non-sRGB view),
606
+ // NOT here in the sRGB geometry pass. Skip it. Opaque submeshes of the
607
+ // same (mixed) mesh still draw here. Single-material / fully-opaque
608
+ // meshes are unaffected (their submesh materials are not transparent).
609
+ if (passKind === 'forward' && splitLdrSprite && submeshMaterial.transparent === true) {
610
+ continue;
611
+ }
612
+ // bug-20260610 layer 7d: per-submesh BG construction. Texture
613
+ // views resolve from `matsForRebind[smIdx]` so the j-th submesh
614
+ // sees its own materials[j] textures (baseColor / MR / normal /
615
+ // emissive / occlusion). Pick slot j when materials.length covers
616
+ // smIdx; otherwise fall back to slot 0 (count-mismatch already
617
+ // filtered by extract; this guard handles the materials.length=1
618
+ // single-material path mapped over multi-submesh meshes safely).
619
+ // This BG drops entityKey: identical-texture-set submeshes
620
+ // (whether on the same entity or different ones) share one BG via
621
+ // the shaderId-outer `materialBgShared` cache. The 14 handle
622
+ // objects form the WeakMap chain and fully discriminate the
623
+ // binding state since sampler/textureView/buffer handle identities
624
+ // are stable across frames.
625
+ //
626
+ // feat-20260625-refactor-sprite-as-transparent-mesh M3 / w13:
627
+ // sprite materials now use the same per-submesh BG construction
628
+ // (the sprite-specific BG branch above is deleted; sprite per-
629
+ // submesh single-slot is still enforced via materialSlotIndices
630
+ // and the sprite-shaped paramSnapshot fills the PBR-shaped BGL
631
+ // bindings via fallback textures for the 4 unused slots).
632
+ // feat-city-glb Bug 5: per-submesh material BG assembly extracted to
633
+ // the shared `buildPerSubmeshMaterialBg` closure (also called by the
634
+ // LDR blend sub-pass). Resolves the shader's user-region textures
635
+ // (baseColor/MR/normal + any custom Nth texture), emissive/occlusion
636
+ // injection, and Skylight merge; deduped cross-entity via the
637
+ // shaderId-outer `materialBgShared` cache.
638
+ const materialSlot = materialSlotIndices[i]?.[matSlotIdx] ?? materialSlotIndices[i]?.[0] ?? 0;
639
+ perSubmeshBg =
640
+ profilePhase === undefined
641
+ ? resolveMaterialBindGroup(materialSlot, submeshMaterial, entry.source.entityKey)
642
+ : profileGeometrySegment(c, passKind, 'material-bind-groups', () =>
643
+ resolveMaterialBindGroup(materialSlot, submeshMaterial, entry.source.entityKey),
644
+ );
645
+ materialGroup1DynamicOffsets[0] = materialSlot * MATERIAL_PER_ENTITY_STRIDE;
646
+ pass.setBindGroup(1, perSubmeshBg, materialGroup1DynamicOffsets, 0, 1);
647
+ const smTopology = sm.topology;
648
+ const smMaterialShaderId =
649
+ entry.source.skin !== undefined
650
+ ? SKIN_MATERIAL_SHADER_ID
651
+ : submeshMaterial.materialShaderId;
652
+ let materialReadyGuid: string | undefined;
653
+ if (
654
+ submeshMaterial.materialGuid !== undefined &&
655
+ runtime.getMaterialReadiness !== undefined
656
+ ) {
657
+ const readiness = runtime.getMaterialReadiness(submeshMaterial.materialGuid);
658
+ if (readiness !== undefined) {
659
+ const readinessRoute = routeMaterialReadiness({
660
+ readiness,
661
+ reportedDiagnosticKeys: frameState.reportedMaterialDiagnosticKeys,
662
+ });
663
+ if (readinessRoute.kind === 'skip') {
664
+ if (readinessRoute.diagnostic !== undefined) {
665
+ runtime.errorRegistry.fire(
666
+ new RhiError({
667
+ code: 'webgpu-runtime-error',
668
+ expected: readinessRoute.diagnostic.expected,
669
+ hint: `${readinessRoute.diagnostic.hint} [materialGuid=${readinessRoute.diagnostic.materialGuid}; specializationKey=${readinessRoute.diagnostic.specializationKey}]`,
670
+ }),
671
+ );
672
+ }
673
+ continue;
674
+ }
675
+ materialReadyGuid = readinessRoute.readiness.materialGuid;
676
+ }
677
+ }
678
+ const isSpriteShader =
679
+ smMaterialShaderId === 'forgeax::sprite' || smMaterialShaderId === 'forgeax::sprite-lit';
680
+ // Preserve the dedicated sprite-pass state when the linear-LDR graph
681
+ // routes a sprite through this generic geometry path. Negative scale
682
+ // flips winding, so back-face culling would erase the quad.
683
+ const temporalRenderState = (() => {
684
+ if (passKind !== 'temporal') return undefined;
685
+ const { blend: _blend, ...base } = submeshMaterial.renderState ?? {};
686
+ return {
687
+ ...base,
688
+ depthWriteEnabled: false,
689
+ depthCompare: 'less-equal' as const,
690
+ ...(isSpriteShader ? { cullMode: 'none' as const } : {}),
691
+ };
692
+ })();
693
+ const pipelineRenderState =
694
+ temporalRenderState ??
695
+ (isSpriteShader
696
+ ? {
697
+ ...submeshMaterial.renderState,
698
+ depthWriteEnabled: false,
699
+ depthCompare: 'less-equal' as const,
700
+ cullMode: 'none' as const,
701
+ blend: submeshMaterial.renderState?.blend ?? SPRITE_PREMULTIPLIED_ALPHA_BLEND,
702
+ }
703
+ : submeshMaterial.renderState);
704
+ let smPipelineHandle: typeof pipelineState.unlitPipeline;
705
+ if (smMaterialShaderId === undefined || smMaterialShaderId === 'forgeax::default-unlit') {
706
+ const unlitShaderId = smMaterialShaderId ?? 'forgeax::default-unlit';
707
+ const unlitProjectionVariantResult = variantSetFromVertexLayoutProjection(
708
+ entry.mesh.layoutProjection,
709
+ undefined,
710
+ );
711
+ if (!unlitProjectionVariantResult.ok) {
712
+ runtime.errorRegistry.fire(unlitProjectionVariantResult.error);
713
+ continue;
714
+ }
715
+ const unlitHasColor = unlitProjectionVariantResult.value === 'VERTEX_COLOR_AVAILABLE=true';
716
+ const unlitVariantSet = unlitHasColor
717
+ ? ''
718
+ : 'STORAGE_BUFFER_AVAILABLE=true+VERTEX_COLOR_AVAILABLE=false';
719
+ const unlitRsp = resolveMaterialPipeline(
720
+ unlitShaderId,
721
+ pipelineRenderState,
722
+ smTopology,
723
+ entry.mesh.indexFormat,
724
+ unlitVariantSet,
725
+ colorFormatOverride,
726
+ entry.mesh.layoutProjection,
727
+ materialReadyGuid,
728
+ );
729
+ smPipelineHandle =
730
+ unlitRsp ??
731
+ (colorFormatOverride === undefined
732
+ ? selectGeometryPipeline(pipelineState, tonemapActive, msaaActive)
733
+ : null);
734
+ } else if (smMaterialShaderId !== undefined) {
735
+ // feat-20260609 M4.5 / w38 (D-11): the variantSet handed to
736
+ // getMaterialShaderPipeline MUST mirror the boot-time
737
+ // `definesKey` rule at createRenderer.ts:2483-2485 (sortedEntries
738
+ // .every(v=>v===true) ? '' : 'A=v+...'). manifest variant.definesKey
739
+ // is `''` for the all-true variant, so HDRP (both axes true) must
740
+ // pass the canonical empty key to hit that variant via
741
+ // findVariantByKey. Passing the expanded form would produce a
742
+ // miss and silently fall back to the registered default WGSL,
743
+ // creating a layout/binding mismatch under HDRP.
744
+ //
745
+ // URP path passes the explicit expanded form because the URP
746
+ // variant's manifest definesKey IS that exact non-empty string
747
+ // (CLUSTER_FORWARD_AVAILABLE=false+STORAGE_BUFFER_AVAILABLE=true)
748
+ // -- the canonical-empty rule only applies to the all-true case.
749
+ const capabilityVariantSet = frameState.isHdrpActive
750
+ ? ''
751
+ : 'CLUSTER_FORWARD_AVAILABLE=false+STORAGE_BUFFER_AVAILABLE=true';
752
+ const authoredVariantSet =
753
+ isSpriteShader && entry.source.spriteInstances !== undefined ? '' : entry.variantSet;
754
+ const variantSet =
755
+ authoredVariantSet === undefined
756
+ ? capabilityVariantSet
757
+ : capabilityVariantSet === ''
758
+ ? authoredVariantSet
759
+ : `${capabilityVariantSet}+${authoredVariantSet}`;
760
+ const projectionVariantSetResult = variantSetFromVertexLayoutProjection(
761
+ entry.mesh.layoutProjection,
762
+ variantSet,
763
+ );
764
+ if (!projectionVariantSetResult.ok) {
765
+ runtime.errorRegistry.fire(projectionVariantSetResult.error);
766
+ continue;
767
+ }
768
+ const projectionVariantSet = projectionVariantSetResult.value;
769
+ const cachedPipeline = resolveMaterialPipeline(
770
+ smMaterialShaderId,
771
+ pipelineRenderState,
772
+ smTopology,
773
+ entry.mesh.indexFormat,
774
+ projectionVariantSet,
775
+ colorFormatOverride,
776
+ entry.mesh.layoutProjection,
777
+ materialReadyGuid,
778
+ );
779
+ // feat-20260615-pipeline-spec-ssot M6-T1: cache miss resolves to
780
+ // null uniformly across URP / HDRP / skin shaders. Charter P3
781
+ // explicit failure: the pre-M6 URP-path silent fallback to the
782
+ // boot-time `pipelineState.standardPipeline*` (M4.5-followup w43)
783
+ // masked real PipelineSpecError build failures behind a
784
+ // layout-compatible-but-wrong PSO. The per-submesh
785
+ // `if (smPipelineHandle === null) continue` skip-draw (which
786
+ // already covered HDRP-active and skin miss paths) is now the
787
+ // single uniform recovery shape -- one frame of skip-draw on
788
+ // first-touch, then the cached PSO flows in once the async
789
+ // build resolves. The pre-loop skin-PSO probe still skips the
790
+ // entire entry on first-submesh probe miss; this site only
791
+ // fires on per-submesh topology variance miss.
792
+ smPipelineHandle = cachedPipeline ?? null;
793
+ } else {
794
+ smPipelineHandle = selectGeometryPipeline(pipelineState, tonemapActive, msaaActive);
795
+ }
796
+
797
+ if (smPipelineHandle === null) {
798
+ continue;
799
+ }
800
+
801
+ if (profilePhase === undefined) {
802
+ submitSubmeshDraws(
803
+ pass,
804
+ bindingState,
805
+ smPipelineHandle,
806
+ instanceDraws,
807
+ entry.mesh.indexed,
808
+ sm.indexCount,
809
+ sm.vertexCount,
810
+ sm.indexOffset,
811
+ );
812
+ } else {
813
+ profileGeometrySegment(c, passKind, 'draw-submit', () =>
814
+ submitSubmeshDraws(
815
+ pass,
816
+ bindingState,
817
+ smPipelineHandle,
818
+ instanceDraws,
819
+ entry.mesh.indexed,
820
+ sm.indexCount,
821
+ sm.vertexCount,
822
+ sm.indexOffset,
823
+ ),
824
+ );
825
+ }
826
+ }
827
+ }
828
+ }
829
+
830
+ /**
831
+ * Resolve the per-entity @group(3) instance buffers for the geometry pass.
832
+ *
833
+ * @internal
834
+ */
835
+ function resolveGeometryInstanceBuffer(
836
+ c: _InternalRenderPipelineContext,
837
+ entry: _InternalRenderPipelineContext['validatedOrdered'][number],
838
+ identityInstanceDraws: readonly GeometryInstanceDraw[],
839
+ ): readonly GeometryInstanceDraw[] | null {
840
+ const { runtime, pipelineState, frameState } = c;
841
+ const inst = entry.source.instances ?? entry.source.spriteInstances;
842
+ if (inst === undefined) return identityInstanceDraws;
843
+ const spriteInstances = entry.source.spriteInstances;
844
+ let instanceBuffer: Buffer = pipelineState.identityInstanceBuffer;
845
+ let instanceCount = 1;
846
+ {
847
+ // feat-20260526-pbr-uniform-fallback-no-storage-buffer M3 / w13:
848
+ // caps.storageBuffer===false -> uniform fallback with 128-instance
849
+ // cap (128 * 64B = 8192B < WebGL2 min 16384B UBO limit).
850
+ // caps.storageBuffer===true -> existing storage buffer path unchanged.
851
+ const uniformFallback = runtime.device.caps.storageBuffer === false;
852
+ let instanceBufferUsage = GPU_BUFFER_USAGE_STORAGE | GPU_BUFFER_USAGE_COPY_DST;
853
+
854
+ if (uniformFallback && inst.instanceCount > MAX_UNIFORM_INSTANCES) {
855
+ const draws: GeometryInstanceDraw[] = [];
856
+ for (let start = 0; start < inst.instanceCount; start += MAX_UNIFORM_INSTANCES) {
857
+ const count = Math.min(MAX_UNIFORM_INSTANCES, inst.instanceCount - start);
858
+ const chunk = inst.transforms.subarray(start * 16, (start + count) * 16);
859
+ const bufRes = runtime.device.createBuffer({
860
+ size: INSTANCE_UBO_FULL_ARRAY_BYTES,
861
+ usage: GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST,
862
+ mappedAtCreation: false,
863
+ });
864
+ if (!bufRes.ok) {
865
+ runtime.errorRegistry.fire(bufRes.error);
866
+ return null;
867
+ }
868
+ const buffer = new GpuBuffer(runtime.device, bufRes.value);
869
+ frameState.transientInstanceBuffers.push({
870
+ buffer,
871
+ uploadedArchVersion: inst.archVersion,
872
+ uploadedByteLength: chunk.byteLength,
873
+ });
874
+ const writeRes = runtime.device.queue.writeBuffer(buffer.handle, 0, chunk);
875
+ if (!writeRes.ok) {
876
+ runtime.errorRegistry.fire(writeRes.error);
877
+ return null;
878
+ }
879
+ draws.push({
880
+ instanceBuffer: buffer.handle,
881
+ instanceBindGroup: resolveGeometryInstancesBindGroup(c, buffer.handle),
882
+ instanceCount: count,
883
+ });
884
+ }
885
+ return draws;
886
+ }
887
+ if (uniformFallback) {
888
+ instanceBufferUsage = GPU_BUFFER_USAGE_UNIFORM | GPU_BUFFER_USAGE_COPY_DST;
889
+ }
890
+
891
+ {
892
+ // Cap-gate (LimitExceededDetail single emit point — feat-20260514
893
+ // M3 / w15 anchor): `requestedBytes <= maxStorageBufferBindingSize`.
894
+ const upload =
895
+ spriteInstances === undefined
896
+ ? uniformFallback
897
+ ? inst.transforms
898
+ : packTemporalInstanceTransforms(
899
+ inst.transforms,
900
+ entry.source.temporal?.previousInstances?.transforms,
901
+ )
902
+ : interleaveSpriteInstanceBuffer(
903
+ spriteInstances.transforms,
904
+ spriteInstances.regions,
905
+ undefined,
906
+ !uniformFallback,
907
+ );
908
+ const requestedBytes = upload.byteLength;
909
+ const cap = runtime.device.limits.maxStorageBufferBindingSize;
910
+ if (!uniformFallback && typeof cap === 'number' && cap > 0 && requestedBytes > cap) {
911
+ runtime.errorRegistry.fire(
912
+ new RhiError({
913
+ code: 'limit-exceeded',
914
+ expected: `requestedBytes (${requestedBytes}) <= maxStorageBufferBindingSize (${cap})`,
915
+ hint: 'reduce instance count to fit within device.limits.maxStorageBufferBindingSize, or split transforms across multiple Instances entries',
916
+ detail: {
917
+ maxStorageBufferBindingSize: cap,
918
+ requestedBytes,
919
+ },
920
+ }),
921
+ );
922
+ return null;
923
+ } else {
924
+ // Look up the cached GPU buffer or create a fresh one when the
925
+ // archetype version bumped or the byte length changed.
926
+ const cached = frameState.instanceBuffers.get(
927
+ worldEntityKey(entry.source.worldId, inst.cacheKey),
928
+ );
929
+ let active: InstanceBufferCacheEntry | null = null;
930
+ if (
931
+ cached !== undefined &&
932
+ cached.uploadedArchVersion === inst.archVersion &&
933
+ cached.uploadedByteLength === requestedBytes
934
+ ) {
935
+ active = cached;
936
+ } else if (requestedBytes > 0) {
937
+ const bufRes = runtime.device.createBuffer({
938
+ size: uniformFallback ? INSTANCE_UBO_FULL_ARRAY_BYTES : requestedBytes,
939
+ usage: instanceBufferUsage,
940
+ mappedAtCreation: false,
941
+ });
942
+ if (!bufRes.ok) {
943
+ runtime.errorRegistry.fire(bufRes.error);
944
+ } else {
945
+ // feat-20260619 M4 / F12: destroy the old cached buffer
946
+ // before replacing it with the new one (D-6).
947
+ if (cached !== undefined && !cached.buffer.isDestroyed) {
948
+ const r = cached.buffer.destroy();
949
+ if (!r.ok) runtime.errorRegistry.fire(r.error);
950
+ }
951
+ const newBuffer = new GpuBuffer(runtime.device, bufRes.value);
952
+ active = {
953
+ buffer: newBuffer,
954
+ uploadedArchVersion: inst.archVersion,
955
+ uploadedByteLength: requestedBytes,
956
+ };
957
+ frameState.instanceBuffers.set(
958
+ worldEntityKey(entry.source.worldId, inst.cacheKey),
959
+ active,
960
+ );
961
+ }
962
+ }
963
+ if (active !== null) {
964
+ const writeRes = runtime.device.queue.writeBuffer(active.buffer.handle, 0, upload);
965
+ if (!writeRes.ok) {
966
+ runtime.errorRegistry.fire(writeRes.error);
967
+ } else {
968
+ instanceBuffer = active.buffer.handle;
969
+ instanceCount = Math.max(1, inst.instanceCount);
970
+ }
971
+ }
972
+ }
973
+ // The cache write above is keyed by worldEntityKey(worldId, cacheKey)
974
+ // so separate worlds cannot alias their instance buffers.
975
+ }
976
+ }
977
+ return [
978
+ {
979
+ instanceBuffer,
980
+ instanceBindGroup: resolveGeometryInstancesBindGroup(c, instanceBuffer),
981
+ instanceCount,
982
+ },
983
+ ];
984
+ }
985
+
986
+ function resolveGeometryInstancesBindGroup(
987
+ c: _InternalRenderPipelineContext,
988
+ instanceBuffer: Buffer,
989
+ ): BindGroup {
990
+ const { runtime, pipelineState, frameState, bindGroupCounts } = c;
991
+ return getOrCreateFromChain(
992
+ frameState.instancesBgShared,
993
+ [pipelineState.instancesBindGroupLayout, instanceBuffer],
994
+ 'instances',
995
+ () => {
996
+ const result = runtime.device.createBindGroup({
997
+ label: 'pbr-instances-bg',
998
+ layout: pipelineState.instancesBindGroupLayout,
999
+ entries: [
1000
+ {
1001
+ binding: 0,
1002
+ resource: {
1003
+ kind: 'buffer',
1004
+ value: { buffer: instanceBuffer },
1005
+ },
1006
+ },
1007
+ ],
1008
+ });
1009
+ if (!result.ok) throw result.error;
1010
+ return result.value;
1011
+ },
1012
+ bindGroupCounts,
1013
+ );
1014
+ }