@flighthq/scene3d-gl 0.2.1-next.840.857425c

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 (284) hide show
  1. package/dist/anisotropyPbrGlMeshMaterialRenderer.d.ts +4 -0
  2. package/dist/anisotropyPbrGlMeshMaterialRenderer.d.ts.map +1 -0
  3. package/dist/anisotropyPbrGlMeshMaterialRenderer.js +45 -0
  4. package/dist/anisotropyPbrGlMeshMaterialRenderer.js.map +1 -0
  5. package/dist/blinnPhongGlMeshMaterialRenderer.d.ts +4 -0
  6. package/dist/blinnPhongGlMeshMaterialRenderer.d.ts.map +1 -0
  7. package/dist/blinnPhongGlMeshMaterialRenderer.js +102 -0
  8. package/dist/blinnPhongGlMeshMaterialRenderer.js.map +1 -0
  9. package/dist/clearcoatPbrGlMeshMaterialRenderer.d.ts +4 -0
  10. package/dist/clearcoatPbrGlMeshMaterialRenderer.d.ts.map +1 -0
  11. package/dist/clearcoatPbrGlMeshMaterialRenderer.js +45 -0
  12. package/dist/clearcoatPbrGlMeshMaterialRenderer.js.map +1 -0
  13. package/dist/customShaderGlMeshMaterialRenderer.d.ts +6 -0
  14. package/dist/customShaderGlMeshMaterialRenderer.d.ts.map +1 -0
  15. package/dist/customShaderGlMeshMaterialRenderer.js +136 -0
  16. package/dist/customShaderGlMeshMaterialRenderer.js.map +1 -0
  17. package/dist/depthGlMeshMaterialRenderer.d.ts +4 -0
  18. package/dist/depthGlMeshMaterialRenderer.d.ts.map +1 -0
  19. package/dist/depthGlMeshMaterialRenderer.js +36 -0
  20. package/dist/depthGlMeshMaterialRenderer.js.map +1 -0
  21. package/dist/drawGlScene3D.d.ts +3 -0
  22. package/dist/drawGlScene3D.d.ts.map +1 -0
  23. package/dist/drawGlScene3D.js +251 -0
  24. package/dist/drawGlScene3D.js.map +1 -0
  25. package/dist/emissiveGlMeshMaterialRenderer.d.ts +4 -0
  26. package/dist/emissiveGlMeshMaterialRenderer.d.ts.map +1 -0
  27. package/dist/emissiveGlMeshMaterialRenderer.js +49 -0
  28. package/dist/emissiveGlMeshMaterialRenderer.js.map +1 -0
  29. package/dist/enableGlScene3DColorSpaceGuards.d.ts +4 -0
  30. package/dist/enableGlScene3DColorSpaceGuards.d.ts.map +1 -0
  31. package/dist/enableGlScene3DColorSpaceGuards.js +22 -0
  32. package/dist/enableGlScene3DColorSpaceGuards.js.map +1 -0
  33. package/dist/enableGlScene3DCustomShaderGuards.d.ts +4 -0
  34. package/dist/enableGlScene3DCustomShaderGuards.d.ts.map +1 -0
  35. package/dist/enableGlScene3DCustomShaderGuards.js +71 -0
  36. package/dist/enableGlScene3DCustomShaderGuards.js.map +1 -0
  37. package/dist/enableGlScene3DDeformGuards.d.ts +4 -0
  38. package/dist/enableGlScene3DDeformGuards.d.ts.map +1 -0
  39. package/dist/enableGlScene3DDeformGuards.js +42 -0
  40. package/dist/enableGlScene3DDeformGuards.js.map +1 -0
  41. package/dist/enableGlScene3DForwardLightSelectionGuards.d.ts +4 -0
  42. package/dist/enableGlScene3DForwardLightSelectionGuards.d.ts.map +1 -0
  43. package/dist/enableGlScene3DForwardLightSelectionGuards.js +21 -0
  44. package/dist/enableGlScene3DForwardLightSelectionGuards.js.map +1 -0
  45. package/dist/explainGlScene3DForwardLightSelection.d.ts +3 -0
  46. package/dist/explainGlScene3DForwardLightSelection.d.ts.map +1 -0
  47. package/dist/explainGlScene3DForwardLightSelection.js +19 -0
  48. package/dist/explainGlScene3DForwardLightSelection.js.map +1 -0
  49. package/dist/glClassicPrelude.d.ts +9 -0
  50. package/dist/glClassicPrelude.d.ts.map +1 -0
  51. package/dist/glClassicPrelude.js +288 -0
  52. package/dist/glClassicPrelude.js.map +1 -0
  53. package/dist/glDebugPrelude.d.ts +9 -0
  54. package/dist/glDebugPrelude.d.ts.map +1 -0
  55. package/dist/glDebugPrelude.js +143 -0
  56. package/dist/glDebugPrelude.js.map +1 -0
  57. package/dist/glEnvironmentCube.d.ts +5 -0
  58. package/dist/glEnvironmentCube.d.ts.map +1 -0
  59. package/dist/glEnvironmentCube.js +65 -0
  60. package/dist/glEnvironmentCube.js.map +1 -0
  61. package/dist/glEnvironmentIblBake.d.ts +4 -0
  62. package/dist/glEnvironmentIblBake.d.ts.map +1 -0
  63. package/dist/glEnvironmentIblBake.js +365 -0
  64. package/dist/glEnvironmentIblBake.js.map +1 -0
  65. package/dist/glEnvironmentSkybox.d.ts +3 -0
  66. package/dist/glEnvironmentSkybox.d.ts.map +1 -0
  67. package/dist/glEnvironmentSkybox.js +95 -0
  68. package/dist/glEnvironmentSkybox.js.map +1 -0
  69. package/dist/glLitProgram.d.ts +5 -0
  70. package/dist/glLitProgram.d.ts.map +1 -0
  71. package/dist/glLitProgram.js +211 -0
  72. package/dist/glLitProgram.js.map +1 -0
  73. package/dist/glMatcapPrelude.d.ts +8 -0
  74. package/dist/glMatcapPrelude.d.ts.map +1 -0
  75. package/dist/glMatcapPrelude.js +118 -0
  76. package/dist/glMatcapPrelude.js.map +1 -0
  77. package/dist/glMeshMaterialRegistry.d.ts +5 -0
  78. package/dist/glMeshMaterialRegistry.d.ts.map +1 -0
  79. package/dist/glMeshMaterialRegistry.js +29 -0
  80. package/dist/glMeshMaterialRegistry.js.map +1 -0
  81. package/dist/glMeshProgram.d.ts +14 -0
  82. package/dist/glMeshProgram.d.ts.map +1 -0
  83. package/dist/glMeshProgram.js +193 -0
  84. package/dist/glMeshProgram.js.map +1 -0
  85. package/dist/glMeshUpload.d.ts +4 -0
  86. package/dist/glMeshUpload.d.ts.map +1 -0
  87. package/dist/glMeshUpload.js +190 -0
  88. package/dist/glMeshUpload.js.map +1 -0
  89. package/dist/glParticleEmitter3D.d.ts +4 -0
  90. package/dist/glParticleEmitter3D.d.ts.map +1 -0
  91. package/dist/glParticleEmitter3D.js +342 -0
  92. package/dist/glParticleEmitter3D.js.map +1 -0
  93. package/dist/glPbrPrelude.d.ts +8 -0
  94. package/dist/glPbrPrelude.d.ts.map +1 -0
  95. package/dist/glPbrPrelude.js +569 -0
  96. package/dist/glPbrPrelude.js.map +1 -0
  97. package/dist/glPbrProgramCache.d.ts +4 -0
  98. package/dist/glPbrProgramCache.d.ts.map +1 -0
  99. package/dist/glPbrProgramCache.js +63 -0
  100. package/dist/glPbrProgramCache.js.map +1 -0
  101. package/dist/glPbrStandardBlock.d.ts +13 -0
  102. package/dist/glPbrStandardBlock.d.ts.map +1 -0
  103. package/dist/glPbrStandardBlock.js +107 -0
  104. package/dist/glPbrStandardBlock.js.map +1 -0
  105. package/dist/glScene3DRuntime.d.ts +5 -0
  106. package/dist/glScene3DRuntime.d.ts.map +1 -0
  107. package/dist/glScene3DRuntime.js +99 -0
  108. package/dist/glScene3DRuntime.js.map +1 -0
  109. package/dist/glScene3DTestHelper.d.ts +20 -0
  110. package/dist/glScene3DTestHelper.d.ts.map +1 -0
  111. package/dist/glScene3DTestHelper.js +178 -0
  112. package/dist/glScene3DTestHelper.js.map +1 -0
  113. package/dist/glScene3DTime.d.ts +4 -0
  114. package/dist/glScene3DTime.d.ts.map +1 -0
  115. package/dist/glScene3DTime.js +18 -0
  116. package/dist/glScene3DTime.js.map +1 -0
  117. package/dist/glShadedBuiltInModifiers.d.ts +11 -0
  118. package/dist/glShadedBuiltInModifiers.d.ts.map +1 -0
  119. package/dist/glShadedBuiltInModifiers.js +386 -0
  120. package/dist/glShadedBuiltInModifiers.js.map +1 -0
  121. package/dist/glShadedModifierSnippet.d.ts +4 -0
  122. package/dist/glShadedModifierSnippet.d.ts.map +1 -0
  123. package/dist/glShadedModifierSnippet.js +24 -0
  124. package/dist/glShadedModifierSnippet.js.map +1 -0
  125. package/dist/glShadedPrelude.d.ts +5 -0
  126. package/dist/glShadedPrelude.d.ts.map +1 -0
  127. package/dist/glShadedPrelude.js +393 -0
  128. package/dist/glShadedPrelude.js.map +1 -0
  129. package/dist/glShadowMap.d.ts +3 -0
  130. package/dist/glShadowMap.d.ts.map +1 -0
  131. package/dist/glShadowMap.js +150 -0
  132. package/dist/glShadowMap.js.map +1 -0
  133. package/dist/glToonPrelude.d.ts +7 -0
  134. package/dist/glToonPrelude.d.ts.map +1 -0
  135. package/dist/glToonPrelude.js +172 -0
  136. package/dist/glToonPrelude.js.map +1 -0
  137. package/dist/glUnlitPrelude.d.ts +9 -0
  138. package/dist/glUnlitPrelude.d.ts.map +1 -0
  139. package/dist/glUnlitPrelude.js +160 -0
  140. package/dist/glUnlitPrelude.js.map +1 -0
  141. package/dist/glWireframePrelude.d.ts +6 -0
  142. package/dist/glWireframePrelude.d.ts.map +1 -0
  143. package/dist/glWireframePrelude.js +56 -0
  144. package/dist/glWireframePrelude.js.map +1 -0
  145. package/dist/glWireframeUpload.d.ts +4 -0
  146. package/dist/glWireframeUpload.d.ts.map +1 -0
  147. package/dist/glWireframeUpload.js +85 -0
  148. package/dist/glWireframeUpload.js.map +1 -0
  149. package/dist/index.d.ts +56 -0
  150. package/dist/index.d.ts.map +1 -0
  151. package/dist/index.js +56 -0
  152. package/dist/index.js.map +1 -0
  153. package/dist/iridescencePbrGlMeshMaterialRenderer.d.ts +4 -0
  154. package/dist/iridescencePbrGlMeshMaterialRenderer.d.ts.map +1 -0
  155. package/dist/iridescencePbrGlMeshMaterialRenderer.js +54 -0
  156. package/dist/iridescencePbrGlMeshMaterialRenderer.js.map +1 -0
  157. package/dist/lambertGlMeshMaterialRenderer.d.ts +4 -0
  158. package/dist/lambertGlMeshMaterialRenderer.d.ts.map +1 -0
  159. package/dist/lambertGlMeshMaterialRenderer.js +70 -0
  160. package/dist/lambertGlMeshMaterialRenderer.js.map +1 -0
  161. package/dist/matcapGlMeshMaterialRenderer.d.ts +4 -0
  162. package/dist/matcapGlMeshMaterialRenderer.d.ts.map +1 -0
  163. package/dist/matcapGlMeshMaterialRenderer.js +49 -0
  164. package/dist/matcapGlMeshMaterialRenderer.js.map +1 -0
  165. package/dist/normalGlMeshMaterialRenderer.d.ts +4 -0
  166. package/dist/normalGlMeshMaterialRenderer.d.ts.map +1 -0
  167. package/dist/normalGlMeshMaterialRenderer.js +39 -0
  168. package/dist/normalGlMeshMaterialRenderer.js.map +1 -0
  169. package/dist/phongGlMeshMaterialRenderer.d.ts +4 -0
  170. package/dist/phongGlMeshMaterialRenderer.d.ts.map +1 -0
  171. package/dist/phongGlMeshMaterialRenderer.js +90 -0
  172. package/dist/phongGlMeshMaterialRenderer.js.map +1 -0
  173. package/dist/prepareGlScene3DForwardLights.d.ts +3 -0
  174. package/dist/prepareGlScene3DForwardLights.d.ts.map +1 -0
  175. package/dist/prepareGlScene3DForwardLights.js +117 -0
  176. package/dist/prepareGlScene3DForwardLights.js.map +1 -0
  177. package/dist/presentGlScene3D.d.ts +3 -0
  178. package/dist/presentGlScene3D.d.ts.map +1 -0
  179. package/dist/presentGlScene3D.js +21 -0
  180. package/dist/presentGlScene3D.js.map +1 -0
  181. package/dist/registerStandardPbrGlMaterial.d.ts +3 -0
  182. package/dist/registerStandardPbrGlMaterial.d.ts.map +1 -0
  183. package/dist/registerStandardPbrGlMaterial.js +11 -0
  184. package/dist/registerStandardPbrGlMaterial.js.map +1 -0
  185. package/dist/shadedGlMeshMaterialRenderer.d.ts +4 -0
  186. package/dist/shadedGlMeshMaterialRenderer.d.ts.map +1 -0
  187. package/dist/shadedGlMeshMaterialRenderer.js +135 -0
  188. package/dist/shadedGlMeshMaterialRenderer.js.map +1 -0
  189. package/dist/sheenPbrGlMeshMaterialRenderer.d.ts +4 -0
  190. package/dist/sheenPbrGlMeshMaterialRenderer.d.ts.map +1 -0
  191. package/dist/sheenPbrGlMeshMaterialRenderer.js +54 -0
  192. package/dist/sheenPbrGlMeshMaterialRenderer.js.map +1 -0
  193. package/dist/specularGlossinessPbrGlMeshMaterialRenderer.d.ts +4 -0
  194. package/dist/specularGlossinessPbrGlMeshMaterialRenderer.d.ts.map +1 -0
  195. package/dist/specularGlossinessPbrGlMeshMaterialRenderer.js +121 -0
  196. package/dist/specularGlossinessPbrGlMeshMaterialRenderer.js.map +1 -0
  197. package/dist/specularPbrGlMeshMaterialRenderer.d.ts +4 -0
  198. package/dist/specularPbrGlMeshMaterialRenderer.d.ts.map +1 -0
  199. package/dist/specularPbrGlMeshMaterialRenderer.js +55 -0
  200. package/dist/specularPbrGlMeshMaterialRenderer.js.map +1 -0
  201. package/dist/standardPbrGlMeshMaterialRenderer.d.ts +3 -0
  202. package/dist/standardPbrGlMeshMaterialRenderer.d.ts.map +1 -0
  203. package/dist/standardPbrGlMeshMaterialRenderer.js +35 -0
  204. package/dist/standardPbrGlMeshMaterialRenderer.js.map +1 -0
  205. package/dist/subsurfacePbrGlMeshMaterialRenderer.d.ts +4 -0
  206. package/dist/subsurfacePbrGlMeshMaterialRenderer.d.ts.map +1 -0
  207. package/dist/subsurfacePbrGlMeshMaterialRenderer.js +57 -0
  208. package/dist/subsurfacePbrGlMeshMaterialRenderer.js.map +1 -0
  209. package/dist/toonGlMeshMaterialRenderer.d.ts +4 -0
  210. package/dist/toonGlMeshMaterialRenderer.d.ts.map +1 -0
  211. package/dist/toonGlMeshMaterialRenderer.js +81 -0
  212. package/dist/toonGlMeshMaterialRenderer.js.map +1 -0
  213. package/dist/transmissionVolumePbrGlMeshMaterialRenderer.d.ts +4 -0
  214. package/dist/transmissionVolumePbrGlMeshMaterialRenderer.d.ts.map +1 -0
  215. package/dist/transmissionVolumePbrGlMeshMaterialRenderer.js +62 -0
  216. package/dist/transmissionVolumePbrGlMeshMaterialRenderer.js.map +1 -0
  217. package/dist/unlitGlMeshMaterialRenderer.d.ts +4 -0
  218. package/dist/unlitGlMeshMaterialRenderer.d.ts.map +1 -0
  219. package/dist/unlitGlMeshMaterialRenderer.js +61 -0
  220. package/dist/unlitGlMeshMaterialRenderer.js.map +1 -0
  221. package/dist/vertexColorGlMeshMaterialRenderer.d.ts +4 -0
  222. package/dist/vertexColorGlMeshMaterialRenderer.d.ts.map +1 -0
  223. package/dist/vertexColorGlMeshMaterialRenderer.js +54 -0
  224. package/dist/vertexColorGlMeshMaterialRenderer.js.map +1 -0
  225. package/dist/wireframeGlMeshMaterialRenderer.d.ts +4 -0
  226. package/dist/wireframeGlMeshMaterialRenderer.d.ts.map +1 -0
  227. package/dist/wireframeGlMeshMaterialRenderer.js +50 -0
  228. package/dist/wireframeGlMeshMaterialRenderer.js.map +1 -0
  229. package/package.json +58 -0
  230. package/src/anisotropyPbrGlMeshMaterialRenderer.test.ts +86 -0
  231. package/src/blinnPhongGlMeshMaterialRenderer.test.ts +94 -0
  232. package/src/clearcoatPbrGlMeshMaterialRenderer.test.ts +81 -0
  233. package/src/customShaderGlMeshMaterialRenderer.test.ts +169 -0
  234. package/src/depthGlMeshMaterialRenderer.test.ts +69 -0
  235. package/src/drawGlScene3D.test.ts +304 -0
  236. package/src/emissiveGlMeshMaterialRenderer.test.ts +60 -0
  237. package/src/enableGlScene3DColorSpaceGuards.test.ts +63 -0
  238. package/src/enableGlScene3DCustomShaderGuards.test.ts +85 -0
  239. package/src/enableGlScene3DDeformGuards.test.ts +98 -0
  240. package/src/enableGlScene3DForwardLightSelectionGuards.test.ts +84 -0
  241. package/src/explainGlScene3DForwardLightSelection.test.ts +32 -0
  242. package/src/glClassicPrelude.test.ts +214 -0
  243. package/src/glDebugPrelude.test.ts +94 -0
  244. package/src/glEnvironmentCube.test.ts +71 -0
  245. package/src/glEnvironmentIblBake.test.ts +31 -0
  246. package/src/glEnvironmentSkybox.test.ts +24 -0
  247. package/src/glLitProgram.test.ts +181 -0
  248. package/src/glMatcapPrelude.test.ts +74 -0
  249. package/src/glMeshMaterialRegistry.test.ts +52 -0
  250. package/src/glMeshProgram.test.ts +406 -0
  251. package/src/glMeshUpload.test.ts +311 -0
  252. package/src/glParticleEmitter3D.test.ts +280 -0
  253. package/src/glPbrPrelude.test.ts +178 -0
  254. package/src/glPbrProgramCache.test.ts +116 -0
  255. package/src/glPbrStandardBlock.test.ts +85 -0
  256. package/src/glScene3DRuntime.test.ts +108 -0
  257. package/src/glScene3DTime.test.ts +31 -0
  258. package/src/glShadedBuiltInModifiers.test.ts +377 -0
  259. package/src/glShadedModifierSnippet.test.ts +46 -0
  260. package/src/glShadedPrelude.test.ts +177 -0
  261. package/src/glShadowMap.test.ts +219 -0
  262. package/src/glToonPrelude.test.ts +118 -0
  263. package/src/glUnlitPrelude.test.ts +156 -0
  264. package/src/glWireframePrelude.test.ts +46 -0
  265. package/src/glWireframeUpload.test.ts +50 -0
  266. package/src/iridescencePbrGlMeshMaterialRenderer.test.ts +86 -0
  267. package/src/lambertGlMeshMaterialRenderer.test.ts +92 -0
  268. package/src/matcapGlMeshMaterialRenderer.test.ts +70 -0
  269. package/src/normalGlMeshMaterialRenderer.test.ts +69 -0
  270. package/src/phongGlMeshMaterialRenderer.test.ts +94 -0
  271. package/src/prepareGlScene3DForwardLights.test.ts +106 -0
  272. package/src/presentGlScene3D.test.ts +98 -0
  273. package/src/registerStandardPbrGlMaterial.test.ts +14 -0
  274. package/src/shadedGlMeshMaterialRenderer.test.ts +106 -0
  275. package/src/sheenPbrGlMeshMaterialRenderer.test.ts +83 -0
  276. package/src/specularGlossinessPbrGlMeshMaterialRenderer.test.ts +96 -0
  277. package/src/specularPbrGlMeshMaterialRenderer.test.ts +83 -0
  278. package/src/standardPbrGlMeshMaterialRenderer.test.ts +88 -0
  279. package/src/subsurfacePbrGlMeshMaterialRenderer.test.ts +86 -0
  280. package/src/toonGlMeshMaterialRenderer.test.ts +92 -0
  281. package/src/transmissionVolumePbrGlMeshMaterialRenderer.test.ts +93 -0
  282. package/src/unlitGlMeshMaterialRenderer.test.ts +88 -0
  283. package/src/vertexColorGlMeshMaterialRenderer.test.ts +60 -0
  284. package/src/wireframeGlMeshMaterialRenderer.test.ts +69 -0
