@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,569 @@
1
+ // The shared Gl PBR prelude: the GLSL 300 es vertex + fragment uber-shader for the StandardPbr
2
+ // forward-lit path and every PBR-extension variant. One source string is specialized per material
3
+ // at compile time by prepending a define block (see GlPbrDefineKey / buildGlPbrDefineSource), so
4
+ // the maps-present / double-sided / alpha-mode variants AND the extension lobes (clearcoat, sheen,
5
+ // anisotropy, iridescence, specular, subsurface, transmission) are all #ifdef branches of one
6
+ // shader, never separate files. An extension renderer sets exactly one extension define on top of
7
+ // the standard map flags drawn from `material.standard`, so the base StandardPbr path is byte-for-
8
+ // byte unchanged when no extension flag is set.
9
+ //
10
+ // The lighting model is Cook-Torrance: GGX normal distribution, Smith height-correlated
11
+ // visibility, and a Fresnel-Schlick approximation, evaluated over the interpolated world-space
12
+ // normal/tangent/uv for one directional + one ambient light read from the packed light block. The
13
+ // fragment shader outputs LINEAR HDR radiance (no tonemap / gamma here — the effect pipeline's
14
+ // resolve/tonemap pass owns that), matching the rgba16f scene target.
15
+ //
16
+ // The light block UBO mirrors Scene3DLightBlock.data exactly (std140): a directional term
17
+ // { direction.xyz, _pad, radiance.rgb, _pad } at offset 0 then an ambient term { radiance.rgb,
18
+ // _pad } — radiance is already linear and premultiplied by intensity at pack time, so the shader
19
+ // never decodes sRgb. u_directionalCount / u_ambientCount (0 or 1) gate each term's contribution.
20
+ //
21
+ // Color spaces: sampled albedo/color textures (baseColor, emissive, sheenColor, specularColor,
22
+ // subsurfaceColor) are sRgb-encoded and decoded in GLSL via srgbToLinear. Data maps (normal,
23
+ // metallic-roughness, occlusion, clearcoat, anisotropy, iridescence-thickness, thickness,
24
+ // transmission) are linear and read raw. Packed material colors are decoded to linear on the CPU
25
+ // with unpackColorToLinear before upload, so the shader never double-decodes them.
26
+ import { MAX_FORWARD_LIGHTS } from '@flighthq/types';
27
+ import { GL_SKIN_VERTEX_DECLARATIONS_GLSL, GL_UV_TRANSFORM_VERTEX_GLSL } from './glMeshProgram';
28
+ // A short, stable, order-independent string identity for a define key, used as the program-cache
29
+ // map key. Two keys with the same flags produce the same string and so share a compiled program.
30
+ // Standard map/alpha flags first, then one slot per extension lobe.
31
+ export function buildGlPbrDefineKey(key) {
32
+ return (`${key.alphaMaskEnabled ? 'm' : '-'}` +
33
+ `${key.hasBaseColorMap ? 'b' : '-'}` +
34
+ `${key.hasNormalMap ? 'n' : '-'}` +
35
+ `${key.hasMetallicRoughnessMap ? 'r' : '-'}` +
36
+ `${key.hasOcclusionMap ? 'o' : '-'}` +
37
+ `${key.hasEmissiveMap ? 'e' : '-'}` +
38
+ `${key.hasAlphaMap ? 'a' : '-'}` +
39
+ `${key.hasUvTransform ? 'u' : '-'}` +
40
+ `:${key.clearcoatEnabled ? 'C' : '-'}` +
41
+ `${key.sheenEnabled ? 'S' : '-'}` +
42
+ `${key.anisotropyEnabled ? 'A' : '-'}` +
43
+ `${key.iridescenceEnabled ? 'I' : '-'}` +
44
+ `${key.specularEnabled ? 'P' : '-'}` +
45
+ `${key.subsurfaceEnabled ? 'U' : '-'}` +
46
+ `${key.transmissionEnabled ? 'T' : '-'}` +
47
+ `${key.hasSkin ? 'k' : '-'}`);
48
+ }
49
+ // Builds the leading "#version 300 es\n#define ..." block for a define key, to be prepended to the
50
+ // vertex and fragment prelude bodies before compile. Pure string assembly; the same key always
51
+ // yields the same source, which is what makes the program cache by define key sound.
52
+ export function buildGlPbrDefineSource(key) {
53
+ let defines = `#version 300 es\n#define MAX_FORWARD_LIGHTS ${MAX_FORWARD_LIGHTS}\n`;
54
+ if (key.alphaMaskEnabled)
55
+ defines += '#define ALPHA_MASK\n';
56
+ if (key.hasBaseColorMap)
57
+ defines += '#define HAS_BASE_COLOR_MAP\n';
58
+ if (key.hasUvTransform)
59
+ defines += '#define HAS_UV_TRANSFORM\n';
60
+ if (key.hasNormalMap)
61
+ defines += '#define HAS_NORMAL_MAP\n';
62
+ if (key.hasMetallicRoughnessMap)
63
+ defines += '#define HAS_METALLIC_ROUGHNESS_MAP\n';
64
+ if (key.hasOcclusionMap)
65
+ defines += '#define HAS_OCCLUSION_MAP\n';
66
+ if (key.hasEmissiveMap)
67
+ defines += '#define HAS_EMISSIVE_MAP\n';
68
+ if (key.hasAlphaMap)
69
+ defines += '#define HAS_ALPHA_MAP\n';
70
+ if (key.clearcoatEnabled)
71
+ defines += '#define CLEARCOAT\n';
72
+ if (key.sheenEnabled)
73
+ defines += '#define SHEEN\n';
74
+ if (key.anisotropyEnabled)
75
+ defines += '#define ANISOTROPY\n';
76
+ if (key.iridescenceEnabled)
77
+ defines += '#define IRIDESCENCE\n';
78
+ if (key.specularEnabled)
79
+ defines += '#define SPECULAR_EXT\n';
80
+ if (key.subsurfaceEnabled)
81
+ defines += '#define SUBSURFACE\n';
82
+ if (key.transmissionEnabled)
83
+ defines += '#define TRANSMISSION\n';
84
+ if (key.hasSkin)
85
+ defines += '#define HAS_SKIN\n';
86
+ return defines;
87
+ }
88
+ // The fragment shader body (everything after the "#version 300 es" + defines block). Implements
89
+ // Cook-Torrance GGX/Smith/Fresnel-Schlick over one directional + one ambient light and writes
90
+ // linear HDR radiance to fragColor, plus the extension lobes behind their #ifdefs.
91
+ export function getGlPbrFragmentSource() {
92
+ return PBR_FRAGMENT_BODY;
93
+ }
94
+ // The full fragment source for a define key (define block + body), ready to hand to the GL
95
+ // compiler. Convenience over buildGlPbrDefineSource + getGlPbrFragmentSource.
96
+ export function getGlPbrFragmentSourceForKey(key) {
97
+ return buildGlPbrDefineSource(key) + PBR_FRAGMENT_BODY;
98
+ }
99
+ // The vertex shader body (everything after the "#version 300 es" + defines block). Transforms the
100
+ // canonical PBR vertex record (position/normal/tangent/uv0) by the model and view-projection
101
+ // matrices and passes world-space position, normal, tangent, and uv to the fragment scene2d.
102
+ export function getGlPbrVertexSource() {
103
+ return PBR_VERTEX_BODY;
104
+ }
105
+ // The full vertex source for a define key (define block + optional skin declarations + body), ready to
106
+ // hand to the GL compiler. The skin GLSL is vertex-only (its `in` attributes are illegal in a fragment
107
+ // shader), so it is spliced here rather than into the shared define block.
108
+ export function getGlPbrVertexSourceForKey(key) {
109
+ return buildGlPbrDefineSource(key) + (key.hasSkin ? GL_SKIN_VERTEX_DECLARATIONS_GLSL : '') + PBR_VERTEX_BODY;
110
+ }
111
+ const PBR_VERTEX_BODY = `
112
+ layout(location = 0) in vec3 a_position;
113
+ layout(location = 1) in vec3 a_normal;
114
+ layout(location = 2) in vec4 a_tangent;
115
+ layout(location = 3) in vec2 a_uv0;
116
+
117
+ uniform mat4 u_viewProjection;
118
+ uniform mat4 u_model;
119
+ uniform mat3 u_normalMatrix;
120
+ ${GL_UV_TRANSFORM_VERTEX_GLSL}
121
+ out vec3 v_worldPosition;
122
+ out vec3 v_normal;
123
+ out vec4 v_tangent;
124
+ out vec2 v_uv0;
125
+
126
+ void main() {
127
+ #ifdef HAS_SKIN
128
+ mat4 skin = skinMatrix();
129
+ vec4 localPosition = skin * vec4(a_position, 1.0);
130
+ vec3 localNormal = mat3(skin) * a_normal;
131
+ vec3 localTangent = mat3(skin) * a_tangent.xyz;
132
+ #else
133
+ vec4 localPosition = vec4(a_position, 1.0);
134
+ vec3 localNormal = a_normal;
135
+ vec3 localTangent = a_tangent.xyz;
136
+ #endif
137
+ vec4 worldPosition = u_model * localPosition;
138
+ v_worldPosition = worldPosition.xyz;
139
+ v_normal = u_normalMatrix * localNormal;
140
+ v_tangent = vec4(u_normalMatrix * localTangent, a_tangent.w);
141
+ v_uv0 = applyUvTransform(a_uv0);
142
+ gl_Position = u_viewProjection * worldPosition;
143
+ }
144
+ `;
145
+ const PBR_FRAGMENT_BODY = `
146
+ precision highp float;
147
+
148
+ in vec3 v_worldPosition;
149
+ in vec3 v_normal;
150
+ in vec4 v_tangent;
151
+ in vec2 v_uv0;
152
+
153
+ uniform vec4 u_baseColor;
154
+ uniform float u_metallic;
155
+ uniform float u_roughness;
156
+ uniform float u_normalScale;
157
+ uniform vec3 u_emissive;
158
+ uniform float u_emissiveStrength;
159
+ uniform float u_occlusionStrength;
160
+ uniform float u_alphaCutoff;
161
+ uniform vec3 u_cameraPosition;
162
+
163
+ uniform vec4 u_directional;
164
+ uniform vec4 u_directionalRadiance;
165
+ uniform vec3 u_ambientRadiance;
166
+ uniform float u_directionalCount;
167
+ uniform float u_ambientCount;
168
+
169
+ // Punctual (point/spot/hemisphere) forward-light arrays — layout mirrors Scene3DLightBlock.data exactly
170
+ // (packScene3DLightBlock), matching GL_MESH_LIGHT_BLOCK_GLSL used by the classic prelude. Fixed
171
+ // MAX_FORWARD_LIGHTS-wide; each count bounds its loop.
172
+ // point[i] = u_pointLights[i*2+0]={pos.xyz,range}, [i*2+1]={radiance.rgb,invSqrRange}
173
+ // spot[i] = u_spotLights[i*4+0..1] as point, [i*4+2]={dir.xyz,_}, [i*4+3]={cosInner,cosOuter,_,_}
174
+ // hemisphere[i] = u_hemisphereLights[i*3+0]={sky.rgb,_}, [i*3+1]={ground.rgb,_}, [i*3+2]={up.xyz,_}
175
+ uniform vec4 u_pointLights[MAX_FORWARD_LIGHTS * 2];
176
+ uniform vec4 u_spotLights[MAX_FORWARD_LIGHTS * 4];
177
+ uniform vec4 u_hemisphereLights[MAX_FORWARD_LIGHTS * 3];
178
+ uniform int u_pointCount;
179
+ uniform int u_spotCount;
180
+ uniform int u_hemisphereCount;
181
+
182
+ uniform sampler2D u_shadowMap; // directional shadow depth map
183
+ uniform mat4 u_shadowMatrix; // world -> shadow light-clip
184
+ uniform float u_shadowEnabled; // 0 or 1 — gates shadow sampling
185
+
186
+ // Directional shadow factor (1.0 = lit, 0.0 = shadowed) with 3x3 PCF; fragments outside the shadow
187
+ // frustum read as lit. Multiplied into the directional term below.
188
+ float sampleDirectionalShadow(vec3 worldPos) {
189
+ if (u_shadowEnabled < 0.5) return 1.0;
190
+ vec4 clip = u_shadowMatrix * vec4(worldPos, 1.0);
191
+ vec3 ndc = clip.xyz / clip.w;
192
+ vec3 uvz = ndc * 0.5 + 0.5;
193
+ if (uvz.x < 0.0 || uvz.x > 1.0 || uvz.y < 0.0 || uvz.y > 1.0 || uvz.z > 1.0) return 1.0;
194
+ float current = uvz.z - 0.0025;
195
+ vec2 texel = 1.0 / vec2(textureSize(u_shadowMap, 0));
196
+ float sum = 0.0;
197
+ for (int x = -1; x <= 1; ++x) {
198
+ for (int y = -1; y <= 1; ++y) {
199
+ float closest = texture(u_shadowMap, uvz.xy + vec2(float(x), float(y)) * texel).r;
200
+ sum += current <= closest ? 1.0 : 0.0;
201
+ }
202
+ }
203
+ return sum / 9.0;
204
+ }
205
+
206
+ uniform samplerCube u_iblIrradiance; // diffuse irradiance cubemap
207
+ uniform samplerCube u_iblPrefiltered; // roughness-mipped prefiltered specular cubemap
208
+ uniform sampler2D u_iblBrdf; // split-sum BRDF integration LUT (RG)
209
+ uniform float u_iblEnabled; // 0 or 1 — gates image-based ambient
210
+ uniform float u_iblIntensity; // environment contribution scale
211
+ uniform float u_iblMaxMip; // highest prefiltered mip index (roughness 1.0)
212
+
213
+ // Roughness-aware Fresnel for the IBL specular term (Sébastien Lagarde): rougher surfaces reflect less
214
+ // at grazing angles than the smooth Schlick approximation.
215
+ vec3 fresnelSchlickRoughness(float cosTheta, vec3 F0, float roughness) {
216
+ return F0 + (max(vec3(1.0 - roughness), F0) - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0);
217
+ }
218
+
219
+ // Image-based ambient via the split-sum approximation: diffuse irradiance over the albedo plus
220
+ // prefiltered specular weighted by the BRDF LUT. Replaces the flat ambient term when an environment
221
+ // is baked (bakeGlEnvironmentIbl). All three cubemap/LUT samples are already linear (baked from
222
+ // sRGB-decoded sources), so no decode here.
223
+ vec3 sampleIblAmbient(vec3 N, vec3 V, float rough, vec3 F0, vec3 diffuseColor, float occ) {
224
+ float nv = max(dot(N, V), 1e-4);
225
+ vec3 F = fresnelSchlickRoughness(nv, F0, rough);
226
+ vec3 diffuse = texture(u_iblIrradiance, N).rgb * diffuseColor;
227
+ vec3 R = reflect(-V, N);
228
+ vec3 prefiltered = textureLod(u_iblPrefiltered, R, rough * u_iblMaxMip).rgb;
229
+ vec2 brdf = texture(u_iblBrdf, vec2(nv, rough)).rg;
230
+ vec3 specular = prefiltered * (F * brdf.x + brdf.y);
231
+ return ((vec3(1.0) - F) * diffuse + specular) * occ * u_iblIntensity;
232
+ }
233
+
234
+ #ifdef HAS_BASE_COLOR_MAP
235
+ uniform sampler2D u_baseColorMap;
236
+ #endif
237
+ #ifdef HAS_NORMAL_MAP
238
+ uniform sampler2D u_normalMap;
239
+ #endif
240
+ #ifdef HAS_METALLIC_ROUGHNESS_MAP
241
+ uniform sampler2D u_metallicRoughnessMap;
242
+ #endif
243
+ #ifdef HAS_OCCLUSION_MAP
244
+ uniform sampler2D u_occlusionMap;
245
+ #endif
246
+ #ifdef HAS_EMISSIVE_MAP
247
+ uniform sampler2D u_emissiveMap;
248
+ #endif
249
+ #ifdef HAS_ALPHA_MAP
250
+ uniform sampler2D u_alphaMap;
251
+ #endif
252
+
253
+ #ifdef CLEARCOAT
254
+ uniform float u_clearcoat;
255
+ uniform float u_clearcoatRoughness;
256
+ #endif
257
+ #ifdef SHEEN
258
+ uniform vec3 u_sheenColor;
259
+ uniform float u_sheenRoughness;
260
+ #endif
261
+ #ifdef ANISOTROPY
262
+ uniform float u_anisotropyStrength;
263
+ uniform float u_anisotropyRotation;
264
+ #endif
265
+ #ifdef IRIDESCENCE
266
+ uniform float u_iridescence;
267
+ uniform float u_iridescenceIor;
268
+ uniform float u_iridescenceThickness;
269
+ #endif
270
+ #ifdef SPECULAR_EXT
271
+ uniform float u_specular;
272
+ uniform vec3 u_specularColor;
273
+ #endif
274
+ #ifdef SUBSURFACE
275
+ uniform float u_subsurface;
276
+ uniform vec3 u_subsurfaceColor;
277
+ uniform float u_thickness;
278
+ #endif
279
+ #ifdef TRANSMISSION
280
+ uniform float u_transmission;
281
+ uniform vec3 u_attenuationColor;
282
+ #endif
283
+
284
+ uniform float u_objectAlpha;
285
+
286
+ out vec4 fragColor;
287
+
288
+ const float PI = 3.14159265359;
289
+
290
+ // sRgb albedo texels are gamma-encoded; decode to linear before lighting.
291
+ vec3 srgbToLinear(vec3 c) {
292
+ vec3 lo = c / 12.92;
293
+ vec3 hi = pow((c + 0.055) / 1.055, vec3(2.4));
294
+ return mix(lo, hi, step(0.04045, c));
295
+ }
296
+
297
+ float distributionGgx(float nDotH, float roughness) {
298
+ float a = roughness * roughness;
299
+ float a2 = a * a;
300
+ float d = nDotH * nDotH * (a2 - 1.0) + 1.0;
301
+ return a2 / max(PI * d * d, 1e-7);
302
+ }
303
+
304
+ float visibilitySmith(float nDotV, float nDotL, float roughness) {
305
+ float a = roughness * roughness;
306
+ float k = a * 0.5;
307
+ float gv = nDotV / (nDotV * (1.0 - k) + k);
308
+ float gl = nDotL / (nDotL * (1.0 - k) + k);
309
+ return gv * gl;
310
+ }
311
+
312
+ vec3 fresnelSchlick(float cosTheta, vec3 f0) {
313
+ return f0 + (1.0 - f0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0);
314
+ }
315
+
316
+ #ifdef ANISOTROPY
317
+ // Anisotropic GGX distribution (Burley): an elliptical lobe along the tangent (at) vs bitangent
318
+ // (ab) roughness axes. tDotH/bDotH are the half-vector projections onto the rotated tangent frame.
319
+ float distributionGgxAnisotropic(float nDotH, float tDotH, float bDotH, float at, float ab) {
320
+ float d = tDotH * tDotH / (at * at) + bDotH * bDotH / (ab * ab) + nDotH * nDotH;
321
+ return 1.0 / max(PI * at * ab * d * d, 1e-7);
322
+ }
323
+ #endif
324
+
325
+ #ifdef SHEEN
326
+ // Charlie ("inverted GGX") sheen distribution from Estevez & Kulla — a soft retroreflective lobe
327
+ // for cloth. Approximated visibility keeps the lobe energy-plausible without a lookup table.
328
+ float distributionCharlie(float nDotH, float roughness) {
329
+ float r = clamp(roughness, 0.07, 1.0);
330
+ float invR = 1.0 / r;
331
+ float cos2h = nDotH * nDotH;
332
+ float sin2h = max(1.0 - cos2h, 1e-4);
333
+ return (2.0 + invR) * pow(sin2h, invR * 0.5) / (2.0 * PI);
334
+ }
335
+
336
+ float visibilitySheen(float nDotV, float nDotL) {
337
+ return 1.0 / max(4.0 * (nDotL + nDotV - nDotL * nDotV), 1e-4);
338
+ }
339
+ #endif
340
+
341
+ #ifdef IRIDESCENCE
342
+ // Thin-film interference: shift F0 toward a view-/thickness-dependent hue. A compact sinusoidal
343
+ // approximation of the optical-path-difference phase per RGB band (sample-viewer style), enough to
344
+ // produce a plausible soap-bubble rainbow without the full Airy summation.
345
+ vec3 iridescentFresnel(float cosTheta, vec3 f0, float thicknessNm, float filmIor) {
346
+ float opd = 2.0 * filmIor * thicknessNm * cosTheta;
347
+ vec3 bands = vec3(580.0, 540.0, 460.0); // approximate R/G/B wavelengths (nm)
348
+ vec3 phase = 2.0 * PI * opd / bands;
349
+ vec3 shift = 0.5 + 0.5 * cos(phase);
350
+ vec3 base = fresnelSchlick(cosTheta, f0);
351
+ return mix(base, shift, clamp(thicknessNm / 1000.0, 0.0, 1.0));
352
+ }
353
+ #endif
354
+
355
+ // Smooth inverse-square range window (glTF/UE4): 1 near the light, eased to 0 at the range. invSqrRange
356
+ // is 1/range^2 (0 = infinite range, no cutoff); dist2 is the squared surface->light distance.
357
+ float rangeWindow(float dist2, float invSqrRange) {
358
+ float factor = dist2 * invSqrRange;
359
+ float windowed = clamp(1.0 - factor * factor, 0.0, 1.0);
360
+ return windowed * windowed;
361
+ }
362
+
363
+ // The full Cook-Torrance shading (plus every enabled extension lobe) for ONE light. Directional,
364
+ // point, and spot lights all route through this one BRDF so punctual lights never fork the shading
365
+ // model — the caller passes the surface->light direction L and that light's (attenuated, cone-scaled)
366
+ // radiance. The anisotropic tangent frame is rebuilt here per light from the surface tangent frame so
367
+ // the function stays self-contained; f0/diffuseColor/roughness/metallic are the finalized surface
368
+ // values from main. Returns the light's linear radiance contribution (shadowing applied by the caller).
369
+ vec3 shadePbrPunctual(vec3 N, vec3 V, vec3 tangentDir, vec3 bitangentDir, vec3 L, vec3 lightColor,
370
+ vec3 f0, vec3 diffuseColor, float roughness, float metallic) {
371
+ float nDotV = max(dot(N, V), 1e-4);
372
+ vec3 halfVec = normalize(V + L);
373
+ float nDotL = max(dot(N, L), 0.0);
374
+ float nDotH = max(dot(N, halfVec), 0.0);
375
+ float vDotH = max(dot(V, halfVec), 0.0);
376
+
377
+ #ifdef ANISOTROPY
378
+ float cosR = cos(u_anisotropyRotation);
379
+ float sinR = sin(u_anisotropyRotation);
380
+ vec3 anisoT = normalize(cosR * tangentDir + sinR * bitangentDir);
381
+ vec3 anisoB = normalize(cross(N, anisoT));
382
+ float aniso = clamp(u_anisotropyStrength, 0.0, 1.0);
383
+ float at = max(roughness * roughness * (1.0 + aniso), 1e-3);
384
+ float ab = max(roughness * roughness * (1.0 - aniso), 1e-3);
385
+ float tDotH = dot(anisoT, halfVec);
386
+ float bDotH = dot(anisoB, halfVec);
387
+ float d = distributionGgxAnisotropic(nDotH, tDotH, bDotH, at, ab);
388
+ #else
389
+ float d = distributionGgx(nDotH, roughness);
390
+ #endif
391
+ float vis = visibilitySmith(nDotV, nDotL, roughness);
392
+ vec3 fresnel = fresnelSchlick(vDotH, f0);
393
+
394
+ vec3 specular = d * vis * fresnel;
395
+ vec3 kd = (1.0 - fresnel) * (1.0 - metallic);
396
+ vec3 brdf = kd * diffuseColor / PI + specular;
397
+ vec3 direct = brdf * lightColor * nDotL;
398
+
399
+ #ifdef SUBSURFACE
400
+ // Wrapped-diffuse subsurface approximation (non-interop): a soft back-/side-lit wrap term tinted by
401
+ // the subsurface color, scaled by thickness (thinner = more translucency).
402
+ float wrap = clamp((dot(N, L) + 0.5) / 2.25, 0.0, 1.0);
403
+ float translucency = u_subsurface / (1.0 + u_thickness);
404
+ direct += translucency * wrap * u_subsurfaceColor * diffuseColor * lightColor;
405
+ #endif
406
+
407
+ #ifdef SHEEN
408
+ // Charlie sheen lobe added on top of the base specular for cloth/fabric retroreflection.
409
+ float sheenD = distributionCharlie(nDotH, u_sheenRoughness);
410
+ float sheenV = visibilitySheen(nDotV, nDotL);
411
+ direct += u_sheenColor * sheenD * sheenV * lightColor * nDotL;
412
+ #endif
413
+
414
+ #ifdef CLEARCOAT
415
+ // A second, always-dielectric GGX lobe (F0 = 0.04) over the base layer, with its own roughness.
416
+ // Energy from the clearcoat reflection attenuates the layers beneath it.
417
+ float ccRough = clamp(u_clearcoatRoughness, 0.04, 1.0);
418
+ float ccD = distributionGgx(nDotH, ccRough);
419
+ float ccVis = visibilitySmith(nDotV, nDotL, ccRough);
420
+ vec3 ccF = fresnelSchlick(vDotH, vec3(0.04)) * u_clearcoat;
421
+ vec3 ccSpec = ccD * ccVis * ccF * lightColor * nDotL;
422
+ direct = direct * (1.0 - ccF) + ccSpec;
423
+ #endif
424
+
425
+ return direct;
426
+ }
427
+
428
+ void main() {
429
+ vec4 baseColor = u_baseColor;
430
+ #ifdef HAS_BASE_COLOR_MAP
431
+ vec4 sampled = texture(u_baseColorMap, v_uv0);
432
+ baseColor.rgb *= srgbToLinear(sampled.rgb);
433
+ baseColor.a *= sampled.a;
434
+ #endif
435
+
436
+ // Dedicated coverage (opacity) map: its green channel is linear data, multiplied into alpha before
437
+ // the alpha-mask cutoff so 'mask' cutout and 'blend' transparency both see the combined coverage.
438
+ #ifdef HAS_ALPHA_MAP
439
+ baseColor.a *= texture(u_alphaMap, v_uv0).g;
440
+ #endif
441
+
442
+ #ifdef ALPHA_MASK
443
+ if (baseColor.a < u_alphaCutoff) discard;
444
+ #endif
445
+
446
+ vec3 geometricNormal = normalize(v_normal);
447
+ if (!gl_FrontFacing) geometricNormal = -geometricNormal;
448
+
449
+ #if defined(HAS_NORMAL_MAP) || defined(ANISOTROPY)
450
+ vec3 tangent = normalize(v_tangent.xyz - geometricNormal * dot(v_tangent.xyz, geometricNormal));
451
+ vec3 bitangent = cross(geometricNormal, tangent) * v_tangent.w;
452
+ #else
453
+ vec3 tangent = vec3(1.0, 0.0, 0.0);
454
+ vec3 bitangent = vec3(0.0, 1.0, 0.0);
455
+ #endif
456
+
457
+ vec3 normal = geometricNormal;
458
+ #ifdef HAS_NORMAL_MAP
459
+ vec3 tangentNormal = texture(u_normalMap, v_uv0).xyz * 2.0 - 1.0;
460
+ tangentNormal.xy *= u_normalScale;
461
+ mat3 tbn = mat3(tangent, bitangent, geometricNormal);
462
+ normal = normalize(tbn * tangentNormal);
463
+ #endif
464
+
465
+ vec3 viewDir = normalize(u_cameraPosition - v_worldPosition);
466
+ float nDotV = max(dot(normal, viewDir), 1e-4);
467
+
468
+ float roughness = clamp(u_roughness, 0.04, 1.0);
469
+ float metallic = clamp(u_metallic, 0.0, 1.0);
470
+ #ifdef HAS_METALLIC_ROUGHNESS_MAP
471
+ // glTF packing: roughness in G, metallic in B (R is occlusion if combined, ignored here).
472
+ vec4 mr = texture(u_metallicRoughnessMap, v_uv0);
473
+ roughness = clamp(roughness * mr.g, 0.04, 1.0);
474
+ metallic = clamp(metallic * mr.b, 0.0, 1.0);
475
+ #endif
476
+
477
+ float occlusion = 1.0;
478
+ #ifdef HAS_OCCLUSION_MAP
479
+ // Occlusion in R; strength lerps between full ambient (1.0) and the sampled value.
480
+ float ao = texture(u_occlusionMap, v_uv0).r;
481
+ occlusion = mix(1.0, ao, clamp(u_occlusionStrength, 0.0, 1.0));
482
+ #endif
483
+
484
+ vec3 albedo = baseColor.rgb;
485
+ vec3 f0 = mix(vec3(0.04), albedo, metallic);
486
+
487
+ #ifdef SPECULAR_EXT
488
+ // KHR_materials_specular: scale and tint the dielectric F0 (metals keep their albedo F0).
489
+ vec3 dielectricF0 = min(0.04 * u_specularColor, vec3(1.0)) * u_specular;
490
+ f0 = mix(dielectricF0, albedo, metallic);
491
+ #endif
492
+
493
+ #ifdef IRIDESCENCE
494
+ f0 = mix(f0, iridescentFresnel(nDotV, f0, u_iridescenceThickness, u_iridescenceIor), u_iridescence);
495
+ #endif
496
+
497
+ vec3 diffuseColor = albedo * (1.0 - metallic);
498
+
499
+ vec3 radiance = vec3(0.0);
500
+
501
+ // Directional light: -direction is the surface-to-light vector (light travels along direction).
502
+ if (u_directionalCount > 0.5) {
503
+ vec3 lightDir = normalize(-u_directional.xyz);
504
+ vec3 direct = shadePbrPunctual(normal, viewDir, tangent, bitangent, lightDir,
505
+ u_directionalRadiance.rgb, f0, diffuseColor, roughness, metallic);
506
+ radiance += direct * sampleDirectionalShadow(v_worldPosition);
507
+ }
508
+
509
+ // Point lights: surface->light direction with a smooth inverse-square range falloff, same BRDF.
510
+ for (int i = 0; i < MAX_FORWARD_LIGHTS; i++) {
511
+ if (i >= u_pointCount) break;
512
+ vec3 toLight = u_pointLights[i * 2 + 0].xyz - v_worldPosition;
513
+ float dist2 = dot(toLight, toLight);
514
+ vec3 lightDir = toLight * inversesqrt(max(dist2, 1e-8));
515
+ float atten = rangeWindow(dist2, u_pointLights[i * 2 + 1].w) / max(dist2, 1e-4);
516
+ radiance += shadePbrPunctual(normal, viewDir, tangent, bitangent, lightDir,
517
+ u_pointLights[i * 2 + 1].rgb * atten, f0, diffuseColor, roughness, metallic);
518
+ }
519
+
520
+ // Spot lights: point attenuation times a smooth cone falloff between the inner/outer cosines.
521
+ for (int i = 0; i < MAX_FORWARD_LIGHTS; i++) {
522
+ if (i >= u_spotCount) break;
523
+ vec3 toLight = u_spotLights[i * 4 + 0].xyz - v_worldPosition;
524
+ float dist2 = dot(toLight, toLight);
525
+ vec3 lightDir = toLight * inversesqrt(max(dist2, 1e-8));
526
+ float atten = rangeWindow(dist2, u_spotLights[i * 4 + 1].w) / max(dist2, 1e-4);
527
+ float cone = smoothstep(u_spotLights[i * 4 + 3].y, u_spotLights[i * 4 + 3].x,
528
+ dot(normalize(u_spotLights[i * 4 + 2].xyz), -lightDir));
529
+ radiance += shadePbrPunctual(normal, viewDir, tangent, bitangent, lightDir,
530
+ u_spotLights[i * 4 + 1].rgb * atten * cone, f0, diffuseColor, roughness, metallic);
531
+ }
532
+
533
+ // Ambient term: image-based lighting (diffuse irradiance + prefiltered specular) when an environment
534
+ // is baked, else the flat ambient irradiance over the diffuse albedo. Both are attenuated by AO.
535
+ if (u_iblEnabled > 0.5) {
536
+ radiance += sampleIblAmbient(normal, viewDir, roughness, f0, diffuseColor, occlusion);
537
+ } else if (u_ambientCount > 0.5) {
538
+ radiance += diffuseColor * u_ambientRadiance * occlusion;
539
+ }
540
+
541
+ // Hemisphere fill: sky/ground gradient blended by the normal's vertical component, AO-attenuated.
542
+ for (int i = 0; i < MAX_FORWARD_LIGHTS; i++) {
543
+ if (i >= u_hemisphereCount) break;
544
+ float f = 0.5 + 0.5 * dot(normal, u_hemisphereLights[i * 3 + 2].xyz);
545
+ radiance += mix(u_hemisphereLights[i * 3 + 1].rgb, u_hemisphereLights[i * 3 + 0].rgb, f)
546
+ * diffuseColor * occlusion;
547
+ }
548
+
549
+ vec3 emissive = u_emissive;
550
+ #ifdef HAS_EMISSIVE_MAP
551
+ emissive *= srgbToLinear(texture(u_emissiveMap, v_uv0).rgb);
552
+ #endif
553
+ radiance += emissive * u_emissiveStrength;
554
+
555
+ float alpha = baseColor.a;
556
+ #ifdef TRANSMISSION
557
+ // Phase-5 approximation: a true refractive path needs the opaque-scene-color capture pass to
558
+ // sample what lies behind the surface. Until then, model transmission as added translucency —
559
+ // attenuate coverage by the transmission factor and tint the surface by the attenuation color.
560
+ // TODO Phase 5: replace with a refracted background sample + Beer-Lambert volume absorption.
561
+ radiance *= mix(vec3(1.0), u_attenuationColor, u_transmission);
562
+ alpha *= (1.0 - u_transmission);
563
+ #endif
564
+
565
+ fragColor = vec4(radiance, alpha);
566
+ fragColor.a *= u_objectAlpha;
567
+ }
568
+ `;
569
+ //# sourceMappingURL=glPbrPrelude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glPbrPrelude.js","sourceRoot":"","sources":["../src/glPbrPrelude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { GlPbrProgram, GlRenderState, GlPbrDefineKey } from '@flighthq/types';
2
+ export declare function compileGlPbrProgram(gl: WebGL2RenderingContext, key: Readonly<GlPbrDefineKey>): GlPbrProgram;
3
+ export declare function ensureGlPbrProgram(state: GlRenderState, key: Readonly<GlPbrDefineKey>): GlPbrProgram;
4
+ //# sourceMappingURL=glPbrProgramCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glPbrProgramCache.d.ts","sourceRoot":"","sources":["../src/glPbrProgramCache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AASnF,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,sBAAsB,EAAE,GAAG,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,YAAY,CA0C3G;AAKD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,YAAY,CAQpG"}
@@ -0,0 +1,63 @@
1
+ import { resolveGlLitLocations } from './glLitProgram';
2
+ import { compileGlProgram, ensureGlScene3DProgram } from './glMeshProgram';
3
+ import { buildGlPbrDefineKey, getGlPbrFragmentSourceForKey, getGlPbrVertexSourceForKey } from './glPbrPrelude';
4
+ import { getGlScene3DRuntime } from './glScene3DRuntime';
5
+ // Compiles the StandardPbr uber-shader for a define key, links it, and resolves its uniform
6
+ // locations. Pure GL work — no caching — used by ensureGlPbrProgram. Throws on a compile/link
7
+ // failure, which is a programmer error (a malformed prelude), not an expected runtime condition.
8
+ export function compileGlPbrProgram(gl, key) {
9
+ const vertexSource = getGlPbrVertexSourceForKey(key);
10
+ const fragmentSource = getGlPbrFragmentSourceForKey(key);
11
+ const program = compileGlProgram(gl, vertexSource, fragmentSource);
12
+ return {
13
+ ...resolveGlLitLocations(gl, program),
14
+ program,
15
+ locAlphaCutoff: gl.getUniformLocation(program, 'u_alphaCutoff'),
16
+ locAlphaMap: gl.getUniformLocation(program, 'u_alphaMap'),
17
+ locAnisotropyRotation: gl.getUniformLocation(program, 'u_anisotropyRotation'),
18
+ locAnisotropyStrength: gl.getUniformLocation(program, 'u_anisotropyStrength'),
19
+ locAttenuationColor: gl.getUniformLocation(program, 'u_attenuationColor'),
20
+ locBaseColor: gl.getUniformLocation(program, 'u_baseColor'),
21
+ locBaseColorMap: gl.getUniformLocation(program, 'u_baseColorMap'),
22
+ locClearcoat: gl.getUniformLocation(program, 'u_clearcoat'),
23
+ locClearcoatRoughness: gl.getUniformLocation(program, 'u_clearcoatRoughness'),
24
+ locEmissive: gl.getUniformLocation(program, 'u_emissive'),
25
+ locEmissiveMap: gl.getUniformLocation(program, 'u_emissiveMap'),
26
+ locEmissiveStrength: gl.getUniformLocation(program, 'u_emissiveStrength'),
27
+ locIridescence: gl.getUniformLocation(program, 'u_iridescence'),
28
+ locIridescenceIor: gl.getUniformLocation(program, 'u_iridescenceIor'),
29
+ locIridescenceThickness: gl.getUniformLocation(program, 'u_iridescenceThickness'),
30
+ locJointTexture: gl.getUniformLocation(program, 'u_jointTexture'),
31
+ locMetallic: gl.getUniformLocation(program, 'u_metallic'),
32
+ locMetallicRoughnessMap: gl.getUniformLocation(program, 'u_metallicRoughnessMap'),
33
+ locModel: gl.getUniformLocation(program, 'u_model'),
34
+ locNormalMap: gl.getUniformLocation(program, 'u_normalMap'),
35
+ locNormalMatrix: gl.getUniformLocation(program, 'u_normalMatrix'),
36
+ locNormalScale: gl.getUniformLocation(program, 'u_normalScale'),
37
+ locOcclusionMap: gl.getUniformLocation(program, 'u_occlusionMap'),
38
+ locOcclusionStrength: gl.getUniformLocation(program, 'u_occlusionStrength'),
39
+ locRoughness: gl.getUniformLocation(program, 'u_roughness'),
40
+ locSheenColor: gl.getUniformLocation(program, 'u_sheenColor'),
41
+ locSheenRoughness: gl.getUniformLocation(program, 'u_sheenRoughness'),
42
+ locSpecular: gl.getUniformLocation(program, 'u_specular'),
43
+ locSpecularColor: gl.getUniformLocation(program, 'u_specularColor'),
44
+ locSubsurface: gl.getUniformLocation(program, 'u_subsurface'),
45
+ locSubsurfaceColor: gl.getUniformLocation(program, 'u_subsurfaceColor'),
46
+ locThickness: gl.getUniformLocation(program, 'u_thickness'),
47
+ locTransmission: gl.getUniformLocation(program, 'u_transmission'),
48
+ locViewProjection: gl.getUniformLocation(program, 'u_viewProjection'),
49
+ };
50
+ }
51
+ // Resolves the StandardPbr program for a define key, compiling and caching it on first use through
52
+ // the shared scene program cache under the `pbr:` family namespace, so each variant is compiled at
53
+ // most once per state and reused every frame.
54
+ export function ensureGlPbrProgram(state, key) {
55
+ // Fold the render-state skinned-run flag into the variant so a skinned draw of an otherwise-identical
56
+ // material compiles + caches its own HAS_SKIN program, without the material renderer knowing.
57
+ const fullKey = {
58
+ ...key,
59
+ hasSkin: getGlScene3DRuntime(state).activeSkinnedRun,
60
+ };
61
+ return ensureGlScene3DProgram(state, `pbr:${buildGlPbrDefineKey(fullKey)}`, (gl) => compileGlPbrProgram(gl, fullKey));
62
+ }
63
+ //# sourceMappingURL=glPbrProgramCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glPbrProgramCache.js","sourceRoot":"","sources":["../src/glPbrProgramCache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { GlRenderState, StandardPbrMaterialProperties, SurfaceMaterial, Texture, GlPbrDefineKey, GlPbrProgram } from '@flighthq/types';
2
+ export declare const GL_PBR_BASE_COLOR_TEXTURE_UNIT = 0;
3
+ export declare const GL_PBR_NORMAL_TEXTURE_UNIT = 1;
4
+ export declare const GL_PBR_METALLIC_ROUGHNESS_TEXTURE_UNIT = 2;
5
+ export declare const GL_PBR_OCCLUSION_TEXTURE_UNIT = 3;
6
+ export declare const GL_PBR_EMISSIVE_TEXTURE_UNIT = 4;
7
+ export declare const GL_PBR_ALPHA_TEXTURE_UNIT = 5;
8
+ export declare const GL_PBR_EXTENSION_TEXTURE_UNIT = 6;
9
+ export declare function bindGlPbrStandardBlock(state: GlRenderState, program: Readonly<GlPbrProgram>, standard: Readonly<StandardPbrMaterialProperties> | null): void;
10
+ export declare function bindGlPbrStandardTexture(state: GlRenderState, texture: Readonly<Texture> | null, location: WebGLUniformLocation | null, unit: number): void;
11
+ export declare function buildGlPbrStandardDefineKey(standard: Readonly<StandardPbrMaterialProperties> | null, surface: Readonly<SurfaceMaterial> | null): GlPbrDefineKey;
12
+ export declare function isGlTextureReady(texture: Readonly<Texture> | null): boolean;
13
+ //# sourceMappingURL=glPbrStandardBlock.d.ts.map