@forgeax/engine-render 0.1.4 → 0.1.6

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 (918) hide show
  1. package/README.md +130 -641
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +2 -0
  4. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +1 -0
  5. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +2 -0
  6. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +1 -0
  7. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +2 -0
  8. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +1 -0
  9. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +1 -1
  10. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +6 -0
  11. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +1 -1
  12. package/dist/{gpu-driven/view-reference.d.ts → __tests__/gpu-driven-view-reference.d.ts} +4 -4
  13. package/dist/__tests__/gpu-driven-view-reference.d.ts.map +1 -0
  14. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +1 -1
  15. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +2 -0
  16. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +1 -0
  17. package/dist/__tests__/morph-feature-plan.unit.test.d.ts +2 -0
  18. package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +1 -0
  19. package/dist/__tests__/render-feature-plan.test-d.d.ts +2 -0
  20. package/dist/__tests__/render-feature-plan.test-d.d.ts.map +1 -0
  21. package/dist/__tests__/render-feature-plan.unit.test.d.ts +2 -0
  22. package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +1 -0
  23. package/dist/__tests__/ssao-config.unit.test.d.ts +2 -0
  24. package/dist/__tests__/ssao-config.unit.test.d.ts.map +1 -0
  25. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +2 -0
  26. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +1 -0
  27. package/dist/__tests__/standard-descriptors.test-d.d.ts +2 -0
  28. package/dist/__tests__/standard-descriptors.test-d.d.ts.map +1 -0
  29. package/dist/__tests__/standard-pipeline.dawn.test.d.ts +2 -0
  30. package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +1 -0
  31. package/dist/__tests__/standard-pipeline.integration.test.d.ts +2 -0
  32. package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +1 -0
  33. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +2 -0
  34. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +1 -0
  35. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +2 -0
  36. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +1 -0
  37. package/dist/{renderer/backend-selection.d.ts → assembly/backend-contract.d.ts} +15 -4
  38. package/dist/assembly/backend-contract.d.ts.map +1 -0
  39. package/dist/assembly/factory.d.ts +207 -0
  40. package/dist/assembly/factory.d.ts.map +1 -0
  41. package/dist/assembly/host-contract.d.ts +84 -0
  42. package/dist/assembly/host-contract.d.ts.map +1 -0
  43. package/dist/{renderer → assembly}/material/assembly.d.ts +0 -1
  44. package/dist/{renderer → assembly}/material/assembly.d.ts.map +1 -1
  45. package/dist/assembly/material/pipeline-projection.d.ts +30 -0
  46. package/dist/assembly/material/pipeline-projection.d.ts.map +1 -0
  47. package/dist/authoring.d.ts +10 -11
  48. package/dist/authoring.d.ts.map +1 -1
  49. package/dist/authoring.mjs +25 -3
  50. package/dist/authoring.mjs.map +1 -1
  51. package/dist/chunk-CQXZC5XI.mjs +182 -0
  52. package/dist/chunk-CQXZC5XI.mjs.map +1 -0
  53. package/dist/chunk-QC4VW3XJ.mjs +79 -0
  54. package/dist/chunk-QC4VW3XJ.mjs.map +1 -0
  55. package/dist/chunk-SCRSAK5B.mjs +480 -0
  56. package/dist/chunk-SCRSAK5B.mjs.map +1 -0
  57. package/dist/components/__tests__/schema-contract.unit.test.d.ts +2 -0
  58. package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +1 -0
  59. package/dist/components/glyph-text.d.ts +1 -1
  60. package/dist/components/glyph-text.d.ts.map +1 -1
  61. package/dist/components/index.d.ts +2 -2
  62. package/dist/components/index.d.ts.map +1 -1
  63. package/dist/components/instances.d.ts +1 -1
  64. package/dist/components/instances.d.ts.map +1 -1
  65. package/dist/components/light-helpers.d.ts +1 -1
  66. package/dist/components/light-helpers.d.ts.map +1 -1
  67. package/dist/components/mesh-filter.d.ts +7 -7
  68. package/dist/components/mesh-filter.d.ts.map +1 -1
  69. package/dist/components/scene-instance.d.ts +11 -11
  70. package/dist/components/skybox-background.d.ts +56 -0
  71. package/dist/components/skybox-background.d.ts.map +1 -0
  72. package/dist/components/skylight.d.ts +55 -0
  73. package/dist/components/skylight.d.ts.map +1 -0
  74. package/dist/components/sprite-animation.d.ts +2 -3
  75. package/dist/components/sprite-animation.d.ts.map +1 -1
  76. package/dist/components/sprite-instances.d.ts +1 -1
  77. package/dist/components/sprite-playback-mode.d.ts +6 -1
  78. package/dist/components/sprite-playback-mode.d.ts.map +1 -1
  79. package/dist/components/sprite-region-override.d.ts +2 -3
  80. package/dist/components/sprite-region-override.d.ts.map +1 -1
  81. package/dist/components/tile-layer.d.ts +5 -0
  82. package/dist/components/tile-layer.d.ts.map +1 -1
  83. package/dist/construct-renderer.d.ts +18 -1
  84. package/dist/construct-renderer.d.ts.map +1 -1
  85. package/dist/construct-renderer.mjs +27008 -4
  86. package/dist/construct-renderer.mjs.map +1 -1
  87. package/dist/debug-draw-glue.d.ts +2 -53
  88. package/dist/debug-draw-glue.d.ts.map +1 -1
  89. package/dist/device/device-scope.d.ts +83 -0
  90. package/dist/device/device-scope.d.ts.map +1 -0
  91. package/dist/{gpu-resource-store.d.ts → device/gpu-residency.d.ts} +91 -48
  92. package/dist/device/gpu-residency.d.ts.map +1 -0
  93. package/dist/device/resource-types.d.ts +8 -0
  94. package/dist/device/resource-types.d.ts.map +1 -0
  95. package/dist/engine-metrics.d.ts +2 -2
  96. package/dist/engine-metrics.d.ts.map +1 -1
  97. package/dist/errors/recover.d.ts +28 -1
  98. package/dist/errors/recover.d.ts.map +1 -1
  99. package/dist/errors/render.d.ts +249 -258
  100. package/dist/errors/render.d.ts.map +1 -1
  101. package/dist/features/fullscreen.d.ts +19 -0
  102. package/dist/features/fullscreen.d.ts.map +1 -0
  103. package/dist/features/host.d.ts +32 -26
  104. package/dist/features/host.d.ts.map +1 -1
  105. package/dist/features/morph/morph-feature.d.ts +39 -5
  106. package/dist/features/morph/morph-feature.d.ts.map +1 -1
  107. package/dist/features/plan.d.ts +182 -0
  108. package/dist/features/plan.d.ts.map +1 -0
  109. package/dist/features/prepared-gpu-work.d.ts +21 -17
  110. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  111. package/dist/features/prepared-graphics-store.d.ts +2 -1
  112. package/dist/features/prepared-graphics-store.d.ts.map +1 -1
  113. package/dist/features/prepared-graphics.d.ts +11 -21
  114. package/dist/features/prepared-graphics.d.ts.map +1 -1
  115. package/dist/features/render-graph-compute.d.ts +2 -2
  116. package/dist/features/render-graph-compute.d.ts.map +1 -1
  117. package/dist/features/render-graph-contribution.d.ts +4 -7
  118. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  119. package/dist/features/render-graph-raster.d.ts +2 -2
  120. package/dist/features/render-graph-raster.d.ts.map +1 -1
  121. package/dist/features/render-graph-resources.d.ts +6 -6
  122. package/dist/features/render-graph-resources.d.ts.map +1 -1
  123. package/dist/features/targets.d.ts +5 -5
  124. package/dist/features/targets.d.ts.map +1 -1
  125. package/dist/features/types.d.ts +11 -190
  126. package/dist/features/types.d.ts.map +1 -1
  127. package/dist/features/vocabulary.d.ts +14 -0
  128. package/dist/features/vocabulary.d.ts.map +1 -0
  129. package/dist/fullscreen-post-process-pass.d.ts +4 -25
  130. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  131. package/dist/glyph-text-layout-system.d.ts +3 -2
  132. package/dist/glyph-text-layout-system.d.ts.map +1 -1
  133. package/dist/gpu-driven/batch-topology.d.ts +6 -75
  134. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  135. package/dist/gpu-driven/production-raster.d.ts +13 -112
  136. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  137. package/dist/gpu-driven/view-gpu.d.ts +10 -66
  138. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  139. package/dist/gpu-resource.d.ts +3 -3
  140. package/dist/gpu-scene-schema.d.ts +1 -94
  141. package/dist/gpu-scene-schema.d.ts.map +1 -1
  142. package/dist/gpu-scene.d.ts +7 -33
  143. package/dist/gpu-scene.d.ts.map +1 -1
  144. package/dist/hdrp-buffers.d.ts +3 -53
  145. package/dist/hdrp-buffers.d.ts.map +1 -1
  146. package/dist/ibl/IblPipelineCache.d.ts +74 -180
  147. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  148. package/dist/ibl/skylight-bind-group.d.ts +1 -1
  149. package/dist/index.d.ts +13 -43
  150. package/dist/index.d.ts.map +1 -1
  151. package/dist/index.mjs +165 -3
  152. package/dist/index.mjs.map +1 -1
  153. package/dist/inspection-types.d.ts +69 -0
  154. package/dist/inspection-types.d.ts.map +1 -0
  155. package/dist/instance-buffer-cache.d.ts +1 -4
  156. package/dist/instance-buffer-cache.d.ts.map +1 -1
  157. package/dist/internal.d.ts +1 -73
  158. package/dist/internal.d.ts.map +1 -1
  159. package/dist/internal.mjs +1 -43
  160. package/dist/internal.mjs.map +1 -1
  161. package/dist/lifecycle.d.ts +36 -2
  162. package/dist/lifecycle.d.ts.map +1 -1
  163. package/dist/materials.d.ts +0 -3
  164. package/dist/materials.d.ts.map +1 -1
  165. package/dist/mesh-material-bindings.d.ts +0 -1
  166. package/dist/mesh-material-bindings.d.ts.map +1 -1
  167. package/dist/pbr-pipeline.d.ts +75 -29
  168. package/dist/pbr-pipeline.d.ts.map +1 -1
  169. package/dist/pipeline/standard-forward-lane.d.ts +5 -0
  170. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -0
  171. package/dist/pipeline/standard-pipeline.d.ts +31 -0
  172. package/dist/pipeline/standard-pipeline.d.ts.map +1 -0
  173. package/dist/pipeline/standard-profile.d.ts +40 -0
  174. package/dist/pipeline/standard-profile.d.ts.map +1 -0
  175. package/dist/pipeline-builder.d.ts +3 -3
  176. package/dist/pipeline-builder.d.ts.map +1 -1
  177. package/dist/pipeline-spec-types.d.ts +24 -0
  178. package/dist/pipeline-spec-types.d.ts.map +1 -0
  179. package/dist/pipeline-spec.d.ts +16 -155
  180. package/dist/pipeline-spec.d.ts.map +1 -1
  181. package/dist/plugin.d.ts +1 -14
  182. package/dist/plugin.d.ts.map +1 -1
  183. package/dist/post-process-errors.d.ts +18 -18
  184. package/dist/post-process-errors.d.ts.map +1 -1
  185. package/dist/prepare/prepared-graphics-resolver.d.ts +2 -5
  186. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  187. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +2 -0
  188. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +1 -0
  189. package/dist/record/frame-lighting.d.ts +7 -73
  190. package/dist/record/frame-lighting.d.ts.map +1 -1
  191. package/dist/record/frame-snapshot.d.ts +44 -44
  192. package/dist/record/frame-snapshot.d.ts.map +1 -1
  193. package/dist/record/frame-targets.d.ts +5 -38
  194. package/dist/record/frame-targets.d.ts.map +1 -1
  195. package/dist/record/frame.d.ts +64 -52
  196. package/dist/record/frame.d.ts.map +1 -1
  197. package/dist/record/helpers.d.ts +3 -2
  198. package/dist/record/helpers.d.ts.map +1 -1
  199. package/dist/record/main-pass-geometry.d.ts +5 -4
  200. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  201. package/dist/record/main-pass-material.d.ts +90 -59
  202. package/dist/record/main-pass-material.d.ts.map +1 -1
  203. package/dist/record/main-pass-sprite-draws.d.ts +28 -3
  204. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  205. package/dist/record/main-pass.d.ts +1 -1
  206. package/dist/record/main-pass.d.ts.map +1 -1
  207. package/dist/record/mesh-ssbo.d.ts +276 -3
  208. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  209. package/dist/record/render-context.d.ts +235 -0
  210. package/dist/record/render-context.d.ts.map +1 -0
  211. package/dist/record/shadow-pass.d.ts +15 -88
  212. package/dist/record/shadow-pass.d.ts.map +1 -1
  213. package/dist/record/skybox-post-pass.d.ts +1 -1
  214. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  215. package/dist/record/typed-frame-graph.d.ts +29 -7
  216. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  217. package/dist/record/view-ubo.d.ts +3 -3
  218. package/dist/record/view-ubo.d.ts.map +1 -1
  219. package/dist/render-contract.d.ts +416 -0
  220. package/dist/render-contract.d.ts.map +1 -0
  221. package/dist/render-data.d.ts.map +1 -1
  222. package/dist/render-graph-primitives.d.ts +14 -362
  223. package/dist/render-graph-primitives.d.ts.map +1 -1
  224. package/dist/render-pipeline.d.ts +25 -64
  225. package/dist/render-pipeline.d.ts.map +1 -1
  226. package/dist/render-system-extract.d.ts +107 -338
  227. package/dist/render-system-extract.d.ts.map +1 -1
  228. package/dist/render-system.d.ts +21 -713
  229. package/dist/render-system.d.ts.map +1 -1
  230. package/dist/scene/render-scene-types.d.ts +58 -0
  231. package/dist/scene/render-scene-types.d.ts.map +1 -0
  232. package/dist/scene/render-scene.d.ts +105 -0
  233. package/dist/scene/render-scene.d.ts.map +1 -0
  234. package/dist/scene-instances/post-spawn-resolve-joints.d.ts +2 -5
  235. package/dist/scene-instances/post-spawn-resolve-joints.d.ts.map +1 -1
  236. package/dist/ssao-buffers.d.ts +22 -3
  237. package/dist/ssao-buffers.d.ts.map +1 -1
  238. package/dist/systems/skin-palette-allocator.d.ts +2 -4
  239. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  240. package/dist/systems/skin-palette-types.d.ts +14 -0
  241. package/dist/systems/skin-palette-types.d.ts.map +1 -0
  242. package/dist/systems/transparent-sort-config.d.ts +23 -2
  243. package/dist/systems/transparent-sort-config.d.ts.map +1 -1
  244. package/dist/tilemap-chunk-extract-system.d.ts +4 -3
  245. package/dist/tilemap-chunk-extract-system.d.ts.map +1 -1
  246. package/dist/typed-render-graph-primitives.d.ts +2 -4
  247. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  248. package/dist/typed-shadow-passes.d.ts +3 -3
  249. package/dist/typed-shadow-passes.d.ts.map +1 -1
  250. package/package.json +23 -23
  251. package/src/__tests__/backend-selection-rhi-capture.test-d.ts +1 -1
  252. package/src/__tests__/callback-inference.test-d.ts +6 -3
  253. package/src/__tests__/cluster-grid-default-surface.unit.test.ts +7 -4
  254. package/src/__tests__/construct-renderer-identity.unit.test.ts +15 -2
  255. package/src/__tests__/device-scope-lifecycle.unit.test.ts +151 -0
  256. package/src/__tests__/device-scope-stale-matrix.unit.test.ts +42 -0
  257. package/src/__tests__/direct-extract-consumer-contract.test-d.ts +8 -19
  258. package/src/__tests__/direct-light-snapshot.unit.test.ts +3 -13
  259. package/src/__tests__/factory-contract.integration.test.ts +158 -209
  260. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +1 -4
  261. package/src/__tests__/frame-observation.contract.test.ts +17 -8
  262. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +32 -0
  263. package/src/__tests__/glyph-text-layout-recovery.unit.test.ts +6 -11
  264. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +9 -16
  265. package/src/__tests__/gpu-driven-production.integration.test.ts +32 -205
  266. package/src/__tests__/gpu-driven-scaling.unit.test.ts +4 -7
  267. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +87 -8
  268. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +170 -8
  269. package/src/{gpu-driven/view-reference.ts → __tests__/gpu-driven-view-reference.ts} +4 -3
  270. package/src/__tests__/gpu-driven-view.browser.test.ts +12 -1
  271. package/src/__tests__/gpu-driven-view.dawn.test.ts +12 -1
  272. package/src/__tests__/gpu-driven-view.unit.test.ts +11 -267
  273. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +3 -3
  274. package/src/__tests__/gpu-scene-render-graph-gpu.ts +2 -3
  275. package/src/__tests__/gpu-scene.dawn.test.ts +2 -6
  276. package/src/__tests__/gpu-scene.unit.test.ts +10 -24
  277. package/src/__tests__/ibl/face-uniforms.unit.test.ts +46 -0
  278. package/src/__tests__/infinite-grid-no-vertex-probe.unit.test.ts +34 -66
  279. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +14 -5
  280. package/src/__tests__/light-buffer-layout.unit.test.ts +4 -49
  281. package/src/__tests__/material-cooked-projection.unit.test.ts +2 -51
  282. package/src/__tests__/material-snapshot-mutation.integration.test.ts +10 -15
  283. package/src/__tests__/material-static-dynamic-route.unit.test.ts +4 -23
  284. package/src/__tests__/material-stride-surface.unit.test.ts +2 -2
  285. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +7 -8
  286. package/src/__tests__/morph-culling-reentry.dawn.test.ts +29 -38
  287. package/src/__tests__/morph-feature-gpu-work.integration.test.ts +45 -43
  288. package/src/__tests__/morph-feature-plan.unit.test.ts +53 -0
  289. package/src/__tests__/morph-visual-evidence.integration.test.ts +47 -33
  290. package/src/__tests__/nineslice-handle-surface.unit.test.ts +11 -6
  291. package/src/__tests__/post-process-error-policy-owner.unit.test.ts +6 -13
  292. package/src/__tests__/prepared-graphics-capability.unit.test.ts +6 -81
  293. package/src/__tests__/prepared-graphics-generation.unit.test.ts +3 -17
  294. package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +6 -74
  295. package/src/__tests__/prepared-graphics-resolver.unit.test.ts +1 -3
  296. package/src/__tests__/prepared-graphics-snapshot.unit.test.ts +2 -2
  297. package/src/__tests__/profiler-default-off.test.ts +1 -1
  298. package/src/__tests__/profiler-phase-catalog.test.ts +2 -2
  299. package/src/__tests__/profiler-phase-integration.test.ts +5 -13
  300. package/src/__tests__/profiler-phase-token.test.ts +3 -8
  301. package/src/__tests__/public-surface.test-d.ts +65 -3
  302. package/src/__tests__/recover-error-policy-owner.unit.test.ts +1 -21
  303. package/src/__tests__/render-error-code-owner.test-d.ts +18 -23
  304. package/src/__tests__/render-error-detail-ssot.test-d.ts +0 -95
  305. package/src/__tests__/render-error-exhaustive.test-d.ts +8 -1
  306. package/src/__tests__/render-feature-assembly.test-d.ts +8 -16
  307. package/src/__tests__/render-feature-context.test-d.ts +16 -40
  308. package/src/__tests__/render-feature-contract.test-d.ts +9 -18
  309. package/src/__tests__/render-feature-diagnostics.unit.test.ts +6 -8
  310. package/src/__tests__/render-feature-docs.unit.test.ts +8 -7
  311. package/src/__tests__/render-feature-gpu-work.integration.test.ts +14 -75
  312. package/src/__tests__/render-feature-plan.test-d.ts +161 -0
  313. package/src/__tests__/render-feature-plan.unit.test.ts +170 -0
  314. package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +8 -19
  315. package/src/__tests__/render-feature-prepared-errors.test-d.ts +3 -6
  316. package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +10 -71
  317. package/src/__tests__/render-feature-prepared-graphics-isolation.unit.test.ts +11 -61
  318. package/src/__tests__/render-feature-prepared-graphics-negative.test-d.ts +20 -43
  319. package/src/__tests__/render-feature-prepared-graphics.test-d.ts +56 -78
  320. package/src/__tests__/render-feature-public-surface.test-d.ts +6 -24
  321. package/src/__tests__/render-feature-retry.unit.test.ts +7 -48
  322. package/src/__tests__/render-feature-scheduling.unit.test.ts +15 -27
  323. package/src/__tests__/render-feature-stage-failed-policy-owner.unit.test.ts +0 -9
  324. package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +19 -109
  325. package/src/__tests__/render-feature-visibility-context.test-d.ts +1 -6
  326. package/src/__tests__/render-feature-visibility-context.unit.test.ts +1 -2
  327. package/src/__tests__/render-feature-zero-work.unit.test.ts +14 -20
  328. package/src/__tests__/render-scene-projection.unit.test.ts +73 -111
  329. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +44 -95
  330. package/src/__tests__/renderer-lifecycle.integration.test.ts +49 -1
  331. package/src/__tests__/shader-stage-surface.unit.test.ts +14 -9
  332. package/src/__tests__/ssao-config.unit.test.ts +36 -0
  333. package/src/__tests__/ssao-kernel-surface.unit.test.ts +4 -5
  334. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +28 -0
  335. package/src/__tests__/standard-descriptors.test-d.ts +22 -0
  336. package/src/__tests__/standard-pipeline.dawn.test.ts +61 -0
  337. package/src/__tests__/standard-pipeline.integration.test.ts +124 -0
  338. package/src/__tests__/standard-profile-oracle.unit.test.ts +62 -0
  339. package/src/__tests__/surface-configuration.unit.test.ts +1 -2
  340. package/src/__tests__/texture-usage-surface.unit.test.ts +3 -6
  341. package/src/__tests__/typed-pipeline-topology.unit.test.ts +40 -206
  342. package/src/__tests__/urp-pipeline-targets.unit.test.ts +1 -11
  343. package/src/__tests__/urp-pipeline.unit.test.ts +2 -2
  344. package/src/__tests__/vertex-color-pipeline.unit.test.ts +10 -2
  345. package/src/__tests__/vertex-layout-consumer.unit.test.ts +1 -1
  346. package/src/__tests__/visibility-diagnostics.integration.test.ts +7 -11
  347. package/src/__tests__/visibility-extract.integration.test.ts +20 -11
  348. package/src/__tests__/visibility-extract.perf.test.ts +66 -32
  349. package/src/__tests__/visibility-feature-dedup.integration.test.ts +2 -4
  350. package/src/__tests__/visibility-hidden-report.unit.test.ts +1 -2
  351. package/src/__tests__/visibility-instances.integration.test.ts +7 -11
  352. package/src/__tests__/visibility-multi-world.integration.test.ts +38 -6
  353. package/src/__tests__/visibility-producer-matrix.integration.test.ts +18 -41
  354. package/src/__tests__/visibility-public-surface.test-d.ts +10 -9
  355. package/src/__tests__/visibility-resolver.unit.test.ts +2 -1
  356. package/src/__tests__/visibility-resource-short-circuit.unit.test.ts +80 -0
  357. package/src/__tests__/visibility-snapshot-contract.unit.test.ts +2 -1
  358. package/src/__tests__/vocabulary.unit.test.ts +1 -1
  359. package/src/assembly/backend-contract.ts +57 -0
  360. package/src/{renderer/renderer-factory.ts → assembly/factory.ts} +1663 -2690
  361. package/src/assembly/host-contract.ts +101 -0
  362. package/src/{renderer → assembly}/material/assembly.ts +0 -2
  363. package/src/assembly/material/pipeline-projection.ts +63 -0
  364. package/src/authoring.ts +14 -22
  365. package/src/components/__tests__/schema-contract.unit.test.ts +10 -0
  366. package/src/components/glyph-text.ts +3 -2
  367. package/src/components/index.ts +7 -9
  368. package/src/components/instances.ts +4 -5
  369. package/src/components/light-helpers.ts +1 -1
  370. package/src/components/mesh-filter.ts +11 -10
  371. package/src/components/post-process-params.ts +3 -3
  372. package/src/components/scene-instance.ts +12 -12
  373. package/src/components/skybox-background.ts +103 -0
  374. package/src/components/{environment.ts → skylight.ts} +2 -110
  375. package/src/components/sprite-animation.ts +3 -4
  376. package/src/components/sprite-instances.ts +2 -2
  377. package/src/components/sprite-playback-mode.ts +7 -1
  378. package/src/components/sprite-region-override.ts +2 -3
  379. package/src/components/tile-layer.ts +8 -2
  380. package/src/construct-renderer.ts +67 -4
  381. package/src/debug-draw-glue.ts +8 -129
  382. package/src/device/device-scope.ts +306 -0
  383. package/src/{gpu-resource-store.ts → device/gpu-residency.ts} +540 -639
  384. package/src/device/resource-types.ts +20 -0
  385. package/src/engine-metrics.ts +12 -19
  386. package/src/errors/recover.ts +45 -3
  387. package/src/errors/render.ts +357 -460
  388. package/src/features/fullscreen.ts +46 -0
  389. package/src/features/host.ts +575 -309
  390. package/src/features/morph/morph-feature.ts +195 -105
  391. package/src/features/plan.ts +447 -0
  392. package/src/features/prepared-gpu-work.ts +72 -15
  393. package/src/features/prepared-graphics-store.ts +20 -6
  394. package/src/features/prepared-graphics.ts +12 -71
  395. package/src/features/render-graph-compute.ts +14 -5
  396. package/src/features/render-graph-contribution.ts +43 -63
  397. package/src/features/render-graph-raster.ts +11 -6
  398. package/src/features/render-graph-resources.ts +25 -23
  399. package/src/features/targets.ts +8 -21
  400. package/src/features/types.ts +39 -227
  401. package/src/features/vocabulary.ts +24 -0
  402. package/src/fullscreen-post-process-pass.ts +14 -57
  403. package/src/glyph-text-layout-system.ts +70 -96
  404. package/src/gpu-driven/batch-topology.ts +24 -202
  405. package/src/gpu-driven/production-raster.ts +93 -1108
  406. package/src/gpu-driven/view-gpu.ts +46 -192
  407. package/src/gpu-resource.ts +4 -4
  408. package/src/gpu-scene-schema.ts +11 -99
  409. package/src/gpu-scene.ts +231 -364
  410. package/src/hdrp-buffers.ts +12 -221
  411. package/src/ibl/IblPipelineCache.ts +471 -711
  412. package/src/ibl/skylight-bind-group.ts +4 -4
  413. package/src/index.ts +58 -217
  414. package/src/inspection-types.ts +76 -0
  415. package/src/instance-buffer-cache.ts +1 -29
  416. package/src/internal.ts +6 -85
  417. package/src/lifecycle.ts +64 -19
  418. package/src/materials.ts +7 -29
  419. package/src/mesh-material-bindings.ts +0 -1
  420. package/src/pbr-pipeline.ts +434 -53
  421. package/src/{urp-pipeline.ts → pipeline/standard-forward-lane.ts} +38 -149
  422. package/src/{hdrp-pipeline.ts → pipeline/standard-pipeline.ts} +221 -191
  423. package/src/pipeline/standard-profile.ts +65 -0
  424. package/src/pipeline-builder.ts +60 -64
  425. package/src/pipeline-spec-types.ts +28 -0
  426. package/src/pipeline-spec.ts +72 -609
  427. package/src/plugin.ts +3 -75
  428. package/src/post-process-errors.ts +31 -33
  429. package/src/prepare/prepared-graphics-resolver.ts +5 -4
  430. package/src/record/__tests__/material-slot-plan.unit.test.ts +1 -33
  431. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +41 -0
  432. package/src/record/__tests__/video-texture-view.unit.test.ts +1 -1
  433. package/src/record/frame-lighting.ts +74 -195
  434. package/src/record/frame-snapshot.ts +45 -60
  435. package/src/record/frame-targets.ts +8 -243
  436. package/src/record/frame.ts +509 -796
  437. package/src/record/helpers.ts +6 -11
  438. package/src/record/main-pass-geometry.ts +106 -147
  439. package/src/record/main-pass-material.ts +517 -190
  440. package/src/record/main-pass-sprite-draws.ts +198 -117
  441. package/src/record/main-pass.ts +162 -143
  442. package/src/record/mesh-ssbo.ts +517 -38
  443. package/src/record/render-context.ts +364 -0
  444. package/src/record/shadow-pass.ts +138 -1838
  445. package/src/record/skybox-post-pass.ts +12 -14
  446. package/src/record/typed-frame-graph.ts +215 -254
  447. package/src/record/view-ubo.ts +6 -37
  448. package/src/render-contract.ts +571 -0
  449. package/src/render-data.ts +3 -3
  450. package/src/render-graph-primitives.ts +76 -851
  451. package/src/render-pipeline.ts +104 -188
  452. package/src/render-system-extract.ts +1048 -1729
  453. package/src/render-system.ts +330 -1957
  454. package/src/scene/render-scene-types.ts +64 -0
  455. package/src/scene/render-scene.ts +1032 -0
  456. package/src/scene-instances/post-spawn-resolve-joints.ts +4 -7
  457. package/src/ssao-buffers.ts +167 -8
  458. package/src/systems/skin-palette-allocator.ts +21 -64
  459. package/src/systems/skin-palette-types.ts +14 -0
  460. package/src/systems/transparent-sort-config.ts +25 -3
  461. package/src/tilemap-chunk-extract-system.ts +53 -70
  462. package/src/typed-render-graph-primitives.ts +35 -24
  463. package/src/typed-shadow-passes.ts +26 -56
  464. package/dist/__tests__/analytic-sky-contract.test.d.ts +0 -2
  465. package/dist/__tests__/analytic-sky-contract.test.d.ts.map +0 -1
  466. package/dist/__tests__/analytic-sky-falsify.test.d.ts +0 -2
  467. package/dist/__tests__/analytic-sky-falsify.test.d.ts.map +0 -1
  468. package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts +0 -2
  469. package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts.map +0 -1
  470. package/dist/__tests__/backend-selection.integration.test.d.ts +0 -2
  471. package/dist/__tests__/backend-selection.integration.test.d.ts.map +0 -1
  472. package/dist/__tests__/camera-temporal.test-d.d.ts +0 -2
  473. package/dist/__tests__/camera-temporal.test-d.d.ts.map +0 -1
  474. package/dist/__tests__/camera-temporal.test.d.ts +0 -2
  475. package/dist/__tests__/camera-temporal.test.d.ts.map +0 -1
  476. package/dist/__tests__/directional-shadow-probe-atlas-layout.unit.test.d.ts +0 -2
  477. package/dist/__tests__/directional-shadow-probe-atlas-layout.unit.test.d.ts.map +0 -1
  478. package/dist/__tests__/environment-inspection.test.d.ts +0 -2
  479. package/dist/__tests__/environment-inspection.test.d.ts.map +0 -1
  480. package/dist/__tests__/fog-ai-user.fixture.d.ts +0 -2
  481. package/dist/__tests__/fog-ai-user.fixture.d.ts.map +0 -1
  482. package/dist/__tests__/fog-custom-render-feature.fixture.d.ts +0 -16
  483. package/dist/__tests__/fog-custom-render-feature.fixture.d.ts.map +0 -1
  484. package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts +0 -2
  485. package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts.map +0 -1
  486. package/dist/__tests__/fog-inspection.integration.test.d.ts +0 -2
  487. package/dist/__tests__/fog-inspection.integration.test.d.ts.map +0 -1
  488. package/dist/__tests__/fog-owner-state.integration.test.d.ts +0 -2
  489. package/dist/__tests__/fog-owner-state.integration.test.d.ts.map +0 -1
  490. package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts +0 -2
  491. package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts.map +0 -1
  492. package/dist/__tests__/fog-public-surface.integration.test.d.ts +0 -2
  493. package/dist/__tests__/fog-public-surface.integration.test.d.ts.map +0 -1
  494. package/dist/__tests__/fog-ray-contract.integration.test.d.ts +0 -2
  495. package/dist/__tests__/fog-ray-contract.integration.test.d.ts.map +0 -1
  496. package/dist/__tests__/fog-source-absence.integration.test.d.ts +0 -2
  497. package/dist/__tests__/fog-source-absence.integration.test.d.ts.map +0 -1
  498. package/dist/__tests__/fog-temporal.integration.test.d.ts +0 -2
  499. package/dist/__tests__/fog-temporal.integration.test.d.ts.map +0 -1
  500. package/dist/__tests__/frame-chain.unit.test.d.ts +0 -2
  501. package/dist/__tests__/frame-chain.unit.test.d.ts.map +0 -1
  502. package/dist/__tests__/gpu-scene-field-type-owner.test-d.d.ts +0 -2
  503. package/dist/__tests__/gpu-scene-field-type-owner.test-d.d.ts.map +0 -1
  504. package/dist/__tests__/hdrp-pipeline.unit.test.d.ts +0 -2
  505. package/dist/__tests__/hdrp-pipeline.unit.test.d.ts.map +0 -1
  506. package/dist/__tests__/ibl/ibl-fallback.unit.test.d.ts +0 -2
  507. package/dist/__tests__/ibl/ibl-fallback.unit.test.d.ts.map +0 -1
  508. package/dist/__tests__/material-derived-error-stop-draw.integration.test.d.ts +0 -2
  509. package/dist/__tests__/material-derived-error-stop-draw.integration.test.d.ts.map +0 -1
  510. package/dist/__tests__/material-derived-payload.integration.test.d.ts +0 -2
  511. package/dist/__tests__/material-derived-payload.integration.test.d.ts.map +0 -1
  512. package/dist/__tests__/materials.unit.test.d.ts +0 -2
  513. package/dist/__tests__/materials.unit.test.d.ts.map +0 -1
  514. package/dist/__tests__/param-schema-projection-census.unit.test.d.ts +0 -2
  515. package/dist/__tests__/param-schema-projection-census.unit.test.d.ts.map +0 -1
  516. package/dist/__tests__/persistent-render-scene.unit.test.d.ts +0 -2
  517. package/dist/__tests__/persistent-render-scene.unit.test.d.ts.map +0 -1
  518. package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts +0 -2
  519. package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts.map +0 -1
  520. package/dist/__tests__/pipeline-pass-trace.test.d.ts +0 -2
  521. package/dist/__tests__/pipeline-pass-trace.test.d.ts.map +0 -1
  522. package/dist/__tests__/pipeline-stage-owner.test-d.d.ts +0 -2
  523. package/dist/__tests__/pipeline-stage-owner.test-d.d.ts.map +0 -1
  524. package/dist/__tests__/plugin.test.d.ts +0 -2
  525. package/dist/__tests__/plugin.test.d.ts.map +0 -1
  526. package/dist/__tests__/prepared-graphics-backend-matrix.unit.test.d.ts +0 -2
  527. package/dist/__tests__/prepared-graphics-backend-matrix.unit.test.d.ts.map +0 -1
  528. package/dist/__tests__/prepared-graphics-resolver-recording.unit.test.d.ts +0 -2
  529. package/dist/__tests__/prepared-graphics-resolver-recording.unit.test.d.ts.map +0 -1
  530. package/dist/__tests__/public-pipeline-id.test-d.d.ts +0 -2
  531. package/dist/__tests__/public-pipeline-id.test-d.d.ts.map +0 -1
  532. package/dist/__tests__/render-dispatch-membership.unit.test.d.ts +0 -2
  533. package/dist/__tests__/render-dispatch-membership.unit.test.d.ts.map +0 -1
  534. package/dist/__tests__/render-feature-construction.unit.test.d.ts +0 -2
  535. package/dist/__tests__/render-feature-construction.unit.test.d.ts.map +0 -1
  536. package/dist/__tests__/render-feature-error-code-owner.test-d.d.ts +0 -2
  537. package/dist/__tests__/render-feature-error-code-owner.test-d.d.ts.map +0 -1
  538. package/dist/__tests__/render-feature-gpu-buffer-usage-owner.test-d.d.ts +0 -2
  539. package/dist/__tests__/render-feature-gpu-buffer-usage-owner.test-d.d.ts.map +0 -1
  540. package/dist/__tests__/render-feature-graph.integration.test.d.ts +0 -2
  541. package/dist/__tests__/render-feature-graph.integration.test.d.ts.map +0 -1
  542. package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts +0 -2
  543. package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts.map +0 -1
  544. package/dist/__tests__/render-feature-order.unit.test.d.ts +0 -2
  545. package/dist/__tests__/render-feature-order.unit.test.d.ts.map +0 -1
  546. package/dist/__tests__/render-feature-prepared-graphics-recording.unit.test.d.ts +0 -2
  547. package/dist/__tests__/render-feature-prepared-graphics-recording.unit.test.d.ts.map +0 -1
  548. package/dist/__tests__/render-feature-staging.unit.test.d.ts +0 -2
  549. package/dist/__tests__/render-feature-staging.unit.test.d.ts.map +0 -1
  550. package/dist/__tests__/renderer-render-scene-public.test-d.d.ts +0 -2
  551. package/dist/__tests__/renderer-render-scene-public.test-d.d.ts.map +0 -1
  552. package/dist/__tests__/scene-temporal-coverage.unit.test.d.ts +0 -2
  553. package/dist/__tests__/scene-temporal-coverage.unit.test.d.ts.map +0 -1
  554. package/dist/__tests__/sun-snapshot-consumers.test.d.ts +0 -2
  555. package/dist/__tests__/sun-snapshot-consumers.test.d.ts.map +0 -1
  556. package/dist/__tests__/surface-backend-kind-owner.test-d.d.ts +0 -2
  557. package/dist/__tests__/surface-backend-kind-owner.test-d.d.ts.map +0 -1
  558. package/dist/__tests__/taa-history-store.unit.test.d.ts +0 -2
  559. package/dist/__tests__/taa-history-store.unit.test.d.ts.map +0 -1
  560. package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts +0 -2
  561. package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts.map +0 -1
  562. package/dist/__tests__/temporal-inspection.unit.test.d.ts +0 -2
  563. package/dist/__tests__/temporal-inspection.unit.test.d.ts.map +0 -1
  564. package/dist/assets/__tests__/asset-decoders.unit.test.d.ts +0 -2
  565. package/dist/assets/__tests__/asset-decoders.unit.test.d.ts.map +0 -1
  566. package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts +0 -2
  567. package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts.map +0 -1
  568. package/dist/assets/__tests__/render-asset-port.unit.test.d.ts +0 -2
  569. package/dist/assets/__tests__/render-asset-port.unit.test.d.ts.map +0 -1
  570. package/dist/assets/__tests__/resolve-render-asset.unit.test.d.ts +0 -2
  571. package/dist/assets/__tests__/resolve-render-asset.unit.test.d.ts.map +0 -1
  572. package/dist/chunk-DJIMFYX6.mjs +0 -1439
  573. package/dist/chunk-DJIMFYX6.mjs.map +0 -1
  574. package/dist/chunk-F2SIOCRM.mjs +0 -7423
  575. package/dist/chunk-F2SIOCRM.mjs.map +0 -1
  576. package/dist/chunk-JMSB7AR4.mjs +0 -3
  577. package/dist/chunk-JMSB7AR4.mjs.map +0 -1
  578. package/dist/chunk-KHI6K4C6.mjs +0 -659
  579. package/dist/chunk-KHI6K4C6.mjs.map +0 -1
  580. package/dist/chunk-PORZOL2V.mjs +0 -569
  581. package/dist/chunk-PORZOL2V.mjs.map +0 -1
  582. package/dist/chunk-UOJGMDGP.mjs +0 -29913
  583. package/dist/chunk-UOJGMDGP.mjs.map +0 -1
  584. package/dist/components/__tests__/atmosphere-red.test.d.ts +0 -2
  585. package/dist/components/__tests__/atmosphere-red.test.d.ts.map +0 -1
  586. package/dist/components/__tests__/atmosphere.test.d.ts +0 -2
  587. package/dist/components/__tests__/atmosphere.test.d.ts.map +0 -1
  588. package/dist/components/__tests__/fog.test-d.d.ts +0 -2
  589. package/dist/components/__tests__/fog.test-d.d.ts.map +0 -1
  590. package/dist/components/__tests__/fog.test.d.ts +0 -2
  591. package/dist/components/__tests__/fog.test.d.ts.map +0 -1
  592. package/dist/components/atmosphere.d.ts +0 -18
  593. package/dist/components/atmosphere.d.ts.map +0 -1
  594. package/dist/components/environment.d.ts +0 -115
  595. package/dist/components/environment.d.ts.map +0 -1
  596. package/dist/deferred-lighting.d.ts +0 -13
  597. package/dist/deferred-lighting.d.ts.map +0 -1
  598. package/dist/dynamic-texture-store.d.ts +0 -42
  599. package/dist/dynamic-texture-store.d.ts.map +0 -1
  600. package/dist/environment/__tests__/failure-injection.test.d.ts +0 -2
  601. package/dist/environment/__tests__/failure-injection.test.d.ts.map +0 -1
  602. package/dist/environment/__tests__/generation-red.test.d.ts +0 -2
  603. package/dist/environment/__tests__/generation-red.test.d.ts.map +0 -1
  604. package/dist/environment/__tests__/generation.test.d.ts +0 -2
  605. package/dist/environment/__tests__/generation.test.d.ts.map +0 -1
  606. package/dist/environment/__tests__/graph-transaction.test.d.ts +0 -2
  607. package/dist/environment/__tests__/graph-transaction.test.d.ts.map +0 -1
  608. package/dist/environment/__tests__/inspection-red.test.d.ts +0 -2
  609. package/dist/environment/__tests__/inspection-red.test.d.ts.map +0 -1
  610. package/dist/environment/__tests__/lifecycle-evidence.test.d.ts +0 -2
  611. package/dist/environment/__tests__/lifecycle-evidence.test.d.ts.map +0 -1
  612. package/dist/environment/__tests__/pipeline-topology.test.d.ts +0 -2
  613. package/dist/environment/__tests__/pipeline-topology.test.d.ts.map +0 -1
  614. package/dist/environment/__tests__/readiness.test.d.ts +0 -2
  615. package/dist/environment/__tests__/readiness.test.d.ts.map +0 -1
  616. package/dist/environment/__tests__/recovery.test.d.ts +0 -2
  617. package/dist/environment/__tests__/recovery.test.d.ts.map +0 -1
  618. package/dist/environment/__tests__/resize-dispose.test.d.ts +0 -2
  619. package/dist/environment/__tests__/resize-dispose.test.d.ts.map +0 -1
  620. package/dist/environment/__tests__/signature-red.test.d.ts +0 -2
  621. package/dist/environment/__tests__/signature-red.test.d.ts.map +0 -1
  622. package/dist/environment/__tests__/signature.test.d.ts +0 -2
  623. package/dist/environment/__tests__/signature.test.d.ts.map +0 -1
  624. package/dist/environment/descriptors.d.ts +0 -2
  625. package/dist/environment/descriptors.d.ts.map +0 -1
  626. package/dist/environment/extracted-environment.d.ts +0 -53
  627. package/dist/environment/extracted-environment.d.ts.map +0 -1
  628. package/dist/environment/generation.d.ts +0 -62
  629. package/dist/environment/generation.d.ts.map +0 -1
  630. package/dist/environment/gpu-bundle.d.ts +0 -23
  631. package/dist/environment/gpu-bundle.d.ts.map +0 -1
  632. package/dist/environment/graph.d.ts +0 -108
  633. package/dist/environment/graph.d.ts.map +0 -1
  634. package/dist/environment/inspection.d.ts +0 -48
  635. package/dist/environment/inspection.d.ts.map +0 -1
  636. package/dist/environment/lifecycle.d.ts +0 -22
  637. package/dist/environment/lifecycle.d.ts.map +0 -1
  638. package/dist/environment/readiness.d.ts +0 -29
  639. package/dist/environment/readiness.d.ts.map +0 -1
  640. package/dist/environment/signature.d.ts +0 -70
  641. package/dist/environment/signature.d.ts.map +0 -1
  642. package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts +0 -2
  643. package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts.map +0 -1
  644. package/dist/extract/__tests__/environment-source.test.d.ts +0 -2
  645. package/dist/extract/__tests__/environment-source.test.d.ts.map +0 -1
  646. package/dist/extract/__tests__/schema-readers.unit.test.d.ts +0 -2
  647. package/dist/extract/__tests__/schema-readers.unit.test.d.ts.map +0 -1
  648. package/dist/extract/directional-csm.d.ts +0 -129
  649. package/dist/extract/directional-csm.d.ts.map +0 -1
  650. package/dist/extract/index.d.ts +0 -5
  651. package/dist/extract/index.d.ts.map +0 -1
  652. package/dist/extract/material-interface.d.ts +0 -56
  653. package/dist/extract/material-interface.d.ts.map +0 -1
  654. package/dist/extract/schema-readers.d.ts +0 -20
  655. package/dist/extract/schema-readers.d.ts.map +0 -1
  656. package/dist/features/graph-contribution.d.ts +0 -64
  657. package/dist/features/graph-contribution.d.ts.map +0 -1
  658. package/dist/features/index.d.ts +0 -21
  659. package/dist/features/index.d.ts.map +0 -1
  660. package/dist/features/morph/index.d.ts +0 -3
  661. package/dist/features/morph/index.d.ts.map +0 -1
  662. package/dist/features/morph/morph-bounds.d.ts +0 -42
  663. package/dist/features/morph/morph-bounds.d.ts.map +0 -1
  664. package/dist/features/scene-temporal.d.ts +0 -45
  665. package/dist/features/scene-temporal.d.ts.map +0 -1
  666. package/dist/features/taa-resolve.d.ts +0 -21
  667. package/dist/features/taa-resolve.d.ts.map +0 -1
  668. package/dist/frame-chain.d.ts +0 -14
  669. package/dist/frame-chain.d.ts.map +0 -1
  670. package/dist/gpu-driven/view-reference.d.ts.map +0 -1
  671. package/dist/gpu-resource-store.d.ts.map +0 -1
  672. package/dist/hdrp-cluster-membership.d.ts +0 -2
  673. package/dist/hdrp-cluster-membership.d.ts.map +0 -1
  674. package/dist/hdrp-pipeline.d.ts +0 -36
  675. package/dist/hdrp-pipeline.d.ts.map +0 -1
  676. package/dist/ibl/cubemap-projection.d.ts +0 -23
  677. package/dist/ibl/cubemap-projection.d.ts.map +0 -1
  678. package/dist/ibl/face-uniforms.d.ts +0 -65
  679. package/dist/ibl/face-uniforms.d.ts.map +0 -1
  680. package/dist/mesh-update-errors.d.ts +0 -71
  681. package/dist/mesh-update-errors.d.ts.map +0 -1
  682. package/dist/mipmap-generator.d.ts +0 -39
  683. package/dist/mipmap-generator.d.ts.map +0 -1
  684. package/dist/param-schema-projection-census.d.ts +0 -18
  685. package/dist/param-schema-projection-census.d.ts.map +0 -1
  686. package/dist/persistent-render-scene.d.ts +0 -158
  687. package/dist/persistent-render-scene.d.ts.map +0 -1
  688. package/dist/pipeline/index.d.ts +0 -11
  689. package/dist/pipeline/index.d.ts.map +0 -1
  690. package/dist/pipeline-errors.d.ts +0 -110
  691. package/dist/pipeline-errors.d.ts.map +0 -1
  692. package/dist/prepare/__tests__/schema-readers.unit.test.d.ts +0 -2
  693. package/dist/prepare/__tests__/schema-readers.unit.test.d.ts.map +0 -1
  694. package/dist/prepare/index.d.ts +0 -4
  695. package/dist/prepare/index.d.ts.map +0 -1
  696. package/dist/prepare/schema-readers.d.ts +0 -11
  697. package/dist/prepare/schema-readers.d.ts.map +0 -1
  698. package/dist/record/__tests__/environment-record.test.d.ts +0 -2
  699. package/dist/record/__tests__/environment-record.test.d.ts.map +0 -1
  700. package/dist/record/__tests__/frame-targets.unit.test.d.ts +0 -2
  701. package/dist/record/__tests__/frame-targets.unit.test.d.ts.map +0 -1
  702. package/dist/record/__tests__/membership-timing.unit.test.d.ts +0 -2
  703. package/dist/record/__tests__/membership-timing.unit.test.d.ts.map +0 -1
  704. package/dist/record/__tests__/render-submission.integration.test.d.ts +0 -2
  705. package/dist/record/__tests__/render-submission.integration.test.d.ts.map +0 -1
  706. package/dist/record/__tests__/render-submission.perf.test.d.ts +0 -2
  707. package/dist/record/__tests__/render-submission.perf.test.d.ts.map +0 -1
  708. package/dist/record/__tests__/shadow-submit-mode.unit.test.d.ts +0 -2
  709. package/dist/record/__tests__/shadow-submit-mode.unit.test.d.ts.map +0 -1
  710. package/dist/record/__tests__/view-ubo-layout.unit.test.d.ts +0 -2
  711. package/dist/record/__tests__/view-ubo-layout.unit.test.d.ts.map +0 -1
  712. package/dist/record/frame-observation.d.ts +0 -38
  713. package/dist/record/frame-observation.d.ts.map +0 -1
  714. package/dist/record/index.d.ts +0 -15
  715. package/dist/record/index.d.ts.map +0 -1
  716. package/dist/record/main-pass-skin.d.ts +0 -46
  717. package/dist/record/main-pass-skin.d.ts.map +0 -1
  718. package/dist/record/main-pass-sprite.d.ts +0 -69
  719. package/dist/record/main-pass-sprite.d.ts.map +0 -1
  720. package/dist/record/material-payload.d.ts +0 -43
  721. package/dist/record/material-payload.d.ts.map +0 -1
  722. package/dist/record/material-slot-plan.d.ts +0 -26
  723. package/dist/record/material-slot-plan.d.ts.map +0 -1
  724. package/dist/record/membership-timing.d.ts +0 -232
  725. package/dist/record/membership-timing.d.ts.map +0 -1
  726. package/dist/record/shadow-caster-uniform.d.ts +0 -8
  727. package/dist/record/shadow-caster-uniform.d.ts.map +0 -1
  728. package/dist/record/shadow-submit-mode.d.ts +0 -66
  729. package/dist/record/shadow-submit-mode.d.ts.map +0 -1
  730. package/dist/render-dispatch-membership.d.ts +0 -47
  731. package/dist/render-dispatch-membership.d.ts.map +0 -1
  732. package/dist/render-pipeline-context.d.ts +0 -289
  733. package/dist/render-pipeline-context.d.ts.map +0 -1
  734. package/dist/render-pipeline-target.d.ts +0 -16
  735. package/dist/render-pipeline-target.d.ts.map +0 -1
  736. package/dist/render-scene-projection.d.ts +0 -174
  737. package/dist/render-scene-projection.d.ts.map +0 -1
  738. package/dist/render-system-fold.d.ts +0 -266
  739. package/dist/render-system-fold.d.ts.map +0 -1
  740. package/dist/renderer/asset-service.d.ts +0 -10
  741. package/dist/renderer/asset-service.d.ts.map +0 -1
  742. package/dist/renderer/backend-selection.d.ts.map +0 -1
  743. package/dist/renderer/environment-classify.d.ts +0 -6
  744. package/dist/renderer/environment-classify.d.ts.map +0 -1
  745. package/dist/renderer/environment-error.d.ts +0 -13
  746. package/dist/renderer/environment-error.d.ts.map +0 -1
  747. package/dist/renderer/material/pipeline-projection.d.ts +0 -91
  748. package/dist/renderer/material/pipeline-projection.d.ts.map +0 -1
  749. package/dist/renderer/renderer-factory.d.ts +0 -289
  750. package/dist/renderer/renderer-factory.d.ts.map +0 -1
  751. package/dist/renderer.d.ts +0 -771
  752. package/dist/renderer.d.ts.map +0 -1
  753. package/dist/scene-utils/collect-subtree.d.ts +0 -11
  754. package/dist/scene-utils/collect-subtree.d.ts.map +0 -1
  755. package/dist/ssao-data.d.ts +0 -34
  756. package/dist/ssao-data.d.ts.map +0 -1
  757. package/dist/surface-format.d.ts +0 -10
  758. package/dist/surface-format.d.ts.map +0 -1
  759. package/dist/taa-history-store.d.ts +0 -88
  760. package/dist/taa-history-store.d.ts.map +0 -1
  761. package/dist/temporal-coverage.d.ts +0 -35
  762. package/dist/temporal-coverage.d.ts.map +0 -1
  763. package/dist/temporal-frame-transaction.d.ts +0 -92
  764. package/dist/temporal-frame-transaction.d.ts.map +0 -1
  765. package/dist/temporal-inspection.d.ts +0 -57
  766. package/dist/temporal-inspection.d.ts.map +0 -1
  767. package/dist/temporal-view.d.ts +0 -43
  768. package/dist/temporal-view.d.ts.map +0 -1
  769. package/dist/tilemap/resolve-tileset-runtime.d.ts +0 -23
  770. package/dist/tilemap/resolve-tileset-runtime.d.ts.map +0 -1
  771. package/dist/urp-pipeline.d.ts +0 -4
  772. package/dist/urp-pipeline.d.ts.map +0 -1
  773. package/src/__tests__/analytic-sky-contract.test.ts +0 -27
  774. package/src/__tests__/analytic-sky-falsify-carriers.mjs +0 -43
  775. package/src/__tests__/analytic-sky-falsify.test.ts +0 -94
  776. package/src/__tests__/assets-runtime-handoff.integration.test.ts +0 -36
  777. package/src/__tests__/backend-selection.integration.test.ts +0 -11
  778. package/src/__tests__/camera-temporal.test-d.ts +0 -8
  779. package/src/__tests__/camera-temporal.test.ts +0 -188
  780. package/src/__tests__/directional-shadow-probe-atlas-layout.unit.test.ts +0 -18
  781. package/src/__tests__/environment-inspection.test.ts +0 -45
  782. package/src/__tests__/fog-ai-user.fixture.ts +0 -350
  783. package/src/__tests__/fog-custom-render-feature.fixture.ts +0 -33
  784. package/src/__tests__/fog-custom-render-feature.integration.test.ts +0 -76
  785. package/src/__tests__/fog-inspection.integration.test.ts +0 -127
  786. package/src/__tests__/fog-owner-state.integration.test.ts +0 -112
  787. package/src/__tests__/fog-pipeline-topology.integration.test.ts +0 -93
  788. package/src/__tests__/fog-public-surface.integration.test.ts +0 -60
  789. package/src/__tests__/fog-ray-contract.integration.test.ts +0 -73
  790. package/src/__tests__/fog-source-absence.integration.test.ts +0 -51
  791. package/src/__tests__/fog-temporal.integration.test.ts +0 -115
  792. package/src/__tests__/frame-chain.unit.test.ts +0 -26
  793. package/src/__tests__/gpu-scene-field-type-owner.test-d.ts +0 -27
  794. package/src/__tests__/hdrp-pipeline.unit.test.ts +0 -100
  795. package/src/__tests__/ibl/ibl-fallback.unit.test.ts +0 -23
  796. package/src/__tests__/material-derived-error-stop-draw.integration.test.ts +0 -69
  797. package/src/__tests__/material-derived-payload.integration.test.ts +0 -164
  798. package/src/__tests__/materials.unit.test.ts +0 -25
  799. package/src/__tests__/param-schema-projection-census.unit.test.ts +0 -40
  800. package/src/__tests__/persistent-render-scene.unit.test.ts +0 -1311
  801. package/src/__tests__/pipeline-error-policy-owner.unit.test.ts +0 -167
  802. package/src/__tests__/pipeline-pass-trace.test.ts +0 -92
  803. package/src/__tests__/pipeline-stage-owner.test-d.ts +0 -13
  804. package/src/__tests__/plugin.test.ts +0 -25
  805. package/src/__tests__/prepared-graphics-backend-matrix.unit.test.ts +0 -129
  806. package/src/__tests__/prepared-graphics-resolver-recording.unit.test.ts +0 -180
  807. package/src/__tests__/public-pipeline-id.test-d.ts +0 -6
  808. package/src/__tests__/render-dispatch-membership.unit.test.ts +0 -117
  809. package/src/__tests__/render-feature-construction.unit.test.ts +0 -124
  810. package/src/__tests__/render-feature-error-code-owner.test-d.ts +0 -27
  811. package/src/__tests__/render-feature-gpu-buffer-usage-owner.test-d.ts +0 -46
  812. package/src/__tests__/render-feature-graph.integration.test.ts +0 -205
  813. package/src/__tests__/render-feature-graphics-staging.unit.test.ts +0 -200
  814. package/src/__tests__/render-feature-order.unit.test.ts +0 -66
  815. package/src/__tests__/render-feature-prepared-graphics-recording.unit.test.ts +0 -107
  816. package/src/__tests__/render-feature-staging.unit.test.ts +0 -94
  817. package/src/__tests__/renderer-render-scene-public.test-d.ts +0 -27
  818. package/src/__tests__/scene-temporal-coverage.unit.test.ts +0 -259
  819. package/src/__tests__/sun-snapshot-consumers.test.ts +0 -35
  820. package/src/__tests__/surface-backend-kind-owner.test-d.ts +0 -42
  821. package/src/__tests__/taa-history-store.unit.test.ts +0 -196
  822. package/src/__tests__/temporal-frame-transaction.integration.test.ts +0 -537
  823. package/src/__tests__/temporal-inspection.unit.test.ts +0 -138
  824. package/src/assets/__tests__/asset-decoders.unit.test.ts +0 -92
  825. package/src/assets/__tests__/mipmap-generator.unit.test.ts +0 -52
  826. package/src/assets/__tests__/render-asset-port.unit.test.ts +0 -54
  827. package/src/assets/__tests__/resolve-render-asset.unit.test.ts +0 -47
  828. package/src/components/__tests__/atmosphere-red.test.ts +0 -51
  829. package/src/components/__tests__/atmosphere.test.ts +0 -79
  830. package/src/components/__tests__/fog.test-d.ts +0 -49
  831. package/src/components/__tests__/fog.test.ts +0 -60
  832. package/src/components/atmosphere.ts +0 -64
  833. package/src/deferred-lighting.ts +0 -92
  834. package/src/dynamic-texture-store.ts +0 -111
  835. package/src/environment/README.md +0 -76
  836. package/src/environment/__tests__/failure-injection.test.ts +0 -50
  837. package/src/environment/__tests__/generation-red.test.ts +0 -64
  838. package/src/environment/__tests__/generation.test.ts +0 -37
  839. package/src/environment/__tests__/graph-transaction.test.ts +0 -85
  840. package/src/environment/__tests__/inspection-red.test.ts +0 -53
  841. package/src/environment/__tests__/lifecycle-evidence.test.ts +0 -40
  842. package/src/environment/__tests__/pipeline-topology.test.ts +0 -33
  843. package/src/environment/__tests__/readiness.test.ts +0 -42
  844. package/src/environment/__tests__/recovery.test.ts +0 -62
  845. package/src/environment/__tests__/resize-dispose.test.ts +0 -30
  846. package/src/environment/__tests__/signature-red.test.ts +0 -45
  847. package/src/environment/__tests__/signature.test.ts +0 -60
  848. package/src/environment/descriptors.ts +0 -7
  849. package/src/environment/extracted-environment.ts +0 -239
  850. package/src/environment/generation.ts +0 -158
  851. package/src/environment/gpu-bundle.ts +0 -144
  852. package/src/environment/graph.ts +0 -588
  853. package/src/environment/inspection.ts +0 -107
  854. package/src/environment/lifecycle.ts +0 -124
  855. package/src/environment/readiness.ts +0 -76
  856. package/src/environment/signature.ts +0 -185
  857. package/src/extract/__tests__/directional-csm-domain.unit.test.ts +0 -391
  858. package/src/extract/__tests__/environment-source.test.ts +0 -105
  859. package/src/extract/__tests__/schema-readers.unit.test.ts +0 -16
  860. package/src/extract/directional-csm.ts +0 -959
  861. package/src/extract/index.ts +0 -10
  862. package/src/extract/material-interface.ts +0 -604
  863. package/src/extract/schema-readers.ts +0 -27
  864. package/src/features/graph-contribution.ts +0 -577
  865. package/src/features/index.ts +0 -100
  866. package/src/features/morph/index.ts +0 -24
  867. package/src/features/morph/morph-bounds.ts +0 -123
  868. package/src/features/scene-temporal.ts +0 -274
  869. package/src/features/taa-resolve.ts +0 -244
  870. package/src/frame-chain.ts +0 -21
  871. package/src/hdrp-cluster-membership.ts +0 -70
  872. package/src/ibl/cubemap-projection.ts +0 -60
  873. package/src/ibl/face-uniforms.ts +0 -150
  874. package/src/mesh-update-errors.ts +0 -113
  875. package/src/mipmap-generator.ts +0 -244
  876. package/src/param-schema-projection-census.ts +0 -73
  877. package/src/persistent-render-scene.ts +0 -1752
  878. package/src/pipeline/index.ts +0 -40
  879. package/src/pipeline-errors.ts +0 -172
  880. package/src/prepare/__tests__/schema-readers.unit.test.ts +0 -16
  881. package/src/prepare/index.ts +0 -8
  882. package/src/prepare/schema-readers.ts +0 -20
  883. package/src/record/__tests__/environment-record.test.ts +0 -35
  884. package/src/record/__tests__/frame-targets.unit.test.ts +0 -54
  885. package/src/record/__tests__/membership-timing.unit.test.ts +0 -524
  886. package/src/record/__tests__/render-submission.integration.test.ts +0 -76
  887. package/src/record/__tests__/render-submission.perf.test.ts +0 -141
  888. package/src/record/__tests__/shadow-submit-mode.unit.test.ts +0 -88
  889. package/src/record/__tests__/view-ubo-layout.unit.test.ts +0 -101
  890. package/src/record/frame-observation.ts +0 -122
  891. package/src/record/index.ts +0 -15
  892. package/src/record/main-pass-skin.ts +0 -51
  893. package/src/record/main-pass-sprite.ts +0 -166
  894. package/src/record/material-payload.ts +0 -292
  895. package/src/record/material-slot-plan.ts +0 -68
  896. package/src/record/membership-timing.ts +0 -1012
  897. package/src/record/shadow-caster-uniform.ts +0 -37
  898. package/src/record/shadow-submit-mode.ts +0 -277
  899. package/src/render-dispatch-membership.ts +0 -155
  900. package/src/render-pipeline-context.ts +0 -332
  901. package/src/render-pipeline-target.ts +0 -96
  902. package/src/render-scene-projection.ts +0 -1738
  903. package/src/render-system-fold.ts +0 -531
  904. package/src/renderer/asset-service.ts +0 -32
  905. package/src/renderer/backend-selection.ts +0 -121
  906. package/src/renderer/environment-classify.ts +0 -30
  907. package/src/renderer/environment-error.ts +0 -19
  908. package/src/renderer/material/pipeline-projection.ts +0 -140
  909. package/src/renderer.ts +0 -940
  910. package/src/scene-utils/collect-subtree.ts +0 -40
  911. package/src/ssao-data.ts +0 -106
  912. package/src/surface-format.ts +0 -37
  913. package/src/taa-history-store.ts +0 -429
  914. package/src/temporal-coverage.ts +0 -106
  915. package/src/temporal-frame-transaction.ts +0 -301
  916. package/src/temporal-inspection.ts +0 -194
  917. package/src/temporal-view.ts +0 -174
  918. package/src/tilemap/resolve-tileset-runtime.ts +0 -72
