@forgeax/engine-render 0.0.0-dev.8d955ade1c79

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 (891) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +647 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/__tests__/authoring-path.unit.test.d.ts +2 -0
  5. package/dist/__tests__/authoring-path.unit.test.d.ts.map +1 -0
  6. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts +2 -0
  7. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts.map +1 -0
  8. package/dist/__tests__/callback-inference.test-d.d.ts +2 -0
  9. package/dist/__tests__/callback-inference.test-d.d.ts.map +1 -0
  10. package/dist/__tests__/cluster-binner.test.d.ts +2 -0
  11. package/dist/__tests__/cluster-binner.test.d.ts.map +1 -0
  12. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts +2 -0
  13. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts.map +1 -0
  14. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts +2 -0
  15. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts.map +1 -0
  16. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +2 -0
  17. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +1 -0
  18. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +2 -0
  19. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +1 -0
  20. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts +2 -0
  21. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts.map +1 -0
  22. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts +2 -0
  23. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts.map +1 -0
  24. package/dist/__tests__/factory-contract.integration.test.d.ts +2 -0
  25. package/dist/__tests__/factory-contract.integration.test.d.ts.map +1 -0
  26. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts +2 -0
  27. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts.map +1 -0
  28. package/dist/__tests__/frame-observation.contract.test.d.ts +2 -0
  29. package/dist/__tests__/frame-observation.contract.test.d.ts.map +1 -0
  30. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +2 -0
  31. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +1 -0
  32. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts +2 -0
  33. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts.map +1 -0
  34. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts +6 -0
  35. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +1 -0
  36. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts +2 -0
  37. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts.map +1 -0
  38. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts +2 -0
  39. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts.map +1 -0
  40. package/dist/__tests__/gpu-driven-production.integration.test.d.ts +2 -0
  41. package/dist/__tests__/gpu-driven-production.integration.test.d.ts.map +1 -0
  42. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts +2 -0
  43. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts.map +1 -0
  44. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +18 -0
  45. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +1 -0
  46. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts +2 -0
  47. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts.map +1 -0
  48. package/dist/__tests__/gpu-driven-view-reference.d.ts +15 -0
  49. package/dist/__tests__/gpu-driven-view-reference.d.ts.map +1 -0
  50. package/dist/__tests__/gpu-driven-view.browser.test.d.ts +2 -0
  51. package/dist/__tests__/gpu-driven-view.browser.test.d.ts.map +1 -0
  52. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts +2 -0
  53. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts.map +1 -0
  54. package/dist/__tests__/gpu-driven-view.unit.test.d.ts +2 -0
  55. package/dist/__tests__/gpu-driven-view.unit.test.d.ts.map +1 -0
  56. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts +2 -0
  57. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts.map +1 -0
  58. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts +7 -0
  59. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +1 -0
  60. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts +2 -0
  61. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts.map +1 -0
  62. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts +2 -0
  63. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts.map +1 -0
  64. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts +2 -0
  65. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts.map +1 -0
  66. package/dist/__tests__/gpu-scene.dawn.test.d.ts +2 -0
  67. package/dist/__tests__/gpu-scene.dawn.test.d.ts.map +1 -0
  68. package/dist/__tests__/gpu-scene.unit.test.d.ts +2 -0
  69. package/dist/__tests__/gpu-scene.unit.test.d.ts.map +1 -0
  70. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +2 -0
  71. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +1 -0
  72. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts +2 -0
  73. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts.map +1 -0
  74. package/dist/__tests__/injection-kind-owner.test-d.d.ts +2 -0
  75. package/dist/__tests__/injection-kind-owner.test-d.d.ts.map +1 -0
  76. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts +2 -0
  77. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts.map +1 -0
  78. package/dist/__tests__/light-buffer-layout.unit.test.d.ts +2 -0
  79. package/dist/__tests__/light-buffer-layout.unit.test.d.ts.map +1 -0
  80. package/dist/__tests__/material-contract-inventory.unit.test.d.ts +2 -0
  81. package/dist/__tests__/material-contract-inventory.unit.test.d.ts.map +1 -0
  82. package/dist/__tests__/material-cooked-projection.unit.test.d.ts +2 -0
  83. package/dist/__tests__/material-cooked-projection.unit.test.d.ts.map +1 -0
  84. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts +2 -0
  85. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts.map +1 -0
  86. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts +2 -0
  87. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts.map +1 -0
  88. package/dist/__tests__/material-stride-surface.unit.test.d.ts +2 -0
  89. package/dist/__tests__/material-stride-surface.unit.test.d.ts.map +1 -0
  90. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts +2 -0
  91. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts.map +1 -0
  92. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts +2 -0
  93. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts.map +1 -0
  94. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts +2 -0
  95. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts.map +1 -0
  96. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts +2 -0
  97. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts.map +1 -0
  98. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts +2 -0
  99. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts.map +1 -0
  100. package/dist/__tests__/morph-feature-plan.unit.test.d.ts +2 -0
  101. package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +1 -0
  102. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts +2 -0
  103. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts.map +1 -0
  104. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts +2 -0
  105. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts.map +1 -0
  106. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts +2 -0
  107. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts.map +1 -0
  108. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts +2 -0
  109. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts.map +1 -0
  110. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts +2 -0
  111. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts.map +1 -0
  112. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts +2 -0
  113. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts.map +1 -0
  114. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts +2 -0
  115. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts.map +1 -0
  116. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts +2 -0
  117. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts.map +1 -0
  118. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts +2 -0
  119. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts.map +1 -0
  120. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts +2 -0
  121. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts.map +1 -0
  122. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts +2 -0
  123. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts.map +1 -0
  124. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts +2 -0
  125. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts.map +1 -0
  126. package/dist/__tests__/profiler-default-off.test.d.ts +2 -0
  127. package/dist/__tests__/profiler-default-off.test.d.ts.map +1 -0
  128. package/dist/__tests__/profiler-phase-catalog.test.d.ts +2 -0
  129. package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +1 -0
  130. package/dist/__tests__/profiler-phase-integration.test.d.ts +2 -0
  131. package/dist/__tests__/profiler-phase-integration.test.d.ts.map +1 -0
  132. package/dist/__tests__/profiler-phase-token.test.d.ts +2 -0
  133. package/dist/__tests__/profiler-phase-token.test.d.ts.map +1 -0
  134. package/dist/__tests__/public-surface.test-d.d.ts +2 -0
  135. package/dist/__tests__/public-surface.test-d.d.ts.map +1 -0
  136. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts +2 -0
  137. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts.map +1 -0
  138. package/dist/__tests__/render-error-code-owner.test-d.d.ts +2 -0
  139. package/dist/__tests__/render-error-code-owner.test-d.d.ts.map +1 -0
  140. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts +2 -0
  141. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts.map +1 -0
  142. package/dist/__tests__/render-error-exhaustive.test-d.d.ts +2 -0
  143. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +1 -0
  144. package/dist/__tests__/render-feature-assembly.test-d.d.ts +2 -0
  145. package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +1 -0
  146. package/dist/__tests__/render-feature-context.test-d.d.ts +2 -0
  147. package/dist/__tests__/render-feature-context.test-d.d.ts.map +1 -0
  148. package/dist/__tests__/render-feature-contract.test-d.d.ts +2 -0
  149. package/dist/__tests__/render-feature-contract.test-d.d.ts.map +1 -0
  150. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts +2 -0
  151. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts.map +1 -0
  152. package/dist/__tests__/render-feature-docs.unit.test.d.ts +2 -0
  153. package/dist/__tests__/render-feature-docs.unit.test.d.ts.map +1 -0
  154. package/dist/__tests__/render-feature-errors.unit.test.d.ts +2 -0
  155. package/dist/__tests__/render-feature-errors.unit.test.d.ts.map +1 -0
  156. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts +2 -0
  157. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts.map +1 -0
  158. package/dist/__tests__/render-feature-plan.test-d.d.ts +2 -0
  159. package/dist/__tests__/render-feature-plan.test-d.d.ts.map +1 -0
  160. package/dist/__tests__/render-feature-plan.unit.test.d.ts +2 -0
  161. package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +1 -0
  162. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts +2 -0
  163. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts.map +1 -0
  164. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts +2 -0
  165. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts.map +1 -0
  166. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +2 -0
  167. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +1 -0
  168. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts +2 -0
  169. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts.map +1 -0
  170. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts +2 -0
  171. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts.map +1 -0
  172. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts +2 -0
  173. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts.map +1 -0
  174. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts +2 -0
  175. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts.map +1 -0
  176. package/dist/__tests__/render-feature-public-surface.test-d.d.ts +2 -0
  177. package/dist/__tests__/render-feature-public-surface.test-d.d.ts.map +1 -0
  178. package/dist/__tests__/render-feature-retry.unit.test.d.ts +2 -0
  179. package/dist/__tests__/render-feature-retry.unit.test.d.ts.map +1 -0
  180. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts +2 -0
  181. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts.map +1 -0
  182. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts +2 -0
  183. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts.map +1 -0
  184. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts +2 -0
  185. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts.map +1 -0
  186. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts +2 -0
  187. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts.map +1 -0
  188. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts +2 -0
  189. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts.map +1 -0
  190. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts +2 -0
  191. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts.map +1 -0
  192. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts +7 -0
  193. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts.map +1 -0
  194. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts +2 -0
  195. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts.map +1 -0
  196. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts +2 -0
  197. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts.map +1 -0
  198. package/dist/__tests__/render-graph-hzb-gpu.d.ts +7 -0
  199. package/dist/__tests__/render-graph-hzb-gpu.d.ts.map +1 -0
  200. package/dist/__tests__/render-graph-hzb.browser.test.d.ts +2 -0
  201. package/dist/__tests__/render-graph-hzb.browser.test.d.ts.map +1 -0
  202. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts +2 -0
  203. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts.map +1 -0
  204. package/dist/__tests__/render-graph-primitives.unit.test.d.ts +2 -0
  205. package/dist/__tests__/render-graph-primitives.unit.test.d.ts.map +1 -0
  206. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts +12 -0
  207. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts.map +1 -0
  208. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts +2 -0
  209. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts.map +1 -0
  210. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts +2 -0
  211. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts.map +1 -0
  212. package/dist/__tests__/render-scene-projection.unit.test.d.ts +2 -0
  213. package/dist/__tests__/render-scene-projection.unit.test.d.ts.map +1 -0
  214. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts +2 -0
  215. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts.map +1 -0
  216. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +2 -0
  217. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +1 -0
  218. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts +2 -0
  219. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts.map +1 -0
  220. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts +2 -0
  221. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts.map +1 -0
  222. package/dist/__tests__/shader-stage-surface.unit.test.d.ts +2 -0
  223. package/dist/__tests__/shader-stage-surface.unit.test.d.ts.map +1 -0
  224. package/dist/__tests__/ssao-config.unit.test.d.ts +2 -0
  225. package/dist/__tests__/ssao-config.unit.test.d.ts.map +1 -0
  226. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts +2 -0
  227. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts.map +1 -0
  228. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +2 -0
  229. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +1 -0
  230. package/dist/__tests__/standard-descriptors.test-d.d.ts +2 -0
  231. package/dist/__tests__/standard-descriptors.test-d.d.ts.map +1 -0
  232. package/dist/__tests__/standard-pipeline.dawn.test.d.ts +2 -0
  233. package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +1 -0
  234. package/dist/__tests__/standard-pipeline.integration.test.d.ts +2 -0
  235. package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +1 -0
  236. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +2 -0
  237. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +1 -0
  238. package/dist/__tests__/surface-configuration.unit.test.d.ts +2 -0
  239. package/dist/__tests__/surface-configuration.unit.test.d.ts.map +1 -0
  240. package/dist/__tests__/texture-usage-surface.unit.test.d.ts +2 -0
  241. package/dist/__tests__/texture-usage-surface.unit.test.d.ts.map +1 -0
  242. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts +2 -0
  243. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts.map +1 -0
  244. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts +2 -0
  245. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts.map +1 -0
  246. package/dist/__tests__/urp-pipeline.unit.test.d.ts +2 -0
  247. package/dist/__tests__/urp-pipeline.unit.test.d.ts.map +1 -0
  248. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts +2 -0
  249. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts.map +1 -0
  250. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts +2 -0
  251. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts.map +1 -0
  252. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts +2 -0
  253. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts.map +1 -0
  254. package/dist/__tests__/visibility-extract.integration.test.d.ts +2 -0
  255. package/dist/__tests__/visibility-extract.integration.test.d.ts.map +1 -0
  256. package/dist/__tests__/visibility-extract.perf.test.d.ts +2 -0
  257. package/dist/__tests__/visibility-extract.perf.test.d.ts.map +1 -0
  258. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts +2 -0
  259. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts.map +1 -0
  260. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts +2 -0
  261. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts.map +1 -0
  262. package/dist/__tests__/visibility-instances.integration.test.d.ts +2 -0
  263. package/dist/__tests__/visibility-instances.integration.test.d.ts.map +1 -0
  264. package/dist/__tests__/visibility-multi-world.integration.test.d.ts +2 -0
  265. package/dist/__tests__/visibility-multi-world.integration.test.d.ts.map +1 -0
  266. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts +2 -0
  267. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts.map +1 -0
  268. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts +2 -0
  269. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts.map +1 -0
  270. package/dist/__tests__/visibility-public-surface.test-d.d.ts +2 -0
  271. package/dist/__tests__/visibility-public-surface.test-d.d.ts.map +1 -0
  272. package/dist/__tests__/visibility-resolver.unit.test.d.ts +2 -0
  273. package/dist/__tests__/visibility-resolver.unit.test.d.ts.map +1 -0
  274. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +2 -0
  275. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +1 -0
  276. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts +2 -0
  277. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts.map +1 -0
  278. package/dist/__tests__/vocabulary.unit.test.d.ts +2 -0
  279. package/dist/__tests__/vocabulary.unit.test.d.ts.map +1 -0
  280. package/dist/assembly/backend-contract.d.ts +37 -0
  281. package/dist/assembly/backend-contract.d.ts.map +1 -0
  282. package/dist/assembly/factory.d.ts +207 -0
  283. package/dist/assembly/factory.d.ts.map +1 -0
  284. package/dist/assembly/host-contract.d.ts +84 -0
  285. package/dist/assembly/host-contract.d.ts.map +1 -0
  286. package/dist/assembly/material/assembly.d.ts +21 -0
  287. package/dist/assembly/material/assembly.d.ts.map +1 -0
  288. package/dist/assembly/material/pipeline-projection.d.ts +30 -0
  289. package/dist/assembly/material/pipeline-projection.d.ts.map +1 -0
  290. package/dist/assets/asset-decoders.d.ts +5 -0
  291. package/dist/assets/asset-decoders.d.ts.map +1 -0
  292. package/dist/assets/render-asset-port.d.ts +17 -0
  293. package/dist/assets/render-asset-port.d.ts.map +1 -0
  294. package/dist/assets/resolve-render-asset.d.ts +6 -0
  295. package/dist/assets/resolve-render-asset.d.ts.map +1 -0
  296. package/dist/authoring.d.ts +12 -0
  297. package/dist/authoring.d.ts.map +1 -0
  298. package/dist/authoring.mjs +27 -0
  299. package/dist/authoring.mjs.map +1 -0
  300. package/dist/chunk-CQXZC5XI.mjs +182 -0
  301. package/dist/chunk-CQXZC5XI.mjs.map +1 -0
  302. package/dist/chunk-HCOGPHKS.mjs +93 -0
  303. package/dist/chunk-HCOGPHKS.mjs.map +1 -0
  304. package/dist/chunk-YEJIUW7D.mjs +1152 -0
  305. package/dist/chunk-YEJIUW7D.mjs.map +1 -0
  306. package/dist/cluster-binner.d.ts +152 -0
  307. package/dist/cluster-binner.d.ts.map +1 -0
  308. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts +2 -0
  309. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts.map +1 -0
  310. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts +2 -0
  311. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts.map +1 -0
  312. package/dist/components/__tests__/schema-contract.unit.test.d.ts +2 -0
  313. package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +1 -0
  314. package/dist/components/__tests__/schema-parity.unit.test.d.ts +2 -0
  315. package/dist/components/__tests__/schema-parity.unit.test.d.ts.map +1 -0
  316. package/dist/components/__tests__/visibility-schema.unit.test.d.ts +2 -0
  317. package/dist/components/__tests__/visibility-schema.unit.test.d.ts.map +1 -0
  318. package/dist/components/camera.d.ts +311 -0
  319. package/dist/components/camera.d.ts.map +1 -0
  320. package/dist/components/directional-light.d.ts +76 -0
  321. package/dist/components/directional-light.d.ts.map +1 -0
  322. package/dist/components/glyph-text.d.ts +26 -0
  323. package/dist/components/glyph-text.d.ts.map +1 -0
  324. package/dist/components/index.d.ts +24 -0
  325. package/dist/components/index.d.ts.map +1 -0
  326. package/dist/components/instances.d.ts +41 -0
  327. package/dist/components/instances.d.ts.map +1 -0
  328. package/dist/components/layer.d.ts +34 -0
  329. package/dist/components/layer.d.ts.map +1 -0
  330. package/dist/components/light-helpers.d.ts +53 -0
  331. package/dist/components/light-helpers.d.ts.map +1 -0
  332. package/dist/components/lines.d.ts +5 -0
  333. package/dist/components/lines.d.ts.map +1 -0
  334. package/dist/components/mesh-filter.d.ts +24 -0
  335. package/dist/components/mesh-filter.d.ts.map +1 -0
  336. package/dist/components/mesh-renderer.d.ts +33 -0
  337. package/dist/components/mesh-renderer.d.ts.map +1 -0
  338. package/dist/components/point-light-shadow.d.ts +27 -0
  339. package/dist/components/point-light-shadow.d.ts.map +1 -0
  340. package/dist/components/point-light.d.ts +35 -0
  341. package/dist/components/point-light.d.ts.map +1 -0
  342. package/dist/components/points.d.ts +15 -0
  343. package/dist/components/points.d.ts.map +1 -0
  344. package/dist/components/post-process-params.d.ts +5 -0
  345. package/dist/components/post-process-params.d.ts.map +1 -0
  346. package/dist/components/scene-instance.d.ts +140 -0
  347. package/dist/components/scene-instance.d.ts.map +1 -0
  348. package/dist/components/skybox-background.d.ts +56 -0
  349. package/dist/components/skybox-background.d.ts.map +1 -0
  350. package/dist/components/skylight.d.ts +55 -0
  351. package/dist/components/skylight.d.ts.map +1 -0
  352. package/dist/components/sort-key.d.ts +44 -0
  353. package/dist/components/sort-key.d.ts.map +1 -0
  354. package/dist/components/spot-light.d.ts +81 -0
  355. package/dist/components/spot-light.d.ts.map +1 -0
  356. package/dist/components/sprite-animation.d.ts +74 -0
  357. package/dist/components/sprite-animation.d.ts.map +1 -0
  358. package/dist/components/sprite-instances.d.ts +51 -0
  359. package/dist/components/sprite-instances.d.ts.map +1 -0
  360. package/dist/components/sprite-playback-mode.d.ts +42 -0
  361. package/dist/components/sprite-playback-mode.d.ts.map +1 -0
  362. package/dist/components/sprite-region-override.d.ts +46 -0
  363. package/dist/components/sprite-region-override.d.ts.map +1 -0
  364. package/dist/components/tile-layer.d.ts +106 -0
  365. package/dist/components/tile-layer.d.ts.map +1 -0
  366. package/dist/components/tilemap.d.ts +25 -0
  367. package/dist/components/tilemap.d.ts.map +1 -0
  368. package/dist/components/visibility.d.ts +22 -0
  369. package/dist/components/visibility.d.ts.map +1 -0
  370. package/dist/construct-renderer.d.ts +19 -0
  371. package/dist/construct-renderer.d.ts.map +1 -0
  372. package/dist/construct-renderer.mjs +27462 -0
  373. package/dist/construct-renderer.mjs.map +1 -0
  374. package/dist/debug-draw-glue.d.ts +5 -0
  375. package/dist/debug-draw-glue.d.ts.map +1 -0
  376. package/dist/device/device-scope.d.ts +83 -0
  377. package/dist/device/device-scope.d.ts.map +1 -0
  378. package/dist/device/gpu-residency.d.ts +337 -0
  379. package/dist/device/gpu-residency.d.ts.map +1 -0
  380. package/dist/device/resource-types.d.ts +8 -0
  381. package/dist/device/resource-types.d.ts.map +1 -0
  382. package/dist/engine-metrics.d.ts +23 -0
  383. package/dist/engine-metrics.d.ts.map +1 -0
  384. package/dist/errors/ecs-validation.d.ts +3 -0
  385. package/dist/errors/ecs-validation.d.ts.map +1 -0
  386. package/dist/errors/index.d.ts +4 -0
  387. package/dist/errors/index.d.ts.map +1 -0
  388. package/dist/errors/recover.d.ts +105 -0
  389. package/dist/errors/recover.d.ts.map +1 -0
  390. package/dist/errors/render.d.ts +705 -0
  391. package/dist/errors/render.d.ts.map +1 -0
  392. package/dist/extract/visibility.d.ts +26 -0
  393. package/dist/extract/visibility.d.ts.map +1 -0
  394. package/dist/features/fullscreen.d.ts +19 -0
  395. package/dist/features/fullscreen.d.ts.map +1 -0
  396. package/dist/features/host.d.ts +106 -0
  397. package/dist/features/host.d.ts.map +1 -0
  398. package/dist/features/morph/morph-feature.d.ts +79 -0
  399. package/dist/features/morph/morph-feature.d.ts.map +1 -0
  400. package/dist/features/plan.d.ts +182 -0
  401. package/dist/features/plan.d.ts.map +1 -0
  402. package/dist/features/prepared-gpu-work.d.ts +117 -0
  403. package/dist/features/prepared-gpu-work.d.ts.map +1 -0
  404. package/dist/features/prepared-graphics-store.d.ts +66 -0
  405. package/dist/features/prepared-graphics-store.d.ts.map +1 -0
  406. package/dist/features/prepared-graphics.d.ts +215 -0
  407. package/dist/features/prepared-graphics.d.ts.map +1 -0
  408. package/dist/features/render-graph-compute.d.ts +13 -0
  409. package/dist/features/render-graph-compute.d.ts.map +1 -0
  410. package/dist/features/render-graph-contribution.d.ts +12 -0
  411. package/dist/features/render-graph-contribution.d.ts.map +1 -0
  412. package/dist/features/render-graph-raster.d.ts +38 -0
  413. package/dist/features/render-graph-raster.d.ts.map +1 -0
  414. package/dist/features/render-graph-resources.d.ts +11 -0
  415. package/dist/features/render-graph-resources.d.ts.map +1 -0
  416. package/dist/features/targets.d.ts +32 -0
  417. package/dist/features/targets.d.ts.map +1 -0
  418. package/dist/features/types.d.ts +68 -0
  419. package/dist/features/types.d.ts.map +1 -0
  420. package/dist/features/vocabulary.d.ts +14 -0
  421. package/dist/features/vocabulary.d.ts.map +1 -0
  422. package/dist/fullscreen-post-process-pass.d.ts +157 -0
  423. package/dist/fullscreen-post-process-pass.d.ts.map +1 -0
  424. package/dist/glyph-text-layout-system.d.ts +19 -0
  425. package/dist/glyph-text-layout-system.d.ts.map +1 -0
  426. package/dist/gpu-driven/batch-topology.d.ts +55 -0
  427. package/dist/gpu-driven/batch-topology.d.ts.map +1 -0
  428. package/dist/gpu-driven/production-raster.d.ts +51 -0
  429. package/dist/gpu-driven/production-raster.d.ts.map +1 -0
  430. package/dist/gpu-driven/view-gpu.d.ts +85 -0
  431. package/dist/gpu-driven/view-gpu.d.ts.map +1 -0
  432. package/dist/gpu-resource.d.ts +73 -0
  433. package/dist/gpu-resource.d.ts.map +1 -0
  434. package/dist/gpu-scene-schema.d.ts +78 -0
  435. package/dist/gpu-scene-schema.d.ts.map +1 -0
  436. package/dist/gpu-scene.d.ts +55 -0
  437. package/dist/gpu-scene.d.ts.map +1 -0
  438. package/dist/gpu-stage.d.ts +4 -0
  439. package/dist/gpu-stage.d.ts.map +1 -0
  440. package/dist/gpu-texture-usage.d.ts +6 -0
  441. package/dist/gpu-texture-usage.d.ts.map +1 -0
  442. package/dist/gpu-usage.d.ts +9 -0
  443. package/dist/gpu-usage.d.ts.map +1 -0
  444. package/dist/hdrp-buffers.d.ts +163 -0
  445. package/dist/hdrp-buffers.d.ts.map +1 -0
  446. package/dist/ibl/IblPipelineCache.d.ts +168 -0
  447. package/dist/ibl/IblPipelineCache.d.ts.map +1 -0
  448. package/dist/ibl/skylight-bind-group.d.ts +130 -0
  449. package/dist/ibl/skylight-bind-group.d.ts.map +1 -0
  450. package/dist/index.d.ts +31 -0
  451. package/dist/index.d.ts.map +1 -0
  452. package/dist/index.mjs +169 -0
  453. package/dist/index.mjs.map +1 -0
  454. package/dist/inspection-types.d.ts +72 -0
  455. package/dist/inspection-types.d.ts.map +1 -0
  456. package/dist/instance-buffer-cache.d.ts +56 -0
  457. package/dist/instance-buffer-cache.d.ts.map +1 -0
  458. package/dist/internal.d.ts +2 -0
  459. package/dist/internal.d.ts.map +1 -0
  460. package/dist/internal.mjs +3 -0
  461. package/dist/internal.mjs.map +1 -0
  462. package/dist/lifecycle.d.ts +62 -0
  463. package/dist/lifecycle.d.ts.map +1 -0
  464. package/dist/light-buffer-layout.d.ts +164 -0
  465. package/dist/light-buffer-layout.d.ts.map +1 -0
  466. package/dist/materials.d.ts +47 -0
  467. package/dist/materials.d.ts.map +1 -0
  468. package/dist/mesh-material-bindings.d.ts +43 -0
  469. package/dist/mesh-material-bindings.d.ts.map +1 -0
  470. package/dist/pbr-pipeline.d.ts +301 -0
  471. package/dist/pbr-pipeline.d.ts.map +1 -0
  472. package/dist/pipeline/standard-forward-lane.d.ts +5 -0
  473. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -0
  474. package/dist/pipeline/standard-pipeline.d.ts +31 -0
  475. package/dist/pipeline/standard-pipeline.d.ts.map +1 -0
  476. package/dist/pipeline/standard-profile.d.ts +40 -0
  477. package/dist/pipeline/standard-profile.d.ts.map +1 -0
  478. package/dist/pipeline-builder.d.ts +122 -0
  479. package/dist/pipeline-builder.d.ts.map +1 -0
  480. package/dist/pipeline-spec-types.d.ts +24 -0
  481. package/dist/pipeline-spec-types.d.ts.map +1 -0
  482. package/dist/pipeline-spec.d.ts +367 -0
  483. package/dist/pipeline-spec.d.ts.map +1 -0
  484. package/dist/plugin.d.ts +4 -0
  485. package/dist/plugin.d.ts.map +1 -0
  486. package/dist/points-lines/__tests__/bounds.unit.test.d.ts +2 -0
  487. package/dist/points-lines/__tests__/bounds.unit.test.d.ts.map +1 -0
  488. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts +2 -0
  489. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts.map +1 -0
  490. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts +2 -0
  491. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts.map +1 -0
  492. package/dist/points-lines/__tests__/inspection.unit.test.d.ts +2 -0
  493. package/dist/points-lines/__tests__/inspection.unit.test.d.ts.map +1 -0
  494. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts +2 -0
  495. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts.map +1 -0
  496. package/dist/points-lines/__tests__/points-lines.bench.d.ts +2 -0
  497. package/dist/points-lines/__tests__/points-lines.bench.d.ts.map +1 -0
  498. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts +2 -0
  499. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts.map +1 -0
  500. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts +2 -0
  501. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts.map +1 -0
  502. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts +2 -0
  503. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts.map +1 -0
  504. package/dist/points-lines/admission.d.ts +36 -0
  505. package/dist/points-lines/admission.d.ts.map +1 -0
  506. package/dist/points-lines/bounds.d.ts +8 -0
  507. package/dist/points-lines/bounds.d.ts.map +1 -0
  508. package/dist/points-lines/expansion-cache.d.ts +28 -0
  509. package/dist/points-lines/expansion-cache.d.ts.map +1 -0
  510. package/dist/points-lines/inspection.d.ts +53 -0
  511. package/dist/points-lines/inspection.d.ts.map +1 -0
  512. package/dist/points-lines/prepare.d.ts +67 -0
  513. package/dist/points-lines/prepare.d.ts.map +1 -0
  514. package/dist/points-lines/record.d.ts +60 -0
  515. package/dist/points-lines/record.d.ts.map +1 -0
  516. package/dist/points-lines/snapshot.d.ts +49 -0
  517. package/dist/points-lines/snapshot.d.ts.map +1 -0
  518. package/dist/post-process-errors.d.ts +182 -0
  519. package/dist/post-process-errors.d.ts.map +1 -0
  520. package/dist/prepare/prepared-graphics-resolver.d.ts +59 -0
  521. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -0
  522. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts +2 -0
  523. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts.map +1 -0
  524. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts +2 -0
  525. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts.map +1 -0
  526. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +2 -0
  527. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +1 -0
  528. package/dist/record/__tests__/video-texture-view.unit.test.d.ts +2 -0
  529. package/dist/record/__tests__/video-texture-view.unit.test.d.ts.map +1 -0
  530. package/dist/record/frame-lighting.d.ts +121 -0
  531. package/dist/record/frame-lighting.d.ts.map +1 -0
  532. package/dist/record/frame-snapshot.d.ts +429 -0
  533. package/dist/record/frame-snapshot.d.ts.map +1 -0
  534. package/dist/record/frame-targets.d.ts +20 -0
  535. package/dist/record/frame-targets.d.ts.map +1 -0
  536. package/dist/record/frame.d.ts +71 -0
  537. package/dist/record/frame.d.ts.map +1 -0
  538. package/dist/record/helpers.d.ts +102 -0
  539. package/dist/record/helpers.d.ts.map +1 -0
  540. package/dist/record/main-pass-geometry.d.ts +28 -0
  541. package/dist/record/main-pass-geometry.d.ts.map +1 -0
  542. package/dist/record/main-pass-material.d.ts +204 -0
  543. package/dist/record/main-pass-material.d.ts.map +1 -0
  544. package/dist/record/main-pass-sprite-draws.d.ts +43 -0
  545. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -0
  546. package/dist/record/main-pass.d.ts +20 -0
  547. package/dist/record/main-pass.d.ts.map +1 -0
  548. package/dist/record/mesh-ssbo.d.ts +446 -0
  549. package/dist/record/mesh-ssbo.d.ts.map +1 -0
  550. package/dist/record/render-context.d.ts +252 -0
  551. package/dist/record/render-context.d.ts.map +1 -0
  552. package/dist/record/shadow-pass.d.ts +52 -0
  553. package/dist/record/shadow-pass.d.ts.map +1 -0
  554. package/dist/record/skybox-post-pass.d.ts +33 -0
  555. package/dist/record/skybox-post-pass.d.ts.map +1 -0
  556. package/dist/record/typed-frame-graph.d.ts +35 -0
  557. package/dist/record/typed-frame-graph.d.ts.map +1 -0
  558. package/dist/record/view-ubo.d.ts +45 -0
  559. package/dist/record/view-ubo.d.ts.map +1 -0
  560. package/dist/render-contract.d.ts +424 -0
  561. package/dist/render-contract.d.ts.map +1 -0
  562. package/dist/render-data.d.ts +143 -0
  563. package/dist/render-data.d.ts.map +1 -0
  564. package/dist/render-graph-primitives.d.ts +76 -0
  565. package/dist/render-graph-primitives.d.ts.map +1 -0
  566. package/dist/render-pipeline.d.ts +110 -0
  567. package/dist/render-pipeline.d.ts.map +1 -0
  568. package/dist/render-system-extract.d.ts +868 -0
  569. package/dist/render-system-extract.d.ts.map +1 -0
  570. package/dist/render-system.d.ts +125 -0
  571. package/dist/render-system.d.ts.map +1 -0
  572. package/dist/scene/render-scene-types.d.ts +61 -0
  573. package/dist/scene/render-scene-types.d.ts.map +1 -0
  574. package/dist/scene/render-scene.d.ts +112 -0
  575. package/dist/scene/render-scene.d.ts.map +1 -0
  576. package/dist/scene-instances/post-spawn-resolve-joints.d.ts +30 -0
  577. package/dist/scene-instances/post-spawn-resolve-joints.d.ts.map +1 -0
  578. package/dist/shadow-atlas.d.ts +117 -0
  579. package/dist/shadow-atlas.d.ts.map +1 -0
  580. package/dist/ssao-buffers.d.ts +50 -0
  581. package/dist/ssao-buffers.d.ts.map +1 -0
  582. package/dist/ssao-config.d.ts +28 -0
  583. package/dist/ssao-config.d.ts.map +1 -0
  584. package/dist/systems/active-camera.d.ts +53 -0
  585. package/dist/systems/active-camera.d.ts.map +1 -0
  586. package/dist/systems/pass-selector.d.ts +24 -0
  587. package/dist/systems/pass-selector.d.ts.map +1 -0
  588. package/dist/systems/skin-palette-allocator.d.ts +49 -0
  589. package/dist/systems/skin-palette-allocator.d.ts.map +1 -0
  590. package/dist/systems/skin-palette-types.d.ts +14 -0
  591. package/dist/systems/skin-palette-types.d.ts.map +1 -0
  592. package/dist/systems/transparent-sort-config.d.ts +112 -0
  593. package/dist/systems/transparent-sort-config.d.ts.map +1 -0
  594. package/dist/tilemap-chunk-extract-system.d.ts +143 -0
  595. package/dist/tilemap-chunk-extract-system.d.ts.map +1 -0
  596. package/dist/typed-render-graph-primitives.d.ts +57 -0
  597. package/dist/typed-render-graph-primitives.d.ts.map +1 -0
  598. package/dist/typed-shadow-passes.d.ts +11 -0
  599. package/dist/typed-shadow-passes.d.ts.map +1 -0
  600. package/package.json +94 -0
  601. package/src/__tests__/authoring-path.unit.test.ts +23 -0
  602. package/src/__tests__/backend-selection-rhi-capture.test-d.ts +21 -0
  603. package/src/__tests__/callback-inference.test-d.ts +8 -0
  604. package/src/__tests__/cluster-binner.test.ts +272 -0
  605. package/src/__tests__/cluster-grid-default-surface.unit.test.ts +20 -0
  606. package/src/__tests__/construct-renderer-identity.unit.test.ts +23 -0
  607. package/src/__tests__/device-scope-lifecycle.unit.test.ts +151 -0
  608. package/src/__tests__/device-scope-stale-matrix.unit.test.ts +42 -0
  609. package/src/__tests__/direct-extract-consumer-contract.test-d.ts +23 -0
  610. package/src/__tests__/direct-light-snapshot.unit.test.ts +61 -0
  611. package/src/__tests__/factory-contract.integration.test.ts +280 -0
  612. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +15 -0
  613. package/src/__tests__/frame-observation.contract.test.ts +112 -0
  614. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +32 -0
  615. package/src/__tests__/glyph-text-layout-recovery.unit.test.ts +167 -0
  616. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +350 -0
  617. package/src/__tests__/gpu-driven-indirect-raster.browser.test.ts +12 -0
  618. package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +16 -0
  619. package/src/__tests__/gpu-driven-production.integration.test.ts +436 -0
  620. package/src/__tests__/gpu-driven-scaling.unit.test.ts +87 -0
  621. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +271 -0
  622. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +290 -0
  623. package/src/__tests__/gpu-driven-view-reference.ts +111 -0
  624. package/src/__tests__/gpu-driven-view.browser.test.ts +30 -0
  625. package/src/__tests__/gpu-driven-view.dawn.test.ts +28 -0
  626. package/src/__tests__/gpu-driven-view.unit.test.ts +199 -0
  627. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +59 -0
  628. package/src/__tests__/gpu-scene-render-graph-gpu.ts +308 -0
  629. package/src/__tests__/gpu-scene-render-graph.browser.test.ts +19 -0
  630. package/src/__tests__/gpu-scene-render-graph.dawn.test.ts +19 -0
  631. package/src/__tests__/gpu-scene-schema.unit.test.ts +16 -0
  632. package/src/__tests__/gpu-scene.dawn.test.ts +205 -0
  633. package/src/__tests__/gpu-scene.unit.test.ts +147 -0
  634. package/src/__tests__/ibl/face-uniforms.unit.test.ts +46 -0
  635. package/src/__tests__/infinite-grid-no-vertex-probe.unit.test.ts +92 -0
  636. package/src/__tests__/injection-kind-owner.test-d.ts +14 -0
  637. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +728 -0
  638. package/src/__tests__/light-buffer-layout.unit.test.ts +40 -0
  639. package/src/__tests__/material-contract-inventory.unit.test.ts +24 -0
  640. package/src/__tests__/material-cooked-projection.unit.test.ts +150 -0
  641. package/src/__tests__/material-snapshot-mutation.integration.test.ts +53 -0
  642. package/src/__tests__/material-static-dynamic-route.unit.test.ts +94 -0
  643. package/src/__tests__/material-stride-surface.unit.test.ts +32 -0
  644. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +106 -0
  645. package/src/__tests__/mesh-material-bindings.unit.test.ts +89 -0
  646. package/src/__tests__/mesh-stride-surface.unit.test.ts +16 -0
  647. package/src/__tests__/morph-culling-reentry.dawn.test.ts +157 -0
  648. package/src/__tests__/morph-feature-gpu-work.integration.test.ts +80 -0
  649. package/src/__tests__/morph-feature-plan.unit.test.ts +53 -0
  650. package/src/__tests__/morph-visual-evidence.integration.test.ts +80 -0
  651. package/src/__tests__/nineslice-handle-surface.unit.test.ts +19 -0
  652. package/src/__tests__/post-process-error-policy-owner.unit.test.ts +201 -0
  653. package/src/__tests__/prepared-buffer-kind-owner.test-d.ts +29 -0
  654. package/src/__tests__/prepared-graphics-capability.unit.test.ts +65 -0
  655. package/src/__tests__/prepared-graphics-generation.unit.test.ts +161 -0
  656. package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +138 -0
  657. package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +29 -0
  658. package/src/__tests__/prepared-graphics-resolver.unit.test.ts +285 -0
  659. package/src/__tests__/prepared-graphics-snapshot.unit.test.ts +105 -0
  660. package/src/__tests__/prepared-graphics-store.unit.test.ts +154 -0
  661. package/src/__tests__/prepared-graphics-validation.unit.test.ts +176 -0
  662. package/src/__tests__/profiler-default-off.test.ts +22 -0
  663. package/src/__tests__/profiler-phase-catalog.test.ts +66 -0
  664. package/src/__tests__/profiler-phase-integration.test.ts +62 -0
  665. package/src/__tests__/profiler-phase-token.test.ts +79 -0
  666. package/src/__tests__/public-surface.test-d.ts +94 -0
  667. package/src/__tests__/recover-error-policy-owner.unit.test.ts +107 -0
  668. package/src/__tests__/render-error-code-owner.test-d.ts +116 -0
  669. package/src/__tests__/render-error-detail-ssot.test-d.ts +139 -0
  670. package/src/__tests__/render-error-exhaustive.test-d.ts +110 -0
  671. package/src/__tests__/render-feature-assembly.test-d.ts +43 -0
  672. package/src/__tests__/render-feature-context.test-d.ts +57 -0
  673. package/src/__tests__/render-feature-contract.test-d.ts +49 -0
  674. package/src/__tests__/render-feature-diagnostics.unit.test.ts +149 -0
  675. package/src/__tests__/render-feature-docs.unit.test.ts +89 -0
  676. package/src/__tests__/render-feature-errors.unit.test.ts +47 -0
  677. package/src/__tests__/render-feature-gpu-work.integration.test.ts +316 -0
  678. package/src/__tests__/render-feature-plan.test-d.ts +161 -0
  679. package/src/__tests__/render-feature-plan.unit.test.ts +170 -0
  680. package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +90 -0
  681. package/src/__tests__/render-feature-prepared-errors.test-d.ts +79 -0
  682. package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +80 -0
  683. package/src/__tests__/render-feature-prepared-graphics-isolation.unit.test.ts +72 -0
  684. package/src/__tests__/render-feature-prepared-graphics-negative.test-d.ts +36 -0
  685. package/src/__tests__/render-feature-prepared-graphics.test-d.ts +74 -0
  686. package/src/__tests__/render-feature-prepared-graphics.unit.test.ts +121 -0
  687. package/src/__tests__/render-feature-public-surface.test-d.ts +57 -0
  688. package/src/__tests__/render-feature-retry.unit.test.ts +87 -0
  689. package/src/__tests__/render-feature-scheduling.unit.test.ts +110 -0
  690. package/src/__tests__/render-feature-stage-failed-policy-owner.unit.test.ts +137 -0
  691. package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +146 -0
  692. package/src/__tests__/render-feature-visibility-context.test-d.ts +33 -0
  693. package/src/__tests__/render-feature-visibility-context.unit.test.ts +37 -0
  694. package/src/__tests__/render-feature-zero-work.unit.test.ts +76 -0
  695. package/src/__tests__/render-graph-compute-raster-gpu.ts +342 -0
  696. package/src/__tests__/render-graph-compute-raster.browser.test.ts +16 -0
  697. package/src/__tests__/render-graph-compute-raster.dawn.test.ts +22 -0
  698. package/src/__tests__/render-graph-hzb-gpu.ts +239 -0
  699. package/src/__tests__/render-graph-hzb.browser.test.ts +16 -0
  700. package/src/__tests__/render-graph-hzb.dawn.test.ts +23 -0
  701. package/src/__tests__/render-graph-primitives.unit.test.ts +22 -0
  702. package/src/__tests__/render-graph-storage-indirect-gpu.ts +162 -0
  703. package/src/__tests__/render-graph-storage-indirect.browser.test.ts +21 -0
  704. package/src/__tests__/render-graph-storage-indirect.dawn.test.ts +28 -0
  705. package/src/__tests__/render-scene-projection.unit.test.ts +168 -0
  706. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +121 -0
  707. package/src/__tests__/renderer-lifecycle.integration.test.ts +58 -0
  708. package/src/__tests__/rhi-backend-package-boundary.unit.test.ts +11 -0
  709. package/src/__tests__/scriptable-pack-consumer.test-d.ts +14 -0
  710. package/src/__tests__/shader-stage-surface.unit.test.ts +43 -0
  711. package/src/__tests__/ssao-config.unit.test.ts +36 -0
  712. package/src/__tests__/ssao-kernel-surface.unit.test.ts +14 -0
  713. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +28 -0
  714. package/src/__tests__/standard-descriptors.test-d.ts +22 -0
  715. package/src/__tests__/standard-pipeline.dawn.test.ts +61 -0
  716. package/src/__tests__/standard-pipeline.integration.test.ts +124 -0
  717. package/src/__tests__/standard-profile-oracle.unit.test.ts +62 -0
  718. package/src/__tests__/surface-configuration.unit.test.ts +91 -0
  719. package/src/__tests__/texture-usage-surface.unit.test.ts +58 -0
  720. package/src/__tests__/typed-pipeline-topology.unit.test.ts +223 -0
  721. package/src/__tests__/urp-pipeline-targets.unit.test.ts +42 -0
  722. package/src/__tests__/urp-pipeline.unit.test.ts +14 -0
  723. package/src/__tests__/vertex-color-pipeline.unit.test.ts +132 -0
  724. package/src/__tests__/vertex-layout-consumer.unit.test.ts +25 -0
  725. package/src/__tests__/visibility-diagnostics.integration.test.ts +62 -0
  726. package/src/__tests__/visibility-extract.integration.test.ts +98 -0
  727. package/src/__tests__/visibility-extract.perf.test.ts +130 -0
  728. package/src/__tests__/visibility-feature-dedup.integration.test.ts +55 -0
  729. package/src/__tests__/visibility-hidden-report.unit.test.ts +36 -0
  730. package/src/__tests__/visibility-instances.integration.test.ts +46 -0
  731. package/src/__tests__/visibility-multi-world.integration.test.ts +86 -0
  732. package/src/__tests__/visibility-producer-matrix.integration.test.ts +168 -0
  733. package/src/__tests__/visibility-producer-matrix.unit.test.ts +96 -0
  734. package/src/__tests__/visibility-public-surface.test-d.ts +27 -0
  735. package/src/__tests__/visibility-resolver.unit.test.ts +85 -0
  736. package/src/__tests__/visibility-resource-short-circuit.unit.test.ts +80 -0
  737. package/src/__tests__/visibility-snapshot-contract.unit.test.ts +60 -0
  738. package/src/__tests__/vocabulary.unit.test.ts +21 -0
  739. package/src/assembly/backend-contract.ts +57 -0
  740. package/src/assembly/factory.ts +8130 -0
  741. package/src/assembly/host-contract.ts +101 -0
  742. package/src/assembly/material/assembly.ts +48 -0
  743. package/src/assembly/material/pipeline-projection.ts +63 -0
  744. package/src/assets/asset-decoders.ts +158 -0
  745. package/src/assets/render-asset-port.ts +44 -0
  746. package/src/assets/resolve-render-asset.ts +13 -0
  747. package/src/authoring.ts +17 -0
  748. package/src/cluster-binner.ts +700 -0
  749. package/src/components/__tests__/points-lines-admission.unit.test.ts +219 -0
  750. package/src/components/__tests__/points-lines-schema.unit.test.ts +56 -0
  751. package/src/components/__tests__/schema-contract.unit.test.ts +10 -0
  752. package/src/components/__tests__/schema-parity.unit.test.ts +25 -0
  753. package/src/components/__tests__/visibility-schema.unit.test.ts +35 -0
  754. package/src/components/camera.ts +512 -0
  755. package/src/components/directional-light.ts +120 -0
  756. package/src/components/glyph-text.ts +64 -0
  757. package/src/components/index.ts +54 -0
  758. package/src/components/instances.ts +206 -0
  759. package/src/components/layer.ts +69 -0
  760. package/src/components/light-helpers.ts +188 -0
  761. package/src/components/lines.ts +18 -0
  762. package/src/components/mesh-filter.ts +60 -0
  763. package/src/components/mesh-renderer.ts +61 -0
  764. package/src/components/point-light-shadow.ts +43 -0
  765. package/src/components/point-light.ts +65 -0
  766. package/src/components/points.ts +40 -0
  767. package/src/components/post-process-params.ts +35 -0
  768. package/src/components/scene-instance.ts +193 -0
  769. package/src/components/skybox-background.ts +103 -0
  770. package/src/components/skylight.ts +97 -0
  771. package/src/components/sort-key.ts +75 -0
  772. package/src/components/spot-light.ts +124 -0
  773. package/src/components/sprite-animation.ts +168 -0
  774. package/src/components/sprite-instances.ts +179 -0
  775. package/src/components/sprite-playback-mode.ts +79 -0
  776. package/src/components/sprite-region-override.ts +105 -0
  777. package/src/components/tile-layer.ts +167 -0
  778. package/src/components/tilemap.ts +48 -0
  779. package/src/components/visibility.ts +53 -0
  780. package/src/construct-renderer.ts +67 -0
  781. package/src/debug-draw-glue.ts +48 -0
  782. package/src/device/device-scope.ts +306 -0
  783. package/src/device/gpu-residency.ts +1822 -0
  784. package/src/device/resource-types.ts +20 -0
  785. package/src/engine-metrics.ts +82 -0
  786. package/src/errors/ecs-validation.ts +16 -0
  787. package/src/errors/index.ts +3 -0
  788. package/src/errors/recover.ts +161 -0
  789. package/src/errors/render.ts +1284 -0
  790. package/src/extract/visibility.ts +120 -0
  791. package/src/features/fullscreen.ts +46 -0
  792. package/src/features/host.ts +1363 -0
  793. package/src/features/morph/morph-feature.ts +377 -0
  794. package/src/features/plan.ts +447 -0
  795. package/src/features/prepared-gpu-work.ts +959 -0
  796. package/src/features/prepared-graphics-store.ts +449 -0
  797. package/src/features/prepared-graphics.ts +420 -0
  798. package/src/features/render-graph-compute.ts +69 -0
  799. package/src/features/render-graph-contribution.ts +75 -0
  800. package/src/features/render-graph-raster.ts +332 -0
  801. package/src/features/render-graph-resources.ts +38 -0
  802. package/src/features/targets.ts +70 -0
  803. package/src/features/types.ts +103 -0
  804. package/src/features/vocabulary.ts +24 -0
  805. package/src/fullscreen-post-process-pass.ts +363 -0
  806. package/src/glyph-text-layout-system.ts +421 -0
  807. package/src/gpu-driven/batch-topology.ts +245 -0
  808. package/src/gpu-driven/production-raster.ts +695 -0
  809. package/src/gpu-driven/view-gpu.ts +703 -0
  810. package/src/gpu-resource.ts +159 -0
  811. package/src/gpu-scene-schema.ts +136 -0
  812. package/src/gpu-scene.ts +722 -0
  813. package/src/gpu-stage.ts +9 -0
  814. package/src/gpu-texture-usage.ts +12 -0
  815. package/src/gpu-usage.ts +14 -0
  816. package/src/hdrp-buffers.ts +480 -0
  817. package/src/ibl/IblPipelineCache.ts +1006 -0
  818. package/src/ibl/skylight-bind-group.ts +513 -0
  819. package/src/index.ts +129 -0
  820. package/src/inspection-types.ts +80 -0
  821. package/src/instance-buffer-cache.ts +95 -0
  822. package/src/internal.ts +9 -0
  823. package/src/lifecycle.ts +168 -0
  824. package/src/light-buffer-layout.ts +346 -0
  825. package/src/materials.ts +214 -0
  826. package/src/mesh-material-bindings.ts +103 -0
  827. package/src/pbr-pipeline.ts +1137 -0
  828. package/src/pipeline/standard-forward-lane.ts +229 -0
  829. package/src/pipeline/standard-pipeline.ts +555 -0
  830. package/src/pipeline/standard-profile.ts +65 -0
  831. package/src/pipeline-builder.ts +382 -0
  832. package/src/pipeline-spec-types.ts +28 -0
  833. package/src/pipeline-spec.ts +1231 -0
  834. package/src/plugin.ts +69 -0
  835. package/src/points-lines/__tests__/bounds.unit.test.ts +21 -0
  836. package/src/points-lines/__tests__/cache-recovery.unit.test.ts +157 -0
  837. package/src/points-lines/__tests__/inspection-lanes.integration.test.ts +146 -0
  838. package/src/points-lines/__tests__/inspection.unit.test.ts +173 -0
  839. package/src/points-lines/__tests__/lane-structural.integration.test.ts +122 -0
  840. package/src/points-lines/__tests__/points-lines.bench.ts +400 -0
  841. package/src/points-lines/__tests__/raster-lane.integration.test.ts +44 -0
  842. package/src/points-lines/__tests__/snapshot.unit.test.ts +101 -0
  843. package/src/points-lines/__tests__/view-ubo.unit.test.ts +73 -0
  844. package/src/points-lines/admission.ts +238 -0
  845. package/src/points-lines/bounds.ts +23 -0
  846. package/src/points-lines/expansion-cache.ts +215 -0
  847. package/src/points-lines/inspection.ts +97 -0
  848. package/src/points-lines/prepare.ts +177 -0
  849. package/src/points-lines/record.ts +125 -0
  850. package/src/points-lines/snapshot.ts +130 -0
  851. package/src/post-process-errors.ts +302 -0
  852. package/src/prepare/prepared-graphics-resolver.ts +456 -0
  853. package/src/record/__tests__/material-bg-cache.unit.test.ts +41 -0
  854. package/src/record/__tests__/material-slot-plan.unit.test.ts +44 -0
  855. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +41 -0
  856. package/src/record/__tests__/video-texture-view.unit.test.ts +90 -0
  857. package/src/record/frame-lighting.ts +1074 -0
  858. package/src/record/frame-snapshot.ts +500 -0
  859. package/src/record/frame-targets.ts +137 -0
  860. package/src/record/frame.ts +1598 -0
  861. package/src/record/helpers.ts +284 -0
  862. package/src/record/main-pass-geometry.ts +1065 -0
  863. package/src/record/main-pass-material.ts +1043 -0
  864. package/src/record/main-pass-sprite-draws.ts +1137 -0
  865. package/src/record/main-pass.ts +610 -0
  866. package/src/record/mesh-ssbo.ts +885 -0
  867. package/src/record/render-context.ts +384 -0
  868. package/src/record/shadow-pass.ts +698 -0
  869. package/src/record/skybox-post-pass.ts +593 -0
  870. package/src/record/typed-frame-graph.ts +461 -0
  871. package/src/record/view-ubo.ts +222 -0
  872. package/src/render-contract.ts +582 -0
  873. package/src/render-data.ts +385 -0
  874. package/src/render-graph-primitives.ts +811 -0
  875. package/src/render-pipeline.ts +259 -0
  876. package/src/render-system-extract.ts +4585 -0
  877. package/src/render-system.ts +1933 -0
  878. package/src/scene/render-scene-types.ts +67 -0
  879. package/src/scene/render-scene.ts +1087 -0
  880. package/src/scene-instances/post-spawn-resolve-joints.ts +165 -0
  881. package/src/shadow-atlas.ts +244 -0
  882. package/src/ssao-buffers.ts +334 -0
  883. package/src/ssao-config.ts +61 -0
  884. package/src/systems/active-camera.ts +116 -0
  885. package/src/systems/pass-selector.ts +49 -0
  886. package/src/systems/skin-palette-allocator.ts +251 -0
  887. package/src/systems/skin-palette-types.ts +14 -0
  888. package/src/systems/transparent-sort-config.ts +233 -0
  889. package/src/tilemap-chunk-extract-system.ts +1290 -0
  890. package/src/typed-render-graph-primitives.ts +541 -0
  891. package/src/typed-shadow-passes.ts +165 -0
