@forgeax/engine-render 0.1.32 → 0.1.34

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 (624) hide show
  1. package/README.md +1374 -142
  2. package/dist/assembly/analytic-fog-registration.d.ts +3 -0
  3. package/dist/assembly/analytic-fog-registration.d.ts.map +1 -0
  4. package/dist/assembly/backend-contract.d.ts +2 -0
  5. package/dist/assembly/backend-contract.d.ts.map +1 -1
  6. package/dist/assembly/barrel-distortion-inspection.d.ts +3 -0
  7. package/dist/assembly/barrel-distortion-inspection.d.ts.map +1 -0
  8. package/dist/assembly/canvas-draw-guard.d.ts +3 -0
  9. package/dist/assembly/canvas-draw-guard.d.ts.map +1 -0
  10. package/dist/assembly/cloud-shadow-entry.d.ts +4 -0
  11. package/dist/assembly/cloud-shadow-entry.d.ts.map +1 -0
  12. package/dist/assembly/dynamic-geometry-host.d.ts +4 -1
  13. package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
  14. package/dist/assembly/dynamic-geometry-runtime.d.ts +1 -1
  15. package/dist/assembly/dynamic-geometry-runtime.d.ts.map +1 -1
  16. package/dist/assembly/factory.d.ts +1 -1
  17. package/dist/assembly/factory.d.ts.map +1 -1
  18. package/dist/assembly/fxaa-registration.d.ts +4 -0
  19. package/dist/assembly/fxaa-registration.d.ts.map +1 -0
  20. package/dist/assembly/host-contract.d.ts +3 -3
  21. package/dist/assembly/host-contract.d.ts.map +1 -1
  22. package/dist/assembly/lod-observation.d.ts +4 -0
  23. package/dist/assembly/lod-observation.d.ts.map +1 -0
  24. package/dist/assembly/material/assembly.d.ts.map +1 -1
  25. package/dist/assembly/material/pipeline-helpers.d.ts +5 -0
  26. package/dist/assembly/material/pipeline-helpers.d.ts.map +1 -1
  27. package/dist/assembly/material-shader-policy.d.ts +16 -2
  28. package/dist/assembly/material-shader-policy.d.ts.map +1 -1
  29. package/dist/assembly/material-shader-prewarm.d.ts.map +1 -1
  30. package/dist/assembly/motion-blur-registration.d.ts +3 -0
  31. package/dist/assembly/motion-blur-registration.d.ts.map +1 -0
  32. package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -1
  33. package/dist/assembly/recovery/renderer-recover.d.ts +2 -0
  34. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
  35. package/dist/assembly/render-feature-post-processes.d.ts +6 -0
  36. package/dist/assembly/render-feature-post-processes.d.ts.map +1 -0
  37. package/dist/assembly/renderer-facade.d.ts.map +1 -1
  38. package/dist/assembly/renderer-feature-inspection.d.ts +1 -1
  39. package/dist/assembly/renderer-feature-inspection.d.ts.map +1 -1
  40. package/dist/assembly/renderer-frame-transaction.d.ts +12 -0
  41. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  42. package/dist/assembly/renderer-inspection.d.ts +11 -0
  43. package/dist/assembly/renderer-inspection.d.ts.map +1 -1
  44. package/dist/assembly/temporal-post-process-prewarm.d.ts +13 -0
  45. package/dist/assembly/temporal-post-process-prewarm.d.ts.map +1 -0
  46. package/dist/assembly/webgpu-pbr-ready.d.ts +1 -0
  47. package/dist/assembly/webgpu-pbr-ready.d.ts.map +1 -1
  48. package/dist/assembly/webgpu-ready-contract.d.ts +4 -3
  49. package/dist/assembly/webgpu-ready-contract.d.ts.map +1 -1
  50. package/dist/assembly/webgpu-ready-per-pass.d.ts +39 -0
  51. package/dist/assembly/webgpu-ready-per-pass.d.ts.map +1 -0
  52. package/dist/assembly/webgpu-ready.d.ts +2 -2
  53. package/dist/assembly/webgpu-ready.d.ts.map +1 -1
  54. package/dist/assembly/webgpu-renderer-bootstrap.d.ts.map +1 -1
  55. package/dist/assembly/webgpu-renderer-observation-owner.d.ts +35 -0
  56. package/dist/assembly/webgpu-renderer-observation-owner.d.ts.map +1 -0
  57. package/dist/assembly/webgpu-renderer.d.ts +1 -1
  58. package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
  59. package/dist/authoring.mjs +1 -1
  60. package/dist/barrel-distortion.d.ts +47 -0
  61. package/dist/barrel-distortion.d.ts.map +1 -0
  62. package/dist/bloom-admission.d.ts +13 -0
  63. package/dist/bloom-admission.d.ts.map +1 -0
  64. package/dist/{chunk-PA5DRJNI.mjs → chunk-ELJFJ2BU.mjs} +2 -2
  65. package/dist/chunk-ELJFJ2BU.mjs.map +1 -0
  66. package/dist/{chunk-JCIRYQ4V.mjs → chunk-HEB564WF.mjs} +10 -4
  67. package/dist/chunk-HEB564WF.mjs.map +1 -0
  68. package/dist/{chunk-JRIPCMYC.mjs → chunk-MKDIT2EM.mjs} +1584 -375
  69. package/dist/chunk-MKDIT2EM.mjs.map +1 -0
  70. package/dist/{chunk-S665NJNF.mjs → chunk-OCDLEI6I.mjs} +3 -3
  71. package/dist/{chunk-S665NJNF.mjs.map → chunk-OCDLEI6I.mjs.map} +1 -1
  72. package/dist/chunk-ODZWR6JQ.mjs +4927 -0
  73. package/dist/chunk-ODZWR6JQ.mjs.map +1 -0
  74. package/dist/{chunk-DRR7D3KX.mjs → chunk-SHFUFJ5N.mjs} +192 -18
  75. package/dist/chunk-SHFUFJ5N.mjs.map +1 -0
  76. package/dist/{chunk-4NNZQCL3.mjs → chunk-UI5SFODX.mjs} +223 -277
  77. package/dist/chunk-UI5SFODX.mjs.map +1 -0
  78. package/dist/{chunk-GWCEMDVR.mjs → chunk-UINHLCZA.mjs} +787 -80
  79. package/dist/chunk-UINHLCZA.mjs.map +1 -0
  80. package/dist/{chunk-6TFBXLRJ.mjs → chunk-WEX45HKH.mjs} +222 -337
  81. package/dist/chunk-WEX45HKH.mjs.map +1 -0
  82. package/dist/cloud/density.d.ts +55 -0
  83. package/dist/cloud/density.d.ts.map +1 -0
  84. package/dist/cloud/extract.d.ts +25 -0
  85. package/dist/cloud/extract.d.ts.map +1 -0
  86. package/dist/cloud/feature.d.ts +57 -0
  87. package/dist/cloud/feature.d.ts.map +1 -0
  88. package/dist/cloud/frame-context.d.ts +8 -0
  89. package/dist/cloud/frame-context.d.ts.map +1 -0
  90. package/dist/cloud/inspection.d.ts +59 -0
  91. package/dist/cloud/inspection.d.ts.map +1 -0
  92. package/dist/cloud/optics.d.ts +56 -0
  93. package/dist/cloud/optics.d.ts.map +1 -0
  94. package/dist/cloud/parameters.d.ts +73 -0
  95. package/dist/cloud/parameters.d.ts.map +1 -0
  96. package/dist/cloud/resources.d.ts +60 -0
  97. package/dist/cloud/resources.d.ts.map +1 -0
  98. package/dist/cloud/shadow.d.ts +42 -0
  99. package/dist/cloud/shadow.d.ts.map +1 -0
  100. package/dist/cloud/temporal.d.ts +74 -0
  101. package/dist/cloud/temporal.d.ts.map +1 -0
  102. package/dist/components/atmosphere.d.ts +2 -0
  103. package/dist/components/atmosphere.d.ts.map +1 -1
  104. package/dist/components/barrel-distortion.d.ts +13 -0
  105. package/dist/components/barrel-distortion.d.ts.map +1 -0
  106. package/dist/components/camera.d.ts +20 -4
  107. package/dist/components/camera.d.ts.map +1 -1
  108. package/dist/components/cloud-layer.d.ts +29 -0
  109. package/dist/components/cloud-layer.d.ts.map +1 -0
  110. package/dist/components/index.d.ts +2 -0
  111. package/dist/components/index.d.ts.map +1 -1
  112. package/dist/components/instances.d.ts +20 -6
  113. package/dist/components/instances.d.ts.map +1 -1
  114. package/dist/components/mesh-filter.d.ts +6 -5
  115. package/dist/components/mesh-filter.d.ts.map +1 -1
  116. package/dist/components/motion-blur.d.ts +1 -0
  117. package/dist/components/motion-blur.d.ts.map +1 -1
  118. package/dist/construct-renderer.d.ts +1 -1
  119. package/dist/construct-renderer.d.ts.map +1 -1
  120. package/dist/construct-renderer.mjs +9751 -3528
  121. package/dist/construct-renderer.mjs.map +1 -1
  122. package/dist/device/gpu-residency.d.ts +6 -0
  123. package/dist/device/gpu-residency.d.ts.map +1 -1
  124. package/dist/dynamic-geometry.d.ts +5 -1
  125. package/dist/dynamic-geometry.d.ts.map +1 -1
  126. package/dist/environment/analytic-fog.d.ts +6 -0
  127. package/dist/environment/analytic-fog.d.ts.map +1 -0
  128. package/dist/errors/cloud.d.ts +59 -0
  129. package/dist/errors/cloud.d.ts.map +1 -0
  130. package/dist/errors/render.d.ts +23 -5
  131. package/dist/errors/render.d.ts.map +1 -1
  132. package/dist/examples/single-layer-medium-surface.d.ts +47 -0
  133. package/dist/examples/single-layer-medium-surface.d.ts.map +1 -0
  134. package/dist/extract/camera.d.ts.map +1 -1
  135. package/dist/extract/contracts.d.ts +12 -1
  136. package/dist/extract/contracts.d.ts.map +1 -1
  137. package/dist/extract/environment.d.ts +2 -0
  138. package/dist/extract/environment.d.ts.map +1 -1
  139. package/dist/features/barrel-distortion.d.ts +29 -0
  140. package/dist/features/barrel-distortion.d.ts.map +1 -0
  141. package/dist/features/error-reporting.d.ts +17 -0
  142. package/dist/features/error-reporting.d.ts.map +1 -0
  143. package/dist/features/host.d.ts +15 -0
  144. package/dist/features/host.d.ts.map +1 -1
  145. package/dist/features/motion-blur/motion-blur-feature.d.ts +20 -2
  146. package/dist/features/motion-blur/motion-blur-feature.d.ts.map +1 -1
  147. package/dist/features/motion-blur/motion-blur-params.d.ts +21 -0
  148. package/dist/features/motion-blur/motion-blur-params.d.ts.map +1 -1
  149. package/dist/features/motion-blur/motion-blur-runtime.d.ts +54 -0
  150. package/dist/features/motion-blur/motion-blur-runtime.d.ts.map +1 -0
  151. package/dist/features/plan.d.ts +15 -4
  152. package/dist/features/plan.d.ts.map +1 -1
  153. package/dist/features/prepared-gpu-work.d.ts +9 -5
  154. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  155. package/dist/features/render-graph-compute.d.ts.map +1 -1
  156. package/dist/features/render-graph-contribution.d.ts +5 -0
  157. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  158. package/dist/features/render-graph-raster.d.ts +1 -0
  159. package/dist/features/render-graph-raster.d.ts.map +1 -1
  160. package/dist/features/targets.d.ts +2 -0
  161. package/dist/features/targets.d.ts.map +1 -1
  162. package/dist/features/types.d.ts +44 -0
  163. package/dist/features/types.d.ts.map +1 -1
  164. package/dist/fullscreen-post-process-pass.d.ts +15 -7
  165. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  166. package/dist/gpu-dirty-ranges.d.ts +11 -0
  167. package/dist/gpu-dirty-ranges.d.ts.map +1 -0
  168. package/dist/gpu-driven/batch-topology.d.ts +17 -0
  169. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  170. package/dist/gpu-driven/material-artifacts.d.ts +6 -0
  171. package/dist/gpu-driven/material-artifacts.d.ts.map +1 -1
  172. package/dist/gpu-driven/prepared-draw.d.ts +7 -0
  173. package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
  174. package/dist/gpu-driven/production-raster-material.d.ts +178 -0
  175. package/dist/gpu-driven/production-raster-material.d.ts.map +1 -0
  176. package/dist/gpu-driven/production-raster.d.ts +50 -4
  177. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  178. package/dist/gpu-driven/resource-allocation.d.ts +31 -0
  179. package/dist/gpu-driven/resource-allocation.d.ts.map +1 -0
  180. package/dist/gpu-driven/shadow-ownership.d.ts +14 -0
  181. package/dist/gpu-driven/shadow-ownership.d.ts.map +1 -0
  182. package/dist/gpu-driven/view-gpu.d.ts +35 -2
  183. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  184. package/dist/gpu-scene.d.ts +11 -1
  185. package/dist/gpu-scene.d.ts.map +1 -1
  186. package/dist/hdrp-buffers.d.ts +2 -2
  187. package/dist/hdrp-buffers.d.ts.map +1 -1
  188. package/dist/ibl/skylight-bind-group.d.ts +10 -1
  189. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  190. package/dist/index.d.ts +31 -8
  191. package/dist/index.d.ts.map +1 -1
  192. package/dist/index.mjs +258 -8
  193. package/dist/index.mjs.map +1 -1
  194. package/dist/inspection-types.d.ts +178 -3
  195. package/dist/inspection-types.d.ts.map +1 -1
  196. package/dist/instance-buffer-cache.d.ts +4 -4
  197. package/dist/instance-buffer-cache.d.ts.map +1 -1
  198. package/dist/instances.d.ts +49 -94
  199. package/dist/instances.d.ts.map +1 -1
  200. package/dist/internal.mjs +7 -7
  201. package/dist/pbr-pipeline.d.ts +19 -1
  202. package/dist/pbr-pipeline.d.ts.map +1 -1
  203. package/dist/pipeline/single-layer-medium-passes.d.ts +73 -0
  204. package/dist/pipeline/single-layer-medium-passes.d.ts.map +1 -0
  205. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  206. package/dist/pipeline/standard-output/graph.d.ts.map +1 -1
  207. package/dist/pipeline/standard-output/types.d.ts +4 -2
  208. package/dist/pipeline/standard-output/types.d.ts.map +1 -1
  209. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  210. package/dist/pipeline/standard-post.d.ts +28 -19
  211. package/dist/pipeline/standard-post.d.ts.map +1 -1
  212. package/dist/pipeline-builder.d.ts +1 -1
  213. package/dist/pipeline-builder.d.ts.map +1 -1
  214. package/dist/pipeline-spec.d.ts +2 -2
  215. package/dist/plugin.d.ts.map +1 -1
  216. package/dist/prepare/prepared-graphics-resolver.d.ts +2 -0
  217. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  218. package/dist/record/barrel-distortion-frame.d.ts +15 -0
  219. package/dist/record/barrel-distortion-frame.d.ts.map +1 -0
  220. package/dist/record/dynamic-geometry-consumption.d.ts +10 -2
  221. package/dist/record/dynamic-geometry-consumption.d.ts.map +1 -1
  222. package/dist/record/fold-buckets.d.ts +95 -0
  223. package/dist/record/fold-buckets.d.ts.map +1 -0
  224. package/dist/record/fold-instance-buffer.d.ts +6 -0
  225. package/dist/record/fold-instance-buffer.d.ts.map +1 -0
  226. package/dist/record/frame-lighting.d.ts +1 -0
  227. package/dist/record/frame-lighting.d.ts.map +1 -1
  228. package/dist/record/frame-snapshot.d.ts +40 -3
  229. package/dist/record/frame-snapshot.d.ts.map +1 -1
  230. package/dist/record/frame-targets.d.ts.map +1 -1
  231. package/dist/record/frame.d.ts +14 -62
  232. package/dist/record/frame.d.ts.map +1 -1
  233. package/dist/record/gpu-draw-receipts.d.ts +11 -0
  234. package/dist/record/gpu-draw-receipts.d.ts.map +1 -0
  235. package/dist/record/gpu-timing.d.ts +8 -0
  236. package/dist/record/gpu-timing.d.ts.map +1 -1
  237. package/dist/record/main-pass-geometry.d.ts +21 -5
  238. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  239. package/dist/record/main-pass-material.d.ts +7 -1
  240. package/dist/record/main-pass-material.d.ts.map +1 -1
  241. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  242. package/dist/record/main-pass.d.ts +13 -2
  243. package/dist/record/main-pass.d.ts.map +1 -1
  244. package/dist/record/mesh-ssbo.d.ts +6 -5
  245. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  246. package/dist/record/motion-blur-receipt.d.ts +11 -0
  247. package/dist/record/motion-blur-receipt.d.ts.map +1 -0
  248. package/dist/record/probe-blend-buffer.d.ts +16 -0
  249. package/dist/record/probe-blend-buffer.d.ts.map +1 -0
  250. package/dist/record/recovery-pipeline.d.ts.map +1 -1
  251. package/dist/record/render-context.d.ts +34 -31
  252. package/dist/record/render-context.d.ts.map +1 -1
  253. package/dist/record/shadow-pass.d.ts +2 -0
  254. package/dist/record/shadow-pass.d.ts.map +1 -1
  255. package/dist/record/skybox-post-pass.d.ts +6 -4
  256. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  257. package/dist/record/typed-frame-graph.d.ts +22 -2
  258. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  259. package/dist/record/view-ubo.d.ts +11 -3
  260. package/dist/record/view-ubo.d.ts.map +1 -1
  261. package/dist/record/volume-params.d.ts +9 -0
  262. package/dist/record/volume-params.d.ts.map +1 -0
  263. package/dist/recovery/render-system-candidate.d.ts +10 -0
  264. package/dist/recovery/render-system-candidate.d.ts.map +1 -1
  265. package/dist/reflection/record-owner.d.ts.map +1 -1
  266. package/dist/render-contract.d.ts +66 -8
  267. package/dist/render-contract.d.ts.map +1 -1
  268. package/dist/render-graph-primitives.d.ts.map +1 -1
  269. package/dist/render-pipeline.d.ts +106 -3
  270. package/dist/render-pipeline.d.ts.map +1 -1
  271. package/dist/render-system-extract-tail.d.ts +3 -2
  272. package/dist/render-system-extract-tail.d.ts.map +1 -1
  273. package/dist/render-system-extract.d.ts +24 -10
  274. package/dist/render-system-extract.d.ts.map +1 -1
  275. package/dist/render-system-presentation.d.ts +23 -0
  276. package/dist/render-system-presentation.d.ts.map +1 -0
  277. package/dist/render-system-producer-roots.d.ts +10 -0
  278. package/dist/render-system-producer-roots.d.ts.map +1 -0
  279. package/dist/render-system-residency.d.ts +12 -0
  280. package/dist/render-system-residency.d.ts.map +1 -0
  281. package/dist/render-system.d.ts +26 -15
  282. package/dist/render-system.d.ts.map +1 -1
  283. package/dist/scene/probe-blend.d.ts +27 -0
  284. package/dist/scene/probe-blend.d.ts.map +1 -1
  285. package/dist/scene/render-scene.d.ts +14 -5
  286. package/dist/scene/render-scene.d.ts.map +1 -1
  287. package/dist/ssao-buffers.d.ts +9 -0
  288. package/dist/ssao-buffers.d.ts.map +1 -1
  289. package/dist/surface/dynamic-input.d.ts +133 -0
  290. package/dist/surface/dynamic-input.d.ts.map +1 -0
  291. package/dist/surface/gpu-driven.d.ts +41 -0
  292. package/dist/surface/gpu-driven.d.ts.map +1 -0
  293. package/dist/surface/submission-observation.d.ts +136 -0
  294. package/dist/surface/submission-observation.d.ts.map +1 -0
  295. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  296. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  297. package/dist/temporal/frame.d.ts +7 -0
  298. package/dist/temporal/frame.d.ts.map +1 -1
  299. package/dist/temporal/gpu.d.ts +13 -1
  300. package/dist/temporal/gpu.d.ts.map +1 -1
  301. package/dist/temporal/index.mjs +5 -5
  302. package/dist/temporal/inspection.d.ts.map +1 -1
  303. package/dist/temporal/standard-scene-data.d.ts.map +1 -1
  304. package/dist/temporal/target-coverage-attachment.d.ts.map +1 -1
  305. package/dist/temporal/view.d.ts +6 -1
  306. package/dist/temporal/view.d.ts.map +1 -1
  307. package/dist/transmission/single-layer-medium.d.ts +89 -0
  308. package/dist/transmission/single-layer-medium.d.ts.map +1 -0
  309. package/dist/typed-render-graph-primitives.d.ts +24 -9
  310. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  311. package/dist/volume/component.d.ts +9 -5
  312. package/dist/volume/component.d.ts.map +1 -1
  313. package/dist/volume/extract.d.ts +1 -1
  314. package/dist/volume/extract.d.ts.map +1 -1
  315. package/dist/volume/inspection.d.ts +2 -0
  316. package/dist/volume/inspection.d.ts.map +1 -1
  317. package/dist/volume/passes.d.ts +4 -1
  318. package/dist/volume/passes.d.ts.map +1 -1
  319. package/dist/volume/resources.d.ts.map +1 -1
  320. package/dist/volume/temporal.d.ts +3 -1
  321. package/dist/volume/temporal.d.ts.map +1 -1
  322. package/package.json +22 -21
  323. package/src/__tests__/analytic-fog-graph.unit.test.ts +199 -0
  324. package/src/__tests__/analytic-fog-optics.unit.test.ts +38 -0
  325. package/src/__tests__/atmosphere-daylight.dawn.test.ts +72 -0
  326. package/src/__tests__/barrel-distortion-lkg.integration.test.ts +353 -0
  327. package/src/__tests__/barrel-distortion.dawn.test.ts +41 -0
  328. package/src/__tests__/barrel-distortion.unit.test.ts +364 -0
  329. package/src/__tests__/bloom-exact-zero.unit.test.ts +112 -18
  330. package/src/__tests__/bloom-lifecycle.integration.test.ts +17 -4
  331. package/src/__tests__/construct-renderer-identity.unit.test.ts +49 -0
  332. package/src/__tests__/detached-recovery-graph.unit.test.ts +277 -0
  333. package/src/__tests__/device-loss-fanout.unit.test.ts +36 -1
  334. package/src/__tests__/docs-gate-green.unit.test.ts +112 -1
  335. package/src/__tests__/dynamic-resolution-plugin.integration.test.ts +20 -0
  336. package/src/__tests__/environment-fog-lanes.integration.test.ts +14 -0
  337. package/src/__tests__/environment-selection.unit.test.ts +12 -0
  338. package/src/__tests__/factory-contract.integration.test.ts +626 -113
  339. package/src/__tests__/feature-depth-input.dawn.test.ts +129 -2
  340. package/src/__tests__/frame-camera-selection.unit.test.ts +39 -1
  341. package/src/__tests__/frame-plan-contract.unit.test.ts +2 -0
  342. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +14 -3
  343. package/src/__tests__/gpu-dirty-ranges.unit.test.ts +22 -0
  344. package/src/__tests__/gpu-driven-baseline.characterization.test.ts +16 -3
  345. package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +12 -0
  346. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +2 -1
  347. package/src/__tests__/gpu-driven-material-artifacts.unit.test.ts +143 -0
  348. package/src/__tests__/gpu-driven-pbr.dawn.test.ts +2 -2
  349. package/src/__tests__/gpu-driven-production.integration.test.ts +482 -3
  350. package/src/__tests__/gpu-driven-shadow-views.dawn.test.ts +7 -6
  351. package/src/__tests__/gpu-driven-shadow-views.integration.test.ts +1 -1
  352. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +103 -4
  353. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +18 -2
  354. package/src/__tests__/gpu-driven-view.browser.test.ts +5 -8
  355. package/src/__tests__/gpu-driven-view.dawn.test.ts +6 -2
  356. package/src/__tests__/gpu-driven-view.unit.test.ts +1 -1
  357. package/src/__tests__/gpu-pass-timing-lifecycle.integration.test.ts +1 -0
  358. package/src/__tests__/gpu-pass-timing.browser.test.ts +6 -4
  359. package/src/__tests__/gpu-pass-timing.rhi-null.unit.test.ts +1 -0
  360. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +12 -0
  361. package/src/__tests__/gpu-scene.unit.test.ts +210 -9
  362. package/src/__tests__/instance-allocation-failure.unit.test.ts +57 -0
  363. package/src/__tests__/instances-culling.integration.test.ts +10 -36
  364. package/src/__tests__/instances-store.unit.test.ts +105 -238
  365. package/src/__tests__/instances-world-ownership.integration.test.ts +62 -0
  366. package/src/__tests__/main-pass-material-medium-selection.unit.test.ts +146 -0
  367. package/src/__tests__/material-shader-prewarm.unit.test.ts +59 -0
  368. package/src/__tests__/material-snapshot-mutation.integration.test.ts +39 -1
  369. package/src/__tests__/mesh-submission-lifetime.unit.test.ts +31 -0
  370. package/src/__tests__/morph-culling-reentry.dawn.test.ts +5 -5
  371. package/src/__tests__/morph-visual-evidence.integration.test.ts +8 -7
  372. package/src/__tests__/motion-blur-compute.dawn.test.ts +589 -0
  373. package/src/__tests__/motion-blur.pixel.integration.test.ts +2 -2
  374. package/src/__tests__/nineslice-handle-surface.unit.test.ts +4 -4
  375. package/src/__tests__/pbr-view-layout.unit.test.ts +9 -0
  376. package/src/__tests__/physical-clearcoat.integration.test.ts +58 -0
  377. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +21 -0
  378. package/src/__tests__/prepared-graphics-capability.unit.test.ts +66 -2
  379. package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +86 -0
  380. package/src/__tests__/probe-bindings.unit.test.ts +582 -1
  381. package/src/__tests__/probe-scene-dirty.integration.test.ts +28 -1
  382. package/src/__tests__/public-surface.test-d.ts +8 -0
  383. package/src/__tests__/receipt-observation-retirement.unit.test.ts +65 -0
  384. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +69 -0
  385. package/src/__tests__/render-error-code-owner.test-d.ts +9 -0
  386. package/src/__tests__/render-feature-diagnostics.unit.test.ts +15 -2
  387. package/src/__tests__/render-feature-error-reporting.unit.test.ts +44 -0
  388. package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +10 -1
  389. package/src/__tests__/render-feature-retry.unit.test.ts +12 -1
  390. package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +23 -0
  391. package/src/__tests__/render-scene-mixed-updates.integration.test.ts +145 -19
  392. package/src/__tests__/render-scene-projection.unit.test.ts +36 -11
  393. package/src/__tests__/render-scene-temporal-retry.unit.test.ts +37 -6
  394. package/src/__tests__/render-target-probe-soak.perf.test.ts +2 -2
  395. package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +3 -3
  396. package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +5 -2
  397. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +41 -7
  398. package/src/__tests__/renderer-frame-generation-fence.integration.test.ts +16 -0
  399. package/src/__tests__/renderer-frame-transaction.integration.test.ts +33 -11
  400. package/src/__tests__/resource-allocation.unit.test.ts +123 -0
  401. package/src/__tests__/shader-manifest-fixture.ts +4 -4
  402. package/src/__tests__/single-layer-medium-passes.unit.test.ts +275 -0
  403. package/src/__tests__/skin-motion-regression.unit.test.ts +70 -1
  404. package/src/__tests__/skin-palette-recycling.dawn.test.ts +97 -0
  405. package/src/__tests__/skinned-shadow-caster.test.ts +17 -0
  406. package/src/__tests__/ssr-carrier-public-contract.unit.test.ts +21 -0
  407. package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +4 -4
  408. package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +2 -2
  409. package/src/__tests__/ssr-gpu-dispatch.ts +1 -1
  410. package/src/__tests__/ssr-receiver-coverage.dawn.test.ts +6 -2
  411. package/src/__tests__/standard-lighting-write.unit.test.ts +2 -1
  412. package/src/__tests__/standard-output-chain-contract.unit.test.ts +28 -0
  413. package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +46 -1
  414. package/src/__tests__/standard-pipeline.dawn.test.ts +1 -1
  415. package/src/__tests__/standard-pipeline.integration.test.ts +200 -9
  416. package/src/__tests__/surface-dynamic-buffer-lifecycle.unit.test.ts +506 -0
  417. package/src/__tests__/surface-submission-observation.unit.test.ts +812 -0
  418. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +32 -0
  419. package/src/__tests__/temporal-performance.integration.test.ts +3 -3
  420. package/src/__tests__/temporal-reset-matrix.unit.test.ts +10 -0
  421. package/src/__tests__/temporal-view.unit.test.ts +2 -1
  422. package/src/__tests__/typed-pipeline-topology.unit.test.ts +20 -4
  423. package/src/__tests__/visibility-instances.integration.test.ts +7 -19
  424. package/src/__tests__/visibility-producer-matrix.integration.test.ts +9 -20
  425. package/src/__tests__/volume-optics-oracle.unit.test.ts +7 -3
  426. package/src/__tests__/volumetric-fog-budget-recovery.integration.test.ts +189 -15
  427. package/src/__tests__/volumetric-fog-errors.unit.test.ts +4 -3
  428. package/src/__tests__/volumetric-fog-multiple.unit.test.ts +55 -0
  429. package/src/__tests__/volumetric-fog-spot-frame-optics.integration.test.ts +1 -1
  430. package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +558 -68
  431. package/src/__tests__/volumetric-fog-temporal.unit.test.ts +27 -0
  432. package/src/__tests__/volumetric-fog-topology.unit.test.ts +23 -5
  433. package/src/assembly/analytic-fog-registration.ts +14 -0
  434. package/src/assembly/backend-contract.ts +30 -0
  435. package/src/assembly/barrel-distortion-inspection.ts +22 -0
  436. package/src/assembly/canvas-draw-guard.ts +11 -0
  437. package/src/assembly/cloud-shadow-entry.ts +22 -0
  438. package/src/assembly/dynamic-geometry-host.ts +65 -37
  439. package/src/assembly/dynamic-geometry-runtime.ts +7 -1
  440. package/src/assembly/factory.ts +2 -30
  441. package/src/assembly/fxaa-registration.ts +17 -0
  442. package/src/assembly/host-contract.ts +3 -3
  443. package/src/assembly/lod-observation.ts +12 -0
  444. package/src/assembly/material/assembly.ts +25 -13
  445. package/src/assembly/material/pipeline-helpers.ts +53 -12
  446. package/src/assembly/material-shader-policy.ts +55 -0
  447. package/src/assembly/material-shader-prewarm.ts +21 -10
  448. package/src/assembly/motion-blur-registration.ts +17 -0
  449. package/src/assembly/recovery/device-loss-fanout.ts +13 -0
  450. package/src/assembly/recovery/renderer-recover.ts +41 -18
  451. package/src/assembly/render-feature-post-processes.ts +54 -0
  452. package/src/assembly/renderer-facade.ts +6 -1
  453. package/src/assembly/renderer-feature-inspection.ts +8 -2
  454. package/src/assembly/renderer-frame-transaction.ts +23 -0
  455. package/src/assembly/renderer-inspection.ts +28 -0
  456. package/src/assembly/skin-palette-owner.ts +1 -1
  457. package/src/assembly/temporal-post-process-prewarm.ts +40 -0
  458. package/src/assembly/webgpu-pbr-ready.ts +9 -1
  459. package/src/assembly/webgpu-ready-contract.ts +8 -3
  460. package/src/assembly/webgpu-ready-per-pass.ts +104 -0
  461. package/src/assembly/webgpu-ready.ts +296 -306
  462. package/src/assembly/webgpu-renderer-bootstrap.ts +0 -12
  463. package/src/assembly/webgpu-renderer-observation-owner.ts +222 -0
  464. package/src/assembly/webgpu-renderer.ts +228 -281
  465. package/src/assembly/webgpu-vertex-layouts.ts +1 -1
  466. package/src/barrel-distortion.ts +247 -0
  467. package/src/bloom-admission.ts +21 -0
  468. package/src/cloud/__tests__/cloud-density-parity.dawn.test.ts +173 -0
  469. package/src/cloud/__tests__/cloud-layer-framebuffer-y.dawn.test.ts +265 -0
  470. package/src/cloud/__tests__/cloud-layer.browser.test.ts +432 -0
  471. package/src/cloud/__tests__/cloud-layer.unit.test.ts +634 -0
  472. package/src/cloud/density.ts +600 -0
  473. package/src/cloud/extract.ts +110 -0
  474. package/src/cloud/feature.ts +1810 -0
  475. package/src/cloud/frame-context.ts +42 -0
  476. package/src/cloud/inspection.ts +130 -0
  477. package/src/cloud/optics.ts +285 -0
  478. package/src/cloud/parameters.ts +255 -0
  479. package/src/cloud/resources.ts +122 -0
  480. package/src/cloud/shadow.ts +167 -0
  481. package/src/cloud/temporal.ts +226 -0
  482. package/src/components/__tests__/motion-blur.unit.test.ts +1 -0
  483. package/src/components/atmosphere.ts +4 -0
  484. package/src/components/barrel-distortion.ts +46 -0
  485. package/src/components/camera.ts +66 -10
  486. package/src/components/cloud-layer.ts +47 -0
  487. package/src/components/index.ts +2 -0
  488. package/src/components/instances.ts +18 -45
  489. package/src/components/mesh-filter.ts +11 -9
  490. package/src/components/motion-blur.ts +1 -0
  491. package/src/components/sprite-instances.ts +1 -1
  492. package/src/construct-renderer.ts +1 -1
  493. package/src/device/gpu-residency.ts +56 -12
  494. package/src/dynamic-geometry.ts +12 -1
  495. package/src/environment/analytic-fog.ts +44 -0
  496. package/src/environment/background.ts +2 -2
  497. package/src/errors/cloud.ts +103 -0
  498. package/src/errors/render.ts +58 -8
  499. package/src/examples/single-layer-medium-surface.ts +59 -0
  500. package/src/extract/camera.ts +35 -8
  501. package/src/extract/contracts.ts +12 -0
  502. package/src/extract/environment.ts +4 -0
  503. package/src/features/barrel-distortion.ts +172 -0
  504. package/src/features/error-reporting.ts +98 -0
  505. package/src/features/host.ts +138 -24
  506. package/src/features/motion-blur/__tests__/motion-blur-feature.unit.test.ts +111 -1
  507. package/src/features/motion-blur/__tests__/motion-blur-params.unit.test.ts +58 -3
  508. package/src/features/motion-blur/motion-blur-feature.ts +1519 -15
  509. package/src/features/motion-blur/motion-blur-params.ts +70 -2
  510. package/src/features/motion-blur/motion-blur-runtime.ts +176 -0
  511. package/src/features/plan.ts +33 -8
  512. package/src/features/prepared-gpu-work.ts +86 -35
  513. package/src/features/render-graph-compute.ts +13 -5
  514. package/src/features/render-graph-contribution.ts +11 -0
  515. package/src/features/render-graph-raster.ts +45 -3
  516. package/src/features/targets.ts +66 -0
  517. package/src/features/types.ts +47 -0
  518. package/src/fullscreen-post-process-pass.ts +41 -9
  519. package/src/gpu-dirty-ranges.ts +48 -0
  520. package/src/gpu-driven/batch-topology.ts +53 -0
  521. package/src/gpu-driven/material-artifacts.ts +35 -32
  522. package/src/gpu-driven/prepared-draw.ts +27 -14
  523. package/src/gpu-driven/production-raster-material.ts +1894 -0
  524. package/src/gpu-driven/production-raster.ts +904 -787
  525. package/src/gpu-driven/resource-allocation.ts +142 -0
  526. package/src/gpu-driven/shadow-ownership.ts +71 -0
  527. package/src/gpu-driven/view-gpu.ts +181 -10
  528. package/src/gpu-scene.ts +259 -101
  529. package/src/hdrp-buffers.ts +4 -3
  530. package/src/ibl/skylight-bind-group.ts +49 -7
  531. package/src/index.ts +228 -9
  532. package/src/inspection-types.ts +222 -2
  533. package/src/instance-buffer-cache.ts +4 -4
  534. package/src/instances.ts +151 -492
  535. package/src/pbr-pipeline.ts +219 -13
  536. package/src/pipeline/single-layer-medium-passes.ts +267 -0
  537. package/src/pipeline/standard-forward-lane.ts +313 -57
  538. package/src/pipeline/standard-output/graph.ts +8 -2
  539. package/src/pipeline/standard-output/types.ts +12 -1
  540. package/src/pipeline/standard-pipeline.ts +291 -18
  541. package/src/pipeline/standard-post.ts +397 -102
  542. package/src/pipeline-builder.ts +1 -1
  543. package/src/pipeline-spec.ts +5 -5
  544. package/src/plugin.ts +4 -0
  545. package/src/points-lines/__tests__/points-lines.bench.ts +17 -8
  546. package/src/points-lines/__tests__/view-ubo.unit.test.ts +2 -1
  547. package/src/prepare/prepared-graphics-resolver.ts +2 -0
  548. package/src/record/__tests__/main-pass-geometry.unit.test.ts +30 -0
  549. package/src/record/__tests__/sprite-material-abi.unit.test.ts +1 -1
  550. package/src/record/__tests__/temporal-payload.unit.test.ts +3 -2
  551. package/src/record/__tests__/transparent-group2-selection.unit.test.ts +11 -0
  552. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +1 -0
  553. package/src/record/__tests__/view-ubo-layout.unit.test.ts +4 -3
  554. package/src/record/barrel-distortion-frame.ts +110 -0
  555. package/src/record/dynamic-geometry-consumption.ts +39 -9
  556. package/src/record/fold-buckets.ts +852 -0
  557. package/src/record/fold-instance-buffer.ts +51 -0
  558. package/src/record/frame-lighting.ts +36 -2
  559. package/src/record/frame-snapshot.ts +44 -4
  560. package/src/record/frame-targets.ts +10 -6
  561. package/src/record/frame.ts +373 -1099
  562. package/src/record/gpu-draw-receipts.ts +38 -0
  563. package/src/record/gpu-timing.ts +48 -5
  564. package/src/record/main-pass-geometry.ts +281 -83
  565. package/src/record/main-pass-material.ts +66 -4
  566. package/src/record/main-pass-sprite-draws.ts +13 -66
  567. package/src/record/main-pass.ts +156 -20
  568. package/src/record/mesh-ssbo.ts +43 -6
  569. package/src/record/motion-blur-receipt.ts +91 -0
  570. package/src/record/probe-blend-buffer.ts +180 -0
  571. package/src/record/recovery-pipeline.ts +35 -3
  572. package/src/record/render-context.ts +51 -31
  573. package/src/record/shadow-pass.ts +36 -2
  574. package/src/record/skybox-post-pass.ts +150 -200
  575. package/src/record/typed-frame-graph.ts +824 -44
  576. package/src/record/view-ubo.ts +26 -3
  577. package/src/record/volume-params.ts +225 -0
  578. package/src/recovery/render-system-candidate.ts +257 -52
  579. package/src/reflection/record-owner.ts +7 -3
  580. package/src/render-contract.ts +71 -8
  581. package/src/render-graph-primitives.ts +7 -1
  582. package/src/render-pipeline.ts +136 -1
  583. package/src/render-system-extract-tail.ts +72 -60
  584. package/src/render-system-extract.ts +117 -87
  585. package/src/render-system-presentation.ts +56 -0
  586. package/src/render-system-producer-roots.ts +96 -0
  587. package/src/render-system-residency.ts +159 -0
  588. package/src/render-system.ts +601 -482
  589. package/src/scene/probe-blend.ts +96 -4
  590. package/src/scene/render-scene.ts +431 -281
  591. package/src/ssao-buffers.ts +95 -2
  592. package/src/surface/__tests__/dynamic-input.unit.test.ts +374 -0
  593. package/src/surface/__tests__/gpu-driven.unit.test.ts +87 -0
  594. package/src/surface/dynamic-input.ts +658 -0
  595. package/src/surface/gpu-driven.ts +147 -0
  596. package/src/surface/submission-observation.ts +517 -0
  597. package/src/systems/skin-palette-allocator.ts +4 -1
  598. package/src/temporal/__tests__/temporal-frame-transaction.unit.test.ts +36 -0
  599. package/src/temporal/frame-coordinator.ts +8 -1
  600. package/src/temporal/frame.ts +20 -0
  601. package/src/temporal/gpu.ts +101 -17
  602. package/src/temporal/inspection.ts +7 -1
  603. package/src/temporal/standard-scene-data.ts +5 -0
  604. package/src/temporal/target-coverage-attachment.ts +4 -0
  605. package/src/temporal/view.ts +13 -2
  606. package/src/transmission/__tests__/single-layer-medium.unit.test.ts +149 -0
  607. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +12 -11
  608. package/src/transmission/single-layer-medium.ts +322 -0
  609. package/src/typed-render-graph-primitives.ts +191 -50
  610. package/src/volume/component.ts +10 -10
  611. package/src/volume/extract.ts +11 -5
  612. package/src/volume/inspection.ts +3 -0
  613. package/src/volume/passes.ts +95 -8
  614. package/src/volume/resources.ts +2 -1
  615. package/src/volume/temporal.ts +11 -0
  616. package/dist/chunk-4NNZQCL3.mjs.map +0 -1
  617. package/dist/chunk-6TFBXLRJ.mjs.map +0 -1
  618. package/dist/chunk-DRR7D3KX.mjs.map +0 -1
  619. package/dist/chunk-GWCEMDVR.mjs.map +0 -1
  620. package/dist/chunk-JCIRYQ4V.mjs.map +0 -1
  621. package/dist/chunk-JRIPCMYC.mjs.map +0 -1
  622. package/dist/chunk-LULCA3OF.mjs +0 -1713
  623. package/dist/chunk-LULCA3OF.mjs.map +0 -1
  624. package/dist/chunk-PA5DRJNI.mjs.map +0 -1
