@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,181 @@
1
+ import type { GlRenderState, GlLitProgram } from '@flighthq/types';
2
+ import { EntityRuntimeKey, SCENE_LIGHT_BLOCK_FLOATS } from '@flighthq/types';
3
+
4
+ import { bindGlMeshLightBlock, GL_MESH_LIGHT_BLOCK_GLSL, resolveGlLitLocations } from './glLitProgram';
5
+ import { makeFakeGl2 } from './glScene3DTestHelper';
6
+
7
+ function makeLitProgram(): GlLitProgram {
8
+ const loc = (name: string): WebGLUniformLocation => ({ name }) as WebGLUniformLocation;
9
+ return {
10
+ locAmbientCount: loc('u_ambientCount'),
11
+ locAmbientRadiance: loc('u_ambientRadiance'),
12
+ locCameraPosition: loc('u_cameraPosition'),
13
+ locDirectional: loc('u_directional'),
14
+ locDirectionalCount: loc('u_directionalCount'),
15
+ locDirectionalRadiance: loc('u_directionalRadiance'),
16
+ locHemisphereCount: loc('u_hemisphereCount'),
17
+ locHemisphereLights: loc('u_hemisphereLights'),
18
+ locIblBrdf: loc('u_iblBrdf'),
19
+ locIblEnabled: loc('u_iblEnabled'),
20
+ locIblIntensity: loc('u_iblIntensity'),
21
+ locIblIrradiance: loc('u_iblIrradiance'),
22
+ locIblMaxMip: loc('u_iblMaxMip'),
23
+ locIblPrefiltered: loc('u_iblPrefiltered'),
24
+ locModel: loc('u_model'),
25
+ locNormalMatrix: loc('u_normalMatrix'),
26
+ locPointCount: loc('u_pointCount'),
27
+ locPointLights: loc('u_pointLights'),
28
+ locShadowEnabled: loc('u_shadowEnabled'),
29
+ locShadowMap: loc('u_shadowMap'),
30
+ locShadowMatrix: loc('u_shadowMatrix'),
31
+ locSpotCount: loc('u_spotCount'),
32
+ locSpotLights: loc('u_spotLights'),
33
+ locViewProjection: loc('u_viewProjection'),
34
+ program: {} as WebGLProgram,
35
+ };
36
+ }
37
+
38
+ function makeState(gl: ReturnType<typeof makeFakeGl2>): GlRenderState {
39
+ return { [EntityRuntimeKey]: {}, gl } as unknown as GlRenderState;
40
+ }
41
+
42
+ describe('bindGlMeshLightBlock', () => {
43
+ it('uploads the directional, ambient, count, shadow-gate, and ibl-gate uniforms from the packed block', () => {
44
+ const gl = makeFakeGl2();
45
+ const data = new Float32Array(SCENE_LIGHT_BLOCK_FLOATS);
46
+ data[0] = 0;
47
+ data[1] = -1;
48
+ data[4] = 1;
49
+ data[5] = 1;
50
+ data[6] = 1;
51
+ data[8] = 0.2;
52
+ bindGlMeshLightBlock(makeState(gl), makeLitProgram(), {
53
+ ambientCount: 1,
54
+ data,
55
+ directionalCount: 1,
56
+ hemisphereCount: 0,
57
+ pointCount: 0,
58
+ spotCount: 0,
59
+ version: 1,
60
+ });
61
+ expect(gl.calls.filter((c) => c.name === 'uniform4f').length).toBe(2);
62
+ expect(gl.calls.filter((c) => c.name === 'uniform3f').length).toBe(1);
63
+ // directionalCount + ambientCount + shadowEnabled (0, no active shadow) + iblEnabled (0, no IBL).
64
+ expect(gl.calls.filter((c) => c.name === 'uniform1f').length).toBe(4);
65
+ });
66
+
67
+ it('skips the light uniform upload when the program already holds the block version', () => {
68
+ const gl = makeFakeGl2();
69
+ const program = makeLitProgram();
70
+ const state = makeState(gl);
71
+ const block = {
72
+ ambientCount: 1,
73
+ data: new Float32Array(SCENE_LIGHT_BLOCK_FLOATS),
74
+ directionalCount: 1,
75
+ hemisphereCount: 0,
76
+ pointCount: 0,
77
+ spotCount: 0,
78
+ version: 7,
79
+ };
80
+ bindGlMeshLightBlock(state, program, block);
81
+ bindGlMeshLightBlock(state, program, block);
82
+ // Two binds, one program, one version: locDirectional/locDirectionalRadiance (uniform4f) and
83
+ // locAmbientRadiance (uniform3f) upload exactly once — only the light block is gated.
84
+ expect(gl.calls.filter((c) => c.name === 'uniform4f').length).toBe(2);
85
+ expect(gl.calls.filter((c) => c.name === 'uniform3f').length).toBe(1);
86
+ });
87
+
88
+ it('re-uploads the light uniforms when the block version changes', () => {
89
+ const gl = makeFakeGl2();
90
+ const program = makeLitProgram();
91
+ const state = makeState(gl);
92
+ const data = new Float32Array(SCENE_LIGHT_BLOCK_FLOATS);
93
+ const block = { ambientCount: 1, data, directionalCount: 1, hemisphereCount: 0, pointCount: 0, spotCount: 0 };
94
+ bindGlMeshLightBlock(state, program, { ...block, version: 1 });
95
+ bindGlMeshLightBlock(state, program, { ...block, version: 2 });
96
+ expect(gl.calls.filter((c) => c.name === 'uniform4f').length).toBe(4);
97
+ });
98
+
99
+ it('re-uploads when a different per-object block has the same version', () => {
100
+ const gl = makeFakeGl2();
101
+ const program = makeLitProgram();
102
+ const state = makeState(gl);
103
+ const common = {
104
+ ambientCount: 0,
105
+ directionalCount: 0,
106
+ hemisphereCount: 0,
107
+ pointCount: 1,
108
+ spotCount: 0,
109
+ version: 1,
110
+ };
111
+ bindGlMeshLightBlock(state, program, { ...common, data: new Float32Array(SCENE_LIGHT_BLOCK_FLOATS) });
112
+ bindGlMeshLightBlock(state, program, { ...common, data: new Float32Array(SCENE_LIGHT_BLOCK_FLOATS) });
113
+ expect(gl.calls.filter((c) => c.name === 'uniform4f')).toHaveLength(4);
114
+ });
115
+
116
+ it('uploads the punctual light arrays and their int counts from the packed block', () => {
117
+ const gl = makeFakeGl2();
118
+ bindGlMeshLightBlock(makeState(gl), makeLitProgram(), {
119
+ ambientCount: 0,
120
+ data: new Float32Array(SCENE_LIGHT_BLOCK_FLOATS),
121
+ directionalCount: 0,
122
+ hemisphereCount: 3,
123
+ pointCount: 2,
124
+ spotCount: 1,
125
+ version: 1,
126
+ });
127
+ // Three vec4 arrays uploaded: point, spot, hemisphere.
128
+ const arrayUploads = gl.calls.filter((c) => c.name === 'uniform4fv');
129
+ expect(arrayUploads.length).toBe(3);
130
+ // Each count uploads as an int uniform (u_pointCount / u_spotCount / u_hemisphereCount).
131
+ const intUploads = gl.calls.filter(
132
+ (c) =>
133
+ c.name === 'uniform1i' &&
134
+ typeof (c.args[0] as { name?: string })?.name === 'string' &&
135
+ (c.args[0] as { name: string }).name.endsWith('Count'),
136
+ );
137
+ expect(intUploads.map((c) => (c.args[0] as { name: string }).name).sort()).toEqual([
138
+ 'u_hemisphereCount',
139
+ 'u_pointCount',
140
+ 'u_spotCount',
141
+ ]);
142
+ expect(intUploads.find((c) => (c.args[0] as { name: string }).name === 'u_pointCount')?.args[1]).toBe(2);
143
+ expect(intUploads.find((c) => (c.args[0] as { name: string }).name === 'u_spotCount')?.args[1]).toBe(1);
144
+ expect(intUploads.find((c) => (c.args[0] as { name: string }).name === 'u_hemisphereCount')?.args[1]).toBe(3);
145
+ });
146
+ });
147
+
148
+ describe('GL_MESH_LIGHT_BLOCK_GLSL', () => {
149
+ it('declares every uniform the CPU upload sets', () => {
150
+ for (const name of [
151
+ 'u_directional',
152
+ 'u_directionalRadiance',
153
+ 'u_ambientRadiance',
154
+ 'u_directionalCount',
155
+ 'u_ambientCount',
156
+ 'u_cameraPosition',
157
+ 'u_shadowMap',
158
+ 'u_shadowMatrix',
159
+ 'u_shadowEnabled',
160
+ 'u_pointLights',
161
+ 'u_spotLights',
162
+ 'u_hemisphereLights',
163
+ 'u_pointCount',
164
+ 'u_spotCount',
165
+ 'u_hemisphereCount',
166
+ ]) {
167
+ expect(GL_MESH_LIGHT_BLOCK_GLSL).toContain(name);
168
+ }
169
+ });
170
+ });
171
+
172
+ describe('resolveGlLitLocations', () => {
173
+ it('resolves the standard lit uniform locations', () => {
174
+ const gl = makeFakeGl2();
175
+ const locations = resolveGlLitLocations(gl, {} as WebGLProgram);
176
+ expect(locations.locDirectional).not.toBeNull();
177
+ expect(locations.locAmbientRadiance).not.toBeNull();
178
+ expect(locations.locCameraPosition).not.toBeNull();
179
+ expect(locations.locShadowMap).not.toBeNull();
180
+ });
181
+ });
@@ -0,0 +1,74 @@
1
+ import type { LinearColor, GlMatcapDefineKey } from '@flighthq/types';
2
+
3
+ import {
4
+ bindGlMatcapSurface,
5
+ buildGlMatcapDefineKey,
6
+ compileGlMatcapProgram,
7
+ ensureGlMatcapProgram,
8
+ getGlMatcapFragmentSourceForKey,
9
+ getGlMatcapVertexSourceForKey,
10
+ } from './glMatcapPrelude';
11
+ import { getGlScene3DRuntime } from './glScene3DRuntime';
12
+ import { makeFakeGl2, makeGlScene3DState } from './glScene3DTestHelper';
13
+
14
+ const FLAT: GlMatcapDefineKey = { alphaMaskEnabled: false, hasMatcap: false };
15
+ const TINT: LinearColor = [0.5, 0.25, 0.1, 1];
16
+
17
+ describe('bindGlMatcapSurface', () => {
18
+ it('uploads the tint and alpha cutoff with no texture bind when the matcap is absent', () => {
19
+ const { state, gl } = makeGlScene3DState();
20
+ const program = compileGlMatcapProgram(gl, FLAT);
21
+ bindGlMatcapSurface(state, program, TINT, null, 0.5);
22
+ expect(gl.calls.some((c) => c.name === 'uniform4f')).toBe(true);
23
+ expect(gl.calls.some((c) => c.name === 'uniform1f')).toBe(true);
24
+ // No matcap → no texture bind.
25
+ expect(gl.calls.some((c) => c.name === 'bindTexture')).toBe(false);
26
+ });
27
+ });
28
+
29
+ describe('buildGlMatcapDefineKey', () => {
30
+ it('produces distinct stable strings per flag set', () => {
31
+ expect(buildGlMatcapDefineKey(FLAT)).toBe('--');
32
+ expect(buildGlMatcapDefineKey({ alphaMaskEnabled: true, hasMatcap: true })).toBe('mt');
33
+ expect(buildGlMatcapDefineKey({ ...FLAT, hasMatcap: true })).toBe('-t');
34
+ });
35
+ });
36
+
37
+ describe('compileGlMatcapProgram', () => {
38
+ it('compiles, links, and resolves the matcap uniforms including the normal matrix and view', () => {
39
+ const gl = makeFakeGl2();
40
+ const program = compileGlMatcapProgram(gl, FLAT);
41
+ expect(program.locTint).not.toBeNull();
42
+ expect(program.locView).not.toBeNull();
43
+ expect(program.locNormalMatrix).not.toBeNull();
44
+ expect(gl.calls.some((c) => c.name === 'linkProgram')).toBe(true);
45
+ });
46
+ });
47
+
48
+ describe('ensureGlMatcapProgram', () => {
49
+ it('caches a variant under the matcap namespace and reuses it', () => {
50
+ const { state, gl } = makeGlScene3DState();
51
+ const first = ensureGlMatcapProgram(state, FLAT);
52
+ const links = gl.calls.filter((c) => c.name === 'linkProgram').length;
53
+ const second = ensureGlMatcapProgram(state, FLAT);
54
+ expect(second).toBe(first);
55
+ expect(gl.calls.filter((c) => c.name === 'linkProgram').length).toBe(links);
56
+ expect([...getGlScene3DRuntime(state).programCache.keys()].some((k) => k.startsWith('matcap:'))).toBe(true);
57
+ });
58
+ });
59
+
60
+ describe('getGlMatcapFragmentSourceForKey', () => {
61
+ it('includes feature defines only when their flag is set', () => {
62
+ expect(getGlMatcapFragmentSourceForKey(FLAT)).not.toContain('#define HAS_MATCAP');
63
+ expect(getGlMatcapFragmentSourceForKey({ ...FLAT, hasMatcap: true })).toContain('#define HAS_MATCAP');
64
+ expect(getGlMatcapFragmentSourceForKey({ ...FLAT, alphaMaskEnabled: true })).toContain('#define ALPHA_MASK');
65
+ });
66
+ });
67
+
68
+ describe('getGlMatcapVertexSourceForKey', () => {
69
+ it('builds the view-space normal from u_view and the normal matrix', () => {
70
+ const src = getGlMatcapVertexSourceForKey(FLAT);
71
+ expect(src).toContain('layout(location = 1) in vec3 a_normal');
72
+ expect(src).toContain('mat3(u_view) * (u_normalMatrix * a_normal)');
73
+ });
74
+ });
@@ -0,0 +1,52 @@
1
+ import type { GlMeshMaterialRenderer, Material } from '@flighthq/types';
2
+ import { DefaultMaterialKind } from '@flighthq/types';
3
+
4
+ import {
5
+ getGlMeshMaterialRenderer,
6
+ registerGlMeshMaterialRenderer,
7
+ resolveGlMeshMaterialRenderer,
8
+ } from './glMeshMaterialRegistry';
9
+ import { makeGlScene3DState } from './glScene3DTestHelper';
10
+
11
+ const TestKind = 'TestMeshMaterial';
12
+ const renderer: GlMeshMaterialRenderer = { bind() {}, draw() {} };
13
+
14
+ function makeMaterial(kind: string): Material {
15
+ return { kind } as Material;
16
+ }
17
+
18
+ describe('getGlMeshMaterialRenderer', () => {
19
+ it('returns null when nothing is registered for the kind', () => {
20
+ const { state } = makeGlScene3DState();
21
+ expect(getGlMeshMaterialRenderer(state, TestKind)).toBeNull();
22
+ });
23
+ });
24
+
25
+ describe('registerGlMeshMaterialRenderer', () => {
26
+ it('registers a renderer retrievable by kind', () => {
27
+ const { state } = makeGlScene3DState();
28
+ registerGlMeshMaterialRenderer(state, TestKind, renderer);
29
+ expect(getGlMeshMaterialRenderer(state, TestKind)).toBe(renderer);
30
+ });
31
+ });
32
+
33
+ describe('resolveGlMeshMaterialRenderer', () => {
34
+ it('returns null when nothing is registered — no built-in fallback', () => {
35
+ const { state } = makeGlScene3DState();
36
+ expect(resolveGlMeshMaterialRenderer(state, null)).toBeNull();
37
+ expect(resolveGlMeshMaterialRenderer(state, makeMaterial(TestKind))).toBeNull();
38
+ });
39
+
40
+ it('resolves by the material kind', () => {
41
+ const { state } = makeGlScene3DState();
42
+ registerGlMeshMaterialRenderer(state, TestKind, renderer);
43
+ expect(resolveGlMeshMaterialRenderer(state, makeMaterial(TestKind))).toBe(renderer);
44
+ });
45
+
46
+ it('falls back to the DefaultMaterialKind renderer', () => {
47
+ const { state } = makeGlScene3DState();
48
+ registerGlMeshMaterialRenderer(state, DefaultMaterialKind, renderer);
49
+ expect(resolveGlMeshMaterialRenderer(state, makeMaterial('Other'))).toBe(renderer);
50
+ expect(resolveGlMeshMaterialRenderer(state, null)).toBe(renderer);
51
+ });
52
+ });