@forgeax/engine-render 0.1.23 → 0.1.24

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 (271) hide show
  1. package/README.md +131 -9
  2. package/dist/assembly/bundler-contract.d.ts +9 -0
  3. package/dist/assembly/bundler-contract.d.ts.map +1 -0
  4. package/dist/assembly/device-feature-admission.d.ts +8 -0
  5. package/dist/assembly/device-feature-admission.d.ts.map +1 -1
  6. package/dist/assembly/extended-lighting-fallback.d.ts +13 -0
  7. package/dist/assembly/extended-lighting-fallback.d.ts.map +1 -0
  8. package/dist/assembly/factory.d.ts +7 -243
  9. package/dist/assembly/factory.d.ts.map +1 -1
  10. package/dist/assembly/material/assembly.d.ts +3 -2
  11. package/dist/assembly/material/assembly.d.ts.map +1 -1
  12. package/dist/assembly/material/standard-layer-projection.d.ts +10 -0
  13. package/dist/assembly/material/standard-layer-projection.d.ts.map +1 -0
  14. package/dist/assembly/material-shader-policy.d.ts +168 -0
  15. package/dist/assembly/material-shader-policy.d.ts.map +1 -0
  16. package/dist/assembly/material-shader-prewarm.d.ts +21 -0
  17. package/dist/assembly/material-shader-prewarm.d.ts.map +1 -0
  18. package/dist/assembly/mesh-ssbo-grow.d.ts +88 -0
  19. package/dist/assembly/mesh-ssbo-grow.d.ts.map +1 -0
  20. package/dist/assembly/recovery/device-loss-fanout.d.ts +14 -0
  21. package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -0
  22. package/dist/assembly/recovery/generation.d.ts +46 -0
  23. package/dist/assembly/recovery/generation.d.ts.map +1 -0
  24. package/dist/assembly/recovery/recovery-attempt.d.ts +63 -0
  25. package/dist/assembly/recovery/recovery-attempt.d.ts.map +1 -0
  26. package/dist/assembly/recovery/renderer-recover.d.ts +115 -0
  27. package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -0
  28. package/dist/assembly/renderer-facade.d.ts +10 -0
  29. package/dist/assembly/renderer-facade.d.ts.map +1 -0
  30. package/dist/assembly/renderer-frame-transaction.d.ts +17 -0
  31. package/dist/assembly/renderer-frame-transaction.d.ts.map +1 -1
  32. package/dist/assembly/renderer-helpers.d.ts +19 -0
  33. package/dist/assembly/renderer-helpers.d.ts.map +1 -0
  34. package/dist/assembly/renderer-lifecycle.d.ts +34 -0
  35. package/dist/assembly/renderer-lifecycle.d.ts.map +1 -1
  36. package/dist/assembly/shader-prewarm-policy.d.ts +15 -0
  37. package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -0
  38. package/dist/assembly/webgpu-ready-contract.d.ts +9 -0
  39. package/dist/assembly/webgpu-ready-contract.d.ts.map +1 -0
  40. package/dist/assembly/webgpu-ready.d.ts +55 -0
  41. package/dist/assembly/webgpu-ready.d.ts.map +1 -0
  42. package/dist/assembly/webgpu-renderer.d.ts +152 -0
  43. package/dist/assembly/webgpu-renderer.d.ts.map +1 -0
  44. package/dist/authoring.mjs +1 -1
  45. package/dist/{chunk-4L3P6DT5.mjs → chunk-GE3SDD72.mjs} +37 -5
  46. package/dist/chunk-GE3SDD72.mjs.map +1 -0
  47. package/dist/{chunk-HZUPSYW7.mjs → chunk-KZFTK6DO.mjs} +102 -15
  48. package/dist/chunk-KZFTK6DO.mjs.map +1 -0
  49. package/dist/{chunk-FF7K3FSO.mjs → chunk-Q752SHI5.mjs} +89 -89
  50. package/dist/{chunk-FF7K3FSO.mjs.map → chunk-Q752SHI5.mjs.map} +1 -1
  51. package/dist/{chunk-QODA5UKU.mjs → chunk-RR5L4SRS.mjs} +2 -2
  52. package/dist/chunk-RR5L4SRS.mjs.map +1 -0
  53. package/dist/{chunk-YALPS44A.mjs → chunk-TFH5I7JJ.mjs} +47 -47
  54. package/dist/chunk-TFH5I7JJ.mjs.map +1 -0
  55. package/dist/{chunk-FBC4R44J.mjs → chunk-UQYS7FRM.mjs} +57 -57
  56. package/dist/chunk-UQYS7FRM.mjs.map +1 -0
  57. package/dist/{chunk-4NPUASZR.mjs → chunk-YKB5DQV7.mjs} +161 -19
  58. package/dist/chunk-YKB5DQV7.mjs.map +1 -0
  59. package/dist/{chunk-ZUWKAZ2I.mjs → chunk-YRUYGA4A.mjs} +615 -237
  60. package/dist/chunk-YRUYGA4A.mjs.map +1 -0
  61. package/dist/{chunk-DIYW3M5D.mjs → chunk-Z3YYH2MB.mjs} +2210 -2213
  62. package/dist/chunk-Z3YYH2MB.mjs.map +1 -0
  63. package/dist/construct-renderer.mjs +19841 -16190
  64. package/dist/construct-renderer.mjs.map +1 -1
  65. package/dist/device/device-scope.d.ts +2 -0
  66. package/dist/device/device-scope.d.ts.map +1 -1
  67. package/dist/device/gpu-residency.d.ts +24 -4
  68. package/dist/device/gpu-residency.d.ts.map +1 -1
  69. package/dist/environment/frame.d.ts +5 -0
  70. package/dist/environment/frame.d.ts.map +1 -1
  71. package/dist/environment/inspection.d.ts +7 -0
  72. package/dist/environment/inspection.d.ts.map +1 -1
  73. package/dist/environment/lifecycle.d.ts +20 -2
  74. package/dist/environment/lifecycle.d.ts.map +1 -1
  75. package/dist/errors/recover.d.ts +58 -2
  76. package/dist/errors/recover.d.ts.map +1 -1
  77. package/dist/errors/render.d.ts +13 -0
  78. package/dist/errors/render.d.ts.map +1 -1
  79. package/dist/extract/contracts.d.ts +899 -0
  80. package/dist/extract/contracts.d.ts.map +1 -0
  81. package/dist/features/host.d.ts +2 -0
  82. package/dist/features/host.d.ts.map +1 -1
  83. package/dist/features/prepared-gpu-work.d.ts +3 -0
  84. package/dist/features/prepared-gpu-work.d.ts.map +1 -1
  85. package/dist/features/prepared-graphics-store.d.ts +2 -0
  86. package/dist/features/prepared-graphics-store.d.ts.map +1 -1
  87. package/dist/gpu-driven/production-raster.d.ts +28 -0
  88. package/dist/gpu-driven/production-raster.d.ts.map +1 -1
  89. package/dist/gpu-scene.d.ts +1 -0
  90. package/dist/gpu-scene.d.ts.map +1 -1
  91. package/dist/ibl/IblPipelineCache.d.ts +7 -6
  92. package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
  93. package/dist/ibl/skylight-bind-group.d.ts +7 -1
  94. package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
  95. package/dist/index.d.ts +1 -1
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.mjs +6 -6
  98. package/dist/internal.mjs +6 -6
  99. package/dist/light-buffer-layout.d.ts +3 -0
  100. package/dist/light-buffer-layout.d.ts.map +1 -1
  101. package/dist/materials.d.ts +34 -10
  102. package/dist/materials.d.ts.map +1 -1
  103. package/dist/mesh-material-bindings.d.ts +56 -0
  104. package/dist/mesh-material-bindings.d.ts.map +1 -1
  105. package/dist/occlusion-proxy.d.ts +4 -0
  106. package/dist/occlusion-proxy.d.ts.map +1 -0
  107. package/dist/pbr-pipeline.d.ts +32 -9
  108. package/dist/pbr-pipeline.d.ts.map +1 -1
  109. package/dist/points-lines/prepare.d.ts +3 -0
  110. package/dist/points-lines/prepare.d.ts.map +1 -1
  111. package/dist/points-lines/standard-owner.d.ts +33 -0
  112. package/dist/points-lines/standard-owner.d.ts.map +1 -0
  113. package/dist/record/frame-snapshot.d.ts +5 -0
  114. package/dist/record/frame-snapshot.d.ts.map +1 -1
  115. package/dist/record/frame-targets.d.ts.map +1 -1
  116. package/dist/record/frame.d.ts +14 -2
  117. package/dist/record/frame.d.ts.map +1 -1
  118. package/dist/record/main-pass-geometry.d.ts +14 -1
  119. package/dist/record/main-pass-geometry.d.ts.map +1 -1
  120. package/dist/record/main-pass-material.d.ts +7 -17
  121. package/dist/record/main-pass-material.d.ts.map +1 -1
  122. package/dist/record/main-pass.d.ts.map +1 -1
  123. package/dist/record/mesh-ssbo.d.ts +11 -3
  124. package/dist/record/mesh-ssbo.d.ts.map +1 -1
  125. package/dist/record/recovery-pipeline.d.ts +30 -0
  126. package/dist/record/recovery-pipeline.d.ts.map +1 -0
  127. package/dist/record/render-context.d.ts +26 -4
  128. package/dist/record/render-context.d.ts.map +1 -1
  129. package/dist/record/typed-frame-graph.d.ts +1 -1
  130. package/dist/record/typed-frame-graph.d.ts.map +1 -1
  131. package/dist/recovery/render-system-candidate.d.ts +65 -0
  132. package/dist/recovery/render-system-candidate.d.ts.map +1 -0
  133. package/dist/render-contract.d.ts +64 -7
  134. package/dist/render-contract.d.ts.map +1 -1
  135. package/dist/render-system-extract-tail.d.ts +12 -0
  136. package/dist/render-system-extract-tail.d.ts.map +1 -0
  137. package/dist/render-system-extract.d.ts +156 -22
  138. package/dist/render-system-extract.d.ts.map +1 -1
  139. package/dist/render-system.d.ts +128 -4
  140. package/dist/render-system.d.ts.map +1 -1
  141. package/dist/scene/render-scene.d.ts +19 -0
  142. package/dist/scene/render-scene.d.ts.map +1 -1
  143. package/dist/temporal/frame-coordinator.d.ts.map +1 -1
  144. package/dist/temporal/index.mjs +6 -6
  145. package/dist/temporal/taa-history-store.d.ts +15 -1
  146. package/dist/temporal/taa-history-store.d.ts.map +1 -1
  147. package/dist/temporal/transaction.d.ts +5 -0
  148. package/dist/temporal/transaction.d.ts.map +1 -1
  149. package/package.json +20 -20
  150. package/src/__tests__/device-feature-admission.unit.test.ts +6 -0
  151. package/src/__tests__/device-loss-fanout.unit.test.ts +107 -0
  152. package/src/__tests__/device-scope-lifecycle.unit.test.ts +21 -0
  153. package/src/__tests__/environment-generation.integration.test.ts +23 -0
  154. package/src/__tests__/expose-renderer-errors.unit.test.ts +34 -0
  155. package/src/__tests__/factory-contract.integration.test.ts +122 -7
  156. package/src/__tests__/fallback-row-stride-surface.unit.test.ts +4 -1
  157. package/src/__tests__/ibl/face-uniforms.unit.test.ts +2 -0
  158. package/src/__tests__/ibl-residency-publication.unit.test.ts +113 -0
  159. package/src/__tests__/material-contract-inventory.unit.test.ts +24 -9
  160. package/src/__tests__/material-cooked-projection.unit.test.ts +19 -1
  161. package/src/__tests__/material-static-dynamic-route.unit.test.ts +29 -0
  162. package/src/__tests__/material-stride-surface.unit.test.ts +7 -3
  163. package/src/__tests__/materials-standard-contract.unit.test.ts +104 -0
  164. package/src/__tests__/mesh-buffer-usage-surface.unit.test.ts +1 -1
  165. package/src/__tests__/physical-clearcoat.integration.test.ts +89 -0
  166. package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +1 -1
  167. package/src/__tests__/prepared-graphics-pipeline-warmup.unit.test.ts +1 -1
  168. package/src/__tests__/recover-error-policy-owner.unit.test.ts +6 -3
  169. package/src/__tests__/recovery-candidate-prepare.contract.test.ts +140 -0
  170. package/src/__tests__/renderer-factory-material-contract.unit.test.ts +85 -18
  171. package/src/__tests__/renderer-frame-generation-fence.integration.test.ts +47 -0
  172. package/src/__tests__/renderer-generation-assembly.unit.test.ts +77 -0
  173. package/src/__tests__/renderer-generation-failure.unit.test.ts +108 -0
  174. package/src/__tests__/renderer-producer-root-matrix.integration.test.ts +33 -0
  175. package/src/__tests__/renderer-recovery-capability-matrix.unit.test.ts +59 -0
  176. package/src/__tests__/renderer-recovery-contract.unit.test.ts +73 -0
  177. package/src/__tests__/renderer-recovery-lifecycle.unit.test.ts +216 -0
  178. package/src/__tests__/renderer-target-history-recovery.integration.test.ts +80 -0
  179. package/src/__tests__/shader-manifest-fixture.ts +13 -16
  180. package/src/__tests__/shader-stage-surface.unit.test.ts +1 -1
  181. package/src/__tests__/standard-layer-projection.unit.test.ts +23 -0
  182. package/src/__tests__/transmission-prewarm.unit.test.ts +95 -85
  183. package/src/__tests__/volumetric-fog-topology.unit.test.ts +3 -1
  184. package/src/assembly/bundler-contract.ts +9 -0
  185. package/src/assembly/device-feature-admission.ts +15 -5
  186. package/src/assembly/extended-lighting-fallback.ts +216 -0
  187. package/src/assembly/factory.ts +81 -10088
  188. package/src/assembly/material/assembly.ts +18 -2
  189. package/src/assembly/material/standard-layer-projection.ts +16 -0
  190. package/src/assembly/material-shader-policy.ts +854 -0
  191. package/src/assembly/material-shader-prewarm.ts +88 -0
  192. package/src/assembly/mesh-ssbo-grow.ts +270 -0
  193. package/src/assembly/recovery/device-loss-fanout.ts +89 -0
  194. package/src/assembly/recovery/generation.ts +141 -0
  195. package/src/assembly/recovery/recovery-attempt.ts +800 -0
  196. package/src/assembly/recovery/renderer-recover.ts +906 -0
  197. package/src/assembly/renderer-facade.ts +342 -0
  198. package/src/assembly/renderer-frame-transaction.ts +45 -0
  199. package/src/assembly/renderer-helpers.ts +99 -0
  200. package/src/assembly/renderer-lifecycle.ts +159 -0
  201. package/src/assembly/shader-prewarm-policy.ts +157 -0
  202. package/src/assembly/webgpu-ready-contract.ts +14 -0
  203. package/src/assembly/webgpu-ready.ts +4079 -0
  204. package/src/assembly/webgpu-renderer.ts +4095 -0
  205. package/src/components/camera.ts +1 -1
  206. package/src/debug-draw-glue.ts +1 -1
  207. package/src/device/device-scope.ts +35 -6
  208. package/src/device/gpu-residency.ts +194 -26
  209. package/src/environment/frame.ts +6 -0
  210. package/src/environment/inspection.ts +10 -0
  211. package/src/environment/lifecycle.ts +114 -8
  212. package/src/errors/recover.ts +76 -5
  213. package/src/errors/render.ts +17 -0
  214. package/src/extract/contracts.ts +974 -0
  215. package/src/features/host.ts +16 -0
  216. package/src/features/prepared-gpu-work.ts +20 -2
  217. package/src/features/prepared-graphics-store.ts +17 -0
  218. package/src/gpu-driven/production-raster.ts +97 -2
  219. package/src/gpu-scene.ts +3 -2
  220. package/src/ibl/IblPipelineCache.ts +134 -50
  221. package/src/ibl/skylight-bind-group.ts +26 -0
  222. package/src/index.ts +9 -1
  223. package/src/light-buffer-layout.ts +3 -0
  224. package/src/materials.ts +262 -45
  225. package/src/mesh-material-bindings.ts +59 -0
  226. package/src/occlusion-proxy.ts +64 -0
  227. package/src/pbr-pipeline.ts +139 -15
  228. package/src/points-lines/__tests__/cache-recovery.unit.test.ts +22 -0
  229. package/src/points-lines/prepare.ts +9 -0
  230. package/src/points-lines/standard-owner.ts +403 -0
  231. package/src/record/__tests__/frame-targets-recovery.unit.test.ts +60 -0
  232. package/src/record/__tests__/main-pass-geometry.unit.test.ts +26 -1
  233. package/src/record/__tests__/mesh-ssbo.unit.test.ts +38 -0
  234. package/src/record/__tests__/recovery-pipeline.unit.test.ts +124 -0
  235. package/src/record/__tests__/sprite-material-abi.unit.test.ts +28 -13
  236. package/src/record/__tests__/standard-pbr-ubo-layout.unit.test.ts +47 -4
  237. package/src/record/__tests__/temporal-payload.unit.test.ts +22 -43
  238. package/src/record/__tests__/typed-frame-graph-plan.unit.test.ts +1 -1
  239. package/src/record/frame-snapshot.ts +15 -0
  240. package/src/record/frame-targets.ts +11 -1
  241. package/src/record/frame.ts +6 -2
  242. package/src/record/helpers.ts +1 -1
  243. package/src/record/main-pass-geometry.ts +230 -5
  244. package/src/record/main-pass-material.ts +316 -209
  245. package/src/record/main-pass-sprite-draws.ts +6 -7
  246. package/src/record/main-pass.ts +94 -6
  247. package/src/record/mesh-ssbo.ts +32 -10
  248. package/src/record/recovery-pipeline.ts +695 -0
  249. package/src/record/render-context.ts +35 -4
  250. package/src/record/typed-frame-graph.ts +45 -1
  251. package/src/record/view-ubo.ts +3 -3
  252. package/src/recovery/render-system-candidate.ts +839 -0
  253. package/src/render-contract.ts +65 -7
  254. package/src/render-system-extract-tail.ts +2983 -0
  255. package/src/render-system-extract.ts +124 -2977
  256. package/src/render-system.ts +868 -659
  257. package/src/scene/render-scene.ts +124 -1
  258. package/src/temporal/frame-coordinator.ts +4 -1
  259. package/src/temporal/taa-history-store.ts +46 -2
  260. package/src/temporal/temporal-view.ts +1 -1
  261. package/src/temporal/transaction.ts +9 -0
  262. package/src/tilemap-chunk-extract-system.ts +1 -1
  263. package/src/transmission/__tests__/standard-transmission.dawn.test.ts +19 -12
  264. package/dist/chunk-4L3P6DT5.mjs.map +0 -1
  265. package/dist/chunk-4NPUASZR.mjs.map +0 -1
  266. package/dist/chunk-DIYW3M5D.mjs.map +0 -1
  267. package/dist/chunk-FBC4R44J.mjs.map +0 -1
  268. package/dist/chunk-HZUPSYW7.mjs.map +0 -1
  269. package/dist/chunk-QODA5UKU.mjs.map +0 -1
  270. package/dist/chunk-YALPS44A.mjs.map +0 -1
  271. package/dist/chunk-ZUWKAZ2I.mjs.map +0 -1
