@forgeax/engine-render 0.1.6 → 0.1.19

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 (713) hide show
  1. package/README.md +279 -2
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/assembly/backend-contract.d.ts +12 -0
  4. package/dist/assembly/backend-contract.d.ts.map +1 -1
  5. package/dist/assembly/factory.d.ts +19 -2
  6. package/dist/assembly/factory.d.ts.map +1 -1
  7. package/dist/assembly/host-contract.d.ts +4 -0
  8. package/dist/assembly/host-contract.d.ts.map +1 -1
  9. package/dist/assembly/material/assembly.d.ts.map +1 -1
  10. package/dist/assembly/renderer-frame-transaction.d.ts +39 -0
  11. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -0
  12. package/dist/assembly/renderer-inspection.d.ts +22 -0
  13. package/dist/assembly/renderer-inspection.d.ts.map +1 -0
  14. package/dist/assembly/renderer-lifecycle.d.ts +4 -0
  15. package/dist/assembly/renderer-lifecycle.d.ts.map +1 -0
  16. package/dist/authoring.d.ts +1 -0
  17. package/dist/authoring.d.ts.map +1 -1
  18. package/dist/authoring.mjs +4 -2
  19. package/dist/authoring.mjs.map +1 -1
  20. package/dist/chunk-FJ6P52EE.mjs +46 -0
  21. package/dist/chunk-FJ6P52EE.mjs.map +1 -0
  22. package/dist/chunk-IPXCABEP.mjs +73 -0
  23. package/dist/chunk-IPXCABEP.mjs.map +1 -0
  24. package/dist/chunk-JDWARUOI.mjs +44 -0
  25. package/dist/chunk-JDWARUOI.mjs.map +1 -0
  26. package/dist/chunk-LOSO4CTV.mjs +901 -0
  27. package/dist/chunk-LOSO4CTV.mjs.map +1 -0
  28. package/dist/chunk-PCHBPYML.mjs +385 -0
  29. package/dist/chunk-PCHBPYML.mjs.map +1 -0
  30. package/dist/chunk-RJRUS55L.mjs +9323 -0
  31. package/dist/chunk-RJRUS55L.mjs.map +1 -0
  32. package/dist/{chunk-QC4VW3XJ.mjs → chunk-RXZ3RGOU.mjs} +4 -30
  33. package/dist/chunk-RXZ3RGOU.mjs.map +1 -0
  34. package/dist/{chunk-CQXZC5XI.mjs → chunk-VFPLTKCU.mjs} +79 -69
  35. package/dist/chunk-VFPLTKCU.mjs.map +1 -0
  36. package/dist/{chunk-SCRSAK5B.mjs → chunk-YTQ5C7YQ.mjs} +231 -127
  37. package/dist/chunk-YTQ5C7YQ.mjs.map +1 -0
  38. package/dist/components/atmosphere.d.ts +9 -0
  39. package/dist/components/atmosphere.d.ts.map +1 -0
  40. package/dist/components/camera.d.ts +2 -1
  41. package/dist/components/camera.d.ts.map +1 -1
  42. package/dist/components/fog.d.ts +8 -0
  43. package/dist/components/fog.d.ts.map +1 -0
  44. package/dist/components/index.d.ts +5 -0
  45. package/dist/components/index.d.ts.map +1 -1
  46. package/dist/components/lines.d.ts +5 -0
  47. package/dist/components/lines.d.ts.map +1 -0
  48. package/dist/components/motion-blur.d.ts +7 -0
  49. package/dist/components/motion-blur.d.ts.map +1 -0
  50. package/dist/components/points.d.ts +15 -0
  51. package/dist/components/points.d.ts.map +1 -0
  52. package/dist/construct-renderer.d.ts +2 -2
  53. package/dist/construct-renderer.d.ts.map +1 -1
  54. package/dist/construct-renderer.mjs +11419 -16442
  55. package/dist/construct-renderer.mjs.map +1 -1
  56. package/dist/device/device-scope.d.ts +4 -0
  57. package/dist/device/device-scope.d.ts.map +1 -1
  58. package/dist/environment/frame.d.ts +60 -0
  59. package/dist/environment/frame.d.ts.map +1 -0
  60. package/dist/environment/generation.d.ts +21 -0
  61. package/dist/environment/generation.d.ts.map +1 -0
  62. package/dist/environment/graph.d.ts +4 -0
  63. package/dist/environment/graph.d.ts.map +1 -0
  64. package/dist/environment/inspection.d.ts +48 -0
  65. package/dist/environment/inspection.d.ts.map +1 -0
  66. package/dist/environment/lifecycle.d.ts +39 -0
  67. package/dist/environment/lifecycle.d.ts.map +1 -0
  68. package/dist/environment/signature.d.ts +25 -0
  69. package/dist/environment/signature.d.ts.map +1 -0
  70. package/dist/errors/render.d.ts +217 -1
  71. package/dist/errors/render.d.ts.map +1 -1
  72. package/dist/extract/camera.d.ts +5 -0
  73. package/dist/extract/camera.d.ts.map +1 -0
  74. package/dist/extract/environment.d.ts +74 -0
  75. package/dist/extract/environment.d.ts.map +1 -0
  76. package/dist/extract/visibility.d.ts +1 -1
  77. package/dist/extract/visibility.d.ts.map +1 -1
  78. package/dist/features/host.d.ts +9 -2
  79. package/dist/features/host.d.ts.map +1 -1
  80. package/dist/features/motion-blur/motion-blur-feature.d.ts +16 -0
  81. package/dist/features/motion-blur/motion-blur-feature.d.ts.map +1 -0
  82. package/dist/features/motion-blur/motion-blur-params.d.ts +25 -0
  83. package/dist/features/motion-blur/motion-blur-params.d.ts.map +1 -0
  84. package/dist/features/plan.d.ts +17 -2
  85. package/dist/features/plan.d.ts.map +1 -1
  86. package/dist/features/prepared-gpu-work.d.ts +3 -1
  87. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  88. package/dist/features/prepared-graphics.d.ts +2 -1
  89. package/dist/features/prepared-graphics.d.ts.map +1 -1
  90. package/dist/features/render-graph-raster.d.ts +7 -2
  91. package/dist/features/render-graph-raster.d.ts.map +1 -1
  92. package/dist/features/targets.d.ts +3 -0
  93. package/dist/features/targets.d.ts.map +1 -1
  94. package/dist/features/types.d.ts +12 -0
  95. package/dist/features/types.d.ts.map +1 -1
  96. package/dist/fullscreen-post-process-pass.d.ts +7 -1
  97. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  98. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  99. package/dist/gpu-scene.d.ts +2 -0
  100. package/dist/gpu-scene.d.ts.map +1 -1
  101. package/dist/ibl/skylight-bind-group.d.ts +5 -6
  102. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  103. package/dist/index.d.ts +21 -6
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.mjs +8 -4
  106. package/dist/index.mjs.map +1 -1
  107. package/dist/inspection-types.d.ts +46 -1
  108. package/dist/inspection-types.d.ts.map +1 -1
  109. package/dist/internal.d.ts +2 -0
  110. package/dist/internal.d.ts.map +1 -1
  111. package/dist/internal.mjs +2 -0
  112. package/dist/materials.d.ts +22 -0
  113. package/dist/materials.d.ts.map +1 -1
  114. package/dist/pbr-pipeline.d.ts +12 -6
  115. package/dist/pbr-pipeline.d.ts.map +1 -1
  116. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
  117. package/dist/pipeline/standard-pipeline.d.ts +3 -0
  118. package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
  119. package/dist/pipeline/standard-post.d.ts +48 -0
  120. package/dist/pipeline/standard-post.d.ts.map +1 -0
  121. package/dist/pipeline/standard-profile.d.ts +3 -6
  122. package/dist/pipeline/standard-profile.d.ts.map +1 -1
  123. package/dist/pipeline-builder.d.ts +18 -0
  124. package/dist/pipeline-builder.d.ts.map +1 -1
  125. package/dist/pipeline-spec.d.ts.map +1 -1
  126. package/dist/plugin.d.ts.map +1 -1
  127. package/dist/points-lines/admission.d.ts +36 -0
  128. package/dist/points-lines/admission.d.ts.map +1 -0
  129. package/dist/points-lines/bounds.d.ts +8 -0
  130. package/dist/points-lines/bounds.d.ts.map +1 -0
  131. package/dist/points-lines/expansion-cache.d.ts +28 -0
  132. package/dist/points-lines/expansion-cache.d.ts.map +1 -0
  133. package/dist/points-lines/inspection.d.ts +53 -0
  134. package/dist/points-lines/inspection.d.ts.map +1 -0
  135. package/dist/points-lines/prepare.d.ts +67 -0
  136. package/dist/points-lines/prepare.d.ts.map +1 -0
  137. package/dist/points-lines/record.d.ts +60 -0
  138. package/dist/points-lines/record.d.ts.map +1 -0
  139. package/dist/points-lines/snapshot.d.ts +49 -0
  140. package/dist/points-lines/snapshot.d.ts.map +1 -0
  141. package/dist/record/frame-lighting.d.ts.map +1 -1
  142. package/dist/record/frame-snapshot.d.ts +100 -5
  143. package/dist/record/frame-snapshot.d.ts.map +1 -1
  144. package/dist/record/frame-targets.d.ts.map +1 -1
  145. package/dist/record/frame.d.ts +4 -2
  146. package/dist/record/frame.d.ts.map +1 -1
  147. package/dist/record/main-pass-geometry.d.ts +18 -0
  148. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  149. package/dist/record/main-pass-material.d.ts +8 -5
  150. package/dist/record/main-pass-material.d.ts.map +1 -1
  151. package/dist/record/main-pass-sprite-draws.d.ts +8 -1
  152. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  153. package/dist/record/main-pass.d.ts +2 -0
  154. package/dist/record/main-pass.d.ts.map +1 -1
  155. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  156. package/dist/record/render-context.d.ts +93 -18
  157. package/dist/record/render-context.d.ts.map +1 -1
  158. package/dist/record/shadow-pass.d.ts.map +1 -1
  159. package/dist/record/skybox-post-pass.d.ts +1 -11
  160. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  161. package/dist/record/typed-frame-graph.d.ts +26 -2
  162. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  163. package/dist/record/view-ubo.d.ts +10 -1
  164. package/dist/record/view-ubo.d.ts.map +1 -1
  165. package/dist/render-contract.d.ts +102 -10
  166. package/dist/render-contract.d.ts.map +1 -1
  167. package/dist/render-graph-primitives.d.ts.map +1 -1
  168. package/dist/render-pipeline.d.ts +50 -6
  169. package/dist/render-pipeline.d.ts.map +1 -1
  170. package/dist/render-system-extract.d.ts +32 -5
  171. package/dist/render-system-extract.d.ts.map +1 -1
  172. package/dist/render-system.d.ts +27 -5
  173. package/dist/render-system.d.ts.map +1 -1
  174. package/dist/scene/render-scene-types.d.ts +3 -0
  175. package/dist/scene/render-scene-types.d.ts.map +1 -1
  176. package/dist/scene/render-scene.d.ts +43 -2
  177. package/dist/scene/render-scene.d.ts.map +1 -1
  178. package/dist/temporal/coverage.d.ts +42 -0
  179. package/dist/temporal/coverage.d.ts.map +1 -0
  180. package/dist/temporal/frame-coordinator.d.ts +99 -0
  181. package/dist/temporal/frame-coordinator.d.ts.map +1 -0
  182. package/dist/temporal/gpu.d.ts +39 -0
  183. package/dist/temporal/gpu.d.ts.map +1 -0
  184. package/dist/temporal/history.d.ts +37 -0
  185. package/dist/temporal/history.d.ts.map +1 -0
  186. package/dist/temporal/index.d.ts +7 -0
  187. package/dist/temporal/index.d.ts.map +1 -0
  188. package/dist/temporal/index.mjs +8 -0
  189. package/dist/temporal/index.mjs.map +1 -0
  190. package/dist/temporal/inspection.d.ts +36 -0
  191. package/dist/temporal/inspection.d.ts.map +1 -0
  192. package/dist/temporal/scene-data-catalog.d.ts +48 -0
  193. package/dist/temporal/scene-data-catalog.d.ts.map +1 -0
  194. package/dist/temporal/scene-data.d.ts +43 -0
  195. package/dist/temporal/scene-data.d.ts.map +1 -0
  196. package/dist/temporal/standard-scene-data.d.ts +61 -0
  197. package/dist/temporal/standard-scene-data.d.ts.map +1 -0
  198. package/dist/temporal/taa-history-resources.d.ts +22 -0
  199. package/dist/temporal/taa-history-resources.d.ts.map +1 -0
  200. package/dist/temporal/taa-history-store.d.ts +27 -0
  201. package/dist/temporal/taa-history-store.d.ts.map +1 -0
  202. package/dist/temporal/taa-resolve.d.ts +15 -0
  203. package/dist/temporal/taa-resolve.d.ts.map +1 -0
  204. package/dist/temporal/temporal-view.d.ts +40 -0
  205. package/dist/temporal/temporal-view.d.ts.map +1 -0
  206. package/dist/temporal/transaction.d.ts +9 -0
  207. package/dist/temporal/transaction.d.ts.map +1 -0
  208. package/dist/temporal/view.d.ts +56 -0
  209. package/dist/temporal/view.d.ts.map +1 -0
  210. package/dist/transmission/backdrop.d.ts +147 -0
  211. package/dist/transmission/backdrop.d.ts.map +1 -0
  212. package/dist/transmission/inspection.d.ts +57 -0
  213. package/dist/transmission/inspection.d.ts.map +1 -0
  214. package/dist/transmission/oracle.d.ts +42 -0
  215. package/dist/transmission/oracle.d.ts.map +1 -0
  216. package/dist/transmission/projection.d.ts +37 -0
  217. package/dist/transmission/projection.d.ts.map +1 -0
  218. package/dist/typed-render-graph-primitives.d.ts +25 -2
  219. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  220. package/package.json +24 -19
  221. package/src/__tests__/ai-user-cold-start.integration.test.ts +59 -0
  222. package/src/__tests__/ai-user-public-surface.test-d.ts +45 -0
  223. package/src/__tests__/authoring-path.unit.test.ts +9 -0
  224. package/src/__tests__/bloom-exact-zero.unit.test.ts +202 -0
  225. package/src/__tests__/bloom-lifecycle.integration.test.ts +125 -0
  226. package/src/__tests__/construct-renderer-identity.unit.test.ts +4 -3
  227. package/src/__tests__/detached-inspection.integration.test.ts +177 -0
  228. package/src/__tests__/environment-fog-lanes.integration.test.ts +219 -0
  229. package/src/__tests__/environment-generation.integration.test.ts +141 -0
  230. package/src/__tests__/environment-selection.unit.test.ts +245 -0
  231. package/src/__tests__/factory-contract.integration.test.ts +1380 -9
  232. package/src/__tests__/frame-plan-contract.unit.test.ts +90 -0
  233. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +7 -0
  234. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +12 -2
  235. package/src/__tests__/gpu-driven-production.integration.test.ts +74 -22
  236. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +37 -0
  237. package/src/__tests__/gpu-scene.unit.test.ts +10 -0
  238. package/src/__tests__/injection-kind-owner.test-d.ts +2 -1
  239. package/src/__tests__/material-contract-inventory.unit.test.ts +62 -0
  240. package/src/__tests__/material-cooked-projection.unit.test.ts +18 -124
  241. package/src/__tests__/material-static-dynamic-route.unit.test.ts +28 -28
  242. package/src/__tests__/materials-transmission-validation.unit.test.ts +36 -0
  243. package/src/__tests__/morph-feature-plan.unit.test.ts +7 -0
  244. package/src/__tests__/motion-blur.pixel.integration.test.ts +121 -0
  245. package/src/__tests__/public-surface.test-d.ts +15 -1
  246. package/src/__tests__/render-error-code-owner.test-d.ts +15 -0
  247. package/src/__tests__/render-error-detail-ssot.test-d.ts +11 -2
  248. package/src/__tests__/render-error-exhaustive.test-d.ts +22 -0
  249. package/src/__tests__/render-feature-errors.unit.test.ts +33 -3
  250. package/src/__tests__/render-feature-gpu-work.integration.test.ts +44 -0
  251. package/src/__tests__/render-feature-plan.test-d.ts +22 -89
  252. package/src/__tests__/render-scene-projection.unit.test.ts +28 -0
  253. package/src/__tests__/render-temporal-environment-consumer.browser.test.ts +26 -0
  254. package/src/__tests__/render-temporal-environment-consumer.dawn.test.ts +21 -0
  255. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +433 -1
  256. package/src/__tests__/renderer-frame-transaction.integration.test.ts +405 -0
  257. package/src/__tests__/renderer-lifecycle.integration.test.ts +22 -0
  258. package/src/__tests__/scene-data-catalog.unit.test.ts +59 -0
  259. package/src/__tests__/scene-data-consumer.integration.test.ts +67 -0
  260. package/src/__tests__/scene-data-contract.test-d.ts +35 -0
  261. package/src/__tests__/scene-data-inspection.unit.test.ts +41 -0
  262. package/src/__tests__/scene-data-public-surface.test-d.ts +34 -0
  263. package/src/__tests__/shader-manifest-fixture.ts +111 -0
  264. package/src/__tests__/skinned-shadow-caster.test.ts +102 -0
  265. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +24 -3
  266. package/src/__tests__/standard-pipeline.dawn.test.ts +15 -0
  267. package/src/__tests__/standard-pipeline.integration.test.ts +543 -1
  268. package/src/__tests__/standard-profile-oracle.unit.test.ts +10 -2
  269. package/src/__tests__/standard-temporal-producer.integration.test.ts +35 -0
  270. package/src/__tests__/surface-configuration.unit.test.ts +211 -12
  271. package/src/__tests__/taa-transaction.integration.test.ts +30 -0
  272. package/src/__tests__/temporal-admission.integration.test.ts +40 -0
  273. package/src/__tests__/temporal-coverage.unit.test.ts +35 -0
  274. package/src/__tests__/temporal-demand.unit.test.ts +44 -0
  275. package/src/__tests__/temporal-frame-coordinator.unit.test.ts +64 -0
  276. package/src/__tests__/temporal-graph-topology.unit.test.ts +51 -0
  277. package/src/__tests__/temporal-history-lifecycle.unit.test.ts +170 -0
  278. package/src/__tests__/temporal-performance.integration.test.ts +615 -0
  279. package/src/__tests__/temporal-reset-matrix.unit.test.ts +97 -0
  280. package/src/__tests__/temporal-transaction.integration.test.ts +60 -0
  281. package/src/__tests__/temporal-view.unit.test.ts +152 -0
  282. package/src/__tests__/transmission-prewarm.unit.test.ts +93 -0
  283. package/src/__tests__/typed-pipeline-topology.unit.test.ts +230 -1
  284. package/src/__tests__/urp-pipeline-targets.unit.test.ts +25 -1
  285. package/src/__tests__/urp-pipeline.unit.test.ts +4 -3
  286. package/src/__tests__/visibility-extract.integration.test.ts +27 -1
  287. package/src/__tests__/visibility-producer-matrix.integration.test.ts +10 -0
  288. package/src/assembly/backend-contract.ts +47 -1
  289. package/src/assembly/factory.ts +1295 -507
  290. package/src/assembly/host-contract.ts +4 -0
  291. package/src/assembly/material/assembly.ts +2 -5
  292. package/src/assembly/renderer-frame-transaction.ts +75 -0
  293. package/src/assembly/renderer-inspection.ts +112 -0
  294. package/src/assembly/renderer-lifecycle.ts +6 -0
  295. package/src/authoring.ts +1 -0
  296. package/src/components/__tests__/motion-blur.unit.test.ts +14 -0
  297. package/src/components/__tests__/points-lines-admission.unit.test.ts +219 -0
  298. package/src/components/__tests__/points-lines-schema.unit.test.ts +56 -0
  299. package/src/components/__tests__/schema-contract.unit.test.ts +6 -1
  300. package/src/components/atmosphere.ts +10 -0
  301. package/src/components/camera.ts +2 -1
  302. package/src/components/fog.ts +9 -0
  303. package/src/components/index.ts +10 -0
  304. package/src/components/lines.ts +18 -0
  305. package/src/components/motion-blur.ts +8 -0
  306. package/src/components/points.ts +40 -0
  307. package/src/construct-renderer.ts +40 -3
  308. package/src/device/device-scope.ts +15 -1
  309. package/src/environment/frame.ts +185 -0
  310. package/src/environment/generation.ts +23 -0
  311. package/src/environment/graph.ts +9 -0
  312. package/src/environment/inspection.ts +87 -0
  313. package/src/environment/lifecycle.ts +250 -0
  314. package/src/environment/signature.ts +55 -0
  315. package/src/errors/render.ts +429 -1
  316. package/src/extract/camera.ts +78 -0
  317. package/src/extract/environment.ts +171 -0
  318. package/src/extract/visibility.ts +38 -19
  319. package/src/features/host.ts +36 -5
  320. package/src/features/motion-blur/__tests__/motion-blur-feature.unit.test.ts +67 -0
  321. package/src/features/motion-blur/__tests__/motion-blur-params.unit.test.ts +53 -0
  322. package/src/features/motion-blur/motion-blur-feature.ts +119 -0
  323. package/src/features/motion-blur/motion-blur-params.ts +89 -0
  324. package/src/features/plan.ts +32 -3
  325. package/src/features/prepared-gpu-work.ts +21 -6
  326. package/src/features/prepared-graphics.ts +2 -1
  327. package/src/features/render-graph-raster.ts +24 -4
  328. package/src/features/targets.ts +24 -2
  329. package/src/features/types.ts +13 -0
  330. package/src/fullscreen-post-process-pass.ts +34 -4
  331. package/src/gpu-driven/production-raster.ts +6 -1
  332. package/src/gpu-scene.ts +24 -0
  333. package/src/ibl/skylight-bind-group.ts +30 -38
  334. package/src/index.ts +83 -6
  335. package/src/inspection-types.ts +52 -0
  336. package/src/internal.ts +5 -0
  337. package/src/materials.ts +119 -24
  338. package/src/pbr-pipeline.ts +66 -20
  339. package/src/pipeline/standard-forward-lane.ts +158 -101
  340. package/src/pipeline/standard-pipeline.ts +156 -105
  341. package/src/pipeline/standard-post.ts +373 -0
  342. package/src/pipeline/standard-profile.ts +11 -11
  343. package/src/pipeline-builder.ts +102 -12
  344. package/src/pipeline-spec.ts +9 -0
  345. package/src/plugin.ts +6 -0
  346. package/src/points-lines/__tests__/bounds.unit.test.ts +21 -0
  347. package/src/points-lines/__tests__/cache-recovery.unit.test.ts +157 -0
  348. package/src/points-lines/__tests__/inspection-lanes.integration.test.ts +146 -0
  349. package/src/points-lines/__tests__/inspection.unit.test.ts +173 -0
  350. package/src/points-lines/__tests__/lane-structural.integration.test.ts +122 -0
  351. package/src/points-lines/__tests__/points-lines.bench.ts +400 -0
  352. package/src/points-lines/__tests__/raster-lane.integration.test.ts +44 -0
  353. package/src/points-lines/__tests__/snapshot.unit.test.ts +101 -0
  354. package/src/points-lines/__tests__/view-ubo.unit.test.ts +73 -0
  355. package/src/points-lines/admission.ts +238 -0
  356. package/src/points-lines/bounds.ts +23 -0
  357. package/src/points-lines/expansion-cache.ts +215 -0
  358. package/src/points-lines/inspection.ts +97 -0
  359. package/src/points-lines/prepare.ts +177 -0
  360. package/src/points-lines/record.ts +125 -0
  361. package/src/points-lines/snapshot.ts +130 -0
  362. package/src/record/__tests__/fullscreen-temporal-routing.unit.test.ts +25 -0
  363. package/src/record/__tests__/main-pass-geometry.unit.test.ts +47 -0
  364. package/src/record/__tests__/material-bg-cache.unit.test.ts +12 -1
  365. package/src/record/__tests__/material-pipeline-pending-cache.unit.test.ts +22 -0
  366. package/src/record/__tests__/sprite-material-abi.unit.test.ts +75 -0
  367. package/src/record/__tests__/standard-pbr-ubo-layout.unit.test.ts +67 -0
  368. package/src/record/__tests__/temporal-payload.unit.test.ts +164 -0
  369. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +127 -0
  370. package/src/record/frame-lighting.ts +14 -2
  371. package/src/record/frame-snapshot.ts +129 -5
  372. package/src/record/frame-targets.ts +15 -6
  373. package/src/record/frame.ts +119 -4
  374. package/src/record/main-pass-geometry.ts +178 -40
  375. package/src/record/main-pass-material.ts +114 -66
  376. package/src/record/main-pass-sprite-draws.ts +79 -102
  377. package/src/record/main-pass.ts +83 -7
  378. package/src/record/mesh-ssbo.ts +22 -3
  379. package/src/record/render-context.ts +209 -23
  380. package/src/record/shadow-pass.ts +129 -28
  381. package/src/record/skybox-post-pass.ts +99 -42
  382. package/src/record/typed-frame-graph.ts +582 -42
  383. package/src/record/view-ubo.ts +99 -4
  384. package/src/render-contract.ts +121 -7
  385. package/src/render-graph-primitives.ts +18 -1
  386. package/src/render-pipeline.ts +100 -27
  387. package/src/render-system-extract.ts +264 -77
  388. package/src/render-system.ts +786 -43
  389. package/src/scene/render-scene-types.ts +3 -0
  390. package/src/scene/render-scene.ts +307 -9
  391. package/src/temporal/__tests__/taa-history-resources.unit.test.ts +45 -0
  392. package/src/temporal/coverage.ts +76 -0
  393. package/src/temporal/frame-coordinator.ts +311 -0
  394. package/src/temporal/gpu.ts +287 -0
  395. package/src/temporal/history.ts +92 -0
  396. package/src/temporal/index.ts +6 -0
  397. package/src/temporal/inspection.ts +97 -0
  398. package/src/temporal/scene-data-catalog.ts +200 -0
  399. package/src/temporal/scene-data.ts +149 -0
  400. package/src/temporal/standard-scene-data.ts +182 -0
  401. package/src/temporal/taa-history-resources.ts +128 -0
  402. package/src/temporal/taa-history-store.ts +79 -0
  403. package/src/temporal/taa-resolve.ts +34 -0
  404. package/src/temporal/temporal-view.ts +169 -0
  405. package/src/temporal/transaction.ts +17 -0
  406. package/src/temporal/view.ts +161 -0
  407. package/src/transmission/__tests__/capability.unit.test.ts +83 -0
  408. package/src/transmission/__tests__/composition.integration.test.ts +161 -0
  409. package/src/transmission/__tests__/inspection.unit.test.ts +241 -0
  410. package/src/transmission/__tests__/lifecycle.integration.test.ts +96 -0
  411. package/src/transmission/__tests__/oracle.unit.test.ts +131 -0
  412. package/src/transmission/__tests__/projection.unit.test.ts +71 -0
  413. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +438 -0
  414. package/src/transmission/__tests__/transmission-backdrop-topology.unit.test.ts +109 -0
  415. package/src/transmission/__tests__/transmission-backdrop.dawn.test.ts +105 -0
  416. package/src/transmission/backdrop.ts +572 -0
  417. package/src/transmission/inspection.ts +190 -0
  418. package/src/transmission/oracle.ts +141 -0
  419. package/src/transmission/projection.ts +83 -0
  420. package/src/typed-render-graph-primitives.ts +162 -9
  421. package/dist/__tests__/authoring-path.unit.test.d.ts +0 -2
  422. package/dist/__tests__/authoring-path.unit.test.d.ts.map +0 -1
  423. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts +0 -2
  424. package/dist/__tests__/backend-selection-rhi-capture.test-d.d.ts.map +0 -1
  425. package/dist/__tests__/callback-inference.test-d.d.ts +0 -2
  426. package/dist/__tests__/callback-inference.test-d.d.ts.map +0 -1
  427. package/dist/__tests__/cluster-binner.test.d.ts +0 -2
  428. package/dist/__tests__/cluster-binner.test.d.ts.map +0 -1
  429. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts +0 -2
  430. package/dist/__tests__/cluster-grid-default-surface.unit.test.d.ts.map +0 -1
  431. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts +0 -2
  432. package/dist/__tests__/construct-renderer-identity.unit.test.d.ts.map +0 -1
  433. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +0 -2
  434. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +0 -1
  435. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +0 -2
  436. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +0 -1
  437. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts +0 -2
  438. package/dist/__tests__/direct-extract-consumer-contract.test-d.d.ts.map +0 -1
  439. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts +0 -2
  440. package/dist/__tests__/direct-light-snapshot.unit.test.d.ts.map +0 -1
  441. package/dist/__tests__/factory-contract.integration.test.d.ts +0 -2
  442. package/dist/__tests__/factory-contract.integration.test.d.ts.map +0 -1
  443. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts +0 -2
  444. package/dist/__tests__/fallback-row-stride-surface.unit.test.d.ts.map +0 -1
  445. package/dist/__tests__/frame-observation.contract.test.d.ts +0 -2
  446. package/dist/__tests__/frame-observation.contract.test.d.ts.map +0 -1
  447. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +0 -2
  448. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +0 -1
  449. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts +0 -2
  450. package/dist/__tests__/glyph-text-layout-recovery.unit.test.d.ts.map +0 -1
  451. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts +0 -6
  452. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +0 -1
  453. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts +0 -2
  454. package/dist/__tests__/gpu-driven-indirect-raster.browser.test.d.ts.map +0 -1
  455. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts +0 -2
  456. package/dist/__tests__/gpu-driven-indirect-raster.dawn.test.d.ts.map +0 -1
  457. package/dist/__tests__/gpu-driven-production.integration.test.d.ts +0 -2
  458. package/dist/__tests__/gpu-driven-production.integration.test.d.ts.map +0 -1
  459. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts +0 -2
  460. package/dist/__tests__/gpu-driven-scaling.unit.test.d.ts.map +0 -1
  461. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +0 -18
  462. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +0 -1
  463. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts +0 -2
  464. package/dist/__tests__/gpu-driven-view-graph.integration.test.d.ts.map +0 -1
  465. package/dist/__tests__/gpu-driven-view-reference.d.ts +0 -15
  466. package/dist/__tests__/gpu-driven-view-reference.d.ts.map +0 -1
  467. package/dist/__tests__/gpu-driven-view.browser.test.d.ts +0 -2
  468. package/dist/__tests__/gpu-driven-view.browser.test.d.ts.map +0 -1
  469. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts +0 -2
  470. package/dist/__tests__/gpu-driven-view.dawn.test.d.ts.map +0 -1
  471. package/dist/__tests__/gpu-driven-view.unit.test.d.ts +0 -2
  472. package/dist/__tests__/gpu-driven-view.unit.test.d.ts.map +0 -1
  473. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts +0 -2
  474. package/dist/__tests__/gpu-resource-store-stride.unit.test.d.ts.map +0 -1
  475. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts +0 -7
  476. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +0 -1
  477. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts +0 -2
  478. package/dist/__tests__/gpu-scene-render-graph.browser.test.d.ts.map +0 -1
  479. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts +0 -2
  480. package/dist/__tests__/gpu-scene-render-graph.dawn.test.d.ts.map +0 -1
  481. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts +0 -2
  482. package/dist/__tests__/gpu-scene-schema.unit.test.d.ts.map +0 -1
  483. package/dist/__tests__/gpu-scene.dawn.test.d.ts +0 -2
  484. package/dist/__tests__/gpu-scene.dawn.test.d.ts.map +0 -1
  485. package/dist/__tests__/gpu-scene.unit.test.d.ts +0 -2
  486. package/dist/__tests__/gpu-scene.unit.test.d.ts.map +0 -1
  487. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +0 -2
  488. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +0 -1
  489. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts +0 -2
  490. package/dist/__tests__/infinite-grid-no-vertex-probe.unit.test.d.ts.map +0 -1
  491. package/dist/__tests__/injection-kind-owner.test-d.d.ts +0 -2
  492. package/dist/__tests__/injection-kind-owner.test-d.d.ts.map +0 -1
  493. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts +0 -2
  494. package/dist/__tests__/ktx2-basis-gpu-consumer.dawn.test.d.ts.map +0 -1
  495. package/dist/__tests__/light-buffer-layout.unit.test.d.ts +0 -2
  496. package/dist/__tests__/light-buffer-layout.unit.test.d.ts.map +0 -1
  497. package/dist/__tests__/material-contract-inventory.unit.test.d.ts +0 -2
  498. package/dist/__tests__/material-contract-inventory.unit.test.d.ts.map +0 -1
  499. package/dist/__tests__/material-cooked-projection.unit.test.d.ts +0 -2
  500. package/dist/__tests__/material-cooked-projection.unit.test.d.ts.map +0 -1
  501. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts +0 -2
  502. package/dist/__tests__/material-snapshot-mutation.integration.test.d.ts.map +0 -1
  503. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts +0 -2
  504. package/dist/__tests__/material-static-dynamic-route.unit.test.d.ts.map +0 -1
  505. package/dist/__tests__/material-stride-surface.unit.test.d.ts +0 -2
  506. package/dist/__tests__/material-stride-surface.unit.test.d.ts.map +0 -1
  507. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts +0 -2
  508. package/dist/__tests__/mesh-buffer-usage-surface.unit.test.d.ts.map +0 -1
  509. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts +0 -2
  510. package/dist/__tests__/mesh-material-bindings.unit.test.d.ts.map +0 -1
  511. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts +0 -2
  512. package/dist/__tests__/mesh-stride-surface.unit.test.d.ts.map +0 -1
  513. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts +0 -2
  514. package/dist/__tests__/morph-culling-reentry.dawn.test.d.ts.map +0 -1
  515. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts +0 -2
  516. package/dist/__tests__/morph-feature-gpu-work.integration.test.d.ts.map +0 -1
  517. package/dist/__tests__/morph-feature-plan.unit.test.d.ts +0 -2
  518. package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +0 -1
  519. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts +0 -2
  520. package/dist/__tests__/morph-visual-evidence.integration.test.d.ts.map +0 -1
  521. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts +0 -2
  522. package/dist/__tests__/nineslice-handle-surface.unit.test.d.ts.map +0 -1
  523. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts +0 -2
  524. package/dist/__tests__/post-process-error-policy-owner.unit.test.d.ts.map +0 -1
  525. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts +0 -2
  526. package/dist/__tests__/prepared-buffer-kind-owner.test-d.d.ts.map +0 -1
  527. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts +0 -2
  528. package/dist/__tests__/prepared-graphics-capability.unit.test.d.ts.map +0 -1
  529. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts +0 -2
  530. package/dist/__tests__/prepared-graphics-generation.unit.test.d.ts.map +0 -1
  531. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts +0 -2
  532. package/dist/__tests__/prepared-graphics-lifecycle.unit.test.d.ts.map +0 -1
  533. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts +0 -2
  534. package/dist/__tests__/prepared-graphics-pipeline-warmup.unit.test.d.ts.map +0 -1
  535. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts +0 -2
  536. package/dist/__tests__/prepared-graphics-resolver.unit.test.d.ts.map +0 -1
  537. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts +0 -2
  538. package/dist/__tests__/prepared-graphics-snapshot.unit.test.d.ts.map +0 -1
  539. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts +0 -2
  540. package/dist/__tests__/prepared-graphics-store.unit.test.d.ts.map +0 -1
  541. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts +0 -2
  542. package/dist/__tests__/prepared-graphics-validation.unit.test.d.ts.map +0 -1
  543. package/dist/__tests__/profiler-default-off.test.d.ts +0 -2
  544. package/dist/__tests__/profiler-default-off.test.d.ts.map +0 -1
  545. package/dist/__tests__/profiler-phase-catalog.test.d.ts +0 -2
  546. package/dist/__tests__/profiler-phase-catalog.test.d.ts.map +0 -1
  547. package/dist/__tests__/profiler-phase-integration.test.d.ts +0 -2
  548. package/dist/__tests__/profiler-phase-integration.test.d.ts.map +0 -1
  549. package/dist/__tests__/profiler-phase-token.test.d.ts +0 -2
  550. package/dist/__tests__/profiler-phase-token.test.d.ts.map +0 -1
  551. package/dist/__tests__/public-surface.test-d.d.ts +0 -2
  552. package/dist/__tests__/public-surface.test-d.d.ts.map +0 -1
  553. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts +0 -2
  554. package/dist/__tests__/recover-error-policy-owner.unit.test.d.ts.map +0 -1
  555. package/dist/__tests__/render-error-code-owner.test-d.d.ts +0 -2
  556. package/dist/__tests__/render-error-code-owner.test-d.d.ts.map +0 -1
  557. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts +0 -2
  558. package/dist/__tests__/render-error-detail-ssot.test-d.d.ts.map +0 -1
  559. package/dist/__tests__/render-error-exhaustive.test-d.d.ts +0 -2
  560. package/dist/__tests__/render-error-exhaustive.test-d.d.ts.map +0 -1
  561. package/dist/__tests__/render-feature-assembly.test-d.d.ts +0 -2
  562. package/dist/__tests__/render-feature-assembly.test-d.d.ts.map +0 -1
  563. package/dist/__tests__/render-feature-context.test-d.d.ts +0 -2
  564. package/dist/__tests__/render-feature-context.test-d.d.ts.map +0 -1
  565. package/dist/__tests__/render-feature-contract.test-d.d.ts +0 -2
  566. package/dist/__tests__/render-feature-contract.test-d.d.ts.map +0 -1
  567. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts +0 -2
  568. package/dist/__tests__/render-feature-diagnostics.unit.test.d.ts.map +0 -1
  569. package/dist/__tests__/render-feature-docs.unit.test.d.ts +0 -2
  570. package/dist/__tests__/render-feature-docs.unit.test.d.ts.map +0 -1
  571. package/dist/__tests__/render-feature-errors.unit.test.d.ts +0 -2
  572. package/dist/__tests__/render-feature-errors.unit.test.d.ts.map +0 -1
  573. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts +0 -2
  574. package/dist/__tests__/render-feature-gpu-work.integration.test.d.ts.map +0 -1
  575. package/dist/__tests__/render-feature-plan.test-d.d.ts +0 -2
  576. package/dist/__tests__/render-feature-plan.test-d.d.ts.map +0 -1
  577. package/dist/__tests__/render-feature-plan.unit.test.d.ts +0 -2
  578. package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +0 -1
  579. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts +0 -2
  580. package/dist/__tests__/render-feature-prepared-diagnostics.unit.test.d.ts.map +0 -1
  581. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts +0 -2
  582. package/dist/__tests__/render-feature-prepared-errors.test-d.d.ts.map +0 -1
  583. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts +0 -2
  584. package/dist/__tests__/render-feature-prepared-graphics-docs.unit.test.d.ts.map +0 -1
  585. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts +0 -2
  586. package/dist/__tests__/render-feature-prepared-graphics-isolation.unit.test.d.ts.map +0 -1
  587. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts +0 -2
  588. package/dist/__tests__/render-feature-prepared-graphics-negative.test-d.d.ts.map +0 -1
  589. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts +0 -2
  590. package/dist/__tests__/render-feature-prepared-graphics.test-d.d.ts.map +0 -1
  591. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts +0 -2
  592. package/dist/__tests__/render-feature-prepared-graphics.unit.test.d.ts.map +0 -1
  593. package/dist/__tests__/render-feature-public-surface.test-d.d.ts +0 -2
  594. package/dist/__tests__/render-feature-public-surface.test-d.d.ts.map +0 -1
  595. package/dist/__tests__/render-feature-retry.unit.test.d.ts +0 -2
  596. package/dist/__tests__/render-feature-retry.unit.test.d.ts.map +0 -1
  597. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts +0 -2
  598. package/dist/__tests__/render-feature-scheduling.unit.test.d.ts.map +0 -1
  599. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts +0 -2
  600. package/dist/__tests__/render-feature-stage-failed-policy-owner.unit.test.d.ts.map +0 -1
  601. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts +0 -2
  602. package/dist/__tests__/render-feature-stage-fault-recovery.unit.test.d.ts.map +0 -1
  603. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts +0 -2
  604. package/dist/__tests__/render-feature-visibility-context.test-d.d.ts.map +0 -1
  605. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts +0 -2
  606. package/dist/__tests__/render-feature-visibility-context.unit.test.d.ts.map +0 -1
  607. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts +0 -2
  608. package/dist/__tests__/render-feature-zero-work.unit.test.d.ts.map +0 -1
  609. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts +0 -7
  610. package/dist/__tests__/render-graph-compute-raster-gpu.d.ts.map +0 -1
  611. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts +0 -2
  612. package/dist/__tests__/render-graph-compute-raster.browser.test.d.ts.map +0 -1
  613. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts +0 -2
  614. package/dist/__tests__/render-graph-compute-raster.dawn.test.d.ts.map +0 -1
  615. package/dist/__tests__/render-graph-hzb-gpu.d.ts +0 -7
  616. package/dist/__tests__/render-graph-hzb-gpu.d.ts.map +0 -1
  617. package/dist/__tests__/render-graph-hzb.browser.test.d.ts +0 -2
  618. package/dist/__tests__/render-graph-hzb.browser.test.d.ts.map +0 -1
  619. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts +0 -2
  620. package/dist/__tests__/render-graph-hzb.dawn.test.d.ts.map +0 -1
  621. package/dist/__tests__/render-graph-primitives.unit.test.d.ts +0 -2
  622. package/dist/__tests__/render-graph-primitives.unit.test.d.ts.map +0 -1
  623. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts +0 -12
  624. package/dist/__tests__/render-graph-storage-indirect-gpu.d.ts.map +0 -1
  625. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts +0 -2
  626. package/dist/__tests__/render-graph-storage-indirect.browser.test.d.ts.map +0 -1
  627. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts +0 -2
  628. package/dist/__tests__/render-graph-storage-indirect.dawn.test.d.ts.map +0 -1
  629. package/dist/__tests__/render-scene-projection.unit.test.d.ts +0 -2
  630. package/dist/__tests__/render-scene-projection.unit.test.d.ts.map +0 -1
  631. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts +0 -2
  632. package/dist/__tests__/renderer-factory-material-contract.unit.test.d.ts.map +0 -1
  633. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts +0 -2
  634. package/dist/__tests__/renderer-lifecycle.integration.test.d.ts.map +0 -1
  635. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts +0 -2
  636. package/dist/__tests__/rhi-backend-package-boundary.unit.test.d.ts.map +0 -1
  637. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts +0 -2
  638. package/dist/__tests__/scriptable-pack-consumer.test-d.d.ts.map +0 -1
  639. package/dist/__tests__/shader-stage-surface.unit.test.d.ts +0 -2
  640. package/dist/__tests__/shader-stage-surface.unit.test.d.ts.map +0 -1
  641. package/dist/__tests__/ssao-config.unit.test.d.ts +0 -2
  642. package/dist/__tests__/ssao-config.unit.test.d.ts.map +0 -1
  643. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts +0 -2
  644. package/dist/__tests__/ssao-kernel-surface.unit.test.d.ts.map +0 -1
  645. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +0 -2
  646. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +0 -1
  647. package/dist/__tests__/standard-descriptors.test-d.d.ts +0 -2
  648. package/dist/__tests__/standard-descriptors.test-d.d.ts.map +0 -1
  649. package/dist/__tests__/standard-pipeline.dawn.test.d.ts +0 -2
  650. package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +0 -1
  651. package/dist/__tests__/standard-pipeline.integration.test.d.ts +0 -2
  652. package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +0 -1
  653. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +0 -2
  654. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +0 -1
  655. package/dist/__tests__/surface-configuration.unit.test.d.ts +0 -2
  656. package/dist/__tests__/surface-configuration.unit.test.d.ts.map +0 -1
  657. package/dist/__tests__/texture-usage-surface.unit.test.d.ts +0 -2
  658. package/dist/__tests__/texture-usage-surface.unit.test.d.ts.map +0 -1
  659. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts +0 -2
  660. package/dist/__tests__/typed-pipeline-topology.unit.test.d.ts.map +0 -1
  661. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts +0 -2
  662. package/dist/__tests__/urp-pipeline-targets.unit.test.d.ts.map +0 -1
  663. package/dist/__tests__/urp-pipeline.unit.test.d.ts +0 -2
  664. package/dist/__tests__/urp-pipeline.unit.test.d.ts.map +0 -1
  665. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts +0 -2
  666. package/dist/__tests__/vertex-color-pipeline.unit.test.d.ts.map +0 -1
  667. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts +0 -2
  668. package/dist/__tests__/vertex-layout-consumer.unit.test.d.ts.map +0 -1
  669. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts +0 -2
  670. package/dist/__tests__/visibility-diagnostics.integration.test.d.ts.map +0 -1
  671. package/dist/__tests__/visibility-extract.integration.test.d.ts +0 -2
  672. package/dist/__tests__/visibility-extract.integration.test.d.ts.map +0 -1
  673. package/dist/__tests__/visibility-extract.perf.test.d.ts +0 -2
  674. package/dist/__tests__/visibility-extract.perf.test.d.ts.map +0 -1
  675. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts +0 -2
  676. package/dist/__tests__/visibility-feature-dedup.integration.test.d.ts.map +0 -1
  677. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts +0 -2
  678. package/dist/__tests__/visibility-hidden-report.unit.test.d.ts.map +0 -1
  679. package/dist/__tests__/visibility-instances.integration.test.d.ts +0 -2
  680. package/dist/__tests__/visibility-instances.integration.test.d.ts.map +0 -1
  681. package/dist/__tests__/visibility-multi-world.integration.test.d.ts +0 -2
  682. package/dist/__tests__/visibility-multi-world.integration.test.d.ts.map +0 -1
  683. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts +0 -2
  684. package/dist/__tests__/visibility-producer-matrix.integration.test.d.ts.map +0 -1
  685. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts +0 -2
  686. package/dist/__tests__/visibility-producer-matrix.unit.test.d.ts.map +0 -1
  687. package/dist/__tests__/visibility-public-surface.test-d.d.ts +0 -2
  688. package/dist/__tests__/visibility-public-surface.test-d.d.ts.map +0 -1
  689. package/dist/__tests__/visibility-resolver.unit.test.d.ts +0 -2
  690. package/dist/__tests__/visibility-resolver.unit.test.d.ts.map +0 -1
  691. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +0 -2
  692. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +0 -1
  693. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts +0 -2
  694. package/dist/__tests__/visibility-snapshot-contract.unit.test.d.ts.map +0 -1
  695. package/dist/__tests__/vocabulary.unit.test.d.ts +0 -2
  696. package/dist/__tests__/vocabulary.unit.test.d.ts.map +0 -1
  697. package/dist/chunk-CQXZC5XI.mjs.map +0 -1
  698. package/dist/chunk-QC4VW3XJ.mjs.map +0 -1
  699. package/dist/chunk-SCRSAK5B.mjs.map +0 -1
  700. package/dist/components/__tests__/schema-contract.unit.test.d.ts +0 -2
  701. package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +0 -1
  702. package/dist/components/__tests__/schema-parity.unit.test.d.ts +0 -2
  703. package/dist/components/__tests__/schema-parity.unit.test.d.ts.map +0 -1
  704. package/dist/components/__tests__/visibility-schema.unit.test.d.ts +0 -2
  705. package/dist/components/__tests__/visibility-schema.unit.test.d.ts.map +0 -1
  706. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts +0 -2
  707. package/dist/record/__tests__/material-bg-cache.unit.test.d.ts.map +0 -1
  708. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts +0 -2
  709. package/dist/record/__tests__/material-slot-plan.unit.test.d.ts.map +0 -1
  710. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +0 -2
  711. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +0 -1
  712. package/dist/record/__tests__/video-texture-view.unit.test.d.ts +0 -2
  713. package/dist/record/__tests__/video-texture-view.unit.test.d.ts.map +0 -1
