@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
@@ -0,0 +1,226 @@
1
+ import type { CloudQuality } from '../components/cloud-layer';
2
+
3
+ export type CloudTemporalResetReason =
4
+ | 'authoring-generation'
5
+ | 'camera-cut'
6
+ | 'resize'
7
+ | 'recovery'
8
+ | 'time-discontinuity'
9
+ | 'cloud-shadow-revision'
10
+ | 'device-generation'
11
+ | 'history-missing'
12
+ | 'reprojection-outside'
13
+ | 'scene-depth-disocclusion';
14
+
15
+ export interface CloudTemporalSignature {
16
+ readonly sourceKey: string;
17
+ readonly viewId: string;
18
+ readonly authoringGeneration: number;
19
+ readonly cloudShadowRevision: number;
20
+ readonly cameraRevision: number;
21
+ readonly deviceGeneration: number;
22
+ readonly width: number;
23
+ readonly height: number;
24
+ readonly timeSeconds: number;
25
+ readonly quality: CloudQuality;
26
+ /** Scene-depth producer revision used to reject disoccluded history. */
27
+ readonly sceneDepthVersion?: number;
28
+ }
29
+
30
+ export interface CloudHistory {
31
+ readonly width: number;
32
+ readonly height: number;
33
+ readonly signature: string;
34
+ readonly temporal: CloudTemporalSignature;
35
+ readonly generation: number;
36
+ readonly valid: boolean;
37
+ }
38
+
39
+ export interface CloudTemporalDecision {
40
+ readonly reset: boolean;
41
+ readonly reasons: readonly CloudTemporalResetReason[];
42
+ readonly signature: string;
43
+ readonly history: CloudHistory | undefined;
44
+ }
45
+
46
+ export interface CloudTemporalFrame {
47
+ readonly signature: CloudTemporalSignature;
48
+ readonly history: CloudHistory | undefined;
49
+ readonly reset: boolean;
50
+ readonly reasons: readonly CloudTemporalResetReason[];
51
+ }
52
+
53
+ export interface CloudHistoryReprojectionInput {
54
+ readonly currentDepth: number;
55
+ readonly historyDepth: number;
56
+ readonly motion: readonly [number, number];
57
+ readonly currentPixel: readonly [number, number];
58
+ readonly historySize: readonly [number, number];
59
+ readonly depthTolerance?: number;
60
+ }
61
+
62
+ export interface CloudHistoryReprojection {
63
+ readonly accepted: boolean;
64
+ readonly historyUv: readonly [number, number];
65
+ readonly weight: number;
66
+ readonly reason: 'accepted' | 'outside' | 'depth-disocclusion';
67
+ }
68
+
69
+ export function cloudTemporalSignature(input: CloudTemporalSignature): string {
70
+ return [
71
+ 'cloud-temporal-v1',
72
+ input.viewId,
73
+ input.sourceKey,
74
+ input.authoringGeneration,
75
+ input.cloudShadowRevision,
76
+ input.cameraRevision,
77
+ input.deviceGeneration,
78
+ input.width,
79
+ input.height,
80
+ input.timeSeconds,
81
+ input.quality,
82
+ input.sceneDepthVersion ?? 0,
83
+ ].join(':');
84
+ }
85
+
86
+ function sameLayout(left: CloudTemporalSignature, right: CloudTemporalSignature): boolean {
87
+ return left.viewId === right.viewId && left.width === right.width && left.height === right.height;
88
+ }
89
+
90
+ /** Compare the facts that make a cloud history safe to reuse. */
91
+ export function cloudTemporalResetReasons(
92
+ previous: CloudTemporalSignature | undefined,
93
+ next: CloudTemporalSignature,
94
+ options: { readonly cameraCut?: boolean; readonly recovery?: boolean } = {},
95
+ ): readonly CloudTemporalResetReason[] {
96
+ if (previous === undefined) return ['history-missing'];
97
+ const reasons: CloudTemporalResetReason[] = [];
98
+ if (
99
+ previous.sourceKey !== next.sourceKey ||
100
+ previous.authoringGeneration !== next.authoringGeneration
101
+ ) {
102
+ reasons.push('authoring-generation');
103
+ }
104
+ if (previous.cloudShadowRevision !== next.cloudShadowRevision)
105
+ reasons.push('cloud-shadow-revision');
106
+ if (previous.deviceGeneration !== next.deviceGeneration) reasons.push('device-generation');
107
+ if (
108
+ previous.sceneDepthVersion !== undefined &&
109
+ next.sceneDepthVersion !== undefined &&
110
+ previous.sceneDepthVersion !== next.sceneDepthVersion
111
+ ) {
112
+ reasons.push('scene-depth-disocclusion');
113
+ }
114
+ if (!sameLayout(previous, next)) reasons.push('resize');
115
+ if (options.cameraCut === true || previous.cameraRevision !== next.cameraRevision)
116
+ reasons.push('camera-cut');
117
+ const dt = next.timeSeconds - previous.timeSeconds;
118
+ if (!Number.isFinite(dt) || dt < 0 || dt > 0.5) reasons.push('time-discontinuity');
119
+ if (options.recovery === true) reasons.push('recovery');
120
+ return Object.freeze(reasons);
121
+ }
122
+
123
+ export function createCloudHistory(
124
+ signature: CloudTemporalSignature,
125
+ generation: number,
126
+ valid = false,
127
+ ): CloudHistory {
128
+ return Object.freeze({
129
+ width: Math.max(1, Math.floor(signature.width)),
130
+ height: Math.max(1, Math.floor(signature.height)),
131
+ signature: cloudTemporalSignature(signature),
132
+ temporal: Object.freeze({ ...signature }),
133
+ generation,
134
+ valid,
135
+ });
136
+ }
137
+
138
+ /** Per-view histories are keyed by the renderer's view identity. */
139
+ export class CloudHistoryStore {
140
+ private readonly maxViews: number;
141
+ private readonly entries = new Map<
142
+ string,
143
+ { readonly history: CloudHistory; readonly signature: CloudTemporalSignature }
144
+ >();
145
+
146
+ constructor(maxViews = 4) {
147
+ this.maxViews = Math.max(1, Math.floor(maxViews));
148
+ }
149
+
150
+ begin(
151
+ signature: CloudTemporalSignature,
152
+ options: { readonly cameraCut?: boolean; readonly recovery?: boolean } = {},
153
+ ): CloudTemporalDecision {
154
+ const key = signature.viewId;
155
+ const previousEntry = this.entries.get(key);
156
+ const previous = previousEntry?.history;
157
+ const reasons = cloudTemporalResetReasons(previousEntry?.signature, signature, options);
158
+ const reset = reasons.length > 0;
159
+ return Object.freeze({
160
+ reset,
161
+ reasons,
162
+ signature: cloudTemporalSignature(signature),
163
+ history: reset ? undefined : previous,
164
+ });
165
+ }
166
+
167
+ commit(signature: CloudTemporalSignature, history: CloudHistory): void {
168
+ if (
169
+ history.width !== Math.max(1, Math.floor(signature.width)) ||
170
+ history.height !== Math.max(1, Math.floor(signature.height))
171
+ ) {
172
+ this.entries.delete(signature.viewId);
173
+ return;
174
+ }
175
+ this.entries.set(signature.viewId, { history, signature: Object.freeze({ ...signature }) });
176
+ while (this.entries.size > this.maxViews) {
177
+ const oldest = this.entries.keys().next().value as string | undefined;
178
+ if (oldest === undefined) break;
179
+ this.entries.delete(oldest);
180
+ }
181
+ }
182
+
183
+ reset(viewId?: string): void {
184
+ if (viewId === undefined) this.entries.clear();
185
+ else this.entries.delete(viewId);
186
+ }
187
+
188
+ get(viewId: string): CloudHistory | undefined {
189
+ return this.entries.get(viewId)?.history;
190
+ }
191
+
192
+ dispose(): void {
193
+ this.entries.clear();
194
+ }
195
+ }
196
+
197
+ /** Project one current pixel into the previous cloud history. */
198
+ export function reprojectCloudHistory(
199
+ input: CloudHistoryReprojectionInput,
200
+ historyWeight = 0.9,
201
+ ): CloudHistoryReprojection {
202
+ const width = Math.max(1, input.historySize[0] ?? 1);
203
+ const height = Math.max(1, input.historySize[1] ?? 1);
204
+ const uv: [number, number] = [
205
+ ((input.currentPixel[0] ?? 0) - (input.motion[0] ?? 0)) / width,
206
+ ((input.currentPixel[1] ?? 0) - (input.motion[1] ?? 0)) / height,
207
+ ];
208
+ if (uv[0] < 0 || uv[0] > 1 || uv[1] < 0 || uv[1] > 1) {
209
+ return { accepted: false, historyUv: uv, weight: 0, reason: 'outside' };
210
+ }
211
+ const depthTolerance =
212
+ input.depthTolerance ?? Math.max(0.01, Math.abs(input.currentDepth) * 0.02);
213
+ if (
214
+ !Number.isFinite(input.currentDepth) ||
215
+ !Number.isFinite(input.historyDepth) ||
216
+ Math.abs(input.currentDepth - input.historyDepth) > depthTolerance
217
+ ) {
218
+ return { accepted: false, historyUv: uv, weight: 0, reason: 'depth-disocclusion' };
219
+ }
220
+ return {
221
+ accepted: true,
222
+ historyUv: uv,
223
+ weight: Math.min(0.99, Math.max(0, historyWeight)),
224
+ reason: 'accepted',
225
+ };
226
+ }
@@ -8,6 +8,7 @@ describe('MotionBlur component schema', () => {
8
8
  shutterAngle: { type: 'f32', default: 180 },
9
9
  maxRadiusPixels: { type: 'f32', default: 32 },
10
10
  sampleCount: { type: 'f32', default: 8 },
11
+ targetFps: { type: 'f32', default: 60 },
11
12
  });