@@ -0,0 +1,157 @@
1
+ import type { Result, RhiError, ShaderModule } from '@forgeax/engine-rhi';
2
+ import { findVariantByKey, type MaterialShaderManifestEntry } from '@forgeax/engine-shader';
3
+
4
+ /** Minimum sampled-texture limit needed by Standard transmission variants. */
5
+ export const STANDARD_PBR_REQUIRED_SAMPLED_TEXTURES = 17;
6
+
7
+ /** Select HDRP variants that must be seeded during ready-state construction. */
8
+ export function selectHdrpPbrPrewarmVariants(
9
+ manifestEntry: MaterialShaderManifestEntry | undefined,
10
+ storageBufferCapable: boolean,
11
+ extendedLightingShaderAvailableOrTransmissionCapable = true,
12
+ transmissionCapable = true,
13
+ directionalPcssAvailable = true,
14
+ projectorAvailable: boolean = true,
15
+ ): readonly MaterialShaderManifestEntry['variants'][number][] {
16
+ const variants = manifestEntry?.variants ?? [];
17
+ const hasExtendedLightingAxis = variants.some(
18
+ (variant) => 'EXTENDED_LIGHTING_AVAILABLE' in variant.defines,
19
+ );
20
+ const extendedLightingShaderAvailable = hasExtendedLightingAxis
21
+ ? extendedLightingShaderAvailableOrTransmissionCapable
22
+ : true;
23
+ const effectiveTransmissionCapable = hasExtendedLightingAxis
24
+ ? transmissionCapable
25
+ : extendedLightingShaderAvailableOrTransmissionCapable;
26
+ if (!storageBufferCapable) return [];
27
+ return (
28
+ variants.filter(
29
+ (variant) =>
30
+ variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
31
+ (!('EXTENDED_LIGHTING_AVAILABLE' in variant.defines) ||
32
+ variant.defines.EXTENDED_LIGHTING_AVAILABLE === extendedLightingShaderAvailable) &&
33
+ variant.defines.CLUSTER_FORWARD_AVAILABLE === true &&
34
+ (!('DIRECTIONAL_PCSS_AVAILABLE' in variant.defines) ||
35
+ variant.defines.DIRECTIONAL_PCSS_AVAILABLE === directionalPcssAvailable) &&
36
+ (!('PROJECTOR_AVAILABLE' in variant.defines) ||
37
+ variant.defines.PROJECTOR_AVAILABLE === projectorAvailable) &&
38
+ variant.defines.PROBE_BLEND_AVAILABLE !== true &&
39
+ (effectiveTransmissionCapable || variant.defines.TRANSMISSION_AVAILABLE !== true),
40
+ ) ?? []
41
+ );
42
+ }
43
+
44
+ /** Return every active-capability pbr-skin variant used by URP and HDRP draws. */
45
+ export function selectSkinPrewarmVariants(
46
+ manifestEntry: MaterialShaderManifestEntry | undefined,
47
+ storageBufferCapable: boolean,
48
+ ): readonly MaterialShaderManifestEntry['variants'][number][] {
49
+ return (
50
+ manifestEntry?.variants.filter(
51
+ (variant) =>
52
+ variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
53
+ (storageBufferCapable || variant.defines.CLUSTER_FORWARD_AVAILABLE !== true) &&
54
+ variant.defines.PROBE_BLEND_AVAILABLE !== true,
55
+ ) ?? []
56
+ );
57
+ }
58
+
59
+ /** Select probe-enabled material modules for recovery candidate prewarming. */
60
+ export function selectProbePrewarmVariants(
61
+ manifestEntry: MaterialShaderManifestEntry | undefined,
62
+ storageBufferCapable: boolean,
63
+ extendedLightingShaderAvailable = true,
64
+ transmissionCapable = true,
65
+ directionalPcssAvailable = true,
66
+ projectorAvailable: boolean = true,
67
+ webgl2Downlevel = false,
68
+ ): readonly MaterialShaderManifestEntry['variants'][number][] {
69
+ if (!storageBufferCapable) return [];
70
+ return (
71
+ manifestEntry?.variants.filter((variant) => {
72
+ const defines = variant.defines;
73
+ return (
74
+ defines.PROBE_BLEND_AVAILABLE === true &&
75
+ defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
76
+ (!('WEBGL2_COMPAT' in defines) || defines.WEBGL2_COMPAT === webgl2Downlevel) &&
77
+ (!('EXTENDED_LIGHTING_AVAILABLE' in defines) ||
78
+ defines.EXTENDED_LIGHTING_AVAILABLE === extendedLightingShaderAvailable) &&
79
+ (!('DIRECTIONAL_PCSS_AVAILABLE' in defines) ||
80
+ defines.DIRECTIONAL_PCSS_AVAILABLE === directionalPcssAvailable) &&
81
+ (!('PROJECTOR_AVAILABLE' in defines) ||
82
+ defines.PROJECTOR_AVAILABLE === projectorAvailable) &&
83
+ (transmissionCapable || defines.TRANSMISSION_AVAILABLE !== true)
84
+ );
85
+ }) ?? []
86
+ );
87
+ }
88
+
89
+ /** Compile and seed a selected material-shader variant set without duplicate modules. */
90
+ export async function prewarmMaterialShaderVariants(
91
+ variants: readonly MaterialShaderManifestEntry['variants'][number][],
92
+ prewarmedModules: Map<string, ShaderModule>,
93
+ compile: (
94
+ variant: MaterialShaderManifestEntry['variants'][number],
95
+ moduleLabel: string,
96
+ ) => Promise<Result<ShaderModule, RhiError>>,
97
+ seed: (moduleLabel: string, module: ShaderModule) => void,
98
+ ): Promise<void> {
99
+ for (const variant of variants) {
100
+ const moduleLabel = `module-forgeax::default-standard-pbr#${variant.definesKey}`;
101
+ let module = prewarmedModules.get(variant.composedWgsl);
102
+ if (module === undefined) {
103
+ const result = await compile(variant, moduleLabel);
104
+ if (!result.ok) throw result.error;
105
+ module = result.value;
106
+ prewarmedModules.set(variant.composedWgsl, module);
107
+ }
108
+ seed(moduleLabel, module);
109
+ }
110
+ }
111
+
112
+ /** Select the declared Standard URP transmission variants for exact prewarm. */
113
+ export function selectStandardPbrTransmissionPrewarmVariants(
114
+ manifestEntry: MaterialShaderManifestEntry | undefined,
115
+ storageBufferCapable: boolean,
116
+ directionalPcssAvailable = true,
117
+ projectorAvailable: boolean = true,
118
+ extendedLightingShaderAvailable = true,
119
+ ): readonly MaterialShaderManifestEntry['variants'][number][] {
120
+ if (manifestEntry === undefined) {
121
+ throw new Error('Standard material shader manifest row is missing');
122
+ }
123
+ const selected: MaterialShaderManifestEntry['variants'][number][] = [];
124
+ for (const transmissionAvailable of [false, true]) {
125
+ const declared = manifestEntry.variants.find(
126
+ (variant) =>
127
+ variant.defines.STORAGE_BUFFER_AVAILABLE === storageBufferCapable &&
128
+ variant.defines.CLUSTER_FORWARD_AVAILABLE === standardBootClusterAxis() &&
129
+ variant.defines.VERTEX_COLOR_AVAILABLE === false &&
130
+ (!('DIRECTIONAL_PCSS_AVAILABLE' in variant.defines) ||
131
+ variant.defines.DIRECTIONAL_PCSS_AVAILABLE === directionalPcssAvailable) &&
132
+ (!('PROJECTOR_AVAILABLE' in variant.defines) ||
133
+ variant.defines.PROJECTOR_AVAILABLE === projectorAvailable) &&
134
+ (!('EXTENDED_LIGHTING_AVAILABLE' in variant.defines) ||
135
+ variant.defines.EXTENDED_LIGHTING_AVAILABLE === extendedLightingShaderAvailable) &&
136
+ variant.defines.PROBE_BLEND_AVAILABLE !== true &&
137
+ variant.defines.TRANSMISSION_AVAILABLE === transmissionAvailable,
138
+ );
139
+ if (declared === undefined) {
140
+ throw new Error(
141
+ `Standard material shader manifest lacks exact TRANSMISSION_AVAILABLE=${transmissionAvailable} prewarm variant`,
142
+ );
143
+ }
144
+ const exact = findVariantByKey(manifestEntry, declared.definesKey);
145
+ if (exact === undefined) {
146
+ throw new Error(
147
+ `Standard material shader manifest exact lookup failed for TRANSMISSION_AVAILABLE=${transmissionAvailable}`,
148
+ );
149
+ }
150
+ selected.push(exact);
151
+ }
152
+ return selected;
153
+ }
154
+
155
+ function standardBootClusterAxis(): boolean {
156
+ return false;
157
+ }
@@ -0,0 +1,14 @@
1
+ import { VIEW_UNIFORM_BUFFER_SIZE } from '../record/view-ubo';
2
+
3
+ /** Generation-scoped buffer and attachment constants used by the ready builder. */
4
+ export const VIEW_UBO_BYTES = VIEW_UNIFORM_BUFFER_SIZE;
5
+ export const MIPMAP_PREWARM_FORMATS: readonly GPUTextureFormat[] = [
6
+ 'rgba8unorm-srgb',
7
+ 'rgba8unorm',
8
+ 'rgba16float',
9
+ ];
10
+ export const BRIGHT_PARAMS_BYTES = 16;
11
+ export const BLUR_PARAMS_BYTES = 16;
12
+ export const COMPOSITE_PARAMS_BYTES = 16;
13
+ export const HDR_COLOR_ATTACHMENT_FORMAT: GPUTextureFormat = 'rgba16float';
14
+ export const DEPTH_TEXTURE_FORMAT: GPUTextureFormat = 'depth24plus-stencil8';