@@ -0,0 +1,251 @@
1
+ import { createMatrix3, createMatrix4, setMatrix3NormalFromMatrix4 } from '@flighthq/geometry';
2
+ import { hasMeshGeometrySkin } from '@flighthq/mesh';
3
+ import { getNodeWorldMatrix4 } from '@flighthq/node';
4
+ import { prepareScene3DRender } from '@flighthq/render';
5
+ import { declareGlRenderTargetColorSpace, invalidateGlRenderStateCache } from '@flighthq/render-gl';
6
+ import { getNode3DWorldAlpha } from '@flighthq/scene3d';
7
+ import { DefaultMaterialKind, MAX_FORWARD_LIGHTS } from '@flighthq/types';
8
+ import { resolveGlMeshMaterialRenderer } from './glMeshMaterialRegistry';
9
+ import { drawGlScene3DParticleEmitter3Ds } from './glParticleEmitter3D';
10
+ import { getGlScene3DRuntime } from './glScene3DRuntime';
11
+ // True when a mesh should be GPU-skinned this draw: it carries a skin and its geometry has the joints0/
12
+ // weights0 channels. The bone palette is an RGBA32F data texture read via texelFetch, so the joint count
13
+ // is bounded by MAX_TEXTURE_SIZE (thousands of joints) rather than the vertex-uniform budget — there is
14
+ // no per-context capacity cap and no CPU fallback for large skeletons. The CPU skinning kernel in
15
+ // @flighthq/skeleton3d is retained only for bounds/picking, not as a draw fallback.
16
+ function isGpuSkinnedDraw(mesh) {
17
+ return mesh.skin != null && hasMeshGeometrySkin(mesh.geometry);
18
+ }
19
+ // Draws a prepared 3D scene on the Gl backend. The app runs prepareScene3DRender(state, scene, camera,
20
+ // lights) first (resolving world matrices, the camera view-projection, frustum culling, and the
21
+ // packed light block into the per-state Scene3DRenderList); drawGlScene3D retrieves that same cached list
22
+ // (prepareScene3DRender is idempotent per-state scratch) and, for each visible Mesh, draws each of its
23
+ // geometry subsets with the subset's resolved material's registered mesh-material renderer.
24
+ //
25
+ // The draw is two-phased for correct alpha compositing:
26
+ // Pass 1 (opaque): every subset whose material alphaMode is 'opaque' or 'mask', in scene-graph
27
+ // order. Depth writes are on. No blending.
28
+ // Pass 2 (blended): every subset whose material alphaMode is 'blend', sorted back-to-front by the
29
+ // mesh's world-space Z in view space (the mesh origin's projected depth). GL blending is enabled
30
+ // with SRC_ALPHA / ONE_MINUS_SRC_ALPHA for this pass and disabled after.
31
+ //
32
+ // Subsets sharing the same resolved renderer + material are drawn under a single bind (the seam's
33
+ // "contiguous run" contract): bind uploads the shared camera + light + material state once, then draw
34
+ // issues the per-subset indexed draw. A subset whose material resolves to no renderer (and no
35
+ // DefaultMaterialKind fallback) is skipped — no built-in fallback. Depth/cull state is owned by the
36
+ // material renderer's bind; the surrounding rgba16f + MSAA + depth scene target is the effect
37
+ // pipeline's (beginGlRenderEffectPipeline), not drawGlScene3D's.
38
+ //
39
+ // Draw-entry pools and per-frame draw lists are held on the GlScene3DRuntime so two independent render
40
+ // states never share allocation (module-level singletons would interleave if two states drew in the
41
+ // same tick, even though JS is single-threaded today).
42
+ export function drawGlScene3D(state, scene, camera, lights, forwardLights) {
43
+ const list = prepareScene3DRender(state, scene, camera, lights);
44
+ const lightBlock = list.lights;
45
+ const viewProjection = list.viewProjection;
46
+ const runtime = getGlScene3DRuntime(state);
47
+ const hasPreparedForwardLights = forwardLights !== undefined && forwardLights.meshCount === list.meshCount;
48
+ if (!hasPreparedForwardLights && hasExcessForwardLights(lights))
49
+ runtime.forwardLightSelectionGuard?.(lights);
50
+ // Scene3D materials output linear HDR radiance, so declare the target being rendered into as 'linear':
51
+ // the present (presentGlScene3D, or the effect pipeline's adapting present) reads that back and applies
52
+ // the single sRGB encode. Drawing straight to the canvas (no bound target) has no present pass to
53
+ // encode — the output reaches the canvas un-encoded (dark); the opt-in color-space guard flags it.
54
+ if (!declareGlRenderTargetColorSpace(state, 'linear'))
55
+ runtime.colorSpaceGuard?.();
56
+ // Partition visible mesh subsets into opaque and blended draw lists. Each entry carries everything
57
+ // needed for the draw step so the two passes can iterate independently.
58
+ const opaqueDrawList = runtime.opaqueDrawList;
59
+ const blendedDrawList = runtime.blendedDrawList;
60
+ recycleDrawEntries(opaqueDrawList, runtime.opaquePool);
61
+ recycleDrawEntries(blendedDrawList, runtime.blendedPool);
62
+ // Morph is NOT blended here, and skin palettes are NOT computed here. The app readies both before
63
+ // prepareScene3DRender (prepareScene3DMorph in @flighthq/scene3d, prepareScene3DSkinning in @flighthq/skeleton3d)
64
+ // so the cull sees the posed bounds instead of lagging a frame and the uploaded buffer already reflects
65
+ // this frame's pose. A mesh that reaches this draw undeformed is a missing-prepare-call bug the opt-in
66
+ // deform guard reports (enableGlScene3DDeformGuards); the draw does not silently self-heal it, which would
67
+ // mask both the cull lag and the guard.
68
+ const deformGuard = runtime.deformGuard;
69
+ for (let m = 0; m < list.meshCount; m++) {
70
+ const mesh = list.visibleMeshes[m];
71
+ if (deformGuard != null)
72
+ deformGuard(mesh);
73
+ const subsets = mesh.geometry.subsets;
74
+ const worldMatrix = getNodeWorldMatrix4(mesh);
75
+ // Compute the mesh origin's clip-space W (a proxy for view-depth). The world origin is
76
+ // (worldMatrix.m[12], worldMatrix.m[13], worldMatrix.m[14]). We only need the W component of
77
+ // clip = VP * worldOrigin, which is the dot of VP row-3 with the homogeneous world position:
78
+ // w_clip = vp[3]*wx + vp[7]*wy + vp[11]*wz + vp[15]
79
+ // Larger W = farther from camera (in standard OpenGL NDC). Read world translation from column 3.
80
+ const wx = worldMatrix.m[12];
81
+ const wy = worldMatrix.m[13];
82
+ const wz = worldMatrix.m[14];
83
+ const vp = viewProjection.m;
84
+ const clipW = vp[3] * wx + vp[7] * wy + vp[11] * wz + vp[15];
85
+ // Resolved per-object opacity (parent×self), constant across a mesh's subsets. A fading object
86
+ // (alpha < 1) must route through the blended pass so it composites over what is behind it.
87
+ const objectAlpha = getNode3DWorldAlpha(mesh);
88
+ for (let s = 0; s < subsets.length; s++) {
89
+ const material = resolveSubsetMaterial(mesh, s);
90
+ const renderer = resolveGlMeshMaterialRenderer(state, material);
91
+ if (renderer === null)
92
+ continue;
93
+ const resolvedMaterial = material ?? DEFAULT_MATERIAL;
94
+ const isBlended = isBlendedMaterial(resolvedMaterial) || objectAlpha < 1;
95
+ const entry = acquireDrawEntry(isBlended ? runtime.blendedPool : runtime.opaquePool);
96
+ entry.alpha = objectAlpha;
97
+ entry.clipW = clipW;
98
+ entry.lightBlock = hasPreparedForwardLights ? forwardLights.meshLightBlocks[m] : lightBlock;
99
+ entry.mesh = mesh;
100
+ entry.material = resolvedMaterial;
101
+ entry.renderer = renderer;
102
+ entry.subset = subsets[s];
103
+ entry.worldMatrix = worldMatrix;
104
+ if (isBlended) {
105
+ blendedDrawList.push(entry);
106
+ }
107
+ else {
108
+ opaqueDrawList.push(entry);
109
+ }
110
+ }
111
+ }
112
+ // Pass 1: opaque + mask subsets in scene-graph order. No blending; depth-write on (set by bind).
113
+ let boundMaterial = undefined;
114
+ let boundLightBlock = null;
115
+ let boundRenderer = null;
116
+ let boundSkinned = undefined;
117
+ for (let i = 0; i < opaqueDrawList.length; i++) {
118
+ const entry = opaqueDrawList[i];
119
+ const worldMatrix = entry.worldMatrix;
120
+ setMatrix3NormalFromMatrix4(scratchNormalMatrix, worldMatrix);
121
+ // A skinned run selects the HAS_SKIN program variant; split runs on it (a rigid and a skinned mesh
122
+ // sharing a material need different programs). Set the flag before bind so ensureGl*Program folds it in.
123
+ const skinned = isGpuSkinnedDraw(entry.mesh);
124
+ if (entry.renderer !== boundRenderer ||
125
+ entry.material !== boundMaterial ||
126
+ entry.lightBlock !== boundLightBlock ||
127
+ skinned !== boundSkinned) {
128
+ runtime.activeSkinnedRun = skinned;
129
+ entry.renderer.bind(state, entry.material, entry.lightBlock, camera);
130
+ boundRenderer = entry.renderer;
131
+ boundMaterial = entry.material;
132
+ boundLightBlock = entry.lightBlock;
133
+ boundSkinned = skinned;
134
+ }
135
+ proxy.alpha = entry.alpha;
136
+ proxy.jointMatrices = skinned ? entry.mesh.skin.skeleton.jointMatrices : null;
137
+ proxy.material = entry.material;
138
+ proxy.normalMatrix = scratchNormalMatrix;
139
+ proxy.subset = entry.subset;
140
+ proxy.worldMatrix = worldMatrix;
141
+ entry.renderer.draw(state, proxy, entry.mesh.geometry);
142
+ }
143
+ // Pass 2: blended subsets sorted back-to-front (descending clipW = farthest drawn first so nearer
144
+ // layers composite correctly). Enable alpha blending for this pass; disable after.
145
+ if (blendedDrawList.length > 0) {
146
+ blendedDrawList.sort(compareBlendedEntriesDescending);
147
+ const gl = state.gl;
148
+ gl.enable(gl.BLEND);
149
+ gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
150
+ boundMaterial = undefined;
151
+ boundLightBlock = null;
152
+ boundRenderer = null;
153
+ boundSkinned = undefined;
154
+ for (let i = 0; i < blendedDrawList.length; i++) {
155
+ const entry = blendedDrawList[i];
156
+ const worldMatrix = entry.worldMatrix;
157
+ setMatrix3NormalFromMatrix4(scratchNormalMatrix, worldMatrix);
158
+ const skinned = isGpuSkinnedDraw(entry.mesh);
159
+ if (entry.renderer !== boundRenderer ||
160
+ entry.material !== boundMaterial ||
161
+ entry.lightBlock !== boundLightBlock ||
162
+ skinned !== boundSkinned) {
163
+ runtime.activeSkinnedRun = skinned;
164
+ entry.renderer.bind(state, entry.material, entry.lightBlock, camera);
165
+ boundRenderer = entry.renderer;
166
+ boundMaterial = entry.material;
167
+ boundLightBlock = entry.lightBlock;
168
+ boundSkinned = skinned;
169
+ }
170
+ proxy.alpha = entry.alpha;
171
+ proxy.jointMatrices = skinned ? entry.mesh.skin.skeleton.jointMatrices : null;
172
+ proxy.material = entry.material;
173
+ proxy.normalMatrix = scratchNormalMatrix;
174
+ proxy.subset = entry.subset;
175
+ proxy.worldMatrix = worldMatrix;
176
+ entry.renderer.draw(state, proxy, entry.mesh.geometry);
177
+ }
178
+ gl.disable(gl.BLEND);
179
+ }
180
+ // ParticleEmitter3D nodes carry no geometry, so prepareScene3DRender never lists them among the
181
+ // visible meshes above. Draw them here as a final transparent instanced pass so the common
182
+ // drawGlScene3D path renders a scene's emitters without the caller also invoking the emitter pass
183
+ // by hand. drawGlScene3DParticleEmitter3Ds stays exported for manual ordering; it early-returns (and
184
+ // skips its own cache invalidation) when the scene has no emitters, so the mesh-only path is
185
+ // unaffected and the invalidate below still covers it.
186
+ drawGlScene3DParticleEmitter3Ds(state, scene, camera, lights);
187
+ // Mesh/skybox/shadow binds above issued raw gl.useProgram/blendFunc/bindFramebuffer calls that
188
+ // render-gl's own binding cache did not observe. Invalidate it so the next render-gl operation —
189
+ // typically the effect-pipeline present pass or a 2D display-list draw — re-binds from scratch
190
+ // instead of setting uniforms against a program that is no longer bound.
191
+ invalidateGlRenderStateCache(state);
192
+ }
193
+ // Returns true when a material's alphaMode is 'blend'. All other modes (opaque, mask, and unknown
194
+ // kinds that do not carry a SurfaceMaterial trailer) go through the opaque pass. Reads alphaMode
195
+ // via structural duck-typing so any SurfaceMaterial subtype triggers the blended pass without
196
+ // requiring an import of SurfaceMaterial here.
197
+ function isBlendedMaterial(material) {
198
+ return material.alphaMode === 'blend';
199
+ }
200
+ function hasExcessForwardLights(lights) {
201
+ return (lights.point?.length ?? 0) > MAX_FORWARD_LIGHTS || (lights.spot?.length ?? 0) > MAX_FORWARD_LIGHTS;
202
+ }
203
+ // Resolves the Material for a subset index: the positional materials[i] entry, or null when the
204
+ // slot is absent/null (the registry then falls back to DefaultMaterialKind, or skips the subset).
205
+ function resolveSubsetMaterial(mesh, subsetIndex) {
206
+ const materials = mesh.materials;
207
+ return subsetIndex < materials.length ? materials[subsetIndex] : null;
208
+ }
209
+ // Sort comparator for blended entries: descending clipW so farthest (largest W) is drawn first.
210
+ function compareBlendedEntriesDescending(a, b) {
211
+ return b.clipW - a.clipW;
212
+ }
213
+ // Takes from the per-runtime pool or allocates a fresh entry.
214
+ function acquireDrawEntry(pool) {
215
+ if (pool.length > 0)
216
+ return pool.pop();
217
+ return createDrawEntry();
218
+ }
219
+ // Returns last frame's entries to their per-state pool before the lists are rebuilt. A reverse move is
220
+ // sufficient because partitioning overwrites every semantic field; stable transparency order comes
221
+ // from the current frame's sort, not retained record position.
222
+ function recycleDrawEntries(entries, pool) {
223
+ while (entries.length > 0)
224
+ pool.push(entries.pop());
225
+ }
226
+ function createDrawEntry() {
227
+ return {
228
+ alpha: 1,
229
+ clipW: 0,
230
+ lightBlock: null,
231
+ material: DEFAULT_MATERIAL,
232
+ mesh: null,
233
+ renderer: null,
234
+ subset: { indexCount: 0, indexOffset: 0 },
235
+ worldMatrix: createMatrix4(),
236
+ };
237
+ }
238
+ // The reused per-draw proxy handed to a renderer's draw. Owned by drawGlScene3D, valid only for the
239
+ // duration of the draw call it is passed to; renderers must not retain it.
240
+ const proxy = {
241
+ jointMatrices: null,
242
+ material: { kind: DefaultMaterialKind },
243
+ normalMatrix: createMatrix3(),
244
+ subset: { indexCount: 0, indexOffset: 0 },
245
+ worldMatrix: createMatrix4(),
246
+ };
247
+ // Placeholder material for proxy.material when a subset resolved to the default-kind fallback with
248
+ // no concrete material; the renderer treats a default/null material as its untextured defaults.
249
+ const DEFAULT_MATERIAL = { kind: DefaultMaterialKind };
250
+ const scratchNormalMatrix = createMatrix3();
251
+ //# sourceMappingURL=drawGlScene3D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drawGlScene3D.js","sourceRoot":"","sources":["../src/drawGlScene3D.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { GlMeshMaterialRenderer, GlRenderState } from '@flighthq/types';
2
+ export declare const emissiveGlMeshMaterialRenderer: GlMeshMaterialRenderer;
3
+ export declare function registerEmissiveGlMaterial(state: GlRenderState): void;
4
+ //# sourceMappingURL=emissiveGlMeshMaterialRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emissiveGlMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/emissiveGlMeshMaterialRenderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAIV,sBAAsB,EACtB,aAAa,EAMd,MAAM,iBAAiB,CAAC;AAkBzB,eAAO,MAAM,8BAA8B,EAAE,sBAkC5C,CAAC;AAKF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAErE"}
@@ -0,0 +1,49 @@
1
+ import { unpackColorToLinear } from '@flighthq/color';
2
+ import { EmissiveMaterialKind } from '@flighthq/types';
3
+ import { registerGlMeshMaterialRenderer } from './glMeshMaterialRegistry';
4
+ import { beginGlMeshDraw, bindGlUvTransform, drawGlMeshSubset, hasGlUvTransform, setGlMeshViewProjection, } from './glMeshProgram';
5
+ import { getGlScene3DRuntime } from './glScene3DRuntime';
6
+ import { bindGlUnlitSurface, ensureGlUnlitProgram } from './glUnlitPrelude';
7
+ // The built-in Emissive forward renderer (GlMeshMaterialRenderer for EmissiveMaterialKind). Self-
8
+ // illuminating and lighting-independent: bind selects the unlit variant for the emissive map / alpha
9
+ // mode and uploads the linear emissive color scaled by emissiveStrength (values > 1 drive bloom over
10
+ // the rgba16f scene target). Lights are ignored. See registerEmissiveGlMaterial to install it.
11
+ export const emissiveGlMeshMaterialRenderer = {
12
+ bind(state, material, _lights, camera) {
13
+ const gl = state.gl;
14
+ const emissive = material;
15
+ const program = ensureGlUnlitProgram(state, defineKeyForMaterial(emissive));
16
+ beginGlMeshDraw(state, program, emissive !== null && emissive.doubleSided);
17
+ setGlMeshViewProjection(gl, program.locViewProjection, camera);
18
+ if (emissive === null) {
19
+ bindGlUnlitSurface(state, program, WHITE, 1, null, 0.5);
20
+ return;
21
+ }
22
+ unpackColorToLinear(scratchRgba, emissive.emissive);
23
+ bindGlUnlitSurface(state, program, scratchRgba, emissive.emissiveStrength, emissive.emissiveMap, emissive.alphaCutoff);
24
+ bindGlUvTransform(gl, program, emissive.emissiveMap);
25
+ },
26
+ draw(state, proxy, geometry) {
27
+ const program = getGlScene3DRuntime(state).activeMeshProgram;
28
+ if (program === null)
29
+ return;
30
+ drawGlMeshSubset(state, program, proxy, geometry);
31
+ },
32
+ };
33
+ // Registers the built-in Emissive renderer for EmissiveMaterialKind on this state. Opt-in (no top-
34
+ // level side effect); call once per GlRenderState before drawScene3D so meshes with EmissiveMaterials
35
+ // draw.
36
+ export function registerEmissiveGlMaterial(state) {
37
+ registerGlMeshMaterialRenderer(state, EmissiveMaterialKind, emissiveGlMeshMaterialRenderer);
38
+ }
39
+ function defineKeyForMaterial(material) {
40
+ return {
41
+ alphaMaskEnabled: material !== null && material.alphaMode === 'mask',
42
+ hasColorMap: material !== null && material.emissiveMap !== null && material.emissiveMap.image !== null,
43
+ hasUvTransform: hasGlUvTransform(material !== null ? material.emissiveMap : null),
44
+ vertexColor: false,
45
+ };
46
+ }
47
+ const scratchRgba = [0, 0, 0, 0];
48
+ const WHITE = [1, 1, 1, 1];
49
+ //# sourceMappingURL=emissiveGlMeshMaterialRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emissiveGlMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/emissiveGlMeshMaterialRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAatD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE5E,kGAAkG;AAClG,qGAAqG;AACrG,qGAAqG;AACrG,+FAA+F;AAC/F,MAAM,CAAC,MAAM,8BAA8B,GAA2B;IACpE,IAAI,CACF,KAAoB,EACpB,QAAmC,EACnC,OAAoC,EACpC,MAA0B;QAE1B,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,QAA6C,CAAC;QAC/D,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,EAAE,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5E,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC3E,uBAAuB,CAAC,EAAE,EAAE,OAAO,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAE/D,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QACD,mBAAmB,CAAC,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACpD,kBAAkB,CAChB,KAAK,EACL,OAAO,EACP,WAAW,EACX,QAAQ,CAAC,gBAAgB,EACzB,QAAQ,CAAC,WAAW,EACpB,QAAQ,CAAC,WAAW,CACrB,CAAC;QACF,iBAAiB,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,CAAC,KAAoB,EAAE,KAAmC,EAAE,QAAgC;QAC9F,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC;QAC7D,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO;QAC7B,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;CACF,CAAC;AAEF,mGAAmG;AACnG,sGAAsG;AACtG,QAAQ;AACR,MAAM,UAAU,0BAA0B,CAAC,KAAoB;IAC7D,8BAA8B,CAAC,KAAK,EAAE,oBAAoB,EAAE,8BAA8B,CAAC,CAAC;AAC9F,CAAC;AAED,SAAS,oBAAoB,CAAC,QAA2C;IACvE,OAAO;QACL,gBAAgB,EAAE,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,SAAS,KAAK,MAAM;QACpE,WAAW,EAAE,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,WAAW,KAAK,IAAI,IAAI,QAAQ,CAAC,WAAW,CAAC,KAAK,KAAK,IAAI;QACtG,cAAc,EAAE,gBAAgB,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;QACjF,WAAW,EAAE,KAAK;KACnB,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9C,MAAM,KAAK,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { GlRenderState } from '@flighthq/types';
2
+ export declare function areGlScene3DColorSpaceGuardsEnabled(state: GlRenderState): boolean;
3
+ export declare function enableGlScene3DColorSpaceGuards(state: GlRenderState): void;
4
+ //# sourceMappingURL=enableGlScene3DColorSpaceGuards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enableGlScene3DColorSpaceGuards.d.ts","sourceRoot":"","sources":["../src/enableGlScene3DColorSpaceGuards.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAMrD,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAEjF;AAQD,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAE1E"}
@@ -0,0 +1,22 @@
1
+ import { logOnce } from '@flighthq/log';
2
+ import { LogLevel } from '@flighthq/types';
3
+ import { getGlScene3DRuntime } from './glScene3DRuntime';
4
+ // Returns whether the scene color-space guard is installed on `state` (enableGlScene3DColorSpaceGuards).
5
+ export function areGlScene3DColorSpaceGuardsEnabled(state) {
6
+ return getGlScene3DRuntime(state).colorSpaceGuard != null;
7
+ }
8
+ // Installs the shakeable scene color-space guard on `state`: when drawGlScene3D renders straight to the
9
+ // canvas (no bound render target), its linear HDR radiance reaches the 8-bit canvas with no present pass
10
+ // to apply the sRGB encode, so the frame looks dark. drawGlScene3D reaches this guard only through its
11
+ // nullable scene-runtime slot and warns once. Not calling this — the production default — costs the draw
12
+ // path nothing: the message and the @flighthq/log dependency live only in this separately-imported
13
+ // module. Idempotent.
14
+ export function enableGlScene3DColorSpaceGuards(state) {
15
+ getGlScene3DRuntime(state).colorSpaceGuard = warnGlScene3DDrawnToCanvas;
16
+ }
17
+ function warnGlScene3DDrawnToCanvas() {
18
+ logOnce('scene-gl:scene-drawn-to-canvas-unencoded', LogLevel.Warn, {
19
+ message: 'drawGlScene3D: scene drawn directly to the canvas — linear radiance is not sRGB-encoded (output will be dark). Render into a target and present with presentGlScene3D, or draw through the effect pipeline.',
20
+ }, 'scene-gl');
21
+ }
22
+ //# sourceMappingURL=enableGlScene3DColorSpaceGuards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enableGlScene3DColorSpaceGuards.js","sourceRoot":"","sources":["../src/enableGlScene3DColorSpaceGuards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,yGAAyG;AACzG,MAAM,UAAU,mCAAmC,CAAC,KAAoB;IACtE,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,eAAe,IAAI,IAAI,CAAC;AAC5D,CAAC;AAED,wGAAwG;AACxG,yGAAyG;AACzG,uGAAuG;AACvG,yGAAyG;AACzG,mGAAmG;AACnG,sBAAsB;AACtB,MAAM,UAAU,+BAA+B,CAAC,KAAoB;IAClE,mBAAmB,CAAC,KAAK,CAAC,CAAC,eAAe,GAAG,0BAA0B,CAAC;AAC1E,CAAC;AAED,SAAS,0BAA0B;IACjC,OAAO,CACL,0CAA0C,EAC1C,QAAQ,CAAC,IAAI,EACb;QACE,OAAO,EACL,6MAA6M;KAChN,EACD,UAAU,CACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { GlRenderState } from '@flighthq/types';
2
+ export declare function areGlScene3DCustomShaderGuardsEnabled(state: GlRenderState): boolean;
3
+ export declare function enableGlScene3DCustomShaderGuards(state: GlRenderState): void;
4
+ //# sourceMappingURL=enableGlScene3DCustomShaderGuards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enableGlScene3DCustomShaderGuards.d.ts","sourceRoot":"","sources":["../src/enableGlScene3DCustomShaderGuards.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAMrD,wBAAgB,qCAAqC,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAEnF;AASD,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAE5E"}
@@ -0,0 +1,71 @@
1
+ import { logOnce } from '@flighthq/log';
2
+ import { LogLevel } from '@flighthq/types';
3
+ import { getGlScene3DRuntime } from './glScene3DRuntime';
4
+ // Returns whether the scene custom-shader guard is installed on `state` (enableGlScene3DCustomShaderGuards).
5
+ export function areGlScene3DCustomShaderGuardsEnabled(state) {
6
+ return getGlScene3DRuntime(state).customShaderGuard != null;
7
+ }
8
+ // Installs the shakeable custom-shader material guard on `state`. When a CustomShaderMaterial's program
9
+ // is bound, the guard introspects its active uniforms and warns once per shader when a built-in uniform
10
+ // (u_model/u_viewProjection/u_normalMatrix/u_cameraPosition) is declared with a type the renderer does
11
+ // not upload. The dominant footgun is u_normalMatrix: the renderer uploads it as mat3 (glUniformMatrix3fv),
12
+ // so a shader declaring `mat4 u_normalMatrix` raises a silent GL_INVALID_OPERATION on every draw and
13
+ // renders nothing. The custom-shader renderer reaches this guard only through a nullable runtime slot, so
14
+ // the production draw path references no message and no @flighthq/log dependency. Idempotent.
15
+ export function enableGlScene3DCustomShaderGuards(state) {
16
+ getGlScene3DRuntime(state).customShaderGuard = warnGlCustomShaderUniformTypes;
17
+ }
18
+ // Maps a GL uniform-type enum to its GLSL type keyword, so a warning names the type a shader must declare
19
+ // rather than a raw enum. Only the types the built-in uniforms use (and their nearest neighbors) are named;
20
+ // anything else falls back to the raw enum so the message is still actionable.
21
+ function glUniformTypeName(gl, type) {
22
+ switch (type) {
23
+ case gl.FLOAT_MAT4:
24
+ return 'mat4';
25
+ case gl.FLOAT_MAT3:
26
+ return 'mat3';
27
+ case gl.FLOAT_MAT2:
28
+ return 'mat2';
29
+ case gl.FLOAT_VEC4:
30
+ return 'vec4';
31
+ case gl.FLOAT_VEC3:
32
+ return 'vec3';
33
+ case gl.FLOAT_VEC2:
34
+ return 'vec2';
35
+ case gl.FLOAT:
36
+ return 'float';
37
+ default:
38
+ return `gl-type-${type}`;
39
+ }
40
+ }
41
+ // Introspects a just-bound custom-shader program's active uniforms and warns once per (shader, uniform)
42
+ // when a built-in uniform's declared type differs from what drawGlMeshSubset uploads. Only active (used)
43
+ // uniforms are reported by getActiveUniform, so a declared-but-unused u_normalMatrix — which the renderer
44
+ // skips anyway (its location resolves null) — never trips the guard. Programs are checked once (cached in
45
+ // a WeakSet) so repeated per-frame binds do not re-introspect.
46
+ function warnGlCustomShaderUniformTypes(state, program, shaderKey) {
47
+ if (_checkedPrograms.has(program))
48
+ return;
49
+ _checkedPrograms.add(program);
50
+ const gl = state.gl;
51
+ const expected = new Map([
52
+ ['u_model', gl.FLOAT_MAT4],
53
+ ['u_viewProjection', gl.FLOAT_MAT4],
54
+ ['u_normalMatrix', gl.FLOAT_MAT3],
55
+ ['u_cameraPosition', gl.FLOAT_VEC3],
56
+ ]);
57
+ const count = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);
58
+ for (let i = 0; i < count; i++) {
59
+ const info = gl.getActiveUniform(program, i);
60
+ if (info === null)
61
+ continue;
62
+ const want = expected.get(info.name);
63
+ if (want === undefined || info.type === want)
64
+ continue;
65
+ logOnce(`scene-gl:custom-shader-uniform-type:${shaderKey}:${info.name}`, LogLevel.Warn, {
66
+ message: `customShaderGlMeshMaterialRenderer: shader "${shaderKey}" declares ${info.name} as ${glUniformTypeName(gl, info.type)} but the renderer uploads it as ${glUniformTypeName(gl, want)} — the mismatched upload raises a silent GL_INVALID_OPERATION and the draw is dropped. Declare '${glUniformTypeName(gl, want)} ${info.name}' in the shader.`,
67
+ }, 'scene-gl');
68
+ }
69
+ }
70
+ const _checkedPrograms = new WeakSet();
71
+ //# sourceMappingURL=enableGlScene3DCustomShaderGuards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enableGlScene3DCustomShaderGuards.js","sourceRoot":"","sources":["../src/enableGlScene3DCustomShaderGuards.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { GlRenderState } from '@flighthq/types';
2
+ export declare function areGlScene3DDeformGuardsEnabled(state: GlRenderState): boolean;
3
+ export declare function enableGlScene3DDeformGuards(state: GlRenderState): void;
4
+ //# sourceMappingURL=enableGlScene3DDeformGuards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enableGlScene3DDeformGuards.d.ts","sourceRoot":"","sources":["../src/enableGlScene3DDeformGuards.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAA8B,MAAM,iBAAiB,CAAC;AAMjF,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAE7E;AAUD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAEtE"}
@@ -0,0 +1,42 @@
1
+ import { logOnce } from '@flighthq/log';
2
+ import { getMeshGeometryMorphBindPose, hasMeshGeometrySkin } from '@flighthq/mesh';
3
+ import { getNodeRuntime } from '@flighthq/node';
4
+ import { LogLevel } from '@flighthq/types';
5
+ import { getGlScene3DRuntime } from './glScene3DRuntime';
6
+ // Returns whether the scene deform guard is installed on `state` (enableGlScene3DDeformGuards).
7
+ export function areGlScene3DDeformGuardsEnabled(state) {
8
+ return getGlScene3DRuntime(state).deformGuard != null;
9
+ }
10
+ // Installs the shakeable scene deform guard on `state`: drawGlScene3D calls it once per visible mesh, and
11
+ // it warns when a morphed or GPU-skinned mesh reaches the draw without its deform pass having run —
12
+ // prepareScene3DMorph (@flighthq/scene3d) for a morph, prepareScene3DSkinning (@flighthq/skeleton3d) for a
13
+ // skin. Both are silent-black footguns: an unblended morph draws the bind-pose mesh, and an unposed
14
+ // skin draws with a zero joint palette that collapses the mesh to the origin. drawGlScene3D reaches this
15
+ // guard only through its nullable scene-runtime slot; not calling this — the production default — costs
16
+ // the draw nothing, since the messages and the @flighthq/log dependency live only in this
17
+ // separately-imported module. Idempotent.
18
+ export function enableGlScene3DDeformGuards(state) {
19
+ getGlScene3DRuntime(state).deformGuard = warnGlScene3DMeshDrawnUndeformed;
20
+ }
21
+ // A morphed mesh whose base pose was never captured has never been blended: prepareScene3DMorph did not
22
+ // run, so the draw would upload the bind pose. A GPU-skinned mesh whose node runtime carries no posed
23
+ // bounds slot was never readied by prepareScene3DSkinning, so its joint palette is uncomputed (a zero
24
+ // palette collapses every skinned vertex to the origin). One warning per key, so a per-frame draw loop
25
+ // cannot spam. Keyed by neither mesh nor frame — the message names the fix, and once it is fixed it
26
+ // never fires again.
27
+ function warnGlScene3DMeshDrawnUndeformed(mesh) {
28
+ if (mesh.morph != null && getMeshGeometryMorphBindPose(mesh.geometry) === null) {
29
+ logOnce('scene-gl:morph-drawn-without-prepare', LogLevel.Warn, {
30
+ message: 'drawGlScene3D: a morphed mesh reached the draw un-blended (it will draw the bind pose) — call prepareScene3DMorph(scene) before prepareScene3DRender.',
31
+ }, 'scene-gl');
32
+ }
33
+ if (mesh.skin != null && hasMeshGeometrySkin(mesh.geometry)) {
34
+ const runtime = getNodeRuntime(mesh);
35
+ if (runtime.deformedLocalBounds == null) {
36
+ logOnce('scene-gl:skin-drawn-without-prepare', LogLevel.Warn, {
37
+ message: 'drawGlScene3D: a GPU-skinned mesh reached the draw un-posed (its joint palette is uncomputed, collapsing it to the origin) — call prepareScene3DSkinning(scene) before prepareScene3DRender.',
38
+ }, 'scene-gl');
39
+ }
40
+ }
41
+ }
42
+ //# sourceMappingURL=enableGlScene3DDeformGuards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enableGlScene3DDeformGuards.js","sourceRoot":"","sources":["../src/enableGlScene3DDeformGuards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,4BAA4B,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,gGAAgG;AAChG,MAAM,UAAU,+BAA+B,CAAC,KAAoB;IAClE,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC;AACxD,CAAC;AAED,0GAA0G;AAC1G,oGAAoG;AACpG,2GAA2G;AAC3G,oGAAoG;AACpG,yGAAyG;AACzG,wGAAwG;AACxG,0FAA0F;AAC1F,0CAA0C;AAC1C,MAAM,UAAU,2BAA2B,CAAC,KAAoB;IAC9D,mBAAmB,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,gCAAgC,CAAC;AAC5E,CAAC;AAED,wGAAwG;AACxG,sGAAsG;AACtG,sGAAsG;AACtG,uGAAuG;AACvG,oGAAoG;AACpG,qBAAqB;AACrB,SAAS,gCAAgC,CAAC,IAAU;IAClD,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,4BAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/E,OAAO,CACL,sCAAsC,EACtC,QAAQ,CAAC,IAAI,EACb;YACE,OAAO,EACL,uJAAuJ;SAC1J,EACD,UAAU,CACX,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5D,MAAM,OAAO,GAAG,cAAc,CAAC,IAAe,CAAgB,CAAC;QAC/D,IAAI,OAAO,CAAC,mBAAmB,IAAI,IAAI,EAAE,CAAC;YACxC,OAAO,CACL,qCAAqC,EACrC,QAAQ,CAAC,IAAI,EACb;gBACE,OAAO,EACL,8LAA8L;aACjM,EACD,UAAU,CACX,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { GlRenderState } from '@flighthq/types';
2
+ export declare function areGlScene3DForwardLightSelectionGuardsEnabled(state: GlRenderState): boolean;
3
+ export declare function enableGlScene3DForwardLightSelectionGuards(state: GlRenderState): void;
4
+ //# sourceMappingURL=enableGlScene3DForwardLightSelectionGuards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enableGlScene3DForwardLightSelectionGuards.d.ts","sourceRoot":"","sources":["../src/enableGlScene3DForwardLightSelectionGuards.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAqB,MAAM,iBAAiB,CAAC;AAMxE,wBAAgB,8CAA8C,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAE5F;AAKD,wBAAgB,0CAA0C,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAErF"}
@@ -0,0 +1,21 @@
1
+ import { logOnce } from '@flighthq/log';
2
+ import { LogLevel } from '@flighthq/types';
3
+ import { getGlScene3DRuntime } from './glScene3DRuntime';
4
+ // Returns whether the forward-light selection guard is installed on `state`.
5
+ export function areGlScene3DForwardLightSelectionGuardsEnabled(state) {
6
+ return getGlScene3DRuntime(state).forwardLightSelectionGuard != null;
7
+ }
8
+ // Installs the shakeable forward-light selection guard on `state`. drawGlScene3D reaches this guard
9
+ // only when point or spot input exceeds MAX_FORWARD_LIGHTS and no prepared per-object selection list
10
+ // was supplied. The message and @flighthq/log dependency remain outside the core draw module.
11
+ export function enableGlScene3DForwardLightSelectionGuards(state) {
12
+ getGlScene3DRuntime(state).forwardLightSelectionGuard = warnGlScene3DForwardLightSelectionRequired;
13
+ }
14
+ function warnGlScene3DForwardLightSelectionRequired(lights) {
15
+ logOnce('scene-gl:forward-light-selection-required', LogLevel.Warn, {
16
+ message: 'drawGlScene3D: punctual lights exceed MAX_FORWARD_LIGHTS and will be input-order truncated — call prepareGlScene3DForwardLights after prepareScene3DRender and pass its result to drawGlScene3D.',
17
+ pointLightCount: lights.point?.length ?? 0,
18
+ spotLightCount: lights.spot?.length ?? 0,
19
+ }, 'scene-gl');
20
+ }
21
+ //# sourceMappingURL=enableGlScene3DForwardLightSelectionGuards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enableGlScene3DForwardLightSelectionGuards.js","sourceRoot":"","sources":["../src/enableGlScene3DForwardLightSelectionGuards.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,6EAA6E;AAC7E,MAAM,UAAU,8CAA8C,CAAC,KAAoB;IACjF,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,0BAA0B,IAAI,IAAI,CAAC;AACvE,CAAC;AAED,oGAAoG;AACpG,qGAAqG;AACrG,8FAA8F;AAC9F,MAAM,UAAU,0CAA0C,CAAC,KAAoB;IAC7E,mBAAmB,CAAC,KAAK,CAAC,CAAC,0BAA0B,GAAG,0CAA0C,CAAC;AACrG,CAAC;AAED,SAAS,0CAA0C,CAAC,MAAmC;IACrF,OAAO,CACL,2CAA2C,EAC3C,QAAQ,CAAC,IAAI,EACb;QACE,OAAO,EACL,kMAAkM;QACpM,eAAe,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;QAC1C,cAAc,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;KACzC,EACD,UAAU,CACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { GlScene3DForwardLightList, Scene3DForwardLightSelectionExplanation, Scene3DLightsLike } from '@flighthq/types';
2
+ export declare function explainGlScene3DForwardLightSelection(lights: Readonly<Scene3DLightsLike>, selection?: Readonly<GlScene3DForwardLightList>): Scene3DForwardLightSelectionExplanation;
3
+ //# sourceMappingURL=explainGlScene3DForwardLightSelection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explainGlScene3DForwardLightSelection.d.ts","sourceRoot":"","sources":["../src/explainGlScene3DForwardLightSelection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,uCAAuC,EACvC,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AAKzB,wBAAgB,qCAAqC,CACnD,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACnC,SAAS,CAAC,EAAE,QAAQ,CAAC,yBAAyB,CAAC,GAC9C,uCAAuC,CAczC"}
@@ -0,0 +1,19 @@
1
+ import { MAX_FORWARD_LIGHTS } from '@flighthq/types';
2
+ // Explains whether drawing `lights` through the fixed forward budget needs an explicit per-object
3
+ // selection list. This pure, separately importable query retains and mutates nothing.
4
+ export function explainGlScene3DForwardLightSelection(lights, selection) {
5
+ const pointLightCount = lights.point?.length ?? 0;
6
+ const spotLightCount = lights.spot?.length ?? 0;
7
+ const selectionPrepared = selection !== undefined;
8
+ return {
9
+ pointLightCount,
10
+ reason: selectionPrepared
11
+ ? 'selection-prepared'
12
+ : pointLightCount > MAX_FORWARD_LIGHTS || spotLightCount > MAX_FORWARD_LIGHTS
13
+ ? 'selection-required'
14
+ : 'within-budget',
15
+ selectionPrepared,
16
+ spotLightCount,
17
+ };
18
+ }
19
+ //# sourceMappingURL=explainGlScene3DForwardLightSelection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explainGlScene3DForwardLightSelection.js","sourceRoot":"","sources":["../src/explainGlScene3DForwardLightSelection.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,kGAAkG;AAClG,sFAAsF;AACtF,MAAM,UAAU,qCAAqC,CACnD,MAAmC,EACnC,SAA+C;IAE/C,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,CAAC;IAChD,MAAM,iBAAiB,GAAG,SAAS,KAAK,SAAS,CAAC;IAClD,OAAO;QACL,eAAe;QACf,MAAM,EAAE,iBAAiB;YACvB,CAAC,CAAC,oBAAoB;YACtB,CAAC,CAAC,eAAe,GAAG,kBAAkB,IAAI,cAAc,GAAG,kBAAkB;gBAC3E,CAAC,CAAC,oBAAoB;gBACtB,CAAC,CAAC,eAAe;QACrB,iBAAiB;QACjB,cAAc;KACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { GlClassicDefineKey, GlClassicProgram, GlRenderState } from '@flighthq/types';
2
+ export declare function buildGlClassicDefineKey(key: Readonly<GlClassicDefineKey>): string;
3
+ export declare function compileGlClassicProgram(gl: WebGL2RenderingContext, key: Readonly<GlClassicDefineKey>): GlClassicProgram;
4
+ export declare function ensureGlClassicProgram(state: GlRenderState, key: Readonly<GlClassicDefineKey>): GlClassicProgram;
5
+ export declare function getGlClassicFragmentSource(): string;
6
+ export declare function getGlClassicFragmentSourceForKey(key: Readonly<GlClassicDefineKey>): string;
7
+ export declare function getGlClassicVertexSource(): string;
8
+ export declare function getGlClassicVertexSourceForKey(key: Readonly<GlClassicDefineKey>): string;
9
+ //# sourceMappingURL=glClassicPrelude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glClassicPrelude.d.ts","sourceRoot":"","sources":["../src/glClassicPrelude.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAe3F,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAOjF;AAKD,wBAAgB,uBAAuB,CACrC,EAAE,EAAE,sBAAsB,EAC1B,GAAG,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GAChC,gBAAgB,CAqBlB;AAKD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GAAG,gBAAgB,CAUhH;AAKD,wBAAgB,0BAA0B,IAAI,MAAM,CAEnD;AAGD,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAE1F;AAMD,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAKD,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAGxF"}