@forgeax/engine-render 0.1.20 → 0.1.21

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 (372) hide show
  1. package/README.md +215 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/assembly/device-feature-admission.d.ts +18 -0
  4. package/dist/assembly/device-feature-admission.d.ts.map +1 -0
  5. package/dist/assembly/directional-shadow-inspection.d.ts +38 -0
  6. package/dist/assembly/directional-shadow-inspection.d.ts.map +1 -0
  7. package/dist/assembly/factory.d.ts +21 -18
  8. package/dist/assembly/factory.d.ts.map +1 -1
  9. package/dist/assembly/host-contract.d.ts +9 -0
  10. package/dist/assembly/host-contract.d.ts.map +1 -1
  11. package/dist/assembly/render-target-host.d.ts +46 -0
  12. package/dist/assembly/render-target-host.d.ts.map +1 -0
  13. package/dist/assets/render-asset-port.d.ts.map +1 -1
  14. package/dist/authoring.mjs +3 -0
  15. package/dist/authoring.mjs.map +1 -1
  16. package/dist/capture/cube-views.d.ts +21 -0
  17. package/dist/capture/cube-views.d.ts.map +1 -0
  18. package/dist/capture/scheduler.d.ts +54 -0
  19. package/dist/capture/scheduler.d.ts.map +1 -0
  20. package/dist/{chunk-4XINDLAY.mjs → chunk-5YADUCA7.mjs} +1552 -1361
  21. package/dist/chunk-5YADUCA7.mjs.map +1 -0
  22. package/dist/{chunk-TBQJOK2L.mjs → chunk-6OPXDQ2E.mjs} +364 -51
  23. package/dist/chunk-6OPXDQ2E.mjs.map +1 -0
  24. package/dist/{chunk-M2MP4ZOU.mjs → chunk-BXBQQKFQ.mjs} +3 -9
  25. package/dist/chunk-BXBQQKFQ.mjs.map +1 -0
  26. package/dist/{chunk-CDTWTHZR.mjs → chunk-FS2KNUQH.mjs} +548 -6
  27. package/dist/chunk-FS2KNUQH.mjs.map +1 -0
  28. package/dist/components/camera.d.ts +1 -0
  29. package/dist/components/camera.d.ts.map +1 -1
  30. package/dist/components/cube-camera.d.ts +20 -0
  31. package/dist/components/cube-camera.d.ts.map +1 -0
  32. package/dist/components/directional-light.d.ts +11 -2
  33. package/dist/components/directional-light.d.ts.map +1 -1
  34. package/dist/components/directional-shadow-filter.d.ts +25 -0
  35. package/dist/components/directional-shadow-filter.d.ts.map +1 -0
  36. package/dist/components/index.d.ts +2 -0
  37. package/dist/components/index.d.ts.map +1 -1
  38. package/dist/components/light-helpers.d.ts.map +1 -1
  39. package/dist/components/reflection-probe.d.ts +17 -0
  40. package/dist/components/reflection-probe.d.ts.map +1 -0
  41. package/dist/construct-renderer.mjs +5826 -1003
  42. package/dist/construct-renderer.mjs.map +1 -1
  43. package/dist/environment/frame.d.ts.map +1 -1
  44. package/dist/environment/lifecycle.d.ts +5 -0
  45. package/dist/environment/lifecycle.d.ts.map +1 -1
  46. package/dist/errors/render.d.ts +141 -93
  47. package/dist/errors/render.d.ts.map +1 -1
  48. package/dist/extract/directional-shadow-projection.d.ts +23 -0
  49. package/dist/extract/directional-shadow-projection.d.ts.map +1 -0
  50. package/dist/extract/environment.d.ts +14 -0
  51. package/dist/extract/environment.d.ts.map +1 -1
  52. package/dist/extract/visibility.d.ts.map +1 -1
  53. package/dist/features/fullscreen.d.ts.map +1 -1
  54. package/dist/features/targets.d.ts.map +1 -1
  55. package/dist/features/types.d.ts +10 -0
  56. package/dist/features/types.d.ts.map +1 -1
  57. package/dist/fullscreen-post-process-pass.d.ts +13 -2
  58. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  59. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  60. package/dist/gpu-driven/production-raster.d.ts +0 -1
  61. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  62. package/dist/gpu-scene.d.ts.map +1 -1
  63. package/dist/hdrp-buffers.d.ts +19 -17
  64. package/dist/hdrp-buffers.d.ts.map +1 -1
  65. package/dist/ibl/IblPipelineCache.d.ts +4 -0
  66. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  67. package/dist/ibl/kernel-cache.d.ts +36 -0
  68. package/dist/ibl/kernel-cache.d.ts.map +1 -0
  69. package/dist/index.d.ts +28 -3
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.mjs +4 -4
  72. package/dist/index.mjs.map +1 -1
  73. package/dist/inspection-types.d.ts +51 -0
  74. package/dist/inspection-types.d.ts.map +1 -1
  75. package/dist/instances-derived-bounds.d.ts +50 -0
  76. package/dist/instances-derived-bounds.d.ts.map +1 -0
  77. package/dist/internal.mjs +1 -1
  78. package/dist/light-buffer-layout.d.ts +10 -1
  79. package/dist/light-buffer-layout.d.ts.map +1 -1
  80. package/dist/mesh-material-bindings.d.ts +54 -0
  81. package/dist/mesh-material-bindings.d.ts.map +1 -1
  82. package/dist/pbr-pipeline.d.ts +14 -4
  83. package/dist/pbr-pipeline.d.ts.map +1 -1
  84. package/dist/pipeline/standard-forward-lane.d.ts +2 -1
  85. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  86. package/dist/pipeline/standard-lighting/errors.d.ts +4 -0
  87. package/dist/pipeline/standard-lighting/errors.d.ts.map +1 -0
  88. package/dist/pipeline/standard-lighting/graph.d.ts +24 -0
  89. package/dist/pipeline/standard-lighting/graph.d.ts.map +1 -0
  90. package/dist/pipeline/standard-lighting/inspection.d.ts +38 -0
  91. package/dist/pipeline/standard-lighting/inspection.d.ts.map +1 -0
  92. package/dist/pipeline/standard-lighting/layout.d.ts +28 -0
  93. package/dist/pipeline/standard-lighting/layout.d.ts.map +1 -0
  94. package/dist/pipeline/standard-lighting/light-frame.d.ts +33 -0
  95. package/dist/pipeline/standard-lighting/light-frame.d.ts.map +1 -0
  96. package/dist/pipeline/standard-lighting/membership.d.ts +14 -0
  97. package/dist/pipeline/standard-lighting/membership.d.ts.map +1 -0
  98. package/dist/pipeline/standard-lighting/prepare.d.ts +16 -0
  99. package/dist/pipeline/standard-lighting/prepare.d.ts.map +1 -0
  100. package/dist/pipeline/standard-lighting/topology.d.ts +45 -0
  101. package/dist/pipeline/standard-lighting/topology.d.ts.map +1 -0
  102. package/dist/pipeline/standard-lighting/transport.d.ts +36 -0
  103. package/dist/pipeline/standard-lighting/transport.d.ts.map +1 -0
  104. package/dist/pipeline/standard-pipeline.d.ts +4 -13
  105. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  106. package/dist/pipeline/standard-post.d.ts.map +1 -1
  107. package/dist/pipeline/standard-profile.d.ts +5 -26
  108. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  109. package/dist/pipeline-spec.d.ts +40 -7
  110. package/dist/pipeline-spec.d.ts.map +1 -1
  111. package/dist/point-shadow-inspection.d.ts +21 -0
  112. package/dist/point-shadow-inspection.d.ts.map +1 -0
  113. package/dist/record/frame-lighting.d.ts +27 -32
  114. package/dist/record/frame-lighting.d.ts.map +1 -1
  115. package/dist/record/frame-snapshot.d.ts +28 -14
  116. package/dist/record/frame-snapshot.d.ts.map +1 -1
  117. package/dist/record/frame-targets.d.ts +5 -0
  118. package/dist/record/frame-targets.d.ts.map +1 -1
  119. package/dist/record/frame.d.ts +10 -4
  120. package/dist/record/frame.d.ts.map +1 -1
  121. package/dist/record/gpu-pass-timing/contract.d.ts +96 -0
  122. package/dist/record/gpu-pass-timing/contract.d.ts.map +1 -0
  123. package/dist/record/gpu-pass-timing/errors.d.ts +18 -0
  124. package/dist/record/gpu-pass-timing/errors.d.ts.map +1 -0
  125. package/dist/record/gpu-pass-timing/index.d.ts +8 -0
  126. package/dist/record/gpu-pass-timing/index.d.ts.map +1 -0
  127. package/dist/record/gpu-pass-timing/parser.d.ts +11 -0
  128. package/dist/record/gpu-pass-timing/parser.d.ts.map +1 -0
  129. package/dist/record/gpu-pass-timing/session.d.ts +43 -0
  130. package/dist/record/gpu-pass-timing/session.d.ts.map +1 -0
  131. package/dist/record/gpu-timing.d.ts +8 -3
  132. package/dist/record/gpu-timing.d.ts.map +1 -1
  133. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  134. package/dist/record/main-pass-material.d.ts +22 -1
  135. package/dist/record/main-pass-material.d.ts.map +1 -1
  136. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  137. package/dist/record/main-pass.d.ts +2 -0
  138. package/dist/record/main-pass.d.ts.map +1 -1
  139. package/dist/record/render-context.d.ts +43 -2
  140. package/dist/record/render-context.d.ts.map +1 -1
  141. package/dist/record/shadow-pass.d.ts.map +1 -1
  142. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  143. package/dist/record/typed-frame-graph.d.ts +72 -4
  144. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  145. package/dist/record/view-ubo.d.ts +7 -4
  146. package/dist/record/view-ubo.d.ts.map +1 -1
  147. package/dist/reflection/filter.d.ts +22 -0
  148. package/dist/reflection/filter.d.ts.map +1 -0
  149. package/dist/reflection/gpu-table.d.ts +25 -0
  150. package/dist/reflection/gpu-table.d.ts.map +1 -0
  151. package/dist/reflection/projection.d.ts +91 -0
  152. package/dist/reflection/projection.d.ts.map +1 -0
  153. package/dist/render-contract.d.ts +49 -7
  154. package/dist/render-contract.d.ts.map +1 -1
  155. package/dist/render-graph-primitives.d.ts +1 -0
  156. package/dist/render-graph-primitives.d.ts.map +1 -1
  157. package/dist/render-pipeline.d.ts +42 -2
  158. package/dist/render-pipeline.d.ts.map +1 -1
  159. package/dist/render-system-extract.d.ts +58 -17
  160. package/dist/render-system-extract.d.ts.map +1 -1
  161. package/dist/render-system.d.ts +17 -2
  162. package/dist/render-system.d.ts.map +1 -1
  163. package/dist/renderer.d.ts +43 -0
  164. package/dist/renderer.d.ts.map +1 -0
  165. package/dist/scene/render-scene.d.ts +14 -0
  166. package/dist/scene/render-scene.d.ts.map +1 -1
  167. package/dist/shadow-atlas.d.ts +3 -3
  168. package/dist/shadow-atlas.d.ts.map +1 -1
  169. package/dist/ssao-buffers.d.ts +3 -0
  170. package/dist/ssao-buffers.d.ts.map +1 -1
  171. package/dist/targets/contracts.d.ts +66 -0
  172. package/dist/targets/contracts.d.ts.map +1 -0
  173. package/dist/targets/graph-projection.d.ts +29 -0
  174. package/dist/targets/graph-projection.d.ts.map +1 -0
  175. package/dist/targets/material-source.d.ts +34 -0
  176. package/dist/targets/material-source.d.ts.map +1 -0
  177. package/dist/targets/owner.d.ts +32 -0
  178. package/dist/targets/owner.d.ts.map +1 -0
  179. package/dist/targets/physical.d.ts +18 -0
  180. package/dist/targets/physical.d.ts.map +1 -0
  181. package/dist/targets/readback.d.ts +39 -0
  182. package/dist/targets/readback.d.ts.map +1 -0
  183. package/dist/temporal/index.mjs +3 -3
  184. package/dist/typed-render-graph-primitives.d.ts +1 -1
  185. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  186. package/dist/typed-shadow-passes.d.ts +1 -1
  187. package/dist/typed-shadow-passes.d.ts.map +1 -1
  188. package/dist/volume/passes.d.ts +2 -2
  189. package/dist/volume/passes.d.ts.map +1 -1
  190. package/package.json +20 -20
  191. package/src/__tests__/bloom-exact-zero.unit.test.ts +48 -19
  192. package/src/__tests__/bloom-lifecycle.integration.test.ts +41 -13
  193. package/src/__tests__/camera-target-consumption.unit.test.ts +53 -0
  194. package/src/__tests__/cluster-binner.unit.test.ts +35 -0
  195. package/src/__tests__/cluster-grid-default-surface.unit.test.ts +7 -2
  196. package/src/__tests__/cube-camera-scheduler.unit.test.ts +70 -0
  197. package/src/__tests__/cube-camera-single-submit.perf.test.ts +75 -0
  198. package/src/__tests__/cube-camera-view-matrices.unit.test.ts +41 -0
  199. package/src/__tests__/cube-camera-vocabulary.unit.test.ts +47 -0
  200. package/src/__tests__/cube-camera.integration.test.ts +42 -0
  201. package/src/__tests__/device-feature-admission.unit.test.ts +73 -0
  202. package/src/__tests__/direct-light-snapshot.unit.test.ts +3 -3
  203. package/src/__tests__/docs-gate-green.unit.test.ts +38 -0
  204. package/src/__tests__/factory-contract.integration.test.ts +255 -29
  205. package/src/__tests__/fog-component.unit.test.ts +67 -0
  206. package/src/__tests__/fog.integration.test.ts +86 -0
  207. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +37 -0
  208. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +10 -9
  209. package/src/__tests__/gpu-driven-indirect-raster.dawn.test.ts +17 -1
  210. package/src/__tests__/gpu-driven-production.integration.test.ts +16 -17
  211. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +12 -4
  212. package/src/__tests__/gpu-pass-timing-browser-runner.ts +281 -0
  213. package/src/__tests__/gpu-pass-timing-coexistence.integration.test.ts +80 -0
  214. package/src/__tests__/gpu-pass-timing-contract.unit.test.ts +243 -0
  215. package/src/__tests__/gpu-pass-timing-exact-zero.unit.test.ts +131 -0
  216. package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +230 -0
  217. package/src/__tests__/gpu-pass-timing-observation.unit.test.ts +233 -0
  218. package/src/__tests__/gpu-pass-timing-session.unit.test.ts +438 -0
  219. package/src/__tests__/gpu-pass-timing.browser.test.ts +26 -0
  220. package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +125 -0
  221. package/src/__tests__/hdrp-group2-visibility.unit.test.ts +24 -0
  222. package/src/__tests__/instances-culling.integration.test.ts +94 -0
  223. package/src/__tests__/instances-derived-bounds.unit.test.ts +118 -0
  224. package/src/__tests__/material-observation.integration.test.ts +101 -0
  225. package/src/__tests__/pbr-view-layout.unit.test.ts +16 -0
  226. package/src/__tests__/point-shadow-inspection.unit.test.ts +60 -0
  227. package/src/__tests__/public-surface.test-d.ts +10 -0
  228. package/src/__tests__/reflection-probe-authoring.unit.test.ts +71 -0
  229. package/src/__tests__/reflection-probe-filter.unit.test.ts +54 -0
  230. package/src/__tests__/reflection-probe-ibl-topology.unit.test.ts +45 -0
  231. package/src/__tests__/reflection-probe-pass-encode.integration.test.ts +101 -0
  232. package/src/__tests__/reflection-probe-performance.perf.test.ts +60 -0
  233. package/src/__tests__/reflection-probe-recovery.integration.test.ts +55 -0
  234. package/src/__tests__/reflection-probe-selection.unit.test.ts +46 -0
  235. package/src/__tests__/render-error-code-owner.test-d.ts +18 -3
  236. package/src/__tests__/render-feature-docs.unit.test.ts +1 -1
  237. package/src/__tests__/render-target-admission.unit.test.ts +80 -0
  238. package/src/__tests__/render-target-graph-projection.unit.test.ts +102 -0
  239. package/src/__tests__/render-target-inspection.unit.test.ts +52 -0
  240. package/src/__tests__/render-target-material-source.test-d.ts +30 -0
  241. package/src/__tests__/render-target-material-source.unit.test.ts +97 -0
  242. package/src/__tests__/render-target-owner-placement.unit.test.ts +203 -0
  243. package/src/__tests__/render-target-owner.unit.test.ts +122 -0
  244. package/src/__tests__/render-target-probe-soak.perf.test.ts +94 -0
  245. package/src/__tests__/render-target-public-schema.json +107 -0
  246. package/src/__tests__/render-target-public-schema.unit.test.ts +91 -0
  247. package/src/__tests__/render-target-public-surface.test-d.ts +83 -0
  248. package/src/__tests__/render-target-readback.integration.test.ts +90 -0
  249. package/src/__tests__/render-target-recovery.integration.test.ts +85 -0
  250. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +48 -0
  251. package/src/__tests__/renderer-lifecycle.integration.test.ts +14 -0
  252. package/src/__tests__/shader-stage-surface.unit.test.ts +19 -4
  253. package/src/__tests__/skin-motion-regression.unit.test.ts +132 -0
  254. package/src/__tests__/skinned-shadow-caster.test.ts +11 -2
  255. package/src/__tests__/standard-cluster-capability.integration.test.ts +63 -0
  256. package/src/__tests__/standard-cluster-transport.unit.test.ts +121 -0
  257. package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +232 -0
  258. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +8 -5
  259. package/src/__tests__/standard-lighting-inspection.integration.test.ts +138 -0
  260. package/src/__tests__/standard-lighting-ssot.unit.test.ts +18 -0
  261. package/src/__tests__/standard-lighting-write.unit.test.ts +377 -0
  262. package/src/__tests__/standard-lighting.integration.test.ts +67 -0
  263. package/src/__tests__/standard-pipeline.dawn.test.ts +206 -5
  264. package/src/__tests__/standard-pipeline.integration.test.ts +181 -150
  265. package/src/__tests__/standard-probe-binding.unit.test.ts +25 -0
  266. package/src/__tests__/standard-profile-oracle.unit.test.ts +23 -38
  267. package/src/__tests__/typed-pipeline-topology.unit.test.ts +395 -14
  268. package/src/__tests__/urp-pipeline-targets.unit.test.ts +2 -2
  269. package/src/__tests__/visibility-resolver.unit.test.ts +15 -0
  270. package/src/assembly/device-feature-admission.ts +73 -0
  271. package/src/assembly/directional-shadow-inspection.ts +122 -0
  272. package/src/assembly/factory.ts +877 -286
  273. package/src/assembly/host-contract.ts +25 -0
  274. package/src/assembly/render-target-host.ts +847 -0
  275. package/src/assets/asset-decoders.ts +1 -1
  276. package/src/assets/render-asset-port.ts +7 -1
  277. package/src/capture/cube-views.ts +69 -0
  278. package/src/capture/scheduler.ts +265 -0
  279. package/src/components/__tests__/schema-contract.unit.test.ts +12 -0
  280. package/src/components/__tests__/schema-parity.unit.test.ts +9 -0
  281. package/src/components/camera.ts +4 -0
  282. package/src/components/cube-camera.ts +52 -0
  283. package/src/components/directional-light.ts +22 -2
  284. package/src/components/directional-shadow-filter.ts +57 -0
  285. package/src/components/index.ts +2 -0
  286. package/src/components/light-helpers.ts +81 -7
  287. package/src/components/reflection-probe.ts +49 -0
  288. package/src/environment/frame.ts +6 -24
  289. package/src/environment/lifecycle.ts +12 -0
  290. package/src/errors/render.ts +286 -142
  291. package/src/extract/directional-shadow-projection.ts +61 -0
  292. package/src/extract/environment.ts +57 -0
  293. package/src/extract/visibility.ts +25 -1
  294. package/src/features/fullscreen.ts +3 -0
  295. package/src/features/targets.ts +4 -1
  296. package/src/features/types.ts +10 -0
  297. package/src/fullscreen-post-process-pass.ts +43 -2
  298. package/src/gpu-driven/batch-topology.ts +1 -0
  299. package/src/gpu-driven/production-raster.ts +1 -3
  300. package/src/gpu-scene.ts +8 -1
  301. package/src/hdrp-buffers.ts +165 -59
  302. package/src/ibl/IblPipelineCache.ts +11 -0
  303. package/src/ibl/kernel-cache.ts +88 -0
  304. package/src/index.ts +148 -0
  305. package/src/inspection-types.ts +56 -0
  306. package/src/instances-derived-bounds.ts +171 -0
  307. package/src/light-buffer-layout.ts +20 -5
  308. package/src/mesh-material-bindings.ts +132 -0
  309. package/src/pbr-pipeline.ts +106 -17
  310. package/src/pipeline/standard-forward-lane.ts +46 -16
  311. package/src/pipeline/standard-lighting/errors.ts +6 -0
  312. package/src/pipeline/standard-lighting/graph.ts +157 -0
  313. package/src/pipeline/standard-lighting/inspection.ts +88 -0
  314. package/src/pipeline/standard-lighting/layout.ts +31 -0
  315. package/src/pipeline/standard-lighting/light-frame.ts +34 -0
  316. package/src/pipeline/standard-lighting/membership.ts +43 -0
  317. package/src/pipeline/standard-lighting/prepare.ts +37 -0
  318. package/src/pipeline/standard-lighting/topology.ts +120 -0
  319. package/src/pipeline/standard-lighting/transport.ts +77 -0
  320. package/src/pipeline/standard-pipeline.ts +122 -193
  321. package/src/pipeline/standard-post.ts +26 -7
  322. package/src/pipeline/standard-profile.ts +17 -47
  323. package/src/pipeline-spec.ts +84 -21
  324. package/src/point-shadow-inspection.ts +55 -0
  325. package/src/record/__tests__/temporal-payload.unit.test.ts +42 -1
  326. package/src/record/__tests__/transparent-group2-selection.unit.test.ts +73 -0
  327. package/src/record/__tests__/view-ubo-layout.unit.test.ts +40 -0
  328. package/src/record/frame-lighting.ts +367 -427
  329. package/src/record/frame-snapshot.ts +35 -27
  330. package/src/record/frame-targets.ts +17 -0
  331. package/src/record/frame.ts +261 -74
  332. package/src/record/gpu-pass-timing/contract.ts +180 -0
  333. package/src/record/gpu-pass-timing/errors.ts +34 -0
  334. package/src/record/gpu-pass-timing/index.ts +37 -0
  335. package/src/record/gpu-pass-timing/parser.ts +97 -0
  336. package/src/record/gpu-pass-timing/session.ts +938 -0
  337. package/src/record/gpu-timing.ts +21 -12
  338. package/src/record/main-pass-geometry.ts +120 -80
  339. package/src/record/main-pass-material.ts +95 -9
  340. package/src/record/main-pass-sprite-draws.ts +54 -25
  341. package/src/record/main-pass.ts +71 -15
  342. package/src/record/render-context.ts +72 -0
  343. package/src/record/shadow-pass.ts +17 -28
  344. package/src/record/skybox-post-pass.ts +20 -4
  345. package/src/record/typed-frame-graph.ts +893 -44
  346. package/src/record/view-ubo.ts +63 -28
  347. package/src/reflection/filter.ts +81 -0
  348. package/src/reflection/gpu-table.ts +44 -0
  349. package/src/reflection/projection.ts +281 -0
  350. package/src/render-contract.ts +76 -5
  351. package/src/render-graph-primitives.ts +9 -4
  352. package/src/render-pipeline.ts +117 -2
  353. package/src/render-system-extract.ts +557 -100
  354. package/src/render-system.ts +1095 -66
  355. package/src/renderer.ts +222 -0
  356. package/src/scene/render-scene.ts +115 -9
  357. package/src/shadow-atlas.ts +5 -5
  358. package/src/ssao-buffers.ts +9 -2
  359. package/src/targets/contracts.ts +182 -0
  360. package/src/targets/graph-projection.ts +169 -0
  361. package/src/targets/material-source.ts +143 -0
  362. package/src/targets/owner.ts +214 -0
  363. package/src/targets/physical.ts +18 -0
  364. package/src/targets/readback.ts +153 -0
  365. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +59 -20
  366. package/src/typed-render-graph-primitives.ts +5 -3
  367. package/src/typed-shadow-passes.ts +46 -40
  368. package/src/volume/passes.ts +15 -9
  369. package/dist/chunk-4XINDLAY.mjs.map +0 -1
  370. package/dist/chunk-CDTWTHZR.mjs.map +0 -1
  371. package/dist/chunk-M2MP4ZOU.mjs.map +0 -1
  372. package/dist/chunk-TBQJOK2L.mjs.map +0 -1