@@ -27,7 +27,7 @@ import type { MaterialCookProgramContext } from '@forgeax/engine-pack/material-c
27
27
  // fire; no renderable; no dispatch.
28
28
  // - case B (material === 0) : missing-spec sentinel; defaultMaterial
29
29
  // Snapshot fills the slot. No fire.
30
- // - case C (handle unresolved): assets.get(handle).err with the entity
30
+ // - case C (non-zero handle unresolved): assets.get(handle).err with the entity
31
31
  // carrying the full T+MF+MR renderable
32
32
  // archetype -> structured RhiError(
33
33
  // `asset-not-registered`) routed through
@@ -61,8 +61,8 @@ import type { MaterialCookProgramContext } from '@forgeax/engine-pack/material-c
61
61
  // material; hint literal: `'pass
62
62
  // undefined or omit field to request
63
63
  // default material'` (AC-10).
64
- // - case C dangling-ref : `assets.get(handle).err` (strict path,
65
- // isRenderable === true) ->
64
+ // - case C dangling-ref : `assets.get(handle).err` for a non-zero
65
+ // handle (strict path, isRenderable === true) ->
66
66
  // `RhiError({ code: 'asset-not-
67
67
  // registered', detail: { assetHandle },
68
68
  // hint: 'register material via
@@ -73,21 +73,16 @@ import type { MaterialCookProgramContext } from '@forgeax/engine-pack/material-c
73
73
  // entity skipped from
