@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,142 @@
1
+ import { bindWgpuVideoTexture } from '@flighthq/render-wgpu';
2
+ import { createWgpuMeshPipeline, ensureWgpuScene3DPipeline, getWgpuMeshPreludeWgsl, getWgpuMaterialSampler, ensureWgpuPlaceholderTextureView, resolveWgpuMaterialTextureView, stashWgpuUvTransform, } from './wgpuMeshPipeline';
3
+ import { getWgpuScene3DRuntime, getWgpuSkinningAdapter } from './wgpuScene3DRuntime';
4
+ // Ensures (and caches per material reference) the unlit Material bind group — a uniform buffer + the
5
+ // shared sampler + the placeholder color texture — and rewrites its uniform with this surface's linear
6
+ // color, intensity, and alpha cutoff. Mirrors scene-gl's bindGlUnlitSurface. Returns the bind group for
7
+ // the caller to set at group(2).
8
+ export function bindWgpuUnlitSurface(state, pipeline, materialKey, color, intensity, alphaCutoff, colorMap) {
9
+ const sampler = getWgpuMaterialSampler(state, colorMap);
10
+ const view = resolveWgpuMaterialTextureView(state, colorMap);
11
+ const binding = ensureWgpuUnlitBinding(state, pipeline, materialKey, sampler, view);
12
+ writeWgpuUnlitUniform(state, binding, color, intensity, alphaCutoff);
13
+ stashWgpuUvTransform(state, colorMap);
14
+ return binding.bindGroup;
15
+ }
16
+ // Dynamic-video sibling of bindWgpuUnlitSurface. The VideoTexture uploader preserves one GPU texture
17
+ // per stream, copies only when frameId advances, and replaces the material bind group when a resolution
18
+ // change yields a new view. It shares the still-image shader/layout and UV-transform path.
19
+ export function bindWgpuUnlitVideoSurface(state, pipeline, materialKey, color, intensity, alphaCutoff, colorMap) {
20
+ const entry = bindWgpuVideoTexture(state, colorMap);
21
+ const sampler = getWgpuMaterialSampler(state, colorMap);
22
+ const view = entry?.view ?? ensureWgpuPlaceholderTextureView(state);
23
+ const binding = ensureWgpuUnlitBinding(state, pipeline, materialKey, sampler, view);
24
+ writeWgpuUnlitUniform(state, binding, color, intensity, alphaCutoff);
25
+ stashWgpuUvTransform(state, colorMap);
26
+ return binding.bindGroup;
27
+ }
28
+ function ensureWgpuUnlitBinding(state, pipeline, materialKey, sampler, view) {
29
+ const scene = getWgpuScene3DRuntime(state);
30
+ let binding = scene.materialBindGroups.get(materialKey);
31
+ if (binding === undefined) {
32
+ const buffer = state.device.createBuffer({
33
+ size: UNLIT_UNIFORM_BYTES,
34
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
35
+ });
36
+ binding = {
37
+ bindGroup: createWgpuUnlitBindGroup(state, pipeline, buffer, sampler, view),
38
+ buffer,
39
+ sampler,
40
+ views: [view],
41
+ };
42
+ scene.materialBindGroups.set(materialKey, binding);
43
+ }
44
+ else if (binding.sampler !== sampler || binding.views?.[0] !== view || (binding.views?.length ?? 0) !== 1) {
45
+ binding.bindGroup = createWgpuUnlitBindGroup(state, pipeline, binding.buffer, sampler, view);
46
+ binding.sampler = sampler;
47
+ binding.views ??= [view];
48
+ binding.views[0] = view;
49
+ binding.views.length = 1;
50
+ }
51
+ return binding;
52
+ }
53
+ function createWgpuUnlitBindGroup(state, pipeline, buffer, sampler, view) {
54
+ return state.device.createBindGroup({
55
+ layout: pipeline.materialBindGroupLayout,
56
+ entries: [
57
+ { binding: 0, resource: { buffer } },
58
+ { binding: 1, resource: sampler },
59
+ { binding: 2, resource: view },
60
+ ],
61
+ });
62
+ }
63
+ function writeWgpuUnlitUniform(state, binding, color, intensity, alphaCutoff) {
64
+ _scratch[0] = color[0];
65
+ _scratch[1] = color[1];
66
+ _scratch[2] = color[2];
67
+ _scratch[3] = color[3];
68
+ _scratch[4] = intensity;
69
+ _scratch[5] = alphaCutoff;
70
+ _scratch[6] = 0;
71
+ _scratch[7] = 0;
72
+ state.device.queue.writeBuffer(binding.buffer, 0, _scratch.buffer, 0, UNLIT_UNIFORM_BYTES);
73
+ }
74
+ // A short, stable, order-independent string identity for an unlit define key, used as the pipeline-
75
+ // cache key (combined with the color format). Two keys with the same flags share a compiled pipeline.
76
+ export function buildWgpuUnlitDefineKey(key) {
77
+ return `${key.alphaMaskEnabled ? 'm' : '-'}${key.doubleSided ? 'd' : '-'}${key.hasColorMap ? 'c' : '-'}`;
78
+ }
79
+ // Compiles the unlit module for a define key and builds the render pipeline for the given color format,
80
+ // with the group(2) material bind-group layout (uniform + sampler + one color texture). Pure GPU work —
81
+ // no caching — used by ensureWgpuUnlitPipeline.
82
+ export function compileWgpuUnlitPipeline(state, key, format, blended = false, skinned = false) {
83
+ const device = state.device;
84
+ const module = device.createShaderModule({
85
+ code: getWgpuUnlitModuleSourceForKey(key, skinned, getWgpuSkinningAdapter(state)),
86
+ });
87
+ const materialBindGroupLayout = device.createBindGroupLayout({
88
+ entries: [
89
+ { binding: 0, visibility: GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },
90
+ { binding: 1, visibility: GPUShaderStage.FRAGMENT, sampler: { type: 'filtering' } },
91
+ { binding: 2, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: 'float' } },
92
+ ],
93
+ });
94
+ return createWgpuMeshPipeline(state, {
95
+ blended,
96
+ doubleSided: key.doubleSided,
97
+ format,
98
+ materialBindGroupLayout,
99
+ module,
100
+ skinned,
101
+ });
102
+ }
103
+ // Resolves the unlit pipeline for a define key + color format, compiling and caching it on first use
104
+ // through the shared scene pipeline cache under the `unlit:` family namespace.
105
+ export function ensureWgpuUnlitPipeline(state, key, format) {
106
+ return ensureWgpuScene3DPipeline(state, `unlit:${format}|${buildWgpuUnlitDefineKey(key)}`, (blended, skinned) => compileWgpuUnlitPipeline(state, key, format, blended, skinned));
107
+ }
108
+ // The full WGSL module source for a define key: the const-flag block + the shared mesh prelude (Frame/
109
+ // Draw/vs_main/srgbToLinear) + the unlit material block + fs_main.
110
+ export function getWgpuUnlitModuleSourceForKey(key, skinned = false, skinning = null) {
111
+ return (`const ALPHA_MASK : bool = ${key.alphaMaskEnabled ? 'true' : 'false'};\n` +
112
+ `const HAS_COLOR_MAP : bool = ${key.hasColorMap ? 'true' : 'false'};\n` +
113
+ getWgpuMeshPreludeWgsl(skinned, skinning) +
114
+ UNLIT_WGSL_BODY);
115
+ }
116
+ // Unlit material uniform: color vec4f (16) + params vec4f (16) = 32 bytes / 8 floats. params.x =
117
+ // intensity, params.y = alphaCutoff.
118
+ const UNLIT_UNIFORM_BYTES = 32;
119
+ const UNLIT_WGSL_BODY = /* wgsl */ `
120
+ struct UnlitMaterial {
121
+ color : vec4f, // linear rgba
122
+ params : vec4f, // x = intensity, y = alphaCutoff
123
+ };
124
+
125
+ @group(2) @binding(0) var<uniform> material : UnlitMaterial;
126
+ @group(2) @binding(1) var materialSampler : sampler;
127
+ @group(2) @binding(2) var colorTexture : texture_2d<f32>;
128
+
129
+ @fragment fn fs_main(in : VertexOutput) -> @location(0) vec4f {
130
+ var color = material.color;
131
+ if (HAS_COLOR_MAP) {
132
+ let sampled = textureSample(colorTexture, materialSampler, in.uv);
133
+ color = vec4f(color.rgb * srgbToLinear(sampled.rgb), color.a * sampled.a);
134
+ }
135
+ if (ALPHA_MASK && color.a < material.params.y) {
136
+ discard;
137
+ }
138
+ return vec4f(color.rgb * material.params.x, color.a * in.objectAlpha);
139
+ }
140
+ `;
141
+ const _scratch = new Float32Array(UNLIT_UNIFORM_BYTES / 4);
142
+ //# sourceMappingURL=wgpuUnlitPrelude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuUnlitPrelude.js","sourceRoot":"","sources":["../src/wgpuUnlitPrelude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { LinearColor, WgpuRenderState, WgpuWireframePipeline } from '@flighthq/types';
2
+ export declare function bindWgpuWireframeColor(state: WgpuRenderState, pipeline: Readonly<WgpuWireframePipeline>, materialKey: object, color: Readonly<LinearColor>): GPUBindGroup;
3
+ export declare function compileWgpuWireframePipeline(state: WgpuRenderState, format: GPUTextureFormat, blended?: boolean): WgpuWireframePipeline;
4
+ export declare function ensureWgpuWireframePipeline(state: WgpuRenderState, format: GPUTextureFormat): WgpuWireframePipeline;
5
+ export declare function getWgpuWireframeModuleSource(): string;
6
+ //# sourceMappingURL=wgpuWireframePrelude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuWireframePrelude.d.ts","sourceRoot":"","sources":["../src/wgpuWireframePrelude.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAuB,eAAe,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAiBhH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,QAAQ,CAAC,qBAAqB,CAAC,EACzC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,GAC3B,YAAY,CAyBd;AAKD,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,gBAAgB,EACxB,OAAO,UAAQ,GACd,qBAAqB,CAcvB;AAID,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,gBAAgB,GAAG,qBAAqB,CAInH;AAID,wBAAgB,4BAA4B,IAAI,MAAM,CAErD"}
@@ -0,0 +1,77 @@
1
+ import { createWgpuMeshPipeline, ensureWgpuScene3DPipeline, stashWgpuUvTransform, WGPU_MESH_PRELUDE_WGSL, } from './wgpuMeshPipeline';
2
+ import { getWgpuScene3DRuntime } from './wgpuScene3DRuntime';
3
+ // The Wgpu wireframe prelude — the WGSL mirror of scene-gl's glWireframePrelude. A minimal module that
4
+ // reuses the shared vs_main (position → clip) and outputs a single flat LINE color; the wireframe
5
+ // material draws mesh edges as GL line-list primitives (see wgpuWireframeUpload for the derived
6
+ // line-index buffer). It has no lighting, no maps, and one variant per color format — group(2) carries
7
+ // only the color uniform. The pipeline is built with line-list topology and cull-none.
8
+ // Ensures (and caches per material reference) the wireframe color bind group — a single uniform buffer
9
+ // — and rewrites it with this material's linear line color. Mirrors scene-gl's wireframe color upload.
10
+ export function bindWgpuWireframeColor(state, pipeline, materialKey, color) {
11
+ const scene = getWgpuScene3DRuntime(state);
12
+ let binding = scene.materialBindGroups.get(materialKey);
13
+ if (binding === undefined) {
14
+ const buffer = state.device.createBuffer({
15
+ size: WIREFRAME_UNIFORM_BYTES,
16
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
17
+ });
18
+ const bindGroup = state.device.createBindGroup({
19
+ layout: pipeline.materialBindGroupLayout,
20
+ entries: [{ binding: 0, resource: { buffer } }],
21
+ });
22
+ binding = { bindGroup, buffer };
23
+ scene.materialBindGroups.set(materialKey, binding);
24
+ }
25
+ _scratch[0] = color[0];
26
+ _scratch[1] = color[1];
27
+ _scratch[2] = color[2];
28
+ _scratch[3] = color[3];
29
+ state.device.queue.writeBuffer(binding.buffer, 0, _scratch.buffer, 0, WIREFRAME_UNIFORM_BYTES);
30
+ // Wireframe draws untextured lines, so stash identity to keep the shared Draw uniform authoritative —
31
+ // a prior tiled material's transform must not persist into this bind.
32
+ stashWgpuUvTransform(state, null);
33
+ return binding.bindGroup;
34
+ }
35
+ // Compiles the wireframe module and builds the line-list render pipeline for the given color format,
36
+ // with a group(2) material layout carrying just the color uniform. Cull-none (lines have no winding).
37
+ // Pure GPU work — no caching — used by ensureWgpuWireframePipeline.
38
+ export function compileWgpuWireframePipeline(state, format, blended = false) {
39
+ const device = state.device;
40
+ const module = device.createShaderModule({ code: getWgpuWireframeModuleSource() });
41
+ const materialBindGroupLayout = device.createBindGroupLayout({
42
+ entries: [{ binding: 0, visibility: GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } }],
43
+ });
44
+ return createWgpuMeshPipeline(state, {
45
+ blended,
46
+ doubleSided: true,
47
+ format,
48
+ materialBindGroupLayout,
49
+ module,
50
+ topology: 'line-list',
51
+ });
52
+ }
53
+ // Resolves the wireframe pipeline for a color format, compiling and caching it on first use through the
54
+ // shared scene pipeline cache under the `wireframe:` family namespace.
55
+ export function ensureWgpuWireframePipeline(state, format) {
56
+ return ensureWgpuScene3DPipeline(state, `wireframe:${format}`, (blended) => compileWgpuWireframePipeline(state, format, blended));
57
+ }
58
+ // The full WGSL module source: the shared mesh prelude (Frame/Draw/vs_main/srgbToLinear) + the
59
+ // wireframe color uniform + fs_main.
60
+ export function getWgpuWireframeModuleSource() {
61
+ return WGPU_MESH_PRELUDE_WGSL + WIREFRAME_WGSL_BODY;
62
+ }
63
+ // Wireframe material uniform: color vec4f = 16 bytes / 4 floats.
64
+ const WIREFRAME_UNIFORM_BYTES = 16;
65
+ const WIREFRAME_WGSL_BODY = /* wgsl */ `
66
+ struct WireframeMaterial {
67
+ color : vec4f, // linear rgba
68
+ };
69
+
70
+ @group(2) @binding(0) var<uniform> material : WireframeMaterial;
71
+
72
+ @fragment fn fs_main(in : VertexOutput) -> @location(0) vec4f {
73
+ return vec4f(material.color.rgb, material.color.a * in.objectAlpha);
74
+ }
75
+ `;
76
+ const _scratch = new Float32Array(WIREFRAME_UNIFORM_BYTES / 4);
77
+ //# sourceMappingURL=wgpuWireframePrelude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuWireframePrelude.js","sourceRoot":"","sources":["../src/wgpuWireframePrelude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { WgpuWireframeUpload, MeshGeometry, WgpuRenderState } from '@flighthq/types';
2
+ export declare function ensureWgpuWireframeUpload(state: WgpuRenderState, geometry: Readonly<MeshGeometry>): WgpuWireframeUpload | null;
3
+ //# sourceMappingURL=wgpuWireframeUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuWireframeUpload.d.ts","sourceRoot":"","sources":["../src/wgpuWireframeUpload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAQ1F,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,GAC/B,mBAAmB,GAAG,IAAI,CAiC5B"}
@@ -0,0 +1,68 @@
1
+ import { ensureWgpuMeshUpload } from './wgpuMeshUpload';
2
+ // Lazily derives + uploads the wireframe line-index buffer for a geometry on this state, caching it
3
+ // keyed by the geometry entity. Reuses the geometry's vertex buffer (ensuring the triangle upload
4
+ // first) and builds a line-list index buffer from the triangle indices. A subset's triangle range
5
+ // [indexOffset, +indexCount) maps to the line range [indexOffset * 2, +indexCount * 2) (each triangle
6
+ // index yields two line indices), so the renderer draws a sub-range of this buffer.
7
+ export function ensureWgpuWireframeUpload(state, geometry) {
8
+ const meshUpload = ensureWgpuMeshUpload(state, geometry);
9
+ if (meshUpload === null)
10
+ return null;
11
+ let perState = wireframeUploads.get(state);
12
+ if (perState === undefined) {
13
+ perState = new WeakMap();
14
+ wireframeUploads.set(state, perState);
15
+ }
16
+ let upload = perState.get(geometry);
17
+ if (upload !== undefined && upload.version === geometry.version) {
18
+ return upload;
19
+ }
20
+ const device = state.device;
21
+ if (upload !== undefined)
22
+ upload.lineIndexBuffer.destroy();
23
+ const lines = buildLineIndices(geometry);
24
+ const lineIndexBuffer = device.createBuffer({
25
+ size: Math.max(4, alignTo4(lines.byteLength)),
26
+ usage: GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST,
27
+ });
28
+ device.queue.writeBuffer(lineIndexBuffer, 0, lines.buffer, lines.byteOffset, lines.byteLength);
29
+ upload = {
30
+ indexFormat: lines instanceof Uint32Array ? 'uint32' : 'uint16',
31
+ lineIndexBuffer,
32
+ version: geometry.version,
33
+ vertexBuffer: meshUpload.vertexBuffer,
34
+ };
35
+ perState.set(geometry, upload);
36
+ return upload;
37
+ }
38
+ // Builds the line-list index array (two indices per triangle edge, three edges per triangle) from a
39
+ // geometry's triangle indices. Promotes to Uint32 when any line index exceeds the Uint16 range.
40
+ function buildLineIndices(geometry) {
41
+ const triangleIndices = geometry.indices;
42
+ const triangleCount = Math.floor(triangleIndices.length / 3);
43
+ const lineCount = triangleCount * 6;
44
+ const useUint32 = triangleIndices instanceof Uint32Array || lineCount > 65535;
45
+ const lines = useUint32 ? new Uint32Array(lineCount) : new Uint16Array(lineCount);
46
+ for (let t = 0; t < triangleCount; t++) {
47
+ const base = t * 3;
48
+ const i0 = triangleIndices[base];
49
+ const i1 = triangleIndices[base + 1];
50
+ const i2 = triangleIndices[base + 2];
51
+ const out = t * 6;
52
+ lines[out] = i0;
53
+ lines[out + 1] = i1;
54
+ lines[out + 2] = i1;
55
+ lines[out + 3] = i2;
56
+ lines[out + 4] = i2;
57
+ lines[out + 5] = i0;
58
+ }
59
+ return lines;
60
+ }
61
+ // GPU buffers written via writeBuffer must be a multiple of 4 bytes; round the requested size up.
62
+ function alignTo4(byteLength) {
63
+ return (byteLength + 3) & ~3;
64
+ }
65
+ // Per-state wireframe upload caches, keyed by geometry. Module-local (not a runtime slot) since
66
+ // wireframe is the only consumer; the outer WeakMap drops a state's caches when the state is GC'd.
67
+ const wireframeUploads = new WeakMap();
68
+ //# sourceMappingURL=wgpuWireframeUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuWireframeUpload.js","sourceRoot":"","sources":["../src/wgpuWireframeUpload.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { WgpuMeshMaterialRenderer, WgpuRenderState } from '@flighthq/types';
2
+ export declare const wireframeWgpuMeshMaterialRenderer: WgpuMeshMaterialRenderer;
3
+ export declare function registerWireframeWgpuMaterial(state: WgpuRenderState): void;
4
+ //# sourceMappingURL=wireframeWgpuMeshMaterialRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wireframeWgpuMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/wireframeWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAOV,wBAAwB,EACxB,eAAe,EAEhB,MAAM,iBAAiB,CAAC;AAgBzB,eAAO,MAAM,iCAAiC,EAAE,wBAkD/C,CAAC;AAKF,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAE1E"}
@@ -0,0 +1,69 @@
1
+ import { unpackColorToLinear } from '@flighthq/color';
2
+ import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
3
+ import { WireframeMaterialKind } from '@flighthq/types';
4
+ import { registerWgpuMeshMaterialRenderer } from './wgpuMeshMaterialRegistry';
5
+ import { beginWgpuMeshDraw, writeWgpuDrawUniform, writeWgpuFrameUniform } from './wgpuMeshPipeline';
6
+ import { getWgpuScene3DRuntime } from './wgpuScene3DRuntime';
7
+ import { bindWgpuWireframeColor, ensureWgpuWireframePipeline } from './wgpuWireframePrelude';
8
+ import { ensureWgpuWireframeUpload } from './wgpuWireframeUpload';
9
+ // The built-in Wireframe forward renderer (WgpuMeshMaterialRenderer for WireframeMaterialKind) — the
10
+ // WGSL mirror of wireframeGlMeshMaterialRenderer. Draws the mesh's triangle edges as line-list
11
+ // primitives in a single flat linear color. Unlike the triangle families it does not use
12
+ // drawWgpuMeshSubset: draw binds the derived line-index buffer (see wgpuWireframeUpload) and issues a
13
+ // line-list indexed draw over the subset's line range. `thickness` > 1 is not honored (WebGPU has no
14
+ // line-width control); the field is documented as best-effort and ignored. Lights are ignored. See
15
+ // registerWireframeWgpuMaterial to install it.
16
+ export const wireframeWgpuMeshMaterialRenderer = {
17
+ bind(state, material, _lights, camera) {
18
+ const stateRuntime = getWgpuRenderStateRuntime(state);
19
+ const pass = stateRuntime.renderPass;
20
+ if (pass === null)
21
+ return;
22
+ const wireframe = material;
23
+ const format = stateRuntime.currentColorFormat ?? state.format;
24
+ const pipeline = ensureWgpuWireframePipeline(state, format);
25
+ writeWgpuFrameUniform(state, camera, _lights);
26
+ let group;
27
+ if (wireframe === null) {
28
+ group = bindWgpuWireframeColor(state, pipeline, FALLBACK_MATERIAL, WHITE);
29
+ }
30
+ else {
31
+ unpackColorToLinear(_scratch, wireframe.color);
32
+ group = bindWgpuWireframeColor(state, pipeline, wireframe, _scratch);
33
+ }
34
+ beginWgpuMeshDraw(state, pipeline);
35
+ pass.setBindGroup(2, group);
36
+ },
37
+ draw(state, proxy, geometry) {
38
+ const stateRuntime = getWgpuRenderStateRuntime(state);
39
+ const pass = stateRuntime.renderPass;
40
+ const scene = getWgpuScene3DRuntime(state);
41
+ if (pass === null || scene.activeMeshPipeline === null)
42
+ return;
43
+ const subset = proxy.subset;
44
+ if (subset.indexCount === 0)
45
+ return;
46
+ const upload = ensureWgpuWireframeUpload(state, geometry);
47
+ if (upload === null)
48
+ return;
49
+ const drawBindGroup = writeWgpuDrawUniform(state, proxy);
50
+ _dynamicOffsets[0] = scene.pendingDrawOffset;
51
+ pass.setBindGroup(1, drawBindGroup, _dynamicOffsets);
52
+ pass.setVertexBuffer(0, upload.vertexBuffer);
53
+ pass.setIndexBuffer(upload.lineIndexBuffer, upload.indexFormat);
54
+ // Each triangle index contributes two line indices, so the subset's line range is its triangle
55
+ // range scaled by 2.
56
+ pass.drawIndexed(subset.indexCount * 2, 1, subset.indexOffset * 2, 0, 0);
57
+ },
58
+ };
59
+ // Registers the built-in Wireframe renderer for WireframeMaterialKind on this state. Opt-in (no top-
60
+ // level side effect); call once per WgpuRenderState before drawWgpuScene3D so meshes with
61
+ // WireframeMaterials draw.
62
+ export function registerWireframeWgpuMaterial(state) {
63
+ registerWgpuMeshMaterialRenderer(state, WireframeMaterialKind, wireframeWgpuMeshMaterialRenderer);
64
+ }
65
+ const _scratch = [0, 0, 0, 0];
66
+ const _dynamicOffsets = new Uint32Array(1);
67
+ const WHITE = [1, 1, 1, 1];
68
+ const FALLBACK_MATERIAL = {};
69
+ //# sourceMappingURL=wireframeWgpuMeshMaterialRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wireframeWgpuMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/wireframeWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@flighthq/scene3d-wgpu",
3
+ "version": "0.2.1-next.840.857425c",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "https://github.com/flighthq/flight.git",
7
+ "directory": "packages/scene3d-wgpu"
8
+ },
9
+ "type": "module",
10
+ "main": "dist/index.js",
11
+ "types": "dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "default": "./dist/index.js"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "src/**/*.test.ts",
21
+ "!dist/**/*.test.js",
22
+ "!dist/**/*.test.d.ts",
23
+ "!dist/**/*.test.js.map",
24
+ "!dist/**/*.test.d.ts.map"
25
+ ],
26
+ "scripts": {
27
+ "build": "tsc -b",
28
+ "clean": "tsc -b --clean",
29
+ "test": "vitest run --config vitest.config.ts",
30
+ "test:watch": "vitest --watch --config vitest.config.ts",
31
+ "prepack": "npm run clean && npm run clean:dist && npm run build",
32
+ "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
33
+ },
34
+ "dependencies": {
35
+ "@flighthq/camera": "0.2.1-next.840.857425c",
36
+ "@flighthq/color": "0.2.1-next.840.857425c",
37
+ "@flighthq/geometry": "0.2.1-next.840.857425c",
38
+ "@flighthq/image": "0.2.1-next.840.857425c",
39
+ "@flighthq/lighting": "0.2.1-next.840.857425c",
40
+ "@flighthq/log": "0.2.1-next.840.857425c",
41
+ "@flighthq/materials": "0.2.1-next.840.857425c",
42
+ "@flighthq/node": "0.2.1-next.840.857425c",
43
+ "@flighthq/render": "0.2.1-next.840.857425c",
44
+ "@flighthq/render-wgpu": "0.2.1-next.840.857425c",
45
+ "@flighthq/scene3d": "0.2.1-next.840.857425c",
46
+ "@flighthq/shading": "0.2.1-next.840.857425c",
47
+ "@flighthq/texture": "0.2.1-next.840.857425c",
48
+ "@flighthq/types": "0.2.1-next.840.857425c"
49
+ },
50
+ "devDependencies": {
51
+ "@flighthq/mesh": "*",
52
+ "@flighthq/particleemitter": "*",
53
+ "typescript": "^5.3.0"
54
+ },
55
+ "description": "WebGPU 3D scene renderer",
56
+ "sideEffects": false
57
+ }
@@ -0,0 +1,90 @@
1
+ import { createCamera3D } from '@flighthq/camera';
2
+ import { createMatrix3, createMatrix4 } from '@flighthq/geometry';
3
+ import { createAnisotropyPbrMaterial } from '@flighthq/materials';
4
+ import { createBoxMeshGeometry } from '@flighthq/mesh';
5
+ import type { Camera3D, Matrix3, Matrix4, Scene3DLightBlock, Scene3DRenderProxy } from '@flighthq/types';
6
+ import { AnisotropyPbrMaterialKind } from '@flighthq/types';
7
+
8
+ import {
9
+ anisotropyPbrWgpuMeshMaterialRenderer,
10
+ registerAnisotropyPbrWgpuMaterial,
11
+ } from './anisotropyPbrWgpuMeshMaterialRenderer';
12
+ import { getWgpuMeshMaterialRenderer } from './wgpuMeshMaterialRegistry';
13
+ import { makeWgpuScene3DState } from './wgpuScene3DTestHelper';
14
+
15
+ function makeCamera(): Camera3D {
16
+ return createCamera3D({ far: 100, near: 0.1, projection: { aspect: 1, fovY: Math.PI / 3, kind: 'perspective' } });
17
+ }
18
+
19
+ function makeLights(): Scene3DLightBlock {
20
+ const data = new Float32Array(12);
21
+ data[1] = -1;
22
+ data[4] = 1;
23
+ data[5] = 1;
24
+ data[6] = 1;
25
+ data[8] = 0.1;
26
+ data[9] = 0.1;
27
+ data[10] = 0.1;
28
+ return { ambientCount: 1, data, directionalCount: 1, hemisphereCount: 0, pointCount: 0, spotCount: 0, version: 1 };
29
+ }
30
+
31
+ function makeProxy(): Scene3DRenderProxy {
32
+ const geometry = createBoxMeshGeometry();
33
+ return {
34
+ material: createAnisotropyPbrMaterial({ anisotropyStrength: 0.6 }),
35
+ normalMatrix: createMatrix3() as Matrix3,
36
+ subset: geometry.subsets[0],
37
+ worldMatrix: createMatrix4() as Matrix4,
38
+ };
39
+ }
40
+
41
+ describe('anisotropyPbrWgpuMeshMaterialRenderer', () => {
42
+ it('bind selects a pipeline and binds frame + material groups + uploads uniforms', () => {
43
+ const { fake, state } = makeWgpuScene3DState();
44
+ anisotropyPbrWgpuMeshMaterialRenderer.bind(
45
+ state,
46
+ createAnisotropyPbrMaterial({ anisotropyStrength: 0.6 }),
47
+ makeLights(),
48
+ makeCamera(),
49
+ );
50
+
51
+ expect(fake.calls.some((c) => c.name === 'createRenderPipeline')).toBe(true);
52
+ expect(fake.calls.some((c) => c.name === 'setPipeline')).toBe(true);
53
+ expect(fake.calls.filter((c) => c.name === 'setBindGroup').length).toBeGreaterThanOrEqual(2);
54
+ expect(fake.calls.some((c) => c.name === 'writeBuffer')).toBe(true);
55
+ });
56
+
57
+ it('bind compiles the ANISOTROPY extension variant', () => {
58
+ const { fake, state } = makeWgpuScene3DState();
59
+ anisotropyPbrWgpuMeshMaterialRenderer.bind(state, createAnisotropyPbrMaterial(), makeLights(), makeCamera());
60
+ const moduleCall = fake.calls.find((c) => c.name === 'createShaderModule');
61
+ const code = (moduleCall!.args[0] as { code: string }).code;
62
+ expect(code).toContain('const ANISOTROPY : bool = true;');
63
+ });
64
+
65
+ it('draw uploads geometry and issues an indexed draw over the subset range', () => {
66
+ const { fake, state } = makeWgpuScene3DState();
67
+ const proxy = makeProxy();
68
+ anisotropyPbrWgpuMeshMaterialRenderer.bind(state, proxy.material, makeLights(), makeCamera());
69
+ anisotropyPbrWgpuMeshMaterialRenderer.draw(state, proxy, createBoxMeshGeometry());
70
+
71
+ const drawCall = fake.calls.find((c) => c.name === 'drawIndexed');
72
+ expect(drawCall).toBeDefined();
73
+ expect(drawCall!.args[0]).toBe(proxy.subset.indexCount);
74
+ expect(drawCall!.args[2]).toBe(proxy.subset.indexOffset);
75
+ });
76
+
77
+ it('draw is a no-op when bind has not selected a pipeline', () => {
78
+ const { fake, state } = makeWgpuScene3DState();
79
+ anisotropyPbrWgpuMeshMaterialRenderer.draw(state, makeProxy(), createBoxMeshGeometry());
80
+ expect(fake.calls.some((c) => c.name === 'drawIndexed')).toBe(false);
81
+ });
82
+ });
83
+
84
+ describe('registerAnisotropyPbrWgpuMaterial', () => {
85
+ it('installs the renderer for AnisotropyPbrMaterialKind', () => {
86
+ const { state } = makeWgpuScene3DState();
87
+ registerAnisotropyPbrWgpuMaterial(state);
88
+ expect(getWgpuMeshMaterialRenderer(state, AnisotropyPbrMaterialKind)).toBe(anisotropyPbrWgpuMeshMaterialRenderer);
89
+ });
90
+ });