@@ -31,23 +31,56 @@ import type { RenderFeature, RenderFeatureDiagnostics } from './features/types';
31
31
  import type { PostProcessShaderEntry } from './fullscreen-post-process-pass';
32
32
  import type {
33
33
  BloomInspection,
34
+ DirectionalShadowInspection,
34
35
  MotionBlurInspection,
36
+ ReflectionProbeInspection,
35
37
  RenderSceneInspection,
36
38
  TemporalTargetInspection,
37
39
  TransmissionInspection,
38
40
  } from './inspection-types';
41
+ import type {
42
+ RenderTarget,
43
+ RenderTargetDescriptor,
44
+ RenderTargetReadbackData,
45
+ RenderTargetReadbackRequest,
46
+ RenderTargetReadbackTicket,
47
+ RenderTargetTextureSource,
48
+ RenderTargetTextureSourceOptions,
49
+ } from './targets/contracts';
39
50
  import type { TemporalInspection } from './temporal/inspection';
40
51
 
41
52
  export type { TransmissionInspection } from './inspection-types';
42
53
  export type { PointsLinesInspection } from './points-lines/inspection';
43
54
 
44
55
  import type { MeshMaterialBindingObservation } from './mesh-material-bindings';
56
+ import type { StandardLightingInspection } from './pipeline/standard-lighting/inspection';
45
57
  import type { StandardProfile } from './pipeline/standard-profile';
