@forgeax/engine-render 0.1.4 → 0.1.7

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 (979) hide show
  1. package/README.md +268 -640
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts +2 -0
  4. package/dist/__tests__/device-scope-lifecycle.unit.test.d.ts.map +1 -0
  5. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts +2 -0
  6. package/dist/__tests__/device-scope-stale-matrix.unit.test.d.ts.map +1 -0
  7. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts +2 -0
  8. package/dist/__tests__/fullscreen-feature-plan.unit.test.d.ts.map +1 -0
  9. package/dist/__tests__/gpu-driven-indirect-raster-evidence.d.ts.map +1 -1
  10. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts +6 -0
  11. package/dist/__tests__/gpu-driven-view-gpu-evidence.d.ts.map +1 -1
  12. package/dist/{gpu-driven/view-reference.d.ts → __tests__/gpu-driven-view-reference.d.ts} +4 -4
  13. package/dist/__tests__/gpu-driven-view-reference.d.ts.map +1 -0
  14. package/dist/__tests__/gpu-scene-render-graph-gpu.d.ts.map +1 -1
  15. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts +2 -0
  16. package/dist/__tests__/ibl/face-uniforms.unit.test.d.ts.map +1 -0
  17. package/dist/__tests__/morph-feature-plan.unit.test.d.ts +2 -0
  18. package/dist/__tests__/morph-feature-plan.unit.test.d.ts.map +1 -0
  19. package/dist/__tests__/render-feature-plan.test-d.d.ts +2 -0
  20. package/dist/__tests__/render-feature-plan.test-d.d.ts.map +1 -0
  21. package/dist/__tests__/render-feature-plan.unit.test.d.ts +2 -0
  22. package/dist/__tests__/render-feature-plan.unit.test.d.ts.map +1 -0
  23. package/dist/__tests__/ssao-config.unit.test.d.ts +2 -0
  24. package/dist/__tests__/ssao-config.unit.test.d.ts.map +1 -0
  25. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts +2 -0
  26. package/dist/__tests__/standard-clustered-pipeline.unit.test.d.ts.map +1 -0
  27. package/dist/__tests__/standard-descriptors.test-d.d.ts +2 -0
  28. package/dist/__tests__/standard-descriptors.test-d.d.ts.map +1 -0
  29. package/dist/__tests__/standard-pipeline.dawn.test.d.ts +2 -0
  30. package/dist/__tests__/standard-pipeline.dawn.test.d.ts.map +1 -0
  31. package/dist/__tests__/standard-pipeline.integration.test.d.ts +2 -0
  32. package/dist/__tests__/standard-pipeline.integration.test.d.ts.map +1 -0
  33. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts +2 -0
  34. package/dist/__tests__/standard-profile-oracle.unit.test.d.ts.map +1 -0
  35. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts +2 -0
  36. package/dist/__tests__/visibility-resource-short-circuit.unit.test.d.ts.map +1 -0
  37. package/dist/{renderer/backend-selection.d.ts → assembly/backend-contract.d.ts} +15 -4
  38. package/dist/assembly/backend-contract.d.ts.map +1 -0
  39. package/dist/assembly/factory.d.ts +214 -0
  40. package/dist/assembly/factory.d.ts.map +1 -0
  41. package/dist/assembly/host-contract.d.ts +84 -0
  42. package/dist/assembly/host-contract.d.ts.map +1 -0
  43. package/dist/{renderer → assembly}/material/assembly.d.ts +0 -1
  44. package/dist/{renderer → assembly}/material/assembly.d.ts.map +1 -1
  45. package/dist/assembly/material/pipeline-projection.d.ts +30 -0
  46. package/dist/assembly/material/pipeline-projection.d.ts.map +1 -0
  47. package/dist/authoring.d.ts +11 -11
  48. package/dist/authoring.d.ts.map +1 -1
  49. package/dist/authoring.mjs +25 -3
  50. package/dist/authoring.mjs.map +1 -1
  51. package/dist/chunk-CQXZC5XI.mjs +182 -0
  52. package/dist/chunk-CQXZC5XI.mjs.map +1 -0
  53. package/dist/chunk-HCOGPHKS.mjs +93 -0
  54. package/dist/chunk-HCOGPHKS.mjs.map +1 -0
  55. package/dist/chunk-YEJIUW7D.mjs +1152 -0
  56. package/dist/chunk-YEJIUW7D.mjs.map +1 -0
  57. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts +2 -0
  58. package/dist/components/__tests__/points-lines-admission.unit.test.d.ts.map +1 -0
  59. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts +2 -0
  60. package/dist/components/__tests__/points-lines-schema.unit.test.d.ts.map +1 -0
  61. package/dist/components/__tests__/schema-contract.unit.test.d.ts +2 -0
  62. package/dist/components/__tests__/schema-contract.unit.test.d.ts.map +1 -0
  63. package/dist/components/glyph-text.d.ts +1 -1
  64. package/dist/components/glyph-text.d.ts.map +1 -1
  65. package/dist/components/index.d.ts +4 -2
  66. package/dist/components/index.d.ts.map +1 -1
  67. package/dist/components/instances.d.ts +1 -1
  68. package/dist/components/instances.d.ts.map +1 -1
  69. package/dist/components/light-helpers.d.ts +1 -1
  70. package/dist/components/light-helpers.d.ts.map +1 -1
  71. package/dist/components/lines.d.ts +5 -0
  72. package/dist/components/lines.d.ts.map +1 -0
  73. package/dist/components/mesh-filter.d.ts +7 -7
  74. package/dist/components/mesh-filter.d.ts.map +1 -1
  75. package/dist/components/points.d.ts +15 -0
  76. package/dist/components/points.d.ts.map +1 -0
  77. package/dist/components/scene-instance.d.ts +11 -11
  78. package/dist/components/skybox-background.d.ts +56 -0
  79. package/dist/components/skybox-background.d.ts.map +1 -0
  80. package/dist/components/skylight.d.ts +55 -0
  81. package/dist/components/skylight.d.ts.map +1 -0
  82. package/dist/components/sprite-animation.d.ts +2 -3
  83. package/dist/components/sprite-animation.d.ts.map +1 -1
  84. package/dist/components/sprite-instances.d.ts +1 -1
  85. package/dist/components/sprite-playback-mode.d.ts +6 -1
  86. package/dist/components/sprite-playback-mode.d.ts.map +1 -1
  87. package/dist/components/sprite-region-override.d.ts +2 -3
  88. package/dist/components/sprite-region-override.d.ts.map +1 -1
  89. package/dist/components/tile-layer.d.ts +5 -0
  90. package/dist/components/tile-layer.d.ts.map +1 -1
  91. package/dist/construct-renderer.d.ts +18 -1
  92. package/dist/construct-renderer.d.ts.map +1 -1
  93. package/dist/construct-renderer.mjs +27463 -4
  94. package/dist/construct-renderer.mjs.map +1 -1
  95. package/dist/debug-draw-glue.d.ts +2 -53
  96. package/dist/debug-draw-glue.d.ts.map +1 -1
  97. package/dist/device/device-scope.d.ts +83 -0
  98. package/dist/device/device-scope.d.ts.map +1 -0
  99. package/dist/{gpu-resource-store.d.ts → device/gpu-residency.d.ts} +91 -48
  100. package/dist/device/gpu-residency.d.ts.map +1 -0
  101. package/dist/device/resource-types.d.ts +8 -0
  102. package/dist/device/resource-types.d.ts.map +1 -0
  103. package/dist/engine-metrics.d.ts +2 -2
  104. package/dist/engine-metrics.d.ts.map +1 -1
  105. package/dist/errors/recover.d.ts +28 -1
  106. package/dist/errors/recover.d.ts.map +1 -1
  107. package/dist/errors/render.d.ts +320 -248
  108. package/dist/errors/render.d.ts.map +1 -1
  109. package/dist/features/fullscreen.d.ts +19 -0
  110. package/dist/features/fullscreen.d.ts.map +1 -0
  111. package/dist/features/host.d.ts +32 -26
  112. package/dist/features/host.d.ts.map +1 -1
  113. package/dist/features/morph/morph-feature.d.ts +39 -5
  114. package/dist/features/morph/morph-feature.d.ts.map +1 -1
  115. package/dist/features/plan.d.ts +182 -0
  116. package/dist/features/plan.d.ts.map +1 -0
  117. package/dist/features/prepared-gpu-work.d.ts +21 -17
  118. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  119. package/dist/features/prepared-graphics-store.d.ts +2 -1
  120. package/dist/features/prepared-graphics-store.d.ts.map +1 -1
  121. package/dist/features/prepared-graphics.d.ts +11 -21
  122. package/dist/features/prepared-graphics.d.ts.map +1 -1
  123. package/dist/features/render-graph-compute.d.ts +2 -2
  124. package/dist/features/render-graph-compute.d.ts.map +1 -1
  125. package/dist/features/render-graph-contribution.d.ts +4 -7
  126. package/dist/features/render-graph-contribution.d.ts.map +1 -1
  127. package/dist/features/render-graph-raster.d.ts +7 -3
  128. package/dist/features/render-graph-raster.d.ts.map +1 -1
  129. package/dist/features/render-graph-resources.d.ts +6 -6
  130. package/dist/features/render-graph-resources.d.ts.map +1 -1
  131. package/dist/features/targets.d.ts +5 -5
  132. package/dist/features/targets.d.ts.map +1 -1
  133. package/dist/features/types.d.ts +11 -190
  134. package/dist/features/types.d.ts.map +1 -1
  135. package/dist/features/vocabulary.d.ts +14 -0
  136. package/dist/features/vocabulary.d.ts.map +1 -0
  137. package/dist/fullscreen-post-process-pass.d.ts +4 -25
  138. package/dist/fullscreen-post-process-pass.d.ts.map +1 -1
  139. package/dist/glyph-text-layout-system.d.ts +3 -2
  140. package/dist/glyph-text-layout-system.d.ts.map +1 -1
  141. package/dist/gpu-driven/batch-topology.d.ts +6 -75
  142. package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
  143. package/dist/gpu-driven/production-raster.d.ts +13 -112
  144. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  145. package/dist/gpu-driven/view-gpu.d.ts +10 -66
  146. package/dist/gpu-driven/view-gpu.d.ts.map +1 -1
  147. package/dist/gpu-resource.d.ts +3 -3
  148. package/dist/gpu-scene-schema.d.ts +1 -94
  149. package/dist/gpu-scene-schema.d.ts.map +1 -1
  150. package/dist/gpu-scene.d.ts +7 -33
  151. package/dist/gpu-scene.d.ts.map +1 -1
  152. package/dist/hdrp-buffers.d.ts +3 -53
  153. package/dist/hdrp-buffers.d.ts.map +1 -1
  154. package/dist/ibl/IblPipelineCache.d.ts +74 -180
  155. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  156. package/dist/ibl/skylight-bind-group.d.ts +1 -1
  157. package/dist/index.d.ts +17 -43
  158. package/dist/index.d.ts.map +1 -1
  159. package/dist/index.mjs +167 -3
  160. package/dist/index.mjs.map +1 -1
  161. package/dist/inspection-types.d.ts +72 -0
  162. package/dist/inspection-types.d.ts.map +1 -0
  163. package/dist/instance-buffer-cache.d.ts +1 -4
  164. package/dist/instance-buffer-cache.d.ts.map +1 -1
  165. package/dist/internal.d.ts +1 -73
  166. package/dist/internal.d.ts.map +1 -1
  167. package/dist/internal.mjs +1 -43
  168. package/dist/internal.mjs.map +1 -1
  169. package/dist/lifecycle.d.ts +36 -2
  170. package/dist/lifecycle.d.ts.map +1 -1
  171. package/dist/materials.d.ts +0 -3
  172. package/dist/materials.d.ts.map +1 -1
  173. package/dist/mesh-material-bindings.d.ts +0 -1
  174. package/dist/mesh-material-bindings.d.ts.map +1 -1
  175. package/dist/pbr-pipeline.d.ts +77 -29
  176. package/dist/pbr-pipeline.d.ts.map +1 -1
  177. package/dist/pipeline/standard-forward-lane.d.ts +5 -0
  178. package/dist/pipeline/standard-forward-lane.d.ts.map +1 -0
  179. package/dist/pipeline/standard-pipeline.d.ts +31 -0
  180. package/dist/pipeline/standard-pipeline.d.ts.map +1 -0
  181. package/dist/pipeline/standard-profile.d.ts +40 -0
  182. package/dist/pipeline/standard-profile.d.ts.map +1 -0
  183. package/dist/pipeline-builder.d.ts +3 -3
  184. package/dist/pipeline-builder.d.ts.map +1 -1
  185. package/dist/pipeline-spec-types.d.ts +24 -0
  186. package/dist/pipeline-spec-types.d.ts.map +1 -0
  187. package/dist/pipeline-spec.d.ts +16 -155
  188. package/dist/pipeline-spec.d.ts.map +1 -1
  189. package/dist/plugin.d.ts +1 -14
  190. package/dist/plugin.d.ts.map +1 -1
  191. package/dist/points-lines/__tests__/bounds.unit.test.d.ts +2 -0
  192. package/dist/points-lines/__tests__/bounds.unit.test.d.ts.map +1 -0
  193. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts +2 -0
  194. package/dist/points-lines/__tests__/cache-recovery.unit.test.d.ts.map +1 -0
  195. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts +2 -0
  196. package/dist/points-lines/__tests__/inspection-lanes.integration.test.d.ts.map +1 -0
  197. package/dist/points-lines/__tests__/inspection.unit.test.d.ts +2 -0
  198. package/dist/points-lines/__tests__/inspection.unit.test.d.ts.map +1 -0
  199. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts +2 -0
  200. package/dist/points-lines/__tests__/lane-structural.integration.test.d.ts.map +1 -0
  201. package/dist/points-lines/__tests__/points-lines.bench.d.ts +2 -0
  202. package/dist/points-lines/__tests__/points-lines.bench.d.ts.map +1 -0
  203. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts +2 -0
  204. package/dist/points-lines/__tests__/raster-lane.integration.test.d.ts.map +1 -0
  205. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts +2 -0
  206. package/dist/points-lines/__tests__/snapshot.unit.test.d.ts.map +1 -0
  207. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts +2 -0
  208. package/dist/points-lines/__tests__/view-ubo.unit.test.d.ts.map +1 -0
  209. package/dist/points-lines/admission.d.ts +36 -0
  210. package/dist/points-lines/admission.d.ts.map +1 -0
  211. package/dist/points-lines/bounds.d.ts +8 -0
  212. package/dist/points-lines/bounds.d.ts.map +1 -0
  213. package/dist/points-lines/expansion-cache.d.ts +28 -0
  214. package/dist/points-lines/expansion-cache.d.ts.map +1 -0
  215. package/dist/points-lines/inspection.d.ts +53 -0
  216. package/dist/points-lines/inspection.d.ts.map +1 -0
  217. package/dist/points-lines/prepare.d.ts +67 -0
  218. package/dist/points-lines/prepare.d.ts.map +1 -0
  219. package/dist/points-lines/record.d.ts +60 -0
  220. package/dist/points-lines/record.d.ts.map +1 -0
  221. package/dist/points-lines/snapshot.d.ts +49 -0
  222. package/dist/points-lines/snapshot.d.ts.map +1 -0
  223. package/dist/post-process-errors.d.ts +18 -18
  224. package/dist/post-process-errors.d.ts.map +1 -1
  225. package/dist/prepare/prepared-graphics-resolver.d.ts +2 -5
  226. package/dist/prepare/prepared-graphics-resolver.d.ts.map +1 -1
  227. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts +2 -0
  228. package/dist/record/__tests__/typed-frame-graph-plan.unit.test.d.ts.map +1 -0
  229. package/dist/record/frame-lighting.d.ts +7 -73
  230. package/dist/record/frame-lighting.d.ts.map +1 -1
  231. package/dist/record/frame-snapshot.d.ts +44 -44
  232. package/dist/record/frame-snapshot.d.ts.map +1 -1
  233. package/dist/record/frame-targets.d.ts +5 -38
  234. package/dist/record/frame-targets.d.ts.map +1 -1
  235. package/dist/record/frame.d.ts +64 -52
  236. package/dist/record/frame.d.ts.map +1 -1
  237. package/dist/record/helpers.d.ts +3 -2
  238. package/dist/record/helpers.d.ts.map +1 -1
  239. package/dist/record/main-pass-geometry.d.ts +12 -4
  240. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  241. package/dist/record/main-pass-material.d.ts +90 -59
  242. package/dist/record/main-pass-material.d.ts.map +1 -1
  243. package/dist/record/main-pass-sprite-draws.d.ts +28 -3
  244. package/dist/record/main-pass-sprite-draws.d.ts.map +1 -1
  245. package/dist/record/main-pass.d.ts +1 -1
  246. package/dist/record/main-pass.d.ts.map +1 -1
  247. package/dist/record/mesh-ssbo.d.ts +276 -3
  248. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  249. package/dist/record/render-context.d.ts +252 -0
  250. package/dist/record/render-context.d.ts.map +1 -0
  251. package/dist/record/shadow-pass.d.ts +15 -88
  252. package/dist/record/shadow-pass.d.ts.map +1 -1
  253. package/dist/record/skybox-post-pass.d.ts +1 -1
  254. package/dist/record/skybox-post-pass.d.ts.map +1 -1
  255. package/dist/record/typed-frame-graph.d.ts +29 -7
  256. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  257. package/dist/record/view-ubo.d.ts +9 -3
  258. package/dist/record/view-ubo.d.ts.map +1 -1
  259. package/dist/render-contract.d.ts +424 -0
  260. package/dist/render-contract.d.ts.map +1 -0
  261. package/dist/render-data.d.ts.map +1 -1
  262. package/dist/render-graph-primitives.d.ts +14 -362
  263. package/dist/render-graph-primitives.d.ts.map +1 -1
  264. package/dist/render-pipeline.d.ts +25 -64
  265. package/dist/render-pipeline.d.ts.map +1 -1
  266. package/dist/render-system-extract.d.ts +110 -338
  267. package/dist/render-system-extract.d.ts.map +1 -1
  268. package/dist/render-system.d.ts +24 -713
  269. package/dist/render-system.d.ts.map +1 -1
  270. package/dist/scene/render-scene-types.d.ts +61 -0
  271. package/dist/scene/render-scene-types.d.ts.map +1 -0
  272. package/dist/scene/render-scene.d.ts +112 -0
  273. package/dist/scene/render-scene.d.ts.map +1 -0
  274. package/dist/scene-instances/post-spawn-resolve-joints.d.ts +2 -5
  275. package/dist/scene-instances/post-spawn-resolve-joints.d.ts.map +1 -1
  276. package/dist/ssao-buffers.d.ts +22 -3
  277. package/dist/ssao-buffers.d.ts.map +1 -1
  278. package/dist/systems/skin-palette-allocator.d.ts +2 -4
  279. package/dist/systems/skin-palette-allocator.d.ts.map +1 -1
  280. package/dist/systems/skin-palette-types.d.ts +14 -0
  281. package/dist/systems/skin-palette-types.d.ts.map +1 -0
  282. package/dist/systems/transparent-sort-config.d.ts +23 -2
  283. package/dist/systems/transparent-sort-config.d.ts.map +1 -1
  284. package/dist/tilemap-chunk-extract-system.d.ts +4 -3
  285. package/dist/tilemap-chunk-extract-system.d.ts.map +1 -1
  286. package/dist/typed-render-graph-primitives.d.ts +2 -4
  287. package/dist/typed-render-graph-primitives.d.ts.map +1 -1
  288. package/dist/typed-shadow-passes.d.ts +3 -3
  289. package/dist/typed-shadow-passes.d.ts.map +1 -1
  290. package/package.json +23 -23
  291. package/src/__tests__/authoring-path.unit.test.ts +9 -0
  292. package/src/__tests__/backend-selection-rhi-capture.test-d.ts +1 -1
  293. package/src/__tests__/callback-inference.test-d.ts +6 -3
  294. package/src/__tests__/cluster-grid-default-surface.unit.test.ts +7 -4
  295. package/src/__tests__/construct-renderer-identity.unit.test.ts +15 -2
  296. package/src/__tests__/device-scope-lifecycle.unit.test.ts +151 -0
  297. package/src/__tests__/device-scope-stale-matrix.unit.test.ts +42 -0
  298. package/src/__tests__/direct-extract-consumer-contract.test-d.ts +8 -19
  299. package/src/__tests__/direct-light-snapshot.unit.test.ts +3 -13
  300. package/src/__tests__/factory-contract.integration.test.ts +158 -209
  301. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +1 -4
  302. package/src/__tests__/frame-observation.contract.test.ts +17 -8
  303. package/src/__tests__/fullscreen-feature-plan.unit.test.ts +32 -0
  304. package/src/__tests__/glyph-text-layout-recovery.unit.test.ts +6 -11
  305. package/src/__tests__/gpu-driven-indirect-raster-evidence.ts +21 -18
  306. package/src/__tests__/gpu-driven-production.integration.test.ts +32 -205
  307. package/src/__tests__/gpu-driven-scaling.unit.test.ts +4 -7
  308. package/src/__tests__/gpu-driven-view-gpu-evidence.ts +87 -8
  309. package/src/__tests__/gpu-driven-view-graph.integration.test.ts +170 -8
  310. package/src/{gpu-driven/view-reference.ts → __tests__/gpu-driven-view-reference.ts} +4 -3
  311. package/src/__tests__/gpu-driven-view.browser.test.ts +12 -1
  312. package/src/__tests__/gpu-driven-view.dawn.test.ts +12 -1
  313. package/src/__tests__/gpu-driven-view.unit.test.ts +11 -267
  314. package/src/__tests__/gpu-resource-store-stride.unit.test.ts +3 -3
  315. package/src/__tests__/gpu-scene-render-graph-gpu.ts +2 -3
  316. package/src/__tests__/gpu-scene.dawn.test.ts +2 -6
  317. package/src/__tests__/gpu-scene.unit.test.ts +10 -24
  318. package/src/__tests__/ibl/face-uniforms.unit.test.ts +46 -0
  319. package/src/__tests__/infinite-grid-no-vertex-probe.unit.test.ts +34 -66
  320. package/src/__tests__/ktx2-basis-gpu-consumer.dawn.test.ts +14 -5
  321. package/src/__tests__/light-buffer-layout.unit.test.ts +4 -49
  322. package/src/__tests__/material-cooked-projection.unit.test.ts +31 -58
  323. package/src/__tests__/material-snapshot-mutation.integration.test.ts +10 -15
  324. package/src/__tests__/material-static-dynamic-route.unit.test.ts +31 -50
  325. package/src/__tests__/material-stride-surface.unit.test.ts +2 -2
  326. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +7 -8
  327. package/src/__tests__/morph-culling-reentry.dawn.test.ts +29 -38
  328. package/src/__tests__/morph-feature-gpu-work.integration.test.ts +45 -43
  329. package/src/__tests__/morph-feature-plan.unit.test.ts +53 -0
  330. package/src/__tests__/morph-visual-evidence.integration.test.ts +47 -33
  331. package/src/__tests__/nineslice-handle-surface.unit.test.ts +11 -6
  332. package/src/__tests__/post-process-error-policy-owner.unit.test.ts +6 -13
  333. package/src/__tests__/prepared-graphics-capability.unit.test.ts +6 -81
  334. package/src/__tests__/prepared-graphics-generation.unit.test.ts +3 -17
  335. package/src/__tests__/prepared-graphics-lifecycle.unit.test.ts +6 -74
  336. package/src/__tests__/prepared-graphics-resolver.unit.test.ts +1 -3
  337. package/src/__tests__/prepared-graphics-snapshot.unit.test.ts +2 -2
  338. package/src/__tests__/profiler-default-off.test.ts +1 -1
  339. package/src/__tests__/profiler-phase-catalog.test.ts +2 -2
  340. package/src/__tests__/profiler-phase-integration.test.ts +5 -13
  341. package/src/__tests__/profiler-phase-token.test.ts +3 -8
  342. package/src/__tests__/public-surface.test-d.ts +65 -3
  343. package/src/__tests__/recover-error-policy-owner.unit.test.ts +1 -21
  344. package/src/__tests__/render-error-code-owner.test-d.ts +24 -23
  345. package/src/__tests__/render-error-detail-ssot.test-d.ts +0 -95
  346. package/src/__tests__/render-error-exhaustive.test-d.ts +27 -1
  347. package/src/__tests__/render-feature-assembly.test-d.ts +8 -16
  348. package/src/__tests__/render-feature-context.test-d.ts +16 -40
  349. package/src/__tests__/render-feature-contract.test-d.ts +9 -18
  350. package/src/__tests__/render-feature-diagnostics.unit.test.ts +6 -8
  351. package/src/__tests__/render-feature-docs.unit.test.ts +8 -7
  352. package/src/__tests__/render-feature-gpu-work.integration.test.ts +14 -75
  353. package/src/__tests__/render-feature-plan.test-d.ts +161 -0
  354. package/src/__tests__/render-feature-plan.unit.test.ts +170 -0
  355. package/src/__tests__/render-feature-prepared-diagnostics.unit.test.ts +8 -19
  356. package/src/__tests__/render-feature-prepared-errors.test-d.ts +3 -6
  357. package/src/__tests__/render-feature-prepared-graphics-docs.unit.test.ts +10 -71
  358. package/src/__tests__/render-feature-prepared-graphics-isolation.unit.test.ts +11 -61
  359. package/src/__tests__/render-feature-prepared-graphics-negative.test-d.ts +20 -43
  360. package/src/__tests__/render-feature-prepared-graphics.test-d.ts +56 -78
  361. package/src/__tests__/render-feature-public-surface.test-d.ts +6 -24
  362. package/src/__tests__/render-feature-retry.unit.test.ts +7 -48
  363. package/src/__tests__/render-feature-scheduling.unit.test.ts +15 -27
  364. package/src/__tests__/render-feature-stage-failed-policy-owner.unit.test.ts +0 -9
  365. package/src/__tests__/render-feature-stage-fault-recovery.unit.test.ts +19 -109
  366. package/src/__tests__/render-feature-visibility-context.test-d.ts +1 -6
  367. package/src/__tests__/render-feature-visibility-context.unit.test.ts +1 -2
  368. package/src/__tests__/render-feature-zero-work.unit.test.ts +14 -20
  369. package/src/__tests__/render-scene-projection.unit.test.ts +73 -111
  370. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +82 -95
  371. package/src/__tests__/renderer-lifecycle.integration.test.ts +49 -1
  372. package/src/__tests__/shader-stage-surface.unit.test.ts +14 -9
  373. package/src/__tests__/ssao-config.unit.test.ts +36 -0
  374. package/src/__tests__/ssao-kernel-surface.unit.test.ts +4 -5
  375. package/src/__tests__/standard-clustered-pipeline.unit.test.ts +28 -0
  376. package/src/__tests__/standard-descriptors.test-d.ts +22 -0
  377. package/src/__tests__/standard-pipeline.dawn.test.ts +61 -0
  378. package/src/__tests__/standard-pipeline.integration.test.ts +124 -0
  379. package/src/__tests__/standard-profile-oracle.unit.test.ts +62 -0
  380. package/src/__tests__/surface-configuration.unit.test.ts +1 -2
  381. package/src/__tests__/texture-usage-surface.unit.test.ts +3 -6
  382. package/src/__tests__/typed-pipeline-topology.unit.test.ts +40 -206
  383. package/src/__tests__/urp-pipeline-targets.unit.test.ts +1 -11
  384. package/src/__tests__/urp-pipeline.unit.test.ts +2 -2
  385. package/src/__tests__/vertex-color-pipeline.unit.test.ts +10 -2
  386. package/src/__tests__/vertex-layout-consumer.unit.test.ts +1 -1
  387. package/src/__tests__/visibility-diagnostics.integration.test.ts +7 -11
  388. package/src/__tests__/visibility-extract.integration.test.ts +20 -11
  389. package/src/__tests__/visibility-extract.perf.test.ts +66 -32
  390. package/src/__tests__/visibility-feature-dedup.integration.test.ts +2 -4
  391. package/src/__tests__/visibility-hidden-report.unit.test.ts +1 -2
  392. package/src/__tests__/visibility-instances.integration.test.ts +7 -11
  393. package/src/__tests__/visibility-multi-world.integration.test.ts +38 -6
  394. package/src/__tests__/visibility-producer-matrix.integration.test.ts +18 -41
  395. package/src/__tests__/visibility-public-surface.test-d.ts +10 -9
  396. package/src/__tests__/visibility-resolver.unit.test.ts +2 -1
  397. package/src/__tests__/visibility-resource-short-circuit.unit.test.ts +80 -0
  398. package/src/__tests__/visibility-snapshot-contract.unit.test.ts +2 -1
  399. package/src/__tests__/vocabulary.unit.test.ts +1 -1
  400. package/src/assembly/backend-contract.ts +57 -0
  401. package/src/{renderer/renderer-factory.ts → assembly/factory.ts} +1741 -2699
  402. package/src/assembly/host-contract.ts +101 -0
  403. package/src/{renderer → assembly}/material/assembly.ts +2 -7
  404. package/src/assembly/material/pipeline-projection.ts +63 -0
  405. package/src/authoring.ts +15 -22
  406. package/src/components/__tests__/points-lines-admission.unit.test.ts +219 -0
  407. package/src/components/__tests__/points-lines-schema.unit.test.ts +56 -0
  408. package/src/components/__tests__/schema-contract.unit.test.ts +10 -0
  409. package/src/components/glyph-text.ts +3 -2
  410. package/src/components/index.ts +14 -9
  411. package/src/components/instances.ts +4 -5
  412. package/src/components/light-helpers.ts +1 -1
  413. package/src/components/lines.ts +18 -0
  414. package/src/components/mesh-filter.ts +11 -10
  415. package/src/components/points.ts +40 -0
  416. package/src/components/post-process-params.ts +3 -3
  417. package/src/components/scene-instance.ts +12 -12
  418. package/src/components/skybox-background.ts +103 -0
  419. package/src/components/{environment.ts → skylight.ts} +2 -110
  420. package/src/components/sprite-animation.ts +3 -4
  421. package/src/components/sprite-instances.ts +2 -2
  422. package/src/components/sprite-playback-mode.ts +7 -1
  423. package/src/components/sprite-region-override.ts +2 -3
  424. package/src/components/tile-layer.ts +8 -2
  425. package/src/construct-renderer.ts +67 -4
  426. package/src/debug-draw-glue.ts +8 -129
  427. package/src/device/device-scope.ts +306 -0
  428. package/src/{gpu-resource-store.ts → device/gpu-residency.ts} +540 -639
  429. package/src/device/resource-types.ts +20 -0
  430. package/src/engine-metrics.ts +12 -19
  431. package/src/errors/recover.ts +45 -3
  432. package/src/errors/render.ts +469 -429
  433. package/src/features/fullscreen.ts +46 -0
  434. package/src/features/host.ts +575 -309
  435. package/src/features/morph/morph-feature.ts +195 -105
  436. package/src/features/plan.ts +447 -0
  437. package/src/features/prepared-gpu-work.ts +72 -15
  438. package/src/features/prepared-graphics-store.ts +20 -6
  439. package/src/features/prepared-graphics.ts +12 -71
  440. package/src/features/render-graph-compute.ts +14 -5
  441. package/src/features/render-graph-contribution.ts +43 -63
  442. package/src/features/render-graph-raster.ts +32 -8
  443. package/src/features/render-graph-resources.ts +25 -23
  444. package/src/features/targets.ts +8 -21
  445. package/src/features/types.ts +39 -227
  446. package/src/features/vocabulary.ts +24 -0
  447. package/src/fullscreen-post-process-pass.ts +14 -57
  448. package/src/glyph-text-layout-system.ts +70 -96
  449. package/src/gpu-driven/batch-topology.ts +24 -202
  450. package/src/gpu-driven/production-raster.ts +99 -1109
  451. package/src/gpu-driven/view-gpu.ts +46 -192
  452. package/src/gpu-resource.ts +4 -4
  453. package/src/gpu-scene-schema.ts +11 -99
  454. package/src/gpu-scene.ts +231 -364
  455. package/src/hdrp-buffers.ts +12 -221
  456. package/src/ibl/IblPipelineCache.ts +471 -711
  457. package/src/ibl/skylight-bind-group.ts +4 -4
  458. package/src/index.ts +75 -217
  459. package/src/inspection-types.ts +80 -0
  460. package/src/instance-buffer-cache.ts +1 -29
  461. package/src/internal.ts +6 -85
  462. package/src/lifecycle.ts +64 -19
  463. package/src/materials.ts +7 -29
  464. package/src/mesh-material-bindings.ts +0 -1
  465. package/src/pbr-pipeline.ts +441 -53
  466. package/src/{urp-pipeline.ts → pipeline/standard-forward-lane.ts} +38 -149
  467. package/src/{hdrp-pipeline.ts → pipeline/standard-pipeline.ts} +221 -191
  468. package/src/pipeline/standard-profile.ts +65 -0
  469. package/src/pipeline-builder.ts +60 -64
  470. package/src/pipeline-spec-types.ts +28 -0
  471. package/src/pipeline-spec.ts +72 -609
  472. package/src/plugin.ts +7 -75
  473. package/src/points-lines/__tests__/bounds.unit.test.ts +21 -0
  474. package/src/points-lines/__tests__/cache-recovery.unit.test.ts +157 -0
  475. package/src/points-lines/__tests__/inspection-lanes.integration.test.ts +146 -0
  476. package/src/points-lines/__tests__/inspection.unit.test.ts +173 -0
  477. package/src/points-lines/__tests__/lane-structural.integration.test.ts +122 -0
  478. package/src/points-lines/__tests__/points-lines.bench.ts +400 -0
  479. package/src/points-lines/__tests__/raster-lane.integration.test.ts +44 -0
  480. package/src/points-lines/__tests__/snapshot.unit.test.ts +101 -0
  481. package/src/points-lines/__tests__/view-ubo.unit.test.ts +73 -0
  482. package/src/points-lines/admission.ts +238 -0
  483. package/src/points-lines/bounds.ts +23 -0
  484. package/src/points-lines/expansion-cache.ts +215 -0
  485. package/src/points-lines/inspection.ts +97 -0
  486. package/src/points-lines/prepare.ts +177 -0
  487. package/src/points-lines/record.ts +125 -0
  488. package/src/points-lines/snapshot.ts +130 -0
  489. package/src/post-process-errors.ts +31 -33
  490. package/src/prepare/prepared-graphics-resolver.ts +5 -4
  491. package/src/record/__tests__/material-slot-plan.unit.test.ts +1 -33
  492. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +41 -0
  493. package/src/record/__tests__/video-texture-view.unit.test.ts +1 -1
  494. package/src/record/frame-lighting.ts +88 -197
  495. package/src/record/frame-snapshot.ts +45 -60
  496. package/src/record/frame-targets.ts +8 -243
  497. package/src/record/frame.ts +521 -797
  498. package/src/record/helpers.ts +6 -11
  499. package/src/record/main-pass-geometry.ts +198 -147
  500. package/src/record/main-pass-material.ts +517 -190
  501. package/src/record/main-pass-sprite-draws.ts +199 -118
  502. package/src/record/main-pass.ts +166 -144
  503. package/src/record/mesh-ssbo.ts +517 -38
  504. package/src/record/render-context.ts +384 -0
  505. package/src/record/shadow-pass.ts +154 -1843
  506. package/src/record/skybox-post-pass.ts +14 -15
  507. package/src/record/typed-frame-graph.ts +224 -262
  508. package/src/record/view-ubo.ts +53 -37
  509. package/src/render-contract.ts +582 -0
  510. package/src/render-data.ts +3 -3
  511. package/src/render-graph-primitives.ts +76 -851
  512. package/src/render-pipeline.ts +104 -188
  513. package/src/render-system-extract.ts +1114 -1732
  514. package/src/render-system.ts +614 -1939
  515. package/src/scene/render-scene-types.ts +67 -0
  516. package/src/scene/render-scene.ts +1087 -0
  517. package/src/scene-instances/post-spawn-resolve-joints.ts +4 -7
  518. package/src/ssao-buffers.ts +167 -8
  519. package/src/systems/skin-palette-allocator.ts +21 -64
  520. package/src/systems/skin-palette-types.ts +14 -0
  521. package/src/systems/transparent-sort-config.ts +25 -3
  522. package/src/tilemap-chunk-extract-system.ts +53 -70
  523. package/src/typed-render-graph-primitives.ts +35 -24
  524. package/src/typed-shadow-passes.ts +26 -56
  525. package/dist/__tests__/analytic-sky-contract.test.d.ts +0 -2
  526. package/dist/__tests__/analytic-sky-contract.test.d.ts.map +0 -1
  527. package/dist/__tests__/analytic-sky-falsify.test.d.ts +0 -2
  528. package/dist/__tests__/analytic-sky-falsify.test.d.ts.map +0 -1
  529. package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts +0 -2
  530. package/dist/__tests__/assets-runtime-handoff.integration.test.d.ts.map +0 -1
  531. package/dist/__tests__/backend-selection.integration.test.d.ts +0 -2
  532. package/dist/__tests__/backend-selection.integration.test.d.ts.map +0 -1
  533. package/dist/__tests__/camera-temporal.test-d.d.ts +0 -2
  534. package/dist/__tests__/camera-temporal.test-d.d.ts.map +0 -1
  535. package/dist/__tests__/camera-temporal.test.d.ts +0 -2
  536. package/dist/__tests__/camera-temporal.test.d.ts.map +0 -1
  537. package/dist/__tests__/directional-shadow-probe-atlas-layout.unit.test.d.ts +0 -2
  538. package/dist/__tests__/directional-shadow-probe-atlas-layout.unit.test.d.ts.map +0 -1
  539. package/dist/__tests__/environment-inspection.test.d.ts +0 -2
  540. package/dist/__tests__/environment-inspection.test.d.ts.map +0 -1
  541. package/dist/__tests__/fog-ai-user.fixture.d.ts +0 -2
  542. package/dist/__tests__/fog-ai-user.fixture.d.ts.map +0 -1
  543. package/dist/__tests__/fog-custom-render-feature.fixture.d.ts +0 -16
  544. package/dist/__tests__/fog-custom-render-feature.fixture.d.ts.map +0 -1
  545. package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts +0 -2
  546. package/dist/__tests__/fog-custom-render-feature.integration.test.d.ts.map +0 -1
  547. package/dist/__tests__/fog-inspection.integration.test.d.ts +0 -2
  548. package/dist/__tests__/fog-inspection.integration.test.d.ts.map +0 -1
  549. package/dist/__tests__/fog-owner-state.integration.test.d.ts +0 -2
  550. package/dist/__tests__/fog-owner-state.integration.test.d.ts.map +0 -1
  551. package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts +0 -2
  552. package/dist/__tests__/fog-pipeline-topology.integration.test.d.ts.map +0 -1
  553. package/dist/__tests__/fog-public-surface.integration.test.d.ts +0 -2
  554. package/dist/__tests__/fog-public-surface.integration.test.d.ts.map +0 -1
  555. package/dist/__tests__/fog-ray-contract.integration.test.d.ts +0 -2
  556. package/dist/__tests__/fog-ray-contract.integration.test.d.ts.map +0 -1
  557. package/dist/__tests__/fog-source-absence.integration.test.d.ts +0 -2
  558. package/dist/__tests__/fog-source-absence.integration.test.d.ts.map +0 -1
  559. package/dist/__tests__/fog-temporal.integration.test.d.ts +0 -2
  560. package/dist/__tests__/fog-temporal.integration.test.d.ts.map +0 -1
  561. package/dist/__tests__/frame-chain.unit.test.d.ts +0 -2
  562. package/dist/__tests__/frame-chain.unit.test.d.ts.map +0 -1
  563. package/dist/__tests__/gpu-scene-field-type-owner.test-d.d.ts +0 -2
  564. package/dist/__tests__/gpu-scene-field-type-owner.test-d.d.ts.map +0 -1
  565. package/dist/__tests__/hdrp-pipeline.unit.test.d.ts +0 -2
  566. package/dist/__tests__/hdrp-pipeline.unit.test.d.ts.map +0 -1
  567. package/dist/__tests__/ibl/ibl-fallback.unit.test.d.ts +0 -2
  568. package/dist/__tests__/ibl/ibl-fallback.unit.test.d.ts.map +0 -1
  569. package/dist/__tests__/material-derived-error-stop-draw.integration.test.d.ts +0 -2
  570. package/dist/__tests__/material-derived-error-stop-draw.integration.test.d.ts.map +0 -1
  571. package/dist/__tests__/material-derived-payload.integration.test.d.ts +0 -2
  572. package/dist/__tests__/material-derived-payload.integration.test.d.ts.map +0 -1
  573. package/dist/__tests__/materials.unit.test.d.ts +0 -2
  574. package/dist/__tests__/materials.unit.test.d.ts.map +0 -1
  575. package/dist/__tests__/param-schema-projection-census.unit.test.d.ts +0 -2
  576. package/dist/__tests__/param-schema-projection-census.unit.test.d.ts.map +0 -1
  577. package/dist/__tests__/persistent-render-scene.unit.test.d.ts +0 -2
  578. package/dist/__tests__/persistent-render-scene.unit.test.d.ts.map +0 -1
  579. package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts +0 -2
  580. package/dist/__tests__/pipeline-error-policy-owner.unit.test.d.ts.map +0 -1
  581. package/dist/__tests__/pipeline-pass-trace.test.d.ts +0 -2
  582. package/dist/__tests__/pipeline-pass-trace.test.d.ts.map +0 -1
  583. package/dist/__tests__/pipeline-stage-owner.test-d.d.ts +0 -2
  584. package/dist/__tests__/pipeline-stage-owner.test-d.d.ts.map +0 -1
  585. package/dist/__tests__/plugin.test.d.ts +0 -2
  586. package/dist/__tests__/plugin.test.d.ts.map +0 -1
  587. package/dist/__tests__/prepared-graphics-backend-matrix.unit.test.d.ts +0 -2
  588. package/dist/__tests__/prepared-graphics-backend-matrix.unit.test.d.ts.map +0 -1
  589. package/dist/__tests__/prepared-graphics-resolver-recording.unit.test.d.ts +0 -2
  590. package/dist/__tests__/prepared-graphics-resolver-recording.unit.test.d.ts.map +0 -1
  591. package/dist/__tests__/public-pipeline-id.test-d.d.ts +0 -2
  592. package/dist/__tests__/public-pipeline-id.test-d.d.ts.map +0 -1
  593. package/dist/__tests__/render-dispatch-membership.unit.test.d.ts +0 -2
  594. package/dist/__tests__/render-dispatch-membership.unit.test.d.ts.map +0 -1
  595. package/dist/__tests__/render-feature-construction.unit.test.d.ts +0 -2
  596. package/dist/__tests__/render-feature-construction.unit.test.d.ts.map +0 -1
  597. package/dist/__tests__/render-feature-error-code-owner.test-d.d.ts +0 -2
  598. package/dist/__tests__/render-feature-error-code-owner.test-d.d.ts.map +0 -1
  599. package/dist/__tests__/render-feature-gpu-buffer-usage-owner.test-d.d.ts +0 -2
  600. package/dist/__tests__/render-feature-gpu-buffer-usage-owner.test-d.d.ts.map +0 -1
  601. package/dist/__tests__/render-feature-graph.integration.test.d.ts +0 -2
  602. package/dist/__tests__/render-feature-graph.integration.test.d.ts.map +0 -1
  603. package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts +0 -2
  604. package/dist/__tests__/render-feature-graphics-staging.unit.test.d.ts.map +0 -1
  605. package/dist/__tests__/render-feature-order.unit.test.d.ts +0 -2
  606. package/dist/__tests__/render-feature-order.unit.test.d.ts.map +0 -1
  607. package/dist/__tests__/render-feature-prepared-graphics-recording.unit.test.d.ts +0 -2
  608. package/dist/__tests__/render-feature-prepared-graphics-recording.unit.test.d.ts.map +0 -1
  609. package/dist/__tests__/render-feature-staging.unit.test.d.ts +0 -2
  610. package/dist/__tests__/render-feature-staging.unit.test.d.ts.map +0 -1
  611. package/dist/__tests__/renderer-render-scene-public.test-d.d.ts +0 -2
  612. package/dist/__tests__/renderer-render-scene-public.test-d.d.ts.map +0 -1
  613. package/dist/__tests__/scene-temporal-coverage.unit.test.d.ts +0 -2
  614. package/dist/__tests__/scene-temporal-coverage.unit.test.d.ts.map +0 -1
  615. package/dist/__tests__/sun-snapshot-consumers.test.d.ts +0 -2
  616. package/dist/__tests__/sun-snapshot-consumers.test.d.ts.map +0 -1
  617. package/dist/__tests__/surface-backend-kind-owner.test-d.d.ts +0 -2
  618. package/dist/__tests__/surface-backend-kind-owner.test-d.d.ts.map +0 -1
  619. package/dist/__tests__/taa-history-store.unit.test.d.ts +0 -2
  620. package/dist/__tests__/taa-history-store.unit.test.d.ts.map +0 -1
  621. package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts +0 -2
  622. package/dist/__tests__/temporal-frame-transaction.integration.test.d.ts.map +0 -1
  623. package/dist/__tests__/temporal-inspection.unit.test.d.ts +0 -2
  624. package/dist/__tests__/temporal-inspection.unit.test.d.ts.map +0 -1
  625. package/dist/assets/__tests__/asset-decoders.unit.test.d.ts +0 -2
  626. package/dist/assets/__tests__/asset-decoders.unit.test.d.ts.map +0 -1
  627. package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts +0 -2
  628. package/dist/assets/__tests__/mipmap-generator.unit.test.d.ts.map +0 -1
  629. package/dist/assets/__tests__/render-asset-port.unit.test.d.ts +0 -2
  630. package/dist/assets/__tests__/render-asset-port.unit.test.d.ts.map +0 -1
  631. package/dist/assets/__tests__/resolve-render-asset.unit.test.d.ts +0 -2
  632. package/dist/assets/__tests__/resolve-render-asset.unit.test.d.ts.map +0 -1
  633. package/dist/chunk-DJIMFYX6.mjs +0 -1439
  634. package/dist/chunk-DJIMFYX6.mjs.map +0 -1
  635. package/dist/chunk-F2SIOCRM.mjs +0 -7423
  636. package/dist/chunk-F2SIOCRM.mjs.map +0 -1
  637. package/dist/chunk-JMSB7AR4.mjs +0 -3
  638. package/dist/chunk-JMSB7AR4.mjs.map +0 -1
  639. package/dist/chunk-KHI6K4C6.mjs +0 -659
  640. package/dist/chunk-KHI6K4C6.mjs.map +0 -1
  641. package/dist/chunk-PORZOL2V.mjs +0 -569
  642. package/dist/chunk-PORZOL2V.mjs.map +0 -1
  643. package/dist/chunk-UOJGMDGP.mjs +0 -29913
  644. package/dist/chunk-UOJGMDGP.mjs.map +0 -1
  645. package/dist/components/__tests__/atmosphere-red.test.d.ts +0 -2
  646. package/dist/components/__tests__/atmosphere-red.test.d.ts.map +0 -1
  647. package/dist/components/__tests__/atmosphere.test.d.ts +0 -2
  648. package/dist/components/__tests__/atmosphere.test.d.ts.map +0 -1
  649. package/dist/components/__tests__/fog.test-d.d.ts +0 -2
  650. package/dist/components/__tests__/fog.test-d.d.ts.map +0 -1
  651. package/dist/components/__tests__/fog.test.d.ts +0 -2
  652. package/dist/components/__tests__/fog.test.d.ts.map +0 -1
  653. package/dist/components/atmosphere.d.ts +0 -18
  654. package/dist/components/atmosphere.d.ts.map +0 -1
  655. package/dist/components/environment.d.ts +0 -115
  656. package/dist/components/environment.d.ts.map +0 -1
  657. package/dist/deferred-lighting.d.ts +0 -13
  658. package/dist/deferred-lighting.d.ts.map +0 -1
  659. package/dist/dynamic-texture-store.d.ts +0 -42
  660. package/dist/dynamic-texture-store.d.ts.map +0 -1
  661. package/dist/environment/__tests__/failure-injection.test.d.ts +0 -2
  662. package/dist/environment/__tests__/failure-injection.test.d.ts.map +0 -1
  663. package/dist/environment/__tests__/generation-red.test.d.ts +0 -2
  664. package/dist/environment/__tests__/generation-red.test.d.ts.map +0 -1
  665. package/dist/environment/__tests__/generation.test.d.ts +0 -2
  666. package/dist/environment/__tests__/generation.test.d.ts.map +0 -1
  667. package/dist/environment/__tests__/graph-transaction.test.d.ts +0 -2
  668. package/dist/environment/__tests__/graph-transaction.test.d.ts.map +0 -1
  669. package/dist/environment/__tests__/inspection-red.test.d.ts +0 -2
  670. package/dist/environment/__tests__/inspection-red.test.d.ts.map +0 -1
  671. package/dist/environment/__tests__/lifecycle-evidence.test.d.ts +0 -2
  672. package/dist/environment/__tests__/lifecycle-evidence.test.d.ts.map +0 -1
  673. package/dist/environment/__tests__/pipeline-topology.test.d.ts +0 -2
  674. package/dist/environment/__tests__/pipeline-topology.test.d.ts.map +0 -1
  675. package/dist/environment/__tests__/readiness.test.d.ts +0 -2
  676. package/dist/environment/__tests__/readiness.test.d.ts.map +0 -1
  677. package/dist/environment/__tests__/recovery.test.d.ts +0 -2
  678. package/dist/environment/__tests__/recovery.test.d.ts.map +0 -1
  679. package/dist/environment/__tests__/resize-dispose.test.d.ts +0 -2
  680. package/dist/environment/__tests__/resize-dispose.test.d.ts.map +0 -1
  681. package/dist/environment/__tests__/signature-red.test.d.ts +0 -2
  682. package/dist/environment/__tests__/signature-red.test.d.ts.map +0 -1
  683. package/dist/environment/__tests__/signature.test.d.ts +0 -2
  684. package/dist/environment/__tests__/signature.test.d.ts.map +0 -1
  685. package/dist/environment/descriptors.d.ts +0 -2
  686. package/dist/environment/descriptors.d.ts.map +0 -1
  687. package/dist/environment/extracted-environment.d.ts +0 -53
  688. package/dist/environment/extracted-environment.d.ts.map +0 -1
  689. package/dist/environment/generation.d.ts +0 -62
  690. package/dist/environment/generation.d.ts.map +0 -1
  691. package/dist/environment/gpu-bundle.d.ts +0 -23
  692. package/dist/environment/gpu-bundle.d.ts.map +0 -1
  693. package/dist/environment/graph.d.ts +0 -108
  694. package/dist/environment/graph.d.ts.map +0 -1
  695. package/dist/environment/inspection.d.ts +0 -48
  696. package/dist/environment/inspection.d.ts.map +0 -1
  697. package/dist/environment/lifecycle.d.ts +0 -22
  698. package/dist/environment/lifecycle.d.ts.map +0 -1
  699. package/dist/environment/readiness.d.ts +0 -29
  700. package/dist/environment/readiness.d.ts.map +0 -1
  701. package/dist/environment/signature.d.ts +0 -70
  702. package/dist/environment/signature.d.ts.map +0 -1
  703. package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts +0 -2
  704. package/dist/extract/__tests__/directional-csm-domain.unit.test.d.ts.map +0 -1
  705. package/dist/extract/__tests__/environment-source.test.d.ts +0 -2
  706. package/dist/extract/__tests__/environment-source.test.d.ts.map +0 -1
  707. package/dist/extract/__tests__/schema-readers.unit.test.d.ts +0 -2
  708. package/dist/extract/__tests__/schema-readers.unit.test.d.ts.map +0 -1
  709. package/dist/extract/directional-csm.d.ts +0 -129
  710. package/dist/extract/directional-csm.d.ts.map +0 -1
  711. package/dist/extract/index.d.ts +0 -5
  712. package/dist/extract/index.d.ts.map +0 -1
  713. package/dist/extract/material-interface.d.ts +0 -56
  714. package/dist/extract/material-interface.d.ts.map +0 -1
  715. package/dist/extract/schema-readers.d.ts +0 -20
  716. package/dist/extract/schema-readers.d.ts.map +0 -1
  717. package/dist/features/graph-contribution.d.ts +0 -64
  718. package/dist/features/graph-contribution.d.ts.map +0 -1
  719. package/dist/features/index.d.ts +0 -21
  720. package/dist/features/index.d.ts.map +0 -1
  721. package/dist/features/morph/index.d.ts +0 -3
  722. package/dist/features/morph/index.d.ts.map +0 -1
  723. package/dist/features/morph/morph-bounds.d.ts +0 -42
  724. package/dist/features/morph/morph-bounds.d.ts.map +0 -1
  725. package/dist/features/scene-temporal.d.ts +0 -45
  726. package/dist/features/scene-temporal.d.ts.map +0 -1
  727. package/dist/features/taa-resolve.d.ts +0 -21
  728. package/dist/features/taa-resolve.d.ts.map +0 -1
  729. package/dist/frame-chain.d.ts +0 -14
  730. package/dist/frame-chain.d.ts.map +0 -1
  731. package/dist/gpu-driven/view-reference.d.ts.map +0 -1
  732. package/dist/gpu-resource-store.d.ts.map +0 -1
  733. package/dist/hdrp-cluster-membership.d.ts +0 -2
  734. package/dist/hdrp-cluster-membership.d.ts.map +0 -1
  735. package/dist/hdrp-pipeline.d.ts +0 -36
  736. package/dist/hdrp-pipeline.d.ts.map +0 -1
  737. package/dist/ibl/cubemap-projection.d.ts +0 -23
  738. package/dist/ibl/cubemap-projection.d.ts.map +0 -1
  739. package/dist/ibl/face-uniforms.d.ts +0 -65
  740. package/dist/ibl/face-uniforms.d.ts.map +0 -1
  741. package/dist/mesh-update-errors.d.ts +0 -71
  742. package/dist/mesh-update-errors.d.ts.map +0 -1
  743. package/dist/mipmap-generator.d.ts +0 -39
  744. package/dist/mipmap-generator.d.ts.map +0 -1
  745. package/dist/param-schema-projection-census.d.ts +0 -18
  746. package/dist/param-schema-projection-census.d.ts.map +0 -1
  747. package/dist/persistent-render-scene.d.ts +0 -158
  748. package/dist/persistent-render-scene.d.ts.map +0 -1
  749. package/dist/pipeline/index.d.ts +0 -11
  750. package/dist/pipeline/index.d.ts.map +0 -1
  751. package/dist/pipeline-errors.d.ts +0 -110
  752. package/dist/pipeline-errors.d.ts.map +0 -1
  753. package/dist/prepare/__tests__/schema-readers.unit.test.d.ts +0 -2
  754. package/dist/prepare/__tests__/schema-readers.unit.test.d.ts.map +0 -1
  755. package/dist/prepare/index.d.ts +0 -4
  756. package/dist/prepare/index.d.ts.map +0 -1
  757. package/dist/prepare/schema-readers.d.ts +0 -11
  758. package/dist/prepare/schema-readers.d.ts.map +0 -1
  759. package/dist/record/__tests__/environment-record.test.d.ts +0 -2
  760. package/dist/record/__tests__/environment-record.test.d.ts.map +0 -1
  761. package/dist/record/__tests__/frame-targets.unit.test.d.ts +0 -2
  762. package/dist/record/__tests__/frame-targets.unit.test.d.ts.map +0 -1
  763. package/dist/record/__tests__/membership-timing.unit.test.d.ts +0 -2
  764. package/dist/record/__tests__/membership-timing.unit.test.d.ts.map +0 -1
  765. package/dist/record/__tests__/render-submission.integration.test.d.ts +0 -2
  766. package/dist/record/__tests__/render-submission.integration.test.d.ts.map +0 -1
  767. package/dist/record/__tests__/render-submission.perf.test.d.ts +0 -2
  768. package/dist/record/__tests__/render-submission.perf.test.d.ts.map +0 -1
  769. package/dist/record/__tests__/shadow-submit-mode.unit.test.d.ts +0 -2
  770. package/dist/record/__tests__/shadow-submit-mode.unit.test.d.ts.map +0 -1
  771. package/dist/record/__tests__/view-ubo-layout.unit.test.d.ts +0 -2
  772. package/dist/record/__tests__/view-ubo-layout.unit.test.d.ts.map +0 -1
  773. package/dist/record/frame-observation.d.ts +0 -38
  774. package/dist/record/frame-observation.d.ts.map +0 -1
  775. package/dist/record/index.d.ts +0 -15
  776. package/dist/record/index.d.ts.map +0 -1
  777. package/dist/record/main-pass-skin.d.ts +0 -46
  778. package/dist/record/main-pass-skin.d.ts.map +0 -1
  779. package/dist/record/main-pass-sprite.d.ts +0 -69
  780. package/dist/record/main-pass-sprite.d.ts.map +0 -1
  781. package/dist/record/material-payload.d.ts +0 -43
  782. package/dist/record/material-payload.d.ts.map +0 -1
  783. package/dist/record/material-slot-plan.d.ts +0 -26
  784. package/dist/record/material-slot-plan.d.ts.map +0 -1
  785. package/dist/record/membership-timing.d.ts +0 -232
  786. package/dist/record/membership-timing.d.ts.map +0 -1
  787. package/dist/record/shadow-caster-uniform.d.ts +0 -8
  788. package/dist/record/shadow-caster-uniform.d.ts.map +0 -1
  789. package/dist/record/shadow-submit-mode.d.ts +0 -66
  790. package/dist/record/shadow-submit-mode.d.ts.map +0 -1
  791. package/dist/render-dispatch-membership.d.ts +0 -47
  792. package/dist/render-dispatch-membership.d.ts.map +0 -1
  793. package/dist/render-pipeline-context.d.ts +0 -289
  794. package/dist/render-pipeline-context.d.ts.map +0 -1
  795. package/dist/render-pipeline-target.d.ts +0 -16
  796. package/dist/render-pipeline-target.d.ts.map +0 -1
  797. package/dist/render-scene-projection.d.ts +0 -174
  798. package/dist/render-scene-projection.d.ts.map +0 -1
  799. package/dist/render-system-fold.d.ts +0 -266
  800. package/dist/render-system-fold.d.ts.map +0 -1
  801. package/dist/renderer/asset-service.d.ts +0 -10
  802. package/dist/renderer/asset-service.d.ts.map +0 -1
  803. package/dist/renderer/backend-selection.d.ts.map +0 -1
  804. package/dist/renderer/environment-classify.d.ts +0 -6
  805. package/dist/renderer/environment-classify.d.ts.map +0 -1
  806. package/dist/renderer/environment-error.d.ts +0 -13
  807. package/dist/renderer/environment-error.d.ts.map +0 -1
  808. package/dist/renderer/material/pipeline-projection.d.ts +0 -91
  809. package/dist/renderer/material/pipeline-projection.d.ts.map +0 -1
  810. package/dist/renderer/renderer-factory.d.ts +0 -289
  811. package/dist/renderer/renderer-factory.d.ts.map +0 -1
  812. package/dist/renderer.d.ts +0 -771
  813. package/dist/renderer.d.ts.map +0 -1
  814. package/dist/scene-utils/collect-subtree.d.ts +0 -11
  815. package/dist/scene-utils/collect-subtree.d.ts.map +0 -1
  816. package/dist/ssao-data.d.ts +0 -34
  817. package/dist/ssao-data.d.ts.map +0 -1
  818. package/dist/surface-format.d.ts +0 -10
  819. package/dist/surface-format.d.ts.map +0 -1
  820. package/dist/taa-history-store.d.ts +0 -88
  821. package/dist/taa-history-store.d.ts.map +0 -1
  822. package/dist/temporal-coverage.d.ts +0 -35
  823. package/dist/temporal-coverage.d.ts.map +0 -1
  824. package/dist/temporal-frame-transaction.d.ts +0 -92
  825. package/dist/temporal-frame-transaction.d.ts.map +0 -1
  826. package/dist/temporal-inspection.d.ts +0 -57
  827. package/dist/temporal-inspection.d.ts.map +0 -1
  828. package/dist/temporal-view.d.ts +0 -43
  829. package/dist/temporal-view.d.ts.map +0 -1
  830. package/dist/tilemap/resolve-tileset-runtime.d.ts +0 -23
  831. package/dist/tilemap/resolve-tileset-runtime.d.ts.map +0 -1
  832. package/dist/urp-pipeline.d.ts +0 -4
  833. package/dist/urp-pipeline.d.ts.map +0 -1
  834. package/src/__tests__/analytic-sky-contract.test.ts +0 -27
  835. package/src/__tests__/analytic-sky-falsify-carriers.mjs +0 -43
  836. package/src/__tests__/analytic-sky-falsify.test.ts +0 -94
  837. package/src/__tests__/assets-runtime-handoff.integration.test.ts +0 -36
  838. package/src/__tests__/backend-selection.integration.test.ts +0 -11
  839. package/src/__tests__/camera-temporal.test-d.ts +0 -8
  840. package/src/__tests__/camera-temporal.test.ts +0 -188
  841. package/src/__tests__/directional-shadow-probe-atlas-layout.unit.test.ts +0 -18
  842. package/src/__tests__/environment-inspection.test.ts +0 -45
  843. package/src/__tests__/fog-ai-user.fixture.ts +0 -350
  844. package/src/__tests__/fog-custom-render-feature.fixture.ts +0 -33
  845. package/src/__tests__/fog-custom-render-feature.integration.test.ts +0 -76
  846. package/src/__tests__/fog-inspection.integration.test.ts +0 -127
  847. package/src/__tests__/fog-owner-state.integration.test.ts +0 -112
  848. package/src/__tests__/fog-pipeline-topology.integration.test.ts +0 -93
  849. package/src/__tests__/fog-public-surface.integration.test.ts +0 -60
  850. package/src/__tests__/fog-ray-contract.integration.test.ts +0 -73
  851. package/src/__tests__/fog-source-absence.integration.test.ts +0 -51
  852. package/src/__tests__/fog-temporal.integration.test.ts +0 -115
  853. package/src/__tests__/frame-chain.unit.test.ts +0 -26
  854. package/src/__tests__/gpu-scene-field-type-owner.test-d.ts +0 -27
  855. package/src/__tests__/hdrp-pipeline.unit.test.ts +0 -100
  856. package/src/__tests__/ibl/ibl-fallback.unit.test.ts +0 -23
  857. package/src/__tests__/material-derived-error-stop-draw.integration.test.ts +0 -69
  858. package/src/__tests__/material-derived-payload.integration.test.ts +0 -164
  859. package/src/__tests__/materials.unit.test.ts +0 -25
  860. package/src/__tests__/param-schema-projection-census.unit.test.ts +0 -40
  861. package/src/__tests__/persistent-render-scene.unit.test.ts +0 -1311
  862. package/src/__tests__/pipeline-error-policy-owner.unit.test.ts +0 -167
  863. package/src/__tests__/pipeline-pass-trace.test.ts +0 -92
  864. package/src/__tests__/pipeline-stage-owner.test-d.ts +0 -13
  865. package/src/__tests__/plugin.test.ts +0 -25
  866. package/src/__tests__/prepared-graphics-backend-matrix.unit.test.ts +0 -129
  867. package/src/__tests__/prepared-graphics-resolver-recording.unit.test.ts +0 -180
  868. package/src/__tests__/public-pipeline-id.test-d.ts +0 -6
  869. package/src/__tests__/render-dispatch-membership.unit.test.ts +0 -117
  870. package/src/__tests__/render-feature-construction.unit.test.ts +0 -124
  871. package/src/__tests__/render-feature-error-code-owner.test-d.ts +0 -27
  872. package/src/__tests__/render-feature-gpu-buffer-usage-owner.test-d.ts +0 -46
  873. package/src/__tests__/render-feature-graph.integration.test.ts +0 -205
  874. package/src/__tests__/render-feature-graphics-staging.unit.test.ts +0 -200
  875. package/src/__tests__/render-feature-order.unit.test.ts +0 -66
  876. package/src/__tests__/render-feature-prepared-graphics-recording.unit.test.ts +0 -107
  877. package/src/__tests__/render-feature-staging.unit.test.ts +0 -94
  878. package/src/__tests__/renderer-render-scene-public.test-d.ts +0 -27
  879. package/src/__tests__/scene-temporal-coverage.unit.test.ts +0 -259
  880. package/src/__tests__/sun-snapshot-consumers.test.ts +0 -35
  881. package/src/__tests__/surface-backend-kind-owner.test-d.ts +0 -42
  882. package/src/__tests__/taa-history-store.unit.test.ts +0 -196
  883. package/src/__tests__/temporal-frame-transaction.integration.test.ts +0 -537
  884. package/src/__tests__/temporal-inspection.unit.test.ts +0 -138
  885. package/src/assets/__tests__/asset-decoders.unit.test.ts +0 -92
  886. package/src/assets/__tests__/mipmap-generator.unit.test.ts +0 -52
  887. package/src/assets/__tests__/render-asset-port.unit.test.ts +0 -54
  888. package/src/assets/__tests__/resolve-render-asset.unit.test.ts +0 -47
  889. package/src/components/__tests__/atmosphere-red.test.ts +0 -51
  890. package/src/components/__tests__/atmosphere.test.ts +0 -79
  891. package/src/components/__tests__/fog.test-d.ts +0 -49
  892. package/src/components/__tests__/fog.test.ts +0 -60
  893. package/src/components/atmosphere.ts +0 -64
  894. package/src/deferred-lighting.ts +0 -92
  895. package/src/dynamic-texture-store.ts +0 -111
  896. package/src/environment/README.md +0 -76
  897. package/src/environment/__tests__/failure-injection.test.ts +0 -50
  898. package/src/environment/__tests__/generation-red.test.ts +0 -64
  899. package/src/environment/__tests__/generation.test.ts +0 -37
  900. package/src/environment/__tests__/graph-transaction.test.ts +0 -85
  901. package/src/environment/__tests__/inspection-red.test.ts +0 -53
  902. package/src/environment/__tests__/lifecycle-evidence.test.ts +0 -40
  903. package/src/environment/__tests__/pipeline-topology.test.ts +0 -33
  904. package/src/environment/__tests__/readiness.test.ts +0 -42
  905. package/src/environment/__tests__/recovery.test.ts +0 -62
  906. package/src/environment/__tests__/resize-dispose.test.ts +0 -30
  907. package/src/environment/__tests__/signature-red.test.ts +0 -45
  908. package/src/environment/__tests__/signature.test.ts +0 -60
  909. package/src/environment/descriptors.ts +0 -7
  910. package/src/environment/extracted-environment.ts +0 -239
  911. package/src/environment/generation.ts +0 -158
  912. package/src/environment/gpu-bundle.ts +0 -144
  913. package/src/environment/graph.ts +0 -588
  914. package/src/environment/inspection.ts +0 -107
  915. package/src/environment/lifecycle.ts +0 -124
  916. package/src/environment/readiness.ts +0 -76
  917. package/src/environment/signature.ts +0 -185
  918. package/src/extract/__tests__/directional-csm-domain.unit.test.ts +0 -391
  919. package/src/extract/__tests__/environment-source.test.ts +0 -105
  920. package/src/extract/__tests__/schema-readers.unit.test.ts +0 -16
  921. package/src/extract/directional-csm.ts +0 -959
  922. package/src/extract/index.ts +0 -10
  923. package/src/extract/material-interface.ts +0 -604
  924. package/src/extract/schema-readers.ts +0 -27
  925. package/src/features/graph-contribution.ts +0 -577
  926. package/src/features/index.ts +0 -100
  927. package/src/features/morph/index.ts +0 -24
  928. package/src/features/morph/morph-bounds.ts +0 -123
  929. package/src/features/scene-temporal.ts +0 -274
  930. package/src/features/taa-resolve.ts +0 -244
  931. package/src/frame-chain.ts +0 -21
  932. package/src/hdrp-cluster-membership.ts +0 -70
  933. package/src/ibl/cubemap-projection.ts +0 -60
  934. package/src/ibl/face-uniforms.ts +0 -150
  935. package/src/mesh-update-errors.ts +0 -113
  936. package/src/mipmap-generator.ts +0 -244
  937. package/src/param-schema-projection-census.ts +0 -73
  938. package/src/persistent-render-scene.ts +0 -1752
  939. package/src/pipeline/index.ts +0 -40
  940. package/src/pipeline-errors.ts +0 -172
  941. package/src/prepare/__tests__/schema-readers.unit.test.ts +0 -16
  942. package/src/prepare/index.ts +0 -8
  943. package/src/prepare/schema-readers.ts +0 -20
  944. package/src/record/__tests__/environment-record.test.ts +0 -35
  945. package/src/record/__tests__/frame-targets.unit.test.ts +0 -54
  946. package/src/record/__tests__/membership-timing.unit.test.ts +0 -524
  947. package/src/record/__tests__/render-submission.integration.test.ts +0 -76
  948. package/src/record/__tests__/render-submission.perf.test.ts +0 -141
  949. package/src/record/__tests__/shadow-submit-mode.unit.test.ts +0 -88
  950. package/src/record/__tests__/view-ubo-layout.unit.test.ts +0 -101
  951. package/src/record/frame-observation.ts +0 -122
  952. package/src/record/index.ts +0 -15
  953. package/src/record/main-pass-skin.ts +0 -51
  954. package/src/record/main-pass-sprite.ts +0 -166
  955. package/src/record/material-payload.ts +0 -292
  956. package/src/record/material-slot-plan.ts +0 -68
  957. package/src/record/membership-timing.ts +0 -1012
  958. package/src/record/shadow-caster-uniform.ts +0 -37
  959. package/src/record/shadow-submit-mode.ts +0 -277
  960. package/src/render-dispatch-membership.ts +0 -155
  961. package/src/render-pipeline-context.ts +0 -332
  962. package/src/render-pipeline-target.ts +0 -96
  963. package/src/render-scene-projection.ts +0 -1738
  964. package/src/render-system-fold.ts +0 -531
  965. package/src/renderer/asset-service.ts +0 -32
  966. package/src/renderer/backend-selection.ts +0 -121
  967. package/src/renderer/environment-classify.ts +0 -30
  968. package/src/renderer/environment-error.ts +0 -19
  969. package/src/renderer/material/pipeline-projection.ts +0 -140
  970. package/src/renderer.ts +0 -940
  971. package/src/scene-utils/collect-subtree.ts +0 -40
  972. package/src/ssao-data.ts +0 -106
  973. package/src/surface-format.ts +0 -37
  974. package/src/taa-history-store.ts +0 -429
  975. package/src/temporal-coverage.ts +0 -106
  976. package/src/temporal-frame-transaction.ts +0 -301
  977. package/src/temporal-inspection.ts +0 -194
  978. package/src/temporal-view.ts +0 -174
  979. package/src/tilemap/resolve-tileset-runtime.ts +0 -72
