@flighthq/scene3d-wgpu 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 (263) hide show
  1. package/dist/anisotropyPbrWgpuMeshMaterialRenderer.d.ts +4 -0
  2. package/dist/anisotropyPbrWgpuMeshMaterialRenderer.d.ts.map +1 -0
  3. package/dist/anisotropyPbrWgpuMeshMaterialRenderer.js +52 -0
  4. package/dist/anisotropyPbrWgpuMeshMaterialRenderer.js.map +1 -0
  5. package/dist/blinnPhongWgpuMeshMaterialRenderer.d.ts +4 -0
  6. package/dist/blinnPhongWgpuMeshMaterialRenderer.d.ts.map +1 -0
  7. package/dist/blinnPhongWgpuMeshMaterialRenderer.js +66 -0
  8. package/dist/blinnPhongWgpuMeshMaterialRenderer.js.map +1 -0
  9. package/dist/clearcoatPbrWgpuMeshMaterialRenderer.d.ts +4 -0
  10. package/dist/clearcoatPbrWgpuMeshMaterialRenderer.d.ts.map +1 -0
  11. package/dist/clearcoatPbrWgpuMeshMaterialRenderer.js +52 -0
  12. package/dist/clearcoatPbrWgpuMeshMaterialRenderer.js.map +1 -0
  13. package/dist/customShaderWgpuMeshMaterialRenderer.d.ts +7 -0
  14. package/dist/customShaderWgpuMeshMaterialRenderer.d.ts.map +1 -0
  15. package/dist/customShaderWgpuMeshMaterialRenderer.js +225 -0
  16. package/dist/customShaderWgpuMeshMaterialRenderer.js.map +1 -0
  17. package/dist/depthWgpuMeshMaterialRenderer.d.ts +4 -0
  18. package/dist/depthWgpuMeshMaterialRenderer.d.ts.map +1 -0
  19. package/dist/depthWgpuMeshMaterialRenderer.js +42 -0
  20. package/dist/depthWgpuMeshMaterialRenderer.js.map +1 -0
  21. package/dist/drawWgpuScene3D.d.ts +4 -0
  22. package/dist/drawWgpuScene3D.d.ts.map +1 -0
  23. package/dist/drawWgpuScene3D.js +171 -0
  24. package/dist/drawWgpuScene3D.js.map +1 -0
  25. package/dist/emissiveWgpuMeshMaterialRenderer.d.ts +4 -0
  26. package/dist/emissiveWgpuMeshMaterialRenderer.d.ts.map +1 -0
  27. package/dist/emissiveWgpuMeshMaterialRenderer.js +51 -0
  28. package/dist/emissiveWgpuMeshMaterialRenderer.js.map +1 -0
  29. package/dist/enableWgpuScene3DCustomShaderGuards.d.ts +5 -0
  30. package/dist/enableWgpuScene3DCustomShaderGuards.d.ts.map +1 -0
  31. package/dist/enableWgpuScene3DCustomShaderGuards.js +56 -0
  32. package/dist/enableWgpuScene3DCustomShaderGuards.js.map +1 -0
  33. package/dist/enableWgpuScene3DForwardLightSelectionGuards.d.ts +4 -0
  34. package/dist/enableWgpuScene3DForwardLightSelectionGuards.d.ts.map +1 -0
  35. package/dist/enableWgpuScene3DForwardLightSelectionGuards.js +17 -0
  36. package/dist/enableWgpuScene3DForwardLightSelectionGuards.js.map +1 -0
  37. package/dist/explainWgpuScene3DForwardLightSelection.d.ts +3 -0
  38. package/dist/explainWgpuScene3DForwardLightSelection.d.ts.map +1 -0
  39. package/dist/explainWgpuScene3DForwardLightSelection.js +18 -0
  40. package/dist/explainWgpuScene3DForwardLightSelection.js.map +1 -0
  41. package/dist/index.d.ts +51 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +51 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/iridescencePbrWgpuMeshMaterialRenderer.d.ts +4 -0
  46. package/dist/iridescencePbrWgpuMeshMaterialRenderer.d.ts.map +1 -0
  47. package/dist/iridescencePbrWgpuMeshMaterialRenderer.js +60 -0
  48. package/dist/iridescencePbrWgpuMeshMaterialRenderer.js.map +1 -0
  49. package/dist/lambertWgpuMeshMaterialRenderer.d.ts +4 -0
  50. package/dist/lambertWgpuMeshMaterialRenderer.d.ts.map +1 -0
  51. package/dist/lambertWgpuMeshMaterialRenderer.js +61 -0
  52. package/dist/lambertWgpuMeshMaterialRenderer.js.map +1 -0
  53. package/dist/matcapWgpuMeshMaterialRenderer.d.ts +4 -0
  54. package/dist/matcapWgpuMeshMaterialRenderer.d.ts.map +1 -0
  55. package/dist/matcapWgpuMeshMaterialRenderer.js +54 -0
  56. package/dist/matcapWgpuMeshMaterialRenderer.js.map +1 -0
  57. package/dist/normalWgpuMeshMaterialRenderer.d.ts +4 -0
  58. package/dist/normalWgpuMeshMaterialRenderer.d.ts.map +1 -0
  59. package/dist/normalWgpuMeshMaterialRenderer.js +47 -0
  60. package/dist/normalWgpuMeshMaterialRenderer.js.map +1 -0
  61. package/dist/phongWgpuMeshMaterialRenderer.d.ts +4 -0
  62. package/dist/phongWgpuMeshMaterialRenderer.d.ts.map +1 -0
  63. package/dist/phongWgpuMeshMaterialRenderer.js +63 -0
  64. package/dist/phongWgpuMeshMaterialRenderer.js.map +1 -0
  65. package/dist/prepareWgpuScene3DForwardLights.d.ts +3 -0
  66. package/dist/prepareWgpuScene3DForwardLights.d.ts.map +1 -0
  67. package/dist/prepareWgpuScene3DForwardLights.js +110 -0
  68. package/dist/prepareWgpuScene3DForwardLights.js.map +1 -0
  69. package/dist/registerStandardPbrWgpuMaterial.d.ts +3 -0
  70. package/dist/registerStandardPbrWgpuMaterial.d.ts.map +1 -0
  71. package/dist/registerStandardPbrWgpuMaterial.js +11 -0
  72. package/dist/registerStandardPbrWgpuMaterial.js.map +1 -0
  73. package/dist/shadedWgpuMeshMaterialRenderer.d.ts +11 -0
  74. package/dist/shadedWgpuMeshMaterialRenderer.d.ts.map +1 -0
  75. package/dist/shadedWgpuMeshMaterialRenderer.js +47 -0
  76. package/dist/shadedWgpuMeshMaterialRenderer.js.map +1 -0
  77. package/dist/sheenPbrWgpuMeshMaterialRenderer.d.ts +4 -0
  78. package/dist/sheenPbrWgpuMeshMaterialRenderer.d.ts.map +1 -0
  79. package/dist/sheenPbrWgpuMeshMaterialRenderer.js +58 -0
  80. package/dist/sheenPbrWgpuMeshMaterialRenderer.js.map +1 -0
  81. package/dist/specularGlossinessPbrWgpuMeshMaterialRenderer.d.ts +4 -0
  82. package/dist/specularGlossinessPbrWgpuMeshMaterialRenderer.d.ts.map +1 -0
  83. package/dist/specularGlossinessPbrWgpuMeshMaterialRenderer.js +126 -0
  84. package/dist/specularGlossinessPbrWgpuMeshMaterialRenderer.js.map +1 -0
  85. package/dist/specularPbrWgpuMeshMaterialRenderer.d.ts +4 -0
  86. package/dist/specularPbrWgpuMeshMaterialRenderer.d.ts.map +1 -0
  87. package/dist/specularPbrWgpuMeshMaterialRenderer.js +65 -0
  88. package/dist/specularPbrWgpuMeshMaterialRenderer.js.map +1 -0
  89. package/dist/standardPbrWgpuMeshMaterialRenderer.d.ts +9 -0
  90. package/dist/standardPbrWgpuMeshMaterialRenderer.d.ts.map +1 -0
  91. package/dist/standardPbrWgpuMeshMaterialRenderer.js +174 -0
  92. package/dist/standardPbrWgpuMeshMaterialRenderer.js.map +1 -0
  93. package/dist/subsurfacePbrWgpuMeshMaterialRenderer.d.ts +4 -0
  94. package/dist/subsurfacePbrWgpuMeshMaterialRenderer.d.ts.map +1 -0
  95. package/dist/subsurfacePbrWgpuMeshMaterialRenderer.js +68 -0
  96. package/dist/subsurfacePbrWgpuMeshMaterialRenderer.js.map +1 -0
  97. package/dist/toonWgpuMeshMaterialRenderer.d.ts +4 -0
  98. package/dist/toonWgpuMeshMaterialRenderer.d.ts.map +1 -0
  99. package/dist/toonWgpuMeshMaterialRenderer.js +71 -0
  100. package/dist/toonWgpuMeshMaterialRenderer.js.map +1 -0
  101. package/dist/transmissionVolumePbrWgpuMeshMaterialRenderer.d.ts +4 -0
  102. package/dist/transmissionVolumePbrWgpuMeshMaterialRenderer.d.ts.map +1 -0
  103. package/dist/transmissionVolumePbrWgpuMeshMaterialRenderer.js +74 -0
  104. package/dist/transmissionVolumePbrWgpuMeshMaterialRenderer.js.map +1 -0
  105. package/dist/unlitWgpuMeshMaterialRenderer.d.ts +4 -0
  106. package/dist/unlitWgpuMeshMaterialRenderer.d.ts.map +1 -0
  107. package/dist/unlitWgpuMeshMaterialRenderer.js +57 -0
  108. package/dist/unlitWgpuMeshMaterialRenderer.js.map +1 -0
  109. package/dist/vertexColorWgpuMeshMaterialRenderer.d.ts +4 -0
  110. package/dist/vertexColorWgpuMeshMaterialRenderer.d.ts.map +1 -0
  111. package/dist/vertexColorWgpuMeshMaterialRenderer.js +55 -0
  112. package/dist/vertexColorWgpuMeshMaterialRenderer.js.map +1 -0
  113. package/dist/wgpuClassicPrelude.d.ts +8 -0
  114. package/dist/wgpuClassicPrelude.d.ts.map +1 -0
  115. package/dist/wgpuClassicPrelude.js +319 -0
  116. package/dist/wgpuClassicPrelude.js.map +1 -0
  117. package/dist/wgpuCustomMaterialAbi.d.ts +3 -0
  118. package/dist/wgpuCustomMaterialAbi.d.ts.map +1 -0
  119. package/dist/wgpuCustomMaterialAbi.js +5 -0
  120. package/dist/wgpuCustomMaterialAbi.js.map +1 -0
  121. package/dist/wgpuDebugPrelude.d.ts +7 -0
  122. package/dist/wgpuDebugPrelude.d.ts.map +1 -0
  123. package/dist/wgpuDebugPrelude.js +133 -0
  124. package/dist/wgpuDebugPrelude.js.map +1 -0
  125. package/dist/wgpuEnvironmentCube.d.ts +4 -0
  126. package/dist/wgpuEnvironmentCube.d.ts.map +1 -0
  127. package/dist/wgpuEnvironmentCube.js +66 -0
  128. package/dist/wgpuEnvironmentCube.js.map +1 -0
  129. package/dist/wgpuEnvironmentIblBake.d.ts +4 -0
  130. package/dist/wgpuEnvironmentIblBake.d.ts.map +1 -0
  131. package/dist/wgpuEnvironmentIblBake.js +458 -0
  132. package/dist/wgpuEnvironmentIblBake.js.map +1 -0
  133. package/dist/wgpuEnvironmentSkybox.d.ts +3 -0
  134. package/dist/wgpuEnvironmentSkybox.d.ts.map +1 -0
  135. package/dist/wgpuEnvironmentSkybox.js +159 -0
  136. package/dist/wgpuEnvironmentSkybox.js.map +1 -0
  137. package/dist/wgpuMatcapPrelude.d.ts +7 -0
  138. package/dist/wgpuMatcapPrelude.d.ts.map +1 -0
  139. package/dist/wgpuMatcapPrelude.js +134 -0
  140. package/dist/wgpuMatcapPrelude.js.map +1 -0
  141. package/dist/wgpuMeshMaterialRegistry.d.ts +5 -0
  142. package/dist/wgpuMeshMaterialRegistry.d.ts.map +1 -0
  143. package/dist/wgpuMeshMaterialRegistry.js +29 -0
  144. package/dist/wgpuMeshMaterialRegistry.js.map +1 -0
  145. package/dist/wgpuMeshPipeline.d.ts +43 -0
  146. package/dist/wgpuMeshPipeline.d.ts.map +1 -0
  147. package/dist/wgpuMeshPipeline.js +1007 -0
  148. package/dist/wgpuMeshPipeline.js.map +1 -0
  149. package/dist/wgpuMeshUpload.d.ts +3 -0
  150. package/dist/wgpuMeshUpload.d.ts.map +1 -0
  151. package/dist/wgpuMeshUpload.js +58 -0
  152. package/dist/wgpuMeshUpload.js.map +1 -0
  153. package/dist/wgpuParticleEmitter3D.d.ts +4 -0
  154. package/dist/wgpuParticleEmitter3D.d.ts.map +1 -0
  155. package/dist/wgpuParticleEmitter3D.js +403 -0
  156. package/dist/wgpuParticleEmitter3D.js.map +1 -0
  157. package/dist/wgpuPbrPipelineCache.d.ts +4 -0
  158. package/dist/wgpuPbrPipelineCache.d.ts.map +1 -0
  159. package/dist/wgpuPbrPipelineCache.js +52 -0
  160. package/dist/wgpuPbrPipelineCache.js.map +1 -0
  161. package/dist/wgpuPbrPrelude.d.ts +7 -0
  162. package/dist/wgpuPbrPrelude.d.ts.map +1 -0
  163. package/dist/wgpuPbrPrelude.js +551 -0
  164. package/dist/wgpuPbrPrelude.js.map +1 -0
  165. package/dist/wgpuScene3DRuntime.d.ts +5 -0
  166. package/dist/wgpuScene3DRuntime.d.ts.map +1 -0
  167. package/dist/wgpuScene3DRuntime.js +81 -0
  168. package/dist/wgpuScene3DRuntime.js.map +1 -0
  169. package/dist/wgpuScene3DTestHelper.d.ts +14 -0
  170. package/dist/wgpuScene3DTestHelper.d.ts.map +1 -0
  171. package/dist/wgpuScene3DTestHelper.js +121 -0
  172. package/dist/wgpuScene3DTestHelper.js.map +1 -0
  173. package/dist/wgpuScene3DTime.d.ts +4 -0
  174. package/dist/wgpuScene3DTime.d.ts.map +1 -0
  175. package/dist/wgpuScene3DTime.js +11 -0
  176. package/dist/wgpuScene3DTime.js.map +1 -0
  177. package/dist/wgpuShadedModifierSnippet.d.ts +4 -0
  178. package/dist/wgpuShadedModifierSnippet.d.ts.map +1 -0
  179. package/dist/wgpuShadedModifierSnippet.js +18 -0
  180. package/dist/wgpuShadedModifierSnippet.js.map +1 -0
  181. package/dist/wgpuShadedPrelude.d.ts +16 -0
  182. package/dist/wgpuShadedPrelude.d.ts.map +1 -0
  183. package/dist/wgpuShadedPrelude.js +625 -0
  184. package/dist/wgpuShadedPrelude.js.map +1 -0
  185. package/dist/wgpuShadowMap.d.ts +4 -0
  186. package/dist/wgpuShadowMap.d.ts.map +1 -0
  187. package/dist/wgpuShadowMap.js +155 -0
  188. package/dist/wgpuShadowMap.js.map +1 -0
  189. package/dist/wgpuSkinPalette.d.ts +7 -0
  190. package/dist/wgpuSkinPalette.d.ts.map +1 -0
  191. package/dist/wgpuSkinPalette.js +173 -0
  192. package/dist/wgpuSkinPalette.js.map +1 -0
  193. package/dist/wgpuToonPrelude.d.ts +8 -0
  194. package/dist/wgpuToonPrelude.d.ts.map +1 -0
  195. package/dist/wgpuToonPrelude.js +192 -0
  196. package/dist/wgpuToonPrelude.js.map +1 -0
  197. package/dist/wgpuUnlitPrelude.d.ts +9 -0
  198. package/dist/wgpuUnlitPrelude.d.ts.map +1 -0
  199. package/dist/wgpuUnlitPrelude.js +142 -0
  200. package/dist/wgpuUnlitPrelude.js.map +1 -0
  201. package/dist/wgpuWireframePrelude.d.ts +6 -0
  202. package/dist/wgpuWireframePrelude.d.ts.map +1 -0
  203. package/dist/wgpuWireframePrelude.js +77 -0
  204. package/dist/wgpuWireframePrelude.js.map +1 -0
  205. package/dist/wgpuWireframeUpload.d.ts +3 -0
  206. package/dist/wgpuWireframeUpload.d.ts.map +1 -0
  207. package/dist/wgpuWireframeUpload.js +68 -0
  208. package/dist/wgpuWireframeUpload.js.map +1 -0
  209. package/dist/wireframeWgpuMeshMaterialRenderer.d.ts +4 -0
  210. package/dist/wireframeWgpuMeshMaterialRenderer.d.ts.map +1 -0
  211. package/dist/wireframeWgpuMeshMaterialRenderer.js +69 -0
  212. package/dist/wireframeWgpuMeshMaterialRenderer.js.map +1 -0
  213. package/package.json +57 -0
  214. package/src/anisotropyPbrWgpuMeshMaterialRenderer.test.ts +90 -0
  215. package/src/blinnPhongWgpuMeshMaterialRenderer.test.ts +82 -0
  216. package/src/clearcoatPbrWgpuMeshMaterialRenderer.test.ts +90 -0
  217. package/src/customShaderWgpuMeshMaterialRenderer.test.ts +207 -0
  218. package/src/depthWgpuMeshMaterialRenderer.test.ts +69 -0
  219. package/src/drawWgpuScene3D.test.ts +247 -0
  220. package/src/emissiveWgpuMeshMaterialRenderer.test.ts +64 -0
  221. package/src/enableWgpuScene3DCustomShaderGuards.test.ts +73 -0
  222. package/src/enableWgpuScene3DForwardLightSelectionGuards.test.ts +39 -0
  223. package/src/explainWgpuScene3DForwardLightSelection.test.ts +15 -0
  224. package/src/iridescencePbrWgpuMeshMaterialRenderer.test.ts +90 -0
  225. package/src/lambertWgpuMeshMaterialRenderer.test.ts +77 -0
  226. package/src/matcapWgpuMeshMaterialRenderer.test.ts +69 -0
  227. package/src/normalWgpuMeshMaterialRenderer.test.ts +69 -0
  228. package/src/phongWgpuMeshMaterialRenderer.test.ts +79 -0
  229. package/src/prepareWgpuScene3DForwardLights.test.ts +84 -0
  230. package/src/registerStandardPbrWgpuMaterial.test.ts +15 -0
  231. package/src/shadedWgpuMeshMaterialRenderer.test.ts +63 -0
  232. package/src/sheenPbrWgpuMeshMaterialRenderer.test.ts +87 -0
  233. package/src/specularGlossinessPbrWgpuMeshMaterialRenderer.test.ts +100 -0
  234. package/src/specularPbrWgpuMeshMaterialRenderer.test.ts +90 -0
  235. package/src/standardPbrWgpuMeshMaterialRenderer.test.ts +172 -0
  236. package/src/subsurfacePbrWgpuMeshMaterialRenderer.test.ts +90 -0
  237. package/src/toonWgpuMeshMaterialRenderer.test.ts +89 -0
  238. package/src/transmissionVolumePbrWgpuMeshMaterialRenderer.test.ts +97 -0
  239. package/src/unlitWgpuMeshMaterialRenderer.test.ts +94 -0
  240. package/src/vertexColorWgpuMeshMaterialRenderer.test.ts +62 -0
  241. package/src/wgpuClassicPrelude.test.ts +176 -0
  242. package/src/wgpuDebugPrelude.test.ts +79 -0
  243. package/src/wgpuEnvironmentCube.test.ts +86 -0
  244. package/src/wgpuEnvironmentIblBake.test.ts +79 -0
  245. package/src/wgpuEnvironmentSkybox.test.ts +56 -0
  246. package/src/wgpuMatcapPrelude.test.ts +70 -0
  247. package/src/wgpuMeshMaterialRegistry.test.ts +55 -0
  248. package/src/wgpuMeshPipeline.test.ts +844 -0
  249. package/src/wgpuMeshUpload.test.ts +177 -0
  250. package/src/wgpuParticleEmitter3D.test.ts +200 -0
  251. package/src/wgpuPbrPipelineCache.test.ts +67 -0
  252. package/src/wgpuPbrPrelude.test.ts +162 -0
  253. package/src/wgpuScene3DRuntime.test.ts +35 -0
  254. package/src/wgpuScene3DTime.test.ts +20 -0
  255. package/src/wgpuShadedModifierSnippet.test.ts +33 -0
  256. package/src/wgpuShadedPrelude.test.ts +394 -0
  257. package/src/wgpuShadowMap.test.ts +169 -0
  258. package/src/wgpuSkinPalette.test.ts +88 -0
  259. package/src/wgpuToonPrelude.test.ts +93 -0
  260. package/src/wgpuUnlitPrelude.test.ts +102 -0
  261. package/src/wgpuWireframePrelude.test.ts +54 -0
  262. package/src/wgpuWireframeUpload.test.ts +36 -0
  263. package/src/wireframeWgpuMeshMaterialRenderer.test.ts +69 -0
