@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,1183 @@
1
+ // @forgeax/engine-runtime - RenderSystem record stage: per-frame lighting.
2
+ // feat-20260704 M5/w31: further-split from frame.ts (AC-05 <=1500 lines/file).
3
+ // Pure leaf helpers invoked once each from recordFrame; behavior verbatim.
4
+
5
+ import { mat4, vec3 } from '@forgeax/engine-math';
6
+ import {
7
+ type BindGroup,
8
+ type BindGroupLayout,
9
+ RhiError,
10
+ type TextureView,
11
+ } from '@forgeax/engine-rhi';
12
+ import { bin, type ClusterBinProfilePhase, type ClusterBinProfileRunner } from '../cluster-binner';
13
+ import { environmentConsumerSnapshot } from '../environment/generation';
14
+ import {
15
+ HdrpIndexListOverflowError,
16
+ HdrpLightBudgetExceededError,
17
+ PointShadowAtlasBoundsViolationError,
18
+ PointShadowAtlasUninitializedError,
19
+ } from '../errors/render';
20
+ import {
21
+ createHdrpClusterMembershipBindGroup,
22
+ createHdrpUnifiedBindGroup,
23
+ getOrCreateHdrpBuffers,
24
+ HDRP_UNIFORM_LIGHT_CAPACITY,
25
+ packClusterUniform,
26
+ } from '../hdrp-buffers';
27
+ import { DEFAULT_CLUSTER_GRID, LIGHT_INDEX_LIST_CAPACITY } from '../hdrp-pipeline';
28
+ import {
29
+ LIGHT_ARRAY_HEADER_BYTES,
30
+ LIGHT_ARRAY_MAX_SLOTS,
31
+ POINT_LIGHT_STD430_BYTES,
32
+ packLightArrayHeader,
33
+ packLightSlot,
34
+ packPointLight,
35
+ packSpotLight,
36
+ SPOT_LIGHT_STD430_BYTES,
37
+ } from '../light-buffer-layout';
38
+ import type { PipelineState, RenderSystemInternals } from '../render-system';
39
+ import type {
40
+ CameraSnapshot,
41
+ DirectionalLightSnapshot,
42
+ ExtractedLights,
43
+ RenderableSnapshot,
44
+ SkyboxSnapshot,
45
+ SkylightSnapshot,
46
+ } from '../render-system-extract';
47
+ import type { RenderHdrpClusterPhase } from '../renderer';
48
+ import { ShadowAtlas } from '../shadow-atlas';
49
+ import { getOrCreateSsaoBuffers } from '../ssao-buffers';
50
+ import { getSsaoParameters } from '../ssao-config';
51
+ import type { RecordProfileRunner } from './frame';
52
+ import type { BindGroupCounts, RenderFrameState } from './frame-snapshot';
53
+ import {
54
+ computeProjectionMatrix,
55
+ computeViewMatrix,
56
+ isLitMaterialSnapshot,
57
+ warnMultiLightDirectional,
58
+ warnMultiLightPoint,
59
+ warnMultiLightSpot,
60
+ } from './helpers';
61
+ import { getOrCreateFromChain, MESH_SSBO_BYTES, MESH_UBO_FULL_ARRAY_BYTES } from './mesh-ssbo';
62
+ import { VIEW_UNIFORM_BYTES } from './view-ubo';
63
+
64
+ export interface EnvironmentSunConsumerInput {
65
+ readonly generation: number;
66
+ readonly signature: string;
67
+ readonly direction: readonly [number, number, number];
68
+ readonly color: readonly [number, number, number];
69
+ readonly illuminance: number;
70
+ readonly atmosphere?:
71
+ | {
72
+ readonly turbidity: number;
73
+ readonly rayleigh: number;
74
+ readonly mieCoefficient: number;
75
+ readonly mieDirectionalG: number;
76
+ readonly sunAngularRadius: number;
77
+ }
78
+ | undefined;
79
+ readonly source?: { readonly worldId: number; readonly entity: number } | undefined;
80
+ }
81
+
82
+ export interface EnvironmentSunConsumerSnapshot {
83
+ readonly generation: number;
84
+ readonly signature: string;
85
+ readonly source: { readonly worldId: number; readonly entity: number } | undefined;
86
+ readonly consumers: readonly {
87
+ readonly kind: 'ibl' | 'direct' | 'csm' | 'background' | 'sun-disc';
88
+ readonly generation: number;
89
+ }[];
90
+ readonly ibl: {
91
+ readonly includesSunDisc: false;
92
+ readonly sunContribution: 0;
93
+ };
94
+ readonly direct: {
95
+ readonly direction: readonly [number, number, number];
96
+ readonly color: readonly [number, number, number];
97
+ readonly illuminance: number;
98
+ readonly secondarySunContribution: 0;
99
+ };
100
+ readonly csm: { readonly direction: readonly [number, number, number] };
101
+ readonly background: { readonly includesSunDisc: true };
102
+ readonly sunDisc: {
103
+ readonly direction: readonly [number, number, number];
104
+ readonly color: readonly [number, number, number];
105
+ readonly illuminance: number;
106
+ };
107
+ readonly atmosphere?: EnvironmentSunConsumerInput['atmosphere'];
108
+ readonly materials: { readonly mirrorSunCount: 1; readonly metalSunCount: 1 };
109
+ }
110
+
111
+ export function createEnvironmentConsumerSnapshot(
112
+ input: EnvironmentSunConsumerInput,
113
+ ): EnvironmentSunConsumerSnapshot {
114
+ const consumers = ['ibl', 'direct', 'csm', 'background', 'sun-disc'].map((kind) => ({
115
+ kind: kind as EnvironmentSunConsumerSnapshot['consumers'][number]['kind'],
116
+ generation: input.generation,
117
+ }));
118
+ return {
119
+ generation: input.generation,
120
+ signature: input.signature,
121
+ source: input.source,
122
+ consumers,
123
+ ibl: { includesSunDisc: false, sunContribution: 0 },
124
+ direct: {
125
+ direction: input.direction,
126
+ color: input.color,
127
+ illuminance: input.illuminance,
128
+ secondarySunContribution: 0,
129
+ },
130
+ // Keep the source-facing Sun vector in the immutable snapshot; the
131
+ // renderer's DirectionalLight/CSM consumers negate it at their existing
132
+ // outgoing-direction boundary.
133
+ csm: { direction: input.direction },
134
+ background: { includesSunDisc: true },
135
+ sunDisc: {
136
+ direction: input.direction,
137
+ color: input.color,
138
+ illuminance: input.illuminance,
139
+ },
140
+ ...(input.atmosphere === undefined ? {} : { atmosphere: input.atmosphere }),
141
+ materials: { mirrorSunCount: 1, metalSunCount: 1 },
142
+ };
143
+ }
144
+
145
+ export interface EnvironmentWorldConsumerInput {
146
+ readonly worldId: number;
147
+ readonly resourceOwner: boolean;
148
+ readonly directionalLightCount: number;
149
+ readonly atmosphere?: EnvironmentSunConsumerSnapshot | undefined;
150
+ }
151
+
152
+ export function consumeEnvironmentWorlds(worlds: readonly EnvironmentWorldConsumerInput[]): {
153
+ readonly atmosphereSunConsumptions: number;
154
+ readonly ordinaryDirectionalLightCount: number;
155
+ } {
156
+ const owner = worlds.find((world) => world.resourceOwner && world.atmosphere !== undefined);
157
+ return {
158
+ atmosphereSunConsumptions: owner === undefined ? 0 : 1,
159
+ ordinaryDirectionalLightCount: worlds
160
+ .filter((world) => world.atmosphere === undefined)
161
+ .reduce((total, world) => total + world.directionalLightCount, 0),
162
+ };
163
+ }
164
+
165
+ function runHdrpClusterProfilePhase<T>(
166
+ runner: RecordProfileRunner | undefined,
167
+ phase: RenderHdrpClusterPhase,
168
+ action: () => T,
169
+ ): T {
170
+ return runner === undefined ? action() : runner(phase, action);
171
+ }
172
+
173
+ /**
174
+ * feat-20260704 M3/w18: per-frame bind-group cache resolution, extracted
175
+ * verbatim from `recordFrame`. Walks the handle-identity WeakMap caches
176
+ * (feat-20260531 M2 + feat-20260622 M3) to resolve or lazily create the view
177
+ * (@group 0), mesh (@group 2), and — when HDRP is active — HDRP-unified cluster
178
+ * bind groups. Returns all three (null when `hasValidated` is false, the Case E
179
+ * clear-pass-only path). No new mutable state: `bindGroupCounts` accounting +
180
+ * cache maps are threaded through explicitly.
181
+ *
182
+ * @internal
183
+ */
184
+ export function buildPerFrameBindGroups(
185
+ internals: RenderSystemInternals,
186
+ frameState: RenderFrameState,
187
+ pipelineState: PipelineState,
188
+ hasValidated: boolean,
189
+ bindGroupCounts: BindGroupCounts,
190
+ graphTargets?: {
191
+ readonly directionalShadow?: TextureView | undefined;
192
+ readonly spotShadow?: TextureView | undefined;
193
+ },
194
+ includeView = true,
195
+ ): {
196
+ viewBindGroup: BindGroup | null;
197
+ meshBindGroup: BindGroup | null;
198
+ hdrpClusterBindGroup: BindGroup | null;
199
+ hdrpClusterMembershipBindGroup: BindGroup | null;
200
+ } {
201
+ // View main (#1) chain = b0(viewUniformBuffer), b1(pointLightsBuffer),
202
+ // b2(spotLightsBuffer), b3(graph shadowDepth view or
203
+ // shadowFallbackTextureView), b4(shadowSampler), b5(atlas view), b6
204
+ // (shadowParams); variant 'view-main'.
205
+ // Mesh (#2) chain = inner b0 buffer (meshStorageBuffer.buffer); variant 'mesh'.
206
+ let viewBindGroup: BindGroup | null = null;
207
+ let meshBindGroup: BindGroup | null = null;
208
+ // feat-20260609-hdrp-cluster-fragment-ggx M4 / w19: HDRP unified group(2)
209
+ // BindGroup. Non-null when `frameState.isHdrpActive` AND HDRP buffer
210
+ // allocation succeeded; consumed by recordMainPass at `setBindGroup(2, ...)`.
211
+ let hdrpClusterBindGroup: BindGroup | null = null;
212
+ const hdrpClusterMembershipBindGroup: BindGroup | null = frameState.isHdrpActive
213
+ ? frameState.hdrpClusterMembershipBindGroup
214
+ : null;
215
+ if (hasValidated) {
216
+ // Shadow atlas view comes from the typed graph target.
217
+ // Graph owns the texture lifecycle; record-stage reads the resolved
218
+ // view each frame (D-2 SSOT). When the graph has not allocated the
219
+ // target (castShadow:false or shadowMapSize=0),
220
+ // `getColorTargetView` returns undefined and we fall through to the
221
+ // 1x1 fallback view that keeps the BGL satisfied.
222
+ if (includeView) {
223
+ const graphShadowView = graphTargets?.directionalShadow;
224
+ const b3View =
225
+ graphShadowView !== undefined ? graphShadowView : pipelineState.shadowFallbackTextureView;
226
+ // feat-20260612-point-light-shadows-urp-hdrp Round-2 F-1: bind the real
227
+ // ShadowAtlas cube_array view when point shadows are active in this
228
+ // frame; otherwise the 1x1x6 fallback (cleared to 1.0 = fully lit).
229
+ const pointShadowAtlas = frameState.pointShadowAtlas;
230
+ const atlasViewMaybe = pointShadowAtlas?.isAllocated()
231
+ ? pointShadowAtlas.getAtlasView()
232
+ : null;
233
+ const b5View =
234
+ atlasViewMaybe !== null ? atlasViewMaybe : pipelineState.shadowAtlasFallbackTextureView;
235
+ // feat-20260625-spot-light-shadow-mapping M2 / w21 (D-1 fragment side +
236
+ // D-5): bind the real `spotShadowDepth` 2D atlas view (graph-owned) when
237
+ // spot shadows run this frame; otherwise the 1x1 depth fallback cleared to
238
+ // 1.0 (fully lit) — same `texture_depth_2d` shape as binding 3, so it
239
+ // satisfies the BGL without a dedicated spot fallback allocation. binding
240
+ // 9 always binds the real spotLightViewProj UBO (zeroed lanes are safe via
241
+ // the shadowAtlasTile >= 0 shader gate).
242
+ const graphSpotShadowView = graphTargets?.spotShadow;
243
+ const b8View =
244
+ graphSpotShadowView !== undefined
245
+ ? graphSpotShadowView
246
+ : pipelineState.shadowFallbackTextureView;
247
+ viewBindGroup = getOrCreateFromChain(
248
+ frameState.viewBindGroupCache,
249
+ [
250
+ pipelineState.viewUniformBuffer,
251
+ pipelineState.pointLightsBuffer,
252
+ pipelineState.spotLightsBuffer,
253
+ b3View,
254
+ pipelineState.perPassResources.shadowSampler,
255
+ b5View,
256
+ pipelineState.shadowParamsBuffer,
257
+ b8View,
258
+ ],
259
+ 'view-main',
260
+ () => {
261
+ const viewBindGroupResult = internals.device.createBindGroup({
262
+ label: 'pbr-view-bg',
263
+ layout: pipelineState.viewBindGroupLayout,
264
+ entries: [
265
+ {
266
+ binding: 0,
267
+ resource: {
268
+ kind: 'buffer',
269
+ value: { buffer: pipelineState.viewUniformBuffer, size: VIEW_UNIFORM_BYTES },
270
+ },
271
+ },
272
+ {
273
+ binding: 1,
274
+ resource: {
275
+ kind: 'buffer',
276
+ value: { buffer: pipelineState.pointLightsBuffer },
277
+ },
278
+ },
279
+ {
280
+ binding: 2,
281
+ resource: {
282
+ kind: 'buffer',
283
+ value: { buffer: pipelineState.spotLightsBuffer },
284
+ },
285
+ },
286
+ {
287
+ binding: 3,
288
+ resource: {
289
+ kind: 'textureView',
290
+ value: b3View,
291
+ },
292
+ },
293
+ {
294
+ binding: 4,
295
+ resource: {
296
+ kind: 'sampler',
297
+ value: pipelineState.perPassResources.shadowSampler,
298
+ },
299
+ },
300
+ // feat-20260612-point-light-shadows-urp-hdrp Round-2 F-1:
301
+ // cube_array shadow atlas view (real ShadowAtlas when point
302
+ // shadows are active; else 1x1x6 fallback).
303
+ {
304
+ binding: 5,
305
+ resource: {
306
+ kind: 'textureView',
307
+ value: b5View,
308
+ },
309
+ },
310
+ // feat-20260612-point-light-shadows-urp-hdrp Round-2 F-1:
311
+ // shadowParams UBO (`array<vec4<f32>, 4>` = 64 B). Lane N
312
+ // stores `(near, far, 1/(far-near), 0)` for the point light
313
+ // with shadowAtlasLayer === N. Updated per frame from
314
+ // `pointShadowSnapshots` below.
315
+ {
316
+ binding: 6,
317
+ resource: {
318
+ kind: 'buffer',
319
+ value: { buffer: pipelineState.shadowParamsBuffer },
320
+ },
321
+ },
322
+ // feat-20260613-csm-cascaded-shadow-maps M5 / w28 (rebased to
323
+ // binding 7 on 2026-06-13 to make room for point-shadow 5/6):
324
+ // forward shaders declare binding 7 in common.wgsl (shared
325
+ // view BGL) but never reference it; only shadow_caster.wgsl
326
+ // reads it. Host writes a stable singleton buffer so every
327
+ // forward bind group entry stays populated.
328
+ {
329
+ binding: 7,
330
+ resource: {
331
+ kind: 'buffer',
332
+ value: { buffer: pipelineState.shadowCasterCascadeBuffer },
333
+ },
334
+ },
335
+ // feat-20260625-spot-light-shadow-mapping M3 / w21 (D-5):
336
+ // spot shadow 2D atlas (real spotShadowDepth view when spot
337
+ // shadows run this frame, else the 1x1 depth fallback). Always-on.
338
+ {
339
+ binding: 8,
340
+ resource: {
341
+ kind: 'textureView',
342
+ value: b8View,
343
+ },
344
+ },
345
+ // feat-20260625-spot-light-shadow-mapping w25: the per-spot
346
+ // fragment-read lightViewProj matrices fold into the View UBO
347
+ // (binding 0, `view.spotLightViewProj`) — no standalone binding 9
348
+ // (WebGL2 fragment uniform-buffer budget). binding 8 is the last.
349
+ ],
350
+ });
351
+ if (!viewBindGroupResult.ok) throw viewBindGroupResult.error;
352
+ return viewBindGroupResult.value;
353
+ },
354
+ bindGroupCounts,
355
+ );
356
+ }
357
+
358
+ // M3 / w10 (D-3 hard constraint): use the inner `.buffer` as the
359
+ // WeakMap chain key so the cache tracks the underlying GPU buffer
360
+ // identity. The wrapper object's identity is stable across grow
361
+ // events; using the wrapper would defeat AC-07 cache invalidation.
362
+ meshBindGroup = getOrCreateFromChain(
363
+ frameState.meshBindGroupCache,
364
+ [pipelineState.meshStorageBuffer.buffer],
365
+ 'mesh',
366
+ () => {
367
+ // bug-20260610: WebGL2 fallback path needs the binding to cover the
368
+ // whole `array<Mesh, 128>` uniform buffer (14336 B) instead of a
369
+ // single dynamic-offset slot (112 B). `caps.storageBuffer === false`
370
+ // is the same proxy createRenderer uses to pick the uniform variant.
371
+ const meshBindSize = internals.device.caps.storageBuffer
372
+ ? MESH_SSBO_BYTES
373
+ : MESH_UBO_FULL_ARRAY_BYTES;
374
+ const meshBindGroupResult = internals.device.createBindGroup({
375
+ label: 'pbr-mesh-bg',
376
+ layout: pipelineState.meshBindGroupLayout,
377
+ entries: [
378
+ {
379
+ binding: 0,
380
+ resource: {
381
+ kind: 'buffer',
382
+ value: {
383
+ buffer: pipelineState.meshStorageBuffer.buffer,
384
+ offset: 0,
385
+ size: meshBindSize,
386
+ },
387
+ },
388
+ },
389
+ ],
390
+ });
391
+ if (!meshBindGroupResult.ok) throw meshBindGroupResult.error;
392
+ return meshBindGroupResult.value;
393
+ },
394
+ bindGroupCounts,
395
+ );
396
+
397
+ // feat-20260609-hdrp-cluster-fragment-ggx M4 / w19: when HDRP is active,
398
+ // build the unified group(2) BindGroup that carries the mesh SSBO at
399
+ // binding 0 + the 4 cluster buffers at bindings 3..6. The bindGroup
400
+ // shares the mesh SSBO with URP's `meshBindGroup` (same `meshStorageBuffer.buffer`
401
+ // + same per-entity stride), so the dynamic offset issued at
402
+ // `setBindGroup(2, ...)` covers binding 0 of either layout. Cached
403
+ // alongside `meshBindGroupCache` keyed on the mesh SSBO + cluster
404
+ // buffer identities; cache invalidates on a buffer-grow event the same
405
+ // way the mesh path does (handle id rotation).
406
+ if (frameState.isHdrpActive) {
407
+ const hdrpBuffers = getOrCreateHdrpBuffers(
408
+ internals,
409
+ frameState.installedPipelineConfig?.clusterGrid,
410
+ );
411
+ if (hdrpBuffers !== null) {
412
+ // D-3: buffer dimension uses the inner `.buffer` (same constraint
413
+ // as the mesh path) so a grow event rotates the chain key.
414
+ hdrpClusterBindGroup = getOrCreateFromChain(
415
+ frameState.meshBindGroupCache,
416
+ [
417
+ pipelineState.meshStorageBuffer.buffer,
418
+ hdrpBuffers.lightDataBuffer,
419
+ hdrpBuffers.clusterGridBuffer,
420
+ hdrpBuffers.lightIndexListBuffer,
421
+ hdrpBuffers.clusterUniformBuffer,
422
+ ],
423
+ 'hdrp-unified',
424
+ () => {
425
+ const bg = createHdrpUnifiedBindGroup(
426
+ internals,
427
+ hdrpBuffers,
428
+ pipelineState.meshStorageBuffer.buffer,
429
+ );
430
+ if (bg === null) {
431
+ throw new RhiError({
432
+ code: 'webgpu-runtime-error',
433
+ expected: 'HDRP unified BindGroup creation succeeds when HDRP is active',
434
+ hint: 'inspect prior errorRegistry events for createBindGroup failure detail',
435
+ });
436
+ }
437
+ return bg;
438
+ },
439
+ bindGroupCounts,
440
+ );
441
+ }
442
+ }
443
+ }
444
+ return { viewBindGroup, meshBindGroup, hdrpClusterBindGroup, hdrpClusterMembershipBindGroup };
445
+ }
446
+
447
+ /**
448
+ * feat-20260704 M3/w18: per-frame lighting preparation, extracted verbatim from
449
+ * `recordFrame`. (1) URP-only multi-light warn-once (directional / point / spot
450
+ * over `LIGHT_ARRAY_MAX_SLOTS`; HDRP gated off — 256 SSBO lights). (2) pin the
451
+ * point + spot shadow snapshot lists onto frameState for the URP shadow caster
452
+ * pass closures + lazy-allocate the point-shadow cube_array atlas on first
453
+ * non-empty frame (AC-09 zero-shadow zero-alloc). (3) destructure ExtractedLights
454
+ * into the directional-fallback `light` (zero-intensity Case C default), point /
455
+ * spot arrays, and totalLightCount.
456
+ *
457
+ * @internal
458
+ */
459
+ export function prepareFrameLighting(
460
+ internals: RenderSystemInternals,
461
+ frameState: RenderFrameState,
462
+ lights: ExtractedLights,
463
+ environmentSun: EnvironmentSunConsumerSnapshot | undefined = environmentConsumerSnapshot(
464
+ frameState.environmentGeneration,
465
+ ),
466
+ ): {
467
+ light: DirectionalLightSnapshot;
468
+ pointLights: ExtractedLights['point'];
469
+ spotLights: ExtractedLights['spot'];
470
+ totalLightCount: number;
471
+ } {
472
+ if (lights.directionalCount > 1) {
473
+ warnMultiLightDirectional(frameState, lights.directionalCount);
474
+ }
475
+ // feat-20260621-merge-directionallightshadow-into-directionallight M3 / m3-t2:
476
+ // the AC-04/AC-22 "shadow disabled by missing component" once-warn is gone.
477
+ // After merging DirectionalLightShadow into DirectionalLight there is no
478
+ // orphan-shadow / missing-companion configuration to warn about -- castShadow
479
+ // defaults true on the single component, so the warn condition can never
480
+ // arise. The error class + RuntimeErrorCode member have been removed in M4 (m4-t2).
481
+
482
+ // feat-20260608-cluster-lighting M6 / w23 (F-4 fix): URP-only multi-light
483
+ // warn. HDRP supports 256 punctual lights via SSBO; the 4-slot first-slice
484
+ // cap is irrelevant under HDRP, so gate on `!isHdrpActive` to silence noise.
485
+ // Sibling tweak-20260608-rhi-hdr-renderable-caps-and-warn-once (#320)
486
+ // extracted the warn into warnMultiLight{Point,Spot} helpers (warn-once
487
+ // dedup); we keep the helpers and add the HDRP gate on top.
488
+ if (!frameState.isHdrpActive) {
489
+ if (lights.point.length > LIGHT_ARRAY_MAX_SLOTS) {
490
+ warnMultiLightPoint(frameState, lights.point.length);
491
+ }
492
+ if (lights.spot.length > LIGHT_ARRAY_MAX_SLOTS) {
493
+ warnMultiLightSpot(frameState, lights.spot.length);
494
+ }
495
+ }
496
+
497
+ // feat-20260612-point-light-shadows-urp-hdrp M3 / T-M3-2 (plan-strategy §D-1):
498
+ // project lights.pointShadow onto frameState so the URP point shadow caster
499
+ // pass can read the snapshot list during graph execute. Lazy-allocate the
500
+ // cube_array atlas on first non-empty frame; zero-shadow scenes never
501
+ // touch the GPU here (AC-09). The snapshot list is stable for the
502
+ // duration of recordFrame; its count is part of the typed topology key.
503
+ frameState.pointShadowSnapshots = lights.pointShadow;
504
+ // feat-20260625-spot-light-shadow-mapping M2 / w9 (D-2): pin the spot
505
+ // snapshots for the spotShadowDepth caster pass closure. The spot atlas is
506
+ // a graph-owned typed target, not a runtime ShadowAtlas, so graph compilation
507
+ // owns the depth texture lifetime.
508
+ frameState.spotShadowSnapshots = lights.spot;
509
+ if (lights.pointShadow.length > 0) {
510
+ if (frameState.pointShadowAtlas === null) {
511
+ const firstSnap = lights.pointShadow[0];
512
+ const faceSize = firstSnap?.mapSize ?? 512;
513
+ frameState.pointShadowAtlas = new ShadowAtlas(internals.device, {
514
+ faceSize,
515
+ layers: 4,
516
+ });
517
+ }
518
+ try {
519
+ frameState.pointShadowAtlas.ensure();
520
+ } catch (e) {
521
+ if (
522
+ e instanceof PointShadowAtlasUninitializedError ||
523
+ e instanceof PointShadowAtlasBoundsViolationError
524
+ ) {
525
+ internals.errorRegistry.fire(e);
526
+ } else {
527
+ throw e;
528
+ }
529
+ }
530
+ }
531
+
532
+ // ExtractedLights three-arm consumption (R-10 preparation; M2 / w16):
533
+ //
534
+ // - lights.directional : feeds the View UBO at slot [16..23]
535
+ // (lightDir + lightColor; existing path).
536
+ // - lights.point[] : packed into pointLightsBuffer (std430).
537
+ // - lights.spot[] : packed into spotLightsBuffer (std430).
538
+ //
539
+ // Each variant carries the discriminant `kind` so the record-time packing
540
+ // call sites can run exhaustive switch (charter P2 + AC-03).
541
+ const directionalLight: DirectionalLightSnapshot | undefined =
542
+ environmentSun === undefined
543
+ ? lights.directional
544
+ : {
545
+ kind: 'directional',
546
+ direction: vec3.create(
547
+ -(environmentSun.direct.direction[0] ?? 0),
548
+ -(environmentSun.direct.direction[1] ?? 0),
549
+ -(environmentSun.direct.direction[2] ?? 0),
550
+ ),
551
+ color: vec3.create(
552
+ environmentSun.direct.color[0] * environmentSun.direct.illuminance,
553
+ environmentSun.direct.color[1] * environmentSun.direct.illuminance,
554
+ environmentSun.direct.color[2] * environmentSun.direct.illuminance,
555
+ ),
556
+ // The extracted environment snapshot keeps raw sun colour + one
557
+ // illuminance fact. Collapse that product exactly once here so the
558
+ // existing view UBO path matches the analytic producer radiometry.
559
+ intensity: 1,
560
+ };
561
+ const pointLights = lights.point;
562
+ const spotLights = lights.spot;
563
+
564
+ // Case C: 0 DirectionalLight = legitimate scene; the View UBO falls
565
+ // back to a zero-intensity directional payload so the shader's
566
+ // `view.lightDir * view.lightColor` term contributes nothing
567
+ // (physically-correct black under standard, untouched under unlit).
568
+ const light: DirectionalLightSnapshot = directionalLight ?? {
569
+ kind: 'directional' as const,
570
+ direction: vec3.create(0, -1, 0),
571
+ color: vec3.create(0, 0, 0),
572
+ intensity: 0,
573
+ };
574
+
575
+ const totalLightCount =
576
+ (directionalLight !== undefined ? 1 : 0) + pointLights.length + spotLights.length;
577
+
578
+ return { light, pointLights, spotLights, totalLightCount };
579
+ }
580
+
581
+ /**
582
+ * feat-20260704 M3/w18: per-frame full rewrite of the PointLight + SpotLight
583
+ * std430 storage buffers, extracted verbatim from `recordFrame`.
584
+ *
585
+ * feat-20260519-light-casters-point-spot-pbr M3 / w20 (D-S1 + D-S2 + D-S6):
586
+ * header (16 B count u32 + 12 B pad) at offset 0 + first-slice cap N=4 slots
587
+ * packed sequentially. The N>4 fail-fast upstream ensures the counts are <= 4
588
+ * when the listener registry consumed the structured error; the slice keeps
589
+ * the buffer write bounded even if downstream listeners ignore the RhiError
590
+ * (charter P9 graceful degradation: surplus entities dropped, frame records).
591
+ *
592
+ * @internal
593
+ */
594
+ export function writePointSpotLightBuffers(
595
+ internals: RenderSystemInternals,
596
+ pipelineState: PipelineState,
597
+ lights: ExtractedLights,
598
+ ): void {
599
+ const pointSlots =
600
+ lights.point.length <= LIGHT_ARRAY_MAX_SLOTS
601
+ ? lights.point
602
+ : lights.point.slice(0, LIGHT_ARRAY_MAX_SLOTS);
603
+ const pointHeader = packLightArrayHeader(pointSlots.length);
604
+ const pointHeaderUpload = internals.device.queue.writeBuffer(
605
+ pipelineState.pointLightsBuffer,
606
+ 0,
607
+ new Uint8Array(pointHeader),
608
+ );
609
+ if (!pointHeaderUpload.ok) throw pointHeaderUpload.error;
610
+ for (let i = 0; i < pointSlots.length; i++) {
611
+ const slot = pointSlots[i];
612
+ if (slot === undefined) continue;
613
+ const packed = packPointLight(slot);
614
+ const offset = LIGHT_ARRAY_HEADER_BYTES + i * POINT_LIGHT_STD430_BYTES;
615
+ const writeRes = internals.device.queue.writeBuffer(
616
+ pipelineState.pointLightsBuffer,
617
+ offset,
618
+ packed,
619
+ );
620
+ if (!writeRes.ok) throw writeRes.error;
621
+ }
622
+ const spotSlots =
623
+ lights.spot.length <= LIGHT_ARRAY_MAX_SLOTS
624
+ ? lights.spot
625
+ : lights.spot.slice(0, LIGHT_ARRAY_MAX_SLOTS);
626
+ const spotHeader = packLightArrayHeader(spotSlots.length);
627
+ const spotHeaderUpload = internals.device.queue.writeBuffer(
628
+ pipelineState.spotLightsBuffer,
629
+ 0,
630
+ new Uint8Array(spotHeader),
631
+ );
632
+ if (!spotHeaderUpload.ok) throw spotHeaderUpload.error;
633
+ for (let i = 0; i < spotSlots.length; i++) {
634
+ const slot = spotSlots[i];
635
+ if (slot === undefined) continue;
636
+ const packed = packSpotLight(slot);
637
+ const offset = LIGHT_ARRAY_HEADER_BYTES + i * SPOT_LIGHT_STD430_BYTES;
638
+ const writeRes = internals.device.queue.writeBuffer(
639
+ pipelineState.spotLightsBuffer,
640
+ offset,
641
+ packed,
642
+ );
643
+ if (!writeRes.ok) throw writeRes.error;
644
+ }
645
+ }
646
+
647
+ /**
648
+ * feat-20260704 M3/w18: write the point-shadow params UBO (bound at viewBg
649
+ * binding 6), extracted verbatim from `recordFrame`.
650
+ *
651
+ * feat-20260612-point-light-shadows-urp-hdrp Round-2 F-1: 4 lanes x vec4<f32>;
652
+ * lane[shadowAtlasLayer] = (near, far, 1/(far-near), 0). Lanes for non-shadow
653
+ * slots stay zero (the WGSL sample path is gated by PointLight.shadowAtlasLayer
654
+ * >= 0). Always writes the full 64 B so stale non-zero lanes from a previous
655
+ * frame's allocation cannot poison the current frame.
656
+ *
657
+ * @internal
658
+ */
659
+ export function writeShadowParamsBuffer(
660
+ internals: RenderSystemInternals,
661
+ frameState: RenderFrameState,
662
+ pipelineState: PipelineState,
663
+ ): void {
664
+ const SHADOW_PARAMS_LANE_COUNT = 4;
665
+ const SHADOW_PARAMS_FLOATS_PER_LANE = 4;
666
+ const shadowParamsArr = new Float32Array(
667
+ SHADOW_PARAMS_LANE_COUNT * SHADOW_PARAMS_FLOATS_PER_LANE,
668
+ );
669
+ for (let i = 0; i < frameState.pointShadowSnapshots.length; i++) {
670
+ const ps = frameState.pointShadowSnapshots[i];
671
+ if (ps === undefined) continue;
672
+ const layer = ps.shadowAtlasLayer;
673
+ if (layer < 0 || layer >= SHADOW_PARAMS_LANE_COUNT) continue;
674
+ const base = layer * SHADOW_PARAMS_FLOATS_PER_LANE;
675
+ const near = ps.nearPlane;
676
+ const far = ps.farPlane;
677
+ const invSpan = far > near ? 1 / (far - near) : 0;
678
+ shadowParamsArr[base] = near;
679
+ shadowParamsArr[base + 1] = far;
680
+ shadowParamsArr[base + 2] = invSpan;
681
+ shadowParamsArr[base + 3] = 0;
682
+ }
683
+ const shadowParamsWriteRes = internals.device.queue.writeBuffer(
684
+ pipelineState.shadowParamsBuffer,
685
+ 0,
686
+ shadowParamsArr,
687
+ );
688
+ if (!shadowParamsWriteRes.ok) {
689
+ internals.errorRegistry.fire(shadowParamsWriteRes.error);
690
+ }
691
+ }
692
+
693
+ /**
694
+ * feat-20260704 M3/w18: zero-light standard-material once-warn, extracted
695
+ * verbatim from `recordFrame`.
696
+ *
697
+ * feat-20260520-skylight-ibl-cubemap M4 / t27 (AC-10): fires once per
698
+ * RenderSystem lifetime when the 0-light three-condition conjunction holds — no
699
+ * Skylight, 0 direct light (totalLightCount === 0), AND at least one builtin
700
+ * standard/PBR material (which renders black with no light). Custom shaders
701
+ * own their lighting contract and cannot be classified by this generic
702
+ * diagnostic. Suppressed under NODE_ENV=production.
703
+ *
704
+ * @internal
705
+ */
706
+ export function warnZeroLightStandard(
707
+ frameState: RenderFrameState,
708
+ renderables: readonly RenderableSnapshot[],
709
+ skylight: SkylightSnapshot | undefined,
710
+ totalLightCount: number,
711
+ ): void {
712
+ const hasStandardMaterial = renderables.some((r) => isLitMaterialSnapshot(r.material));
713
+ if (
714
+ skylight === undefined &&
715
+ totalLightCount === 0 &&
716
+ hasStandardMaterial &&
717
+ !frameState.warnedZeroLightStandard
718
+ ) {
719
+ frameState.warnedZeroLightStandard = true;
720
+ const env = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process;
721
+ if (env?.env?.NODE_ENV !== 'production') {
722
+ console.warn(
723
+ '[forgeax] standard material renders black with 0 lights of any type (no Skylight, and directional + point + spot all empty); spawn at least one light (Skylight, DirectionalLight, PointLight, or SpotLight) or switch material to an unlit shader (Materials.unlit(...)). See AGENTS.md section Breaking changes 2026-05-19.',
724
+ );
725
+ }
726
+ }
727
+ }
728
+
729
+ /**
730
+ * feat-20260704 M3/w18: HDRP per-frame CPU cluster binning + light-data /
731
+ * cluster-grid / light-index-list / cluster-uniform / SSAO uniform buffer
732
+ * uploads. Extracted verbatim from `recordFrame`. Runs only when the HDRP
733
+ * pipeline is active and there is at least one punctual light; otherwise it is
734
+ * a no-op (URP / SSAO-off paths untouched).
735
+ *
736
+ * feat-20260608-cluster-lighting M5 / w21 + M6 / w23 + r2 fix-up: fail-soft
737
+ * semantics preserved verbatim — index-list-overflow and light-budget-exceeded
738
+ * fire once per frame (via `frameState.hdrpOncePerFrameFired`) and continue
739
+ * rendering.
740
+ *
741
+ * @internal
742
+ */
743
+ export function writeHdrpClusterAndSsaoBuffers(
744
+ internals: RenderSystemInternals,
745
+ frameState: RenderFrameState,
746
+ camera: CameraSnapshot,
747
+ pointLights: ExtractedLights['point'],
748
+ spotLights: ExtractedLights['spot'],
749
+ profilePhase?: RecordProfileRunner,
750
+ useGpuMembership = false,
751
+ membershipBindGroupLayout: BindGroupLayout | null = null,
752
+ ): void {
753
+ const hdrpLightCount = pointLights.length + spotLights.length;
754
+ const ssaoEnabled = frameState.installedPipelineConfig?.ssao?.enabled === true;
755
+ // ClusterUniform also carries the HDRP SSAO intensity. Keep the upload
756
+ // alive for a directional-light-only SSAO scene; the previous punctual-light
757
+ // gate left that lane at its zero-initialized intensity and made SSAO config
758
+ // changes visually inert.
759
+ if (!frameState.isHdrpActive || (hdrpLightCount === 0 && !ssaoEnabled)) return;
760
+ const HDRP_LIGHT_BUDGET = 256;
761
+ let effectivePointLights = pointLights;
762
+ let effectiveSpotLights = spotLights;
763
+ if (hdrpLightCount > HDRP_LIGHT_BUDGET) {
764
+ if (!frameState.hdrpOncePerFrameFired.has('hdrp-light-budget-exceeded')) {
765
+ frameState.hdrpOncePerFrameFired.add('hdrp-light-budget-exceeded');
766
+ internals.errorRegistry.fire(
767
+ new HdrpLightBudgetExceededError(hdrpLightCount, HDRP_LIGHT_BUDGET),
768
+ );
769
+ }
770
+ if (pointLights.length >= HDRP_LIGHT_BUDGET) {
771
+ effectivePointLights = pointLights.slice(0, HDRP_LIGHT_BUDGET);
772
+ effectiveSpotLights = [];
773
+ } else {
774
+ effectivePointLights = pointLights;
775
+ effectiveSpotLights = spotLights.slice(0, HDRP_LIGHT_BUDGET - pointLights.length);
776
+ }
777
+ }
778
+ const effectiveLightCount = effectivePointLights.length + effectiveSpotLights.length;
779
+ const configuredClusterGrid =
780
+ frameState.installedPipelineConfig?.clusterGrid ?? DEFAULT_CLUSTER_GRID;
781
+ let gpuMembership = useGpuMembership && membershipBindGroupLayout !== null;
782
+ if (
783
+ gpuMembership &&
784
+ membershipBindGroupLayout !== null &&
785
+ frameState.hdrpClusterMembershipBindGroup === null
786
+ ) {
787
+ const hdrpBuffers = getOrCreateHdrpBuffers(internals, configuredClusterGrid);
788
+ if (hdrpBuffers !== null) {
789
+ frameState.hdrpClusterMembershipBindGroup = createHdrpClusterMembershipBindGroup(
790
+ internals,
791
+ hdrpBuffers,
792
+ membershipBindGroupLayout,
793
+ );
794
+ }
795
+ gpuMembership = frameState.hdrpClusterMembershipBindGroup !== null;
796
+ }
797
+
798
+ let attemptedTotal = 0;
799
+ let overflow = false;
800
+ const { clusterGrid, gridX, gridY, gridZ, clusterGridBuf, lightIndexListBuf, lightIndexCount } =
801
+ runHdrpClusterProfilePhase(profilePhase, 'record/scene-state/hdrp-cluster/binner', () => {
802
+ const binnerProfile: ClusterBinProfileRunner | undefined =
803
+ profilePhase === undefined
804
+ ? undefined
805
+ : <T>(phase: ClusterBinProfilePhase, action: () => T): T =>
806
+ runHdrpClusterProfilePhase(
807
+ profilePhase,
808
+ `record/scene-state/hdrp-cluster/binner/${phase}` as RenderHdrpClusterPhase,
809
+ action,
810
+ );
811
+ const {
812
+ hdrpLights,
813
+ clusterGrid,
814
+ gridX,
815
+ gridY,
816
+ gridZ,
817
+ clusterGridBuf,
818
+ lightIndexListBuf,
819
+ projMatrix,
820
+ viewMatrix,
821
+ } = runHdrpClusterProfilePhase(
822
+ profilePhase,
823
+ 'record/scene-state/hdrp-cluster/binner/input-preparation',
824
+ () => {
825
+ const hdrpLights: Array<{ position: Float32Array; range: number }> = [];
826
+ for (const pl of effectivePointLights) {
827
+ const range =
828
+ Number.isFinite(pl.invRangeSquared) && pl.invRangeSquared > 0
829
+ ? Math.sqrt(1 / pl.invRangeSquared)
830
+ : 1000;
831
+ hdrpLights.push({ position: pl.position as unknown as Float32Array, range });
832
+ }
833
+ for (const sl of effectiveSpotLights) {
834
+ const range =
835
+ Number.isFinite(sl.invRangeSquared) && sl.invRangeSquared > 0
836
+ ? Math.sqrt(1 / sl.invRangeSquared)
837
+ : 1000;
838
+ hdrpLights.push({ position: sl.position as unknown as Float32Array, range });
839
+ }
840
+
841
+ const clusterGrid =
842
+ frameState.installedPipelineConfig?.clusterGrid ?? DEFAULT_CLUSTER_GRID;
843
+ const gridX = clusterGrid.x;
844
+ const gridY = clusterGrid.y;
845
+ const gridZ = clusterGrid.z;
846
+ const clusterCount = gridX * gridY * gridZ;
847
+
848
+ const projMatrix = computeProjectionMatrix(camera);
849
+ const viewMatrix = computeViewMatrix(camera);
850
+
851
+ const clusterGridBuf =
852
+ frameState.hdrpClusterGridScratch === null ||
853
+ frameState.hdrpClusterGridScratch.length < clusterCount * 2
854
+ ? new Uint32Array(clusterCount * 2)
855
+ : frameState.hdrpClusterGridScratch;
856
+ frameState.hdrpClusterGridScratch = clusterGridBuf;
857
+ const lightIndexListBuf =
858
+ frameState.hdrpLightIndexListScratch === null ||
859
+ frameState.hdrpLightIndexListScratch.length < LIGHT_INDEX_LIST_CAPACITY
860
+ ? new Uint32Array(LIGHT_INDEX_LIST_CAPACITY)
861
+ : frameState.hdrpLightIndexListScratch;
862
+ frameState.hdrpLightIndexListScratch = lightIndexListBuf;
863
+
864
+ return {
865
+ hdrpLights,
866
+ clusterGrid,
867
+ gridX,
868
+ gridY,
869
+ gridZ,
870
+ clusterGridBuf,
871
+ lightIndexListBuf,
872
+ projMatrix,
873
+ viewMatrix,
874
+ };
875
+ },
876
+ );
877
+
878
+ const binResult = runHdrpClusterProfilePhase(
879
+ profilePhase,
880
+ 'record/scene-state/hdrp-cluster/binner/bin-core',
881
+ () =>
882
+ bin(
883
+ hdrpLights as unknown as Array<{
884
+ position: import('@forgeax/engine-math').Vec3;
885
+ range: number;
886
+ }>,
887
+ viewMatrix,
888
+ projMatrix,
889
+ { x: gridX, y: gridY, z: gridZ },
890
+ camera.near,
891
+ camera.far,
892
+ clusterGridBuf,
893
+ lightIndexListBuf,
894
+ LIGHT_INDEX_LIST_CAPACITY,
895
+ frameState.hdrpClusterBinScratch,
896
+ binnerProfile,
897
+ { writeMembership: !gpuMembership },
898
+ ),
899
+ );
900
+
901
+ if (!binResult.ok && !frameState.hdrpOncePerFrameFired.has('hdrp-index-list-overflow')) {
902
+ frameState.hdrpOncePerFrameFired.add('hdrp-index-list-overflow');
903
+ const detail = binResult.error.detail;
904
+ internals.errorRegistry.fire(
905
+ new HdrpIndexListOverflowError(detail.actual, detail.capacity),
906
+ );
907
+ }
908
+
909
+ // Falsify injection point: FORGEAX_HDRP_FALSIFY_CLUSTER_GRID_ZERO
910
+ // zeroes the cluster_grid buffer so every fragment culls every light.
911
+ // Used by hello-hdrp-lighting smoke FALSIFY=cluster-grid-zero to
912
+ // prove the smoke has discriminability (must FAIL vs baseline).
913
+ // Read process via globalThis to keep this file @types/node-free.
914
+ const envFalsify = (globalThis as { process?: { env?: Record<string, string | undefined> } })
915
+ .process?.env;
916
+ if (envFalsify?.FORGEAX_HDRP_FALSIFY_CLUSTER_GRID_ZERO) {
917
+ clusterGridBuf.fill(0);
918
+ }
919
+
920
+ attemptedTotal = binResult.ok ? binResult.value : binResult.error.detail.actual;
921
+ overflow = !binResult.ok;
922
+ return {
923
+ clusterGrid,
924
+ gridX,
925
+ gridY,
926
+ gridZ,
927
+ clusterGridBuf,
928
+ lightIndexListBuf,
929
+ lightIndexCount: binResult.ok ? binResult.value : 0,
930
+ };
931
+ });
932
+
933
+ if (internals.membershipTiming?.usesCpuControl() === true) {
934
+ const clusterValueCount = gridX * gridY * gridZ * 2;
935
+ internals.membershipTiming.recordMembershipOutput({
936
+ schemaVersion: 1,
937
+ lightCount: effectiveLightCount,
938
+ grid: { x: gridX, y: gridY, z: gridZ },
939
+ clusterOffsetsAndCounts: Array.from(clusterGridBuf.subarray(0, clusterValueCount)),
940
+ attemptedTotal,
941
+ writtenTotal: lightIndexCount,
942
+ capacity: LIGHT_INDEX_LIST_CAPACITY,
943
+ overflow,
944
+ lightIndexPrefix: Array.from(lightIndexListBuf.subarray(0, lightIndexCount)),
945
+ });
946
+ }
947
+
948
+ const hdrpPayload = runHdrpClusterProfilePhase(
949
+ profilePhase,
950
+ 'record/scene-state/hdrp-cluster/payload-packing',
951
+ () => {
952
+ const hdrpBuffers = getOrCreateHdrpBuffers(internals, clusterGrid);
953
+ if (hdrpBuffers === null) return null;
954
+
955
+ const lightCapacity = hdrpBuffers.storageBuffer ? 256 : HDRP_UNIFORM_LIGHT_CAPACITY;
956
+ const lightDataPayload = new Float32Array(lightCapacity * 16);
957
+ let slotIdx = 0;
958
+ for (const pl of effectivePointLights) {
959
+ if (slotIdx >= lightCapacity) break;
960
+ // feat-20260612-point-light-shadows-urp-hdrp M4 / T-M4-4
961
+ // (plan-strategy §D-8): thread the optional shadow info through
962
+ // packLightSlot. PointLightSnapshot.shadowAtlasLayer is set by
963
+ // extract's join pass when the entity carries PointLightShadow;
964
+ // sentinel -1 means no shadow (unshadowed evalPoint path).
965
+ const layer = pl.shadowAtlasLayer;
966
+ const packed =
967
+ layer !== undefined &&
968
+ layer >= 0 &&
969
+ pl.shadowNear !== undefined &&
970
+ pl.shadowFar !== undefined
971
+ ? packLightSlot(pl, {
972
+ shadowAtlasLayer: layer,
973
+ near: pl.shadowNear,
974
+ far: pl.shadowFar,
975
+ })
976
+ : packLightSlot(pl);
977
+ lightDataPayload.set(packed, slotIdx * 16);
978
+ slotIdx += 1;
979
+ }
980
+ for (const sl of effectiveSpotLights) {
981
+ if (slotIdx >= lightCapacity) break;
982
+ // M2: the same 64B bytes serve storage and uniform fallback. The
983
+ // packer reads SpotLightSnapshot.shadowAtlasTile directly; no second
984
+ // tile allocation or transport-specific projection is allowed.
985
+ const packed = packLightSlot(sl);
986
+ lightDataPayload.set(packed, slotIdx * 16);
987
+ slotIdx += 1;
988
+ }
989
+
990
+ // scope-amend-webgl2-ubo: SSAO intensity is folded into the
991
+ // cluster_uniform .w lane (formerly pad), removing the dedicated
992
+ // @binding(9) UBO that pushed fragment-stage UBO count past
993
+ // WebGL2's max_uniform_buffers_per_shader_stage=11. Disabled-SSAO
994
+ // path writes 0 so `mix(1.0, ssao*ao, 0.0) = 1.0` in the lighting
995
+ // shader (no PSO recompile across enable/disable).
996
+ const clusterSsaoConfig = frameState.installedPipelineConfig?.ssao;
997
+ const clusterSsaoIntensity =
998
+ clusterSsaoConfig !== undefined && clusterSsaoConfig.enabled === true
999
+ ? (clusterSsaoConfig.intensity ?? 1.0)
1000
+ : 0;
1001
+ const clusterUniformPayload = packClusterUniform(
1002
+ { x: gridX, y: gridY, z: gridZ },
1003
+ camera.near,
1004
+ camera.far,
1005
+ clusterSsaoIntensity,
1006
+ Math.min(effectivePointLights.length + effectiveSpotLights.length, lightCapacity),
1007
+ lightCapacity,
1008
+ );
1009
+
1010
+ return {
1011
+ hdrpBuffers,
1012
+ lightDataUploadPayload: lightDataPayload.subarray(0, slotIdx * 16),
1013
+ clusterUniformPayload: new Uint8Array(clusterUniformPayload),
1014
+ };
1015
+ },
1016
+ );
1017
+
1018
+ runHdrpClusterProfilePhase(profilePhase, 'record/scene-state/hdrp-cluster/buffer-upload', () => {
1019
+ if (hdrpPayload !== null) {
1020
+ const { hdrpBuffers, lightDataUploadPayload, clusterUniformPayload } = hdrpPayload;
1021
+ if (gpuMembership) {
1022
+ internals.membershipTiming?.recordGpuMembershipSource({
1023
+ clusterGridBuffer: hdrpBuffers.clusterGridBuffer,
1024
+ clusterGridBytes: gridX * gridY * gridZ * 2 * 4,
1025
+ lightIndexListBuffer: hdrpBuffers.lightIndexListBuffer,
1026
+ lightIndexListBytes: Math.max(4, lightIndexCount * 4),
1027
+ lightCount: effectiveLightCount,
1028
+ grid: { x: gridX, y: gridY, z: gridZ },
1029
+ attemptedTotal,
1030
+ writtenTotal: lightIndexCount,
1031
+ capacity: LIGHT_INDEX_LIST_CAPACITY,
1032
+ overflow,
1033
+ });
1034
+ }
1035
+ const lightDataUpload = internals.device.queue.writeBuffer(
1036
+ hdrpBuffers.lightDataBuffer,
1037
+ 0,
1038
+ lightDataUploadPayload,
1039
+ );
1040
+ if (!lightDataUpload.ok) internals.errorRegistry.fire(lightDataUpload.error);
1041
+
1042
+ if (hdrpBuffers.storageBuffer) {
1043
+ if (gpuMembership) {
1044
+ const lightBoundsUpload = internals.device.queue.writeBuffer(
1045
+ hdrpBuffers.lightBoundsBuffer,
1046
+ 0,
1047
+ frameState.hdrpClusterBinScratch.lightBounds.subarray(0, effectiveLightCount * 6),
1048
+ );
1049
+ if (!lightBoundsUpload.ok) internals.errorRegistry.fire(lightBoundsUpload.error);
1050
+ }
1051
+ const clusterGridUpload = internals.device.queue.writeBuffer(
1052
+ hdrpBuffers.clusterGridBuffer,
1053
+ 0,
1054
+ clusterGridBuf.subarray(0, gridX * gridY * gridZ * 2),
1055
+ );
1056
+ if (!clusterGridUpload.ok) internals.errorRegistry.fire(clusterGridUpload.error);
1057
+
1058
+ if (!gpuMembership && lightIndexCount > 0) {
1059
+ const lightIndexListUpload = internals.device.queue.writeBuffer(
1060
+ hdrpBuffers.lightIndexListBuffer,
1061
+ 0,
1062
+ lightIndexListBuf.subarray(0, lightIndexCount),
1063
+ );
1064
+ if (!lightIndexListUpload.ok) internals.errorRegistry.fire(lightIndexListUpload.error);
1065
+ }
1066
+ }
1067
+
1068
+ const clusterUniformUpload = internals.device.queue.writeBuffer(
1069
+ hdrpBuffers.clusterUniformBuffer,
1070
+ 0,
1071
+ clusterUniformPayload,
1072
+ );
1073
+ if (!clusterUniformUpload.ok) internals.errorRegistry.fire(clusterUniformUpload.error);
1074
+ }
1075
+
1076
+ // ── feat-20260612-hdrp-ssao M1 / w6 + M7 / w33 ───────────────
1077
+ // Per-frame SSAO uniform write (plan-strategy D-1 + D-C):
1078
+ // view + projection + inverseProjection at offsets 0/64/128 +
1079
+ // intensityPad (vec4 — x=intensity, yzw padding) at offset 192;
1080
+ // total 256 B (matches host SSAO_UNIFORM_BYTES + WGSL struct).
1081
+ // Single writeBuffer covers all four fields so one queue entry
1082
+ // updates the entire UBO.
1083
+ // Separate from View UBO (592 B invariant); does not affect
1084
+ // material PSO bytecode.
1085
+ //
1086
+ // Writes when HDRP is active; config.ssao?.enabled guard comes in
1087
+ // M4 / w19 after the config.ssao type narrowing is added.
1088
+ {
1089
+ const ssaoBufs = getOrCreateSsaoBuffers(internals);
1090
+ if (ssaoBufs !== null) {
1091
+ const sProj = computeProjectionMatrix(camera);
1092
+ const sView = computeViewMatrix(camera);
1093
+ // inverseProjection = inverse(projection): NDC -> view-space.
1094
+ const invProjOnly = mat4.create();
1095
+ mat4.invert(invProjOnly, sProj);
1096
+
1097
+ // Float32Array of 64 (256 B): 3 mat4 (48) + intensityPad vec4 (4)
1098
+ // + 12 trailing padding floats. We only fill the declared region.
1099
+ const ssaoUniformPayload = new Float32Array(64);
1100
+ ssaoUniformPayload.set(sView as unknown as Float32Array, 0);
1101
+ ssaoUniformPayload.set(sProj as unknown as Float32Array, 16);
1102
+ ssaoUniformPayload.set(invProjOnly as unknown as Float32Array, 32);
1103
+ // intensityPad carries intensity, radius, and bias in x/y/z. The
1104
+ // graph calc pass writes the same payload again with any custom
1105
+ // addSsaoPasses params; this early write keeps the shared UBO valid
1106
+ // for the typed HDRP route before its fullscreen pass executes.
1107
+ const ssaoConfig = frameState.installedPipelineConfig?.ssao;
1108
+ const parameters = getSsaoParameters(
1109
+ ssaoConfig !== undefined && ssaoConfig.enabled === true ? ssaoConfig : undefined,
1110
+ );
1111
+ ssaoUniformPayload[48] = parameters.intensity;
1112
+ ssaoUniformPayload[49] = parameters.radius;
1113
+ ssaoUniformPayload[50] = parameters.bias;
1114
+
1115
+ const ssaoUniformRes = internals.device.queue.writeBuffer(
1116
+ ssaoBufs.uniformBuffer,
1117
+ 0,
1118
+ ssaoUniformPayload,
1119
+ );
1120
+ if (!ssaoUniformRes.ok) internals.errorRegistry.fire(ssaoUniformRes.error);
1121
+ }
1122
+ }
1123
+ });
1124
+ }
1125
+
1126
+ /**
1127
+ * feat-20260704 M3/w18: resolve `tonemapActive` + `skyboxActive` for this
1128
+ * frame, extracted verbatim from `recordFrame`.
1129
+ *
1130
+ * feat-20260519-tonemap-reinhard-mvp: tonemap is active when the camera carries
1131
+ * `tonemap !== 'none'` (routes geometry into the HDR offscreen target + a
1132
+ * fullscreen tonemap pass). feat-20260531-skybox-env-background M2 / w9: skybox
1133
+ * is active only when a SkyboxBackground entity is present AND tonemap is active
1134
+ * (hdrColor is only allocated on the tonemap path). M3 / w20: once-warn when
1135
+ * tonemap is 'none' but a skybox exists (config issue, not resource-timing —
1136
+ * no structured error). M3 / w18: skybox degrades to clear-colour for a frame
1137
+ * while its cubemap view is not yet resident (lazy equirect projection pending
1138
+ * / failed; the lazy trigger owns the fire-once-on-failed error).
1139
+ *
1140
+ * @internal
1141
+ */
1142
+ export function resolveSkyboxActive(
1143
+ internals: RenderSystemInternals,
1144
+ frameState: RenderFrameState,
1145
+ camera: CameraSnapshot,
1146
+ skybox: SkyboxSnapshot | undefined,
1147
+ ): { tonemapActive: boolean; skyboxActive: boolean } {
1148
+ const tonemapActive = camera.tonemap !== 'none';
1149
+ let skyboxActive = skybox !== undefined && tonemapActive;
1150
+ // feat-20260531-skybox-env-background M3 / w20: once-warn when camera
1151
+ // tonemap is 'none' but a SkyboxBackground entity exists. The skybox
1152
+ // pass requires the HDR render target allocated by the tonemap path;
1153
+ // without it the skybox is skipped for this frame. This is a config
1154
+ // issue, not a resource-timing issue -- don't fire a structured error
1155
+ // (plan-strategy D-2 NOTE, charter P3 non-silent).
1156
+ if (skybox !== undefined && !tonemapActive && !frameState.warnedSkyboxTonemapNone) {
1157
+ frameState.warnedSkyboxTonemapNone = true;
1158
+ console.warn(
1159
+ '[forgeax] SkyboxBackground: skybox requires tonemap active (camera.tonemap !== "none") to write HDR target. The skybox pass will be skipped for this frame.',
1160
+ );
1161
+ }
1162
+ // feat-20260531-skybox-env-background M3 / w18: degradation when cubemap
1163
+ // GPU view is not ready. getCubemapGpuView returns undefined if the
1164
+ // equirect-to-cube upload has not completed yet.
1165
+ if (skybox !== undefined && tonemapActive) {
1166
+ // biome-ignore lint/suspicious/noExplicitAny: branded Handle cast from snapshot raw number
1167
+ const cubemapView = internals.gpuStore.getCubemapGpuView(skybox.equirectHandle as any);
1168
+ if (cubemapView === undefined) {
1169
+ // The skybox reuses the Skylight's equirect handle; the cubemap
1170
+ // projection is driven lazily by the single trigger in `driveLazy
1171
+ // EquirectProjection` above (it owns the fire-and-forget launch AND the
1172
+ // fire-once-on-failed structured error). While the projection is
1173
+ // pending or has failed the cube view is not resident, so the skybox
1174
+ // pass degrades to the clear-colour background for this frame
1175
+ // (charter P3: it activates once the shared projection flips to
1176
+ // 'ready'). No error is fired here -- 'pending' is a normal transition
1177
+ // (firing per frame would flood the channel), and 'failed' is reported
1178
+ // once by the lazy trigger. (feat-20260630 M3 / w18.)
1179
+ skyboxActive = false;
1180
+ }
1181
+ }
1182
+ return { tonemapActive, skyboxActive };
1183
+ }