@@ -1,6 +1,7 @@
1
1
  // @forgeax/engine-runtime - RenderSystem record stage: main-pass-material.
2
2
  // Extracted from render-system-record.ts (feat-20260704 M3/w17, pure move).
3
3
 
4
+ import { resolveAssetHandle } from '@forgeax/engine-assets-runtime';
4
5
  import type { EntityHandle, World } from '@forgeax/engine-ecs';
5
6
  import {
6
7
  VIDEO_ELEMENT_PROVIDER_KEY,
@@ -11,62 +12,68 @@ import {
11
12
  type BindGroupEntry,
12
13
  type BindGroupLayout,
13
14
  type Buffer,
14
- err,
15
- ok,
16
15
  type RenderPipeline,
17
- type Result,
18
16
  RhiError,
19
17
  type Sampler,
18
+ type TextureView,
20
19
  } from '@forgeax/engine-rhi';
21
- import { DEFAULT_STANDARD_PBR_PARAM_SCHEMA } from '@forgeax/engine-shader';
20
+ import {
21
+ DEFAULT_MSDF_TEXT_PARAM_SCHEMA,
22
+ DEFAULT_SPRITE_PARAM_SCHEMA,
23
+ DEFAULT_UNLIT_PARAM_SCHEMA,
24
+ } from '@forgeax/engine-shader';
22
25
  import type {
23
- DerivedMaterialInterface,
24
26
  Handle,
25
27
  ImageError,
26
28
  MaterialRenderState,
27
- PassKind,
29
+ ParamSchemaEntry,
28
30
  PrimitiveTopology,
29
31
  SamplerAsset,
30
32
  TextureAsset,
31
33
  } from '@forgeax/engine-types';
32
- import { derive, handleSlot } from '@forgeax/engine-types';
33
- import { resolveRenderAsset } from '../assets/resolve-render-asset';
34
- import type { DynamicTextureStore } from '../dynamic-texture-store';
34
+ import { derive, handleSlot, resolveMaterialTextureCoordinates } from '@forgeax/engine-types';
35
+ import type { GpuResidencyCache } from '../device/gpu-residency';
35
36
  import { VideoUploadUnsupportedError } from '../errors/render';
36
- import type { GpuResourceStore } from '../gpu-resource-store';
37
37
  import {
38
38
  assembleMaterialWithSkylightEntries,
39
+ type EmissiveAoBindGroupResources,
39
40
  type SkylightBindGroupResources,
40
41
  } from '../ibl/skylight-bind-group';
41
- import type { PipelineState, RenderSystemRuntime } from '../render-system';
42
+ import { isStandardPbrMaterialShader } from '../pbr-pipeline';
43
+ import { deriveTextureExtent } from '../render-data';
42
44
  import type { MaterialSnapshot } from '../render-system-extract';
43
- import type { MaterialRenderProjection } from '../renderer/material/assembly.js';
44
- import {
45
- type MaterialDrawRoute,
46
- type MaterialPipelineMiss,
47
- type MaterialPipelineReady,
48
- type MaterialReadiness,
49
- type MaterialRenderReady,
50
- routeMaterialDraw,
51
- routeMaterialPipeline,
52
- } from '../renderer/material/pipeline-projection.js';
53
45
  import type { BindGroupCounts, MaterialBgAssemblyCacheEntry } from './frame-snapshot';
54
- import { derivedParamSchema } from './material-payload';
55
-
56
- const DEFAULT_STANDARD_PBR_DERIVED_INTERFACE = derive(DEFAULT_STANDARD_PBR_PARAM_SCHEMA);
46
+ import { extractEntryResourceHandle, getOrCreatePerEntity } from './mesh-ssbo';
47
+ import {
48
+ type PipelineState,
49
+ type RenderSystemRuntime,
50
+ STANDARD_PBR_UBO_SIZE,
51
+ } from './render-context';
57
52
 
58
- export {
59
- applyParamSnapshotToUbo,
60
- writeMaterialSnapshotPayload,
61
- } from './material-payload';
53
+ // Param schemas are immutable runtime contracts: the shader registry installs
54
+ // them once and material snapshots only retain the same array reference. Keep
55
+ // the expensive pure derivation on that identity so the per-submesh record
56
+ // path does not rebuild the same UBO/texture maps for every visible material
57
+ // on every frame. A WeakMap keeps this optimization bounded by the lifetime of
58
+ // the schema owner and adds no global strong-reference lifetime.
59
+ const DERIVED_PARAM_SCHEMA_CACHE = new WeakMap<
60
+ readonly ParamSchemaEntry[],
61
+ ReturnType<typeof derive>
62
+ >();
62
63
 
63
- import { extractEntryResourceHandle, getOrCreatePerEntity } from './mesh-ssbo';
64
+ function derivedParamSchema(schema: readonly ParamSchemaEntry[]): ReturnType<typeof derive> {
65
+ const cached = DERIVED_PARAM_SCHEMA_CACHE.get(schema);
66
+ if (cached !== undefined) return cached;
67
+ const derived = derive(schema);
68
+ DERIVED_PARAM_SCHEMA_CACHE.set(schema, derived);
69
+ return derived;
70
+ }
64
71
 
65
72
  // feat-20260601-customizable-render-pipeline-seam M2 / w12: the former
66
73
  // `RecordPassContext` (26-field full surface, including the `internals` kitchen-sink and
67
74
  // the 0-consumed `skyboxCount` residual) is DELETED. The per-frame shared state injected
68
75
  // into the render-graph pass execute closures is now the clean `RenderPipelineContext`
69
- // (defined in `render-pipeline-context.ts`): `internals` is gone (replaced by the named
76
+ // (defined in `render-system.ts`): `internals` is gone (replaced by the named
70
77
  // `assets` / `store` / `pipelineState` / `runtime` surfaces) so a pipeline author cannot
71
78
  // reach the runtime kitchen-sink through the public ctx (AC-08). The graph is
72
79
  // `RenderGraph<RenderPipelineContext>` so `execute(ctx)` forwards the object to each
@@ -84,6 +91,24 @@ import { extractEntryResourceHandle, getOrCreatePerEntity } from './mesh-ssbo';
84
91
  // the last-used views for bindgroup-invalidation self-checks (D-3 physical texture
85
92
  // identity), but the graph owns the create/destroy lifecycle.
86
93
 
94
+ /**
95
+ * Keep line primitives visible when they share a depth plane with filled
96
+ * geometry. The same topology policy is consumed by the CPU and GPU-driven
97
+ * raster lanes so a mixed mesh does not change appearance when ownership
98
+ * moves between them.
99
+ */
100
+ export function geometryRenderStateForTopology(
101
+ topology: PrimitiveTopology,
102
+ renderState: MaterialRenderState | undefined,
103
+ ): MaterialRenderState | undefined {
104
+ if (topology !== 'line-list' && topology !== 'line-strip') return renderState;
105
+ return {
106
+ ...renderState,
107
+ depthWriteEnabled: false,
108
+ depthCompare: 'less-equal',
109
+ };
110
+ }
111
+
87
112
  /**
88
113
  * feat-20260604-learn-render-4.10-anti-aliasing-msaa M2 / w9: pick the static
89
114
  * unlit geometry pipeline handle for a (tonemapActive x msaaActive)
@@ -117,31 +142,6 @@ export function selectGeometryPipeline(
117
142
  return msaaActive ? pipelineState.unlitPipelineMsaa : pipelineState.unlitPipeline;
118
143
  }
119
144
 
120
- /**
121
- * Resolve a cooked material projection for record. The record stage receives
122
- * the already-resolved projection and an immutable artifact lookup; it never
123
- * follows parent GUIDs, reads authored material state, or invokes a compiler.
124
- * A missing or mismatched artifact is an explicit route miss so callers cannot
125
- * silently substitute a default shader.
126
- */
127
- export function selectCookedMaterialPipelineForRender(args: {
128
- readonly projection: MaterialRenderProjection;
129
- readonly lookupArtifact: (
130
- key: string,
131
- ) => import('@forgeax/engine-shader').MaterialRuntimeArtifact | undefined;
132
- }): MaterialPipelineReady | MaterialPipelineMiss {
133
- return routeMaterialPipeline(args);
134
- }
135
-
136
- /** Route a record-stage draw through the canonical readiness result. */
137
- export function selectMaterialDrawForRender<TPipeline>(args: {
138
- readonly readiness: MaterialReadiness;
139
- readonly buildPipeline: (ready: MaterialRenderReady) => TPipeline;
140
- readonly reportedDiagnosticKeys: Set<string>;
141
- }): MaterialDrawRoute<TPipeline> {
142
- return routeMaterialDraw(args);
143
- }
144
-
145
145
  /**
146
146
  * feat-city-glb Bug 5 (per-submesh transparency): true when EVERY submesh
147
147
  * material of the entity is transparent (blend). Used by the geometry pass to
@@ -189,79 +189,7 @@ export function entityHasTransparentSubmesh(source: {
189
189
  }
190
190
 
191
191
  /**
192
- * Selects the PSO for a transparent (or any generic materialShaderId) draw
193
- * via the runtime's per-MaterialShader pipeline cache. Returns a
194
- * structured RhiError on cache miss / pending build -- the caller MUST
195
- * surface this via the error registry rather than substituting a silent
196
- * fallback (charter P3 explicit failure).
197
- *
198
- * The `getMaterialShaderPipeline` argument mirrors
199
- * {@link RenderSystemRuntime.getMaterialShaderPipeline}'s 9-arg signature
200
- * but is injected so the helper is unit-testable with a plain
201
- * `() => null` stand-in. The helper threads only the inputs the caller
202
- * already has on the dispatch entry -- it never reads from
203
- * MaterialAsset internals (plan-strategy section 5.6 gate R-H).
204
- *
205
- * @internal
206
- */
207
- export function selectMaterialPipelineForRender(args: {
208
- readonly materialShaderId: string;
209
- readonly isHdr: boolean;
210
- readonly renderState?: MaterialRenderState | undefined;
211
- readonly topology?: PrimitiveTopology | undefined;
212
- readonly indexFormat?: 'uint16' | 'uint32' | undefined;
213
- readonly variantSet?: string | undefined;
214
- readonly sampleCount?: number | undefined;
215
- readonly getMaterialShaderPipeline:
216
- | ((
217
- materialShaderId: string,
218
- isHdr: boolean,
219
- renderState?: MaterialRenderState,
220
- topology?: PrimitiveTopology,
221
- indexFormat?: 'uint16' | 'uint32',
222
- variantSet?: string,
223
- passKind?: PassKind,
224
- meshAttributes?: import('@forgeax/engine-types').VertexAttributeMap,
225
- sampleCount?: number,
226
- ) => RenderPipeline | null)
227
- | undefined;
228
- }): Result<RenderPipeline, RhiError> {
229
- if (args.getMaterialShaderPipeline === undefined) {
230
- return err(
231
- new RhiError({
232
- code: 'internal-error',
233
- expected: `runtime.getMaterialShaderPipeline registered before draw of ${args.materialShaderId}`,
234
- hint: `material shader ${args.materialShaderId} has no resolver; the renderer was not initialised with a pipeline cache`,
235
- }),
236
- );
237
- }
238
- const pipeline = args.getMaterialShaderPipeline(
239
- args.materialShaderId,
240
- args.isHdr,
241
- args.renderState,
242
- args.topology,
243
- args.indexFormat,
244
- args.variantSet,
245
- undefined, // passKind defaults to 'forward'
246
- undefined, // meshAttributes -- transparent path uses the default vertex layout
247
- args.sampleCount,
248
- );
249
- if (pipeline === null) {
250
- return err(
251
- new RhiError({
252
- code: 'internal-error',
253
- expected: `pipeline cache hit for ${args.materialShaderId} (renderState=${args.renderState ? 'set' : 'unset'}, isHdr=${args.isHdr})`,
254
- hint: `material shader pipeline ${args.materialShaderId} missed the runtime cache; the underlying shader-module build may still be pending, or the id is not registered in ShaderRegistry`,
255
- }),
256
- );
257
- }
258
- return ok(pipeline);
259
- }
260
-
261
- // === end feat-20260625 M2 / w7 transparent-aware helpers ========================
262
-
263
- /**
264
- * feat-20260601-gpu-resource-store-extraction M1 / D-9: resolve a texture's
192
+ * feat-20260601-device/gpu-residency-extraction M1 / D-9: resolve a texture's
265
193
  * GPU view through the pull-model residency store. The three steps replace the
266
194
  * pre-extraction single-call accessor on the registry:
267
195
  * 1. fetch the TextureAsset POD off the registry (CPU; registry keeps PODs)
@@ -281,13 +209,12 @@ function isImageError(error: unknown): error is ImageError {
281
209
 
282
210
  export function residentTextureView(
283
211
  world: World,
284
- store: GpuResourceStore,
212
+ store: GpuResidencyCache,
285
213
  runtime: RenderSystemRuntime,
286
214
  handle: Handle<'TextureAsset', 'shared'>,
287
- worldId: number = 0,
288
- // biome-ignore lint/suspicious/noExplicitAny: opaque GPU texture-view return
289
- ): any | undefined {
290
- const podRes = resolveRenderAsset<TextureAsset>(world, handle);
215
+ worldId: World | number = world,
216
+ ): TextureView | undefined {
217
+ const podRes = resolveAssetHandle<TextureAsset>(world, handle);
291
218
  if (!podRes.ok) return undefined;
292
219
  const residentRes = store.ensureResident(handle, podRes.value, worldId);
293
220
  if (!residentRes.ok) {
@@ -304,13 +231,14 @@ export function residentTextureView(
304
231
 
305
232
  function residentSampler(
306
233
  world: World,
307
- store: GpuResourceStore,
234
+ store: GpuResidencyCache,
308
235
  runtime: RenderSystemRuntime,
309
236
  handle: Handle<'SamplerAsset', 'shared'>,
237
+ worldId: World | number = world,
310
238
  ): Sampler | undefined {
311
- const podRes = resolveRenderAsset<SamplerAsset>(world, handle);
239
+ const podRes = resolveAssetHandle<SamplerAsset>(world, handle);
312
240
  if (!podRes.ok) return undefined;
313
- const residentRes = store.ensureSamplerResident(handle, podRes.value);
241
+ const residentRes = store.ensureSamplerResident(handle, podRes.value, worldId);
314
242
  if (!residentRes.ok) {
315
243
  runtime.errorRegistry.fire(residentRes.error);
316
244
  return undefined;
@@ -327,7 +255,7 @@ function residentSampler(
327
255
  // D-1) for this entity's HTMLVideoElement, upload its current frame via
328
256
  // `store.uploadFrame` (copyExternalImageToTexture), and return the resulting
329
257
  // view. When the provider is absent / returns no element / the element has no
330
- // decodable dimensions yet, fall back to any previously-uploaded view and
258
+ // decodable dimensions yet, fall back to a previously-uploaded view and
331
259
  // finally to `undefined` (caller binds the default view this frame — charter
332
260
  // P3 graceful, no garbage sampling). A failed GPU upload fires the structured
333
261
  // RhiError on the engine channel and degrades to the default view.
@@ -336,6 +264,8 @@ function residentSampler(
336
264
  // GPUExternalTexture branch is a reserved hook (OOS-5) — when it ever becomes
337
265
  // available the upload would route there. Today it is always false so the
338
266
  // general copyExternalImageToTexture path is the only one taken.
267
+ type DynamicTextureStore = import('@forgeax/engine-assets-runtime').DynamicTextureStore;
268
+
339
269
  type VideoUploadFailureEpisodes = Map<number, Set<number>>;
340
270
 
341
271
  // The store is renderer-owned, so this keeps one failure episode per
@@ -387,13 +317,12 @@ export function videoTextureView(
387
317
  entityKey: number,
388
318
  clip: Handle<'VideoAsset', 'shared'>,
389
319
  highPerfAvailable: boolean,
390
- // biome-ignore lint/suspicious/noExplicitAny: opaque GPU texture-view return
391
- ): any | undefined {
320
+ ): TextureView | undefined {
392
321
  if (store === undefined) return undefined;
393
322
  const provider = world.hasResource(VIDEO_ELEMENT_PROVIDER_KEY)
394
323
  ? world.getResource<VideoElementProvider>(VIDEO_ELEMENT_PROVIDER_KEY)
395
324
  : undefined;
396
- const element = provider?.getElement(entityKey as unknown as EntityHandle, clip);
325
+ const element = provider?.getElement(entityKey as EntityHandle, clip);
397
326
  // AC-10 double-miss: a VideoPlayer entity can reach NEITHER upload path this
398
327
  // frame — no host HTMLVideoElement (general copyExternalImageToTexture path)
399
328
  // AND no high-perf GPUExternalTexture path. This is the genuine "this backend
@@ -436,18 +365,193 @@ export function videoTextureView(
436
365
  return uploaded.value;
437
366
  }
438
367
 
368
+ // feat-20260621-learn-render-5-5-parallax M2 / w8 (D-3): the built-in
369
+ // standard-PBR user-region texture field order, used when the shader is not
370
+ // resolvable through getParamSchema (cross-worktree late-register). Mirrors
371
+ // derive(default-standard-pbr).textureFieldNames.
372
+ export const BUILTIN_USER_REGION_TEXTURE_FIELDS: readonly string[] = [
373
+ 'baseColorTexture',
374
+ 'metallicRoughnessTexture',
375
+ 'normalTexture',
376
+ 'specularTintTexture',
377
+ 'emissiveTexture',
378
+ 'occlusionTexture',
379
+ ];
380
+
381
+ const LEGACY_MATERIAL_TEXTURE_SCALE_OFFSET = 80;
382
+ const STANDARD_PBR_TEXTURE_SCALE_OFFSET = 96;
383
+ const MATERIAL_TEXTURE_SCALE_FIELDS = [
384
+ 'baseColorTexture',
385
+ 'metallicRoughnessTexture',
386
+ 'normalTexture',
387
+ 'specularTintTexture',
388
+ 'emissiveTexture',
389
+ 'occlusionTexture',
390
+ ] as const;
391
+ const LEGACY_MATERIAL_TEXTURE_SCALE_FIELDS = [
392
+ 'baseColorTexture',
393
+ 'metallicRoughnessTexture',
394
+ 'normalTexture',
395
+ 'emissiveTexture',
396
+ 'occlusionTexture',
397
+ ] as const;
398
+ const STANDARD_PBR_TEXTURE_COORDINATE_OFFSET = 96;
399
+ const STANDARD_PBR_TEXTURE_COORDINATE_STRIDE = 8;
400
+ const DEFAULT_LEGACY_TEXTURE_SCALES = new Float32Array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1]);
401
+ const DEFAULT_STANDARD_TEXTURE_COORDINATES = new Float32Array([
402
+ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0,
403
+ 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1,
404
+ ]);
405
+
406
+ /** Derives the logical-content UV scale for an uploaded material texture. */
407
+ export function materialTextureUvScale(
408
+ texture: Pick<TextureAsset, 'width' | 'height' | 'format'> | undefined,
409
+ ): readonly [number, number] {
410
+ if (texture === undefined) return [1, 1];
411
+ return deriveTextureExtent(texture.format, texture.width, texture.height).uvScale;
412
+ }
413
+
414
+ function materialTextureForField(
415
+ material: MaterialSnapshot,
416
+ field: string,
417
+ ): Handle<'TextureAsset', 'shared'> | undefined {
418
+ if (field === 'emissiveTexture') return material.emissiveTexture;
419
+ if (field === 'occlusionTexture') return material.occlusionTexture;
420
+ return material.textureHandles?.get(field);
421
+ }
422
+
423
+ /**
424
+ * Appends the engine-owned scale for every built-in material texture binding.
425
+ * Asset dimensions remain logical; this is the sole record-stage projection
426
+ * from a bound texture asset to its shader sampling coordinates.
427
+ */
428
+ type MaterialUboPayload = ArrayBuffer | Uint8Array | Float32Array;
429
+
430
+ function materialUboFloatView(payload: MaterialUboPayload): Float32Array {
431
+ if (payload instanceof Float32Array) return payload;
432
+ return payload instanceof Uint8Array
433
+ ? new Float32Array(payload.buffer, payload.byteOffset, payload.byteLength / 4)
434
+ : new Float32Array(payload);
435
+ }
436
+
437
+ export function applyMaterialTextureUvScales(
438
+ payload: MaterialUboPayload,
439
+ material: MaterialSnapshot,
440
+ world: World,
441
+ ): void {
442
+ const f32 = materialUboFloatView(payload);
443
+ const coordinateSchema = materialCoordinateSchema(material);
444
+ if (coordinateSchema !== undefined) {
445
+ const coordinateRecords = derivedParamSchema(coordinateSchema).coordinateRecords;
446
+ for (const record of coordinateRecords) {
447
+ const field = record.parameter;
448
+ const handle = materialTextureForField(material, field);
449
+ const resolvedTexture =
450
+ handle === undefined ? undefined : resolveAssetHandle<TextureAsset>(world, handle);
451
+ const texture = resolvedTexture?.ok === true ? resolvedTexture.value : undefined;
452
+ const [u, v] = materialTextureUvScale(texture);
453
+ const coordinates = resolveMaterialTextureCoordinates(
454
+ material.textureCoordinates?.get(field),
455
+ );
456
+ const offset = record.offset / 4;
457
+ f32[offset] = coordinates.transform.offset[0];
458
+ f32[offset + 1] = coordinates.transform.offset[1];
459
+ f32[offset + 2] = coordinates.transform.scale[0];
460
+ f32[offset + 3] = coordinates.transform.scale[1];
461
+ f32[offset + 4] = coordinates.set;
462
+ f32[offset + 5] = coordinates.transform.rotation;
463
+ f32[offset + 6] = u;
464
+ f32[offset + 7] = v;
465
+ }
466
+ return;
467
+ }
468
+ // Standard PBR grew two authored coat fields before the engine-owned UV
469
+ // tail. Sprite, sprite-lit, unlit, and text keep their own 80-byte tail
470
+ // position because their WGSL layouts do not carry clearcoat.
471
+ const textureScaleOffset = isStandardPbrMaterialShader(material.materialShaderId)
472
+ ? STANDARD_PBR_TEXTURE_SCALE_OFFSET
473
+ : LEGACY_MATERIAL_TEXTURE_SCALE_OFFSET;
474
+ const isStandardPbr = textureScaleOffset === STANDARD_PBR_TEXTURE_SCALE_OFFSET;
475
+ const hasTextureMetadata =
476
+ material.textureCoordinates !== undefined ||
477
+ material.textureHandles !== undefined ||
478
+ material.videoTextureFields !== undefined ||
479
+ material.baseColorTexture !== undefined ||
480
+ material.metallicRoughnessTexture !== undefined ||
481
+ material.normalTexture !== undefined ||
482
+ material.emissiveTexture !== undefined ||
483
+ material.occlusionTexture !== undefined;
484
+ if (!hasTextureMetadata) {
485
+ f32.set(
486
+ isStandardPbr ? DEFAULT_STANDARD_TEXTURE_COORDINATES : DEFAULT_LEGACY_TEXTURE_SCALES,
487
+ textureScaleOffset / 4,
488
+ );
489
+ return;
490
+ }
491
+ const fields = isStandardPbr
492
+ ? MATERIAL_TEXTURE_SCALE_FIELDS
493
+ : LEGACY_MATERIAL_TEXTURE_SCALE_FIELDS;
494
+ for (let index = 0; index < fields.length; index++) {
495
+ const field = fields[index];
496
+ if (field === undefined) continue;
497
+ const handle = materialTextureForField(material, field);
498
+ const resolved =
499
+ handle === undefined ? undefined : resolveAssetHandle<TextureAsset>(world, handle);
500
+ const texture = resolved?.ok === true ? resolved.value : undefined;
501
+ const [u, v] = materialTextureUvScale(texture);
502
+ if (isStandardPbr) {
503
+ const coordinates = material.textureCoordinates?.get(field);
504
+ const transform = coordinates?.transform;
505
+ const offset =
506
+ STANDARD_PBR_TEXTURE_COORDINATE_OFFSET / 4 + index * STANDARD_PBR_TEXTURE_COORDINATE_STRIDE;
507
+ f32[offset] = transform?.offset?.[0] ?? 0;
508
+ f32[offset + 1] = transform?.offset?.[1] ?? 0;
509
+ f32[offset + 2] = transform?.scale?.[0] ?? 1;
510
+ f32[offset + 3] = transform?.scale?.[1] ?? 1;
511
+ f32[offset + 4] = coordinates?.set ?? 0;
512
+ f32[offset + 5] = transform?.rotation ?? 0;
513
+ f32[offset + 6] = u;
514
+ f32[offset + 7] = v;
515
+ } else {
516
+ const offset = textureScaleOffset / 4 + index * 2;
517
+ f32[offset] = u;
518
+ f32[offset + 1] = v;
519
+ }
520
+ }
521
+ }
522
+
523
+ function materialCoordinateSchema(
524
+ material: MaterialSnapshot,
525
+ ): readonly ParamSchemaEntry[] | undefined {
526
+ if (material.materialParamSchema !== undefined && material.materialParamSchema.length > 0) {
527
+ return material.materialParamSchema;
528
+ }
529
+ switch (material.materialShaderId) {
530
+ case 'forgeax::default-unlit':
531
+ return DEFAULT_UNLIT_PARAM_SCHEMA;
532
+ case 'forgeax::sprite':
533
+ case 'forgeax::sprite-lit':
534
+ return DEFAULT_SPRITE_PARAM_SCHEMA;
535
+ case 'forgeax::msdf-text':
536
+ return DEFAULT_MSDF_TEXT_PARAM_SCHEMA;
537
+ default:
538
+ return undefined;
539
+ }
540
+ }
541
+
439
542
  /**
440
543
  * feat-20260621-learn-render-5-5-parallax M2 / w8 (D-3): ordered user-region
441
544
  * texture field names for a material's bind-group assembly, derived from the
442
545
  * shader's paramSchema via the `derive()` SSOT (insertion order = sampler/
443
- * texture pair order in derive().bglEntries). An unavailable schema yields no
444
- * inferred layout fields.
546
+ * texture pair order in derive().bglEntries). Falls back to the built-in 4
547
+ * fields when the schema is unavailable.
445
548
  */
446
549
  export function userRegionTextureFieldOrder(
447
- projection: DerivedMaterialInterface | undefined,
550
+ schema: Parameters<typeof derive>[0] | undefined,
448
551
  ): readonly string[] {
449
- if (projection === undefined) return [];
450
- return [...projection.textureFieldNames];
552
+ if (schema === undefined || schema.length === 0) return BUILTIN_USER_REGION_TEXTURE_FIELDS;
553
+ const fields = [...derivedParamSchema(schema).textureFieldNames];
554
+ return fields.length === 0 ? BUILTIN_USER_REGION_TEXTURE_FIELDS : fields;
451
555
  }
452
556
 
453
557
  /**
@@ -459,8 +563,7 @@ export function userRegionTextureFieldOrder(
459
563
  export function defaultViewForUserRegionField(
460
564
  field: string,
461
565
  pipelineState: PipelineState,
462
- // biome-ignore lint/suspicious/noExplicitAny: opaque GPU texture-view
463
- ): any {
566
+ ): TextureView {
464
567
  if (field === 'normalTexture') return pipelineState.defaultNormalTextureView;
465
568
  if (field === 'baseColorTexture') return pipelineState.fallbackTextureView;
466
569
  return pipelineState.defaultWhiteTextureView;
@@ -485,7 +588,7 @@ export function defaultViewForUserRegionField(
485
588
  * (sentinel `bottom < 0` for tile mode is consumed via abs()).
486
589
  * @param renderableIndex The entity index into the validated renderables list.
487
590
  * @param seenIndices The per-frame-state guard Set; entries are added on increment.
488
- * @param metrics The per-Renderer EngineMetrics counter.
591
+ * @param metrics The owner-provided EngineMetrics counter.
489
592
  * @internal — exported for unit-test access (w17).
490
593
  */
491
594
  export function detectNineSliceScaleTooSmall(
@@ -509,6 +612,203 @@ export function detectNineSliceScaleTooSmall(
509
612
  }
510
613
  }
511
614
 
615
+ /**
616
+ * Build the 128-byte Material UBO payload for a PBR / unlit material entry
617
+ * (feat-20260527-sprite-nineslice M2 / w11; D-7 regression-net helper).
618
+ *
619
+ * Byte-for-byte equivalent to the legacy hard-coded PBR write path; each
620
+ * deviation is caught by `render-system-record-pbr-ubo-stable.test.ts`.
621
+ * The schema-driven paramSnapshot overlay (feat-20260523 M9-T05; AC-14)
622
+ * positions vec4 / f32 slots onto std140 [slot0 vec4, slot1 f32 metallic,
623
+ * slot1 f32 roughness] mirroring the engine-shipped default-standard-pbr
624
+ * Material struct.
625
+ */
626
+ export function buildPbrMaterialUboPayload(material: MaterialSnapshot): Uint8Array {
627
+ const buf = new Uint8Array(STANDARD_PBR_UBO_SIZE);
628
+ writePbrMaterialUboPayload(buf, material);
629
+ return buf;
630
+ }
631
+
632
+ /**
633
+ * Write the standard material payload into caller-owned storage.
634
+ *
635
+ * The allocating wrapper above remains the byte-stable test/helper surface,
636
+ * while the frame recorder reuses one scratch slot for all materials. A
637
+ * scene with thousands of submeshes otherwise allocates one 304-byte
638
+ * Uint8Array per material per frame, creating avoidable GC pressure without
639
+ * changing GPU-visible bytes.
640
+ */
641
+ export function writePbrMaterialUboPayload(
642
+ buf: Uint8Array | Float32Array,
643
+ material: MaterialSnapshot,
644
+ ): void {
645
+ if (buf.byteLength < STANDARD_PBR_UBO_SIZE) {
646
+ throw new RangeError(
647
+ `writePbrMaterialUboPayload: expected at least ${STANDARD_PBR_UBO_SIZE} bytes, got ${buf.byteLength}`,
648
+ );
649
+ }
650
+ buf.fill(0);
651
+ const f32 = materialUboFloatView(buf);
652
+ // Layout (issue-1: channelMap split per D-8) -- byte-equivalent to the
653
+ // post-split sidecar paramSchema for default-standard-pbr (12 numeric
654
+ // entries packed std140 into one merged UBO at binding(0)).
655
+ // f32[0..3] baseColor (offset 0, vec4)
656
+ // f32[4] metallic (offset 16)
657
+ // f32[5] roughness (offset 20)
658
+ // f32[6] metallicChannel (offset 24) -- glTF 2.0 default = B = 2
659
+ // f32[7] roughnessChannel (offset 28) -- glTF 2.0 default = G = 1
660
+ // f32[8] aoChannel (offset 32) -- glTF 2.0 default = R = 0
661
+ // f32[9] extraChannel (offset 36) -- reserved = 0
662
+ // (offset 40..47 implicit pad: vec3 align=16)
663
+ // f32[12..14] emissive (offset 48, vec3)
664
+ // f32[15] emissiveIntensity (offset 60)
665
+ // f32[16] occlusionStrength (offset 64)
666
+ // f32[17] alphaCutoff (offset 68)
667
+ // f32[18] clearcoat (offset 72)
668
+ // f32[19] clearcoatRoughness (offset 76)
669
+ // f32[20..22] specularTint (offset 80, vec3)
670
+ // (offset 92..95 alignment pad)
671
+ // f32[24..71] engine-owned texture coordinate records (offset 96)
672
+ // f32[72] normalScale (offset 288)
673
+ f32[0] = material.baseColor[0] ?? 0;
674
+ f32[1] = material.baseColor[1] ?? 0;
675
+ f32[2] = material.baseColor[2] ?? 0;
676
+ f32[3] = 1;
677
+ f32[4] = material.metallic;
678
+ f32[5] = material.roughness;
679
+ // channelMap default = (B, G, R, _) per AGENTS.md + glTF 2.0
680
+ // KHR_materials_pbrSpecularGlossiness ARM packing -- now 4 independent
681
+ // f32 selectors; fragment casts each to u32 at the pick site.
682
+ f32[6] = 2; // metallicChannel <- B
683
+ f32[7] = 1; // roughnessChannel <- G
684
+ f32[8] = 0; // aoChannel <- R
685
+ f32[9] = 0; // extraChannel <- reserved
686
+ // emissive vec3 + emissiveIntensity (offset 48..63)
687
+ const em = material.emissive;
688
+ f32[12] = em?.[0] ?? 0;
689
+ f32[13] = em?.[1] ?? 0;
690
+ f32[14] = em?.[2] ?? 0;
691
+ f32[15] = material.emissiveIntensity ?? 0;
692
+ // occlusionStrength (offset 64)
693
+ f32[16] = material.occlusionStrength ?? 1;
694
+ // alphaCutoff (offset 68).
695
+ const alphaCutoff = material.paramSnapshot?.alphaCutoff;
696
+ f32[17] = typeof alphaCutoff === 'number' ? alphaCutoff : 0;
697
+ f32[18] = material.clearcoat ?? 0;
698
+ f32[19] = material.clearcoatRoughness ?? 0.5;
699
+ const specularTint = material.specularTint;
700
+ f32[20] = specularTint?.[0] ?? 1;
701
+ f32[21] = specularTint?.[1] ?? 1;
702
+ f32[22] = specularTint?.[2] ?? 1;
703
+ f32[72] = material.normalScale ?? 1;
704
+ // Schema-driven paramSnapshot overlay (feat-20260523 M9-T05, AC-14):
705
+ // for user-shaders with a paramSnapshot, project the first vec4/color
706
+ // entry onto slot 0 and the first two f32 entries onto slot 1's first
707
+ // two floats. The default-standard-pbr path lands on the same offsets
708
+ // via the explicit fields above, so the overlay is a no-op for the
709
+ // engine's stock PBR shader (charter P4 + R-H regression fence).
710
+ const paramSnap = material.paramSnapshot;
711
+ if (paramSnap !== undefined) {
712
+ const f32Snap = (name: string): number | undefined => {
713
+ const v = paramSnap[name];
714
+ return typeof v === 'number' ? v : undefined;
715
+ };
716
+ const colorSnap = (name: string): readonly number[] | undefined => {
717
+ const v = paramSnap[name];
718
+ return Array.isArray(v) && v.every((x) => typeof x === 'number')
719
+ ? (v as readonly number[])
720
+ : undefined;
721
+ };
722
+ // Walk schema in declared order, fill positional UBO slots.
723
+ const materialShaderId = material.materialShaderId;
724
+ // Note: schema lookup is the caller's job (it owns the runtime ref);
725
+ // when the helper has no access to runtime, paramSnap is consumed
726
+ // positionally without a schema walk. The inline caller (recordFrame)
727
+ // still performs the schema-driven walk and writes the overlay before
728
+ // queueing this payload, so this helper is only the byte-stable
729
+ // baseline. To preserve byte-for-byte equivalence in the helper-only
730
+ // unit-test path, the overlay pass is skipped when the helper is
731
+ // called without an external schema reference.
732
+ void materialShaderId;
733
+ void f32Snap;
734
+ void colorSnap;
735
+ }
736
+ }
737
+
738
+ /**
739
+ * Generic std140 UBO writer driven by `derive(paramSchema).uboLayout.entries`
740
+ * (feat-20260625-refactor-sprite-as-transparent-mesh M1 / w3, plan-strategy
741
+ * section 2 D-2).
742
+ *
743
+ * For each numeric entry in the schema, looks up the matching value in
744
+ * `paramSnapshot` and writes it at the std140 offset `derive` computed.
745
+ * Vec / color entries pull from `paramSnapshot[name]` as a `readonly number[]`
746
+ * (writes `min(size/4, value.length)` floats, padding with 0 if shorter for
747
+ * the field's declared width); scalar entries pull a single number.
748
+ *
749
+ * Behaviour:
750
+ * - schema or snapshot `undefined` -> no writes (caller may keep payload
751
+ * baseline).
752
+ * - missing snapshot field -> that field's bytes are left untouched
753
+ * (overlay semantics; same shape the legacy inline overlay had).
754
+ * - field type the writer cannot interpret (texture / sampler / storage_
755
+ * buffer / value-type mismatch) -> skipped silently; `derive` strips
756
+ * non-numeric entries from `uboLayout.entries` so the loop only iterates
757
+ * numeric fields.
758
+ *
759
+ * The writer reads `paramSnapshot` only -- it does NOT call
760
+ * `runtime.assets.get<MaterialAsset>` or cast `firstMaterial`. Gate R-H
761
+ * (plan-strategy section 5.6) bans those paths through
762
+ * `scripts/forgeax/check-render-record-no-material-asset-get.mjs`.
763
+ *
764
+ * standard-pbr remains byte-identical to `buildPbrMaterialUboPayload`: the
765
+ * engine's stock PBR material ships `paramSnapshot: undefined`, so this
766
+ * writer is a no-op on that path; the explicit field writes in the helper
767
+ * above cover every byte. User shaders (sprite-shaped 4 x vec4 or another
768
+ * paramSchema) get their fields written at the offsets declared by derive.
769
+ *
770
+ * @internal export-for-test (consumed inside `recordFrame` + render-system-
771
+ * record.test.ts; not part of the package's public surface).
772
+ */
773
+ export function applyParamSnapshotToUbo(
774
+ payload: MaterialUboPayload,
775
+ paramSchema: readonly ParamSchemaEntry[] | undefined,
776
+ paramSnapshot:
777
+ | Readonly<Record<string, number | readonly number[] | string | undefined>>
778
+ | undefined,
779
+ ): void {
780
+ if (paramSchema === undefined) return;
781
+ if (paramSnapshot === undefined) return;
782
+ const f32 = materialUboFloatView(payload);
783
+ const { uboLayout } = derivedParamSchema(paramSchema);
784
+ for (const entry of uboLayout.entries) {
785
+ const value = paramSnapshot[entry.name];
786
+ if (value === undefined) continue;
787
+ const f32Offset = entry.offset / 4;
788
+ const f32Width = entry.size / 4;
789
+ if (typeof value === 'number') {
790
+ // Scalar f32 / i32 / u32 -- single-slot write. (i32 / u32 still arrive
791
+ // as a JS number; the GPU side reads the four bytes as the declared
792
+ // type, so an f32 write is the correct bit pattern when the caller
793
+ // already produced an integer value.)
794
+ if (f32Width >= 1) f32[f32Offset] = value;
795
+ continue;
796
+ }
797
+ if (Array.isArray(value)) {
798
+ const arr = value as readonly number[];
799
+ const writeCount = Math.min(arr.length, f32Width);
800
+ for (let i = 0; i < writeCount; i++) {
801
+ const v = arr[i];
802
+ if (typeof v === 'number') f32[f32Offset + i] = v;
803
+ }
804
+ }
805
+ // string values (texture GUIDs) belong to texture bindings, not the
806
+ // UBO; derive's uboLayout.entries already strips non-numeric schema
807
+ // entries, so we will not see a uboLayout entry whose snapshot value
808
+ // is a string under normal flow. Skip defensively if we do.
809
+ }
810
+ }
811
+
512
812
  /**
513
813
  * feat-20260704 M3/w19: shared per-submesh material bind-group assembly, hoisted
514
814
  * from the `buildPerSubmeshMaterialBg` closure inside recordMainPass so both the
@@ -530,13 +830,13 @@ export interface PerSubmeshMaterialBgDeps {
530
830
  readonly runtime: RenderSystemRuntime;
531
831
  readonly pipelineState: PipelineState;
532
832
  readonly world: World;
533
- readonly store: GpuResourceStore;
833
+ readonly store: GpuResidencyCache;
534
834
  readonly materialSlice: number;
535
835
  readonly videoHighPerfAvailable: boolean;
536
836
  readonly skylightResources: SkylightBindGroupResources;
537
837
  readonly materialBgShared: Map<string, WeakMap<object, unknown>>;
538
838
  /** Cross-frame final BG reuse keyed by the stable source material handle. */
539
- readonly materialBgAssemblyCache: Map<number, MaterialBgAssemblyCacheEntry>;
839
+ readonly materialBgAssemblyCache: Map<string, MaterialBgAssemblyCacheEntry>;
540
840
  readonly bindGroupCounts: BindGroupCounts;
541
841
  }
