@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,458 @@
1
+ import { ensureWgpuEnvironmentSourceCube } from './wgpuEnvironmentCube';
2
+ import { getWgpuScene3DRuntime } from './wgpuScene3DRuntime';
3
+ // Bakes an Environment's source radiance cubemap into the split-sum image-based-lighting set — a diffuse
4
+ // irradiance cubemap, a roughness-mipped prefiltered specular cubemap, and the 2D BRDF integration LUT —
5
+ // and stores it on the scene runtime as `runtime.ibl`. The lit PBR bind reads that to light every PBR draw
6
+ // from the environment (see wgpuPbrPrelude's sampleIblAmbient / the PBR sample bind). The WGSL mirror of
7
+ // scene-gl's bakeGlEnvironmentIbl: an explicit pass the app sequences once when the environment is set (the
8
+ // bake is the substantial cost); a no-op when the environment has no complete source cube. Re-baking
9
+ // replaces the prior set.
10
+ //
11
+ // Each face (and prefiltered mip) is rendered in its own command encoder + submit so the shared per-face
12
+ // uniform (the face direction basis + roughness) is uploaded and consumed pass-by-pass — the WebGPU
13
+ // analogue of scene-gl's synchronous per-face FBO renders. Resolutions / sample counts / mip levels mirror
14
+ // the GL bake exactly. The BRDF LUT is environment-independent, so it is baked once per state and reused
15
+ // across re-bakes.
16
+ export function bakeWgpuEnvironmentIbl(state, environment) {
17
+ const sourceCubeView = ensureWgpuEnvironmentSourceCube(state, environment);
18
+ if (sourceCubeView === null)
19
+ return;
20
+ const scene = getWgpuScene3DRuntime(state);
21
+ const programs = ensureWgpuBakePrograms(state);
22
+ const sourceBindGroup = state.device.createBindGroup({
23
+ layout: programs.sourceBindGroupLayout,
24
+ entries: [
25
+ { binding: 0, resource: sourceCubeView },
26
+ { binding: 1, resource: programs.sampler },
27
+ ],
28
+ });
29
+ const irradiance = bakeWgpuIrradiance(state, programs, sourceBindGroup);
30
+ const prefiltered = bakeWgpuPrefiltered(state, programs, sourceBindGroup);
31
+ const brdf = scene.ibl?.brdfLut ?? bakeWgpuBrdfLut(state, programs);
32
+ const brdfView = scene.ibl?.brdfLutView ?? brdf.createView();
33
+ // Replace the prior set (its textures are freed by destroyWgpuScene3DIbl, not here — a re-bake leaks the
34
+ // old irradiance/prefiltered until teardown, matching scene-gl's re-bake which also relies on teardown).
35
+ const ibl = {
36
+ brdfLut: brdf,
37
+ brdfLutView: brdfView,
38
+ intensity: environment.intensity,
39
+ irradianceCube: irradiance.texture,
40
+ irradianceCubeView: irradiance.view,
41
+ prefilteredCube: prefiltered.texture,
42
+ prefilteredCubeView: prefiltered.view,
43
+ prefilteredMipCount: PREFILTERED_MIPS,
44
+ };
45
+ scene.ibl = ibl;
46
+ }
47
+ // Frees the IBL set's non-GC GPU resources for `state`: the baked irradiance / prefiltered / BRDF textures,
48
+ // the uploaded source radiance cube, the IBL uniform buffer, and the 1x1 no-IBL dummies, then clears the
49
+ // derived slots (bake pipelines, sampler, sample layout + bind group are GC-managed and left null). The
50
+ // WGSL mirror of the IBL branch of scene-gl's destroyGlScene3DRuntime + destroyGlEnvironmentIblBakePrograms. Safe to call
51
+ // more than once and when no bake ever ran — every slot is nullable and destroy is idempotent.
52
+ export function destroyWgpuScene3DIbl(state) {
53
+ const scene = getWgpuScene3DRuntime(state);
54
+ if (scene.ibl !== null) {
55
+ scene.ibl.brdfLut.destroy();
56
+ scene.ibl.irradianceCube.destroy();
57
+ scene.ibl.prefilteredCube.destroy();
58
+ scene.ibl = null;
59
+ }
60
+ if (scene.environmentSourceCube !== null) {
61
+ scene.environmentSourceCube.destroy();
62
+ scene.environmentSourceCube = null;
63
+ scene.environmentSourceCubeView = null;
64
+ }
65
+ if (scene.iblUniformBuffer !== null) {
66
+ scene.iblUniformBuffer.destroy();
67
+ scene.iblUniformBuffer = null;
68
+ }
69
+ if (scene.iblDummyCubeTexture !== null) {
70
+ scene.iblDummyCubeTexture.destroy();
71
+ scene.iblDummyCubeTexture = null;
72
+ scene.iblDummyCubeView = null;
73
+ }
74
+ if (scene.iblDummyLutTexture !== null) {
75
+ scene.iblDummyLutTexture.destroy();
76
+ scene.iblDummyLutTexture = null;
77
+ scene.iblDummyLutView = null;
78
+ }
79
+ scene.iblSampler = null;
80
+ scene.iblSampleLayout = null;
81
+ scene.iblSampleBindGroup = null;
82
+ scene.iblSampleCubeView = null;
83
+ scene.pbrSampleBindGroup = null;
84
+ scene.pbrSampleIblCubeView = null;
85
+ _bakePrograms.delete(state);
86
+ }
87
+ function bakeWgpuIrradiance(state, programs, sourceBindGroup) {
88
+ const texture = createWgpuBakeCube(state, IRRADIANCE_SIZE, 1);
89
+ renderWgpuBakeCubeFaces(state, programs.irradiancePipeline, programs, texture, IRRADIANCE_SIZE, 0, 0, sourceBindGroup);
90
+ return { texture, view: texture.createView({ dimension: 'cube' }) };
91
+ }
92
+ function bakeWgpuPrefiltered(state, programs, sourceBindGroup) {
93
+ const texture = createWgpuBakeCube(state, PREFILTERED_SIZE, PREFILTERED_MIPS);
94
+ for (let mip = 0; mip < PREFILTERED_MIPS; mip++) {
95
+ const mipSize = Math.max(1, PREFILTERED_SIZE >> mip);
96
+ const roughness = PREFILTERED_MIPS > 1 ? mip / (PREFILTERED_MIPS - 1) : 0;
97
+ renderWgpuBakeCubeFaces(state, programs.prefilteredPipeline, programs, texture, mipSize, mip, roughness, sourceBindGroup);
98
+ }
99
+ return { texture, view: texture.createView({ dimension: 'cube' }) };
100
+ }
101
+ function bakeWgpuBrdfLut(state, programs) {
102
+ const device = state.device;
103
+ const texture = device.createTexture({
104
+ size: [BRDF_LUT_SIZE, BRDF_LUT_SIZE, 1],
105
+ format: IBL_BAKE_FORMAT,
106
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
107
+ });
108
+ const encoder = device.createCommandEncoder();
109
+ const pass = encoder.beginRenderPass({
110
+ colorAttachments: [{ view: texture.createView(), clearValue: BAKE_CLEAR, loadOp: 'clear', storeOp: 'store' }],
111
+ });
112
+ pass.setPipeline(programs.brdfPipeline);
113
+ pass.draw(3);
114
+ pass.end();
115
+ device.queue.submit([encoder.finish()]);
116
+ return texture;
117
+ }
118
+ // Renders all six faces of `cube` at mip `mipLevel` (size `size`) through `pipeline`, uploading the
119
+ // per-face direction basis (+ roughness) uniform and running one own-encoder submit per face so the shared
120
+ // uniform is consumed before the next face overwrites it. Mirrors scene-gl's renderGlBakeCubeFaces.
121
+ function renderWgpuBakeCubeFaces(state, pipeline, programs, cube, size, mipLevel, roughness, sourceBindGroup) {
122
+ const device = state.device;
123
+ for (let face = 0; face < 6; face++) {
124
+ const b = CUBE_FACE_BASIS[face];
125
+ const u = _bakeScratch;
126
+ u[0] = b[0];
127
+ u[1] = b[1];
128
+ u[2] = b[2];
129
+ u[3] = 0;
130
+ u[4] = b[3];
131
+ u[5] = b[4];
132
+ u[6] = b[5];
133
+ u[7] = 0;
134
+ u[8] = b[6];
135
+ u[9] = b[7];
136
+ u[10] = b[8];
137
+ u[11] = 0;
138
+ u[12] = roughness;
139
+ u[13] = 0;
140
+ u[14] = 0;
141
+ u[15] = 0;
142
+ device.queue.writeBuffer(programs.uniformBuffer, 0, u.buffer, 0, BAKE_UNIFORM_BYTES);
143
+ const view = cube.createView({
144
+ dimension: '2d',
145
+ baseArrayLayer: face,
146
+ arrayLayerCount: 1,
147
+ baseMipLevel: mipLevel,
148
+ mipLevelCount: 1,
149
+ });
150
+ const encoder = device.createCommandEncoder();
151
+ const pass = encoder.beginRenderPass({
152
+ colorAttachments: [{ view, clearValue: BAKE_CLEAR, loadOp: 'clear', storeOp: 'store' }],
153
+ });
154
+ pass.setViewport(0, 0, size, size, 0, 1);
155
+ pass.setPipeline(pipeline);
156
+ pass.setBindGroup(0, programs.uniformBindGroup);
157
+ pass.setBindGroup(1, sourceBindGroup);
158
+ pass.draw(3);
159
+ pass.end();
160
+ device.queue.submit([encoder.finish()]);
161
+ }
162
+ }
163
+ // Allocates a bake-output cube texture (rgba16float, `mips` mip levels) with the full mip chain declared up
164
+ // front so each prefiltered roughness level has storage before the bake renders into it. Cube = a 2d
165
+ // texture with 6 array layers; the sampleable view is created with dimension 'cube' by the caller.
166
+ function createWgpuBakeCube(state, size, mips) {
167
+ return state.device.createTexture({
168
+ size: [size, size, 6],
169
+ format: IBL_BAKE_FORMAT,
170
+ mipLevelCount: mips,
171
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
172
+ });
173
+ }
174
+ // Resolves (creating once per state) the three bake pipelines + their shared uniform/source layouts. The
175
+ // pipelines and layouts are GC-managed (no destroy); the uniform buffer is freed by destroyWgpuScene3DIbl.
176
+ // Mirrors scene-gl's ensureGlBakeProgram cache (keyed by state).
177
+ function ensureWgpuBakePrograms(state) {
178
+ let programs = _bakePrograms.get(state);
179
+ if (programs !== undefined)
180
+ return programs;
181
+ const device = state.device;
182
+ const uniformBindGroupLayout = device.createBindGroupLayout({
183
+ entries: [{ binding: 0, visibility: GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } }],
184
+ });
185
+ const sourceBindGroupLayout = device.createBindGroupLayout({
186
+ entries: [
187
+ { binding: 0, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: 'float', viewDimension: 'cube' } },
188
+ { binding: 1, visibility: GPUShaderStage.FRAGMENT, sampler: { type: 'filtering' } },
189
+ ],
190
+ });
191
+ const cubeLayout = device.createPipelineLayout({ bindGroupLayouts: [uniformBindGroupLayout, sourceBindGroupLayout] });
192
+ const brdfLayout = device.createPipelineLayout({ bindGroupLayouts: [] });
193
+ const irradianceModule = device.createShaderModule({ code: BAKE_VERTEX_WGSL + IRRADIANCE_FRAGMENT_WGSL });
194
+ const prefilteredModule = device.createShaderModule({ code: BAKE_VERTEX_WGSL + PREFILTERED_FRAGMENT_WGSL });
195
+ const brdfModule = device.createShaderModule({ code: BAKE_VERTEX_WGSL + BRDF_LUT_FRAGMENT_WGSL });
196
+ const uniformBuffer = device.createBuffer({
197
+ size: BAKE_UNIFORM_BYTES,
198
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
199
+ });
200
+ programs = {
201
+ brdfPipeline: device.createRenderPipeline({
202
+ layout: brdfLayout,
203
+ vertex: { module: brdfModule, entryPoint: 'vs_main' },
204
+ fragment: { module: brdfModule, entryPoint: 'fs_main', targets: [{ format: IBL_BAKE_FORMAT }] },
205
+ primitive: { topology: 'triangle-list' },
206
+ }),
207
+ irradiancePipeline: device.createRenderPipeline({
208
+ layout: cubeLayout,
209
+ vertex: { module: irradianceModule, entryPoint: 'vs_main' },
210
+ fragment: { module: irradianceModule, entryPoint: 'fs_main', targets: [{ format: IBL_BAKE_FORMAT }] },
211
+ primitive: { topology: 'triangle-list' },
212
+ }),
213
+ prefilteredPipeline: device.createRenderPipeline({
214
+ layout: cubeLayout,
215
+ vertex: { module: prefilteredModule, entryPoint: 'vs_main' },
216
+ fragment: { module: prefilteredModule, entryPoint: 'fs_main', targets: [{ format: IBL_BAKE_FORMAT }] },
217
+ primitive: { topology: 'triangle-list' },
218
+ }),
219
+ sampler: device.createSampler({ magFilter: 'linear', minFilter: 'linear' }),
220
+ sourceBindGroupLayout,
221
+ uniformBindGroup: device.createBindGroup({
222
+ layout: uniformBindGroupLayout,
223
+ entries: [{ binding: 0, resource: { buffer: uniformBuffer } }],
224
+ }),
225
+ uniformBuffer,
226
+ };
227
+ _bakePrograms.set(state, programs);
228
+ return programs;
229
+ }
230
+ // Mirror scene-gl's bake resolutions / sample counts / mip levels.
231
+ const IRRADIANCE_SIZE = 16;
232
+ const PREFILTERED_SIZE = 64;
233
+ const PREFILTERED_MIPS = 5;
234
+ const BRDF_LUT_SIZE = 128;
235
+ // The bake output format: rgba16float HDR, matching scene-gl's RGBA16F bake targets (16-bit float is
236
+ // core-filterable in WebGPU, so no extra feature is required for the linear cube/LUT sampling).
237
+ const IBL_BAKE_FORMAT = 'rgba16float';
238
+ // Per-face bake uniform: faceForward + faceRight + faceUp (3 padded vec3) + roughness = 4 vec4 = 64 bytes.
239
+ const BAKE_UNIFORM_BYTES = 64;
240
+ const BAKE_CLEAR = { r: 0, g: 0, b: 0, a: 1 };
241
+ // Per-face direction basis (forward = face normal, plus right/up spanning the face) in CubeTexture face
242
+ // order — identical to scene-gl's CUBE_FACE_BASIS. A fragment's world direction is
243
+ // normalize(forward + uv.x*right + uv.y*up) with uv in [-1, 1].
244
+ const CUBE_FACE_BASIS = [
245
+ [1, 0, 0, 0, 0, -1, 0, -1, 0], // +X
246
+ [-1, 0, 0, 0, 0, 1, 0, -1, 0], // -X
247
+ [0, 1, 0, 1, 0, 0, 0, 0, 1], // +Y
248
+ [0, -1, 0, 1, 0, 0, 0, 0, -1], // -Y
249
+ [0, 0, 1, 1, 0, 0, 0, -1, 0], // +Z
250
+ [0, 0, -1, -1, 0, 0, 0, -1, 0], // -Z
251
+ ];
252
+ const _bakeScratch = new Float32Array(BAKE_UNIFORM_BYTES / 4);
253
+ const _bakePrograms = new WeakMap();
254
+ // The bake vertex module: a full-screen triangle (from the vertex index) forwarding the [-1,1] face
255
+ // coordinate as v_uv so the fragment builds its sampling direction from the per-face basis. v_uv.y is
256
+ // NEGATED relative to the clip Y: WebGPU render targets are top-left origin (ndc +Y → framebuffer top),
257
+ // where scene-gl's cube-face FBOs are bottom-left, so the negation makes each texel reconstruct the SAME
258
+ // direction GL wrote there — keeping the baked cubes vertically aligned with the GL result. (This is the
259
+ // single hardest-to-verify orientation choice here; CI's env-ibl parity confirms the sign.)
260
+ const BAKE_VERTEX_WGSL = /* wgsl */ `
261
+ struct FaceUniform {
262
+ faceForward : vec4f,
263
+ faceRight : vec4f,
264
+ faceUp : vec4f,
265
+ roughness : vec4f, // x = roughness (prefiltered only)
266
+ };
267
+ @group(0) @binding(0) var<uniform> face : FaceUniform;
268
+
269
+ struct VertexOutput {
270
+ @builtin(position) clipPosition : vec4f,
271
+ @location(0) uv : vec2f,
272
+ };
273
+
274
+ @vertex fn vs_main(@builtin(vertex_index) vi : u32) -> VertexOutput {
275
+ var out : VertexOutput;
276
+ let x = f32((vi & 1u) << 2u) - 1.0;
277
+ let y = f32((vi & 2u) << 1u) - 1.0;
278
+ out.uv = vec2f(x, -y);
279
+ out.clipPosition = vec4f(x, y, 0.0, 1.0);
280
+ return out;
281
+ }
282
+ `;
283
+ // Shared bake fragment helpers (source cube bindings + srgb decode + face direction), the WGSL mirror of
284
+ // scene-gl's BAKE_COMMON. The source cube is sampled at level 0 (it has no baked mip chain).
285
+ const BAKE_COMMON_WGSL = /* wgsl */ `
286
+ const PI : f32 = 3.14159265359;
287
+
288
+ @group(1) @binding(0) var envCube : texture_cube<f32>;
289
+ @group(1) @binding(1) var envSampler : sampler;
290
+
291
+ fn faceDirection(uv : vec2f) -> vec3f {
292
+ return normalize(face.faceForward.xyz + uv.x * face.faceRight.xyz + uv.y * face.faceUp.xyz);
293
+ }
294
+
295
+ fn srgbToLinear(c : vec3f) -> vec3f {
296
+ let lo = c / 12.92;
297
+ let hi = pow((c + vec3f(0.055)) / 1.055, vec3f(2.4));
298
+ return select(lo, hi, c > vec3f(0.04045));
299
+ }
300
+
301
+ fn radicalInverse(bitsIn : u32) -> f32 {
302
+ var bits = bitsIn;
303
+ bits = (bits << 16u) | (bits >> 16u);
304
+ bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
305
+ bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
306
+ bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
307
+ bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
308
+ return f32(bits) * 2.3283064365386963e-10;
309
+ }
310
+
311
+ fn hammersley(i : u32, n : u32) -> vec2f {
312
+ return vec2f(f32(i) / f32(n), radicalInverse(i));
313
+ }
314
+
315
+ fn importanceSampleGGX(Xi : vec2f, N : vec3f, roughness : f32) -> vec3f {
316
+ let a = roughness * roughness;
317
+ let phi = 2.0 * PI * Xi.x;
318
+ let cosTheta = sqrt((1.0 - Xi.y) / (1.0 + (a * a - 1.0) * Xi.y));
319
+ let sinTheta = sqrt(1.0 - cosTheta * cosTheta);
320
+ let H = vec3f(cos(phi) * sinTheta, sin(phi) * sinTheta, cosTheta);
321
+ var up = vec3f(0.0, 0.0, 1.0);
322
+ if (abs(N.z) >= 0.999) {
323
+ up = vec3f(1.0, 0.0, 0.0);
324
+ }
325
+ let tangent = normalize(cross(up, N));
326
+ let bitangent = cross(N, tangent);
327
+ return normalize(tangent * H.x + bitangent * H.y + N * H.z);
328
+ }
329
+ `;
330
+ // Diffuse irradiance: cosine-weighted hemisphere integral of the environment around the texel normal.
331
+ const IRRADIANCE_FRAGMENT_WGSL = BAKE_COMMON_WGSL +
332
+ /* wgsl */ `
333
+ @fragment fn fs_main(in : VertexOutput) -> @location(0) vec4f {
334
+ let N = faceDirection(in.uv);
335
+ var up = vec3f(0.0, 0.0, 1.0);
336
+ if (abs(N.z) >= 0.999) {
337
+ up = vec3f(1.0, 0.0, 0.0);
338
+ }
339
+ let right = normalize(cross(up, N));
340
+ let realUp = normalize(cross(N, right));
341
+
342
+ var irradiance = vec3f(0.0);
343
+ var samples = 0.0;
344
+ let delta = 0.15;
345
+ var phi = 0.0;
346
+ loop {
347
+ if (phi >= 2.0 * PI) { break; }
348
+ var theta = 0.0;
349
+ loop {
350
+ if (theta >= 0.5 * PI) { break; }
351
+ let tangent = vec3f(sin(theta) * cos(phi), sin(theta) * sin(phi), cos(theta));
352
+ let sampleVec = tangent.x * right + tangent.y * realUp + tangent.z * N;
353
+ irradiance = irradiance + srgbToLinear(textureSampleLevel(envCube, envSampler, sampleVec, 0.0).rgb) * cos(theta) * sin(theta);
354
+ samples = samples + 1.0;
355
+ theta = theta + delta;
356
+ }
357
+ phi = phi + delta;
358
+ }
359
+ return vec4f(PI * irradiance / samples, 1.0);
360
+ }
361
+ `;
362
+ // Prefiltered specular: GGX importance-sampled environment for the mip's roughness.
363
+ const PREFILTERED_FRAGMENT_WGSL = BAKE_COMMON_WGSL +
364
+ /* wgsl */ `
365
+ @fragment fn fs_main(in : VertexOutput) -> @location(0) vec4f {
366
+ let N = faceDirection(in.uv);
367
+ let V = N;
368
+ let SAMPLE_COUNT = 48u;
369
+ var prefiltered = vec3f(0.0);
370
+ var totalWeight = 0.0;
371
+ for (var i = 0u; i < SAMPLE_COUNT; i = i + 1u) {
372
+ let Xi = hammersley(i, SAMPLE_COUNT);
373
+ let H = importanceSampleGGX(Xi, N, face.roughness.x);
374
+ let L = normalize(2.0 * dot(V, H) * H - V);
375
+ let nDotL = max(dot(N, L), 0.0);
376
+ if (nDotL > 0.0) {
377
+ prefiltered = prefiltered + srgbToLinear(textureSampleLevel(envCube, envSampler, L, 0.0).rgb) * nDotL;
378
+ totalWeight = totalWeight + nDotL;
379
+ }
380
+ }
381
+ if (totalWeight > 0.0) {
382
+ return vec4f(prefiltered / totalWeight, 1.0);
383
+ }
384
+ return vec4f(srgbToLinear(textureSampleLevel(envCube, envSampler, N, 0.0).rgb), 1.0);
385
+ }
386
+ `;
387
+ // BRDF integration LUT (split-sum): x = N·V, y = roughness; output RG = scale/bias for F0. Environment-
388
+ // independent (no source cube), so it declares neither the face uniform nor the source cube — just the
389
+ // full-screen triangle's uv. The WGSL mirror of scene-gl's BRDF_LUT_FRAGMENT.
390
+ const BRDF_LUT_FRAGMENT_WGSL = /* wgsl */ `
391
+ const PI : f32 = 3.14159265359;
392
+
393
+ fn radicalInverse(bitsIn : u32) -> f32 {
394
+ var bits = bitsIn;
395
+ bits = (bits << 16u) | (bits >> 16u);
396
+ bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
397
+ bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
398
+ bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
399
+ bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
400
+ return f32(bits) * 2.3283064365386963e-10;
401
+ }
402
+
403
+ fn hammersley(i : u32, n : u32) -> vec2f {
404
+ return vec2f(f32(i) / f32(n), radicalInverse(i));
405
+ }
406
+
407
+ fn importanceSampleGGX(Xi : vec2f, N : vec3f, roughness : f32) -> vec3f {
408
+ let a = roughness * roughness;
409
+ let phi = 2.0 * PI * Xi.x;
410
+ let cosTheta = sqrt((1.0 - Xi.y) / (1.0 + (a * a - 1.0) * Xi.y));
411
+ let sinTheta = sqrt(1.0 - cosTheta * cosTheta);
412
+ let H = vec3f(cos(phi) * sinTheta, sin(phi) * sinTheta, cosTheta);
413
+ var up = vec3f(0.0, 0.0, 1.0);
414
+ if (abs(N.z) >= 0.999) {
415
+ up = vec3f(1.0, 0.0, 0.0);
416
+ }
417
+ let tangent = normalize(cross(up, N));
418
+ let bitangent = cross(N, tangent);
419
+ return normalize(tangent * H.x + bitangent * H.y + N * H.z);
420
+ }
421
+
422
+ fn geometrySchlickGGX(nDotV : f32, roughness : f32) -> f32 {
423
+ let k = roughness * roughness / 2.0;
424
+ return nDotV / (nDotV * (1.0 - k) + k);
425
+ }
426
+
427
+ fn geometrySmith(N : vec3f, V : vec3f, L : vec3f, roughness : f32) -> f32 {
428
+ return geometrySchlickGGX(max(dot(N, L), 0.0), roughness) * geometrySchlickGGX(max(dot(N, V), 0.0), roughness);
429
+ }
430
+
431
+ @fragment fn fs_main(in : VertexOutput) -> @location(0) vec4f {
432
+ let uv = in.uv * 0.5 + vec2f(0.5);
433
+ let nDotV = max(uv.x, 0.001);
434
+ let roughness = uv.y;
435
+ let V = vec3f(sqrt(1.0 - nDotV * nDotV), 0.0, nDotV);
436
+ let N = vec3f(0.0, 0.0, 1.0);
437
+ var A = 0.0;
438
+ var B = 0.0;
439
+ let SAMPLE_COUNT = 256u;
440
+ for (var i = 0u; i < SAMPLE_COUNT; i = i + 1u) {
441
+ let Xi = hammersley(i, SAMPLE_COUNT);
442
+ let H = importanceSampleGGX(Xi, N, roughness);
443
+ let L = normalize(2.0 * dot(V, H) * H - V);
444
+ let nDotL = max(L.z, 0.0);
445
+ let nDotH = max(H.z, 0.0);
446
+ let vDotH = max(dot(V, H), 0.0);
447
+ if (nDotL > 0.0) {
448
+ let G = geometrySmith(N, V, L, roughness);
449
+ let gVis = (G * vDotH) / (nDotH * nDotV);
450
+ let Fc = pow(1.0 - vDotH, 5.0);
451
+ A = A + (1.0 - Fc) * gVis;
452
+ B = B + Fc * gVis;
453
+ }
454
+ }
455
+ return vec4f(A / f32(SAMPLE_COUNT), B / f32(SAMPLE_COUNT), 0.0, 1.0);
456
+ }
457
+ `;
458
+ //# sourceMappingURL=wgpuEnvironmentIblBake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuEnvironmentIblBake.js","sourceRoot":"","sources":["../src/wgpuEnvironmentIblBake.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Camera3D, Environment, WgpuRenderState } from '@flighthq/types';
2
+ export declare function drawWgpuEnvironmentSkybox(state: WgpuRenderState, environment: Readonly<Environment>, camera: Readonly<Camera3D>, aspect: number): void;
3
+ //# sourceMappingURL=wgpuEnvironmentSkybox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuEnvironmentSkybox.d.ts","sourceRoot":"","sources":["../src/wgpuEnvironmentSkybox.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAW,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAavF,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,EAClC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAC1B,MAAM,EAAE,MAAM,GACb,IAAI,CAwCN"}
@@ -0,0 +1,159 @@
1
+ import { getCamera3DInverseViewProjectionMatrix4 } from '@flighthq/camera';
2
+ import { createMatrix4 } from '@flighthq/geometry';
3
+ import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
4
+ import { ensureWgpuEnvironmentSourceCube } from './wgpuEnvironmentCube';
5
+ import { getWgpuScene3DRuntime } from './wgpuScene3DRuntime';
6
+ // Draws the environment's radiance cubemap as the scene backdrop — the WGSL mirror of scene-gl's
7
+ // drawGlEnvironmentSkybox. A screen-filling triangle that, per pixel, reconstructs the world-space view
8
+ // ray from the inverse view-projection and samples the cube. The pipeline writes no depth and compares
9
+ // 'always', so it fills every pixel with the backdrop; call it once, inside the open scene render pass and
10
+ // BEFORE drawWgpuScene3D, so opaque geometry (depth-test LESS) draws over it. A no-op when the environment
11
+ // has no complete source cube or no render pass is open. `aspect` is the viewport width / height (matches
12
+ // the camera aspect drawWgpuScene3D uses). The ray reconstruction uses GL-convention clip Z (near -1, far
13
+ // +1) to match the camera's projection matrices — the same convention the mesh/shadow paths assume.
14
+ export function drawWgpuEnvironmentSkybox(state, environment, camera, aspect) {
15
+ const cubeView = ensureWgpuEnvironmentSourceCube(state, environment);
16
+ if (cubeView === null)
17
+ return;
18
+ const stateRuntime = getWgpuRenderStateRuntime(state);
19
+ const pass = stateRuntime.renderPass;
20
+ if (pass === null)
21
+ return;
22
+ const scene = getWgpuScene3DRuntime(state);
23
+ const format = stateRuntime.currentColorFormat ?? state.format;
24
+ const sky = ensureWgpuSkyboxPipeline(state, format);
25
+ getCamera3DInverseViewProjectionMatrix4(_inverseViewProjection, camera, aspect);
26
+ const u = _skyScratch;
27
+ const m = _inverseViewProjection.m;
28
+ for (let i = 0; i < 16; i++)
29
+ u[i] = m[i];
30
+ u[16] = environment.intensity;
31
+ u[17] = 0;
32
+ u[18] = 0;
33
+ u[19] = 0;
34
+ state.device.queue.writeBuffer(sky.uniformBuffer, 0, u.buffer, 0, SKYBOX_UNIFORM_BYTES);
35
+ // Rebuilt only when the bound source-cube view changes (a re-baked / swapped environment); the uniform
36
+ // bind group is stable across frames for a static environment.
37
+ if (sky.cubeBindGroup === null || sky.cubeView !== cubeView) {
38
+ sky.cubeBindGroup = state.device.createBindGroup({
39
+ layout: sky.cubeBindGroupLayout,
40
+ entries: [
41
+ { binding: 0, resource: cubeView },
42
+ { binding: 1, resource: getWgpuSkyboxSampler(state) },
43
+ ],
44
+ });
45
+ sky.cubeView = cubeView;
46
+ }
47
+ pass.setPipeline(sky.pipeline);
48
+ pass.setBindGroup(0, sky.uniformBindGroup);
49
+ pass.setBindGroup(1, sky.cubeBindGroup);
50
+ pass.draw(3);
51
+ void scene;
52
+ }
53
+ // Resolves (creating once per state + color format) the skybox pipeline: a fullscreen-triangle module, a
54
+ // group(0) uniform (inverse view-projection + intensity), and a group(1) cube texture + sampler. The
55
+ // pipeline declares the scene pass's depth-stencil format with depth-write off and compare 'always' so the
56
+ // backdrop never occludes geometry. Cached per (state, format) so the canvas (bgra8unorm) and the HDR
57
+ // effect target (rgba16float) get distinct variants — the WGSL mirror of scene-gl's ensureGlSkybox.
58
+ function ensureWgpuSkyboxPipeline(state, format) {
59
+ let byState = _skyboxes.get(state);
60
+ if (byState === undefined) {
61
+ byState = new Map();
62
+ _skyboxes.set(state, byState);
63
+ }
64
+ let sky = byState.get(format);
65
+ if (sky !== undefined)
66
+ return sky;
67
+ const device = state.device;
68
+ const module = device.createShaderModule({ code: SKYBOX_WGSL });
69
+ const uniformBindGroupLayout = device.createBindGroupLayout({
70
+ entries: [{ binding: 0, visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } }],
71
+ });
72
+ const cubeBindGroupLayout = device.createBindGroupLayout({
73
+ entries: [
74
+ { binding: 0, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: 'float', viewDimension: 'cube' } },
75
+ { binding: 1, visibility: GPUShaderStage.FRAGMENT, sampler: { type: 'filtering' } },
76
+ ],
77
+ });
78
+ const layout = device.createPipelineLayout({ bindGroupLayouts: [uniformBindGroupLayout, cubeBindGroupLayout] });
79
+ const pipeline = device.createRenderPipeline({
80
+ layout,
81
+ vertex: { module, entryPoint: 'vs_main' },
82
+ fragment: { module, entryPoint: 'fs_main', targets: [{ format }] },
83
+ primitive: { topology: 'triangle-list' },
84
+ depthStencil: { format: SKYBOX_DEPTH_STENCIL_FORMAT, depthWriteEnabled: false, depthCompare: 'always' },
85
+ });
86
+ const uniformBuffer = device.createBuffer({
87
+ size: SKYBOX_UNIFORM_BYTES,
88
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
89
+ });
90
+ const uniformBindGroup = device.createBindGroup({
91
+ layout: uniformBindGroupLayout,
92
+ entries: [{ binding: 0, resource: { buffer: uniformBuffer } }],
93
+ });
94
+ sky = { cubeBindGroup: null, cubeBindGroupLayout, cubeView: null, pipeline, uniformBindGroup, uniformBuffer };
95
+ byState.set(format, sky);
96
+ return sky;
97
+ }
98
+ // The shared per-state filtering sampler for the skybox cube. Created once and reused across formats.
99
+ function getWgpuSkyboxSampler(state) {
100
+ let sampler = _skyboxSamplers.get(state);
101
+ if (sampler === undefined) {
102
+ sampler = state.device.createSampler({ magFilter: 'linear', minFilter: 'linear' });
103
+ _skyboxSamplers.set(state, sampler);
104
+ }
105
+ return sampler;
106
+ }
107
+ // The scene pass's depth-stencil format, matching wgpuMeshPipeline's DEPTH_STENCIL_FORMAT — the skybox
108
+ // pipeline must declare it to be compatible with the open scene render pass (it just never writes depth).
109
+ const SKYBOX_DEPTH_STENCIL_FORMAT = 'depth24plus-stencil8';
110
+ // Skybox uniform: mat4x4f inverse view-projection (64) + vec4f params (16, x = intensity) = 80 bytes.
111
+ const SKYBOX_UNIFORM_BYTES = 80;
112
+ const _inverseViewProjection = createMatrix4();
113
+ const _skyScratch = new Float32Array(SKYBOX_UNIFORM_BYTES / 4);
114
+ const _skyboxes = new WeakMap();
115
+ const _skyboxSamplers = new WeakMap();
116
+ const SKYBOX_WGSL = /* wgsl */ `
117
+ struct SkyUniform {
118
+ inverseViewProjection : mat4x4f,
119
+ params : vec4f, // x = intensity
120
+ };
121
+
122
+ @group(0) @binding(0) var<uniform> sky : SkyUniform;
123
+ @group(1) @binding(0) var envCube : texture_cube<f32>;
124
+ @group(1) @binding(1) var envSampler : sampler;
125
+
126
+ struct VertexOutput {
127
+ @builtin(position) clipPosition : vec4f,
128
+ @location(0) ndc : vec2f,
129
+ };
130
+
131
+ @vertex fn vs_main(@builtin(vertex_index) vi : u32) -> VertexOutput {
132
+ var out : VertexOutput;
133
+ // Full-screen triangle from the vertex index alone (no vertex buffer).
134
+ let x = f32((vi & 1u) << 2u) - 1.0;
135
+ let y = f32((vi & 2u) << 1u) - 1.0;
136
+ out.ndc = vec2f(x, y);
137
+ // Emit at the far plane (WebGPU clip z in 0..1) so the backdrop sits at maximum depth.
138
+ out.clipPosition = vec4f(x, y, 1.0, 1.0);
139
+ return out;
140
+ }
141
+
142
+ fn srgbToLinear(c : vec3f) -> vec3f {
143
+ let lo = c / 12.92;
144
+ let hi = pow((c + vec3f(0.055)) / 1.055, vec3f(2.4));
145
+ return select(lo, hi, c > vec3f(0.04045));
146
+ }
147
+
148
+ @fragment fn fs_main(in : VertexOutput) -> @location(0) vec4f {
149
+ // Reconstruct the world-space ray through this pixel from the near- and far-plane unprojections. The
150
+ // projection is GL-convention (clip z in -1..1), so unproject at z = -1 (near) and z = +1 (far),
151
+ // matching scene-gl's skybox exactly.
152
+ let nearW = sky.inverseViewProjection * vec4f(in.ndc, -1.0, 1.0);
153
+ let farW = sky.inverseViewProjection * vec4f(in.ndc, 1.0, 1.0);
154
+ let dir = normalize(farW.xyz / farW.w - nearW.xyz / nearW.w);
155
+ let color = srgbToLinear(textureSampleLevel(envCube, envSampler, dir, 0.0).rgb) * sky.params.x;
156
+ return vec4f(color, 1.0);
157
+ }
158
+ `;
159
+ //# sourceMappingURL=wgpuEnvironmentSkybox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuEnvironmentSkybox.js","sourceRoot":"","sources":["../src/wgpuEnvironmentSkybox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { LinearColor, WgpuMatcapDefineKey, WgpuMatcapPipeline, WgpuRenderState } from '@flighthq/types';
2
+ export declare function bindWgpuMatcapSurface(state: WgpuRenderState, pipeline: Readonly<WgpuMatcapPipeline>, materialKey: object, tint: Readonly<LinearColor>, alphaCutoff: number): GPUBindGroup;
3
+ export declare function buildWgpuMatcapDefineKey(key: Readonly<WgpuMatcapDefineKey>): string;
4
+ export declare function compileWgpuMatcapPipeline(state: WgpuRenderState, key: Readonly<WgpuMatcapDefineKey>, format: GPUTextureFormat, blended?: boolean): WgpuMatcapPipeline;
5
+ export declare function ensureWgpuMatcapPipeline(state: WgpuRenderState, key: Readonly<WgpuMatcapDefineKey>, format: GPUTextureFormat): WgpuMatcapPipeline;
6
+ export declare function getWgpuMatcapModuleSourceForKey(key: Readonly<WgpuMatcapDefineKey>): string;
7
+ //# sourceMappingURL=wgpuMatcapPrelude.d.ts.map