12
13
  expect(MotionBlur.fields).not.toHaveProperty('enabled');
13
14
  });
@@ -7,4 +7,8 @@ export const Atmosphere = defineComponent('Atmosphere', {
7
7
  mieCoefficient: { type: 'f32', default: 0.005 },
8
8
  mieDirectionalG: { type: 'f32', default: 0.8 },
9
9
  sunAngularRadius: { type: 'f32', default: 0.004675 },
10
+ /** Independent multiplier for the analytic circumsolar lobe. */
11
+ circumsolarStrength: { type: 'f32', default: 1 },
12
+ /** Relative angular width of the analytic circumsolar lobe. */
13
+ circumsolarWidth: { type: 'f32', default: 1 },
10
14
  });
@@ -0,0 +1,46 @@
1
+ import { defineComponent, type SchemaOf, type ShapeOf } from '@forgeax/engine-ecs';
2
+ import { err, ok, type Result } from '@forgeax/engine-types';
3
+ import { BarrelDistortionInvalidParameterError } from '../errors/render';
4
+
5
+ /** Camera companion that applies the bounded first-order barrel model. */
6
+ export const BarrelDistortion = defineComponent('BarrelDistortion', {
7
+ strength: { type: 'f32', default: 0 },
8
+ centerX: { type: 'f32', default: 0.5 },
9
+ centerY: { type: 'f32', default: 0.5 },
10
+ });
11
+
12
+ export type BarrelDistortionData = ShapeOf<SchemaOf<typeof BarrelDistortion>>;
13
+
14
+ const DEFAULT_BARREL_DISTORTION: BarrelDistortionData = Object.freeze({
15
+ strength: 0,
16
+ centerX: 0.5,
17
+ centerY: 0.5,
18
+ });
19
+
20
+ function invalid(
21
+ field: 'strength' | 'centerX' | 'centerY',
22
+ value: number,
23
+ expected: string,
24
+ ): BarrelDistortionInvalidParameterError {
25
+ return new BarrelDistortionInvalidParameterError({ field, value, expected });
26
+ }
27
+
28
+ /** Validate and detach camera-owned barrel authoring data. */
29
+ export function validateBarrelDistortionParameters(
30
+ input: Partial<BarrelDistortionData> | undefined,
31
+ ): Result<BarrelDistortionData, BarrelDistortionInvalidParameterError> {
32
+ const value = input ?? {};
33
+ const strength = value.strength ?? DEFAULT_BARREL_DISTORTION.strength;
34
+ const centerX = value.centerX ?? DEFAULT_BARREL_DISTORTION.centerX;
35
+ const centerY = value.centerY ?? DEFAULT_BARREL_DISTORTION.centerY;
36
+ if (!Number.isFinite(strength) || strength < 0 || strength > 0.35) {
37
+ return err(invalid('strength', strength, 'finite and in [0, 0.35]'));
38
+ }
39
+ if (!Number.isFinite(centerX) || centerX < 0 || centerX > 1) {
40
+ return err(invalid('centerX', centerX, 'finite and in [0, 1]'));
41
+ }
42
+ if (!Number.isFinite(centerY) || centerY < 0 || centerY > 1) {
43
+ return err(invalid('centerY', centerY, 'finite and in [0, 1]'));
44
+ }
45
+ return ok(Object.freeze({ strength, centerX, centerY }));
46
+ }
@@ -1,9 +1,7 @@
1
1
  // @forgeax/engine-render - Camera (projection variant + ortho extension).