74
74
  // RenderableSnapshot[] +
75
75
  // MaterialDispatchSnapshot[]; mirrors
76
- // `MeshFilter.assetHandle` dangling path
76
+ // `MeshFilter.assetHandle` dangling path. A
77
+ // scalar shared<T> slot 0 is the unbound,
78
+ // non-renderable state and is skipped
77
79
  // (charter proposition 5; AC-11).
78
80
  //
79
- // Renderer-owned Large Instances:
80
- // `Instances { collectionId }` is an ECS association to the renderer's
81
- // `InstanceCollectionStore`, not an ECS transform-array column. The extract
82
- // tail resolves the identity against that store and snapshots canonical
83
- // transforms together with collection revision, capacity, dirty ranges,
84
- // and residency facts. Invalid or stale associations route the existing
85
- // typed `InstanceCollectionError` through the World error boundary; the
86
- // record stage owns GPU residency and upload decisions.
87
- //
88
- // `SpriteInstances` remains the separate ECS-owned array-view path. Its
89
- // snapshot is intentionally independent from renderer-owned Large Instances,
90
- // so the extract stage does not duplicate collection storage or GPU policy.
81
+ // World owns Instances.transforms. Extraction borrows the managed array during
82
+ // the read phase and retains a detached projection only when its values change.
83
+ // RenderScene accepts that projection with the source publication; recording
84
+ // owns device residency, upload revisions and backend-specific chunking.
85
+ // SpriteInstances remains the independent 2D component and snapshot contract.
91
86
 