@@ -102,7 +102,7 @@ import {
102
102
  resolveAssetHandle,
103
103
  walkMaterialPassesOverSharedRefs,
104
104
  } from '@forgeax/engine-assets-runtime';
105
- import type { Component, ComponentSchema, EntityHandle, World } from '@forgeax/engine-ecs';
105
+ import type { Component, ComponentSchema, EntityHandle, Query, World } from '@forgeax/engine-ecs';
106
106
  import {
107
107
  InstanceTransformsStrideMismatchError,
108
108
  readRenderArrayView,
@@ -152,33 +152,42 @@ import {
152
152
  toShared,
153
153
  } from '@forgeax/engine-types';
154
154
  import {
155
- antialiasFromF32,
156
- bloomEnabledFromF32,
157
- Camera,
158
- cameraProjectionFromF32,
155
+ Atmosphere,
159
156
  DirectionalLight,
157
+ Fog,
160
158
  Instances,
161
159
  Layer,
160
+ Lines,
162
161
  MeshFilter,
163
162
  MeshRenderer,
164
163
  PointLight,
165
164
  PointLightShadow,
165
+ Points,
166
166
  PostProcessParams,
167
+ pointShapeFromU32,
167
168
  SkyboxBackground,
168
169
  Skylight,
170
+ SortKey,
169
171
  SpotLight,
170
172
  SpriteInstances,
171
173
  SpriteRegionOverride,
172
- tonemapFromF32,
173
174
  tonemapToU32,
174
175
  } from './components';
175
176
  import { GlyphText } from './components/glyph-text';
176
177
  import { computeInvRangeSquared, degToCos } from './components/light-helpers';
178
+ import { selectEnvironment } from './environment/frame';
177
179
  import {
178
180
  MaterialSkinAttrMissingError,
179
181
  ShadowInvalidConfigError,
180
182
  SkinMaterialMismatchError,
181
183
  } from './errors/render';
184
+ import { extractCameraSnapshots } from './extract/camera';
185
+ import type {
186
+ EnvironmentCandidate,
187
+ EnvironmentFrame,
188
+ FogCandidate,
189
+ FogFrame,
190
+ } from './extract/environment';
182
191
  import { resolveVisibility, type VisibilitySnapshot } from './extract/visibility';
183
192
  import type {
184
193
  RenderFeatureHiddenEntityReport,
@@ -191,9 +200,13 @@ import {
191
200
  resolveMeshMaterialBindings,
192
201
  } from './mesh-material-bindings';
193
202
  import { isStandardPbrMaterialShader } from './pbr-pipeline';
194
- import { type CameraSnapshot, STANDARD_TONEMAP_FEATURE_ID } from './render-contract';
195
- import { getActiveCamera, selectActiveCameraIndex } from './systems/active-camera';
203
+ import { expandPointsLinesBounds } from './points-lines/bounds';
204
+ import type { PointsLinesRetainedSnapshot, PointsLinesStyle } from './points-lines/snapshot';
205
+ import { type CameraSnapshot, STANDARD_OUTPUT_TRANSFORM_FEATURE_ID } from './render-contract';
196
206
  import { selectPasses } from './systems/pass-selector';
207
+
208
+ export { extractCameraSnapshots } from './extract/camera';
209
+
197
210
  import type { SkinPaletteAllocator } from './systems/skin-palette-allocator';
198
211
  import type { SkinPaletteSlice } from './systems/skin-palette-types';
199
212
 
@@ -598,6 +611,30 @@ export interface RenderableSnapshot {
598
611
  * deltas and the record stage only receives this frozen POD snapshot.
599
612
  */
600
613
  readonly morph?: MorphSnapshot;
614
+ /** Renderer-owned previous-frame facts attached during temporal projection. */
615
+ readonly temporal?: RenderableTemporalSnapshot;
616
+ /** Detached M2 authoring facts for the optional Points/Lines projection. */
617
+ readonly pointsLines?: PointsLinesRetainedSnapshot;
618
+ }
619
+
620
+ export type RenderablePreviousSource = 'last-submitted' | 'current-seed';
621
+ export type RenderableReactiveReason =
622
+ | 'new-slot'
623
+ | 'generation-reuse'
624
+ | 'reentered'
625
+ | 'geometry-revision'
626
+ | 'material-revision'
627
+ | 'skinning-deformation'
628
+ | 'morph-deformation';
629
+ export interface RenderableTemporalSnapshot {
630
+ readonly previousEpoch: number | undefined;
631
+ readonly previousSource: RenderablePreviousSource;
632
+ readonly reactive: boolean;
633
+ readonly reactiveReasons: readonly RenderableReactiveReason[];
634
+ readonly previousTransform: TransformSnapshot;
635
+ readonly previousInstances: InstancesSnapshot | undefined;
636
+ readonly previousSkin: SkinPaletteSlice | undefined;
637
+ readonly previousMorphWeights: Float32Array | undefined;
601
638
  }
602
639
 
603
640
  export interface MorphSnapshot {
@@ -750,9 +787,9 @@ export interface MaterialSnapshot {
750
787
  *
751
788
  * Populated by iterating `textureFieldNames`; absent keys mean the
752
789
  * paramValue was missing / mis-typed (record falls back to default white).
753
- * `emissiveTexture` / `occlusionTexture` are NOT here they live in the
754
- * engine-injection lightmap region (their named fields below feed
755
- * `appendInjection('lightmap')`, not the user-region).
790
+ * `emissiveTexture` / `occlusionTexture` are included here as ordinary
791
+ * Standard user-region fields; the production layout does not duplicate
792
+ * them in a lightmap injection region.
756
793
  */
757
794
  readonly textureHandles?: ReadonlyMap<string, Handle<'TextureAsset', 'shared'>> | undefined;
758
795
  /**
@@ -870,7 +907,7 @@ function gpuDrivenMaterialResourceClass(material: MaterialSnapshot): string {
870
907
  //
871
908
  // Plan-strategy D-3: single dispatch list sorted by queue value,
872
909
  // replacing the old three-bucket opaque/transparent/overlay dispatch.
873
- // Each entry carries the per-pass render-state, defines, and entry-point
910
+ // Each entry carries the per-pass render-state and entry-point
874
911
  // data from the resolved MaterialPass so the record stage
875
912
  // reads them without re-resolving the material.
876
913
 
@@ -948,7 +985,9 @@ function appendMaterialDispatchEntries(
948
985
  layer,
949
986
  tags: passState.tags ?? {},
950
987
  renderState: pipelineRenderState(passState),
951
- defines: pass.program.moduleSlots,
988
+ // Material module identity is already closed in the cooked program.
989
+ // It must never become a draw-time define map.
990
+ defines: undefined,
952
991
  vertexEntry: pass.program.vertexEntry,
953
992
  fragmentEntry: pass.program.fragmentEntry,
954
993
  materialShaderId: runtimeMaterialShaderId(pass.program.module, pass.name),
@@ -963,6 +1002,10 @@ function appendMaterialDispatchEntries(
963
1002
  export interface ExtractedFrame {
964
1003
  readonly cameras: CameraSnapshot[];
965
1004
  readonly lights: ExtractedLights;
1005
+ /** Resource-owner environment facts selected once at the extract boundary. */
1006
+ readonly environment: EnvironmentFrame | undefined;
1007
+ /** False when the resource-owner world failed environment/fog selection. */
1008
+ readonly environmentReady: boolean;
966
1009
  readonly renderables: RenderableSnapshot[];
967
1010
  /**
968
1011
  * Single dispatch list sorted by queue value (ascending, stable sort).
@@ -974,6 +1017,8 @@ export interface ExtractedFrame {
974
1017
  readonly skylightCount: number;
975
1018
  readonly skybox: SkyboxSnapshot | undefined;
976
1019
  readonly skyboxCount: number;
1020
+ /** Resource-owner Fog facts selected once at the frame boundary. */
1021
+ readonly fog: FogFrame | undefined;
977
1022
  /**
978
1023
  * feat-20260528-frustum-culling M3 / w11: frustum culling statistics
979
1024
  * collected during the extract phase. `total` is the count of entities
@@ -1052,6 +1097,10 @@ const BUILTIN_USER_REGION_TEXTURE_FIELDS: readonly string[] = [
1052
1097
  'metallicRoughnessTexture',
1053
1098
  'normalTexture',
1054
1099
  'specularTintTexture',
1100
+ 'emissiveTexture',
1101
+ 'occlusionTexture',
1102
+ 'transmissionTexture',
1103
+ 'thicknessTexture',
1055
1104
  ];
1056
1105
  const BUILTIN_USER_REGION_TEXTURE_FIELD_SET = new Set(BUILTIN_USER_REGION_TEXTURE_FIELDS);
1057
1106
  const BUILTIN_BASE_COLOR_TEXTURE_FIELD_SET = new Set(['baseColorTexture']);
@@ -1340,11 +1389,11 @@ function collectMaterialTextureSamplers(
1340
1389
  * `AssetRegistry.materialShaderTextureFieldNames`). Each declared texture
1341
1390
  * field whose paramValue resolves to a handle lands in the returned map keyed
1342
1391
  * by field name; this is the single path through which an arbitrary number of user-region
1343
- * textures (4 standard or 5+ custom, e.g. parallax `heightTexture`) flow.
1392
+ * textures (8 Standard or 9+ custom, e.g. parallax `heightTexture`) flow.
1344
1393
  *
1345
- * When the shader is not registered the built-in 4-field set is used so
1346
- * standard materials still resolve. `emissiveTexture` / `occlusionTexture`
1347
- * are engine-injection (lightmap) textures and are NOT part of this set.
1394
+ * When the shader is not registered the built-in Standard field set is used
1395
+ * so standard materials still resolve. Emissive and occlusion are ordinary
1396
+ * schema-driven user-region textures in that set.
1348
1397
  *
1349
1398
  * feat-20260623-world-space-video-asset M4 / w14 (D-5): a field whose paramValue
1350
1399
  * catalogues to a VideoAsset is routed into `videoOut` (a VideoAsset-branded
@@ -1405,9 +1454,8 @@ function materialParametersToParamSchema(
1405
1454
  ? ENGINE_INJECTED_TEXTURE_FIELDS
1406
1455
  : undefined;
1407
1456
  return parameters.flatMap((parameter): ParamSchemaEntry[] => {
1408
- // Static values select a cooked specialization and boolean material
1409
- // values have no runtime UBO representation in ParamSchemaEntry.
1410
- if (parameter.static || parameter.type === 'bool') return [];
1457
+ // Boolean material values are runtime-only and have no UBO representation.
1458
+ if (parameter.type === 'bool') return [];
1411
1459
  if (parameter.type === 'texture') {
1412
1460
  if (engineInjectedTextureFields?.has(parameter.name) === true) return [];
1413
1461
  return [{ name: parameter.name, type: 'texture2d' }];
@@ -1656,8 +1704,7 @@ export function resolveMaterialSnapshot(
1656
1704
  // feat-20260621-learn-render-5-5-parallax M2 / w7 (D-3): iterate the
1657
1705
  // shader's derive(paramSchema).textureFieldNames SSOT instead of a hardcoded
1658
1706
  // user-region field list, so an Nth texture (e.g. parallax heightTexture)
1659
- // resolves through the same path. emissive/occlusion are engine-injection
1660
- // (lightmap) textures, NOT in textureFieldNames, so they keep named reads.
1707
+ // resolves through the same path, including emissive/occlusion fields.
1661
1708
  const videoTextureFields = new Map<string, Handle<'VideoAsset', 'shared'>>();
1662
1709
  const textureHandles = collectUserRegionTextureHandles(
1663
1710
  pv,
@@ -2183,59 +2230,15 @@ export interface PreparedExtractContext {
2183
2230
  readonly assets: AssetRegistry | null | undefined;
2184
2231
  readonly pipelineState: ExtractPipelineSurface | null | undefined;
2185
2232
  readonly materialSnapshotCache: MaterialSnapshotCache | undefined;
2233
+ /** `undefined` keeps direct extractFrame's local Fog semantics; `null` means
2234
+ * the frame owner already selected that no Fog is present for this world. */
2235
+ readonly resourceOwnerFog: FogFrame | null | undefined;
2186
2236
  readonly cull: 'self' | 'none' | 'external';
2187
2237
  readonly cullCameras: readonly CameraSnapshot[] | undefined;
2188
2238
  readonly hierarchy: SceneHierarchySnapshot;
2189
2239
  readonly visibility: VisibilitySnapshot;
2190
2240
  }
2191
2241
 
2192
- export function extractCameraSnapshots(world: World): CameraSnapshot[] {
2193
- const worldInternal = createWorldInternalView(world);
2194
- const cameras: CameraSnapshot[] = [];
2195
- const cameraEntities: number[] = [];
2196
- const cameraQuery = world.query({ read: [Camera], with: [Transform] }).unwrap();
2197
- for (const row of cameraQuery) {
2198
- const cam = row.get(Camera);
2199
- const entity = row.entity;
2200
- const view = worldInternal._getArrayView(entity, Transform, 'world');
2201
- if (view === undefined) continue;
2202
- const worldMat = new Float32Array(view);
2203
- cameras.push({
2204
- entityKey: entity as number,
2205
- position: mat4.getTranslation(vec3.create(), worldMat),
2206
- world: worldMat,
2207
- fov: cam.fov,
2208
- aspect: cam.aspect,
2209
- near: cam.near,
2210
- far: cam.far,
2211
- projection: cameraProjectionFromF32(cam.projection),
2212
- orthoLeft: cam.left,
2213
- orthoRight: cam.right,
2214
- orthoBottom: cam.bottom,
2215
- orthoTop: cam.top,
2216
- tonemap: tonemapFromF32(cam.tonemap),
2217
- exposure: cam.exposure,
2218
- whitePoint: cam.whitePoint,
2219
- antialias: antialiasFromF32(cam.antialias),
2220
- bloom: bloomEnabledFromF32(cam.bloom),
2221
- bloomThreshold: cam.bloomThreshold,
2222
- bloomIntensity: cam.bloomIntensity,
2223
- bloomBlurRadius: cam.bloomBlurRadius,
2224
- clearColor: [
2225
- cam.clearColor[0] ?? 0,
2226
- cam.clearColor[1] ?? 0,
2227
- cam.clearColor[2] ?? 0,
2228
- cam.clearColor[3] ?? 1,
2229
- ],
2230
- });
2231
- cameraEntities.push(entity as number);
2232
- }
2233
- const activeCameraIndex = selectActiveCameraIndex(cameraEntities, getActiveCamera(world)?.entity);
2234
- if (activeCameraIndex < 0) return cameras;
2235
- const selected = cameras[activeCameraIndex];
2236
- return selected === undefined ? cameras : [selected];
2237
- }
2238
-
2239
2242
  function tonemapParams(camera: CameraSnapshot): Uint8Array {
2240
2243
  const bytes = new ArrayBuffer(16);
2241
2244
  const floats = new Float32Array(bytes);
@@ -2252,6 +2255,7 @@ export function prepareExtractContext(
2252
2255
  readonly assets?: AssetRegistry | null;
2253
2256
  readonly pipelineState?: ExtractPipelineSurface | null;
2254
2257
  readonly materialSnapshotCache?: MaterialSnapshotCache;
2258
+ readonly resourceOwnerFog?: FogFrame | null;
2255
2259
  readonly cull?: 'self' | 'none' | 'external';
2256
2260
  readonly cullCameras?: readonly CameraSnapshot[];
2257
2261
  } = {},
@@ -2261,6 +2265,7 @@ export function prepareExtractContext(
2261
2265
  assets: options.assets,
2262
2266
  pipelineState: options.pipelineState,
2263
2267
  materialSnapshotCache: options.materialSnapshotCache,
2268
+ resourceOwnerFog: options.resourceOwnerFog,
2264
2269
  cull: options.cull ?? 'self',
2265
2270
  cullCameras: options.cullCameras,
2266
2271
  hierarchy,
@@ -2268,6 +2273,41 @@ export function prepareExtractContext(
2268
2273
  };
2269
2274
  }
2270
2275
 
2276
+ const fogQueries = new WeakMap<World, Query<readonly [typeof Fog]>>();
2277
+
2278
+ function selectFogFrame(world: World): FogFrame | undefined {
2279
+ // Query compilation is owned once per World; Query refreshes its matched
2280
+ // tables when the ECS structure changes, while iteration reads current Fog
2281
+ // values. This keeps the frame boundary free of repeated descriptor work.
2282
+ const fogCandidates: FogCandidate[] = [];
2283
+ let fogQuery = fogQueries.get(world);
2284
+ if (fogQuery === undefined) {
2285
+ fogQuery = world.query({ read: [Fog] }).unwrap();
2286
+ fogQueries.set(world, fogQuery);
2287
+ }
2288
+ for (const row of fogQuery) {
2289
+ const value = row.get(Fog);
2290
+ fogCandidates.push({
2291
+ entityKey: row.entity,
2292
+ color: [value.color[0] ?? 0, value.color[1] ?? 0, value.color[2] ?? 0],
2293
+ density: value.density,
2294
+ heightFalloff: value.heightFalloff,
2295
+ maxOpacity: value.maxOpacity,
2296
+ });
2297
+ }
2298
+ const fogSelection = selectEnvironment({
2299
+ environments: [],
2300
+ fogs: fogCandidates,
2301
+ suns: [],
2302
+ lane: 'direct',
2303
+ });
2304
+ if (fogSelection.ok) return fogSelection.value.fog;
2305
+ routeWorldError(world, fogSelection.error, {
2306
+ systemName: 'RenderSystem.extract (fog-selection)',
2307
+ });
2308
+ throw fogSelection.error;
2309
+ }
2310
+
2271
2311
  export function extractFrames(
2272
2312
  worlds: readonly World[],
2273
2313
  owner: number | ExtractFramesOwner,
@@ -2295,6 +2335,12 @@ export function extractFrames(
2295
2335
  }
2296
2336
 
2297
2337
  const failedWorlds = new Set<World>();
2338
+ // Resource-owner selection is a frame-level concern. Select Fog once before
2339
+ // per-world extraction so non-owner worlds do not scan their ECS tables for
2340
+ // a value that the merge layer will discard.
2341
+ const resourceOwnerWorld = worlds[resourceOwner];
2342
+ const resourceOwnerFog =
2343
+ resourceOwnerWorld === undefined ? null : (selectFogFrame(resourceOwnerWorld) ?? null);
2298
2344
  // ── D-2: per-world extract with error isolation ────────────────────────
2299
2345
  //
2300
2346
  // Each world runs extractFrame over the final state published by
@@ -2325,6 +2371,7 @@ export function extractFrames(
2325
2371
  const prepared = prepareExtractContext(world, {
2326
2372
  ...(assets !== undefined ? { assets } : {}),
2327
2373
  ...(pipelineState !== undefined ? { pipelineState } : {}),
2374
+ resourceOwnerFog: wi === resourceOwner ? resourceOwnerFog : null,
2328
2375
  ...(materialSnapshotCachesByWorld === undefined
2329
2376
  ? {}
2330
2377
  : {
@@ -2387,7 +2434,11 @@ export function extractFrames(
2387
2434
  }
2388
2435
  hiddenEntityReports.push(...f.hiddenEntityReports);
2389
2436
  for (const r of f.renderables) {
2390
- renderables.push({ ...r, worldId: wId });
2437
+ renderables.push({
2438
+ ...r,
2439
+ worldId: wId,
2440
+ ...(r.pointsLines === undefined ? {} : { pointsLines: { ...r.pointsLines, worldId: wId } }),
2441
+ });
2391
2442
  }
2392
2443
 
2393
2444
  // D-3: dispatch — per-world renderableIndex rebased by base offset.
@@ -2518,6 +2569,8 @@ export function extractFrames(
2518
2569
  const skylightCount = resourceOwnerFrame?.skylightCount ?? 0;
2519
2570
  const skybox = resourceOwnerFrame?.skybox;
2520
2571
  const skyboxCount = resourceOwnerFrame?.skyboxCount ?? 0;
2572
+ const fog = resourceOwnerFrame?.fog;
2573
+ const environment = resourceOwnerFrame?.environment;
2521
2574
  // User-authored PostProcessParams entities are singleton scene resources, so
2522
2575
  // they come from the resourceOwner world (holistic snapshot selection).
2523
2576
  const postProcessParams = new Map(resourceOwnerFrame?.postProcessParams);
@@ -2536,16 +2589,16 @@ export function extractFrames(
2536
2589
  // cameraOwner === resourceOwner this is a no-op (identical entry). The 'na'
2537
2590
  // Standard tonemap identity mirrors the engine provider key set at the
2538
2591
  // bottom of extractFrame (SSOT: same identity, same 16B layout).
2539
- const TONEMAP_PARAM_KEY = STANDARD_TONEMAP_FEATURE_ID;
2540
- const cameraTonemapParam = cameraOwnerFrame?.postProcessParams.get(TONEMAP_PARAM_KEY);
2592
+ const OUTPUT_TRANSFORM_PARAM_KEY = STANDARD_OUTPUT_TRANSFORM_FEATURE_ID;
2593
+ const cameraTonemapParam = cameraOwnerFrame?.postProcessParams.get(OUTPUT_TRANSFORM_PARAM_KEY);
2541
2594
  if (cameraTonemapParam !== undefined) {
2542
- postProcessParams.set(TONEMAP_PARAM_KEY, cameraTonemapParam);
2595
+ postProcessParams.set(OUTPUT_TRANSFORM_PARAM_KEY, cameraTonemapParam);
2543
2596
  } else {
2544
2597
  // The camera-owner world produced no tonemap param (no Camera surfaced
2545
2598
  // there this frame); do not leave a stale resource-owner entry that would
2546
2599
  // apply a foreign camera's exposure. Removing it lets the tonemap pass fall
2547
2600
  // back to its param-less zero path only when genuinely no camera exists.
2548
- postProcessParams.delete(TONEMAP_PARAM_KEY);
2601
+ postProcessParams.delete(OUTPUT_TRANSFORM_PARAM_KEY);
2549
2602
  }
2550
2603
 
2551
2604
  // D-3: frustumStats — culled/total summed across worlds.
@@ -2566,6 +2619,9 @@ export function extractFrames(
2566
2619
  skylightCount,
2567
2620
  skybox,
2568
2621
  skyboxCount,
2622
+ fog,
2623
+ environment,
2624
+ environmentReady: resourceOwnerFrame !== undefined && environment !== undefined,
2569
2625
  frustumStats,
2570
2626
  visibilityStats,
2571
2627
  postProcessParams,
@@ -2653,7 +2709,12 @@ export function extractFrame(world: World, context: PreparedExtractContext): Ext
2653
2709
  pipelineState,
2654
2710
  materialSnapshotCache: persistentMaterialSnapshotCache,
2655
2711
  cull: cullMode,
2712
+ resourceOwnerFog,
2656
2713
  } = context;
2714
+ // Environment reads are owned by the retained resource projection and are
2715
+ // established at the frame boundary; record never revisits World state.
2716
+ const fog =
2717
+ resourceOwnerFog === undefined ? selectFogFrame(world) : (resourceOwnerFog ?? undefined);
2657
2718
  const visibility = context.visibility.hasAnyHiddenIntent ? context.visibility : undefined;
2658
2719
  const skinPaletteAllocator = pipelineState?.skinPaletteAllocator ?? null;
2659
2720
 
@@ -3131,6 +3192,79 @@ export function extractFrame(world: World, context: PreparedExtractContext): Ext
3131
3192
  }
3132
3193
  }
3133
3194
 
3195
+ const environmentCandidates: EnvironmentCandidate[] = [];
3196
+ const imageEnvironment =
3197
+ skylight?.equirectHandle !== undefined && skylight.equirectHandle > 0
3198
+ ? skylight
3199
+ : skybox?.equirectHandle !== undefined && skybox.equirectHandle > 0
3200
+ ? skybox
3201
+ : undefined;
3202
+ if (imageEnvironment !== undefined) {
3203
+ environmentCandidates.push({
3204
+ kind: 'image',
3205
+ entityKey: imageEnvironment.entityHandle,
3206
+ sourceKey: `equirect:${imageEnvironment.equirectHandle}`,
3207
+ });
3208
+ }
3209
+ const atmosphereQuery = world.query({ read: [Atmosphere] }).unwrap();
3210
+ for (const row of atmosphereQuery) {
3211
+ const value = row.get(Atmosphere);
3212
+ const atmosphere = {
3213
+ turbidity: value.turbidity,
3214
+ rayleigh: value.rayleigh,
3215
+ mieCoefficient: value.mieCoefficient,
3216
+ mieDirectionalG: value.mieDirectionalG,
3217
+ sunAngularRadius: value.sunAngularRadius,
3218
+ } as const;
3219
+ environmentCandidates.push({
3220
+ kind: 'atmosphere',
3221
+ entityKey: row.entity,
3222
+ sourceKey: `atmosphere:${row.entity}`,
3223
+ atmosphere,
3224
+ });
3225
+ }
3226
+ const directionalDirection = directional?.direction;
3227
+ const directionalLength =
3228
+ directionalDirection === undefined
3229
+ ? 0
3230
+ : Math.hypot(
3231
+ directionalDirection[0] ?? 0,
3232
+ directionalDirection[1] ?? 0,
3233
+ directionalDirection[2] ?? 0,
3234
+ );
3235
+ const sun =
3236
+ directional === undefined || directionalLength <= 1e-6
3237
+ ? []
3238
+ : [
3239
+ {
3240
+ entityKey: 0,
3241
+ direction: [
3242
+ -(directionalDirection?.[0] ?? 0) / directionalLength,
3243
+ -(directionalDirection?.[1] ?? 0) / directionalLength,
3244
+ -(directionalDirection?.[2] ?? 0) / directionalLength,
3245
+ ] as [number, number, number],
3246
+ color: [
3247
+ directional.color[0] ?? 0,
3248
+ directional.color[1] ?? 0,
3249
+ directional.color[2] ?? 0,
3250
+ ] as [number, number, number],
3251
+ intensity: directional.intensity,
3252
+ },
3253
+ ];
3254
+ const environmentSelection = selectEnvironment({
3255
+ environments: environmentCandidates,
3256
+ fogs: fog === undefined ? [] : [fog],
3257
+ suns: sun,
3258
+ lane: 'direct',
3259
+ });
3260
+ if (!environmentSelection.ok) {
3261
+ routeWorldError(world, environmentSelection.error, {
3262
+ systemName: 'RenderSystem.extract (environment-selection)',
3263
+ });
3264
+ throw environmentSelection.error;
3265
+ }
3266
+ const environment: EnvironmentFrame = environmentSelection.value;
3267
+
3134
3268
  // feat-20260528-frustum-culling M3 / w10: precompute per-camera frustum
3135
3269
  // planes so entities can be tested against all cameras in the inner loop.
3136
3270
  // Cameras with degenerate projection parameters (e.g. zero fov, zero aspect)
@@ -3236,6 +3370,9 @@ export function extractFrame(world: World, context: PreparedExtractContext): Ext
3236
3370
  MorphWeights,
3237
3371
  SpriteRegionOverride,
3238
3372
  SpriteInstances,
3373
+ Points,
3374
+ Lines,
3375
+ SortKey,
3239
3376
  ],
3240
3377
  })
3241
3378
  .unwrap();
@@ -3288,6 +3425,11 @@ export function extractFrame(world: World, context: PreparedExtractContext): Ext
3288
3425
  // - 'sprite-instances-count-mismatch'
3289
3426
  // (transforms.length / 16 !== regions.length / 4) — stride pair desync.
3290
3427
  const hasSpriteInstances = row.has(SpriteInstances);
3428
+ const points = row.get(Points);
3429
+ const lines = row.get(Lines);
3430
+ const sortKey = row.get(SortKey)?.value;
3431
+ const pointsLinesComponent =
3432
+ points !== undefined ? 'Points' : lines !== undefined ? 'Lines' : undefined;
3291
3433
  const isRenderable = hasTransform && hasMeshFilter;
3292
3434
 
3293
3435
  // feat-20260601 D-3: the resolved world transform is read per-entity from
@@ -4342,6 +4484,38 @@ export function extractFrame(world: World, context: PreparedExtractContext): Ext
4342
4484
  }
4343
4485
  }
4344
4486
 
4487
+ const pointsLinesStyle: PointsLinesStyle | undefined =
4488
+ points !== undefined
4489
+ ? (() => {
4490
+ const shape = pointShapeFromU32(points.shape);
4491
+ return shape === undefined
4492
+ ? undefined
4493
+ : { kind: 'points' as const, sizePx: points.sizePx, shape };
4494
+ })()
4495
+ : lines === undefined
4496
+ ? undefined
4497
+ : { kind: 'lines' as const, widthPx: lines.widthPx };
4498
+ const cullingLocalAabb = expandPointsLinesBounds(localAabb ?? [], pointsLinesStyle);
4499
+ const pointsLines =
4500
+ pointsLinesComponent === undefined
4501
+ ? undefined
4502
+ : ({
4503
+ worldId: 0,
4504
+ entityKey: entity,
4505
+ component: pointsLinesComponent,
4506
+ meshHandle: assetHandleRaw,
4507
+ meshGeneration: assets?.catalogEpoch ?? 0,
4508
+ materialHandle: handleRaw,
4509
+ materialGeneration: assets?.catalogEpoch ?? 0,
4510
+ style: pointsLinesStyle,
4511
+ layer: layerVal,
4512
+ sortKey,
4513
+ visible: true,
4514
+ sourceBounds: cullingLocalAabb,
4515
+ viewport: { width: 0, height: 0, dpr: 1 },
4516
+ projection: identityProjection(),
4517
+ } satisfies PointsLinesRetainedSnapshot);
4518
+
4345
4519
  let nonIndexedFirst = 0;
4346
4520
  const gpuDrivenDraws = gpuDrivenSubmeshes.flatMap((submesh) => {
4347
4521
  const drawMaterial = materialsArr[submesh.materialSlot] ?? materialSnap;
@@ -4364,7 +4538,7 @@ export function extractFrame(world: World, context: PreparedExtractContext): Ext
4364
4538
  const baseRenderable: RenderableSnapshot = {
4365
4539
  assetHandle: Math.round(fAssetHandle ?? 0),
4366
4540
  transform: transformSnap,
4367
- ...(localAabb !== undefined ? { localAabb } : {}),
4541
+ ...(localAabb !== undefined ? { localAabb: cullingLocalAabb } : {}),
4368
4542
  material: materialSnap,
4369
4543
  materials: materialsArr,
4370
4544
  materialBindingSources,
@@ -4375,6 +4549,7 @@ export function extractFrame(world: World, context: PreparedExtractContext): Ext
4375
4549
  ...(skinSlice !== undefined ? { skin: skinSlice } : {}),
4376
4550
  ...(morph !== undefined ? { morph } : {}),
4377
4551
  ...(spriteInstancesSnap !== undefined ? { spriteInstances: spriteInstancesSnap } : {}),
4552
+ ...(pointsLines !== undefined ? { pointsLines } : {}),
4378
4553
  };
4379
4554
 
4380
4555
  // feat-20260528-frustum-culling M3 / w10: frustum culling check.
@@ -4388,7 +4563,7 @@ export function extractFrame(world: World, context: PreparedExtractContext): Ext
4388
4563
  // directly (no compose) -- same source the record stage feeds
4389
4564
  // the mesh SSBO, so cull stays same-source with render (AC-05).
4390
4565
  const worldAabb = box3.create();
4391
- box3.transformBox3(worldAabb, localAabb, transformSnap.world);
4566
+ box3.transformBox3(worldAabb, cullingLocalAabb, transformSnap.world);
4392
4567
 
4393
4568
  // Test against all cameras. Entity is visible if one camera
4394
4569
  // frustum intersects the world-space AABB (or planes are empty
@@ -4487,18 +4662,21 @@ export function extractFrame(world: World, context: PreparedExtractContext): Ext
4487
4662
  // recordFrame's `activeCameras[0]` selection.
4488
4663
  const tonemapCamera = cameras[0];
4489
4664
  if (tonemapCamera !== undefined) {
4490
- postProcessParams.set(STANDARD_TONEMAP_FEATURE_ID, tonemapParams(tonemapCamera));
4665
+ postProcessParams.set(STANDARD_OUTPUT_TRANSFORM_FEATURE_ID, tonemapParams(tonemapCamera));
4491
4666
  }
4492
4667
 
4493
4668
  return {
4494
4669
  cameras,
4495
4670
  lights,
4671
+ environment,
4672
+ environmentReady: true,
4496
4673
  renderables,
4497
4674
  dispatch,
4498
4675
  skylight,
4499
4676
  skylightCount,
4500
4677
  skybox,
4501
4678
  skyboxCount,
4679
+ fog,
4502
4680
  frustumStats: { culled: frustumCulled, total: frustumTotal },
4503
4681
  visibilityStats: { explicitlyHidden: explicitlyHidden.size },
4504
4682
  postProcessParams,
@@ -4520,3 +4698,12 @@ export function defaultMaterialSnapshot(materialHandle = 0): MaterialSnapshot {
4520
4698
  materialHandle,
4521
4699
  };
4522
4700
  }
4701
+
4702
+ function identityProjection(): Float32Array {
4703
+ const projection = new Float32Array(16);
4704
+ projection[0] = 1;
4705
+ projection[5] = 1;
4706
+ projection[10] = 1;
4707
+ projection[15] = 1;
4708
+ return projection;
4709
+ }