2
2
  //
3
- // Schema: 9 f32 columns perspective quartet (fov + aspect + near + far)
4
- // + projection discriminator (0 = perspective, 1 = orthographic) + ortho
5
- // quartet (left + right + bottom + top). The view matrix continues to be
6
- // derived from the entity's Transform (AC-06 case B fires
3
+ // Schema: projection, output, Bloom, and lifecycle columns. The view matrix
4
+ // continues to be derived from the entity's Transform (AC-06 case B fires
7
5
  // 'render-system-no-camera' when 0 such entities exist).
8
6
  //
9
7
  // Projection discriminator:
@@ -386,7 +384,7 @@ export function antialiasFromF32(value: number): Antialias {
386
384
  *
387
385
  * Two members:
388
386
  * `'off'` - default; no bloom post-processing (zero-overhead opt-out path)
389
- * `'on'` - bloom bright-pass + separable blur + composite pipeline
387
+ * `'on'` - five-level HDR extraction/downsample/tent-upsample pipeline
390
388
  *
391
389
  * Bloom is a discrete enum (0/1) — illegal values fail-fast with the closed
392
390
  * CameraError contract (charter P3), matching antialiasFromF32 precedent.
@@ -398,6 +396,19 @@ export const BLOOM_DISABLED = 0;
398
396
  /** Numeric encoding of bloom enabled (schema value for `bloom`). */
399
397
  export const BLOOM_ENABLED = 1;
400
398
 
399
+ /** Bloom intensity is a linear HDR add-back multiplier. */
400
+ export const CAMERA_BLOOM_INTENSITY_MIN = 0;
401
+ export const CAMERA_BLOOM_INTENSITY_MAX = 8;
402
+ /** Bloom threshold is expressed in scene-linear Rec.709 luminance. */
403
+ export const CAMERA_BLOOM_THRESHOLD_MIN = 0;
404
+ export const CAMERA_BLOOM_THRESHOLD_MAX = 65504;
405
+ /** Soft-knee transition width relative to the threshold. */
406
+ export const CAMERA_BLOOM_SOFT_KNEE_MIN = 0;
407
+ export const CAMERA_BLOOM_SOFT_KNEE_MAX = 1;
408
+ /** Coarse pyramid contribution. This is a blend, not a blur radius. */
409
+ export const CAMERA_BLOOM_SCATTER_MIN = 0;
410
+ export const CAMERA_BLOOM_SCATTER_MAX = 0.95;
411
+
401
412
  /**
402
413
  * Map a `camera.bloom` numeric value to the closed `BloomEnabled` string-literal
403
414
  * union. Invalid values fail-fast with structured error (charter P3).
@@ -414,6 +425,49 @@ export function bloomEnabledFromF32(value: number): BloomEnabled {
414
425
  );
415
426
  }
416
427
 
428
+ function validateBloomRange(field: string, value: number, min: number, max: number): void {
429
+ if (!Number.isFinite(value) || value < min || value > max) {
430
+ throw cameraError(
431
+ 'camera-bloom-invalid',
432
+ field,
433
+ value,
434
+ `a finite value in [${min}, ${max}]`,
435
+ `set Camera.${field} to a finite value in [${min}, ${max}]`,
436
+ );
437
+ }
438
+ }
439
+
440
+ /** Validate the complete Camera-owned Bloom contract at the extract boundary. */
441
+ export function validateCameraBloom(
442
+ bloom: number,
443
+ threshold: number,
444
+ intensity: number,
445
+ softKnee: number,
446
+ scatter: number,
447
+ ): BloomEnabled {
448
+ const enabled = bloomEnabledFromF32(bloom);
449
+ validateBloomRange(
450
+ 'bloomThreshold',
451
+ threshold,
452
+ CAMERA_BLOOM_THRESHOLD_MIN,
453
+ CAMERA_BLOOM_THRESHOLD_MAX,
454
+ );
455
+ validateBloomRange(
456
+ 'bloomIntensity',
457
+ intensity,
458
+ CAMERA_BLOOM_INTENSITY_MIN,
459
+ CAMERA_BLOOM_INTENSITY_MAX,
460
+ );
461
+ validateBloomRange(
462
+ 'bloomSoftKnee',
463
+ softKnee,
464
+ CAMERA_BLOOM_SOFT_KNEE_MIN,
465
+ CAMERA_BLOOM_SOFT_KNEE_MAX,
466
+ );
467
+ validateBloomRange('bloomScatter', scatter, CAMERA_BLOOM_SCATTER_MIN, CAMERA_BLOOM_SCATTER_MAX);
468
+ return enabled;
469
+ }
470
+
417
471
  /**
418
472
  * Camera projection parameters (perspective + orthographic variants) +
419
473
  * tonemap trio (mode + exposure + whitePoint).
@@ -447,8 +501,9 @@ export function bloomEnabledFromF32(value: number): BloomEnabled {
447
501
  * N>1 fires 'render-system-multi-camera' + uses first). Multi-viewport is
448
502
  * OOS (see feat-future-multi-viewport). The orthographic path reuses the
449
503
  * same near / far as the perspective path — both variants share the single
450
- * Camera archetype (17 scalar f32 columns + one historyVersion u32 column +
451
- * the `clearColor` array<f32,4> column + the `autoAspect` bool column).
504
+ * Camera archetype (30 schema fields, including the Bloom controls, one
505
+ * historyVersion u32 column, the `clearColor` array<f32,4> column, and the
506
+ * `autoAspect` bool column).
452
507
  *
453
508
  * @example Perspective camera at (0, 0, 3) looking down -Z (zero-config tonemap):
454
509
  * world.spawn(
@@ -514,7 +569,8 @@ export const Camera = defineComponent('Camera', {
514
569
  bloom: { type: 'f32', default: 0 },
515
570
  bloomThreshold: { type: 'f32', default: 1.0 },
516
571
  bloomIntensity: { type: 'f32', default: 1.0 },
517
- bloomBlurRadius: { type: 'f32', default: 4.0 },
572
+ bloomSoftKnee: { type: 'f32', default: 0.5 },
573
+ bloomScatter: { type: 'f32', default: 0.7 },
518
574
  // M1 target camera role: zero means this camera is eligible for display;
519
575
  // non-zero shared targets are auxiliary producers whose views and receipt
520
576
  // promotion remain owned by Renderer.
@@ -544,7 +600,7 @@ export const Camera = defineComponent('Camera', {
544
600
 
545
601
  // ─── Camera POD type (derived from Camera token — single source, AC-07) ─────
546
602
  //
547
- // ShapeOf<SchemaOf<typeof Camera>> resolves the 20-field POD from the Camera
603
+ // ShapeOf<SchemaOf<typeof Camera>> resolves the 30-field POD from the Camera
548
604
  // token's schema, which is itself derived from Camera.fields[k].type (D-A7).
549
605
  // This replaces the hand-maintained CameraDataPod interface — the field set
550
606
  // lives exclusively in the Camera component definition above.
@@ -626,7 +682,7 @@ function cameraColorGradingColumns(
626
682
 
627
683
  // ─── Camera factory functions (w13 SSOT refactoring) ─────────────────────
628
684
  //
629
- // Standalone factory functions that return 20-field CameraPod objects
685
+ // Standalone factory functions that return 29-field CameraPod objects
630
686
  // matching the Camera component column shape. Not static methods because
631
687
  // TypeScript const-namespace merge is not supported, and Object.assign
632
688
  // would break the Camera token's reference identity (archetype columns /
@@ -0,0 +1,47 @@
1
+ import { defineComponent, type SchemaOf, type ShapeOf } from '@forgeax/engine-ecs';
2
+
3
+ /** Closed quality lane for the renderer-owned procedural cloud producer. */
4
+ export type CloudQuality = 'low' | 'medium' | 'high';
5
+
6
+ export const CloudQualityValue = Object.freeze({
7
+ low: 0,
8
+ medium: 1,
9
+ high: 2,
10
+ } as const);
11
+
12
+ /**
13
+ * A single World-authored cloud layer.
14
+ *
15
+ * The component contains only source facts. Cache resolution, optical step
16
+ * counts, temporal history and GPU handles are derived by Render and never
17
+ * written back into ECS.
18
+ */
19
+ export const CloudLayer = defineComponent('CloudLayer', {
20
+ /** Stable integer seed for the periodic 3D density field. */
21
+ seed: { type: 'u32', default: 1337 },
22
+ /** World-space lower edge of the layer, in metres. */
23
+ baseHeight: { type: 'f32', default: 120 },
24
+ /** World-space thickness of the layer, in metres. */
25
+ thickness: { type: 'f32', default: 80 },
26
+ /** Horizontal noise scale, in cycles per metre. */
27
+ scale: { type: 'f32', default: 0.004 },
28
+ /** Coverage threshold in [0, 1]. */
29
+ coverage: { type: 'f32', default: 0.48 },
30
+ /** Extinction multiplier in inverse metres. */
31
+ density: { type: 'f32', default: 1 },
32
+ /** World-space wind velocity in metres per second. */
33
+ wind: { type: 'array<f32, 3>', default: new Float32Array([8, 0, 2]) },
34
+ /** Quality controls cache resolution and bounded ray steps. */
35
+ quality: { type: 'f32', default: CloudQualityValue.medium },
36
+ /** Maximum world-space distance represented by the light-space shadow map. */
37
+ shadowRange: { type: 'f32', default: 512 },
38
+ });
39
+
40
+ export type CloudLayerData = ShapeOf<SchemaOf<typeof CloudLayer>>;
41
+
42
+ export function cloudQualityFromF32(value: number): CloudQuality | undefined {
43
+ if (value === CloudQualityValue.low) return 'low';
44
+ if (value === CloudQualityValue.medium) return 'medium';
45
+ if (value === CloudQualityValue.high) return 'high';
46
+ return undefined;
47
+ }
@@ -1,5 +1,7 @@
1
1
  export * from './atmosphere';
2
+ export * from './barrel-distortion';
2
3
  export * from './camera';
4
+ export * from './cloud-layer';
3
5
  export * from './cube-camera';
4
6
  export * from './depth-of-field';
5
7
  export * from './directional-light';
@@ -1,50 +1,23 @@
1
- // @forgeax/engine-render - renderer-owned large instance association.
2
- //
3
- // The ECS component deliberately carries only a stable collection identity.
4
- // Matrix bytes, revision, capacity, dirty ranges, GPU residency and fallback
5
- // policy belong to InstanceCollectionStore, exposed from the same Renderer.
6
- // This keeps large payloads out of the ECS managed BufferPool while retaining
7
- // ordinary query and entity-lifetime semantics.
8
- //
9
- // Authoring example:
10
- //
11
- // const transforms = new Float32Array(instanceCount * 16);
12
- // for (let index = 0; index < instanceCount; index += 1) {
13
- // const offset = index * 16;
14
- // transforms[offset] = 1;
15
- // transforms[offset + 5] = 1;
16
- // transforms[offset + 10] = 1;
17
- // transforms[offset + 15] = 1;
18
- // }
19
- // const collection = renderer.instances.create({
20
- // transforms,
21
- // }).unwrap();
22
- // world.spawn(
23
- // { component: MeshFilter, data: { assetHandle: HANDLE_CUBE } },
24
- // { component: MeshRenderer, data: {} },
25
- // { component: Instances, data: { collectionId: collection.collectionId } },
26
- // );
27
- //
28
- // Updates stay on the renderer owner and publish one revision:
29
- //
30
- // renderer.instances.update(collection.collectionId, {
31
- // start: 12,
32
- // transforms: patch,
33
- // });
34
- //
35
- // Render extraction snapshots the validated packed column-major matrices once
36
- // per frame. Direct, GPU-driven and fallback lanes consume that same detached
37
- // projection; callers never split one logical collection into ECS chunks.
38
-
39
1
  import { defineComponent } from '@forgeax/engine-ecs';
40
- import type { InstanceCollectionData } from '../instances';
41
2
 
42
- /** Per-entity association with a renderer-owned instance collection. */
3
+ /**
4
+ * World-owned local transforms for one explicit instanced renderable.
5
+ * Packed column-major mat4 values compose as entityWorld * instanceLocal.
6
+ * ECS owns copying, mutation and entity lifetime, including large arrays.
7
+ * Renderer extraction derives its own snapshot and GPU residency; neither
8
+ * authoring nor glTF SceneAsset lowering requires a Renderer identity.
9
+ *
10
+ * @example
11
+ * const transforms = new Float32Array(20_000 * 16);
12
+ * for (let i = 0; i < 20_000; i++) {
13
+ * transforms[i * 16] = transforms[i * 16 + 5] =
14
+ * transforms[i * 16 + 10] = transforms[i * 16 + 15] = 1;
15
+ * }
16
+ * const entity = world.spawn({ component: Instances, data: { transforms } }).unwrap();
17
+ * world.set(entity, Instances, { transforms }).unwrap();
18
+ */
43
19
  export const Instances = defineComponent('Instances', {
44
- collectionId: { type: 'u32', default: 0 },
20
+ transforms: { type: 'array<f32>' },
45
21
  });
46
22
 
47
- /** Type-level hint for the `data` object at the Instances spawn site. */
48
- export type InstancesData = InstanceCollectionData;
49
-
50
- export type { InstanceCollectionId } from '../instances';
23
+ export type InstancesData = { readonly transforms: Float32Array };
@@ -10,8 +10,8 @@
10
10
  //
11
11
  // AI users spawn with the assets-runtime constants `HANDLE_CUBE` /
12
12
  // `HANDLE_TRIANGLE` (now branded `Handle<'MeshAsset','shared'>` to
13
- // match the schema-derived shape); custom mesh registration is owned by
14
- // feat-future-asset-system (this MVP only exposes builtin handles).
13
+ // match the schema-derived shape). A loaded or custom MeshAsset payload is
14
+ // bound by allocating a World shared reference before publishing this field.
15
15
  //
16
16
  // Naming flavor: unity-style "MeshFilter / MeshRenderer" pair, but the forgeax
17
17
  // pair does NOT mirror Unity's filter-toggle semantics - MeshFilter only
@@ -22,12 +22,13 @@
22
22
  // query never matches -> entity is silently absent from the
23
23
  // RenderableSnapshot[] (NO default-material fallback, NO onError fire);
24
24
  // case B (MeshRenderer.material omitted at spawn) -> mid-grey
25
- // defaultMaterialSnapshot fallback (no onError); case C (material handle
25
+ // defaultMaterialSnapshot fallback (no onError); an unbound scalar shared<T>
26
+ // field (slot 0) is also not a renderable; case C (non-zero material handle
26
27
  // unresolved) -> RhiError 'asset-not-registered' (mirrors the
27
28
  // MeshFilter.assetHandle dangling-ref path).
28
29
  //
29
30
  // charter mapping: proposition 1 (single import) + proposition 4 (explicit
30
- // failure: missing or unregistered handle fires onError 'asset-not-registered'
31
+ // failure: a non-zero unregistered handle fires onError 'asset-not-registered'
31
32
  // with .detail = { assetHandle } + cross-asset brand mismatch is a TS
32
33
  // compile-time error) + proposition 5 (consistent abstraction: the schema
33
34
  // vocab `'shared<T>'` is the SSOT for AssetRegistry-owned handles across
@@ -39,12 +40,13 @@ import { defineComponent } from '@forgeax/engine-ecs';
39
40
  * Mesh filter (geometry asset reference).
40
41
  *
41
42
  * `assetHandle` carries a `Handle<'MeshAsset', 'shared'>` (u32-stored)
42
- * pointing into `engine.assets: AssetRegistry`. Use the predefined
43
- * constants `HANDLE_CUBE` / `HANDLE_TRIANGLE` exported from
44
- * `@forgeax/engine-render`; custom-mesh registration is OOS in MVP (see
45
- * feat-future-asset-system).
43
+ * pointing to a mesh payload in the current World shared-reference / builtin
44
+ * handle namespace. An omitted field defaults to slot `0`, the unbound
45
+ * sentinel; an entity with that value is not emitted as a renderable. Use the
46
+ * predefined constants `HANDLE_CUBE` / `HANDLE_TRIANGLE` for builtins and
47
+ * allocate a World shared reference for a loaded mesh payload.
46
48
  *
47
- * Error path: if the handle is not registered at draw time, RenderSystem
49
+ * Error path: if a non-zero handle is not registered at draw time, RenderSystem
48
50
  * fires `Renderer.onError` with
49
51
  * `RhiError({ code: 'asset-not-registered', detail: { assetHandle } })`
50
52
  * and skips this entity (other entities continue rendering; charter
@@ -5,4 +5,5 @@ export const MotionBlur = defineComponent('MotionBlur', {
5
5
  shutterAngle: { type: 'f32', default: 180 },
6
6
  maxRadiusPixels: { type: 'f32', default: 32 },
7
7
  sampleCount: { type: 'f32', default: 8 },
8
+ targetFps: { type: 'f32', default: 60 },
8
9
  });
@@ -41,7 +41,7 @@
41
41
  // composes per instance:
42
42
  // world_position[i] = entity_world * instances_local[i] * vertex_position
43
43
  // `SpriteInstances.transforms[i*16..i*16+15]` is interpreted as a local-
44
- // space transform under the entity, matching the 3D collection projection.
44
+ // space transform under the entity, exactly like `Instances.transforms`.
45
45
  // Set the entity's `Transform` to identity to make `instances_local[i]`
46
46
  // directly world-space.
47
47
  //
@@ -14,7 +14,7 @@ export type {
14
14
  RhiBackendInstrumentation,
15
15
  RhiBackendPack,
16
16
  } from './assembly/backend-contract';
17
- export { EngineEnvironmentError } from './assembly/backend-contract';
17
+ export { EngineEnvironmentError, loadRhiPack } from './assembly/backend-contract';
18
18
  export type { RendererLegacyHostAdapter } from './assembly/host-contract';
19
19
  export type { BundlerOptions };
20
20