@@ -0,0 +1,126 @@
1
+ import { unpackColorToLinear } from '@flighthq/color';
2
+ import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
3
+ import { SpecularGlossinessPbrMaterialKind } from '@flighthq/types';
4
+ import { buildWgpuPbrStandardDefineKey, ensureWgpuPbrMaterialBindGroup, getWgpuPbrMaterialScratch, writeWgpuPbrMaterialUniform, writeWgpuPbrStandardBlock, } from './standardPbrWgpuMeshMaterialRenderer';
5
+ import { registerWgpuMeshMaterialRenderer } from './wgpuMeshMaterialRegistry';
6
+ import { beginWgpuMeshDraw, drawWgpuMeshSubset, writeWgpuFrameUniform } from './wgpuMeshPipeline';
7
+ import { ensureWgpuPbrPipeline } from './wgpuPbrPipelineCache';
8
+ // The built-in SpecularGlossiness forward-lit mesh-material renderer (legacy KHR_materials_
9
+ // pbrSpecularGlossiness workflow) — the WGSL mirror of specularGlossinessPbrGlMeshMaterialRenderer.
10
+ // There is no spec-gloss path in the shader: this renderer converts the material to a
11
+ // StandardPbrMaterialProperties block on the CPU at bind time and drives the SAME base PBR program (no
12
+ // extension flag), so spec-gloss assets render through the one metallic-roughness uber-shader.
13
+ //
14
+ // CONVERSION (Khronos glTF spec-gloss → metallic-roughness):
15
+ // - roughness = 1 - glossiness (glossiness is the inverse of roughness)
16
+ // - metallic = solveMetallic(diffuseBrightness, specularBrightness): the quadratic that recovers
17
+ // the metallic factor from how far the specular reflectance sits above the 0.04
18
+ // dielectric floor. Fully dielectric specular → 0; albedo-bright specular → 1.
19
+ // - baseColor = lerp from the dielectric estimate (diffuse / (1 - 0.04)) toward the specular color
20
+ // by metallic, so a dielectric keeps its diffuse albedo and a conductor takes its
21
+ // specular tint as F0.
22
+ // The conversion is an approximation — spec-gloss can express specular tints a single metallic-
23
+ // roughness baseColor cannot reproduce exactly — but it matches the reference converter and is stable
24
+ // for typical assets. The specularGlossinessMap is NOT remapped to a metallic-roughness map here
25
+ // (different packing) and maps are not sampled on wgpu yet regardless; only the scalar conversion is
26
+ // applied, while diffuse/emissive/normal/occlusion maps pass straight through to the standard block
27
+ // (reserved, NOT sampled on wgpu yet — maps deferred).
28
+ //
29
+ // Colors are decoded to linear on the CPU before the conversion math; the converted standard block
30
+ // re-packs baseColor/emissive to RGBA8 so writeWgpuPbrStandardBlock's CPU decode round-trips. See
31
+ // registerSpecularGlossinessPbrWgpuMaterial.
32
+ export const specularGlossinessPbrWgpuMeshMaterialRenderer = {
33
+ bind(state, material, lights, camera) {
34
+ const stateRuntime = getWgpuRenderStateRuntime(state);
35
+ const pass = stateRuntime.renderPass;
36
+ if (pass === null)
37
+ return;
38
+ const specGloss = material;
39
+ const standard = specGloss !== null ? convertSpecularGlossinessToStandard(specGloss) : null;
40
+ const key = buildWgpuPbrStandardDefineKey(standard, specGloss);
41
+ const format = stateRuntime.currentColorFormat ?? state.format;
42
+ const pipeline = ensureWgpuPbrPipeline(state, key, format);
43
+ writeWgpuFrameUniform(state, camera, lights);
44
+ const binding = ensureWgpuPbrMaterialBindGroup(state, pipeline, specGloss ?? FALLBACK_MATERIAL, standard);
45
+ const out = getWgpuPbrMaterialScratch();
46
+ writeWgpuPbrStandardBlock(out, standard, specGloss !== null ? specGloss.alphaCutoff : 0.5);
47
+ out.fill(0, 16);
48
+ writeWgpuPbrMaterialUniform(state, binding);
49
+ beginWgpuMeshDraw(state, pipeline);
50
+ pass.setBindGroup(2, binding.bindGroup);
51
+ },
52
+ draw(state, proxy, geometry) {
53
+ drawWgpuMeshSubset(state, proxy, geometry);
54
+ },
55
+ };
56
+ // Installs the built-in SpecularGlossiness renderer for SpecularGlossinessPbrMaterialKind on this
57
+ // state. Opt-in (no top-level side effect): drawScene3D only draws SpecularGlossiness subsets once this
58
+ // is called.
59
+ export function registerSpecularGlossinessPbrWgpuMaterial(state) {
60
+ registerWgpuMeshMaterialRenderer(state, SpecularGlossinessPbrMaterialKind, specularGlossinessPbrWgpuMeshMaterialRenderer);
61
+ }
62
+ // Builds a StandardPbrMaterialProperties block from a spec-gloss material via the Khronos reference
63
+ // conversion. Writes a packed RGBA baseColor/emissive (writeWgpuPbrStandardBlock re-decodes them), so
64
+ // the downstream standard-block path stays identical to a native StandardPbr material. The returned
65
+ // object is a fresh per-bind block (not pooled) — bind is not a hot inner loop, and reusing a scratch
66
+ // block would alias across draws. Mirrors scene-gl's convertSpecularGlossinessToStandard.
67
+ function convertSpecularGlossinessToStandard(material) {
68
+ unpackColorToLinear(_diffuseScratch, material.diffuse);
69
+ unpackColorToLinear(_specularScratch, material.specular);
70
+ const specularBrightness = Math.max(_specularScratch[0], _specularScratch[1], _specularScratch[2]);
71
+ const oneMinusSpecularStrength = 1 - specularBrightness;
72
+ const diffuseBrightness = Math.max(_diffuseScratch[0], _diffuseScratch[1], _diffuseScratch[2]);
73
+ const metallic = solveMetallic(diffuseBrightness, specularBrightness, oneMinusSpecularStrength);
74
+ // baseColor: blend the dielectric diffuse estimate and the specular tint by metallic, per the
75
+ // reference converter, then re-pack to RGBA8 for the standard block to decode.
76
+ const denom = Math.max(1 - DIELECTRIC_SPECULAR, 1e-4);
77
+ const r = lerp((_diffuseScratch[0] * oneMinusSpecularStrength) / denom, _specularScratch[0], metallic);
78
+ const g = lerp((_diffuseScratch[1] * oneMinusSpecularStrength) / denom, _specularScratch[1], metallic);
79
+ const b = lerp((_diffuseScratch[2] * oneMinusSpecularStrength) / denom, _specularScratch[2], metallic);
80
+ return {
81
+ alphaMap: null,
82
+ baseColor: packLinearRgba(r, g, b, _diffuseScratch[3]),
83
+ baseColorMap: material.diffuseMap,
84
+ emissive: material.emissive,
85
+ emissiveMap: material.emissiveMap,
86
+ emissiveStrength: material.emissiveStrength,
87
+ metallic,
88
+ metallicRoughnessMap: null,
89
+ normalMap: material.normalMap,
90
+ normalScale: material.normalScale,
91
+ occlusionMap: material.occlusionMap,
92
+ occlusionStrength: material.occlusionStrength,
93
+ roughness: 1 - material.glossiness,
94
+ };
95
+ }
96
+ function lerp(a, b, t) {
97
+ return a + (b - a) * t;
98
+ }
99
+ // Re-encodes a linear RGBA color (components in [0,1]) back to a packed 0xRRGGBBAA integer with the
100
+ // sRgb transfer, the inverse of unpackColorToLinear, so the standard block's CPU decode round-trips.
101
+ function packLinearRgba(r, g, b, a) {
102
+ const toByte = (linear) => {
103
+ const clamped = Math.min(Math.max(linear, 0), 1);
104
+ const srgb = clamped <= 0.0031308 ? clamped * 12.92 : 1.055 * Math.pow(clamped, 1 / 2.4) - 0.055;
105
+ return Math.round(srgb * 255) & 0xff;
106
+ };
107
+ const alpha = Math.round(Math.min(Math.max(a, 0), 1) * 255) & 0xff;
108
+ return ((toByte(r) << 24) | (toByte(g) << 16) | (toByte(b) << 8) | alpha) >>> 0;
109
+ }
110
+ // The Khronos spec-gloss → metallic solver: recovers the metallic factor from the diffuse and specular
111
+ // reflectances by solving the quadratic that the metallic-roughness F0 model implies. Below the 0.04
112
+ // dielectric floor the surface is fully dielectric (metallic 0).
113
+ function solveMetallic(diffuse, specular, oneMinusSpecularStrength) {
114
+ if (specular < DIELECTRIC_SPECULAR)
115
+ return 0;
116
+ const a = DIELECTRIC_SPECULAR;
117
+ const b = (diffuse * oneMinusSpecularStrength) / (1 - DIELECTRIC_SPECULAR) + specular - 2 * DIELECTRIC_SPECULAR;
118
+ const c = DIELECTRIC_SPECULAR - specular;
119
+ const discriminant = Math.max(b * b - 4 * a * c, 0);
120
+ return Math.min(Math.max((-b + Math.sqrt(discriminant)) / (2 * a), 0), 1);
121
+ }
122
+ const DIELECTRIC_SPECULAR = 0.04;
123
+ const FALLBACK_MATERIAL = {};
124
+ const _diffuseScratch = [0, 0, 0, 0];
125
+ const _specularScratch = [0, 0, 0, 0];
126
+ //# sourceMappingURL=specularGlossinessPbrWgpuMeshMaterialRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specularGlossinessPbrWgpuMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/specularGlossinessPbrWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { WgpuMeshMaterialRenderer, WgpuRenderState } from '@flighthq/types';
2
+ export declare const specularPbrWgpuMeshMaterialRenderer: WgpuMeshMaterialRenderer;
3
+ export declare function registerSpecularPbrWgpuMaterial(state: WgpuRenderState): void;
4
+ //# sourceMappingURL=specularPbrWgpuMeshMaterialRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specularPbrWgpuMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/specularPbrWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAQV,wBAAwB,EACxB,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAyBzB,eAAO,MAAM,mCAAmC,EAAE,wBA6CjD,CAAC;AAIF,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAE5E"}
@@ -0,0 +1,65 @@
1
+ import { unpackColorToLinear } from '@flighthq/color';
2
+ import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
3
+ import { SpecularPbrMaterialKind } from '@flighthq/types';
4
+ import { buildWgpuPbrStandardDefineKey, ensureWgpuPbrMaterialBindGroup, getWgpuPbrMaterialScratch, writeWgpuPbrMaterialUniform, writeWgpuPbrStandardBlock, } from './standardPbrWgpuMeshMaterialRenderer';
5
+ import { registerWgpuMeshMaterialRenderer } from './wgpuMeshMaterialRegistry';
6
+ import { beginWgpuMeshDraw, drawWgpuMeshSubset, writeWgpuFrameUniform } from './wgpuMeshPipeline';
7
+ import { ensureWgpuPbrPipeline } from './wgpuPbrPipelineCache';
8
+ // The built-in Specular (KHR_materials_specular) forward-lit mesh-material renderer — the WGSL mirror
9
+ // of specularPbrGlMeshMaterialRenderer. This extension gives independent control of a dielectric's
10
+ // specular reflection: `specular` scales the base reflectance and `specularColor` tints F0, letting a
11
+ // surface be more or less reflective than the fixed 0.04 dielectric default without changing its diffuse
12
+ // albedo (metals keep their albedo-tinted F0). The shader recomputes F0 = mix(min(0.04 * specularColor,
13
+ // 1) * specular, albedo, metallic) behind `const SPECULAR_EXT`. bind builds the standard define key from
14
+ // `material.standard` + the surface trailer, sets the SPECULAR_EXT flag, selects/compiles that pipeline
15
+ // variant for the current color format, writes the shared Frame uniform, then writes the base block +
16
+ // the specular scale / linear-decoded specularColor into the one MaterialBlock uniform and binds it at
17
+ // group(2). The specular strength/color maps are reserved but NOT sampled on wgpu yet (maps deferred).
18
+ // See registerSpecularPbrWgpuMaterial.
19
+ export const specularPbrWgpuMeshMaterialRenderer = {
20
+ bind(state, material, lights, camera) {
21
+ const stateRuntime = getWgpuRenderStateRuntime(state);
22
+ const pass = stateRuntime.renderPass;
23
+ if (pass === null)
24
+ return;
25
+ const specular = material;
26
+ const standard = specular !== null ? specular.standard : null;
27
+ const key = buildWgpuPbrStandardDefineKey(standard, specular);
28
+ key.specularEnabled = true;
29
+ const format = stateRuntime.currentColorFormat ?? state.format;
30
+ const pipeline = ensureWgpuPbrPipeline(state, key, format);
31
+ writeWgpuFrameUniform(state, camera, lights);
32
+ const binding = ensureWgpuPbrMaterialBindGroup(state, pipeline, specular ?? FALLBACK_MATERIAL, standard);
33
+ const out = getWgpuPbrMaterialScratch();
34
+ writeWgpuPbrStandardBlock(out, standard, specular !== null ? specular.alphaCutoff : 0.5);
35
+ out.fill(0, 16);
36
+ // specular group (floats 32..35): specular scale, specularColor.rgb (linear).
37
+ if (specular !== null) {
38
+ unpackColorToLinear(_colorScratch, specular.specularColor);
39
+ out[32] = specular.specular;
40
+ out[33] = _colorScratch[0];
41
+ out[34] = _colorScratch[1];
42
+ out[35] = _colorScratch[2];
43
+ }
44
+ else {
45
+ out[32] = 1;
46
+ out[33] = 1;
47
+ out[34] = 1;
48
+ out[35] = 1;
49
+ }
50
+ writeWgpuPbrMaterialUniform(state, binding);
51
+ beginWgpuMeshDraw(state, pipeline);
52
+ pass.setBindGroup(2, binding.bindGroup);
53
+ },
54
+ draw(state, proxy, geometry) {
55
+ drawWgpuMeshSubset(state, proxy, geometry);
56
+ },
57
+ };
58
+ // Installs the built-in Specular renderer for SpecularPbrMaterialKind on this state. Opt-in (no
59
+ // top-level side effect): drawScene3D only draws Specular subsets once this is called.
60
+ export function registerSpecularPbrWgpuMaterial(state) {
61
+ registerWgpuMeshMaterialRenderer(state, SpecularPbrMaterialKind, specularPbrWgpuMeshMaterialRenderer);
62
+ }
63
+ const FALLBACK_MATERIAL = {};
64
+ const _colorScratch = [0, 0, 0, 0];
65
+ //# sourceMappingURL=specularPbrWgpuMeshMaterialRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specularPbrWgpuMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/specularPbrWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { StandardPbrMaterialProperties, SurfaceMaterial, WgpuMeshMaterialRenderer, WgpuRenderState, WgpuPbrPipeline, WgpuPbrDefineKey, WgpuMaterialBinding } from '@flighthq/types';
2
+ export declare const WGPU_PBR_MATERIAL_UNIFORM_FLOATS = 48;
3
+ export declare function buildWgpuPbrStandardDefineKey(standard: Readonly<StandardPbrMaterialProperties> | null, surface: Readonly<SurfaceMaterial> | null): WgpuPbrDefineKey;
4
+ export declare function ensureWgpuPbrMaterialBindGroup(state: WgpuRenderState, pipeline: Readonly<WgpuPbrPipeline>, key: object, standard: Readonly<StandardPbrMaterialProperties> | null): WgpuMaterialBinding;
5
+ export declare function getWgpuPbrMaterialScratch(): Float32Array;
6
+ export declare function writeWgpuPbrMaterialUniform(state: WgpuRenderState, binding: Readonly<WgpuMaterialBinding>): void;
7
+ export declare function writeWgpuPbrStandardBlock(out: Float32Array, standard: Readonly<StandardPbrMaterialProperties> | null, alphaCutoff: number): void;
8
+ export declare const standardPbrWgpuMeshMaterialRenderer: WgpuMeshMaterialRenderer;
9
+ //# sourceMappingURL=standardPbrWgpuMeshMaterialRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standardPbrWgpuMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/standardPbrWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAQV,6BAA6B,EAC7B,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,iBAAiB,CAAC;AAiBzB,eAAO,MAAM,gCAAgC,KAAK,CAAC;AAQnD,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,QAAQ,CAAC,6BAA6B,CAAC,GAAG,IAAI,EACxD,OAAO,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,IAAI,GACxC,gBAAgB,CAoBlB;AAWD,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC,EACnC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,CAAC,6BAA6B,CAAC,GAAG,IAAI,GACvD,mBAAmB,CA8BrB;AAMD,wBAAgB,yBAAyB,IAAI,YAAY,CAExD;AAID,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAEhH;AAQD,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,YAAY,EACjB,QAAQ,EAAE,QAAQ,CAAC,6BAA6B,CAAC,GAAG,IAAI,EACxD,WAAW,EAAE,MAAM,GAClB,IAAI,CA2CN;AAkBD,eAAO,MAAM,mCAAmC,EAAE,wBA4BjD,CAAC"}
@@ -0,0 +1,174 @@
1
+ import { unpackColorToLinear } from '@flighthq/color';
2
+ import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
3
+ import { beginWgpuMeshDraw, drawWgpuMeshSubset, ensureWgpuPerMapMaterialBinding, getWgpuMaterialSampler, isWgpuTextureReady, resolveWgpuMaterialTextureView, stashWgpuUvTransform, writeWgpuFrameUniform, } from './wgpuMeshPipeline';
4
+ import { ensureWgpuPbrPipeline } from './wgpuPbrPipelineCache';
5
+ // The Material uniform float count (MaterialBlock = 48 floats / 192 bytes). Exported so the extension
6
+ // renderers, which write extension factors into the shared scratch through the helpers here, agree on
7
+ // the buffer size when they allocate + write their material bind groups.
8
+ export const WGPU_PBR_MATERIAL_UNIFORM_FLOATS = 48;
9
+ // The shared define key for a PBR material: the alpha-mask cutoff + double-sidedness from the surface
10
+ // trailer, the five standard `has*Map` flags derived from the material's bound maps, and every extension
11
+ // flag false. StandardPbr passes its own properties (it is a StandardPbrMaterialProperties) as `standard`;
12
+ // each extension renderer passes its `material.standard` + surface trailer and then sets exactly one
13
+ // extension flag. Keeps the one place that decides the standard flags so the compiled variant and the
14
+ // bound resources never disagree. Mirrors scene-gl's buildGlPbrStandardDefineKey.
15
+ export function buildWgpuPbrStandardDefineKey(standard, surface) {
16
+ return {
17
+ alphaMaskEnabled: surface !== null && surface.alphaMode === 'mask',
18
+ anisotropyEnabled: false,
19
+ clearcoatEnabled: false,
20
+ doubleSided: surface !== null && surface.doubleSided,
21
+ // Opaque materials ignore coverage (SurfaceMaterial contract) — only 'mask'/'blend' sample the map.
22
+ hasAlphaMap: surface !== null && surface.alphaMode !== 'opaque' && standard !== null && isWgpuTextureReady(standard.alphaMap),
23
+ hasBaseColorMap: standard !== null && isWgpuTextureReady(standard.baseColorMap),
24
+ hasEmissiveMap: standard !== null && isWgpuTextureReady(standard.emissiveMap),
25
+ hasMetallicRoughnessMap: standard !== null && isWgpuTextureReady(standard.metallicRoughnessMap),
26
+ hasNormalMap: standard !== null && isWgpuTextureReady(standard.normalMap),
27
+ hasOcclusionMap: standard !== null && isWgpuTextureReady(standard.occlusionMap),
28
+ iridescenceEnabled: false,
29
+ sheenEnabled: false,
30
+ specularEnabled: false,
31
+ subsurfaceEnabled: false,
32
+ transmissionEnabled: false,
33
+ };
34
+ }
35
+ // Allocates (once per material reference) the Material uniform buffer + bind group for a PBR material
36
+ // and binds the material's five standard maps (base color, metallic-roughness, normal, occlusion,
37
+ // emissive) into the map slots — each resolved to its real uploaded view, or the shared 1x1 placeholder
38
+ // when the slot is unbound, so the layout is satisfied either way. The same path serves StandardPbr and
39
+ // every extension — the extension factors ride in the one MaterialBlock uniform, so no extra bindings
40
+ // are needed. The caller writes `material` (a fresh per-call key for the WeakMap, or the FALLBACK key
41
+ // for a null material) into the scratch and uploads it before this returns. The bind group is cached by
42
+ // `key`; the resolved views are captured at creation, so a static textured material binds its maps once.
43
+ // Returns the bind group to set at group(2).
44
+ export function ensureWgpuPbrMaterialBindGroup(state, pipeline, key, standard) {
45
+ const baseColorMap = standard !== null ? standard.baseColorMap : null;
46
+ // Re-resolve the primary (base-color) sampler + the six standard-block map views every bind (base-color,
47
+ // metallic-roughness, normal, occlusion, emissive, alpha) into a REUSED module scratch — no per-bind
48
+ // allocation — so ensureWgpuPerMapMaterialBinding can rebuild the bind group only when one differs.
49
+ // Each view is paired with its own cached sampler, matching GL's per-Texture sampler contract.
50
+ _samplerScratch[0] = getWgpuMaterialSampler(state, baseColorMap);
51
+ _samplerScratch[1] = getWgpuMaterialSampler(state, standard !== null ? standard.metallicRoughnessMap : null);
52
+ _samplerScratch[2] = getWgpuMaterialSampler(state, standard !== null ? standard.normalMap : null);
53
+ _samplerScratch[3] = getWgpuMaterialSampler(state, standard !== null ? standard.occlusionMap : null);
54
+ _samplerScratch[4] = getWgpuMaterialSampler(state, standard !== null ? standard.emissiveMap : null);
55
+ _samplerScratch[5] = getWgpuMaterialSampler(state, standard !== null ? standard.alphaMap : null);
56
+ _viewScratch[0] = resolveWgpuMaterialTextureView(state, baseColorMap);
57
+ _viewScratch[1] = resolveWgpuMaterialTextureView(state, standard !== null ? standard.metallicRoughnessMap : null);
58
+ _viewScratch[2] = resolveWgpuMaterialTextureView(state, standard !== null ? standard.normalMap : null);
59
+ _viewScratch[3] = resolveWgpuMaterialTextureView(state, standard !== null ? standard.occlusionMap : null);
60
+ _viewScratch[4] = resolveWgpuMaterialTextureView(state, standard !== null ? standard.emissiveMap : null);
61
+ _viewScratch[5] = resolveWgpuMaterialTextureView(state, standard !== null ? standard.alphaMap : null);
62
+ const binding = ensureWgpuPerMapMaterialBinding(state, key, pipeline.materialBindGroupLayout, WGPU_PBR_MATERIAL_UNIFORM_FLOATS * 4, _samplerScratch, _viewScratch);
63
+ // The base-color map's uv transform drives the shared vertex-scene2d uv every standard map samples.
64
+ // Runs every bind (standard + each extension routes through here), so the stash is always fresh.
65
+ stashWgpuUvTransform(state, standard !== null ? standard.baseColorMap : null);
66
+ return binding;
67
+ }
68
+ // Returns the shared MaterialBlock scratch the standard + extension packers write into. The extension
69
+ // renderers fill the base block via writeWgpuPbrStandardBlock and their own factors via index into the
70
+ // returned array, then upload it. Reused across binds (bind is not a hot inner loop, and one draw is
71
+ // recorded before the next bind overwrites it).
72
+ export function getWgpuPbrMaterialScratch() {
73
+ return _materialScratch;
74
+ }
75
+ // Writes the MaterialBlock scratch (192 bytes) into a material binding's uniform buffer. Call after
76
+ // writeWgpuPbrStandardBlock + any extension packer has filled the scratch.
77
+ export function writeWgpuPbrMaterialUniform(state, binding) {
78
+ state.device.queue.writeBuffer(binding.buffer, 0, _materialScratch.buffer, 0, WGPU_PBR_MATERIAL_UNIFORM_FLOATS * 4);
79
+ }
80
+ // Packs the StandardPbr base block (the first 16 floats of the MaterialBlock) into the shared material
81
+ // scratch: baseColor.rgba (linear), emissive.rgb*strength, factors (metallic, roughness, normalScale,
82
+ // occlusionStrength), flags (alphaCutoff, _, _, _). baseColor/emissive are sRgb-packed and converted to
83
+ // linear here so the shader stays in linear space. The extension factor slots (floats 16..47) are left
84
+ // to the caller (the extension packers) or zeroed by writeWgpuPbrMaterialBlock for StandardPbr. A null
85
+ // block uses neutral defaults (white, dielectric, fully rough). Mirrors scene-gl's bindGlPbrStandardBlock.
86
+ export function writeWgpuPbrStandardBlock(out, standard, alphaCutoff) {
87
+ if (standard === null) {
88
+ out[0] = 1;
89
+ out[1] = 1;
90
+ out[2] = 1;
91
+ out[3] = 1;
92
+ out[4] = 0;
93
+ out[5] = 0;
94
+ out[6] = 0;
95
+ out[7] = 0;
96
+ out[8] = 0;
97
+ out[9] = 1;
98
+ out[10] = 1;
99
+ out[11] = 1;
100
+ out[12] = alphaCutoff;
101
+ out[13] = 0;
102
+ out[14] = 0;
103
+ out[15] = 0;
104
+ return;
105
+ }
106
+ unpackColorToLinear(_colorScratch, standard.baseColor);
107
+ out[0] = _colorScratch[0];
108
+ out[1] = _colorScratch[1];
109
+ out[2] = _colorScratch[2];
110
+ out[3] = _colorScratch[3];
111
+ unpackColorToLinear(_colorScratch, standard.emissive);
112
+ const strength = standard.emissiveStrength;
113
+ out[4] = _colorScratch[0] * strength;
114
+ out[5] = _colorScratch[1] * strength;
115
+ out[6] = _colorScratch[2] * strength;
116
+ out[7] = 0;
117
+ out[8] = standard.metallic;
118
+ out[9] = standard.roughness;
119
+ out[10] = standard.normalScale;
120
+ out[11] = standard.occlusionStrength;
121
+ out[12] = alphaCutoff;
122
+ out[13] = 0;
123
+ out[14] = 0;
124
+ out[15] = 0;
125
+ }
126
+ // The built-in StandardPbr forward-lit mesh-material renderer (WgpuMeshMaterialRenderer for
127
+ // StandardPbrMaterialKind) — the WGSL mirror of standardPbrGlMeshMaterialRenderer. bind selects the
128
+ // pipeline variant for the material's alpha mode / double-sidedness + the current color-attachment
129
+ // format (no extension flag), writes the shared Frame uniform (camera view-projection + position, the
130
+ // packed light block), binds the pipeline + Frame bind group (beginWgpuMeshDraw), then writes + binds
131
+ // the material's uniform/texture bind group at group(2). draw uploads the geometry's GPU buffers lazily
132
+ // (cached by geometry.version), writes the per-draw model + normal matrices into the render-state's
133
+ // uniform ring buffer (group(1), dynamic offset), and issues the indexed draw over the proxy's subset.
134
+ // Depth-test LESS + depth-write on and back-face culling (unless double-sided) are baked on the
135
+ // pipeline. The five standard maps (base color, metallic-roughness, normal, occlusion, emissive) are
136
+ // sampled when bound — the textured pipeline variant compiles per the `has*Map` flags and the real
137
+ // uploaded views bind into the map slots; an unbound slot falls back to the placeholder. See
138
+ // registerStandardPbrWgpuMaterial to install it.
139
+ //
140
+ // Cannot be visually captured in JSDOM (no GPU adapter); the unit test asserts the pipeline/bind/draw
141
+ // call shape against the mock device, mirrored against the verified GL result.
142
+ export const standardPbrWgpuMeshMaterialRenderer = {
143
+ bind(state, material, lights, camera) {
144
+ const stateRuntime = getWgpuRenderStateRuntime(state);
145
+ const pass = stateRuntime.renderPass;
146
+ if (pass === null)
147
+ return;
148
+ const pbr = material;
149
+ const format = stateRuntime.currentColorFormat ?? state.format;
150
+ const pipeline = ensureWgpuPbrPipeline(state, buildWgpuPbrStandardDefineKey(pbr, pbr), format);
151
+ writeWgpuFrameUniform(state, camera, lights);
152
+ const binding = ensureWgpuPbrMaterialBindGroup(state, pipeline, pbr ?? FALLBACK_MATERIAL, pbr);
153
+ writeWgpuPbrStandardBlock(_materialScratch, pbr, pbr !== null ? pbr.alphaCutoff : 0.5);
154
+ _materialScratch.fill(0, 16);
155
+ writeWgpuPbrMaterialUniform(state, binding);
156
+ beginWgpuMeshDraw(state, pipeline);
157
+ pass.setBindGroup(2, binding.bindGroup);
158
+ },
159
+ draw(state, proxy, geometry) {
160
+ drawWgpuMeshSubset(state, proxy, geometry);
161
+ },
162
+ };
163
+ // A StandardPbrMaterial-shaped stand-in used as the material-bind-group cache key when bind is called
164
+ // with a null material (the DefaultMaterialKind fallback). Plain neutral PBR defaults; only used for
165
+ // identity in the WeakMap.
166
+ const FALLBACK_MATERIAL = {};
167
+ const _colorScratch = [0, 0, 0, 0];
168
+ const _materialScratch = new Float32Array(WGPU_PBR_MATERIAL_UNIFORM_FLOATS);
169
+ const _samplerScratch = new Array(6);
170
+ // Reused per-bind resolved-view scratch (base-color, metallic-roughness, normal, occlusion, emissive,
171
+ // alpha) so a steady-state re-bind allocates nothing; ensureWgpuPerMapMaterialBinding copies it only on
172
+ // create/rebuild.
173
+ const _viewScratch = new Array(6);
174
+ //# sourceMappingURL=standardPbrWgpuMeshMaterialRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standardPbrWgpuMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/standardPbrWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { WgpuMeshMaterialRenderer, WgpuRenderState } from '@flighthq/types';
2
+ export declare const subsurfacePbrWgpuMeshMaterialRenderer: WgpuMeshMaterialRenderer;
3
+ export declare function registerSubsurfacePbrWgpuMaterial(state: WgpuRenderState): void;
4
+ //# sourceMappingURL=subsurfacePbrWgpuMeshMaterialRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subsurfacePbrWgpuMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/subsurfacePbrWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAQV,wBAAwB,EACxB,eAAe,EAChB,MAAM,iBAAiB,CAAC;AA0BzB,eAAO,MAAM,qCAAqC,EAAE,wBA+CnD,CAAC;AAIF,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAE9E"}
@@ -0,0 +1,68 @@
1
+ import { unpackColorToLinear } from '@flighthq/color';
2
+ import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
3
+ import { SubsurfacePbrMaterialKind } from '@flighthq/types';
4
+ import { buildWgpuPbrStandardDefineKey, ensureWgpuPbrMaterialBindGroup, getWgpuPbrMaterialScratch, writeWgpuPbrMaterialUniform, writeWgpuPbrStandardBlock, } from './standardPbrWgpuMeshMaterialRenderer';
5
+ import { registerWgpuMeshMaterialRenderer } from './wgpuMeshMaterialRegistry';
6
+ import { beginWgpuMeshDraw, drawWgpuMeshSubset, writeWgpuFrameUniform } from './wgpuMeshPipeline';
7
+ import { ensureWgpuPbrPipeline } from './wgpuPbrPipelineCache';
8
+ // The built-in Subsurface forward-lit mesh-material renderer (Flight extension; flagged non-interop —
9
+ // there is no glTF equivalent) — the WGSL mirror of subsurfacePbrGlMeshMaterialRenderer. It
10
+ // approximates subsurface scattering with a wrapped-diffuse term: light wrapping past the terminator
11
+ // re-emerges tinted by `subsurfaceColor`, scaled by `subsurface` strength and inversely by `thickness`
12
+ // (thinner material = more translucency). This is a cheap stand-in for true diffusion-profile SSS —
13
+ // plausible for skin, wax, marble, foliage at forward-pass cost — and lives behind `const SUBSURFACE` in
14
+ // the PBR uber-shader. bind builds the standard define key from `material.standard` + the surface
15
+ // trailer, sets the SUBSURFACE flag, selects/compiles that pipeline variant for the current color
16
+ // format, writes the shared Frame uniform, then writes the base block + the subsurface scalars /
17
+ // linear-decoded subsurfaceColor into the one MaterialBlock uniform and binds it at group(2). The
18
+ // subsurface/thickness maps are reserved but NOT sampled on wgpu yet (maps deferred). See
19
+ // registerSubsurfacePbrWgpuMaterial.
20
+ export const subsurfacePbrWgpuMeshMaterialRenderer = {
21
+ bind(state, material, lights, camera) {
22
+ const stateRuntime = getWgpuRenderStateRuntime(state);
23
+ const pass = stateRuntime.renderPass;
24
+ if (pass === null)
25
+ return;
26
+ const subsurface = material;
27
+ const standard = subsurface !== null ? subsurface.standard : null;
28
+ const key = buildWgpuPbrStandardDefineKey(standard, subsurface);
29
+ key.subsurfaceEnabled = true;
30
+ const format = stateRuntime.currentColorFormat ?? state.format;
31
+ const pipeline = ensureWgpuPbrPipeline(state, key, format);
32
+ writeWgpuFrameUniform(state, camera, lights);
33
+ const binding = ensureWgpuPbrMaterialBindGroup(state, pipeline, subsurface ?? FALLBACK_MATERIAL, standard);
34
+ const out = getWgpuPbrMaterialScratch();
35
+ writeWgpuPbrStandardBlock(out, standard, subsurface !== null ? subsurface.alphaCutoff : 0.5);
36
+ out.fill(0, 16);
37
+ // subsurface group (floats 36..39): strength, subsurfaceColor.rgb (linear); extra (float 40): thickness.
38
+ if (subsurface !== null) {
39
+ unpackColorToLinear(_colorScratch, subsurface.subsurfaceColor);
40
+ out[36] = subsurface.subsurface;
41
+ out[37] = _colorScratch[0];
42
+ out[38] = _colorScratch[1];
43
+ out[39] = _colorScratch[2];
44
+ out[40] = subsurface.thickness;
45
+ }
46
+ else {
47
+ out[36] = 0;
48
+ out[37] = 1;
49
+ out[38] = 1;
50
+ out[39] = 1;
51
+ out[40] = 0;
52
+ }
53
+ writeWgpuPbrMaterialUniform(state, binding);
54
+ beginWgpuMeshDraw(state, pipeline);
55
+ pass.setBindGroup(2, binding.bindGroup);
56
+ },
57
+ draw(state, proxy, geometry) {
58
+ drawWgpuMeshSubset(state, proxy, geometry);
59
+ },
60
+ };
61
+ // Installs the built-in Subsurface renderer for SubsurfacePbrMaterialKind on this state. Opt-in (no
62
+ // top-level side effect): drawScene3D only draws Subsurface subsets once this is called.
63
+ export function registerSubsurfacePbrWgpuMaterial(state) {
64
+ registerWgpuMeshMaterialRenderer(state, SubsurfacePbrMaterialKind, subsurfacePbrWgpuMeshMaterialRenderer);
65
+ }
66
+ const FALLBACK_MATERIAL = {};
67
+ const _colorScratch = [0, 0, 0, 0];
68
+ //# sourceMappingURL=subsurfacePbrWgpuMeshMaterialRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subsurfacePbrWgpuMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/subsurfacePbrWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { WgpuMeshMaterialRenderer, WgpuRenderState } from '@flighthq/types';
2
+ export declare const toonWgpuMeshMaterialRenderer: WgpuMeshMaterialRenderer;
3
+ export declare function registerToonWgpuMaterial(state: WgpuRenderState): void;
4
+ //# sourceMappingURL=toonWgpuMeshMaterialRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toonWgpuMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/toonWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAQV,wBAAwB,EACxB,eAAe,EAEhB,MAAM,iBAAiB,CAAC;AA2BzB,eAAO,MAAM,4BAA4B,EAAE,wBA+B1C,CAAC;AAIF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAErE"}
@@ -0,0 +1,71 @@
1
+ import { unpackColorToLinear } from '@flighthq/color';
2
+ import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
3
+ import { ToonMaterialKind } from '@flighthq/types';
4
+ import { registerWgpuMeshMaterialRenderer } from './wgpuMeshMaterialRegistry';
5
+ import { beginWgpuMeshDraw, drawWgpuMeshSubset, writeWgpuFrameUniform } from './wgpuMeshPipeline';
6
+ import { bindWgpuToonSurface, ensureWgpuToonPipeline } from './wgpuToonPrelude';
7
+ // The built-in Toon (cel-shading) forward-lit mesh-material renderer (WgpuMeshMaterialRenderer for
8
+ // ToonMaterialKind) — the WGSL mirror of toonGlMeshMaterialRenderer. bind selects the pipeline variant
9
+ // for the material's alpha mode + double-sidedness + the current color-attachment format, writes the
10
+ // shared Frame uniform (camera view-projection + position, the packed light block), binds the pipeline
11
+ // + Frame bind group (beginWgpuMeshDraw), then writes + binds the material's uniform/texture bind group
12
+ // (linear base color, step count, alpha cutoff) at group(2). The diffuse N·L is quantized into stepped
13
+ // cel bands in the fragment scene2d (a stepped floor over `steps`); output is LINEAR color for the
14
+ // rgba16float scene target. draw uploads the geometry's GPU buffers lazily (cached by geometry.version),
15
+ // writes the per-draw model + normal matrices into the render-state's uniform ring buffer (group(1),
16
+ // dynamic offset), and issues the indexed draw over the proxy's subset. Depth-test LESS + depth-write
17
+ // on and back-face culling (unless double-sided) are baked on the pipeline. See registerToonWgpuMaterial
18
+ // to install it.
19
+ //
20
+ // MAPS NOT SAMPLED YET: baseColorMap and ramp are not uploaded on wgpu, so the define key keeps
21
+ // hasBaseColorMap / hasRamp false (placeholder textures bound, scalar `steps` quantizer used). This
22
+ // mirrors the documented gap on the Unlit/StandardPbr wgpu paths — the GL Toon renderer samples both;
23
+ // wgpu lights up the same shader branches once texture upload arrives. See wgpuToonPrelude.
24
+ //
25
+ // Cannot be visually captured in JSDOM (no GPU adapter); the unit test asserts the pipeline/bind/draw
26
+ // call shape against the mock device, mirrored against the verified GL result.
27
+ export const toonWgpuMeshMaterialRenderer = {
28
+ bind(state, material, lights, camera) {
29
+ const stateRuntime = getWgpuRenderStateRuntime(state);
30
+ const pass = stateRuntime.renderPass;
31
+ if (pass === null)
32
+ return;
33
+ const toon = material;
34
+ const format = stateRuntime.currentColorFormat ?? state.format;
35
+ const pipeline = ensureWgpuToonPipeline(state, defineKeyForMaterial(toon), format);
36
+ writeWgpuFrameUniform(state, camera, lights);
37
+ let group;
38
+ if (toon === null) {
39
+ group = bindWgpuToonSurface(state, pipeline, FALLBACK_MATERIAL, WHITE, 3, 0.5);
40
+ }
41
+ else {
42
+ unpackColorToLinear(_scratch, toon.baseColor);
43
+ group = bindWgpuToonSurface(state, pipeline, toon, _scratch, toon.steps, toon.alphaCutoff);
44
+ }
45
+ beginWgpuMeshDraw(state, pipeline);
46
+ pass.setBindGroup(2, group);
47
+ },
48
+ draw(state, proxy, geometry) {
49
+ drawWgpuMeshSubset(state, proxy, geometry);
50
+ },
51
+ };
52
+ // Registers the built-in Toon renderer for ToonMaterialKind on this state. Opt-in (no top-level side
53
+ // effect); call once per WgpuRenderState before drawWgpuScene3D so meshes with ToonMaterials draw.
54
+ export function registerToonWgpuMaterial(state) {
55
+ registerWgpuMeshMaterialRenderer(state, ToonMaterialKind, toonWgpuMeshMaterialRenderer);
56
+ }
57
+ // The feature define key for a Toon material: the alpha-mask cutoff and double-sidedness. The map flags
58
+ // stay false on wgpu (texture upload not yet wired — see the renderer's maps note), so the quantizer is
59
+ // always the scalar `steps` stepped floor and placeholder textures are bound.
60
+ function defineKeyForMaterial(material) {
61
+ return {
62
+ alphaMaskEnabled: material !== null && material.alphaMode === 'mask',
63
+ doubleSided: material !== null && material.doubleSided,
64
+ hasBaseColorMap: false,
65
+ hasRamp: false,
66
+ };
67
+ }
68
+ const _scratch = [0, 0, 0, 0];
69
+ const WHITE = [1, 1, 1, 1];
70
+ const FALLBACK_MATERIAL = {};
71
+ //# sourceMappingURL=toonWgpuMeshMaterialRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toonWgpuMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/toonWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { WgpuMeshMaterialRenderer, WgpuRenderState } from '@flighthq/types';
2
+ export declare const transmissionVolumePbrWgpuMeshMaterialRenderer: WgpuMeshMaterialRenderer;
3
+ export declare function registerTransmissionVolumePbrWgpuMaterial(state: WgpuRenderState): void;
4
+ //# sourceMappingURL=transmissionVolumePbrWgpuMeshMaterialRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transmissionVolumePbrWgpuMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/transmissionVolumePbrWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAQV,wBAAwB,EACxB,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAiCzB,eAAO,MAAM,6CAA6C,EAAE,wBA6C3D,CAAC;AAKF,wBAAgB,yCAAyC,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAMtF"}