58
+ import type { PointShadowInspection } from './point-shadow-inspection';
46
59
  import type { PostProcessError } from './post-process-errors';
60
+ import type {
61
+ GpuPassTimingObservation,
62
+ GpuPassTimingOptions,
63
+ } from './record/gpu-pass-timing/index.js';
47
64
  import type { VolumeTimingObservation } from './record/gpu-timing';
48
65
  import type { TemporalView } from './temporal/view';
49
66
  import type { VolumetricFogInspection } from './volume/inspection';
50
67
 
68
+ export type {
69
+ CubeCameraFace,
70
+ CubeCameraUpdateIntent,
71
+ } from './components/cube-camera';
72
+
73
+ export interface CubeCameraSnapshot {
74
+ readonly entityKey?: number;
75
+ readonly target: RenderTarget;
76
+ readonly position: readonly [number, number, number];
77
+ readonly near: number;
78
+ readonly far: number;
79
+ readonly updateIntent: import('./components/cube-camera').CubeCameraUpdateIntent;
80
+ readonly requestVersion: number;
81
+ readonly faceBudget: number;
82
+ }
83
+
51
84
  export type RenderResult<T, E> =
52
85
  | { readonly ok: true; readonly value: T }
53
86
  | { readonly ok: false; readonly error: E };
