@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,57 @@
1
+ import { unpackColorToLinear } from '@flighthq/color';
2
+ import { SubsurfacePbrMaterialKind } from '@flighthq/types';
3
+ import { bindGlMeshLightBlock } from './glLitProgram';
4
+ import { registerGlMeshMaterialRenderer } from './glMeshMaterialRegistry';
5
+ import { beginGlMeshDraw, drawGlMeshSubset, setGlMeshCameraPosition, setGlMeshViewProjection } from './glMeshProgram';
6
+ import { ensureGlPbrProgram } from './glPbrProgramCache';
7
+ import { bindGlPbrStandardBlock, buildGlPbrStandardDefineKey } from './glPbrStandardBlock';
8
+ import { getGlScene3DRuntime } from './glScene3DRuntime';
9
+ // The built-in Subsurface forward-lit mesh-material renderer (Flight extension; flagged non-interop
10
+ // — there is no glTF equivalent). It approximates subsurface scattering with a wrapped-diffuse term:
11
+ // light wrapping past the terminator re-emerges tinted by `subsurfaceColor`, scaled by `subsurface`
12
+ // strength and inversely by `thickness` (thinner material = more translucency). This is a cheap
13
+ // stand-in for true diffusion-profile SSS — plausible for skin, wax, marble, foliage at forward-pass
14
+ // cost — and lives behind `#define SUBSURFACE` in the PBR uber-shader. bind composes the material's
15
+ // `standard` block through the shared bindGlPbrStandardBlock and uploads the subsurface scalars +
16
+ // linear-decoded subsurfaceColor. The subsurface/thickness maps are reserved but not yet sampled.
17
+ // See registerSubsurfacePbrGlMaterial.
18
+ export const subsurfacePbrGlMeshMaterialRenderer = {
19
+ bind(state, material, lights, camera) {
20
+ const gl = state.gl;
21
+ const subsurface = material;
22
+ const standard = subsurface !== null ? subsurface.standard : null;
23
+ const key = buildGlPbrStandardDefineKey(standard, subsurface);
24
+ key.subsurfaceEnabled = true;
25
+ const program = ensureGlPbrProgram(state, key);
26
+ beginGlMeshDraw(state, program, subsurface !== null && subsurface.doubleSided);
27
+ setGlMeshViewProjection(gl, program.locViewProjection, camera);
28
+ setGlMeshCameraPosition(gl, program.locCameraPosition, camera);
29
+ bindGlMeshLightBlock(state, program, lights);
30
+ bindGlPbrStandardBlock(state, program, standard);
31
+ gl.uniform1f(program.locAlphaCutoff, subsurface !== null ? subsurface.alphaCutoff : 0.5);
32
+ if (subsurface !== null) {
33
+ unpackColorToLinear(scratchRgba, subsurface.subsurfaceColor);
34
+ gl.uniform1f(program.locSubsurface, subsurface.subsurface);
35
+ gl.uniform3f(program.locSubsurfaceColor, scratchRgba[0], scratchRgba[1], scratchRgba[2]);
36
+ gl.uniform1f(program.locThickness, subsurface.thickness);
37
+ }
38
+ else {
39
+ gl.uniform1f(program.locSubsurface, 0);
40
+ gl.uniform3f(program.locSubsurfaceColor, 1, 1, 1);
41
+ gl.uniform1f(program.locThickness, 0);
42
+ }
43
+ },
44
+ draw(state, proxy, geometry) {
45
+ const program = getGlScene3DRuntime(state).activeMeshProgram;
46
+ if (program === null)
47
+ return;
48
+ drawGlMeshSubset(state, program, proxy, geometry);
49
+ },
50
+ };
51
+ // Installs the built-in Subsurface renderer for SubsurfacePbrMaterialKind on this state. Opt-in (no
52
+ // top-level side effect): drawScene3D only draws Subsurface subsets once this is called.
53
+ export function registerSubsurfacePbrGlMaterial(state) {
54
+ registerGlMeshMaterialRenderer(state, SubsurfacePbrMaterialKind, subsurfacePbrGlMeshMaterialRenderer);
55
+ }
56
+ const scratchRgba = [0, 0, 0, 0];
57
+ //# sourceMappingURL=subsurfacePbrGlMeshMaterialRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subsurfacePbrGlMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/subsurfacePbrGlMeshMaterialRenderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { GlMeshMaterialRenderer, GlRenderState } from '@flighthq/types';
2
+ export declare const toonGlMeshMaterialRenderer: GlMeshMaterialRenderer;
3
+ export declare function registerToonGlMaterial(state: GlRenderState): void;
4
+ //# sourceMappingURL=toonGlMeshMaterialRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toonGlMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/toonGlMeshMaterialRenderer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,sBAAsB,EACtB,aAAa,EAQd,MAAM,iBAAiB,CAAC;AA0BzB,eAAO,MAAM,0BAA0B,EAAE,sBAuBxC,CAAC;AAIF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAEjE"}
@@ -0,0 +1,81 @@
1
+ import { unpackColorToLinear } from '@flighthq/color';
2
+ import { hasImageResourcePixels } from '@flighthq/image';
3
+ import { bindGlImageResourceTexture } from '@flighthq/render-gl';
4
+ import { ToonMaterialKind } from '@flighthq/types';
5
+ import { bindGlMeshLightBlock } from './glLitProgram';
6
+ import { registerGlMeshMaterialRenderer } from './glMeshMaterialRegistry';
7
+ import { beginGlMeshDraw, bindGlUvTransform, drawGlMeshSubset, hasGlUvTransform, setGlMeshCameraPosition, setGlMeshViewProjection, } from './glMeshProgram';
8
+ import { getGlScene3DRuntime } from './glScene3DRuntime';
9
+ import { ensureGlToonProgram } from './glToonPrelude';
10
+ // The built-in Toon (cel-shading) forward-lit mesh-material renderer (GlMeshMaterialRenderer for
11
+ // ToonMaterialKind). bind selects the uber-shader variant for the material's base-color map / ramp /
12
+ // alpha mode, uploads the shared per-run uniforms (camera view-projection + position, the packed
13
+ // light block), and the material's base color, step count, cutoff, and textures. The diffuse N·L is
14
+ // quantized into stepped cel bands in the fragment scene2d (ramp lookup when a ramp is bound, else a
15
+ // stepped floor over `steps`); output is LINEAR color for the rgba16f scene target. draw uploads the
16
+ // geometry's GPU buffers lazily (cached by geometry.version), sets the per-draw model + normal
17
+ // matrices from the proxy, and issues the indexed draw over the proxy's subset with depth-test LESS +
18
+ // depth-write on and back-face culling unless the material is double-sided. See registerToonGlMaterial
19
+ // to install it.
20
+ export const toonGlMeshMaterialRenderer = {
21
+ bind(state, material, lights, camera) {
22
+ const gl = state.gl;
23
+ const toon = material;
24
+ const program = ensureGlToonProgram(state, defineKeyForMaterial(toon));
25
+ beginGlMeshDraw(state, program, toon !== null && toon.doubleSided);
26
+ setGlMeshViewProjection(gl, program.locViewProjection, camera);
27
+ setGlMeshCameraPosition(gl, program.locCameraPosition, camera);
28
+ bindGlMeshLightBlock(state, program, lights);
29
+ bindGlToonMaterialUniforms(state, program, toon);
30
+ },
31
+ draw(state, proxy, geometry) {
32
+ const program = getGlScene3DRuntime(state).activeMeshProgram;
33
+ if (program === null)
34
+ return;
35
+ drawGlMeshSubset(state, program, proxy, geometry);
36
+ },
37
+ };
38
+ // Registers the built-in Toon renderer for ToonMaterialKind on this state. Opt-in (no top-level side
39
+ // effect); call once per GlRenderState before drawScene3D so meshes with ToonMaterials draw.
40
+ export function registerToonGlMaterial(state) {
41
+ registerGlMeshMaterialRenderer(state, ToonMaterialKind, toonGlMeshMaterialRenderer);
42
+ }
43
+ // The feature define key for a Toon material: which optional textures are present and whether alpha-
44
+ // mask cutoff is active. Drives both the program-cache variant and the bound textures. The ramp
45
+ // switches the fragment quantizer from a stepped floor to a 1D ramp lookup.
46
+ function defineKeyForMaterial(material) {
47
+ return {
48
+ alphaMaskEnabled: material !== null && material.alphaMode === 'mask',
49
+ hasBaseColorMap: material !== null && material.baseColorMap !== null && material.baseColorMap.image !== null,
50
+ hasRamp: material !== null && material.ramp !== null && material.ramp.image !== null,
51
+ hasUvTransform: hasGlUvTransform(material !== null ? material.baseColorMap : null),
52
+ };
53
+ }
54
+ function bindGlToonMaterialUniforms(state, program, material) {
55
+ const gl = state.gl;
56
+ if (material === null) {
57
+ gl.uniform4f(program.locBaseColor, 1, 1, 1, 1);
58
+ gl.uniform1f(program.locSteps, 3);
59
+ gl.uniform1f(program.locAlphaCutoff, 0.5);
60
+ return;
61
+ }
62
+ unpackColorToLinear(scratchRgba, material.baseColor);
63
+ gl.uniform4f(program.locBaseColor, scratchRgba[0], scratchRgba[1], scratchRgba[2], scratchRgba[3]);
64
+ gl.uniform1f(program.locSteps, material.steps);
65
+ gl.uniform1f(program.locAlphaCutoff, material.alphaCutoff);
66
+ const baseColorMap = material.baseColorMap;
67
+ if (baseColorMap !== null && baseColorMap.image !== null && hasImageResourcePixels(baseColorMap.image)) {
68
+ gl.activeTexture(gl.TEXTURE0);
69
+ bindGlImageResourceTexture(state, baseColorMap.image, baseColorMap.sampler);
70
+ gl.uniform1i(program.locBaseColorMap, 0);
71
+ }
72
+ const ramp = material.ramp;
73
+ if (ramp !== null && ramp.image !== null && hasImageResourcePixels(ramp.image)) {
74
+ gl.activeTexture(gl.TEXTURE1);
75
+ bindGlImageResourceTexture(state, ramp.image, ramp.sampler);
76
+ gl.uniform1i(program.locRamp, 1);
77
+ }
78
+ bindGlUvTransform(gl, program, baseColorMap);
79
+ }
80
+ const scratchRgba = [0, 0, 0, 0];
81
+ //# sourceMappingURL=toonGlMeshMaterialRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toonGlMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/toonGlMeshMaterialRenderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { GlMeshMaterialRenderer, GlRenderState } from '@flighthq/types';
2
+ export declare const transmissionVolumePbrGlMeshMaterialRenderer: GlMeshMaterialRenderer;
3
+ export declare function registerTransmissionVolumePbrGlMaterial(state: GlRenderState): void;
4
+ //# sourceMappingURL=transmissionVolumePbrGlMeshMaterialRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transmissionVolumePbrGlMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/transmissionVolumePbrGlMeshMaterialRenderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,sBAAsB,EACtB,aAAa,EAMd,MAAM,iBAAiB,CAAC;AAyBzB,eAAO,MAAM,2CAA2C,EAAE,sBAoCzD,CAAC;AAKF,wBAAgB,uCAAuC,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAElF"}
@@ -0,0 +1,62 @@
1
+ import { unpackColorToLinear } from '@flighthq/color';
2
+ import { TransmissionVolumePbrMaterialKind } from '@flighthq/types';
3
+ import { bindGlMeshLightBlock } from './glLitProgram';
4
+ import { registerGlMeshMaterialRenderer } from './glMeshMaterialRegistry';
5
+ import { beginGlMeshDraw, drawGlMeshSubset, setGlMeshCameraPosition, setGlMeshViewProjection } from './glMeshProgram';
6
+ import { ensureGlPbrProgram } from './glPbrProgramCache';
7
+ import { bindGlPbrStandardBlock, buildGlPbrStandardDefineKey } from './glPbrStandardBlock';
8
+ import { getGlScene3DRuntime } from './glScene3DRuntime';
9
+ // The built-in TransmissionVolume (KHR_materials_transmission + KHR_materials_volume) forward-lit
10
+ // mesh-material renderer for refractive, see-through surfaces (glass, liquid).
11
+ //
12
+ // APPROXIMATION (not physically refractive yet): a true transmission path needs the Phase-5
13
+ // opaque-scene-color capture pass to sample what lies behind the surface and refract it through the
14
+ // surface IOR, with Beer-Lambert absorption over the volume `thickness`. Until that pass exists, this
15
+ // renderer models transmission cheaply behind `#define TRANSMISSION`: it attenuates the fragment's
16
+ // coverage (alpha) by the `transmission` factor so the surface reads as translucent, and tints the lit
17
+ // radiance by `attenuationColor`. The surface is therefore drawn as a tinted, partially transparent
18
+ // lit shell rather than a refracting lens. `thickness`, `attenuationDistance`, and `ior` are accepted
19
+ // on the material but only `transmission`/`attenuationColor` drive the current shader.
20
+ //
21
+ // bind composes the material's `standard` block through the shared bindGlPbrStandardBlock and uploads
22
+ // the transmission factor + linear-decoded attenuationColor. The transmission/thickness maps are
23
+ // reserved but not yet sampled. See registerTransmissionVolumePbrGlMaterial.
24
+ export const transmissionVolumePbrGlMeshMaterialRenderer = {
25
+ bind(state, material, lights, camera) {
26
+ const gl = state.gl;
27
+ const transmission = material;
28
+ const standard = transmission !== null ? transmission.standard : null;
29
+ const key = buildGlPbrStandardDefineKey(standard, transmission);
30
+ key.transmissionEnabled = true;
31
+ const program = ensureGlPbrProgram(state, key);
32
+ beginGlMeshDraw(state, program, transmission !== null && transmission.doubleSided);
33
+ setGlMeshViewProjection(gl, program.locViewProjection, camera);
34
+ setGlMeshCameraPosition(gl, program.locCameraPosition, camera);
35
+ bindGlMeshLightBlock(state, program, lights);
36
+ bindGlPbrStandardBlock(state, program, standard);
37
+ gl.uniform1f(program.locAlphaCutoff, transmission !== null ? transmission.alphaCutoff : 0.5);
38
+ if (transmission !== null) {
39
+ unpackColorToLinear(scratchRgba, transmission.attenuationColor);
40
+ gl.uniform1f(program.locTransmission, transmission.transmission);
41
+ gl.uniform3f(program.locAttenuationColor, scratchRgba[0], scratchRgba[1], scratchRgba[2]);
42
+ }
43
+ else {
44
+ gl.uniform1f(program.locTransmission, 0);
45
+ gl.uniform3f(program.locAttenuationColor, 1, 1, 1);
46
+ }
47
+ },
48
+ draw(state, proxy, geometry) {
49
+ const program = getGlScene3DRuntime(state).activeMeshProgram;
50
+ if (program === null)
51
+ return;
52
+ drawGlMeshSubset(state, program, proxy, geometry);
53
+ },
54
+ };
55
+ // Installs the built-in TransmissionVolume renderer for TransmissionVolumePbrMaterialKind on this
56
+ // state. Opt-in (no top-level side effect): drawScene3D only draws TransmissionVolume subsets once
57
+ // this is called.
58
+ export function registerTransmissionVolumePbrGlMaterial(state) {
59
+ registerGlMeshMaterialRenderer(state, TransmissionVolumePbrMaterialKind, transmissionVolumePbrGlMeshMaterialRenderer);
60
+ }
61
+ const scratchRgba = [0, 0, 0, 0];
62
+ //# sourceMappingURL=transmissionVolumePbrGlMeshMaterialRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transmissionVolumePbrGlMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/transmissionVolumePbrGlMeshMaterialRenderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { GlMeshMaterialRenderer, GlRenderState } from '@flighthq/types';
2
+ export declare const unlitGlMeshMaterialRenderer: GlMeshMaterialRenderer;
3
+ export declare function registerUnlitGlMaterial(state: GlRenderState): void;
4
+ //# sourceMappingURL=unlitGlMeshMaterialRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unlitGlMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/unlitGlMeshMaterialRenderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,sBAAsB,EACtB,aAAa,EAOd,MAAM,iBAAiB,CAAC;AAkBzB,eAAO,MAAM,2BAA2B,EAAE,sBAiCzC,CAAC;AAIF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAElE"}
@@ -0,0 +1,61 @@
1
+ import { unpackColorToLinear } from '@flighthq/color';
2
+ import { isVideoTextureFrameReady } from '@flighthq/texture';
3
+ import { UnlitMaterialKind } from '@flighthq/types';
4
+ import { registerGlMeshMaterialRenderer } from './glMeshMaterialRegistry';
5
+ import { beginGlMeshDraw, bindGlUvTransform, drawGlMeshSubset, hasGlUvTransform, setGlMeshViewProjection, } from './glMeshProgram';
6
+ import { getGlScene3DRuntime } from './glScene3DRuntime';
7
+ import { bindGlUnlitSurface, bindGlUnlitVideoSurface, ensureGlUnlitProgram } from './glUnlitPrelude';
8
+ // The built-in Unlit forward renderer (GlMeshMaterialRenderer for UnlitMaterialKind). Lighting-
9
+ // independent flat color: bind selects the unlit variant for the material's base-color map / alpha
10
+ // mode, uploads the camera view-projection and the linear base color, and draw issues the indexed
11
+ // draw. Lights are ignored. See registerUnlitGlMaterial to install it.
12
+ export const unlitGlMeshMaterialRenderer = {
13
+ bind(state, material, _lights, camera) {
14
+ const gl = state.gl;
15
+ const unlit = material;
16
+ const program = ensureGlUnlitProgram(state, defineKeyForMaterial(unlit));
17
+ beginGlMeshDraw(state, program, unlit !== null && unlit.doubleSided);
18
+ setGlMeshViewProjection(gl, program.locViewProjection, camera);
19
+ if (unlit === null) {
20
+ bindGlUnlitSurface(state, program, WHITE, 1, null, 0.5);
21
+ return;
22
+ }
23
+ unpackColorToLinear(scratchRgba, unlit.baseColor);
24
+ const videoMap = unlit.baseColorVideoMap;
25
+ if (videoMap !== null && isVideoTextureFrameReady(videoMap)) {
26
+ bindGlUnlitVideoSurface(state, program, scratchRgba, 1, videoMap, unlit.alphaCutoff);
27
+ bindGlUvTransform(gl, program, videoMap);
28
+ }
29
+ else {
30
+ bindGlUnlitSurface(state, program, scratchRgba, 1, unlit.baseColorMap, unlit.alphaCutoff);
31
+ bindGlUvTransform(gl, program, unlit.baseColorMap);
32
+ }
33
+ },
34
+ draw(state, proxy, geometry) {
35
+ const program = getGlScene3DRuntime(state).activeMeshProgram;
36
+ if (program === null)
37
+ return;
38
+ drawGlMeshSubset(state, program, proxy, geometry);
39
+ },
40
+ };
41
+ // Registers the built-in Unlit renderer for UnlitMaterialKind on this state. Opt-in (no top-level
42
+ // side effect); call once per GlRenderState before drawScene3D so meshes with UnlitMaterials draw.
43
+ export function registerUnlitGlMaterial(state) {
44
+ registerGlMeshMaterialRenderer(state, UnlitMaterialKind, unlitGlMeshMaterialRenderer);
45
+ }
46
+ function defineKeyForMaterial(material) {
47
+ return {
48
+ alphaMaskEnabled: material !== null && material.alphaMode === 'mask',
49
+ hasColorMap: material !== null &&
50
+ ((material.baseColorVideoMap !== null && isVideoTextureFrameReady(material.baseColorVideoMap)) ||
51
+ (material.baseColorMap !== null && material.baseColorMap.image !== null)),
52
+ hasUvTransform: material !== null &&
53
+ hasGlUvTransform(material.baseColorVideoMap !== null && isVideoTextureFrameReady(material.baseColorVideoMap)
54
+ ? material.baseColorVideoMap
55
+ : material.baseColorMap),
56
+ vertexColor: false,
57
+ };
58
+ }
59
+ const scratchRgba = [0, 0, 0, 0];
60
+ const WHITE = [1, 1, 1, 1];
61
+ //# sourceMappingURL=unlitGlMeshMaterialRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unlitGlMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/unlitGlMeshMaterialRenderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { GlMeshMaterialRenderer, GlRenderState } from '@flighthq/types';
2
+ export declare const vertexColorGlMeshMaterialRenderer: GlMeshMaterialRenderer;
3
+ export declare function registerVertexColorGlMaterial(state: GlRenderState): void;
4
+ //# sourceMappingURL=vertexColorGlMeshMaterialRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertexColorGlMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/vertexColorGlMeshMaterialRenderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,sBAAsB,EACtB,aAAa,EAOd,MAAM,iBAAiB,CAAC;AAazB,eAAO,MAAM,iCAAiC,EAAE,sBA+B/C,CAAC;AAKF,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAExE"}
@@ -0,0 +1,54 @@
1
+ import { unpackColorToLinear } from '@flighthq/color';
2
+ import { VertexColorMaterialKind } from '@flighthq/types';
3
+ import { registerGlMeshMaterialRenderer } from './glMeshMaterialRegistry';
4
+ import { beginGlMeshDraw, drawGlMeshSubset, setGlMeshViewProjection } from './glMeshProgram';
5
+ import { getGlScene3DRuntime } from './glScene3DRuntime';
6
+ import { bindGlUnlitSurface, ensureGlUnlitProgram } from './glUnlitPrelude';
7
+ // The built-in VertexColor forward renderer (GlMeshMaterialRenderer for VertexColorMaterialKind).
8
+ // Lighting-independent: the unlit shader's VERTEX_COLOR variant multiplies the mesh's interpolated
9
+ // color0 attribute by the linear tint. Geometry without a color0 attribute leaves the attribute
10
+ // unbound (its default), so a tinted black surface results — author color0 (or import it via glTF)
11
+ // to drive this material. Lights are ignored. See registerVertexColorGlMaterial to install it.
12
+ export const vertexColorGlMeshMaterialRenderer = {
13
+ bind(state, material, _lights, camera) {
14
+ const gl = state.gl;
15
+ const vertexColor = material;
16
+ const program = ensureGlUnlitProgram(state, defineKeyForMaterial(vertexColor));
17
+ beginGlMeshDraw(state, program, vertexColor !== null && vertexColor.doubleSided);
18
+ setGlMeshViewProjection(gl, program.locViewProjection, camera);
19
+ // Default the color0 generic vertex attribute to opaque white so a mesh WITHOUT a color0 attribute
20
+ // renders the tint alone (matching the wgpu path) instead of multiplying by the (0,0,0,1) default,
21
+ // which would render black. A mesh that DOES carry color0 enables the array and overrides this.
22
+ gl.vertexAttrib4f(4, 1, 1, 1, 1);
23
+ if (vertexColor === null) {
24
+ bindGlUnlitSurface(state, program, WHITE, 1, null, 0.5);
25
+ return;
26
+ }
27
+ unpackColorToLinear(scratchRgba, vertexColor.tint);
28
+ bindGlUnlitSurface(state, program, scratchRgba, 1, null, vertexColor.alphaCutoff);
29
+ },
30
+ draw(state, proxy, geometry) {
31
+ const program = getGlScene3DRuntime(state).activeMeshProgram;
32
+ if (program === null)
33
+ return;
34
+ drawGlMeshSubset(state, program, proxy, geometry);
35
+ },
36
+ };
37
+ // Registers the built-in VertexColor renderer for VertexColorMaterialKind on this state. Opt-in (no
38
+ // top-level side effect); call once per GlRenderState before drawScene3D so meshes with
39
+ // VertexColorMaterials draw.
40
+ export function registerVertexColorGlMaterial(state) {
41
+ registerGlMeshMaterialRenderer(state, VertexColorMaterialKind, vertexColorGlMeshMaterialRenderer);
42
+ }
43
+ function defineKeyForMaterial(material) {
44
+ return {
45
+ alphaMaskEnabled: material !== null && material.alphaMode === 'mask',
46
+ hasColorMap: false,
47
+ // VertexColor samples no map, so the uv transform never applies.
48
+ hasUvTransform: false,
49
+ vertexColor: true,
50
+ };
51
+ }
52
+ const scratchRgba = [0, 0, 0, 0];
53
+ const WHITE = [1, 1, 1, 1];
54
+ //# sourceMappingURL=vertexColorGlMeshMaterialRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vertexColorGlMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/vertexColorGlMeshMaterialRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAatD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE5E,kGAAkG;AAClG,mGAAmG;AACnG,gGAAgG;AAChG,mGAAmG;AACnG,+FAA+F;AAC/F,MAAM,CAAC,MAAM,iCAAiC,GAA2B;IACvE,IAAI,CACF,KAAoB,EACpB,QAAmC,EACnC,OAAoC,EACpC,MAA0B;QAE1B,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,WAAW,GAAG,QAAgD,CAAC;QACrE,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,EAAE,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAC;QAC/E,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,KAAK,IAAI,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC;QACjF,uBAAuB,CAAC,EAAE,EAAE,OAAO,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAE/D,mGAAmG;QACnG,mGAAmG;QACnG,gGAAgG;QAChG,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEjC,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QACD,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QACnD,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IACpF,CAAC;IAED,IAAI,CAAC,KAAoB,EAAE,KAAmC,EAAE,QAAgC;QAC9F,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC;QAC7D,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO;QAC7B,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;CACF,CAAC;AAEF,oGAAoG;AACpG,wFAAwF;AACxF,6BAA6B;AAC7B,MAAM,UAAU,6BAA6B,CAAC,KAAoB;IAChE,8BAA8B,CAAC,KAAK,EAAE,uBAAuB,EAAE,iCAAiC,CAAC,CAAC;AACpG,CAAC;AAED,SAAS,oBAAoB,CAAC,QAA8C;IAC1E,OAAO;QACL,gBAAgB,EAAE,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,SAAS,KAAK,MAAM;QACpE,WAAW,EAAE,KAAK;QAClB,iEAAiE;QACjE,cAAc,EAAE,KAAK;QACrB,WAAW,EAAE,IAAI;KAClB,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9C,MAAM,KAAK,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { GlMeshMaterialRenderer, GlRenderState } from '@flighthq/types';
2
+ export declare const wireframeGlMeshMaterialRenderer: GlMeshMaterialRenderer;
3
+ export declare function registerWireframeGlMaterial(state: GlRenderState): void;
4
+ //# sourceMappingURL=wireframeGlMeshMaterialRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wireframeGlMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/wireframeGlMeshMaterialRenderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,sBAAsB,EACtB,aAAa,EAMd,MAAM,iBAAiB,CAAC;AAezB,eAAO,MAAM,+BAA+B,EAAE,sBAoC7C,CAAC;AAKF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAEtE"}
@@ -0,0 +1,50 @@
1
+ import { unpackColorToLinear } from '@flighthq/color';
2
+ import { WireframeMaterialKind } from '@flighthq/types';
3
+ import { registerGlMeshMaterialRenderer } from './glMeshMaterialRegistry';
4
+ import { beginGlMeshDraw, setGlMeshViewProjection } from './glMeshProgram';
5
+ import { getGlScene3DRuntime } from './glScene3DRuntime';
6
+ import { ensureGlWireframeProgram } from './glWireframePrelude';
7
+ import { ensureGlWireframeUpload } from './glWireframeUpload';
8
+ // The built-in Wireframe forward renderer (GlMeshMaterialRenderer for WireframeMaterialKind). Draws
9
+ // the mesh's triangle edges as GL lines in a single flat linear color. Unlike the triangle families
10
+ // it does not use drawGlMeshSubset: draw binds the wireframe line-index VAO (see glWireframeUpload)
11
+ // and issues a gl.LINES draw over the subset's derived line range. `thickness` > 1 is not honored —
12
+ // WebGL2 fixes line width at 1px on virtually all drivers; the field is documented as best-effort and
13
+ // ignored here. Lights are ignored. See registerWireframeGlMaterial to install it.
14
+ export const wireframeGlMeshMaterialRenderer = {
15
+ bind(state, material, _lights, camera) {
16
+ const gl = state.gl;
17
+ const wireframe = material;
18
+ const program = ensureGlWireframeProgram(state);
19
+ // doubleSided = true: lines have no winding, so back-face culling must be off.
20
+ beginGlMeshDraw(state, program, true);
21
+ setGlMeshViewProjection(gl, program.locViewProjection, camera);
22
+ if (wireframe === null) {
23
+ gl.uniform4f(program.locColor, 1, 1, 1, 1);
24
+ return;
25
+ }
26
+ unpackColorToLinear(scratchRgba, wireframe.color);
27
+ gl.uniform4f(program.locColor, scratchRgba[0], scratchRgba[1], scratchRgba[2], scratchRgba[3]);
28
+ },
29
+ draw(state, proxy, geometry) {
30
+ const gl = state.gl;
31
+ const program = getGlScene3DRuntime(state).activeMeshProgram;
32
+ if (program === null)
33
+ return;
34
+ gl.uniformMatrix4fv(program.locModel, false, proxy.worldMatrix.m);
35
+ const upload = ensureGlWireframeUpload(state, geometry);
36
+ const subset = proxy.subset;
37
+ // Each triangle index contributes two line indices, so the subset's line range is its triangle
38
+ // range scaled by 2.
39
+ const elementSize = upload.indexType === gl.UNSIGNED_INT ? 4 : 2;
40
+ gl.drawElements(gl.LINES, subset.indexCount * 2, upload.indexType, subset.indexOffset * 2 * elementSize);
41
+ },
42
+ };
43
+ // Registers the built-in Wireframe renderer for WireframeMaterialKind on this state. Opt-in (no
44
+ // top-level side effect); call once per GlRenderState before drawScene3D so meshes with
45
+ // WireframeMaterials draw.
46
+ export function registerWireframeGlMaterial(state) {
47
+ registerGlMeshMaterialRenderer(state, WireframeMaterialKind, wireframeGlMeshMaterialRenderer);
48
+ }
49
+ const scratchRgba = [0, 0, 0, 0];
50
+ //# sourceMappingURL=wireframeGlMeshMaterialRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wireframeGlMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/wireframeGlMeshMaterialRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAYtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,oGAAoG;AACpG,oGAAoG;AACpG,oGAAoG;AACpG,oGAAoG;AACpG,sGAAsG;AACtG,mFAAmF;AACnF,MAAM,CAAC,MAAM,+BAA+B,GAA2B;IACrE,IAAI,CACF,KAAoB,EACpB,QAAmC,EACnC,OAAoC,EACpC,MAA0B;QAE1B,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,SAAS,GAAG,QAA8C,CAAC;QACjE,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAChD,+EAA+E;QAC/E,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACtC,uBAAuB,CAAC,EAAE,EAAE,OAAO,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAE/D,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QACD,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;QAClD,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACjG,CAAC;IAED,IAAI,CAAC,KAAoB,EAAE,KAAmC,EAAE,QAAgC;QAC9F,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC;QAC7D,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO;QAE7B,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAElE,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,+FAA+F;QAC/F,qBAAqB;QACrB,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,KAAK,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC;IAC3G,CAAC;CACF,CAAC;AAEF,gGAAgG;AAChG,wFAAwF;AACxF,2BAA2B;AAC3B,MAAM,UAAU,2BAA2B,CAAC,KAAoB;IAC9D,8BAA8B,CAAC,KAAK,EAAE,qBAAqB,EAAE,+BAA+B,CAAC,CAAC;AAChG,CAAC;AAED,MAAM,WAAW,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@flighthq/scene3d-gl",
3
+ "version": "0.2.1-next.840.857425c",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "https://github.com/flighthq/flight.git",
7
+ "directory": "packages/scene3d-gl"
8
+ },
9
+ "type": "module",
10
+ "main": "dist/index.js",
11
+ "types": "dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "default": "./dist/index.js"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "src/**/*.test.ts",
21
+ "!dist/**/*.test.js",
22
+ "!dist/**/*.test.d.ts",
23
+ "!dist/**/*.test.js.map",
24
+ "!dist/**/*.test.d.ts.map"
25
+ ],
26
+ "scripts": {
27
+ "build": "tsc -b",
28
+ "clean": "tsc -b --clean",
29
+ "test": "vitest run --config vitest.config.ts",
30
+ "test:watch": "vitest --watch --config vitest.config.ts",
31
+ "prepack": "npm run clean && npm run clean:dist && npm run build",
32
+ "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
33
+ },
34
+ "dependencies": {
35
+ "@flighthq/camera": "0.2.1-next.840.857425c",
36
+ "@flighthq/color": "0.2.1-next.840.857425c",
37
+ "@flighthq/geometry": "0.2.1-next.840.857425c",
38
+ "@flighthq/image": "0.2.1-next.840.857425c",
39
+ "@flighthq/lighting": "0.2.1-next.840.857425c",
40
+ "@flighthq/log": "0.2.1-next.840.857425c",
41
+ "@flighthq/materials": "0.2.1-next.840.857425c",
42
+ "@flighthq/mesh": "0.2.1-next.840.857425c",
43
+ "@flighthq/node": "0.2.1-next.840.857425c",
44
+ "@flighthq/render": "0.2.1-next.840.857425c",
45
+ "@flighthq/render-gl": "0.2.1-next.840.857425c",
46
+ "@flighthq/scene3d": "0.2.1-next.840.857425c",
47
+ "@flighthq/shading": "0.2.1-next.840.857425c",
48
+ "@flighthq/texture": "0.2.1-next.840.857425c",
49
+ "@flighthq/types": "0.2.1-next.840.857425c"
50
+ },
51
+ "devDependencies": {
52
+ "@flighthq/particleemitter": "*",
53
+ "@flighthq/skeleton3d": "*",
54
+ "typescript": "^5.3.0"
55
+ },
56
+ "description": "WebGL2 3D scene renderer",
57
+ "sideEffects": false
58
+ }
@@ -0,0 +1,86 @@
1
+ import { createCamera3D } from '@flighthq/camera';
2
+ import { createMatrix3, createMatrix4 } from '@flighthq/geometry';
3
+ import { createAnisotropyPbrMaterial } from '@flighthq/materials';
4
+ import { createBoxMeshGeometry } from '@flighthq/mesh';
5
+ import type { Camera3D, Matrix3, Matrix4, Scene3DLightBlock, Scene3DRenderProxy } from '@flighthq/types';
6
+ import { AnisotropyPbrMaterialKind } from '@flighthq/types';
7
+
8
+ import {
9
+ anisotropyPbrGlMeshMaterialRenderer,
10
+ registerAnisotropyPbrGlMaterial,
11
+ } from './anisotropyPbrGlMeshMaterialRenderer';
12
+ import { getGlMeshMaterialRenderer } from './glMeshMaterialRegistry';
13
+ import { getGlScene3DRuntime } from './glScene3DRuntime';
14
+ import { makeGlScene3DState } from './glScene3DTestHelper';
15
+
16
+ function makeCamera(): Camera3D {
17
+ return createCamera3D({ far: 100, near: 0.1, projection: { aspect: 1, fovY: Math.PI / 3, kind: 'perspective' } });
18
+ }
19
+
20
+ function makeLights(): Scene3DLightBlock {
21
+ const data = new Float32Array(12);
22
+ data[1] = -1;
23
+ data[4] = 1;
24
+ data[5] = 1;
25
+ data[6] = 1;
26
+ data[8] = 0.1;
27
+ data[9] = 0.1;
28
+ data[10] = 0.1;
29
+ return { ambientCount: 1, data, directionalCount: 1, hemisphereCount: 0, pointCount: 0, spotCount: 0, version: 1 };
30
+ }
31
+
32
+ function makeProxy(): Scene3DRenderProxy {
33
+ const geometry = createBoxMeshGeometry();
34
+ return {
35
+ material: createAnisotropyPbrMaterial(),
36
+ normalMatrix: createMatrix3() as Matrix3,
37
+ subset: geometry.subsets[0],
38
+ worldMatrix: createMatrix4() as Matrix4,
39
+ };
40
+ }
41
+
42
+ describe('anisotropyPbrGlMeshMaterialRenderer', () => {
43
+ it('bind uploads the light block, standard block, and anisotropy uniforms', () => {
44
+ const { state, gl } = makeGlScene3DState();
45
+ anisotropyPbrGlMeshMaterialRenderer.bind(
46
+ state,
47
+ createAnisotropyPbrMaterial({ anisotropyRotation: 0.5, anisotropyStrength: 0.7 }),
48
+ makeLights(),
49
+ makeCamera(),
50
+ );
51
+ expect(gl.calls.some((c) => c.name === 'useProgram')).toBe(true);
52
+ expect(gl.calls.some((c) => c.name === 'uniform4f')).toBe(true);
53
+ expect(gl.calls.some((c) => c.name === 'uniformMatrix4fv')).toBe(true);
54
+ expect(gl.calls.filter((c) => c.name === 'uniform1f').length).toBeGreaterThanOrEqual(2);
55
+ });
56
+
57
+ it('caches the anisotropy program under the pbr: namespace', () => {
58
+ const { state } = makeGlScene3DState();
59
+ anisotropyPbrGlMeshMaterialRenderer.bind(state, createAnisotropyPbrMaterial(), makeLights(), makeCamera());
60
+ const cache = getGlScene3DRuntime(state).programCache;
61
+ expect(cache.size).toBe(1);
62
+ expect([...cache.keys()][0].startsWith('pbr:')).toBe(true);
63
+ });
64
+
65
+ it('draw issues an indexed draw after bind', () => {
66
+ const { state, gl } = makeGlScene3DState();
67
+ const proxy = makeProxy();
68
+ anisotropyPbrGlMeshMaterialRenderer.bind(state, proxy.material, makeLights(), makeCamera());
69
+ anisotropyPbrGlMeshMaterialRenderer.draw(state, proxy, createBoxMeshGeometry());
70
+ expect(gl.calls.some((c) => c.name === 'drawElements')).toBe(true);
71
+ });
72
+
73
+ it('draw is a no-op before bind', () => {
74
+ const { state, gl } = makeGlScene3DState();
75
+ anisotropyPbrGlMeshMaterialRenderer.draw(state, makeProxy(), createBoxMeshGeometry());
76
+ expect(gl.calls.some((c) => c.name === 'drawElements')).toBe(false);
77
+ });
78
+ });
79
+
80
+ describe('registerAnisotropyPbrGlMaterial', () => {
81
+ it('installs the renderer for AnisotropyPbrMaterialKind', () => {
82
+ const { state } = makeGlScene3DState();
83
+ registerAnisotropyPbrGlMaterial(state);
84
+ expect(getGlMeshMaterialRenderer(state, AnisotropyPbrMaterialKind)).toBe(anisotropyPbrGlMeshMaterialRenderer);
85
+ });
86
+ });