542
842
 
@@ -568,11 +868,11 @@ export function buildPerSubmeshMaterialBg(
568
868
  deps: PerSubmeshMaterialBgDeps,
569
869
  submeshMaterial: MaterialSnapshot,
570
870
  entityKey: number,
871
+ materialWorld: World = deps.world,
571
872
  ): BindGroup {
572
873
  const {
573
874
  runtime,
574
875
  pipelineState,
575
- world,
576
876
  store,
577
877
  materialSlice,
578
878
  videoHighPerfAvailable,
@@ -582,14 +882,16 @@ export function buildPerSubmeshMaterialBg(
582
882
  bindGroupCounts,
583
883
  } = deps;
584
884
  const smMaterialHandle = submeshMaterial.materialHandle;
885
+ const materialCacheKey =
886
+ smMaterialHandle === undefined ? undefined : `${materialWorld.identity}:${smMaterialHandle}`;
585
887
  const smHasVideoFields = (submeshMaterial.videoTextureFields?.size ?? 0) > 0;
586
888
  const smShaderId = submeshMaterial.materialShaderId;
587
889
  const smPerShaderBgl =
588
890
  smShaderId !== undefined ? runtime.getMaterialBindGroupLayout?.(smShaderId) : undefined;
589
- const usesSharedPbrMaterialLayout = smPerShaderBgl === undefined;
590
891
  const smMaterialBgl = smPerShaderBgl ?? pipelineState.materialBindGroupLayout;
591
892
  if (smMaterialHandle !== undefined && !smHasVideoFields) {
592
- const cached = materialBgAssemblyCache.get(smMaterialHandle);
893
+ const cached =
894
+ materialCacheKey === undefined ? undefined : materialBgAssemblyCache.get(materialCacheKey);
593
895
  if (
594
896
  isMaterialBgAssemblyCacheHit(
595
897
  cached,
@@ -603,32 +905,24 @@ export function buildPerSubmeshMaterialBg(
603
905
  return cached.bindGroup;
604
906
  }
605
907
  }
606
- const smRegisteredProjection =
607
- !usesSharedPbrMaterialLayout && smShaderId !== undefined
608
- ? runtime.getParamSchemaProjection?.(smShaderId)
609
- : undefined;
610
- const smSchema = usesSharedPbrMaterialLayout
611
- ? DEFAULT_STANDARD_PBR_PARAM_SCHEMA
612
- : (smRegisteredProjection?.schema ??
613
- (smShaderId !== undefined ? runtime.getParamSchema?.(smShaderId) : undefined) ??
614
- submeshMaterial.materialParamSchema);
615
- // The bind-group layout and its uniform range must share one schema owner.
616
- // Authored built-in materials may declare only a compact subset, while the
617
- // shared PBR pipeline still consumes the full standard schema.
618
- const smProjection = usesSharedPbrMaterialLayout
619
- ? DEFAULT_STANDARD_PBR_DERIVED_INTERFACE
620
- : (submeshMaterial.derivedMaterialSlot?.derivedInterface ??
621
- smRegisteredProjection?.derivedInterface ??
622
- (smSchema === undefined
623
- ? undefined
624
- : derivedParamSchema(smSchema, runtime.paramSchemaProjectionCensus)));
625
- const smMaterialByteLength = smProjection?.totalBytes || materialSlice;
626
- const smUserRegionFields = userRegionTextureFieldOrder(smProjection);
908
+ const smSchema =
909
+ submeshMaterial.materialParamSchema ??
910
+ (smShaderId !== undefined ? runtime.getParamSchema?.(smShaderId) : undefined);
911
+ // The shipped PBR shaders always own the six texture pairs declared by the
912
+ // standard shader artifact. Authored material snapshots may intentionally
913
+ // carry a compact four-field schema because emissive/occlusion are engine
914
+ // injected values, but the runtime PBR BGL still exposes bindings 9..12 for
915
+ // those pairs. Keep the record projection on the shader-owned layout so IBL
916
+ // starts at binding 13 rather than colliding with emissiveSampler.
917
+ const smUserRegionFields =
918
+ smPerShaderBgl === undefined || isStandardPbrMaterialShader(smShaderId)
919
+ ? BUILTIN_USER_REGION_TEXTURE_FIELDS
920
+ : userRegionTextureFieldOrder(smSchema);
627
921
  let materialResourcesResident = true;
628
922
  const smSamplerForField = (field: string | undefined): Sampler => {
629
923
  const handle = field === undefined ? undefined : submeshMaterial.samplerHandles?.get(field);
630
924
  if (handle === undefined) return pipelineState.defaultSampler;
631
- const sampler = residentSampler(world, store, runtime, handle);
925
+ const sampler = residentSampler(materialWorld, store, runtime, handle);
632
926
  if (sampler === undefined) materialResourcesResident = false;
633
927
  return sampler ?? pipelineState.defaultSampler;
634
928
  };
@@ -640,7 +934,7 @@ export function buildPerSubmeshMaterialBg(
640
934
  value: {
641
935
  buffer: pipelineState.materialUniformBuffer.buffer,
642
936
  offset: 0,
643
- size: smMaterialByteLength,
937
+ size: materialSlice,
644
938
  },
645
939
  },
646
940
  },
@@ -650,7 +944,7 @@ export function buildPerSubmeshMaterialBg(
650
944
  const field = smUserRegionFields[fi];
651
945
  const samplerBinding = 1 + fi * 2;
652
946
  const textureBinding = samplerBinding + 1;
653
- let smView: unknown =
947
+ let smView: TextureView =
654
948
  field !== undefined
655
949
  ? defaultViewForUserRegionField(field, pipelineState)
656
950
  : pipelineState.defaultWhiteTextureView;
@@ -658,7 +952,7 @@ export function buildPerSubmeshMaterialBg(
658
952
  field !== undefined ? submeshMaterial.videoTextureFields?.get(field) : undefined;
659
953
  if (smVideoClip !== undefined) {
660
954
  const view = videoTextureView(
661
- world,
955
+ materialWorld,
662
956
  runtime.dynamicTextureStore,
663
957
  runtime,
664
958
  entityKey,
@@ -667,9 +961,16 @@ export function buildPerSubmeshMaterialBg(
667
961
  );
668
962
  if (view !== undefined) smView = view;
669
963
  } else {
670
- const smHandle = field !== undefined ? submeshMaterial.textureHandles?.get(field) : undefined;
964
+ const smHandle =
965
+ field === 'emissiveTexture'
966
+ ? submeshMaterial.emissiveTexture
967
+ : field === 'occlusionTexture'
968
+ ? submeshMaterial.occlusionTexture
969
+ : field !== undefined
970
+ ? submeshMaterial.textureHandles?.get(field)
971
+ : undefined;
671
972
  if (smHandle !== undefined) {
672
- const view = residentTextureView(world, store, runtime, smHandle);
973
+ const view = residentTextureView(materialWorld, store, runtime, smHandle);
673
974
  if (view !== undefined) smView = view;
674
975
  else materialResourcesResident = false;
675
976
  }
@@ -681,11 +982,35 @@ export function buildPerSubmeshMaterialBg(
681
982
  },
682
983
  {
683
984
  binding: textureBinding,
684
- resource: { kind: 'textureView' as const, value: smView as never },
985
+ resource: { kind: 'textureView' as const, value: smView },
685
986
  },
686
987
  );
687
988
  }
688
- const smMergedEntries = assembleMaterialWithSkylightEntries(smBaseEntries, skylightResources);
989
+ let smEmissiveView: TextureView = pipelineState.defaultWhiteTextureView;
990
+ const smEmissiveHandle = submeshMaterial.emissiveTexture;
991
+ if (smEmissiveHandle !== undefined) {
992
+ const view = residentTextureView(materialWorld, store, runtime, smEmissiveHandle);
993
+ if (view !== undefined) smEmissiveView = view;
994
+ else materialResourcesResident = false;
995
+ }
996
+ let smOcclusionView: TextureView = pipelineState.defaultWhiteTextureView;
997
+ const smOcclusionHandle = submeshMaterial.occlusionTexture;
998
+ if (smOcclusionHandle !== undefined) {
999
+ const view = residentTextureView(materialWorld, store, runtime, smOcclusionHandle);
1000
+ if (view !== undefined) smOcclusionView = view;
1001
+ else materialResourcesResident = false;
1002
+ }
1003
+ const smEmissiveAo: EmissiveAoBindGroupResources = {
1004
+ emissiveSampler: smSamplerForField('emissiveTexture'),
1005
+ emissiveView: smEmissiveView,
1006
+ occlusionSampler: smSamplerForField('occlusionTexture'),
1007
+ occlusionView: smOcclusionView,
1008
+ };
1009
+ const smMergedEntries = assembleMaterialWithSkylightEntries(
1010
+ smBaseEntries,
1011
+ skylightResources,
1012
+ smEmissiveAo,
1013
+ );
689
1014
  const smBindGroup = getOrCreatePerEntity(
690
1015
  materialBgShared,
691
1016
  smShaderId ?? '',
@@ -703,14 +1028,16 @@ export function buildPerSubmeshMaterialBg(
703
1028
  bindGroupCounts,
704
1029
  );
705
1030
  if (smMaterialHandle !== undefined && !smHasVideoFields && materialResourcesResident) {
706
- materialBgAssemblyCache.set(smMaterialHandle, {
707
- material: submeshMaterial,
708
- materialResourceEpoch: store.materialResourceEpoch,
709
- materialBgl: smMaterialBgl,
710
- materialBuffer: pipelineState.materialUniformBuffer.buffer,
711
- skylightResources,
712
- bindGroup: smBindGroup,
713
- });
1031
+ if (materialCacheKey !== undefined) {
1032
+ materialBgAssemblyCache.set(materialCacheKey, {
1033
+ material: submeshMaterial,
1034
+ materialResourceEpoch: store.materialResourceEpoch,
1035
+ materialBgl: smMaterialBgl,
1036
+ materialBuffer: pipelineState.materialUniformBuffer.buffer,
1037
+ skylightResources,
1038
+ bindGroup: smBindGroup,
1039
+ });
1040
+ }
714
1041
  }
715
1042
  return smBindGroup;
716
1043
  }