@@ -65,6 +98,8 @@ export type RenderWorldLease = RenderReadLease;
65
98
  export interface CameraSnapshot {
66
99
  /** Stable ECS identity used by the frame plan's camera authority fact. */
67
100
  readonly entityKey?: number;
101
+ /** Auxiliary logical target; physical views remain renderer-owned. */
102
+ readonly target?: RenderTarget;
68
103
  /** World index supplied by the multi-world extract merge. */
69
104
  readonly worldId?: number;
70
105
  /** Camera-owned history generation forwarded into the frame plan. */
@@ -105,6 +140,9 @@ export interface CameraSnapshot {
105
140
  /** Stable identity owned by the Standard feature host for output transform. */
106
141
  export const STANDARD_OUTPUT_TRANSFORM_FEATURE_ID = 'forgeax::standard::output-transform';
107
142
 
143
+ /** Stable identity for the special FXAA pass' per-frame output policy UBO. */
144
+ export const FXAA_POST_PROCESS_ID = 'forgeax::post::fxaa';
145
+
108
146
  export type {
109
147
  EnvironmentFrame,
110
148
  EnvironmentSource,
@@ -156,6 +194,7 @@ interface RenderPipelineRuntime {
156
194
  id: string,
157
195
  bgl: BindGroupLayout,
158
196
  colorFormat: GPUTextureFormat,
197
+ entry?: PostProcessShaderEntry,
159
198
  ) => RhiRenderPipeline | null;
160
199
  }
161
200
 
@@ -237,6 +276,10 @@ export interface SpotLightProjectorFrameContext {
237
276
  readonly texture: Texture;
238
277
  readonly view: TextureView;
239
278
  readonly sampler: Sampler;
279
+ /** Spot-light index in ExtractedLights.spot for the accepted texture. */
280
+ readonly spotIndex?: number;
281
+ /** Unified Standard Cluster slot index (points precede spots). */
282
+ readonly lightSlotIndex?: number;
240
283
  }
241
284
 
242
285
  /**
@@ -246,6 +289,20 @@ export interface SpotLightProjectorFrameContext {
246
289
  export interface Renderer {
247
290
  attach(world: World): RenderResult<RenderWorldLease, RenderError>;
248
291
  draw(input: RenderFrameInput): RenderResult<FrameReceipt, RenderError>;
292
+ createRenderTarget(descriptor: RenderTargetDescriptor): RenderResult<RenderTarget, RenderError>;
293
+ resizeRenderTarget(
294
+ target: RenderTarget,
295
+ descriptor: RenderTargetDescriptor,
296
+ ): RenderResult<void, RenderError>;
297
+ createRenderTargetTextureSource(
298
+ target: RenderTarget,
299
+ options: RenderTargetTextureSourceOptions,
300
+ ): RenderResult<RenderTargetTextureSource, RenderError>;
301
+ requestTargetReadback(
302
+ target: RenderTarget,
303
+ request: RenderTargetReadbackRequest,
304
+ ): RenderResult<RenderTargetReadbackTicket, RenderError>;
305
+ destroyRenderTarget(target: RenderTarget): RenderResult<void, RenderError>;
249
306
  setProfile(profile: RenderProfile): RenderResult<void, RenderError>;
250
307
  state(): RendererState;
251
308
  inspect(): RenderInspection;
@@ -256,6 +313,7 @@ export interface Renderer {
256
313
  subscribe(listener: (event: RendererEvent) => void): () => void;
257
314
  releaseSurface(): RenderResult<void, RenderError>;
258
315
  restoreSurface(): RenderResult<void, RenderError>;
316
+ /** Recover only from device-lost; a healthy renderer returns a guard error. */
259
317
  recover(): Promise<RenderResult<void, RenderError>>;
260
318
  dispose(): Promise<RenderResult<void, RenderError>>;
261
319
  }
@@ -305,11 +363,12 @@ export interface FrameEnvironment {
305
363
 
306
364
  /**
307
365
  * Receipt-bound observation selection. The request is consumed by `observe`
308
- * only with the matching FrameReceipt and returns a structured Result error
309
- * when the generation or frame identity is stale.
366
+ * only with the matching FrameReceipt after `receipt.completed` and returns a
367
+ * structured Result error when the generation or frame identity is stale.
310
368
  */
311
369
  export interface FrameObservationRequest {
312
- readonly include: readonly ('timings' | 'draws' | 'bindings')[];
370
+ readonly include: readonly ('timings' | 'draws' | 'bindings' | 'target-readbacks')[];
371
+ readonly targetReadbacks?: readonly RenderTargetReadbackTicket[];
313
372
  }
314
373
 
315
374
  /**
@@ -340,8 +399,12 @@ export interface RenderFrameInput {
340
399
  export interface FrameReceiptObservation {
341
400
  readonly frameId: number;
342
401
  readonly deviceGeneration: number;
343
- readonly include: readonly ('timings' | 'draws' | 'bindings')[];
344
- readonly timings?: VolumeTimingObservation;
402
+ readonly include: readonly ('timings' | 'draws' | 'bindings' | 'target-readbacks')[];
403
+ /** Receipt-bound Render-owned GPU pass facts; absent when not requested. */
404
+ readonly timings?: GpuPassTimingObservation | undefined;
405
+ /** Receipt-bound volume GPU timing facts; absent when not requested. */
406
+ readonly volumeTimings?: VolumeTimingObservation | undefined;
407
+ readonly targetReadbacks?: readonly RenderTargetReadbackData[];
345
408
  }
346
409
 
347
410
  /** Stable backend facts for the Standard output transform projection. */
@@ -418,8 +481,13 @@ export interface RenderInspection {
418
481
  readonly frustumStats: { readonly culled: number; readonly total: number };
419
482
  readonly visibilityStats: { readonly explicitlyHidden: number };
420
483
  readonly renderScene: RenderSceneInspection;
484
+ readonly reflectionProbes: ReflectionProbeInspection;
421
485
  /** Last completed transmission candidate facts, detached from GPU handles. */
422
486
  readonly transmission?: TransmissionInspection;
487
+ /** Last prepared Standard transport facts, detached from GPU handles. */
488
+ readonly standardLighting?: StandardLightingInspection;
489
+ /** Renderer-owned point-shadow atlas budget facts from the last frame. */
490
+ readonly pointShadow?: PointShadowInspection;
423
491
  readonly meshMaterialBindings: readonly MeshMaterialBindingObservation[];
424
492
  readonly perFramePassNames: readonly string[];
425
493
  readonly bindGroupCounts: {
@@ -440,6 +508,7 @@ export interface RenderInspection {
440
508
  readonly environment: EnvironmentInspection;
441
509
  readonly temporal: TemporalInspection;
442
510
  readonly bloom: BloomInspection;
511
+ readonly directionalShadow: DirectionalShadowInspection;
443
512
  /** Semantic Standard temporal target metadata; no graph or RHI handles. */
444
513
  readonly temporalTarget?: TemporalTargetInspection;
445
514
  /** Renderer-owned Motion Blur facts; absent when no component is active. */
@@ -651,6 +720,8 @@ export interface RendererOptions {
651
720
  readonly captureGpuTimings?: boolean | undefined;
652
721
  /** Optional host-owned RHI lifecycle instrumentation, such as recording. */
653
722
  readonly rhiInstrumentation?: RhiBackendInstrumentation | undefined;
723
+ /** Optional bounded GPU pass timing facts; this is not frame latency. */
724
+ readonly gpuPassTiming?: GpuPassTimingOptions | undefined;
654
725
  // feat-20260608-create-app-param-surface-trim / M1 / AC-02: `clearColor`
655
726
  // was deleted as a one-cut breaking change (AGENTS.md Change stance +
656
727
  // requirements constraint #1: no deprecation window, no shim). Scene
@@ -550,6 +550,7 @@ function dispatchFullscreenPass(
550
550
  graphPass?: RhiRenderPassEncoder,
551
551
  graphOutputFormat?: GPUTextureFormat,
552
552
  graphDepthView?: TextureView,
553
+ paramsOverride?: Uint8Array,
553
554
  ): void {
554
555
  if (shader === 'fxaa') {
555
556
  if (resolveCtx === undefined) {
@@ -705,7 +706,11 @@ function dispatchFullscreenPass(
705
706
  if (entry.params !== undefined) {
706
707
  const ubo = ctx.runtime.getPostProcessParamsBuffer?.(shader);
707
708
  if (ubo !== undefined) {
708
- const data = ctx.postProcessParams.get(shader);
709
+ // Typed graph passes may make a narrow, per-pass copy of the payload
710
+ // (for example enabling final-surface dither without changing the
711
+ // camera-owned SSOT). Use it when present, while preserving the normal
712
+ // frame snapshot for legacy callers.
713
+ const data = paramsOverride ?? ctx.postProcessParams.get(shader);
709
714
  if (data !== undefined) {
710
715
  if (data.byteLength !== entry.params.byteSize) {
711
716
  throw new PostProcessError({
@@ -769,9 +774,7 @@ function dispatchFullscreenPass(
769
774
  if (lookupPipeline === undefined) return;
770
775
  const postColorFormat = writeFormat;
771
776
  const pipeline = lookupPipeline(shader, built.bindGroupLayout, postColorFormat);
772
- if (pipeline === null) {
773
- return;
774
- }
777
+ if (pipeline === null) return;
775
778
  const handle = built.createHandle(name, pipeline, paramsBuffer);
776
779
 
777
780
  // Open a render pass writing into the resolved color target. Fullscreen
@@ -810,6 +813,7 @@ export function encodeFullscreenPass(
810
813
  readonly outputFormat: GPUTextureFormat;
811
814
  readonly rawSwapchainOutput?: boolean | undefined;
812
815
  readonly depthView?: TextureView | undefined;
816
+ readonly paramsOverride?: Uint8Array | undefined;
813
817
  },
814
818
  ): void {
815
819
  dispatchFullscreenPass(
@@ -824,5 +828,6 @@ export function encodeFullscreenPass(
824
828
  pass,
825
829
  input.outputFormat,
826
830
  input.depthView,
831
+ input.paramsOverride,
827
832
  );
828
833
  }
@@ -35,12 +35,14 @@ import type {
35
35
  } from '@forgeax/engine-rhi';
36
36
  import { ok, type Result } from '@forgeax/engine-types';
37
37
  import type { Tonemap } from './components/camera';
38
+ import type { DirectionalShadowFilterLabel } from './components/directional-shadow-filter';
38
39
  import type { RenderError } from './errors/render';
39
40
  import type { RenderFeatureTargetKind } from './features/targets';
40
41
  import {
41
42
  GPU_TEXTURE_USAGE_COPY_SRC,
42
43
  GPU_TEXTURE_USAGE_RENDER_ATTACHMENT,
43
44
  } from './gpu-texture-usage';
45
+ import type { StandardTopologyInputValue } from './pipeline/standard-lighting/topology';
44
46
  import { STANDARD_POST_STAGE_NAMES, type StandardProfile } from './pipeline/standard-profile';
45
47
  import type { SurfaceProfile } from './record/render-context';
46
48
  import type { RenderPipelineContext } from './render-contract';
@@ -50,6 +52,97 @@ export type { RenderPipelineContext } from './render-contract';
50
52
 
51
53
  export type RenderColorDomain = 'linearHdr' | 'linearLdr' | 'displayEncoded';
52
54
 
55
+ /** Backend admission inputs used by the existing Render candidate owner. */
56
+ export interface DirectionalShadowBackendAdmissionInput {
57
+ readonly backendKind: 'webgpu' | 'wgpu-webgl2' | 'null';
58
+ readonly requested: 'off' | DirectionalShadowFilterLabel;
59
+ readonly candidate: 'accepted' | 'failed';
60
+ readonly lastKnownGood?: DirectionalShadowFilterLabel | undefined;
61
+ }
62
+
63
+ /** Bounded, truthful Directional effective-profile projection. */
64
+ export interface DirectionalShadowBackendAdmission {
65
+ readonly requested: 'off' | DirectionalShadowFilterLabel;
66
+ readonly effective: 'off' | DirectionalShadowFilterLabel | 'rhi-null-structural';
67
+ readonly status: 'accepted' | 'fallback' | 'rejected';
68
+ readonly fallbackReason?: 'webgl2-unsupported' | 'rhi-null-structural' | 'candidate-failed';
69
+ readonly lastKnownGood: boolean;
70
+ readonly pixelEvidence: 'available' | 'not-available';
71
+ }
72
+
73
+ /**
74
+ * Resolve a Directional profile only after the selected production candidate
75
+ * has been admitted. WebGL2 and RhiNull are the sole declared fallbacks;
76
+ * capable candidate failure retains a compatible LKG and never silently maps
77
+ * a failed PCSS request to PCF.
78
+ */
79
+ export function resolveDirectionalShadowBackendAdmission(
80
+ input: DirectionalShadowBackendAdmissionInput,
81
+ ): DirectionalShadowBackendAdmission {
82
+ if (input.requested === 'off') {
83
+ return {
84
+ requested: 'off',
85
+ effective: 'off',
86
+ status: 'accepted',
87
+ lastKnownGood: false,
88
+ pixelEvidence: 'not-available',
89
+ };
90
+ }
91
+ if (input.backendKind === 'null') {
92
+ return {
93
+ requested: input.requested,
94
+ effective: 'rhi-null-structural',
95
+ status: 'fallback',
96
+ fallbackReason: 'rhi-null-structural',
97
+ lastKnownGood: false,
98
+ pixelEvidence: 'not-available',
99
+ };
100
+ }
101
+ if (input.backendKind === 'wgpu-webgl2') {
102
+ const effective =
103
+ input.requested === 'pcssMedium'
104
+ ? 'pcf3'
105
+ : input.requested === 'pcssHigh'
106
+ ? 'pcf5'
107
+ : input.requested;
108
+ return {
109
+ requested: input.requested,
110
+ effective,
111
+ status: effective === input.requested ? 'accepted' : 'fallback',
112
+ ...(effective === input.requested ? {} : { fallbackReason: 'webgl2-unsupported' as const }),
113
+ lastKnownGood: false,
114
+ pixelEvidence: 'available',
115
+ };
116
+ }
117
+ if (input.candidate === 'accepted') {
118
+ return {
119
+ requested: input.requested,
120
+ effective: input.requested,
121
+ status: 'accepted',
122
+ lastKnownGood: false,
123
+ pixelEvidence: 'available',
124
+ };
125
+ }
126
+ if (input.lastKnownGood !== undefined) {
127
+ return {
128
+ requested: input.requested,
129
+ effective: input.lastKnownGood,
130
+ status: 'rejected',
131
+ fallbackReason: 'candidate-failed',
132
+ lastKnownGood: true,
133
+ pixelEvidence: 'available',
134
+ };
135
+ }
136
+ return {
137
+ requested: input.requested,
138
+ effective: input.requested,
139
+ status: 'rejected',
140
+ fallbackReason: 'candidate-failed',
141
+ lastKnownGood: false,
142
+ pixelEvidence: 'available',
143
+ };
144
+ }
145
+
53
146
  export interface ToneOutputContract {
54
147
  readonly input: RenderColorDomain;
55
148
  readonly toneMapped: boolean;
@@ -135,8 +228,13 @@ export interface RenderPipelineTopology {
135
228
  readonly motionBlur: boolean;
136
229
  };
137
230
  readonly shadow: {
138
- readonly mapSize: number;
139
- readonly cascadeCount: 1 | 2 | 3 | 4;
231
+ readonly directional:
232
+ | 'disabled'
233
+ | {
234
+ readonly mapSize: number;
235
+ readonly cascadeCount: 1 | 2 | 3 | 4;
236
+ };
237
+ readonly spotMapSize: number;
140
238
  readonly pointCount: number;
141
239
  readonly pointFaceSize: number;
142
240
  readonly spotCount: number;
@@ -191,10 +289,19 @@ export interface RenderPipelineTopology {
191
289
  };
192
290
  readonly featureTopologySignature: string;
193
291
  readonly gpuDrivenTopologySignature: string;
292
+ /** Stable Cluster transport/layout facts; excludes per-frame light payloads. */
293
+ readonly standardLightingTopologySignature?: string | undefined;
194
294
  /** Internal graph fact; renderer callers do not configure transmission demand. */
195
295
  readonly transmissionDemand?: TransmissionDemand | undefined;
196
296
  }
197
297
 
298
+ /** Resolve the built-in final-output dither policy from the pipeline asset. */
299
+ export function resolveOutputDither(
300
+ config: import('@forgeax/engine-types').RenderPipelineAsset['config'],
301
+ ): boolean {
302
+ return config?.outputDither ?? true;
303
+ }
304
+
198
305
  export interface RenderPipelineFrame extends RenderPipelineContext, RenderGraphFrame {}
199
306
 
200
307
  export interface RenderPipelineTarget {
@@ -320,6 +427,12 @@ export interface RenderPipelineGpuDrivenProjection {
320
427
 
321
428
  export interface RenderPipelineBuildContext<FrameCtx extends RenderPipelineFrame> {
322
429
  readonly graph: RenderGraphBuilder<FrameCtx>;
430
+ /**
431
+ * The single prepared Standard lighting projection for this frame. The
432
+ * Forward and Deferred adapters consume this value; they never inspect raw
433
+ * light snapshots, cluster config, or capability facts themselves.
434
+ */
435
+ readonly standardLighting?: StandardTopologyInputValue;
323
436
  /**
324
437
  * Renderer-owned capability facts needed for admission decisions. The
325
438
  * Standard temporal producer must use the live device probe rather than
@@ -354,6 +467,8 @@ export interface RenderPipelineBuildContext<FrameCtx extends RenderPipelineFrame
354
467
  semanticTargets?: readonly RenderPipelineTarget[],
355
468
  namedTargets?: Readonly<Record<string, RenderPipelineTarget>>,
356
469
  ): Result<void, RenderPipelineBuildError>;
470
+ /** Add renderer-owned cube capture work to the active pipeline graph. */
471
+ contributeCubeCaptures?(): Result<void, RenderPipelineBuildError>;
357
472
  /** Whether a producer-owned feature is installed for this graph build. */
358
473
  hasFeature?(identity: string): boolean;
359
474
  }