package/src/renderer.ts DELETED
@@ -1,940 +0,0 @@
1
- // @forgeax/engine-runtime — Renderer public-surface types + class.
2
- //
3
- // K-4 contract:
4
- // - `Renderer.backend` is an opaque marker (`'webgpu'`); callers never
5
- // branch on the underlying backend type, only on this string.
6
- // - `Renderer.draw([world], { cameraOwner: 0, resourceOwner: 0 })` runs one frame for the supplied worlds.
7
- // - `Renderer.onLost(cb)` registers a notify-only listener for device loss.
8
- // - `Renderer.onError(cb)` registers a listener for RHI creation-time errors.
9
- // - `Renderer.dispose()` releases GPU resources + detaches all listeners.
10
- //
11
- // AC-15 source-level guarantee: this file does NOT touch `window` or
12
- // `document` at import time; canvas is supplied by the caller.
13
-
14
- import type { CreateShaderModule } from '@forgeax/engine-debug-draw';
15
- import type { World } from '@forgeax/engine-ecs';
16
- import type { InputSnapshot } from '@forgeax/engine-input';
17
- import type { ProfileFrameToken, Profiler } from '@forgeax/engine-profiler';
18
- import type { RenderGraphError } from '@forgeax/engine-render-graph';
19
- import type { Result, RhiDevice, RhiError, RhiInstance } from '@forgeax/engine-rhi';
20
- import type { ShaderError, ShaderRegistry } from '@forgeax/engine-shader';
21
- import type { SkinError } from '@forgeax/engine-skinning';
22
- import type { Handle, ImageError, RenderPipelineAsset, Submesh } from '@forgeax/engine-types';
23
- import type { RenderAssetPort } from './assets/render-asset-port';
24
- import type { RenderAssetResolutionError } from './assets/resolve-render-asset';
25
- import type { EngineMetrics } from './engine-metrics';
26
- import type { RecoverError } from './errors/recover';
27
- import type { ObservationUnavailableError, RenderError } from './errors/render';
28
- import type { RenderFeature, RenderFeatureDiagnostics } from './features/types';
29
- import type { MeshMaterialBindingObservation } from './mesh-material-bindings';
30
- import type { MeshUpdateError } from './mesh-update-errors';
31
- import type { PipelineError } from './pipeline-errors';
32
- import type { PostProcessError } from './post-process-errors';
33
- import type { FrameObservation, FrameObservationOptions } from './record/frame-observation';
34
- import type {
35
- MembershipTimingController,
36
- MembershipTimingOptions,
37
- } from './record/membership-timing';
38
- import type { RenderPipeline } from './render-pipeline';
39
- import type { RenderSceneInspection } from './render-system';
40
-
41
- export type RenderResult<T, E> =
42
- | { readonly ok: true; readonly value: T }
43
- | { readonly ok: false; readonly error: E };
44
-
45
- export interface RendererInstallError {
46
- readonly code: string;
47
- readonly hint: string;
48
- }
49
-
50
- /** Backend marker — single-element union preserved for future extensibility (D-2). */
51
- export type RendererBackend = 'webgpu';
52
-
53
- /**
54
- * `renderer.draw(worlds, options)` owner options
55
- * (feat-20260709-editor-world-partition M1 / w6, plan-strategy §2 D-3).
56
- *
57
- * The single `owner` index that previously served BOTH the surfaced cameras
58
- * and the singleton render resources (skylight / skybox / postProcessParams) is
59
- * split into two independent indices:
60
- * - `cameraOwner` — the world whose cameras are surfaced.
61
- * - `resourceOwner` — the world whose skylight / skybox / postProcessParams
62
- * are surfaced.
63
- *
64
- * Both owners are always explicit. Single-world callers pass zero for both;
65
- * composite callers may select different worlds.
66
- */
67
- export type DrawOwnerOptions = {
68
- readonly cameraOwner: number;
69
- readonly resourceOwner: number;
70
- readonly profileFrame?: ProfileFrameToken;
71
- };
72
-
73
- /** Information attached to a device-loss notification. */
74
- export interface RendererLostInfo {
75
- /** Concise machine-readable cause, mapped to a single vocabulary. */
76
- reason: string;
77
- /** Free-form description (UA / extension / driver text). */
78
- message: string;
79
- }
80
-
81
- /** Listener registered through `Renderer.onLost`. */
82
- export type RendererLostListener = (info: RendererLostInfo) => void;
83
-
84
- /**
85
- * Composite error type reachable through the `Renderer.onError` fan-out channel
86
- * (D-4). This is the fan-out channel's *wire contract* — it does NOT define any
87
- * error; it only references the cluster unions whose members can arrive here.
88
- * As such it is an external wire alias (AGENTS.md Change stance add-only wire
89
- * exception), NOT the eliminated cross-cluster `RuntimeError` SSOT (D-3).
90
- *
91
- * Composition = `RhiError | ShaderError | RenderError | RenderAssetResolutionError |
92
- * SkinError | PostProcessError`. This equals the pre-decomposition
93
- * `RhiError | RuntimeError | PostProcessError` exactly: `RuntimeError` was
94
- * `RenderError | RenderAssetResolutionError | SkinError` (27 classes). `RecoverError`
95
- * and `EngineEnvironmentError` are intentionally excluded — neither is ever
96
- * fired through `onError` (`RecoverError` returns from `recover()`,
97
- * `EngineEnvironmentError` throws at construction), matching the original
98
- * `RuntimeError` union which excluded both (OOS-3 behavior equivalence).
99
- *
100
- * AI consumers do `switch (err.code)` over the union: the disjoint
101
- * `RhiErrorCode` / `RenderErrorCode` / `RenderAssetResolutionErrorCode` / `SkinErrorCode`
102
- * / `PostProcessErrorCode` literal sets let TS narrow each arm to the concrete
103
- * class (charter P3 union discoverability — every fan-out member is reachable
104
- * in an exhaustive switch, no `as any` escape). Example:
105
- *
106
- * ```ts
107
- * renderer.onError((err) => {
108
- * switch (err.code) {
109
- * case 'asset-not-found': // RenderAssetResolutionError arm, err narrowed here
110
- * return report(err.hint);
111
- * // ...one arm per RhiErrorCode | RenderErrorCode | RenderAssetResolutionErrorCode
112
- * // | SkinErrorCode | PostProcessErrorCode member; no default needed,
113
- * // TS flags any unhandled code at compile time.
114
- * }
115
- * });
116
- * ```
117
- */
118
- export type RendererError =
119
- | RhiError
120
- | ShaderError
121
- | RenderGraphError
122
- | ImageError
123
- | RenderError
124
- | RenderAssetResolutionError
125
- | SkinError
126
- | PostProcessError
127
- | PipelineError;
128
-
129
- /**
130
- * Listener registered through `Renderer.onError` (fix-f2). Receives any
131
- * {@link RendererError} fanned out through the channel.
132
- */
133
- export type RendererErrorListener = (error: RendererError) => void;
134
-
135
- /**
136
- * Built-in graph pass owners used as nested children of `record/graph-execute`.
137
- * Unknown extension pass names use the explicit `other` bucket so custom
138
- * pipelines retain a bounded catalog while the default render workload gets
139
- * actionable owner attribution.
140
- */
141
- export const RENDER_GRAPH_EXECUTION_PHASE_CATALOG = [
142
- 'record/graph-execute/point-shadow',
143
- 'record/graph-execute/cluster-binner-upload',
144
- 'record/graph-execute/g-buffer',
145
- 'record/graph-execute/g-buffer/geometry-loop',
146
- 'record/graph-execute/g-buffer/material-bind-groups',
147
- 'record/graph-execute/g-buffer/pipeline-selection',
148
- 'record/graph-execute/g-buffer/draw-submit',
149
- 'record/graph-execute/ssao-calc',
150
- 'record/graph-execute/ssao-blur',
151
- 'record/graph-execute/lighting',
152
- 'record/graph-execute/forward',
153
- 'record/graph-execute/forward/geometry-loop',
154
- 'record/graph-execute/forward/material-bind-groups',
155
- 'record/graph-execute/forward/pipeline-selection',
156
- 'record/graph-execute/forward/draw-submit',
157
- 'record/graph-execute/scene-temporal',
158
- 'record/graph-execute/scene-temporal/geometry-loop',
159
- 'record/graph-execute/scene-temporal/material-bind-groups',
160
- 'record/graph-execute/scene-temporal/pipeline-selection',
161
- 'record/graph-execute/scene-temporal/draw-submit',
162
- 'record/graph-execute/tonemap',
163
- 'record/graph-execute/debug-overlay',
164
- 'record/graph-execute/shadow',
165
- 'record/graph-execute/spot-shadow',
166
- 'record/graph-execute/skybox',
167
- 'record/graph-execute/main',
168
- 'record/graph-execute/fxaa',
169
- 'record/graph-execute/bloom-bright',
170
- 'record/graph-execute/bloom-blur-h',
171
- 'record/graph-execute/bloom-blur-v',
172
- 'record/graph-execute/bloom-composite',
173
- 'record/graph-execute/other',
174
- ] as const;
175
-
176
- export type RenderGraphExecutionPhase = (typeof RENDER_GRAPH_EXECUTION_PHASE_CATALOG)[number];
177
-
178
- /** Bounded producer-owned children of the scene-state record owner. */
179
- export const RENDER_HDRP_BINNER_PHASE_CATALOG = [
180
- 'record/scene-state/hdrp-cluster/binner/light-bounds-and-occupancy',
181
- 'record/scene-state/hdrp-cluster/binner/light-bounds-and-occupancy/light-aabb',
182
- 'record/scene-state/hdrp-cluster/binner/light-bounds-and-occupancy/cluster-occupancy',
183
- 'record/scene-state/hdrp-cluster/binner/cluster-reserve',
184
- 'record/scene-state/hdrp-cluster/binner/input-preparation',
185
- 'record/scene-state/hdrp-cluster/binner/bin-core',
186
- 'record/scene-state/hdrp-cluster/binner/light-index-write',
187
- 'record/scene-state/hdrp-cluster/binner/light-index-write/bounds-read',
188
- 'record/scene-state/hdrp-cluster/binner/light-index-write/cluster-write',
189
- ] as const;
190
-
191
- export type RenderHdrpBinnerPhase = (typeof RENDER_HDRP_BINNER_PHASE_CATALOG)[number];
192
-
193
- export const RENDER_HDRP_CLUSTER_PHASE_CATALOG = [
194
- 'record/scene-state/hdrp-cluster/binner',
195
- ...RENDER_HDRP_BINNER_PHASE_CATALOG,
196
- 'record/scene-state/hdrp-cluster/payload-packing',
197
- 'record/scene-state/hdrp-cluster/buffer-upload',
198
- ] as const;
199
-
200
- export type RenderHdrpClusterPhase = (typeof RENDER_HDRP_CLUSTER_PHASE_CATALOG)[number];
201
-
202
- export const RENDER_SCENE_STATE_PHASE_CATALOG = [
203
- 'record/scene-state/fold-buckets',
204
- 'record/scene-state/lighting-prep',
205
- 'record/scene-state/ambient-resolution',
206
- 'record/scene-state/directional-shadow-cache',
207
- 'record/scene-state/hdrp-cluster',
208
- ...RENDER_HDRP_CLUSTER_PHASE_CATALOG,
209
- ] as const;
210
-
211
- export type RenderSceneStatePhase = (typeof RENDER_SCENE_STATE_PHASE_CATALOG)[number];
212
-
213
- /**
214
- * Opt-in boundaries inside one `Renderer.draw` call. The observer is a
215
- * diagnostics seam only: it receives wall-time boundaries and must never be
216
- * required for rendering correctness. The stage names mirror the existing
217
- * engine-owned Extract / Prepare / Record orchestration so a host can measure
218
- * attribution without guessing from RHI command counts.
219
- */
220
- export const RENDER_RECORD_PHASE_CATALOG = [
221
- 'record/scene-state',
222
- ...RENDER_SCENE_STATE_PHASE_CATALOG,
223
- 'record/swapchain',
224
- 'record/render-graph',
225
- 'record/target-views',
226
- 'record/validation',
227
- 'record/dispatch-plan',
228
- 'record/uploads',
229
- 'record/bind-groups',
230
- 'record/graph-execute',
231
- ...RENDER_GRAPH_EXECUTION_PHASE_CATALOG,
232
- ] as const;
233
-
234
- export type RenderRecordPhase = (typeof RENDER_RECORD_PHASE_CATALOG)[number];
235
-
236
- export const RENDER_PHASE_CATALOG = [
237
- 'extract',
238
- 'bind-groups',
239
- 'features',
240
- 'sort',
241
- 'record',
242
- ...RENDER_RECORD_PHASE_CATALOG,
243
- ] as const;
244
-
245
- export type RenderPhase = (typeof RENDER_PHASE_CATALOG)[number];
246
-
247
- export type RenderPhaseSkipReason =
248
- | 'feature-host-unavailable'
249
- | 'feature-host-empty'
250
- | 'pipeline-state-unavailable'
251
- | 'camera-unavailable';
252
-
253
- /** First-version options bag (intentionally empty; reserved for v0.1). */
254
- export interface RendererOptions {
255
- /** Producer-owned features installed by the renderer host. */
256
- readonly features?: readonly RenderFeature<unknown>[] | undefined;
257
- /** Explicit profiler capability shared by App and Render. */
258
- readonly profiler?: Profiler | undefined;
259
- /** Explicit, Render-owned membership timing capability. Omitted means zero timing work. */
260
- readonly membershipTiming?: MembershipTimingOptions | undefined;
261
- /** @internal Enables producer-owned shadow markers for an active RHI capture. */
262
- readonly debugShadowObservation?: boolean | undefined;
263
- // feat-20260608-create-app-param-surface-trim / M1 / AC-02: `clearColor`
264
- // was deleted as a one-cut breaking change (AGENTS.md Change stance +
265
- // requirements constraint #1: no deprecation window, no shim). Scene
266
- // clear color now lives on the Camera entity (`clearColor`, an inline
267
- // array<f32,4> column as of feat-20260709 M3); zero-Camera fallback uses
268
- // `ZERO_CAMERA_CLEAR_FALLBACK = [0, 0, 0, 1]` from
269
- // `render-system-record`. AI users that pass `{ clearColor: [...] }` on
270
- // RendererOptions still get a TS2353 excess-property error at compile time.
271
- //
272
- // feat-20260608-create-app-param-surface-trim / M2 / AC-06 + D-3:
273
- // `shaderManifestUrl` was deleted from RendererOptions and moved to
274
- // the third-arg `BundlerOptions` (build-tool injection channel). The
275
- // fallback literal '/shaders/manifest.json' stays at the createRenderer
276
- // body site (D-2 q5-A) so the LO 1.1 zero-config takeoff path keeps
277
- // working without any explicit injection. AI users that pass
278
- // `{ shaderManifestUrl: '...' }` to RendererOptions get a TS2353
279
- // excess-property error at compile time pointing them to the third
280
- // arg (charter P1 progressive disclosure -- the message names
281
- // BundlerOptions, not a free-form string).
282
- /**
283
- * D-S1 single-point exemption channel (feat-20260508-rhi-surface-completion
284
- * / w9): raw GPUDevice used by the GPUCanvasContext.configure({device})
285
- * path. GPUCanvasContext is outside the RHI surface (spec couples context
286
- * to canvas, not GPUDevice), so the raw GPUDevice is injected through
287
- * RendererOptions.rawDeviceForContextConfigure. apps/hello/triangle/src/main.ts:96
288
- * captures the raw device via _internal_getRawDevice and passes it in;
289
- * every other engine path goes through the RHI interface.
290
- *
291
- * Accepted forms:
292
- * - direct value (unknown) - raw GPUDevice already captured
293
- * - thunk `() => unknown | undefined` - lazy capture, evaluated AFTER
294
- * createRenderer's internal rhi.requestDevice settles (lets callers
295
- * wrap requestDevice to capture the raw device transparently)
296
- *
297
- * Type intentionally unknown: keeps the RHI surface free of raw GPUDevice
298
- * typing; webgpu-backend internally casts to GPUDevice.
299
- */
300
- readonly rawDeviceForContextConfigure?: unknown | (() => unknown | undefined);
301
- /**
302
- * M3 D-P4 escape hatch (feat-20260511-rhi-wgpu-impl): explicit
303
- * `RhiInstance` injection bypasses the dynamic-import auto-select
304
- * facade. When set, `createRenderer` uses this instance verbatim and
305
- * neither `@forgeax/engine-rhi-webgpu` nor `@forgeax/engine-rhi-wgpu` is imported
306
- * dynamically (charter proposition 5 discoverable opt-in /
307
- * plan-strategy §6 M3 + §7.4 escape hatch + Bevy
308
- * `RenderCreation::Manual` partial equivalent).
309
- *
310
- * Typical use cases:
311
- * - Testing / debugging — inject a deterministic stub.
312
- * - Pinning a specific backend (e.g. `@forgeax/engine-rhi-wgpu` even when
313
- * `navigator.gpu` is present, for cross-shim regression tests).
314
- * - Advanced AI users implementing their own `RhiInstance` shim.
315
- *
316
- * AI users who want the default behaviour leave this field omitted;
317
- * `navigator.gpu` presence/absence drives the dynamic import (see the
318
- * `createRenderer` JSDoc for the full auto-select decision tree).
319
- */
320
- readonly rhi?: RhiInstance | undefined;
321
- /** Runtime-owned typed instrumentation callbacks for optional RHI capture. */
322
- readonly rhiInstrumentation?:
323
- | import('./renderer/backend-selection').RhiBackendInstrumentation
324
- | undefined;
325
- }
326
-
327
- /**
328
- * Public Renderer surface. The concrete class is constructed by
329
- * `createRenderer(canvas, options?)`; callers never instantiate this directly.
330
- *
331
- * ECS render bridge error tier table (D-S3 / D-S4 / D-S6 / D-S7 / D-S8):
332
- *
333
- * | Path | Behaviour | onError fired? |
334
- * |:--|:--|:--|
335
- * | `ready` step 1 manifest load fails | settles err (`ShaderError 'manifest-malformed'` / `'shader-not-found'`) | no — surfaced through `await renderer.ready` |
336
- * | `ready` step 2 pipeline compile fails | settles err (`RhiError 'shader-compile-failed'` / `'feature-not-enabled'` / `'limit-exceeded'`) | no — surfaced through ready |
337
- * | `ready` step 3 asset upload fails | settles err (`RhiError 'limit-exceeded'` / `'webgpu-runtime-error'`) | no — surfaced through ready |
338
- * | `draw([world], { cameraOwner: 0, resourceOwner: 0 })` before `ready` settles (D-S4) | frame skipped | yes — `'rhi-not-available'` |
339
- * | RenderSystem 0 Camera | frame skipped | yes — `'render-system-no-camera'` |
340
- * | RenderSystem N>1 Camera | first archetype hit rendered | yes — `'render-system-multi-camera'` |
341
- * | RenderSystem N>1 DirectionalLight | first archetype hit used | yes — `'render-system-multi-light'` |
342
- * | RenderSystem 0 DirectionalLight | unlit fallback (intensity = 0) | no — D-Q7 softening |
343
- * | RenderSystem 0 renderables (Camera entity only) | clear pass executed; canvas painted with `Camera.clearColor`; no geometry submitted | no — D-Q7 softening |
344
- * | RenderSystem all renderables fail asset-not-found | clear pass executed; per-entity `'asset-not-found'` fires for each unregistered handle | yes — per entity |
345
- * | RenderSystem entity missing Transform / MeshRenderer | default value used | no — D-Q7 softening |
346
- * | RenderSystem unregistered `MeshFilter.assetHandle` | entity skipped | yes — `'asset-not-found'` (`detail = { assetHandle }`) |
347
- * | RenderSystem internal exception (mat4 NaN / GPU bounds) | frame skipped + retry next frame | yes — `'webgpu-runtime-error'` (`detail = { error }`) |
348
- */
349
- export interface Renderer {
350
- /** Opaque backend marker (K-4). */
351
- readonly backend: RendererBackend;
352
- /**
353
- * Captured RhiDevice handle. The forgeax RhiDevice the engine created
354
- * internally via `rhi.requestAdapter() -> adapter.requestDevice()`.
355
- * AI users read through this accessor instead of monkey-patching
356
- * `rhi.requestAdapter` to capture the device handle.
357
- */
358
- readonly device: RhiDevice;
359
- /**
360
- * @internal
361
- *
362
- * Shader-module creation must stay on the backend pack selected while the
363
- * renderer was assembled. Engine-owned extensions (debug-draw is the
364
- * current consumer) use this seam instead of importing a concrete RHI
365
- * module again; a second bundled rhi-webgpu copy cannot recognize the
366
- * renderer's opaque device handle.
367
- */
368
- readonly _internal_createShaderModule: CreateShaderModule;
369
- /**
370
- * Instance-per-engine ShaderRegistry: on first access this lazy property
371
- * constructs a `ShaderRegistry({ device, manifestUrl })` instance;
372
- * subsequent accesses return the same instance. Callers must
373
- * `await shader.loadManifest()` before they can call `shader.get(hash)`.
374
- */
375
- readonly shader: ShaderRegistry;
376
- /**
377
- * App-owned `AssetRegistry` for GUID loads. Geometry payloads become
378
- * World shared references at the consumer boundary.
379
- * or register custom meshes via `renderer.assets.register(asset).unwrap()`.
380
- */
381
- readonly assets: RenderAssetPort;
382
- /**
383
- * feat-20260527-sprite-nineslice M4 / w16 (D-5 + AC-16): per-Renderer
384
- * metrics counter for runtime-time soft signals.
385
- *
386
- * AI users read `renderer.metrics.snapshot()['<feature>.<event>']` to observe
387
- * events the engine surfaces without a `console.warn` flood (charter P3:
388
- * machine-readable counters over text). Two methods compose the surface:
389
- *
390
- * | Method | Purpose |
391
- * |:------------------------|:-----------------------------------------|
392
- * | `increment(name)` | Engine-internal: bump counter for `name`.|
393
- * | `snapshot()` | AI-user-facing: read all counters. |
394
- * | `reset()` | Test isolation: drop every counter. |
395
- *
396
- * Currently surfaced counters (closed namespace, see `EngineMetrics`
397
- * JSDoc):
398
- *
399
- * - `nineslice.scale-too-small` (AC-16, w17 end-to-end)
400
- * - `nineslice.tile-needs-repeat-sampler` (D-9, w18 register-time soft-warn)
401
- *
402
- * Multi-Renderer isolation: each Renderer instance owns its own EngineMetrics
403
- * (D-5 candidate 1) so per-test counters never bleed across renderers.
404
- */
405
- readonly metrics: EngineMetrics;
406
- /**
407
- * feat-20260601-gpu-resource-store-extraction M1: the GPU residency store.
408
- * `renderer.assets` keeps the CPU POD registry; `renderer.store` owns the
409
- * GPU resource lifecycle. Render-path texture / mesh residency is pulled
410
- * lazily via `store.ensureResident`. The equirect-to-cubemap IBL projection
411
- * is engine internals (feat-20260630 D-3): AI users declare
412
- * `Skylight{equirect}` and the record arm drives the projection; there is no
413
- * user-facing upload call. The store holds no AssetRegistry reference (D-2);
414
- * callers pass the source POD fetched from `renderer.assets`.
415
- */
416
- // biome-ignore lint/suspicious/noExplicitAny: GPU store is runtime-owned and opaque at the public seam.
417
- readonly store: any;
418
- /**
419
- * Replace bytes in a resident dynamic mesh while preserving its layout,
420
- * index format, counts, topology, submeshes, and allocation sizes.
421
- */
422
- updateMesh(
423
- handle: Handle<'MeshAsset', 'shared'>,
424
- vertices: Float32Array,
425
- indices: Uint16Array | Uint32Array | undefined,
426
- worldId?: number,
427
- submeshes?: readonly Submesh[],
428
- ): Result<void, MeshUpdateError | RhiError>;
429
- /**
430
- * Replace one contiguous vertex range. The range size is expressed in
431
- * vertices; the resident mesh metadata supplies the byte stride.
432
- */
433
- updateMeshVertexRange(
434
- handle: Handle<'MeshAsset', 'shared'>,
435
- vertices: Float32Array,
436
- firstVertex: number,
437
- vertexCount: number,
438
- worldId?: number,
439
- ): Result<void, MeshUpdateError | RhiError>;
440
- /**
441
- * V-2 first-class input shim (plan-strategy D-2 + AC-09 — feat-20260519).
442
- *
443
- * Curried `(world: World) => InputSnapshot | undefined` reader: a thin
444
- * facade over `world.getResource<InputSnapshot>('InputSnapshot')`.
445
- *
446
- * Charter P5 producer/consumer split: the renderer never holds a World
447
- * reference; the World is supplied per call so the renderer lifecycle
448
- * remains decoupled from the World lifecycle.
449
- *
450
- * Returns `undefined` when no InputSnapshot Resource is registered on
451
- * the World (charter P3: empty signal is the signal).
452
- */
453
- readonly input: {
454
- snapshot(world: World): InputSnapshot | undefined;
455
- };
456
- /**
457
- * Initialization barrier (D-S3 — feat-20260509-ecs-render-bridge-mvp).
458
- *
459
- * Resolves only after three steps complete, in strict serial order:
460
- * 1. `shader.loadManifest()` — fetch + parse manifest.json.
461
- * 2. PBR pipeline compile — `createShaderModule` + 3x
462
- * `createBindGroupLayout` (view / material / mesh-array) +
463
- * `createPipelineLayout` + `createRenderPipeline`.
464
- * 3. Render-owned builtin mesh upload — `createBuffer` +
465
- * `queue.writeBuffer` for cube + triangle vertex / index buffers.
466
- * Any step failure settles with `Result.err(RhiError)`.
467
- *
468
- * Calling `draw([world], { cameraOwner: 0, resourceOwner: 0 })` before `ready` settles fires
469
- * `onError` with `'rhi-not-available'` and skips the frame (D-S4).
470
- *
471
- * @example
472
- * const renderer = await createRenderer(canvas);
473
- * const ready = await renderer.ready;
474
- * if (!ready.ok) throw ready.error;
475
- * const attached = renderer.attachWorld(world);
476
- * if (!attached.ok) throw attached.error;
477
- * const updated = world.update(1 / 60);
478
- * if (!updated.ok) throw updated.error;
479
- * const r = renderer.draw([world], { cameraOwner: 0, resourceOwner: 0 });
480
- * if (!r.ok) console.error(r.error);
481
- */
482
- readonly ready: Promise<RenderResult<void, RhiError>>;
483
- /** Backend-aware membership timing, present only when explicitly requested. */
484
- readonly membershipTiming?: MembershipTimingController;
485
- /**
486
- * Attach renderer-required derived-state systems to a World once.
487
- *
488
- * The systems run inside `World.update()`; `draw()` and its extract stage
489
- * remain read-only consumers of the resulting World state. Reattaching the
490
- * same World to this Renderer is a no-op.
491
- */
492
- attachWorld(world: World): RenderResult<void, RhiError>;
493
- /**
494
- * Release this Renderer's derived-state ownership of one World.
495
- * Idempotent; after detach, draw rejects the World until it is attached and
496
- * successfully updated again.
497
- */
498
- detachWorld(world: World): void;
499
- /**
500
- * Draw one frame for the supplied World (D-S2 + K-4 rewrite).
501
- *
502
- * RenderSystem (engine-internal phase) walks the World query graph
503
- * across three stages — Extract / Prepare / Record — and submits a
504
- * single GPU command buffer per call. Per-call behaviour is governed by
505
- * the error tier table on `Renderer` (D-S4..D-S8); AI users observe
506
- * fan-out through `onError` and frame-skip semantics through the same
507
- * structured RhiError closed union.
508
- *
509
- * @example Spawn-then-draw:
510
- * const world = new World();
511
- * world.spawn(
512
- * { component: Transform, data: cameraTransform },
513
- * { component: Camera, data: cameraParams },
514
- * );
515
- * world.spawn({
516
- * component: MeshFilter,
517
- * data: { assetHandle: cubeMesh },
518
- * });
519
- * const ready = await renderer.ready;
520
- * if (!ready.ok) throw ready.error;
521
- * const attached = renderer.attachWorld(world);
522
- * if (!attached.ok) throw attached.error;
523
- * const updated = world.update(1 / 60);
524
- * if (!updated.ok) throw updated.error;
525
- * const r = renderer.draw([world], { cameraOwner: 0, resourceOwner: 0 });
526
- * if (!r.ok) handleError(r.error);
527
- *
528
- * w24 — Result<void, RhiError> shape: returns Result.ok(undefined) on
529
- * success; Result.err(rhiError) on facade-level catch (transient runtime
530
- * exception). Per-stage RhiError continues to fan out through `onError`
531
- * (charter proposition 5; D-P6 dual-channel preserved). The Result return
532
- * is the synchronous facade-level summary; AI users can ignore it or
533
- * branch on `.ok` (biome lint warns on unhandled return).
534
- *
535
- * feat-20260708-composited-multi-world-rendering M3 (AC-01 / AC-02 / D-5),
536
- * extended by feat-20260709-editor-world-partition M1 / w6: `worlds` is
537
- * composited into one frame — renderables + lights merge from every world,
538
- * while cameras come from the `cameraOwner` world and singleton resources
539
- * (skylight / skybox / postProcessParams) come from the `resourceOwner`
540
- * world. {@link DrawOwnerOptions} requires both authorities explicitly as
541
- * `{ cameraOwner, resourceOwner }`.
542
- * Single-world users pass `draw([world], { cameraOwner: 0, resourceOwner: 0 })` (the app frame-loop
543
- * does this wrapping transparently). Entry validation returns `Result.err`
544
- * before any extract on:
545
- * - empty `worlds` -> `'render-system-empty-worlds'`
546
- * - `cameraOwner` out of range -> `'render-system-owner-out-of-range'`
547
- * (`.detail = { role: 'camera', owner, worldCount }`)
548
- * - `resourceOwner` out of range -> `'render-system-owner-out-of-range'`
549
- * (`.detail = { role: 'resource', owner, worldCount }`)
550
- * cameraOwner is validated before resourceOwner (first offender wins).
551
- *
552
- * @example Composite two worlds (owner supplies both camera + resources):
553
- * const scene = new World(); // camera + lights + geometry
554
- * const overlay = new World(); // extra geometry, no camera
555
- * const r = renderer.draw([scene, overlay], { cameraOwner: 0, resourceOwner: 0 });
556
- * if (!r.ok) handleError(r.error);
557
- *
558
- * @example Split owners (scene camera, editor-overlay resources):
559
- * const r = renderer.draw([scene, editor], { cameraOwner: 0, resourceOwner: 1 });
560
- */
561
- draw(worlds: readonly World[], options: DrawOwnerOptions): RenderResult<void, RhiError>;
562
- /**
563
- * Observe the producer-owned linear HDR attachment from the most recently
564
- * completed frame. This never reads the final display canvas.
565
- */
566
- observeCurrentFrame(
567
- options: FrameObservationOptions,
568
- ): Promise<RenderResult<FrameObservation, ObservationUnavailableError>>;
569
- /**
570
- * Read the canvas's current pixel contents back into an RGBA Uint8Array.
571
- *
572
- * Reads the WebGPU canvas's backing image via the lowest-common-
573
- * denominator browser path: `createImageBitmap → OffscreenCanvas 2D
574
- * drawImage → getImageData`. The WebGPU canvas's GPUTexture is not
575
- * directly readable via `getImageData`, so this OffscreenCanvas bounce
576
- * is the canonical browser path; AI users avoid hand-rolling the
577
- * recipe (charter proposition 5 consistent abstraction).
578
- *
579
- * Returns top-left origin RGBA (the natural getImageData convention).
580
- * Apps that need bottom-left origin (parity comparisons against
581
- * `gl.readPixels`) Y-flip the result locally.
582
- *
583
- * AI users typically: `renderer.draw([world], { cameraOwner: 0, resourceOwner: 0 })` to update the canvas,
584
- * then `await renderer.readPixels()` to sample. Output buffer length
585
- * is `canvas.width * canvas.height * 4`.
586
- *
587
- * | Path | Behavior |
588
- * |:--|:--|
589
- * | OffscreenCanvas + 2D ctx all available | `Result.ok(Uint8Array)` |
590
- * | OffscreenCanvas / 2D ctx unavailable | `Result.err(RhiError 'webgpu-runtime-error')` (`detail.error: string`) |
591
- * | `createImageBitmap` throws | `Result.err(RhiError 'webgpu-runtime-error')` (`detail.error: string`) |
592
- *
593
- * dawn-node smoke harness path uses raw RHI (`device.queue.copyTexture
594
- * ToBuffer + mapAsync`) directly against an offscreen `GPUTexture` —
595
- * that path has no canvas and does not collapse with this method.
596
- * Future RHI-level readback abstraction tracked separately.
597
- */
598
- readPixels(): Promise<RenderResult<Uint8Array, RhiError>>;
599
- /**
600
- * Relinquish the canvas presentation surface while preserving the Renderer,
601
- * AssetRegistry, and CPU-side render declarations. Idempotent. Draws fail
602
- * closed until restoreSurface() succeeds.
603
- */
604
- releaseSurface(): RenderResult<void, RhiError>;
605
- /** Re-enable presentation on the same canvas/device after releaseSurface(). */
606
- restoreSurface(): RenderResult<void, RhiError>;
607
- /**
608
- * Release renderer-owned resources + detach listeners. Idempotent.
609
- *
610
- * @placeholder fix-f6: M2/M3 placeholder form — the `RhiDevice` interface
611
- * does not yet expose a `destroy()` entry, so the current implementation
612
- * only detaches the listener registry + blocks subsequent `draw()` calls;
613
- * the underlying GPU resources are reclaimed naturally via the spec
614
- * pass-through layer (`device.lost` pass-through + browser GC). The
615
- * explicit `device.destroy()` path will be closed out in a later RHI
616
- * interface extension. See the `Renderer.dispose` row of the "API index"
617
- * in `packages/engine/README.md` plus plan-strategy §6 NOTE on M3 scope.
618
- */
619
- dispose(): void;
620
- /** Register a notify-only listener for device-loss. Returns unsubscribe fn. */
621
- onLost(listener: RendererLostListener): () => void;
622
- /**
623
- * Register an RHI creation-time error listener (fix-f2 / charter
624
- * proposition 4 explicit-failure delivery).
625
- *
626
- * @returns unsubscribe fn
627
- */
628
- onError(listener: RendererErrorListener): () => void;
629
- /**
630
- * Pull-style health snapshot. Returns the canonical `HealthSnapshot` from the
631
- * registry's last-fired state, or the alive baseline when never fired. No
632
- * second store — derived from `HealthListenerRegistry.getLastSnapshot()` per
633
- * D-4 SSOT.
634
- *
635
- * AI users consume via `switch (snap.reason)`; TS narrows `snap.detail` to
636
- * the per-reason detail type without `as` casts.
637
- */
638
- health(): HealthSnapshot;
639
- /**
640
- * Attempt a single idempotent device rebuild (feat-20260622-s5 M3).
641
- *
642
- * Only acts in the `device-lost` health state; `alive` returns
643
- * `recover-not-needed` (also returned after a successful rebuild — the
644
- * renderer is alive again, so a second recover() is a no-op signal).
645
- * Rebuild sequence: `gpuStore.destroyAll()` + `context.unconfigure()` ->
646
- * clear the render-graph pendingDestroy queue (B-2) -> re-acquire device via
647
- * the same backend pack (`requestAdapter` -> `requestDevice`) -> rebuild
648
- * Shader/Pipeline -> re-attach the device.lost fan-out -> `fire('alive')`.
649
- * CPU POD caches (AssetRegistry catalog/payload, pack cache) survive; only
650
- * GPU resources are released and re-uploaded on the next draw via
651
- * `ensureResident` (A-AC-12).
652
- *
653
- * Async because device acquisition is async (`requestAdapter` /
654
- * `requestDevice`). A single attempt: no retry loop, no backoff, no timer
655
- * (A-OOS-1). On failure resolves `Result.err` (`recover-adapter-unavailable`
656
- * / `recover-device-unavailable`) and leaves `health().reason ===
657
- * 'device-lost'` — recover() never fakes the renderer back to `alive`
658
- * (A-AC-07). The host owns the retry cadence (call recover() again after a
659
- * host-chosen delay).
660
- */
661
- recover(): Promise<Result<void, RecoverError>>;
662
- /**
663
- * Push-style health subscription with unsubscribe.
664
- *
665
- * Delegates to `HealthListenerRegistry.add(cb)` — late-attach replay fires
666
- * the callback immediately when a snapshot has already been emitted, so
667
- * late-subscribing callers still see the current state (AC-07).
668
- *
669
- * @returns unsubscribe function
670
- */
671
- onHealthChange(cb: HealthChangeListener): () => void;
672
- /**
673
- * feat-20260520-directional-light-shadow-mapping M1c / w8:
674
- * debugReadback reads the shadow depth texture (depth32float) into a 5-
675
- * pixel POD { center, corners: {tl,tr,bl,br}, mapSize }. Uses
676
- * copyTextureToBuffer + mapAsync + Float32Array direct read. Returns null
677
- * when no shadow RT is allocated (shadow pass hasn't run yet, or no
678
- * DirectionalLight with castShadow).
679
- * With cascaded shadows, if the legacy center/corner sentinels are all
680
- * clear, `center` is the nearest written texel in cascade 0 so the POD
681
- * still exposes the owner that populated the atlas.
682
- *
683
- * AI users consume per-pixel depth values as [0,1] floats; no 24-in-32
684
- * unorm decode needed (depth32float, D-2 round-3).
685
- */
686
- debugReadback?(): Promise<{
687
- readonly center: number;
688
- readonly corners: {
689
- readonly tl: number;
690
- readonly tr: number;
691
- readonly bl: number;
692
- readonly br: number;
693
- };
694
- readonly mapSize: number;
695
- } | null>;
696
- /**
697
- * feat-20260520-directional-light-shadow-mapping M1c / w8:
698
- * lights.directionalShadow exposes shadow configuration (mapSize,
699
- * lightSpaceMatrix) for Inspector consumption. Null when the renderer
700
- * has no active shadow system (shader manifest empty or no
701
- * DirectionalLight with castShadow).
702
- */
703
- readonly directionalShadow?: {
704
- readonly mapSize: number;
705
- readonly lightSpaceMatrix: readonly number[] | null;
706
- } | null;
707
- /**
708
- * feat-20260520-directional-light-shadow-mapping M2 / w14 (AC-12):
709
- * debugSampleShadowFactor runs a producer-owned GPU probe for world-space
710
- * positions. It reads the same shadow atlas and PCF path as the directional
711
- * receiver, then returns the factor plus the selected cascade and the center
712
- * atlas texel's raw depth. The extra fields keep the forensic readback tied
713
- * to the actual sampled resource rather than a CPU reconstruction.
714
- *
715
- * Returns null when the probe pipeline is not compiled (empty shader
716
- * manifest). When no shadow caster is active (lightSpaceMatrix absent),
717
- * returns all-1.0 (fully lit) — the caller can distinguish "no shadow
718
- * data" from "probe unavailable".
719
- * Each result carries `shadowFactor` (1 = lit, 0 = fully shadowed),
720
- * `sampledDepth` (the center texel loaded from the active atlas),
721
- * `cascadeIndex` (0..3, or -1 when no cascade contains the position), and
722
- * `receiverDepth` (the projected depth used by the probe comparison), and
723
- * `bias` (the exact depth bias used by the probe comparison).
724
- */
725
- debugSampleShadowFactor?(
726
- worldPositions: ReadonlyArray<readonly [number, number, number]>,
727
- options?: {
728
- /** Surface normals for the supplied receiver positions. Defaults to floor-up. */
729
- readonly surfaceNormals?: ReadonlyArray<readonly [number, number, number]>;
730
- },
731
- ): Promise<ReadonlyArray<{
732
- readonly shadowFactor: number;
733
- readonly sampledDepth: number;
734
- readonly cascadeIndex: number;
735
- readonly receiverDepth: number;
736
- readonly bias: number;
737
- }> | null>;
738
- /**
739
- * feat-20260528-frustum-culling M5 / w14: per-frame frustum-culling
740
- * statistics collected during the extract stage. `culled` is the count
741
- * of entities removed from renderables by frustum culling; `total` is
742
- * the count that reached the culling decision point. Both are zero
743
- * before the first `draw([world], { cameraOwner: 0, resourceOwner: 0 })` or when no `MeshRenderer` entities
744
- * are in the world.
745
- */
746
- readonly frustumStats: { readonly culled: number; readonly total: number };
747
- /**
748
- * Per-frame candidate entities rejected by author visibility before resource
749
- * parsing. Zero before the first draw or when no candidates are hidden.
750
- */
751
- readonly visibilityStats: { readonly explicitlyHidden: number };
752
- /** Persistent CPU scene cursor, rebuild, and delta counters. */
753
- readonly renderScene: RenderSceneInspection;
754
- /** Mesh-slot provenance and active structured diagnostics from the last frame. */
755
- readonly meshMaterialBindings: readonly MeshMaterialBindingObservation[];
756
- /**
757
- * feat-20260531-bloom-first-declarative-render-graph-pass M4 fix-up w19:
758
- * per-frame render-graph pass names in declaration order. Empty array
759
- * before the first `draw([world], { cameraOwner: 0, resourceOwner: 0 })` call; populated lazily when the
760
- * per-frame graph is built. Read-only introspection surface so smoke
761
- * tests can assert the declarative pass chain is wired without reaching
762
- * into engine internals.
763
- */
764
- readonly perFramePassNames: readonly string[];
765
- /**
766
- * Return the host-owned lifecycle snapshot for every registered feature.
767
- *
768
- * Consumers branch on `status` and `latestError?.code`; they do not parse
769
- * log text or reach into the feature host. A failed feature retries on the
770
- * next eligible frame, a disabled feature waits for `recover()`, and a
771
- * disposed feature is terminal. Pipeline switches preserve registrations
772
- * while rebuilding the active graph.
773
- */
774
- renderFeatureDiagnostics(): readonly RenderFeatureDiagnostics[];
775
- /** Subscribe to feature lifecycle changes without polling every render frame. */
776
- subscribeRenderFeatureDiagnostics(listener: () => void): () => void;
777
- /** Subscribe after a `draw()` invocation reaches queue submission. */
778
- subscribeFrameEnd(listener: () => void): () => void;
779
- /**
780
- * Install a feature after the renderer is ready. The renderer keeps feature
781
- * identity and lifecycle ownership in the same host as boot-time features;
782
- * installing the same object twice is a no-op, while a different object with
783
- * the same identity returns `render-feature-registration-conflict`.
784
- */
785
- installRenderFeature(feature: RenderFeature<unknown>): Promise<RenderResult<void, RenderError>>;
786
- /** Wait for submitted GPU work, then reversibly remove one installed feature. */
787
- uninstallRenderFeature(feature: RenderFeature<unknown>): Promise<RenderResult<void, RenderError>>;
788
- /**
789
- * feat-20260531-per-frame-bind-group-cache M1 / w4: per-frame
790
- * createBindGroup counter. Reset to 0 on every `draw([world], { cameraOwner: 0, resourceOwner: 0 })` call,
791
- * bumped per cache-miss in the record stage. Stable-frame AC-03
792
- * asserts `createBindGroup === 0` when all bind groups are cached.
793
- * AI users read this getter to verify cache effectiveness without
794
- * inspecting internal cache state.
795
- */
796
- readonly bindGroupCounts: { readonly createBindGroup: number; readonly keys: readonly string[] };
797
- /**
798
- * feat-20260601-customizable-render-pipeline-seam M1 / w8: register a render-pipeline
799
- * logic under `id` (engine builtins use the `forgeax::` prefix; user pipelines use
800
- * `<package>::<id>`). Same-id re-register throws `PipelineError`
801
- * (`'pipeline-already-registered'`) - programmer-error fail-fast. Sits alongside
802
- * `shader` / `assets` / `store` as a public capability surface (charter F1 IDE
803
- * autocomplete on `renderer.`). Forwards 1:1 to the RenderSystem layer.
804
- */
805
- registerPipeline(id: string, impl: RenderPipeline): void;
806
- /**
807
- * feat-20260601-customizable-render-pipeline-seam M1 / w8 (D-19): install the pipeline
808
- * described by a `RenderPipelineAsset` POD (built inline, no registration step). On an
809
- * unregistered `pipelineId` returns `Result.err(PipelineError{code:'pipeline-not-found'})`;
810
- * AI users consume `err.code` by property access. On success the next `draw` rebuilds the
811
- * per-frame graph through the newly installed pipeline (runtime hot-swap).
812
- */
813
- installPipeline(asset: RenderPipelineAsset): Result<() => void, PipelineError>;
814
- /**
815
- * feat-20260604-resource-owning-render-graph-and-fullscreen-postpr M2 / F-2 fix-up:
816
- * fullscreen post-process registration channel. `postProcess.register(id, entry)`
817
- * registers a `PostProcessShaderEntry` under `id`; the dispatcher in
818
- * `addFullscreenPass({shader: id})` looks it up via `runtime.lookupPostProcess`.
819
- * Same-id re-register throws `PostProcessError({code:'post-process-already-registered'})`
820
- * (programmer-error fail-fast, mirrors `registerPipeline`). An unregistered id
821
- * referenced by `addFullscreenPass` throws `PostProcessError({code:'post-process-not-found'})`
822
- * from the dispatcher. Sits alongside `registerPipeline` / `installPipeline` as a
823
- * public capability surface (charter F1: IDE autocomplete on `renderer.postProcess.`).
824
- * Forwards 1:1 to the RenderSystem layer (plan-strategy D-D).
825
- */
826
- readonly postProcess: {
827
- register(
828
- id: string,
829
- entry: import('./fullscreen-post-process-pass').PostProcessShaderEntry,
830
- ): () => void;
831
- };
832
- /**
833
- * feat-20260612-skin-palette-per-frame-upload M1 / m1-1: test-only access
834
- * hatch returning the internal `PipelineState` closure variable (or `null`
835
- * before `await renderer.ready` settles). Mirrors the existing
836
- * `_internal_getRawDevice` pattern so unit tests can assert PipelineState
837
- * field shape (e.g. `skinPaletteAllocator` presence after stub retirement)
838
- * without re-routing through `RenderSystem`. Public surface stays opaque:
839
- * the return is widened to `unknown`, callers cast at the test boundary.
840
- * @internal
841
- */
842
- _internal_getPipelineState(): unknown;
843
- }
844
-
845
- // ────────────────────────────────────────────────────────────────────────────
846
- // Renderer health / recover surface (feat-20260621-renderer-health-recover-skeleton M1)
847
- // ────────────────────────────────────────────────────────────────────────────
848
-
849
- /**
850
- * Closed union of renderer health states.
851
- *
852
- * 3 members per plan-strategy D-1:
853
- * - `'alive'` — healthy baseline (registry not yet fired)
854
- * - `'device-lost'` — device loss detected
855
- * - `'internal-fault'` — internal renderer fault
856
- *
857
- * AI users exhaustively switch on `HealthReason` without default; TS guards
858
- * completeness.
859
- */
860
- export type HealthReason = 'alive' | 'device-lost' | 'internal-fault';
861
-
862
- /** Detail for `HealthReason 'device-lost'`. */
863
- export interface HealthDetailDeviceLost {
864
- readonly lostReason: 'unknown' | 'destroyed';
865
- readonly message: string;
866
- }
867
-
868
- /** Detail for `HealthReason 'internal-fault'`. */
869
- export interface HealthDetailInternalFault {
870
- readonly message: string;
871
- }
872
-
873
- /**
874
- * Pull-style health snapshot — discriminated union by `reason`.
875
- *
876
- * Per plan-strategy D-2: `switch(snap.reason)` narrows `snap.detail` to the
877
- * per-reason detail type automatically, with zero `as` casts. `alive` has no
878
- * `.detail` field; `device-lost` / `internal-fault` have a required `.detail`
879
- * of the respective variant.
880
- *
881
- * - `recoverable` — derived from `reason` via `deriveRecoverable`
882
- */
883
- export type HealthSnapshot =
884
- | { readonly reason: 'alive'; readonly recoverable: boolean }
885
- | {
886
- readonly reason: 'device-lost';
887
- readonly detail: HealthDetailDeviceLost;
888
- readonly recoverable: boolean;
889
- }
890
- | {
891
- readonly reason: 'internal-fault';
892
- readonly detail: HealthDetailInternalFault;
893
- readonly recoverable: boolean;
894
- };
895
-
896
- /**
897
- * Maps `HealthReason` to recoverable boolean per the derive table
898
- * (requirements section "range"):
899
- *
900
- * | reason | recoverable |
901
- * |:---------------|:-----------|
902
- * | `'alive'` | false |
903
- * | `'device-lost'`| true |
904
- * | `'internal-fault'` | false |
905
- */
906
- /** Callback type for `Renderer.onHealthChange`. */
907
- export type HealthChangeListener = (snapshot: HealthSnapshot) => void;
908
-
909
- // ────────────────────────────────────────────────────────────────────────────
910
- // Internal — shared listener-registry helper (used by both backends).
911
- // ────────────────────────────────────────────────────────────────────────────
912
-
913
- /**
914
- * Internal helper: a tiny notify-only event registry. Not exported on the
915
- * public surface (the explicit `./internal` export is locked in package.json).
916
- */
917
- /**
918
- * Internal helper: fan-out registry for the `Renderer.onError` channel (fix-f2
919
- * delivers the charter proposition 4 explicit-failure red line).
920
- *
921
- * Difference from `LostListenerRegistry`: this registry fans out structured
922
- * structured error objects from the fan-out families composed in
923
- * `RendererError` — both carrying the `.code` closed-union discriminant + the
924
- * three fields `.expected` / `.hint` + optional `.detail`. Late-attach replay
925
- * behavior is identical — errors that fired before dispose are immediately
926
- * replayed to any subsequent `add`.
927
- */
928
- /**
929
- * Internal helper: fan-out registry for the `Renderer.onHealthChange` channel
930
- * (feat-20260621-renderer-health-recover-skeleton M1).
931
- *
932
- * 3rd isomorph of the `LostListenerRegistry` / `RhiErrorListenerRegistry` pattern
933
- * (plan-strategy D-5 / OOS-5: do not extract a generic base class). Replicates:
934
- * - `fired` / `lastSnapshot` for late-attach replay
935
- * - `add(listener)` returns unsubscribe function
936
- * - `fire(snapshot)` with try/catch isolation (console.error on throw)
937
- * - `clear()` detaches listeners, does not reset `fired` / `lastSnapshot`
938
- * - `getLastSnapshot()` — public getter returning last fired snapshot or
939
- * `{ reason: 'alive', recoverable: false }` baseline
940
- */