@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,178 @@
1
+ import type { GlPbrDefineKey } from '@flighthq/types';
2
+
3
+ import {
4
+ buildGlPbrDefineKey,
5
+ buildGlPbrDefineSource,
6
+ getGlPbrFragmentSource,
7
+ getGlPbrFragmentSourceForKey,
8
+ getGlPbrVertexSource,
9
+ getGlPbrVertexSourceForKey,
10
+ } from './glPbrPrelude';
11
+
12
+ function makeKey(overrides?: Partial<GlPbrDefineKey>): GlPbrDefineKey {
13
+ return {
14
+ alphaMaskEnabled: false,
15
+ anisotropyEnabled: false,
16
+ clearcoatEnabled: false,
17
+ hasAlphaMap: false,
18
+ hasBaseColorMap: false,
19
+ hasEmissiveMap: false,
20
+ hasMetallicRoughnessMap: false,
21
+ hasNormalMap: false,
22
+ hasOcclusionMap: false,
23
+ hasUvTransform: false,
24
+ iridescenceEnabled: false,
25
+ sheenEnabled: false,
26
+ specularEnabled: false,
27
+ subsurfaceEnabled: false,
28
+ transmissionEnabled: false,
29
+ ...overrides,
30
+ };
31
+ }
32
+
33
+ const NONE = makeKey();
34
+ const STANDARD_ALL = makeKey({
35
+ alphaMaskEnabled: true,
36
+ hasBaseColorMap: true,
37
+ hasEmissiveMap: true,
38
+ hasMetallicRoughnessMap: true,
39
+ hasNormalMap: true,
40
+ hasOcclusionMap: true,
41
+ });
42
+ const ALL = makeKey({
43
+ ...STANDARD_ALL,
44
+ anisotropyEnabled: true,
45
+ clearcoatEnabled: true,
46
+ iridescenceEnabled: true,
47
+ sheenEnabled: true,
48
+ specularEnabled: true,
49
+ subsurfaceEnabled: true,
50
+ transmissionEnabled: true,
51
+ });
52
+
53
+ describe('buildGlPbrDefineKey', () => {
54
+ it('produces a stable, distinct string per flag set', () => {
55
+ expect(buildGlPbrDefineKey(NONE)).toBe('--------:--------');
56
+ expect(buildGlPbrDefineKey(STANDARD_ALL)).toBe('mbnroe--:--------');
57
+ expect(buildGlPbrDefineKey(ALL)).toBe('mbnroe--:CSAIPUT-');
58
+ expect(buildGlPbrDefineKey(makeKey({ hasBaseColorMap: true }))).toBe('-b------:--------');
59
+ expect(buildGlPbrDefineKey(makeKey({ clearcoatEnabled: true }))).toBe('--------:C-------');
60
+ expect(buildGlPbrDefineKey(makeKey({ hasAlphaMap: true }))).toBe('------a-:--------');
61
+ });
62
+
63
+ it('encodes the HAS_UV_TRANSFORM variant as a distinct standard-block slot', () => {
64
+ expect(buildGlPbrDefineKey(makeKey({ hasUvTransform: true }))).toBe('-------u:--------');
65
+ expect(buildGlPbrDefineKey(makeKey({ hasUvTransform: true }))).not.toBe(buildGlPbrDefineKey(NONE));
66
+ });
67
+
68
+ it('encodes the HAS_SKIN variant as a distinct trailing slot', () => {
69
+ expect(buildGlPbrDefineKey(makeKey({ hasSkin: true }))).toBe('--------:-------k');
70
+ expect(buildGlPbrDefineKey(makeKey({ hasSkin: true }))).not.toBe(buildGlPbrDefineKey(NONE));
71
+ });
72
+
73
+ it('is identical for equal flag sets', () => {
74
+ expect(buildGlPbrDefineKey(makeKey(ALL))).toBe(buildGlPbrDefineKey(makeKey(ALL)));
75
+ });
76
+ });
77
+
78
+ describe('buildGlPbrDefineSource', () => {
79
+ it('emits a define for each enabled flag and none for disabled flags', () => {
80
+ const all = buildGlPbrDefineSource(ALL);
81
+ expect(all).toContain('#define ALPHA_MASK');
82
+ expect(all).toContain('#define HAS_BASE_COLOR_MAP');
83
+ expect(all).toContain('#define HAS_NORMAL_MAP');
84
+ expect(all).toContain('#define HAS_METALLIC_ROUGHNESS_MAP');
85
+ expect(all).toContain('#define HAS_OCCLUSION_MAP');
86
+ expect(all).toContain('#define HAS_EMISSIVE_MAP');
87
+ expect(all).toContain('#define CLEARCOAT');
88
+ expect(all).toContain('#define SHEEN');
89
+ expect(all).toContain('#define ANISOTROPY');
90
+ expect(all).toContain('#define IRIDESCENCE');
91
+ expect(all).toContain('#define SPECULAR_EXT');
92
+ expect(all).toContain('#define SUBSURFACE');
93
+ expect(all).toContain('#define TRANSMISSION');
94
+
95
+ const none = buildGlPbrDefineSource(NONE);
96
+ expect(none).not.toContain('#define ALPHA_MASK');
97
+ expect(none).not.toContain('#define HAS_BASE_COLOR_MAP');
98
+ expect(none).not.toContain('#define CLEARCOAT');
99
+ expect(none).not.toContain('#define HAS_ALPHA_MAP');
100
+ });
101
+
102
+ it('gates the HAS_ALPHA_MAP define off the dedicated coverage-map flag', () => {
103
+ expect(buildGlPbrDefineSource(makeKey({ hasAlphaMap: true }))).toContain('#define HAS_ALPHA_MAP');
104
+ });
105
+
106
+ it('opens with the GLSL 300 es version directive', () => {
107
+ expect(buildGlPbrDefineSource(NONE).startsWith('#version 300 es')).toBe(true);
108
+ });
109
+ });
110
+
111
+ describe('getGlPbrFragmentSource', () => {
112
+ it('declares the PBR fragment interface and outputs linear HDR radiance', () => {
113
+ const src = getGlPbrFragmentSource();
114
+ expect(src).toContain('out vec4 fragColor');
115
+ expect(src).toContain('distributionGgx');
116
+ expect(src).toContain('fresnelSchlick');
117
+ expect(src).toContain('u_directionalRadiance');
118
+ });
119
+
120
+ it('does not embed a version directive (that comes from the define block)', () => {
121
+ expect(getGlPbrFragmentSource()).not.toContain('#version');
122
+ });
123
+ });
124
+
125
+ describe('getGlPbrFragmentSourceForKey', () => {
126
+ it('prepends the define block to the fragment body', () => {
127
+ const src = getGlPbrFragmentSourceForKey(STANDARD_ALL);
128
+ expect(src.startsWith('#version 300 es')).toBe(true);
129
+ expect(src).toContain('#define HAS_NORMAL_MAP');
130
+ expect(src).toContain('out vec4 fragColor');
131
+ });
132
+
133
+ it('emits the MAX_FORWARD_LIGHTS spec constant and loops the punctual light arrays', () => {
134
+ const src = getGlPbrFragmentSourceForKey(NONE);
135
+ expect(src).toContain('#define MAX_FORWARD_LIGHTS');
136
+ expect(src).toContain('u_pointLights');
137
+ expect(src).toContain('u_spotLights');
138
+ expect(src).toContain('u_hemisphereLights');
139
+ // Directional, point, and spot lights share the one Cook-Torrance BRDF (no forked shading model).
140
+ expect(src).toContain('shadePbrPunctual');
141
+ });
142
+ });
143
+
144
+ describe('getGlPbrVertexSource', () => {
145
+ it('declares the canonical PBR vertex attributes and model/view-projection uniforms', () => {
146
+ const src = getGlPbrVertexSource();
147
+ expect(src).toContain('layout(location = 0) in vec3 a_position');
148
+ expect(src).toContain('layout(location = 1) in vec3 a_normal');
149
+ expect(src).toContain('layout(location = 2) in vec4 a_tangent');
150
+ expect(src).toContain('layout(location = 3) in vec2 a_uv0');
151
+ expect(src).toContain('u_viewProjection');
152
+ expect(src).toContain('u_model');
153
+ expect(src).toContain('u_normalMatrix');
154
+ });
155
+ });
156
+
157
+ describe('getGlPbrVertexSourceForKey', () => {
158
+ it('injects the skin declarations and HAS_SKIN define only for the skinned variant', () => {
159
+ const rigid = getGlPbrVertexSourceForKey(NONE);
160
+ expect(rigid).not.toContain('#define HAS_SKIN');
161
+ expect(rigid).not.toContain('a_joints0');
162
+ expect(rigid).not.toContain('mat4 skinMatrix()');
163
+
164
+ const skinned = getGlPbrVertexSourceForKey(makeKey({ hasSkin: true }));
165
+ expect(skinned).toContain('#define HAS_SKIN');
166
+ expect(skinned).not.toContain('#define MAX_JOINTS');
167
+ expect(skinned).toContain('sampler2D u_jointTexture');
168
+ expect(skinned).toContain('texelFetch');
169
+ expect(skinned).toContain('mat4 skinMatrix()');
170
+ expect(skinned).toContain('a_joints0');
171
+ });
172
+
173
+ it('prepends the define block to the vertex body', () => {
174
+ const src = getGlPbrVertexSourceForKey(NONE);
175
+ expect(src.startsWith('#version 300 es')).toBe(true);
176
+ expect(src).toContain('gl_Position');
177
+ });
178
+ });
@@ -0,0 +1,116 @@
1
+ import type { GlPbrDefineKey } from '@flighthq/types';
2
+
3
+ import { compileGlPbrProgram, ensureGlPbrProgram } from './glPbrProgramCache';
4
+ import { getGlScene3DRuntime } from './glScene3DRuntime';
5
+ import { makeFakeGl2, makeGlScene3DState } from './glScene3DTestHelper';
6
+
7
+ function makeKey(overrides?: Partial<GlPbrDefineKey>): GlPbrDefineKey {
8
+ return {
9
+ alphaMaskEnabled: false,
10
+ anisotropyEnabled: false,
11
+ clearcoatEnabled: false,
12
+ hasAlphaMap: false,
13
+ hasBaseColorMap: false,
14
+ hasEmissiveMap: false,
15
+ hasMetallicRoughnessMap: false,
16
+ hasNormalMap: false,
17
+ hasOcclusionMap: false,
18
+ hasUvTransform: false,
19
+ iridescenceEnabled: false,
20
+ sheenEnabled: false,
21
+ specularEnabled: false,
22
+ subsurfaceEnabled: false,
23
+ transmissionEnabled: false,
24
+ ...overrides,
25
+ };
26
+ }
27
+
28
+ const KEY = makeKey();
29
+
30
+ describe('compileGlPbrProgram', () => {
31
+ it('compiles, links, and resolves the PBR uniform locations', () => {
32
+ const gl = makeFakeGl2();
33
+ const program = compileGlPbrProgram(gl, KEY);
34
+ expect(program.program).not.toBeNull();
35
+ expect(program.locViewProjection).not.toBeNull();
36
+ expect(program.locBaseColor).not.toBeNull();
37
+ expect(program.locDirectionalRadiance).not.toBeNull();
38
+ expect(gl.calls.some((c) => c.name === 'linkProgram')).toBe(true);
39
+ });
40
+
41
+ it('resolves the full standard-block map uniforms', () => {
42
+ const gl = makeFakeGl2();
43
+ const program = compileGlPbrProgram(gl, KEY);
44
+ expect(program.locMetallicRoughnessMap).not.toBeNull();
45
+ expect(program.locOcclusionMap).not.toBeNull();
46
+ expect(program.locOcclusionStrength).not.toBeNull();
47
+ expect(program.locEmissiveMap).not.toBeNull();
48
+ });
49
+
50
+ it('resolves every extension uniform', () => {
51
+ const gl = makeFakeGl2();
52
+ const program = compileGlPbrProgram(gl, KEY);
53
+ expect(program.locClearcoat).not.toBeNull();
54
+ expect(program.locSheenColor).not.toBeNull();
55
+ expect(program.locAnisotropyStrength).not.toBeNull();
56
+ expect(program.locIridescence).not.toBeNull();
57
+ expect(program.locSpecular).not.toBeNull();
58
+ expect(program.locSubsurface).not.toBeNull();
59
+ expect(program.locTransmission).not.toBeNull();
60
+ expect(program.locAttenuationColor).not.toBeNull();
61
+ });
62
+
63
+ it('throws on a shader compile failure', () => {
64
+ const gl = makeFakeGl2({ compileOk: false });
65
+ expect(() => compileGlPbrProgram(gl, KEY)).toThrow(/compile error/);
66
+ });
67
+
68
+ it('throws on a program link failure', () => {
69
+ const gl = makeFakeGl2({ linkOk: false });
70
+ expect(() => compileGlPbrProgram(gl, KEY)).toThrow(/link error/);
71
+ });
72
+ });
73
+
74
+ describe('ensureGlPbrProgram', () => {
75
+ it('compiles a variant once and caches it by define key', () => {
76
+ const { state, gl } = makeGlScene3DState();
77
+ const first = ensureGlPbrProgram(state, KEY);
78
+ const linkCount = gl.calls.filter((c) => c.name === 'linkProgram').length;
79
+ const second = ensureGlPbrProgram(state, KEY);
80
+ expect(second).toBe(first);
81
+ expect(gl.calls.filter((c) => c.name === 'linkProgram').length).toBe(linkCount);
82
+ expect(getGlScene3DRuntime(state).programCache.size).toBe(1);
83
+ });
84
+
85
+ it('compiles a distinct program for a different standard map flag', () => {
86
+ const { state } = makeGlScene3DState();
87
+ ensureGlPbrProgram(state, KEY);
88
+ ensureGlPbrProgram(state, makeKey({ hasBaseColorMap: true }));
89
+ expect(getGlScene3DRuntime(state).programCache.size).toBe(2);
90
+ });
91
+
92
+ it('folds the render-state skinned-run flag into a distinct HAS_SKIN variant', () => {
93
+ const { state } = makeGlScene3DState();
94
+ const rigid = ensureGlPbrProgram(state, KEY);
95
+ getGlScene3DRuntime(state).activeSkinnedRun = true;
96
+ const skinned = ensureGlPbrProgram(state, KEY);
97
+
98
+ expect(skinned).not.toBe(rigid);
99
+ expect([...getGlScene3DRuntime(state).programCache.keys()]).toContain('pbr:--------:-------k');
100
+ expect(skinned.locJointTexture).not.toBeNull();
101
+ });
102
+
103
+ it('caches a distinct entry per extension define under the pbr: namespace', () => {
104
+ const { state } = makeGlScene3DState();
105
+ ensureGlPbrProgram(state, makeKey({ clearcoatEnabled: true }));
106
+ ensureGlPbrProgram(state, makeKey({ sheenEnabled: true }));
107
+ ensureGlPbrProgram(state, makeKey({ anisotropyEnabled: true }));
108
+ ensureGlPbrProgram(state, makeKey({ iridescenceEnabled: true }));
109
+ ensureGlPbrProgram(state, makeKey({ specularEnabled: true }));
110
+ ensureGlPbrProgram(state, makeKey({ subsurfaceEnabled: true }));
111
+ ensureGlPbrProgram(state, makeKey({ transmissionEnabled: true }));
112
+ const cache = getGlScene3DRuntime(state).programCache;
113
+ expect(cache.size).toBe(7);
114
+ for (const key of cache.keys()) expect(key.startsWith('pbr:')).toBe(true);
115
+ });
116
+ });
@@ -0,0 +1,85 @@
1
+ import { createStandardPbrMaterial, createStandardPbrMaterialProperties } from '@flighthq/materials';
2
+ import type { StandardPbrMaterialProperties, Texture } from '@flighthq/types';
3
+
4
+ import { compileGlPbrProgram } from './glPbrProgramCache';
5
+ import {
6
+ bindGlPbrStandardBlock,
7
+ bindGlPbrStandardTexture,
8
+ buildGlPbrStandardDefineKey,
9
+ isGlTextureReady,
10
+ } from './glPbrStandardBlock';
11
+ import { makeFakeGl2, makeGlScene3DState } from './glScene3DTestHelper';
12
+
13
+ function makeProgram() {
14
+ return compileGlPbrProgram(makeFakeGl2(), buildGlPbrStandardDefineKey(null, null));
15
+ }
16
+
17
+ // A texture that reports pixels (isGlTextureReady === true) without a real upload.
18
+ const READY_TEXTURE = { image: { source: {}, data: null, compressed: null } } as unknown as Texture;
19
+
20
+ describe('bindGlPbrStandardBlock', () => {
21
+ it('uploads neutral defaults for a null block', () => {
22
+ const { state, gl } = makeGlScene3DState();
23
+ bindGlPbrStandardBlock(state, makeProgram(), null);
24
+ expect(gl.calls.some((c) => c.name === 'uniform4f')).toBe(true);
25
+ expect(gl.calls.filter((c) => c.name === 'uniform1f').length).toBeGreaterThanOrEqual(4);
26
+ });
27
+
28
+ it('uploads the metallic-roughness scalars and emissive for a material block', () => {
29
+ const { state, gl } = makeGlScene3DState();
30
+ const standard = createStandardPbrMaterialProperties({ metallic: 0.5, occlusionStrength: 0.3, roughness: 0.6 });
31
+ bindGlPbrStandardBlock(state, makeProgram(), standard);
32
+ expect(gl.calls.some((c) => c.name === 'uniform4f')).toBe(true);
33
+ expect(gl.calls.some((c) => c.name === 'uniform3f')).toBe(true);
34
+ expect(gl.calls.filter((c) => c.name === 'uniform1f').length).toBeGreaterThanOrEqual(4);
35
+ // No textures bound when every map is null.
36
+ expect(gl.calls.some((c) => c.name === 'activeTexture')).toBe(false);
37
+ });
38
+ });
39
+
40
+ describe('bindGlPbrStandardTexture', () => {
41
+ it('is a no-op when the texture slot is empty', () => {
42
+ const { state, gl } = makeGlScene3DState();
43
+ bindGlPbrStandardTexture(state, null, makeProgram().locBaseColorMap, 0);
44
+ expect(gl.calls.some((c) => c.name === 'activeTexture')).toBe(false);
45
+ });
46
+ });
47
+
48
+ describe('buildGlPbrStandardDefineKey', () => {
49
+ it('propagates the alpha-mask flag from the surface material', () => {
50
+ expect(buildGlPbrStandardDefineKey(null, createStandardPbrMaterial({ alphaMode: 'mask' })).alphaMaskEnabled).toBe(
51
+ true,
52
+ );
53
+ });
54
+
55
+ it('samples the alpha map for mask/blend but not for an opaque material', () => {
56
+ const standard = { alphaMap: READY_TEXTURE } as unknown as StandardPbrMaterialProperties;
57
+ expect(buildGlPbrStandardDefineKey(standard, createStandardPbrMaterial({ alphaMode: 'mask' })).hasAlphaMap).toBe(
58
+ true,
59
+ );
60
+ expect(buildGlPbrStandardDefineKey(standard, createStandardPbrMaterial({ alphaMode: 'blend' })).hasAlphaMap).toBe(
61
+ true,
62
+ );
63
+ expect(buildGlPbrStandardDefineKey(standard, createStandardPbrMaterial({ alphaMode: 'opaque' })).hasAlphaMap).toBe(
64
+ false,
65
+ );
66
+ });
67
+
68
+ it('returns all-false map and extension flags for a null block', () => {
69
+ const key = buildGlPbrStandardDefineKey(null, null);
70
+ expect(key.clearcoatEnabled).toBe(false);
71
+ expect(key.hasAlphaMap).toBe(false);
72
+ expect(key.hasBaseColorMap).toBe(false);
73
+ expect(key.hasEmissiveMap).toBe(false);
74
+ expect(key.hasMetallicRoughnessMap).toBe(false);
75
+ expect(key.hasOcclusionMap).toBe(false);
76
+ expect(key.hasUvTransform).toBe(false);
77
+ expect(key.transmissionEnabled).toBe(false);
78
+ });
79
+ });
80
+
81
+ describe('isGlTextureReady', () => {
82
+ it('is false for a null texture', () => {
83
+ expect(isGlTextureReady(null)).toBe(false);
84
+ });
85
+ });
@@ -0,0 +1,108 @@
1
+ import type { GlRenderStateRuntime, GlRenderTarget, Matrix4, GlMeshProgram, GlScene3DIbl } from '@flighthq/types';
2
+ import { EntityRuntimeKey } from '@flighthq/types';
3
+
4
+ import { destroyGlScene3DRuntime, ensureGlSkinPalette, getGlScene3DRuntime } from './glScene3DRuntime';
5
+ import { makeGlScene3DState } from './glScene3DTestHelper';
6
+
7
+ describe('destroyGlScene3DRuntime', () => {
8
+ it('is a safe no-op when the state never allocated a scene runtime', () => {
9
+ const { state, gl } = makeGlScene3DState();
10
+ destroyGlScene3DRuntime(state);
11
+ expect(gl.calls.some((c) => c.name.startsWith('delete'))).toBe(false);
12
+ });
13
+
14
+ it('frees the cached programs, the IBL set, the environment cube, and the shadow target, then clears the slots', () => {
15
+ const { state, gl } = makeGlScene3DState();
16
+ const scene = getGlScene3DRuntime(state);
17
+
18
+ scene.programCache.set('a', { program: {} as WebGLProgram } as GlMeshProgram);
19
+ scene.programCache.set('b', { program: {} as WebGLProgram } as GlMeshProgram);
20
+ scene.activeMeshProgram = scene.programCache.get('a')!;
21
+ scene.ibl = {
22
+ brdfLut: {} as WebGLTexture,
23
+ intensity: 1,
24
+ irradianceCube: {} as WebGLTexture,
25
+ prefilteredCube: {} as WebGLTexture,
26
+ prefilteredMipCount: 5,
27
+ } satisfies GlScene3DIbl;
28
+ scene.iblBakeFramebuffer = {} as WebGLFramebuffer;
29
+ scene.environmentSourceCube = {} as WebGLTexture;
30
+ const depthTexture = {} as WebGLTexture;
31
+ scene.shadowTarget = {
32
+ colorRenderbuffers: [],
33
+ depthStencilRenderbuffer: null,
34
+ depthTexture,
35
+ framebuffer: {} as WebGLFramebuffer,
36
+ resolveFramebuffer: null,
37
+ textures: [],
38
+ } as unknown as GlRenderTarget;
39
+ scene.shadow = { matrix: {} as Matrix4, texture: depthTexture };
40
+ scene.skinPalette = { jointCapacity: 4, texture: {} as WebGLTexture };
41
+
42
+ destroyGlScene3DRuntime(state);
43
+
44
+ expect(gl.calls.filter((c) => c.name === 'deleteProgram').length).toBe(2);
45
+ // 3 IBL textures + the environment source cube + the shadow depth texture (owned by the target) +
46
+ // the skin-palette data texture.
47
+ expect(gl.calls.filter((c) => c.name === 'deleteTexture').length).toBe(6);
48
+ // The IBL bake framebuffer + the shadow target's framebuffer.
49
+ expect(gl.calls.filter((c) => c.name === 'deleteFramebuffer').length).toBe(2);
50
+
51
+ expect(scene.programCache.size).toBe(0);
52
+ expect(scene.activeMeshProgram).toBeNull();
53
+ expect(scene.ibl).toBeNull();
54
+ expect(scene.iblBakeFramebuffer).toBeNull();
55
+ expect(scene.environmentSourceCube).toBeNull();
56
+ expect(scene.shadowTarget).toBeNull();
57
+ expect(scene.shadow).toBeNull();
58
+ expect(scene.skinPalette).toBeNull();
59
+ });
60
+ });
61
+
62
+ describe('ensureGlSkinPalette', () => {
63
+ it('creates the palette texture lazily on first call and reuses it after', () => {
64
+ const { state } = makeGlScene3DState();
65
+ expect(getGlScene3DRuntime(state).skinPalette).toBeNull();
66
+
67
+ const first = ensureGlSkinPalette(state);
68
+ expect(first).toBe(getGlScene3DRuntime(state).skinPalette);
69
+ expect(first.jointCapacity).toBe(0);
70
+
71
+ const second = ensureGlSkinPalette(state);
72
+ expect(second).toBe(first);
73
+ });
74
+ });
75
+
76
+ describe('getGlScene3DRuntime', () => {
77
+ it('lazily allocates one runtime per state and returns the same instance', () => {
78
+ const { state } = makeGlScene3DState();
79
+ const first = getGlScene3DRuntime(state);
80
+ expect(first.activeMeshProgram).toBeNull();
81
+ expect(first.blendedDrawList).toBeInstanceOf(Array);
82
+ expect(first.blendedPool).toBeInstanceOf(Array);
83
+ expect(first.materialRegistry).toBeInstanceOf(Map);
84
+ expect(first.opaqueDrawList).toBeInstanceOf(Array);
85
+ expect(first.opaquePool).toBeInstanceOf(Array);
86
+ expect(first.programCache).toBeInstanceOf(Map);
87
+ expect(getGlScene3DRuntime(state)).toBe(first);
88
+ });
89
+
90
+ it('gives each render state its own draw-entry pools, not shared singletons', () => {
91
+ const { state: stateA } = makeGlScene3DState();
92
+ const { state: stateB } = makeGlScene3DState();
93
+ const rtA = getGlScene3DRuntime(stateA);
94
+ const rtB = getGlScene3DRuntime(stateB);
95
+ expect(rtA.opaquePool).not.toBe(rtB.opaquePool);
96
+ expect(rtA.blendedPool).not.toBe(rtB.blendedPool);
97
+ expect(rtA.opaqueDrawList).not.toBe(rtB.opaqueDrawList);
98
+ expect(rtA.blendedDrawList).not.toBe(rtB.blendedDrawList);
99
+ });
100
+
101
+ it('surfaces its registry and upload cache through the header runtime slots', () => {
102
+ const { state } = makeGlScene3DState();
103
+ const scene = getGlScene3DRuntime(state);
104
+ const stateRuntime = state[EntityRuntimeKey] as GlRenderStateRuntime;
105
+ expect(stateRuntime.sceneMeshMaterialRegistry).toBe(scene.materialRegistry);
106
+ expect(stateRuntime.sceneMeshUploadCache).toBe(scene.uploadCache);
107
+ });
108
+ });
@@ -0,0 +1,31 @@
1
+ import { makeGlScene3DState } from './glScene3DTestHelper';
2
+ import { getGlScene3DTime, setGlScene3DTime } from './glScene3DTime';
3
+
4
+ describe('getGlScene3DTime', () => {
5
+ it('defaults to 0 before any setGlScene3DTime', () => {
6
+ const { state } = makeGlScene3DState();
7
+ expect(getGlScene3DTime(state)).toBe(0);
8
+ });
9
+
10
+ it('returns the value set by setGlScene3DTime', () => {
11
+ const { state } = makeGlScene3DState();
12
+ setGlScene3DTime(state, 2.75);
13
+ expect(getGlScene3DTime(state)).toBe(2.75);
14
+ });
15
+ });
16
+
17
+ describe('setGlScene3DTime', () => {
18
+ it('overwrites the stored time on repeated calls', () => {
19
+ const { state } = makeGlScene3DState();
20
+ setGlScene3DTime(state, 1);
21
+ setGlScene3DTime(state, 4.5);
22
+ expect(getGlScene3DTime(state)).toBe(4.5);
23
+ });
24
+
25
+ it('keeps time per state (two states do not share)', () => {
26
+ const a = makeGlScene3DState();
27
+ const b = makeGlScene3DState();
28
+ setGlScene3DTime(a.state, 3);
29
+ expect(getGlScene3DTime(b.state)).toBe(0);
30
+ });
31
+ });