92
87
  import type { AssetRegistry } from '@forgeax/engine-assets-runtime';
93
88
  import {
@@ -96,7 +91,14 @@ import {
96
91
  selectMaterialPassProgram,
97
92
  walkMaterialPassesOverSharedRefs,
98
93
  } from '@forgeax/engine-assets-runtime';
99
- import type { Component, ComponentSchema, EntityHandle, Query, World } from '@forgeax/engine-ecs';
94
+ import {
95
+ type Component,
96
+ type ComponentSchema,
97
+ type EntityHandle,
98
+ type Query,
99
+ Time,
100
+ type World,
101
+ } from '@forgeax/engine-ecs';
100
102
  import { readRenderArrayView, routeWorldError } from '@forgeax/engine-ecs/projection';
101
103
  import { type Mat4, mat4, type Vec3, vec3 } from '@forgeax/engine-math';
102
104
  import { AssetGuid, type AssetGuid as AssetGuidBytes } from '@forgeax/engine-pack/guid';
@@ -118,6 +120,7 @@ import type {
118
120
  MaterialPass,
119
121
  MaterialProgramAbi,
120
122
  MaterialRenderState,
123
+ MaterialSurfaceModel,
121
124
  MaterialTextureCoordinates,
122
125
  MaterialTextureValue,
123
126
  MeshLodLevel,
@@ -133,7 +136,7 @@ import {
133
136
  import { buildCubeCameraFaceViews } from './capture/cube-views';
134
137
  import {
135
138
  antialiasFromF32,
136
- bloomEnabledFromF32,
139
+ BarrelDistortion,
137
140
  CAMERA_EXPOSURE_MODE_MANUAL,
138
141
  Camera,
139
142
  CubeCamera,
@@ -148,8 +151,10 @@ import {
148
151
  ScreenSpaceReflection,
149
152
  tonemapFromF32,
150
153
  tonemapToU32,
154
+ validateCameraBloom,
151
155
  validateDynamicResolutionCamera,
152
156
  } from './components';
157
+ import { validateBarrelDistortionParameters } from './components/barrel-distortion';
153
158
  import { DepthOfField } from './components/depth-of-field';
154
159
  import type { DirectionalShadowQuality } from './components/directional-shadow-filter';
155
160
  import type { LightValidationError } from './components/light-helpers';
@@ -171,11 +176,12 @@ import {
171
176
  depthOfFieldRequestFailure,
172
177
  resolveDepthOfFieldParams,
173
178
  } from './features/depth-of-field/depth-of-field-params';
179
+ import { resolveMotionBlurParams } from './features/motion-blur/motion-blur-params';
174
180
  import type {
175
181
  RenderFeatureHiddenEntityReport,
176
182
  RenderFeatureWorldVisibilitySnapshot,
177
183
  } from './features/types';
178
- import type { InstanceCollectionId, InstanceCollectionStore } from './instances';
184
+ import type { InstanceCollectionId, InstanceProjectionStore } from './instances';
179
185
  import type {
180
186
  MeshMaterialBindingDiagnostic,
181
187
  MeshMaterialBindingSource,
@@ -648,15 +654,16 @@ export interface SkyboxSnapshot {
648
654
  }
649
655
 
650
656
  /**
651
- * Resource-owner projection for the single ECS VolumetricFog singleton.
657
+ * Resource-owner projection for an ECS VolumetricFog collection.
652
658
  *
653
659
  * The renderer carries the validated authoring facts and the source POD all
654
660
  * the way to the record stage. No profile flag or source/catalog byte is
655
661
  * allowed to enable the graph: `status: 'available'` is produced only after
656
662
  * the ECS component, its shared TextureAsset, and the volume validator all
657
- * agree on one linear 3D density owner.
663
+ * agree on every linear 3D density owner.
658
664
  */
659
665
  export interface ExtractedVolumetricFog {
666
+ readonly additional?: readonly ExtractedVolumetricFog[];
660
667
  readonly status: 'off' | 'available' | 'degraded';
661
668
  readonly fog?: ValidatedVolumetricFog;
662
669
  readonly densityHandle?: Handle<'TextureAsset', 'shared'>;
@@ -665,6 +672,8 @@ export interface ExtractedVolumetricFog {
665
672
  readonly generation?: number;
666
673
  readonly digest?: string;
667
674
  readonly worldId?: number;
675
+ /** Canonical simulation time projected from this World for authored medium motion. */
676
+ readonly worldTimeSeconds?: number;
668
677
  /** Required same-World light selected by the authoring component. */
669
678
  readonly lightEntity?: EntityHandle;
670
679
  readonly lightKind?: 'directional' | 'point' | 'spot';
@@ -816,6 +825,9 @@ export type RenderableReactiveReason =
816
825
  export interface RenderableTemporalSnapshot {
817
826
  readonly previousEpoch: number | undefined;
818
827
  readonly previousSource: RenderablePreviousSource;
828
+ /** True only when current and previous geometry belong to one stable source identity. */
829
+ readonly motionValid: boolean;
830
+ /** Color-history invalidation is independent from motion validity. */
819
831
  readonly reactive: boolean;
820
832
  readonly reactiveReasons: readonly RenderableReactiveReason[];
821
833
  readonly previousTransform: TransformSnapshot;
@@ -836,12 +848,12 @@ export interface InstancesSnapshot {
836
848
  readonly collectionId?: InstanceCollectionId;
837
849
  /** Packed column-major mat4 transforms (16 f32 per instance). */
838
850
  readonly transforms: Float32Array;
851
+ /** Monotonic per-ordinal identity generations, when the collection owns them. */
852
+ readonly generations?: Uint32Array;
839
853
  /** Number of instances (transforms.length / 16). */
840
854
  readonly instanceCount: number;
841
855
  /** Collection revision captured by this detached frame snapshot. */
842
856
  readonly revision?: number;
843
- /** Logical collection capacity at snapshot time. */
844
- readonly capacity?: number;
845
857
  /** Coalesced matrix ordinals dirtied since the previous authoring update. */
846
858
  readonly dirtyRanges?: readonly {
847
859
  readonly start: number;
@@ -927,6 +939,10 @@ export interface MaterialSnapshot {
927
939
  readonly baseColor: Vec3;
928
940
  readonly metallic: number;
929
941
  readonly roughness: number;
942
+ /** Root-owned Surface model used only for typed pass routing. */
943
+ readonly surfaceModel?: MaterialSurfaceModel | undefined;
944
+ /** Whether this material publishes a Deferred pass consumed before the forward-only lane. */
945
+ readonly deferredPass?: boolean | undefined;
930
946
  /** Authored Standard PBR specular color in linear runtime color space. */
931
947
  readonly specularColor?: readonly [number, number, number] | undefined;
932
948
  /**
@@ -1226,6 +1242,8 @@ export interface ExtractedFrame {
1226
1242
  readonly environmentReady: boolean;
1227
1243
  /** One resource-owner volume projection; absent means no authored fog. */
1228
1244
  readonly volumetricFog?: ExtractedVolumetricFog;
1245
+ /** Resource-owner CloudLayer facts selected once at the extract boundary. */
1246
+ readonly cloudLayer?: import('./cloud/extract').ExtractedCloudLayer;
1229
1247
  readonly renderables: RenderableSnapshot[];
1230
1248
  /**
1231
1249
  * Single dispatch list sorted by queue value (ascending, stable sort).
@@ -2442,6 +2460,13 @@ export function resolveMaterialSnapshot(
2442
2460
  baseColor,
2443
2461
  metallic: metallicPv,
2444
2462
  roughness: roughnessPv,
2463
+ ...(resolved.surface?.model === undefined ? {} : { surfaceModel: resolved.surface.model }),
2464
+ deferredPass: allPasses.some(
2465
+ (pass) =>
2466
+ String(
2467
+ (pass.renderState?.tags as Record<string, unknown> | undefined)?.LightMode ?? pass.name,
2468
+ ) === 'Deferred',
2469
+ ),
2445
2470
  ...(specularColorPv !== undefined && {
2446
2471
  specularColor: [
2447
2472
  specularColorPv[0] ?? 1,
@@ -2964,13 +2989,14 @@ export interface PreparedExtractContext {
2964
2989
  request?: {
2965
2990
  readonly vertexColorAvailable?: boolean;
2966
2991
  readonly deformation?: 'rigid' | 'skin';
2992
+ readonly variantSet?: string;
2967
2993
  readonly pass?: 'forward' | 'shadow' | 'depth';
2968
2994
  readonly address?: 'direct' | 'scene-index';
2969
2995
  },
2970
2996
  ) => MaterialShaderArtifact | undefined)
2971
2997
  | undefined;
2972
- /** Renderer-owned canonical source for explicit large instance collections. */
2973
- readonly instanceCollections: InstanceCollectionStore | undefined;
2998
+ /** Renderer-private projection of World-authored instance matrices. */
2999
+ readonly instanceCollections: InstanceProjectionStore | undefined;
2974
3000
  }
2975
3001
 
2976
3002
  const ALL_VISIBLE: VisibilitySnapshot = {
@@ -2987,13 +3013,23 @@ function collectCameraSnapshots(world: World): CameraSnapshot[] {
2987
3013
  const cameraQuery = world
2988
3014
  .query({
2989
3015
  read: [Camera],
2990
- optional: [MotionBlur, DynamicResolution, ScreenSpaceReflection, DepthOfField],
3016
+ optional: [
3017
+ MotionBlur,
3018
+ DynamicResolution,
3019
+ ScreenSpaceReflection,
3020
+ DepthOfField,
3021
+ BarrelDistortion,
3022
+ ],
2991
3023
  with: [Transform, GlobalTransform],
2992
3024
  })
2993
3025
  .unwrap();
2994
3026
  for (const row of cameraQuery) {
2995
3027
  const cam = row.get(Camera);
2996
3028
  const motionBlur = row.get(MotionBlur);
3029
+ const barrelDistortion = row.get(BarrelDistortion);
3030
+ const motionBlurResult = resolveMotionBlurParams(motionBlur);
3031
+ if (!motionBlurResult.ok) throw motionBlurResult.error;
3032
+ const motionBlurParams = motionBlurResult.value;
2997
3033
  const depthOfField = row.get(DepthOfField);
2998
3034
  const dynamicResolution = row.get(DynamicResolution);
2999
3035
  const screenSpaceReflection = row.get(ScreenSpaceReflection);
@@ -3031,6 +3067,8 @@ function collectCameraSnapshots(world: World): CameraSnapshot[] {
3031
3067
  const antialias = antialiasFromF32(cam.antialias);
3032
3068
  const dynamicResolutionResult = validateDynamicResolutionCamera(dynamicResolution, antialias);
3033
3069
  if (!dynamicResolutionResult.ok) throw dynamicResolutionResult.error;
3070
+ const barrelDistortionResult = validateBarrelDistortionParameters(barrelDistortion);
3071
+ if (!barrelDistortionResult.ok) throw barrelDistortionResult.error;
3034
3072
  cameras.push({
3035
3073
  entityKey: entity as number,
3036
3074
  ...(target === undefined ? {} : { target }),
@@ -3054,10 +3092,17 @@ function collectCameraSnapshots(world: World): CameraSnapshot[] {
3054
3092
  ...(dynamicResolutionResult.value === undefined
3055
3093
  ? {}
3056
3094
  : { dynamicResolution: dynamicResolutionResult.value }),
3057
- bloom: bloomEnabledFromF32(cam.bloom),
3095
+ bloom: validateCameraBloom(
3096
+ cam.bloom,
3097
+ cam.bloomThreshold,
3098
+ cam.bloomIntensity,
3099
+ cam.bloomSoftKnee,
3100
+ cam.bloomScatter,
3101
+ ),
3058
3102
  bloomThreshold: cam.bloomThreshold,
3059
3103
  bloomIntensity: cam.bloomIntensity,
3060
- bloomBlurRadius: cam.bloomBlurRadius,
3104
+ bloomSoftKnee: cam.bloomSoftKnee,
3105
+ bloomScatter: cam.bloomScatter,
3061
3106
  clearColor: [
3062
3107
  cam.clearColor[0] ?? 0,
3063
3108
  cam.clearColor[1] ?? 0,
@@ -3068,15 +3113,17 @@ function collectCameraSnapshots(world: World): CameraSnapshot[] {
3068
3113
  ? { depthOfField: depthOfFieldResult.value }
3069
3114
  : {}),
3070
3115
  ...(depthOfFieldError === undefined ? {} : { depthOfFieldError }),
3071
- ...(motionBlur === undefined
3116
+ ...(motionBlurParams === undefined
3072
3117
  ? {}
3073
3118
  : {
3074
3119
  motionBlur: {
3075
- shutterAngle: motionBlur.shutterAngle,
3076
- maxRadiusPixels: motionBlur.maxRadiusPixels,
3077
- sampleCount: motionBlur.sampleCount,
3120
+ shutterAngle: motionBlurParams.shutterAngle,
3121
+ maxRadiusPixels: motionBlurParams.maxRadiusPixels,
3122
+ sampleCount: motionBlurParams.sampleCount,
3123
+ targetFps: motionBlurParams.targetFps,
3078
3124
  },
3079
3125
  }),
3126
+ ...(barrelDistortion === undefined ? {} : { barrelDistortion: barrelDistortionResult.value }),
3080
3127
  ...(screenSpaceReflection === undefined
3081
3128
  ? {}
3082
3129
  : {
@@ -3229,11 +3276,12 @@ export function prepareExtractContext(
3229
3276
  request?: {
3230
3277
  readonly vertexColorAvailable?: boolean;
3231
3278
  readonly deformation?: 'rigid' | 'skin';
3279
+ readonly variantSet?: string;
3232
3280
  readonly pass?: 'forward' | 'shadow' | 'depth';
3233
3281
  readonly address?: 'direct' | 'scene-index';
3234
3282
  },
3235
3283
  ) => MaterialShaderArtifact | undefined;
3236
- readonly instanceCollections?: InstanceCollectionStore;
3284
+ readonly instanceCollections?: InstanceProjectionStore;
3237
3285
  } = {},
3238
3286
  ): PreparedExtractContext {
3239
3287
  const renderables = options.renderables ?? 'full';
@@ -3332,8 +3380,11 @@ export function extractVolumeSnapshot(
3332
3380
  assets: AssetRegistry | null | undefined,
3333
3381
  worldInternal: WorldInternalView,
3334
3382
  ): ExtractedVolumetricFog | undefined {
3383
+ const elapsed = world.getResource(Time).elapsed;
3384
+ const worldTimeSeconds = Number.isFinite(elapsed) ? Math.max(0, elapsed) : 0;
3335
3385
  const query = world.query({ read: [VolumetricFog] }).unwrap();
3336
3386
  const authorings: VolumetricFogAuthoring[] = [];
3387
+ const members: ExtractedVolumetricFog[] = [];
3337
3388
  let selectedLight:
3338
3389
  | {
3339
3390
  readonly entity: EntityHandle;
@@ -3342,15 +3393,9 @@ export function extractVolumeSnapshot(
3342
3393
  readonly spotLightEntity?: EntityHandle;
3343
3394
  }
3344
3395
  | undefined;
3345
- let first:
3346
- | {
3347
- readonly densityHandle: Handle<'TextureAsset', 'shared'>;
3348
- readonly densityAsset: TextureAsset;
3349
- readonly guid: string;
3350
- }
3351
- | undefined;
3352
3396
 
3353
3397
  for (const row of query) {
3398
+ selectedLight = undefined;
3354
3399
  const source = row.get(VolumetricFog);
3355
3400
  if (source.light === null) continue;
3356
3401
  const selected = resolveSelectedVolumetricLight(world, source.light);
@@ -3377,7 +3422,7 @@ export function extractVolumeSnapshot(
3377
3422
  : resolved.error,
3378
3423
  { severity: Severity.Error, systemName: 'RenderSystem.extract (volumetric-density)' },
3379
3424
  );
3380
- return { status: 'degraded' };
3425
+ return { status: 'degraded', worldTimeSeconds };
3381
3426
  }
3382
3427
  const densityAsset = resolved.value;
3383
3428
  const guid = assets?.guidOf(densityAsset) ?? `handle:${Number(densityHandle)}`;
@@ -3427,9 +3472,30 @@ export function extractVolumeSnapshot(
3427
3472
  emission: [source.emission[0] ?? 0, source.emission[1] ?? 0, source.emission[2] ?? 0],
3428
3473
  anisotropy: source.anisotropy,
3429
3474
  maxDistance: source.maxDistance,
3475
+ sampling: source.sampling === 1 ? 'density' : 'noise',
3430
3476
  };
3431
3477
  authorings.push(authoring);
3432
- first ??= { densityHandle, densityAsset, guid };
3478
+ members.push({
3479
+ status: 'available',
3480
+ worldTimeSeconds,
3481
+ densityHandle,
3482
+ densityAsset,
3483
+ guid,
3484
+ generation: 1,
3485
+ digest: textureDigest(densityAsset),
3486
+ ...(selectedLight === undefined
3487
+ ? {}
3488
+ : {
3489
+ lightEntity: selectedLight.entity,
3490
+ lightKind: selectedLight.kind,
3491
+ ...(selectedLight.pointLightEntity === undefined
3492
+ ? {}
3493
+ : { pointLightEntity: selectedLight.pointLightEntity }),
3494
+ ...(selectedLight.spotLightEntity === undefined
3495
+ ? {}
3496
+ : { spotLightEntity: selectedLight.spotLightEntity }),
3497
+ }),
3498
+ });
3433
3499
  }
3434
3500
 
3435
3501
  if (authorings.length === 0) return undefined;
@@ -3439,54 +3505,18 @@ export function extractVolumeSnapshot(
3439
3505
  severity: Severity.Error,
3440
3506
  systemName: 'RenderSystem.extract (volumetric-fog)',
3441
3507
  });
3442
- return {
3443
- status: 'degraded',
3444
- ...(first === undefined
3445
- ? {}
3446
- : {
3447
- densityHandle: first.densityHandle,
3448
- densityAsset: first.densityAsset,
3449
- guid: first.guid,
3450
- generation: 1,
3451
- digest: textureDigest(first.densityAsset),
3452
- ...(selectedLight === undefined
3453
- ? {}
3454
- : {
3455
- lightEntity: selectedLight.entity,
3456
- lightKind: selectedLight.kind,
3457
- ...(selectedLight.pointLightEntity === undefined
3458
- ? {}
3459
- : { pointLightEntity: selectedLight.pointLightEntity }),
3460
- ...(selectedLight.spotLightEntity === undefined
3461
- ? {}
3462
- : { spotLightEntity: selectedLight.spotLightEntity }),
3463
- }),
3464
- }),
3465
- };
3508
+ return { ...members[0], status: 'degraded' };
3466
3509
  }
3467
- if (extracted.value.status === 'off' || first === undefined) return { status: 'off' };
3468
- const selectedLightFields =
3469
- selectedLight === undefined
3470
- ? {}
3471
- : {
3472
- lightEntity: selectedLight.entity,
3473
- lightKind: selectedLight.kind,
3474
- ...(selectedLight.pointLightEntity === undefined
3475
- ? {}
3476
- : { pointLightEntity: selectedLight.pointLightEntity }),
3477
- ...(selectedLight.spotLightEntity === undefined
3478
- ? {}
3479
- : { spotLightEntity: selectedLight.spotLightEntity }),
3480
- };
3510
+ if (extracted.value.status === 'off') return { status: 'off' };
3511
+ const validatedMembers = extracted.value.fogs.map((fog, index) => ({
3512
+ ...members[index],
3513
+ status: 'available' as const,
3514
+ fog,
3515
+ }));
3481
3516
  return {
3482
3517
  status: 'available',
3483
- fog: extracted.value.fog,
3484
- densityHandle: first.densityHandle,
3485
- densityAsset: first.densityAsset,
3486
- guid: first.guid,
3487
- generation: 1,
3488
- digest: textureDigest(first.densityAsset),
3489
- ...selectedLightFields,
3518
+ ...validatedMembers[0],
3519
+ additional: validatedMembers.slice(1),
3490
3520
  };
3491
3521
  }
3492
3522
 
@@ -0,0 +1,56 @@
1
+ import type { World } from '@forgeax/engine-ecs';
2
+ import type { RenderSystemInternals } from './record/render-context';
3
+ import type { FramePresentation } from './render-contract';
4
+ import type { DispatchEntry, RenderableSnapshot } from './render-system-extract';
5
+ import { observeMaterialResidency } from './render-system-residency';
6
+
7
+ export interface FramePresentationProjection {
8
+ readonly renderables: readonly RenderableSnapshot[];
9
+ readonly presentation: FramePresentation;
10
+ }
11
+
12
+ /**
13
+ * Derive the startup presentation candidate from the current display workset.
14
+ * Shadow-only retained rows are deliberately excluded, while material facts
15
+ * still come from the producer-owned residency projection.
16
+ */
17
+ export function projectFramePresentation(input: {
18
+ readonly hasCamera: boolean;
19
+ readonly environmentReady: boolean;
20
+ readonly hasEnvironment: boolean;
21
+ readonly submissionRenderables: readonly RenderableSnapshot[];
22
+ readonly submissionDispatch: readonly DispatchEntry[];
23
+ readonly preparedWorlds: readonly World[];
24
+ readonly internals: RenderSystemInternals;
25
+ }): FramePresentationProjection {
26
+ const displayRenderableIndices = new Set<number>();
27
+ for (const entry of input.submissionDispatch) {
28
+ if (entry.renderableIndex === undefined) continue;
29
+ if (entry.tags.LightMode !== 'ShadowCaster')
30
+ displayRenderableIndices.add(entry.renderableIndex);
31
+ }
32
+ const renderables = input.submissionRenderables.filter(
33
+ (_, index) =>
34
+ displayRenderableIndices.has(index) &&
35
+ input.submissionRenderables[index]?.authorVisible !== false,
36
+ );
37
+
38
+ let presentation: FramePresentation = 'ready';
39
+ if (input.hasCamera && (!input.environmentReady || !input.hasEnvironment)) {
40
+ presentation = 'pending';
41
+ } else if (input.hasCamera) {
42
+ for (const renderable of renderables) {
43
+ const materialWorld = input.preparedWorlds[renderable.worldId];
44
+ for (const material of renderable.materials) {
45
+ if (
46
+ observeMaterialResidency(materialWorld, material, input.internals).readiness === 'pending'
47
+ ) {
48
+ presentation = 'pending';
49
+ break;
50
+ }
51
+ }
52
+ if (presentation === 'pending') break;
53
+ }
54
+ }
55
+ return { renderables, presentation };
56
+ }
@@ -0,0 +1,96 @@
1
+ export type RendererProducerRootKind =
2
+ | 'backend-surface'
3
+ | 'shader-material-pipeline'
4
+ | 'mesh-texture-sampler'
5
+ | 'render-scene'
6
+ | 'gpu-driven'
7
+ | 'feature'
8
+ | 'external-source'
9
+ | 'render-graph'
10
+ | 'target-history'
11
+ | 'observation-lease';
12
+
13
+ export interface RendererProducerRoot {
14
+ readonly kind: RendererProducerRootKind;
15
+ readonly owner: string;
16
+ readonly candidateScope: 'device-scope';
17
+ readonly visibility: 'visible-workset' | 'non-visible-lazy';
18
+ readonly disabledWork: 'zero' | 'lazy';
19
+ }
20
+
21
+ const PRODUCER_ROOT_MATRIX: readonly RendererProducerRoot[] = Object.freeze([
22
+ {
23
+ kind: 'backend-surface',
24
+ owner: 'backend-surface-owner',
25
+ candidateScope: 'device-scope',
26
+ visibility: 'visible-workset',
27
+ disabledWork: 'zero',
28
+ },
29
+ {
30
+ kind: 'shader-material-pipeline',
31
+ owner: 'shader-material-pipeline-owner',
32
+ candidateScope: 'device-scope',
33
+ visibility: 'visible-workset',
34
+ disabledWork: 'zero',
35
+ },
36
+ {
37
+ kind: 'mesh-texture-sampler',
38
+ owner: 'gpu-residency',
39
+ candidateScope: 'device-scope',
40
+ visibility: 'visible-workset',
41
+ disabledWork: 'lazy',
42
+ },
43
+ {
44
+ kind: 'render-scene',
45
+ owner: 'persistent-render-scene',
46
+ candidateScope: 'device-scope',
47
+ visibility: 'visible-workset',
48
+ disabledWork: 'zero',
49
+ },
50
+ {
51
+ kind: 'gpu-driven',
52
+ owner: 'gpu-driven-production',
53
+ candidateScope: 'device-scope',
54
+ visibility: 'visible-workset',
55
+ disabledWork: 'zero',
56
+ },
57
+ {
58
+ kind: 'feature',
59
+ owner: 'render-feature-host',
60
+ candidateScope: 'device-scope',
61
+ visibility: 'visible-workset',
62
+ disabledWork: 'lazy',
63
+ },
64
+ {
65
+ kind: 'external-source',
66
+ owner: 'external-source-owner',
67
+ candidateScope: 'device-scope',
68
+ visibility: 'non-visible-lazy',
69
+ disabledWork: 'zero',
70
+ },
71
+ {
72
+ kind: 'render-graph',
73
+ owner: 'typed-frame-graph',
74
+ candidateScope: 'device-scope',
75
+ visibility: 'visible-workset',
76
+ disabledWork: 'zero',
77
+ },
78
+ {
79
+ kind: 'target-history',
80
+ owner: 'temporal-target-owner',
81
+ candidateScope: 'device-scope',
82
+ visibility: 'visible-workset',
83
+ disabledWork: 'zero',
84
+ },
85
+ {
86
+ kind: 'observation-lease',
87
+ owner: 'render-observation-owner',
88
+ candidateScope: 'device-scope',
89
+ visibility: 'non-visible-lazy',
90
+ disabledWork: 'zero',
91
+ },
92
+ ]);
93
+
94
+ export function createRendererProducerRootMatrix(): readonly RendererProducerRoot[] {
95
+ return PRODUCER_ROOT_MATRIX;
96
+ }