@@ -0,0 +1,500 @@
1
+ // @forgeax/engine-runtime - RenderSystem record stage: frame-snapshot.
2
+ // Extracted from render-system-record.ts (feat-20260704 M3/w17, pure move).
3
+
4
+ import type { World } from '@forgeax/engine-ecs';
5
+ import { vec3 } from '@forgeax/engine-math';
6
+ import type { ResolvedColorTargetDescriptor } from '@forgeax/engine-render-graph';
7
+ import type { Texture } from '@forgeax/engine-rhi';
8
+ import type { ClusterBinScratch } from '../cluster-binner';
9
+ import type { GpuBuffer } from '../gpu-resource';
10
+
11
+ /**
12
+ * feat-20260708-composited-multi-world-rendering M1 / D-1 / D-9:
13
+ * worldId-entityKey composite key helper. Formula: `worldId * 2^32 + entityKey`.
14
+ *
15
+ * worldId is the index into `worlds[]` (the `draw` call argument). entityKey
16
+ * is the packed Entity u32 (encodeEntity(indexSlot, generation)) surfaced
17
+ * through `RenderableSnapshot.entityKey`.
18
+ *
19
+ * Key properties:
20
+ * - worldId=0 identity: `worldEntityKey(0, k) === k` — single-world path
21
+ * cache behavior is bit-for-bit unchanged (AC-03 regression guarantee).
22
+ * - JS safe integer: worldId < 2^21 keeps the composite key below
23
+ * Number.MAX_SAFE_INTEGER (2^53).
24
+ * - SSOT: all cache-key compositing consumers import this single helper;
25
+ * no inline `worldId * 2^32 + k` duplication (D-9).
26
+ *
27
+ * @internal — exported for unit test + glyph/tilemap/record consumers;
28
+ * not part of the public @forgeax/engine-runtime API surface.
29
+ */
30
+ export function worldEntityKey(worldId: number, entityKey: number): number {
31
+ return worldId * 4294967296 + entityKey; // 2^32 = 4294967296
32
+ }
33
+
34
+ /**
35
+ * Cross-frame cache entry for a material bind group whose source material and
36
+ * all resolved GPU resources are stable. The material snapshot identity is
37
+ * the extract-layer invalidation token; the builder only stores entries after
38
+ * all explicit resource handles resolved to resident GPU objects.
39
+ */
40
+ export interface MaterialBgAssemblyCacheEntry {
41
+ readonly material: MaterialSnapshot;
42
+ /** Invalidates when a texture/sampler residency identity changes. */
43
+ readonly materialResourceEpoch: number;
44
+ readonly materialBgl: BindGroupLayout;
45
+ /** Buffer identity changes when the shared material capacity grows. */
46
+ readonly materialBuffer: Buffer;
47
+ readonly skylightResources: SkylightBindGroupResources;
48
+ readonly bindGroup: BindGroup;
49
+ }
50
+
51
+ import type { CompiledRenderGraph } from '@forgeax/engine-render-graph';
52
+ import type { BindGroup, BindGroupLayout, Buffer, TextureView } from '@forgeax/engine-rhi';
53
+ import type { MaterialRenderState, RenderPipelineAsset } from '@forgeax/engine-types';
54
+ import type { MeshGpuHandles } from '../device/gpu-residency';
55
+ import type { SkylightBindGroupResources } from '../ibl/skylight-bind-group';
56
+ import type { InstanceBufferCacheEntry } from '../instance-buffer-cache';
57
+ import type { CameraSnapshot } from '../render-contract';
58
+ import type { RenderPipeline as RenderPipelineDef, RenderPipelineFrame } from '../render-pipeline';
59
+ import type {
60
+ DispatchEntry,
61
+ MaterialSnapshot,
62
+ PointShadowSnapshot,
63
+ RenderableSnapshot,
64
+ SpotLightSnapshot,
65
+ } from '../render-system-extract';
66
+ import type { ShadowAtlas } from '../shadow-atlas';
67
+
68
+ /**
69
+ * feat-20260608-create-app-param-surface-trim / M1 / D-8 (q8 user lock):
70
+ * fallback clear color when the world carries no Camera entity. Opaque
71
+ * black `[0, 0, 0, 1]`, replacing the historical
72
+ * `[0.06, 0.06, 0.08, 1.0]` dark-slate sentinel. Single SSOT consumed by
73
+ * the synthetic CameraSnapshot built when `cameras.length === 0`
74
+ * (Case B in `recordFrame`) and read directly by tests
75
+ * (`zero-camera-clear-fallback.test.ts`). AC-05.
76
+ */
77
+ export const ZERO_CAMERA_CLEAR_FALLBACK: readonly [number, number, number, number] = [0, 0, 0, 1];
78
+
79
+ export interface FrameObservationSource {
80
+ readonly texture: Texture;
81
+ readonly descriptor: ResolvedColorTargetDescriptor;
82
+ readonly frameId: number;
83
+ readonly pipelineId: 'forgeax::standard';
84
+ readonly backendId: string;
85
+ }
86
+
87
+ /**
88
+ * Build a synthetic CameraSnapshot the record stage uses when the world
89
+ * carries no Camera entity. Identity-shaped projection / view inputs
90
+ * keep the existing matrix math numerically stable; clear-color quartet
91
+ * sourced from `ZERO_CAMERA_CLEAR_FALLBACK` so the swap-chain still
92
+ * paints `[0, 0, 0, 1]` (AI-user friendly observable signal that the
93
+ * `'render-system-no-camera'` diagnostic fired without leaving stale
94
+ * pixels on screen).
95
+ */
96
+ export function makeZeroCameraFallbackSnapshot(): CameraSnapshot {
97
+ // Identity world mat4 so `mat4.invert(world)` yields identity view.
98
+ const identityWorld = new Float32Array(16);
99
+ identityWorld[0] = 1;
100
+ identityWorld[5] = 1;
101
+ identityWorld[10] = 1;
102
+ identityWorld[15] = 1;
103
+ return {
104
+ position: vec3.create(0, 0, 0),
105
+ world: identityWorld,
106
+ fov: Math.PI / 4,
107
+ aspect: 1,
108
+ near: 0.1,
109
+ far: 100,
110
+ // feat-20260613 M6 / w20: synthetic camera defaults to perspective so
111
+ // the CSM extract path stays consistent with the previously-implicit
112
+ // perspective shape (unchanged behavior; explicit field).
113
+ projection: 'perspective',
114
+ orthoLeft: -1,
115
+ orthoRight: 1,
116
+ orthoBottom: -1,
117
+ orthoTop: 1,
118
+ tonemap: 'none',
119
+ exposure: 1.0,
120
+ whitePoint: 4.0,
121
+ antialias: 'none',
122
+ bloom: 'off',
123
+ bloomThreshold: 1.0,
124
+ bloomIntensity: 1.0,
125
+ bloomBlurRadius: 4.0,
126
+ clearColor: ZERO_CAMERA_CLEAR_FALLBACK,
127
+ };
128
+ }
129
+
130
+ // feat-20260621-merge-directionallightshadow-into-directionallight M3 / m3-t2
131
+ // (D-7): host-clamp the merged DirectionalLight's pcfKernelSize to the nearest
132
+ // valid odd kernel in {1,3,5} before it reaches the View UBO float [128].
133
+ // lighting-directional.wgsl runs a constant-trip-count loop to MAX_PCF_HALF=2
134
+ // (merged 5.3-production-shadow-demos AC-14 variant-free pattern) and clips each
135
+ // iteration to half = (pcfKernelSize-1)/2, so the supported kernel set is
136
+ // {1,3,5} (cap 5). undefined (no shadow fields) defaults to 3.
137
+ export function clampPcfKernelSize(value: number | undefined): number {
138
+ if (value === undefined) return 3;
139
+ if (value <= 1) return 1;
140
+ if (value <= 3) return 3;
141
+ return 5;
142
+ }
143
+
144
+ /**
145
+ * Per-RenderSystem mutable frame state.
146
+ *
147
+ * Owned by the `createRenderSystem` closure; advanced once per
148
+ * `recordFrame` invocation. The `instanceBuffers` map holds the per-entity
149
+ * GPU storage buffers for Instances-bearing entities (cache key = the
150
+ * packed Entity u32 surfaced via `InstancesSnapshot.cacheKey`); entries
151
+ * are recreated when the `archVersion` bumps or `byteLength` changes.
152
+ *
153
+ * feat-20260518-pbr-direct-lighting-mvp M3 / w14 (AC-17 a): the
154
+ * `warnedZeroLightStandard` flag latches the first-frame warning that
155
+ * fires when the world contains a StandardMaterial entity but zero
156
+ * DirectionalLight entries — once latched the next 100 frames suppress
157
+ * the warning so the AI user is not flooded with repeated noise (charter
158
+ * P3 silent failure -> explicit warning at most once per RenderSystem
159
+ * lifetime).
160
+ */
161
+ export interface RenderFrameState {
162
+ frameNumber: number;
163
+ /** Optional graph resource lookup used by low-level record helpers and tests. */
164
+ readonly perFrameGraph?: {
165
+ readonly getColorTargetDescriptor: (key: string) => ResolvedColorTargetDescriptor | undefined;
166
+ readonly getColorTargetView: (key: string) => TextureView | undefined;
167
+ readonly getColorTargetTexture: (key: string) => Texture | undefined;
168
+ } | null;
169
+ /** Last successfully rendered static directional shadow atlas token. */
170
+ directionalShadowCache: DirectionalShadowCache | null;
171
+ /** Set by a directional shadow pass when this frame refreshed the atlas. */
172
+ directionalShadowCacheRecorded: boolean;
173
+ /** The sole compiled owner for compute, copy, feature, and raster work. */
174
+ compiledFrameGraph: CompiledRenderGraph<RenderPipelineFrame> | null;
175
+ compiledFrameGraphTopologyKey: string | null;
176
+ readonly retiredCompiledFrameGraphs: Set<CompiledRenderGraph<RenderPipelineFrame>>;
177
+ /** Physical outputs projected by typed graph passes for downstream observers. */
178
+ currentFrameObservationSource: FrameObservationSource | undefined;
179
+ currentDirectionalShadowView: TextureView | null;
180
+ currentSpotShadowView: TextureView | null;
181
+ readonly instanceBuffers: Map<number, InstanceBufferCacheEntry>;
182
+ /** Per-entity vertex buffers for the Standard CPU morph lane. */
183
+ readonly morphBuffers?: Map<number, MorphBufferCacheEntry>;
184
+ readonly hdrpClusterBinScratch: ClusterBinScratch;
185
+ /** Reusable HDRP cluster output buffers; sized once and grown only if the grid/cap changes. */
186
+ hdrpClusterGridScratch: Uint32Array | null;
187
+ hdrpLightIndexListScratch: Uint32Array | null;
188
+ /** Compute bind group for the optional WebGPU HDRP membership producer. */
189
+ hdrpClusterMembershipBindGroup: BindGroup | null;
190
+ transientInstanceBuffers: InstanceBufferCacheEntry[];
191
+ warnedZeroLightStandard: boolean;
192
+ /**
193
+ * feax-20260608-multi-light-warn-once M3: once-warn latch for multi-light
194
+ * overrun per bucket (directional N>1 / point N>4 / spot N>4). Fires at
195
+ * most once per RenderSystem lifetime per bucket so AI users see a single
196
+ * actionable console.warn without per-frame flooding (charter P3 explicit
197
+ * failure: warn-once preserves signal/noise floor).
198
+ */
199
+ warnedMultiLightDirectional: boolean;
200
+ warnedMultiLightPoint: boolean;
201
+ warnedMultiLightSpot: boolean;
202
+ /**
203
+ * feat-20260630-equirect-kind-internalized-ibl-declarative-skyligh M3 / w19:
204
+ * once-warn latches for >1 Skylight / >1 SkyboxBackground entity. Fire at most
205
+ * once per RenderSystem lifetime so the multi-entity warn (which names the
206
+ * winning entity handle, F-8) does not flood the console every frame.
207
+ */
208
+ warnedMultiSkylight: boolean;
209
+ warnedMultiSkybox: boolean;
210
+ /** feat-20260531-skybox-env-background M3 / w20: once-warn when camera
211
+ * tonemap is 'none' but a SkyboxBackground entity exists. Skybox needs
212
+ * the HDR render target allocated by the tonemap path; without it the
213
+ * skybox pass is skipped (plan-strategy D-2 NOTE). */
214
+ warnedSkyboxTonemapNone: boolean;
215
+ /**
216
+ * Per-handle warn-once anchor for the missing baseColor-texture fallback,
217
+ * shared by every textured material path (sprite / sprite-lit / standard-pbr
218
+ * / pbr-skin / unlit — feat-20260520-2d-sprite-layer-mvp M-3 / w25 seeded it
219
+ * for sprites; feat-future-pbr-missing-texture-fallback-explicit generalised
220
+ * it to PBR/skin so GLB textures that fail to reach the GPU no longer render
221
+ * silently flat). A `Set<number>` keyed by the raw Handle<TextureAsset> id -
222
+ * the writer fires `console.warn` exactly once per missing texture handle per
223
+ * RenderSystem lifetime so AI users see a single actionable message without
224
+ * per-frame log flooding. The set lives across frames so the second frame on
225
+ * the same missing handle stays silent (charter P3 explicit failure:
226
+ * warn-once preserves signal / noise floor while structured RhiError below
227
+ * stays per-frame fire).
228
+ *
229
+ * Note on the WeakSet/Set choice: plan-strategy mentions WeakSet but
230
+ * Handle values are numeric brand u32s (not object references), so
231
+ * WeakSet<object> is not applicable; Set<number> gives identical
232
+ * warn-once-per-handle semantics at zero additional cost (charter F1
233
+ * minimal surface; the per-RenderSystem lifetime cap is the upper
234
+ * bound).
235
+ */
236
+ readonly warnedMissingBaseColorTextureHandles: Set<number>;
237
+ /**
238
+ * feat-20260527-sprite-nineslice M2 / w11 + M4 / w16 (AC-16): once-per-
239
+ * renderable guard for the `nineslice.scale-too-small` metric increment.
240
+ * Keyed by `renderableIndex` so the second frame on the same mis-scaled
241
+ * entity does NOT keep bumping the counter — AI users see one counter
242
+ * tick per offending entity per RenderSystem lifetime, matching the
243
+ * single-event semantics of the structured fail-fast (charter P3:
244
+ * machine-readable signal, not a per-frame inflation). M4 retired the
245
+ * placeholder console.warn; the increment lands on the per-Renderer
246
+ * EngineMetrics through `runtime.metrics.increment(...)`.
247
+ */
248
+ readonly warnedNineSliceScaleEntities: Set<number>;
249
+ /**
250
+ * feat-20260630-equirect-kind-internalized-ibl-declarative-skyligh M3 / w18:
251
+ * per-handle fire-once anchor for the lazy equirect-to-cubemap projection
252
+ * failure. A `Set<number>` keyed by the raw Handle<EquirectAsset> id - the
253
+ * record arm fires the structured `EquirectProjectionFailedError` exactly
254
+ * once per failed source per RenderSystem lifetime (the store records
255
+ * `status:'failed'` permanently and never retries, R-2 / AC-09; without this
256
+ * latch the record arm would re-fire the error every frame). The set lives
257
+ * across frames so the second frame on the same failed handle stays silent
258
+ * (charter P3: warn-once preserves signal / noise floor).
259
+ */
260
+ readonly firedEquirectProjectionFailedHandles: Set<number>;
261
+ /**
262
+ * feat-20260622-handle-to-id-allocator-elimination M1 / w3: per-frame
263
+ * bind group caches converted to nested WeakMap chain roots (D-3).
264
+ * Each root is a WeakMap<object, WeakMap<...>> walked by
265
+ * getOrCreateFromChain; the chain depth varies by variant
266
+ * (view-main = 7, mesh = 1, hdrp-unified = 5, skin = 2).
267
+ * Roots are stable between device recoveries and replaced when the renderer
268
+ * swaps to a fresh device. Chain keys are always inner buffer handles, never
269
+ * wrappers (D-3).
270
+ */
271
+ viewBindGroupCache: WeakMap<object, unknown>;
272
+ meshBindGroupCache: WeakMap<object, unknown>;
273
+ /**
274
+ * feat-20260622-handle-to-id-allocator-elimination M1 / w2: per-entity
275
+ * bind group caches scoped by entityKey (packed u32 as number).
276
+ * Outer Map<number, WeakMap<handle, ...>> lets GC collect entries for
277
+ * destroyed entities whose handles are unreachable; per-entity material
278
+ * and instances share the same two-level shape (D-1). The inner WeakMap
279
+ * value is opaque (`unknown`) because `getOrCreateFromChain` walks a
280
+ * variable-depth chain — intermediate handles map to nested WeakMaps and
281
+ * only the final handle maps to the variant->BindGroup leaf Map. Direct
282
+ * readers (HDRP shadow-instances read end) assert the leaf shape locally.
283
+ */
284
+ /**
285
+ * feat-20260708-composited-multi-world-rendering M1 / D-1a #2: outer Map
286
+ * keyed by `worldEntityKey(worldId, entityKey)`. Inner WeakMap unchanged.
287
+ */
288
+ readonly materialBgPerEntity: Map<number, WeakMap<object, unknown>>;
289
+ /**
290
+ * feat-20260708-composited-multi-world-rendering M1 / D-1a #3: outer Map
291
+ * keyed by `worldEntityKey(worldId, entityKey)`. Inner WeakMap unchanged.
292
+ */
293
+ readonly instancesBgPerEntity: Map<number, WeakMap<object, unknown>>;
294
+ /** Identity-keyed instances BGs shared across entities using the same buffer. */
295
+ readonly instancesBgShared: WeakMap<object, unknown>;
296
+ /**
297
+ * feat-20260622-handle-to-id-allocator-elimination M1 / w2: cross-entity
298
+ * shared material bind group cache (OQ-1 option A). Outer key is the
299
+ * material shaderId string; inner chain is a WeakMap keyed by the same
300
+ * handle objects used in per-entity chains. Reuses the generic
301
+ * `getOrCreatePerEntity` helper with outerKey string|number (D-1).
302
+ */
303
+ readonly materialBgShared: Map<string, WeakMap<object, unknown>>;
304
+ /** Cross-frame fast path for fully-resident, immutable material snapshots. */
305
+ readonly materialBgAssemblyCache: Map<string, MaterialBgAssemblyCacheEntry>;
306
+ /**
307
+ * feat-20260622-handle-to-id-allocator-elimination M1 / w2: singleton
308
+ * material bind group cache (D-6). Single flat Map<variant, BindGroup>
309
+ * for the one true singleton in production: shadow-material-singleton.
310
+ * shadow-instances-singleton is a test fixture fiction (research F3);
311
+ * no second singleton field is needed.
312
+ */
313
+ readonly singletonMaterialCache: Map<string, BindGroup>;
314
+ /**
315
+ * Post-process bind group cache: nested WeakMap chain root shared by the
316
+ * built-in bloom (bright / blur-H / blur-V / composite), FXAA, and HDRP SSAO
317
+ * (calc / blur) fullscreen passes. Each of these passes samples graph-owned
318
+ * transient render targets (hdrColor / ldrColor / bloom* / ssaoRaw /
319
+ * gbuf0 / hdrDepth); on canvas resize the graph retires the old physical
320
+ * textures and allocates new ones, so the bind group must be rebuilt to
321
+ * reference the new TextureView identity. Keying the cache on the physical
322
+ * TextureView (or `::tex` texture handle for passes that recreate their bound
323
+ * view every frame) makes invalidation automatic: a resized target yields a
324
+ * new key object -> WeakMap miss -> factory rebuild, and dead views are GC'd
325
+ * (same identity-invalidation mechanism as view/mesh caches, D-3). Replaces
326
+ * the pre-fix `pp.*BindGroup === null` single-slot caches that never
327
+ * invalidated on resize and submitted destroyed textures.
328
+ */
329
+ postProcessBgCache: WeakMap<object, unknown>;
330
+ /**
331
+ * Raw handle of the currently installed RenderPipelineAsset (0 = builtin).
332
+ * Installation brands the next candidate topology; the prior compiled graph
333
+ * remains last-known-good until the candidate compiles successfully.
334
+ */
335
+ installedPipelineHandle: number;
336
+ /**
337
+ * Active topology declaration resolved from the pipeline registry.
338
+ */
339
+ activePipeline: RenderPipelineDef;
340
+ /**
341
+ * Install-time config projected into `RenderPipelineTopology.config`.
342
+ */
343
+ installedPipelineConfig: RenderPipelineAsset['config'];
344
+ /**
345
+ * feat-20260608-cluster-lighting M2 / w10: HDRP active flag.
346
+ * True iff the currently installed RenderPipelineAsset has
347
+ * `pipelineId === 'forgeax::hdrp'`. URP-only code paths gate on
348
+ * `!isHdrpActive` so HDRP demos do not double-count light contributions.
349
+ */
350
+ isHdrpActive: boolean;
351
+ /**
352
+ * feat-20260608-cluster-lighting M5 / w20 + M6 / w23 + M5 / w22:
353
+ * once-per-frame fire dedup set for HDRP per-frame fail-soft errors
354
+ * (`hdrp-light-budget-exceeded`, `hdrp-index-list-overflow`). Cleared
355
+ * at the end of each frame so the next frame re-fires if the condition
356
+ * persists. Set<string> keyed by RuntimeErrorCode literal.
357
+ */
358
+ hdrpOncePerFrameFired: Set<string>;
359
+ /**
360
+ * feat-20260612-point-light-shadows-urp-hdrp M3 / T-M3-2 (plan-strategy §D-1).
361
+ * Lazily-allocated cube_array shadow atlas owned by the RenderSystem
362
+ * lifetime. `null` until the first frame whose `lights.pointShadow` is
363
+ * non-empty (zero-shadow scenes never allocate; AC-09). The atlas is
364
+ * disposed by the renderer dispose path; subsequent frames with a non-empty
365
+ * snapshot list re-allocate.
366
+ */
367
+ pointShadowAtlas: ShadowAtlas | null;
368
+ /**
369
+ * feat-20260612-point-light-shadows-urp-hdrp M3 / T-M3-2 (plan-strategy §D-3):
370
+ * per-frame projection of `lights.pointShadow` from the extract stage. The
371
+ * typed point-shadow pass reads this list to drive the 6 x N face iteration.
372
+ * Empty array means the topology declares no point-shadow passes.
373
+ */
374
+ pointShadowSnapshots: readonly PointShadowSnapshot[];
375
+ /**
376
+ * feat-20260622-chunk-gpu-instancing-sprite-tilemap M1 / w4 (D-1):
377
+ * last fold-pass output, computed at `recordFrame` entry from the
378
+ * transparent-sort-ordered dispatch + mode-gate (D-5: only mode 0
379
+ * folds; other modes yield singleton buckets). Currently an
380
+ * observational compute — the drawIndexed swap (1 instanced draw per
381
+ * fold bucket) is the follow-on integration that wires each bucket
382
+ * into the sprite-pass / geometry-pass dispatch loops. The bucket
383
+ * count is the source of truth for `render.instancing.foldedDraws`
384
+ * metric (M3 / w13) — every fold-eligible bucket (bucketSize >= 1
385
+ * under mode 0 AND not bypassed) contributes one increment.
386
+ */
387
+ lastFoldBucketCount: number;
388
+ /**
389
+ * feat-20260625-spot-light-shadow-mapping M2 / w9 (D-2): per-frame projection
390
+ * of `lights.spot` from the extract stage. The typed spot-shadow graph
391
+ * pass reads this list to render each
392
+ * castShadow spot's perspective depth into its `spotShadowDepth` atlas tile
393
+ * (viewport keyed on `shadowAtlasTile`). `recordFrame` writes it before
394
+ * graph execution. Spots with `shadowAtlasTile < 0` (castShadow:false,
395
+ * degenerate direction, or clipped beyond cap 4) are skipped — zero
396
+ * shadow-casting spots means zero spot shadow passes (AC-03).
397
+ */
398
+ spotShadowSnapshots: readonly SpotLightSnapshot[];
399
+ }
400
+
401
+ export interface MorphBufferCacheEntry {
402
+ readonly buffer: GpuBuffer;
403
+ readonly byteLength: number;
404
+ }
405
+
406
+ /**
407
+ * feat-20260518-pbr-direct-lighting-mvp M5 / w22.11 (D-2 + D-10 + AC-06):
408
+ * mutable per-frame dispatch counter object owned by `createRenderSystem`
409
+ * and bumped here at the actual `pass.setPipeline(...)` call site (the
410
+ * only point with both `mat.materialShaderId` and `mesh.layoutProjection` in scope).
411
+ * Unlit / custom shader pipeline dispatch tracked here.
412
+ */
413
+ export interface DispatchCounts {
414
+ unlit: number;
415
+ /** feat-20260523 M4-T07: 'standard' counter removed; schema-driven
416
+ * materials are tracked via materialShaderId in the pipeline cache. */
417
+ }
418
+
419
+ /**
420
+ * feat-20260531-per-frame-bind-group-cache M1 / w4: per-frame
421
+ * createBindGroup counter. Closure-mutable object aligned with
422
+ * DispatchCounts precedent. Reset in draw(world) entry, bumped on
423
+ * cache-miss createBindGroup calls (M2-M4).
424
+ */
425
+ export interface BindGroupCounts {
426
+ createBindGroup: number;
427
+ /**
428
+ * Debug-only: records the variant of every cache-miss BindGroup created via
429
+ * `getOrCreateFromChain` for unit-test observability. Production paths do
430
+ * not read this array.
431
+ */
432
+ keys: string[];
433
+ }
434
+
435
+ /**
436
+ * A renderable resolved against the AssetRegistry for the current frame:
437
+ * its source snapshot, the GPU mesh handles, the row index used to correlate
438
+ * transparent-sort output back to this entry, and an optional per-material
439
+ * renderState override (bug-20260527-renderstate-pipeline-dispatch-gap D-4).
440
+ * Module-scoped so RenderPipelineContext can type `validated` / `validatedOrdered`
441
+ * without a dynamic type escape (was a recordFrame-local interface before F-4).
442
+ */
443
+ export interface ValidatedRenderable {
444
+ readonly source: RenderableSnapshot;
445
+ /** World that owns the renderable's asset handles and material snapshots. */
446
+ readonly world?: World;
447
+ readonly mesh: MeshGpuHandles;
448
+ readonly renderableIndex: number;
449
+ readonly renderState: MaterialRenderState | undefined;
450
+ /**
451
+ * Canonical authored material-variant request folded from the selected
452
+ * pass's `defines` map. Capability axes are merged at the renderer seam;
453
+ * this field carries only the pass-owned selection into record.
454
+ */
455
+ readonly variantSet?: string | undefined;
456
+ /**
457
+ * w10: per-pass stencil reference value folded from
458
+ * {@link DispatchEntry.stencilReference} (draw-call dynamic state). The draw
459
+ * loop calls `pass.setStencilReference(stencilReference ?? 0)` before each
460
+ * draw; `undefined` falls back to the WebGPU default 0 (semantic no-op).
461
+ */
462
+ readonly stencilReference: number | undefined;
463
+ }
464
+
465
+ /**
466
+ * Cross-frame validity token for the directional shadow atlas.
467
+ *
468
+ * The atlas is a render target, not authored state. Keeping its validity
469
+ * token beside the other RenderFrameState caches lets recordFrame skip a
470
+ * static caster submission without teaching the public render-pipeline
471
+ * contract about caching. Every source that can change caster depth is part
472
+ * of the token: world mutation, asset catalogue, graph/target identity, CSM
473
+ * matrices, and the GPU mesh-residency epoch.
474
+ *
475
+ * @internal
476
+ */
477
+ export interface DirectionalShadowCache {
478
+ readonly worlds: readonly World[];
479
+ readonly worldStateTokens: readonly DirectionalShadowWorldState[];
480
+ readonly assetCatalogEpoch: number;
481
+ readonly pipelineHandle: number;
482
+ readonly graphTopologyKey: string | null;
483
+ readonly shadowMapSize: number;
484
+ readonly cascadeCount: number;
485
+ readonly lightViewProj: readonly Float32Array[];
486
+ readonly meshResidencyEpoch: number;
487
+ }
488
+
489
+ /**
490
+ * ECS state that can change the contents of a directional shadow map.
491
+ *
492
+ * The ECS-owned RenderReadLease is the only render-facing mutation boundary.
493
+ * Its cursor is intentionally conservative: any published World change
494
+ * invalidates the cached atlas, while render never reaches through World for
495
+ * component-clock storage.
496
+ */
497
+ export interface DirectionalShadowWorldState {
498
+ readonly worldIdentity: string;
499
+ readonly changeCursor: number;
500
+ }
@@ -0,0 +1,137 @@
1
+ import type { RhiCanvasContext, Texture, TextureView } from '@forgeax/engine-rhi';
2
+ import type { RenderGraphExecutionPhase } from '../render-contract';
3
+ import type { ExtractedLights } from '../render-system-extract';
4
+ import { configureSurface, type PipelineState, type RenderSystemInternals } from './render-context';
5
+
6
+ export function graphExecutionPhase(passName: string): RenderGraphExecutionPhase {
7
+ if (passName.startsWith('shadowCascade')) return 'record/graph-execute/shadow';
8
+ if (passName.startsWith('point-shadow')) return 'record/graph-execute/point-shadow';
9
+ if (passName.startsWith('spot-shadow')) return 'record/graph-execute/spot-shadow';
10
+ switch (passName) {
11
+ case 'cluster-binner-upload':
12
+ case 'cluster-membership-producer':
13
+ return 'record/graph-execute/cluster-binner-upload';
14
+ case 'g-buffer':
15
+ return 'record/graph-execute/g-buffer';
16
+ case 'ssao-calc':
17
+ return 'record/graph-execute/ssao-calc';
18
+ case 'ssao-blur':
19
+ return 'record/graph-execute/ssao-blur';
20
+ case 'lighting':
21
+ return 'record/graph-execute/lighting';
22
+ case 'forward':
23
+ return 'record/graph-execute/forward';
24
+ case 'tonemap':
25
+ return 'record/graph-execute/tonemap';
26
+ case 'debug-overlay':
27
+ return 'record/graph-execute/debug-overlay';
28
+ case 'shadow':
29
+ return 'record/graph-execute/shadow';
30
+ case 'skybox':
31
+ return 'record/graph-execute/skybox';
32
+ case 'main':
33
+ return 'record/graph-execute/main';
34
+ case 'fxaa':
35
+ return 'record/graph-execute/fxaa';
36
+ case 'bloom-bright':
37
+ return 'record/graph-execute/bloom-bright';
38
+ case 'bloom-blur-h':
39
+ return 'record/graph-execute/bloom-blur-h';
40
+ case 'bloom-blur-v':
41
+ return 'record/graph-execute/bloom-blur-v';
42
+ case 'bloom-composite':
43
+ return 'record/graph-execute/bloom-composite';
44
+ default:
45
+ return 'record/graph-execute/other';
46
+ }
47
+ }
48
+
49
+ export function acquireSwapChainTarget(
50
+ internals: RenderSystemInternals,
51
+ pipelineState: PipelineState,
52
+ ): { currentTexture: Texture; view: TextureView; targetW: number; targetH: number } | null {
53
+ const canvasContext: RhiCanvasContext | null = internals.context;
54
+ if (canvasContext === null) return null;
55
+
56
+ let currentTextureResult = canvasContext.getCurrentTexture();
57
+ if (!currentTextureResult.ok) {
58
+ pipelineState.perPassResources.configured = false;
59
+ const configured = configureSurface(
60
+ canvasContext,
61
+ internals.device,
62
+ pipelineState.format,
63
+ pipelineState.colorAttachmentFormat,
64
+ );
65
+ if (configured.ok) {
66
+ pipelineState.perPassResources.configured = true;
67
+ (globalThis as Record<string, unknown>).__forgeaxSwapChainFormat = pipelineState.format;
68
+ }
69
+ const retry = canvasContext.getCurrentTexture();
70
+ if (!retry.ok) {
71
+ internals.errorRegistry.fire(retry.error);
72
+ internals.healthRegistry.fire({
73
+ reason: 'internal-fault',
74
+ detail: {
75
+ message:
76
+ 'surface-configure-failed after retry: getCurrentTexture failed twice consecutively',
77
+ },
78
+ recoverable: false,
79
+ });
80
+ return null;
81
+ }
82
+ currentTextureResult = retry;
83
+ }
84
+ const viewDescriptor =
85
+ pipelineState.colorAttachmentFormat === pipelineState.format
86
+ ? {}
87
+ : { format: pipelineState.colorAttachmentFormat as GPUTextureFormat };
88
+ const viewResult = internals.device.createTextureView(currentTextureResult.value, viewDescriptor);
89
+ if (!viewResult.ok) {
90
+ internals.errorRegistry.fire(viewResult.error);
91
+ return null;
92
+ }
93
+ return {
94
+ currentTexture: currentTextureResult.value,
95
+ view: viewResult.value,
96
+ targetW: internals.canvas.width | 0,
97
+ targetH: internals.canvas.height | 0,
98
+ };
99
+ }
100
+
101
+ export function resolveShadowMapSize(
102
+ internals: RenderSystemInternals,
103
+ lights: ExtractedLights,
104
+ ): number | undefined {
105
+ const requested = lights.shadowMapSize;
106
+ if (!(requested !== undefined && requested > 0)) return requested;
107
+ const cascades = Math.max(1, Math.min(4, Math.round(lights.cascadeCount ?? 1)));
108
+ const tilesPerSide = Math.ceil(Math.sqrt(cascades));
109
+ const maxDimension = internals.device.limits.maxTextureDimension2D;
110
+ if (!(maxDimension > 0)) return Math.floor(requested);
111
+ const depthTextureDimension =
112
+ internals.device.caps?.backendKind === 'wgpu-webgl2'
113
+ ? Math.max(1, Math.floor(maxDimension / 2))
114
+ : maxDimension;
115
+ const maxPerTile = Math.max(1, Math.floor(depthTextureDimension / tilesPerSide));
116
+ return Math.max(1, Math.min(Math.floor(requested), maxPerTile));
117
+ }
118
+
119
+ /**
120
+ * Resolve the per-tile size for the graph-owned spot atlas when a frame has
121
+ * no directional shadow map. The typed spot pass still needs a non-zero
122
+ * viewport in a spot-only world; the directional resolver cannot provide
123
+ * that because it intentionally follows only the directional shadow lane.
124
+ */
125
+ export function resolveSpotShadowMapSize(
126
+ internals: RenderSystemInternals,
127
+ lights: ExtractedLights,
128
+ ): number | undefined {
129
+ const requested = lights.spot.find(
130
+ (spot) => spot.shadowAtlasTile >= 0 && spot.lightViewProj !== undefined,
131
+ )?.mapSize;
132
+ if (!(requested !== undefined && requested > 0)) return requested;
133
+ const maxDimension = internals.device.limits.maxTextureDimension2D;
134
+ if (!(maxDimension > 0)) return Math.floor(requested);
135
+ const maxPerTile = Math.max(1, Math.floor(maxDimension / 2));
136
+ return Math.max(1, Math.min(Math.floor(requested), maxPerTile));
137
+ }