super-three 0.133.3 → 0.136.0

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 (354) hide show
  1. package/build/three.js +1059 -783
  2. package/build/three.min.js +1 -1
  3. package/build/three.module.js +1424 -895
  4. package/examples/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff +0 -0
  5. package/examples/fonts/open-sans/open-sans-v15-cyrillic-ext_greek_greek-ext_cyrillic_latin_latin-ext_vietnamese-regular.woff2 +0 -0
  6. package/examples/fonts/open-sans/open-sans.css +9 -0
  7. package/examples/fonts/tabler-icons/fonts/tabler-icons.eot +0 -0
  8. package/examples/fonts/tabler-icons/fonts/tabler-icons.svg +3966 -0
  9. package/examples/fonts/tabler-icons/fonts/tabler-icons.ttf +0 -0
  10. package/examples/fonts/tabler-icons/fonts/tabler-icons.woff +0 -0
  11. package/examples/fonts/tabler-icons/fonts/tabler-icons.woff2 +0 -0
  12. package/examples/fonts/tabler-icons/tabler-icons.min.css +4 -0
  13. package/examples/js/animation/CCDIKSolver.js +0 -1
  14. package/examples/js/animation/MMDPhysics.js +1 -3
  15. package/examples/js/controls/ArcballControls.js +99 -72
  16. package/examples/js/controls/DragControls.js +7 -0
  17. package/examples/js/controls/OrbitControls.js +5 -36
  18. package/examples/js/controls/TrackballControls.js +3 -2
  19. package/examples/js/controls/TransformControls.js +24 -1
  20. package/examples/js/csm/CSM.js +2 -2
  21. package/examples/js/csm/CSMFrustum.js +133 -0
  22. package/examples/js/curves/CurveExtras.js +0 -2
  23. package/examples/js/effects/AsciiEffect.js +2 -9
  24. package/examples/js/exporters/GLTFExporter.js +148 -64
  25. package/examples/js/exporters/USDZExporter.js +45 -26
  26. package/examples/js/geometries/TeapotGeometry.js +0 -1
  27. package/examples/js/interactive/SelectionBox.js +2 -0
  28. package/examples/js/interactive/SelectionHelper.js +22 -7
  29. package/examples/js/lights/RectAreaLightUniformsLib.js +4 -0
  30. package/examples/js/lines/LineMaterial.js +58 -20
  31. package/examples/js/lines/LineSegments2.js +29 -24
  32. package/examples/js/loaders/3DMLoader.js +24 -11
  33. package/examples/js/loaders/3MFLoader.js +2 -2
  34. package/examples/js/loaders/AMFLoader.js +0 -2
  35. package/examples/js/loaders/ColladaLoader.js +61 -4
  36. package/examples/js/loaders/EXRLoader.js +185 -262
  37. package/examples/js/loaders/FBXLoader.js +4 -5
  38. package/examples/js/loaders/GLTFLoader.js +96 -33
  39. package/examples/js/loaders/HDRCubeTextureLoader.js +0 -8
  40. package/examples/js/loaders/KTX2Loader.js +23 -2
  41. package/examples/js/loaders/KTXLoader.js +1 -1
  42. package/examples/js/loaders/LDrawLoader.js +26 -30
  43. package/examples/js/loaders/LUT3dlLoader.js +2 -0
  44. package/examples/js/loaders/LUTCubeLoader.js +2 -0
  45. package/examples/js/loaders/LWOLoader.js +8 -6
  46. package/examples/js/loaders/LogLuvLoader.js +766 -0
  47. package/examples/js/loaders/MMDLoader.js +0 -1
  48. package/examples/js/loaders/NRRDLoader.js +9 -2
  49. package/examples/js/loaders/OBJLoader.js +0 -2
  50. package/examples/js/loaders/PLYLoader.js +33 -8
  51. package/examples/js/loaders/RGBELoader.js +2 -16
  52. package/examples/js/loaders/RGBMLoader.js +55 -5
  53. package/examples/js/loaders/SVGLoader.js +9 -5
  54. package/examples/js/loaders/TDSLoader.js +237 -271
  55. package/examples/js/loaders/VOXLoader.js +1 -0
  56. package/examples/js/loaders/VRMLLoader.js +2 -1
  57. package/examples/js/loaders/lwo/LWO2Parser.js +1 -0
  58. package/examples/js/loaders/lwo/LWO3Parser.js +4 -2
  59. package/examples/js/math/ImprovedNoise.js +1 -1
  60. package/examples/js/misc/GPUComputationRenderer.js +3 -1
  61. package/examples/js/objects/Lensflare.js +2 -10
  62. package/examples/js/objects/MarchingCubes.js +42 -128
  63. package/examples/js/objects/Reflector.js +7 -0
  64. package/examples/js/objects/Refractor.js +7 -0
  65. package/examples/js/objects/Sky.js +1 -1
  66. package/examples/js/objects/Water.js +2 -2
  67. package/examples/js/objects/Water2.js +4 -7
  68. package/examples/js/postprocessing/GlitchPass.js +3 -1
  69. package/examples/js/postprocessing/SSAOPass.js +1 -0
  70. package/examples/js/renderers/CSS2DRenderer.js +4 -4
  71. package/examples/js/renderers/CSS3DRenderer.js +4 -4
  72. package/examples/js/shaders/ConvolutionShader.js +0 -1
  73. package/examples/js/shaders/FXAAShader.js +1 -1
  74. package/examples/js/shaders/FilmShader.js +1 -1
  75. package/examples/js/shaders/GammaCorrectionShader.js +1 -1
  76. package/examples/js/shaders/HorizontalBlurShader.js +1 -2
  77. package/examples/js/shaders/SSRShader.js +1 -1
  78. package/examples/js/shaders/SSRrShader.js +1 -1
  79. package/examples/js/shaders/VerticalBlurShader.js +1 -2
  80. package/examples/js/utils/GeometryUtils.js +1 -1
  81. package/examples/js/utils/RoughnessMipmapper.js +18 -28
  82. package/examples/jsm/animation/CCDIKSolver.js +0 -1
  83. package/examples/jsm/animation/MMDPhysics.js +0 -2
  84. package/examples/jsm/controls/ArcballControls.js +80 -77
  85. package/examples/jsm/controls/DragControls.js +7 -0
  86. package/examples/jsm/controls/OrbitControls.js +9 -51
  87. package/examples/jsm/controls/TrackballControls.js +1 -1
  88. package/examples/jsm/controls/TransformControls.js +24 -1
  89. package/examples/jsm/csm/CSM.js +3 -3
  90. package/examples/jsm/csm/{Frustum.js → CSMFrustum.js} +3 -3
  91. package/examples/jsm/curves/CurveExtras.js +0 -2
  92. package/examples/jsm/effects/AsciiEffect.js +2 -9
  93. package/examples/jsm/exporters/GLTFExporter.js +161 -75
  94. package/examples/jsm/exporters/USDZExporter.js +47 -26
  95. package/examples/jsm/geometries/TeapotGeometry.js +0 -1
  96. package/examples/jsm/interactive/SelectionBox.js +1 -0
  97. package/examples/jsm/interactive/SelectionHelper.js +19 -7
  98. package/examples/jsm/libs/flow.module.js +3338 -0
  99. package/examples/jsm/libs/lil-gui.module.min.js +8 -0
  100. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  101. package/examples/jsm/lights/RectAreaLightUniformsLib.js +7 -0
  102. package/examples/jsm/lines/LineMaterial.js +59 -23
  103. package/examples/jsm/lines/LineSegments2.js +22 -18
  104. package/examples/jsm/loaders/3DMLoader.js +18 -12
  105. package/examples/jsm/loaders/3MFLoader.js +2 -2
  106. package/examples/jsm/loaders/AMFLoader.js +0 -2
  107. package/examples/jsm/loaders/ColladaLoader.js +61 -4
  108. package/examples/jsm/loaders/EXRLoader.js +184 -293
  109. package/examples/jsm/loaders/FBXLoader.js +4 -5
  110. package/examples/jsm/loaders/GLTFLoader.js +101 -37
  111. package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -14
  112. package/examples/jsm/loaders/KTX2Loader.js +30 -2
  113. package/examples/jsm/loaders/KTXLoader.js +1 -1
  114. package/examples/jsm/loaders/LDrawLoader.js +23 -24
  115. package/examples/jsm/loaders/LUT3dlLoader.js +2 -0
  116. package/examples/jsm/loaders/LUTCubeLoader.js +2 -0
  117. package/examples/jsm/loaders/LWOLoader.js +8 -6
  118. package/examples/jsm/loaders/LogLuvLoader.js +606 -0
  119. package/examples/jsm/loaders/MMDLoader.js +0 -1
  120. package/examples/jsm/loaders/NRRDLoader.js +10 -2
  121. package/examples/jsm/loaders/OBJLoader.js +0 -2
  122. package/examples/jsm/loaders/PLYLoader.js +34 -8
  123. package/examples/jsm/loaders/RGBELoader.js +0 -20
  124. package/examples/jsm/loaders/RGBMLoader.js +61 -7
  125. package/examples/jsm/loaders/SVGLoader.js +9 -6
  126. package/examples/jsm/loaders/TDSLoader.js +236 -275
  127. package/examples/jsm/loaders/VOXLoader.js +1 -0
  128. package/examples/jsm/loaders/VRMLLoader.js +2 -1
  129. package/examples/jsm/loaders/lwo/LWO2Parser.js +1 -0
  130. package/examples/jsm/loaders/lwo/LWO3Parser.js +2 -2
  131. package/examples/jsm/math/ImprovedNoise.js +1 -1
  132. package/examples/jsm/misc/GPUComputationRenderer.js +3 -1
  133. package/examples/jsm/node-editor/NodeEditor.js +456 -0
  134. package/examples/jsm/node-editor/accessors/NormalEditor.js +30 -0
  135. package/examples/jsm/node-editor/accessors/PositionEditor.js +30 -0
  136. package/examples/jsm/node-editor/accessors/UVEditor.js +26 -0
  137. package/examples/jsm/node-editor/display/BlendEditor.js +43 -0
  138. package/examples/jsm/node-editor/examples/animate-uv.json +1 -0
  139. package/examples/jsm/node-editor/examples/fake-top-light.json +1 -0
  140. package/examples/jsm/node-editor/examples/oscillator-color.json +1 -0
  141. package/examples/jsm/node-editor/examples/rim.json +1 -0
  142. package/examples/jsm/node-editor/inputs/ColorEditor.js +91 -0
  143. package/examples/jsm/node-editor/inputs/FloatEditor.js +24 -0
  144. package/examples/jsm/node-editor/inputs/SliderEditor.js +68 -0
  145. package/examples/jsm/node-editor/inputs/Vector2Editor.js +28 -0
  146. package/examples/jsm/node-editor/inputs/Vector3Editor.js +30 -0
  147. package/examples/jsm/node-editor/inputs/Vector4Editor.js +37 -0
  148. package/examples/jsm/node-editor/materials/StandardMaterialEditor.js +108 -0
  149. package/examples/jsm/node-editor/math/DotEditor.js +36 -0
  150. package/examples/jsm/node-editor/math/InvertEditor.js +38 -0
  151. package/examples/jsm/node-editor/math/LimiterEditor.js +48 -0
  152. package/examples/jsm/node-editor/math/NormalizeEditor.js +26 -0
  153. package/examples/jsm/node-editor/math/OperatorEditor.js +50 -0
  154. package/examples/jsm/node-editor/math/PowerEditor.js +34 -0
  155. package/examples/jsm/node-editor/math/TrigonometryEditor.js +39 -0
  156. package/examples/jsm/node-editor/procedural/CheckerEditor.js +26 -0
  157. package/examples/jsm/node-editor/utils/OscillatorEditor.js +42 -0
  158. package/examples/jsm/node-editor/utils/TimerEditor.js +57 -0
  159. package/examples/jsm/nodes/core/NodeBuilder.js +2 -2
  160. package/examples/jsm/nodes/materials/StandardNodeMaterial.js +1 -1
  161. package/examples/jsm/nodes/materials/nodes/StandardNode.js +7 -6
  162. package/examples/jsm/nodes/math/MathNode.js +12 -0
  163. package/examples/jsm/nodes/misc/BumpMapNode.js +1 -1
  164. package/examples/jsm/nodes/misc/TextureCubeUVNode.js +1 -4
  165. package/examples/jsm/nodes/utils/ColorSpaceNode.js +1 -164
  166. package/examples/jsm/objects/Lensflare.js +3 -14
  167. package/examples/jsm/objects/MarchingCubes.js +46 -152
  168. package/examples/jsm/objects/Reflector.js +7 -0
  169. package/examples/jsm/objects/Refractor.js +7 -0
  170. package/examples/jsm/objects/Sky.js +1 -1
  171. package/examples/jsm/objects/Water.js +2 -2
  172. package/examples/jsm/objects/Water2.js +4 -8
  173. package/examples/jsm/postprocessing/AdaptiveToneMappingPass.js +1 -1
  174. package/examples/jsm/postprocessing/AfterimagePass.js +1 -1
  175. package/examples/jsm/postprocessing/BloomPass.js +1 -1
  176. package/examples/jsm/postprocessing/BokehPass.js +1 -1
  177. package/examples/jsm/postprocessing/ClearPass.js +1 -1
  178. package/examples/jsm/postprocessing/CubeTexturePass.js +1 -1
  179. package/examples/jsm/postprocessing/DotScreenPass.js +1 -1
  180. package/examples/jsm/postprocessing/EffectComposer.js +3 -3
  181. package/examples/jsm/postprocessing/FilmPass.js +1 -1
  182. package/examples/jsm/postprocessing/GlitchPass.js +4 -2
  183. package/examples/jsm/postprocessing/HalftonePass.js +1 -1
  184. package/examples/jsm/postprocessing/MaskPass.js +1 -1
  185. package/examples/jsm/postprocessing/OutlinePass.js +1 -1
  186. package/examples/jsm/postprocessing/RenderPass.js +1 -1
  187. package/examples/jsm/postprocessing/SAOPass.js +2 -2
  188. package/examples/jsm/postprocessing/SMAAPass.js +1 -1
  189. package/examples/jsm/postprocessing/SSAARenderPass.js +1 -1
  190. package/examples/jsm/postprocessing/SSAOPass.js +2 -1
  191. package/examples/jsm/postprocessing/SSRPass.js +1 -1
  192. package/examples/jsm/postprocessing/SSRrPass.js +1 -1
  193. package/examples/jsm/postprocessing/SavePass.js +1 -1
  194. package/examples/jsm/postprocessing/ShaderPass.js +1 -1
  195. package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
  196. package/examples/jsm/postprocessing/TexturePass.js +1 -1
  197. package/examples/jsm/postprocessing/UnrealBloomPass.js +1 -1
  198. package/examples/jsm/renderers/CSS2DRenderer.js +5 -4
  199. package/examples/jsm/renderers/CSS3DRenderer.js +5 -4
  200. package/examples/jsm/renderers/nodes/Nodes.js +15 -13
  201. package/examples/jsm/renderers/nodes/ShaderNode.js +194 -41
  202. package/examples/jsm/renderers/nodes/accessors/MaterialNode.js +6 -6
  203. package/examples/jsm/renderers/nodes/accessors/ModelViewProjectionNode.js +5 -5
  204. package/examples/jsm/renderers/nodes/accessors/NormalNode.js +14 -3
  205. package/examples/jsm/renderers/nodes/accessors/PointUVNode.js +3 -3
  206. package/examples/jsm/renderers/nodes/accessors/PositionNode.js +15 -5
  207. package/examples/jsm/renderers/nodes/accessors/SkinningNode.js +107 -0
  208. package/examples/jsm/renderers/nodes/accessors/UVNode.js +7 -5
  209. package/examples/jsm/renderers/nodes/core/ArrayInputNode.js +3 -3
  210. package/examples/jsm/renderers/nodes/core/AttributeNode.js +6 -0
  211. package/examples/jsm/renderers/nodes/core/BypassNode.js +38 -0
  212. package/examples/jsm/renderers/nodes/core/CodeNode.js +3 -3
  213. package/examples/jsm/renderers/nodes/core/ContextNode.js +4 -19
  214. package/examples/jsm/renderers/nodes/core/ExpressionNode.js +13 -2
  215. package/examples/jsm/renderers/nodes/core/FunctionNode.js +19 -132
  216. package/examples/jsm/renderers/nodes/core/InputNode.js +13 -3
  217. package/examples/jsm/renderers/nodes/core/Node.js +32 -10
  218. package/examples/jsm/renderers/nodes/core/NodeBuilder.js +146 -128
  219. package/examples/jsm/renderers/nodes/core/NodeFunction.js +22 -0
  220. package/examples/jsm/renderers/nodes/core/NodeFunctionInput.js +4 -4
  221. package/examples/jsm/renderers/nodes/core/NodeKeywords.js +18 -179
  222. package/examples/jsm/renderers/nodes/core/NodeParser.js +11 -0
  223. package/examples/jsm/renderers/nodes/core/NodeVar.js +2 -2
  224. package/examples/jsm/renderers/nodes/core/PropertyNode.js +14 -2
  225. package/examples/jsm/renderers/nodes/core/TempNode.js +10 -13
  226. package/examples/jsm/renderers/nodes/core/VarNode.js +12 -7
  227. package/examples/jsm/renderers/nodes/core/VaryNode.js +23 -8
  228. package/examples/jsm/renderers/nodes/core/constants.js +2 -0
  229. package/examples/jsm/renderers/nodes/display/ColorSpaceNode.js +60 -43
  230. package/examples/jsm/renderers/nodes/display/NormalMapNode.js +21 -22
  231. package/examples/jsm/renderers/nodes/functions/BSDFs.js +64 -101
  232. package/examples/jsm/renderers/nodes/functions/PhysicalMaterialFunctions.js +27 -0
  233. package/examples/jsm/renderers/nodes/inputs/BufferNode.js +25 -0
  234. package/examples/jsm/renderers/nodes/inputs/IntNode.js +17 -0
  235. package/examples/jsm/renderers/nodes/inputs/TextureNode.js +10 -2
  236. package/examples/jsm/renderers/nodes/lights/LightContextNode.js +20 -14
  237. package/examples/jsm/renderers/nodes/lights/LightNode.js +32 -36
  238. package/examples/jsm/renderers/nodes/math/CondNode.js +60 -0
  239. package/examples/jsm/renderers/nodes/math/MathNode.js +90 -37
  240. package/examples/jsm/renderers/nodes/math/OperatorNode.js +124 -31
  241. package/examples/jsm/renderers/nodes/parsers/GLSLNodeFunction.js +137 -0
  242. package/examples/jsm/renderers/nodes/parsers/GLSLNodeParser.js +14 -0
  243. package/examples/jsm/renderers/nodes/parsers/WGSLNodeFunction.js +89 -0
  244. package/examples/jsm/renderers/nodes/parsers/WGSLNodeParser.js +14 -0
  245. package/examples/jsm/renderers/nodes/procedural/CheckerNode.js +7 -9
  246. package/examples/jsm/renderers/nodes/utils/ArrayElementNode.js +31 -0
  247. package/examples/jsm/renderers/nodes/utils/ConvertNode.js +33 -0
  248. package/examples/jsm/renderers/nodes/utils/JoinNode.js +7 -7
  249. package/examples/jsm/renderers/nodes/utils/OscNode.js +58 -0
  250. package/examples/jsm/renderers/nodes/utils/SplitNode.js +18 -8
  251. package/examples/jsm/renderers/nodes/utils/SpriteSheetUVNode.js +7 -7
  252. package/examples/jsm/renderers/nodes/utils/TimerNode.js +1 -1
  253. package/examples/jsm/renderers/webgl/nodes/SlotNode.js +22 -0
  254. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +192 -95
  255. package/examples/jsm/renderers/webgl/nodes/WebGLNodes.js +2 -2
  256. package/examples/jsm/renderers/webgl/nodes/WebGLPhysicalContextNode.js +2 -2
  257. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +1 -1
  258. package/examples/jsm/renderers/webgpu/WebGPUBindings.js +10 -9
  259. package/examples/jsm/renderers/webgpu/WebGPUComputePipelines.js +2 -4
  260. package/examples/jsm/renderers/webgpu/WebGPUProgrammableStage.js +2 -4
  261. package/examples/jsm/renderers/webgpu/WebGPURenderPipeline.js +15 -23
  262. package/examples/jsm/renderers/webgpu/WebGPURenderPipelines.js +44 -65
  263. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +12 -28
  264. package/examples/jsm/renderers/webgpu/WebGPUTextureUtils.js +61 -28
  265. package/examples/jsm/renderers/webgpu/WebGPUTextures.js +34 -27
  266. package/examples/jsm/renderers/webgpu/constants.js +2 -2
  267. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +453 -95
  268. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodes.js +1 -1
  269. package/examples/jsm/shaders/ConvolutionShader.js +0 -1
  270. package/examples/jsm/shaders/FXAAShader.js +1 -1
  271. package/examples/jsm/shaders/FilmShader.js +1 -1
  272. package/examples/jsm/shaders/GammaCorrectionShader.js +1 -1
  273. package/examples/jsm/shaders/HorizontalBlurShader.js +1 -2
  274. package/examples/jsm/shaders/SSRShader.js +1 -1
  275. package/examples/jsm/shaders/SSRrShader.js +1 -1
  276. package/examples/jsm/shaders/VerticalBlurShader.js +1 -2
  277. package/examples/jsm/utils/GeometryUtils.js +1 -1
  278. package/examples/jsm/utils/RoughnessMipmapper.js +19 -31
  279. package/examples/jsm/utils/WorkerPool.js +11 -11
  280. package/examples/jsm/webxr/OculusHandPointerModel.js +6 -6
  281. package/package.json +24 -18
  282. package/src/Three.Legacy.js +18 -0
  283. package/src/Three.js +1 -3
  284. package/src/cameras/StereoCamera.js +8 -7
  285. package/src/constants.js +1 -8
  286. package/src/core/Layers.js +7 -1
  287. package/src/core/Object3D.js +3 -1
  288. package/src/extras/PMREMGenerator.js +23 -109
  289. package/src/extras/core/Interpolations.js +1 -1
  290. package/src/geometries/LatheGeometry.js +70 -47
  291. package/src/helpers/CameraHelper.js +1 -1
  292. package/src/loaders/FileLoader.js +98 -144
  293. package/src/loaders/ImageLoader.js +9 -4
  294. package/src/loaders/LoaderUtils.js +26 -0
  295. package/src/loaders/MaterialLoader.js +7 -4
  296. package/src/loaders/ObjectLoader.js +2 -0
  297. package/src/materials/Material.js +4 -4
  298. package/src/materials/MeshPhysicalMaterial.js +20 -14
  299. package/src/math/Color.js +0 -38
  300. package/src/math/MathUtils.js +5 -16
  301. package/src/math/Ray.js +2 -2
  302. package/src/math/Sphere.js +10 -1
  303. package/src/objects/Skeleton.js +1 -0
  304. package/src/renderers/WebGLMultisampleRenderTarget.js +7 -1
  305. package/src/renderers/WebGLRenderer.js +105 -132
  306. package/src/renderers/shaders/ShaderChunk/bsdfs.glsl.js +2 -2
  307. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +1 -1
  308. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +2 -24
  309. package/src/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl.js +0 -74
  310. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  311. package/src/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl.js +1 -1
  312. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +19 -6
  313. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +28 -2
  314. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +1 -1
  315. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  316. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +1 -1
  317. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +23 -5
  318. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +2 -1
  319. package/src/renderers/shaders/ShaderLib.js +6 -4
  320. package/src/renderers/shaders/UniformsLib.js +1 -2
  321. package/src/renderers/webgl/WebGLCapabilities.js +0 -2
  322. package/src/renderers/webgl/WebGLExtensions.js +1 -0
  323. package/src/renderers/webgl/WebGLMaterials.js +27 -15
  324. package/src/renderers/webgl/WebGLMorphtargets.js +1 -0
  325. package/src/renderers/webgl/WebGLProgram.js +11 -24
  326. package/src/renderers/webgl/WebGLPrograms.js +194 -33
  327. package/src/renderers/webgl/WebGLRenderLists.js +4 -14
  328. package/src/renderers/webgl/WebGLShaderCache.js +120 -0
  329. package/src/renderers/webgl/WebGLShadowMap.js +14 -5
  330. package/src/renderers/webgl/WebGLState.js +76 -17
  331. package/src/renderers/webgl/WebGLTextures.js +367 -61
  332. package/src/renderers/webgl/WebGLUniforms.js +45 -1
  333. package/src/renderers/webxr/WebXRManager.js +77 -109
  334. package/src/scenes/Scene.js +1 -1
  335. package/src/textures/DataTexture.js +0 -2
  336. package/src/textures/DataTexture2DArray.js +0 -2
  337. package/src/textures/DataTexture3D.js +0 -2
  338. package/src/textures/FramebufferTexture.js +25 -0
  339. package/src/textures/Texture.js +6 -0
  340. package/examples/js/controls/DeviceOrientationControls.js +0 -147
  341. package/examples/js/libs/dat.gui.min.js +0 -14
  342. package/examples/jsm/controls/DeviceOrientationControls.js +0 -153
  343. package/examples/jsm/libs/dat.gui.module.js +0 -3575
  344. package/examples/jsm/libs/glslang.js +0 -78
  345. package/examples/jsm/libs/glslang.wasm +0 -0
  346. package/examples/jsm/renderers/nodes/consts/MathConsts.js +0 -7
  347. package/examples/jsm/renderers/nodes/core/ConstNode.js +0 -39
  348. package/examples/jsm/renderers/nodes/core/NodeSlot.js +0 -13
  349. package/examples/jsm/renderers/nodes/core/StructNode.js +0 -80
  350. package/examples/jsm/renderers/nodes/core/StructVarNode.js +0 -75
  351. package/examples/jsm/renderers/nodes/functions/EncodingFunctions.js +0 -99
  352. package/examples/jsm/renderers/nodes/functions/MathFunctions.js +0 -47
  353. package/examples/jsm/renderers/webgpu/nodes/ShaderLib.js +0 -152
  354. package/src/extras/objects/ImmediateRenderObject.js +0 -31
@@ -1,3 +1,5 @@
1
+ import { LinearEncoding } from 'three';
2
+
1
3
  import WebGPUNodeUniformsGroup from './WebGPUNodeUniformsGroup.js';
2
4
  import {
3
5
  FloatNodeUniform, Vector2NodeUniform, Vector3NodeUniform, Vector4NodeUniform,
@@ -6,64 +8,108 @@ import {
6
8
  import WebGPUNodeSampler from './WebGPUNodeSampler.js';
7
9
  import { WebGPUNodeSampledTexture } from './WebGPUNodeSampledTexture.js';
8
10
 
11
+ import WebGPUUniformBuffer from '../WebGPUUniformBuffer.js';
9
12
  import { getVectorLength, getStrideLength } from '../WebGPUBufferUtils.js';
10
13
 
11
- import NodeSlot from '../../nodes/core/NodeSlot.js';
12
14
  import VarNode from '../../nodes/core/VarNode.js';
15
+ import CodeNode from '../../nodes/core/CodeNode.js';
16
+ import BypassNode from '../../nodes/core/BypassNode.js';
17
+ import ExpressionNode from '../../nodes/core/ExpressionNode.js';
13
18
  import NodeBuilder from '../../nodes/core/NodeBuilder.js';
14
19
  import MaterialNode from '../../nodes/accessors/MaterialNode.js';
20
+ import PositionNode from '../../nodes/accessors/PositionNode.js';
15
21
  import NormalNode from '../../nodes/accessors/NormalNode.js';
16
22
  import ModelViewProjectionNode from '../../nodes/accessors/ModelViewProjectionNode.js';
23
+ import SkinningNode from '../../nodes/accessors/SkinningNode.js';
24
+ import ColorSpaceNode from '../../nodes/display/ColorSpaceNode.js';
17
25
  import LightContextNode from '../../nodes/lights/LightContextNode.js';
18
- import ShaderLib from './ShaderLib.js';
19
-
20
- class WebGPUNodeBuilder extends NodeBuilder {
26
+ import OperatorNode from '../../nodes/math/OperatorNode.js';
27
+ import WGSLNodeParser from '../../nodes/parsers/WGSLNodeParser.js';
28
+ import { vec4 } from '../../nodes/ShaderNode.js';
29
+ import { getRoughness } from '../../nodes/functions/PhysicalMaterialFunctions.js';
30
+
31
+ const wgslTypeLib = {
32
+ float: 'f32',
33
+ int: 'i32',
34
+ vec2: 'vec2<f32>',
35
+ vec3: 'vec3<f32>',
36
+ vec4: 'vec4<f32>',
37
+ uvec4: 'vec4<u32>',
38
+ bvec3: 'vec3<bool>',
39
+ mat3: 'mat3x3<f32>',
40
+ mat4: 'mat4x4<f32>'
41
+ };
42
+
43
+ const wgslMethods = {
44
+ dFdx: 'dpdx',
45
+ dFdy: 'dpdy'
46
+ };
47
+
48
+ const wgslPolyfill = {
49
+ lessThanEqual: new CodeNode( `
50
+ fn lessThanEqual( a : vec3<f32>, b : vec3<f32> ) -> vec3<bool> {
51
+
52
+ return vec3<bool>( a.x <= b.x, a.y <= b.y, a.z <= b.z );
21
53
 
22
- constructor( material, renderer, lightNode = null ) {
54
+ }
55
+ ` ),
56
+ mod: new CodeNode( `
57
+ fn mod( x : f32, y : f32 ) -> f32 {
23
58
 
24
- super( material, renderer );
59
+ return x - y * floor( x / y );
25
60
 
26
- this.lightNode = lightNode;
61
+ }
62
+ ` ),
63
+ repeatWrapping: new CodeNode( `
64
+ fn repeatWrapping( uv : vec2<f32>, dimension : vec2<i32> ) -> vec2<i32> {
27
65
 
28
- this.bindings = { vertex: [], fragment: [] };
29
- this.bindingsOffset = { vertex: 0, fragment: 0 };
66
+ let uvScaled = vec2<i32>( uv * vec2<f32>( dimension ) );
30
67
 
31
- this.uniformsGroup = {};
68
+ return ( ( uvScaled % dimension ) + dimension ) % dimension;
32
69
 
33
- this.nativeShader = null;
70
+ }
71
+ ` ),
72
+ inversesqrt: new CodeNode( `
73
+ fn inversesqrt( x : f32 ) -> f32 {
34
74
 
35
- this._parseMaterial();
75
+ return 1.0 / sqrt( x );
36
76
 
37
- }
77
+ }
78
+ ` )
79
+ };
38
80
 
39
- _parseMaterial() {
81
+ class WebGPUNodeBuilder extends NodeBuilder {
40
82
 
41
- const material = this.material;
83
+ constructor( object, renderer, lightNode = null ) {
42
84
 
43
- // get shader
85
+ super( object, renderer, new WGSLNodeParser() );
44
86
 
45
- let shader = null;
87
+ this.lightNode = lightNode;
46
88
 
47
- if ( material.isMeshStandardMaterial ) {
89
+ this.bindings = { vertex: [], fragment: [] };
90
+ this.bindingsOffset = { vertex: 0, fragment: 0 };
48
91
 
49
- shader = ShaderLib.standard;
92
+ this.uniformsGroup = {};
50
93
 
51
- } else {
94
+ this._parseObject();
52
95
 
53
- shader = ShaderLib.common;
96
+ }
54
97
 
55
- }
98
+ _parseObject() {
56
99
 
57
- this.nativeShader = shader;
100
+ const object = this.object;
101
+ const material = this.material;
58
102
 
59
103
  // parse inputs
60
104
 
61
105
  if ( material.isMeshStandardMaterial || material.isMeshBasicMaterial || material.isPointsMaterial || material.isLineBasicMaterial ) {
62
106
 
63
- const mvpNode = new ModelViewProjectionNode();
64
-
65
107
  let lightNode = material.lightNode;
66
108
 
109
+ // VERTEX STAGE
110
+
111
+ let vertex = new PositionNode( PositionNode.GEOMETRY );
112
+
67
113
  if ( lightNode === null && this.lightNode && this.lightNode.hasLights === true ) {
68
114
 
69
115
  lightNode = this.lightNode;
@@ -72,64 +118,124 @@ class WebGPUNodeBuilder extends NodeBuilder {
72
118
 
73
119
  if ( material.positionNode && material.positionNode.isNode ) {
74
120
 
75
- mvpNode.position = material.positionNode;
121
+ const assignPositionNode = new OperatorNode( '=', new PositionNode( PositionNode.LOCAL ), material.positionNode );
122
+
123
+ vertex = new BypassNode( vertex, assignPositionNode );
76
124
 
77
125
  }
78
126
 
79
- this.addSlot( 'vertex', new NodeSlot( mvpNode, 'MVP', 'vec4' ) );
127
+ if ( object.isSkinnedMesh === true ) {
80
128
 
81
- if ( material.alphaTestNode && material.alphaTestNode.isNode ) {
129
+ vertex = new BypassNode( vertex, new SkinningNode( object ) );
82
130
 
83
- this.addSlot( 'fragment', new NodeSlot( material.alphaTestNode, 'ALPHA_TEST', 'float' ) );
131
+ }
84
132
 
85
- } else {
133
+ this.context.vertex = vertex;
86
134
 
87
- this.addSlot( 'fragment', new NodeSlot( new MaterialNode( MaterialNode.ALPHA_TEST ), 'ALPHA_TEST', 'float' ) );
135
+ this.addFlow( 'vertex', new VarNode( new ModelViewProjectionNode(), 'MVP', 'vec4' ) );
88
136
 
89
- }
137
+ // COLOR
138
+
139
+ let colorNode = null;
90
140
 
91
141
  if ( material.colorNode && material.colorNode.isNode ) {
92
142
 
93
- this.addSlot( 'fragment', new NodeSlot( material.colorNode, 'COLOR', 'vec4' ) );
143
+ colorNode = material.colorNode;
94
144
 
95
145
  } else {
96
146
 
97
- this.addSlot( 'fragment', new NodeSlot( new MaterialNode( MaterialNode.COLOR ), 'COLOR', 'vec4' ) );
147
+ colorNode = new MaterialNode( MaterialNode.COLOR );
98
148
 
99
149
  }
100
150
 
151
+ colorNode = this.addFlow( 'fragment', new VarNode( colorNode, 'Color', 'vec4' ) );
152
+
153
+ this.addFlow( 'fragment', new VarNode( colorNode, 'DiffuseColor', 'vec4' ) );
154
+
155
+ // OPACITY
156
+
157
+ let opacityNode = null;
158
+
101
159
  if ( material.opacityNode && material.opacityNode.isNode ) {
102
160
 
103
- this.addSlot( 'fragment', new NodeSlot( material.opacityNode, 'OPACITY', 'float' ) );
161
+ opacityNode = material.opacityNode;
104
162
 
105
163
  } else {
106
164
 
107
- this.addSlot( 'fragment', new NodeSlot( new MaterialNode( MaterialNode.OPACITY ), 'OPACITY', 'float' ) );
165
+ opacityNode = new VarNode( new MaterialNode( MaterialNode.OPACITY ) );
166
+
167
+ }
168
+
169
+ this.addFlow( 'fragment', new VarNode( opacityNode, 'OPACITY', 'float' ) );
170
+
171
+ this.addFlow( 'fragment', new ExpressionNode( 'DiffuseColor.a = DiffuseColor.a * OPACITY;' ) );
172
+
173
+ // ALPHA TEST
174
+
175
+ let alphaTest = null;
176
+
177
+ if ( material.alphaTestNode && material.alphaTestNode.isNode ) {
178
+
179
+ alphaTest = material.alphaTestNode;
180
+
181
+ } else if ( material.alphaTest > 0 ) {
182
+
183
+ alphaTest = new MaterialNode( MaterialNode.ALPHA_TEST );
184
+
185
+ }
186
+
187
+ if ( alphaTest !== null ) {
188
+
189
+ this.addFlow( 'fragment', new VarNode( alphaTest, 'AlphaTest', 'float' ) );
190
+
191
+ this.addFlow( 'fragment', new ExpressionNode( 'if ( DiffuseColor.a <= AlphaTest ) { discard; }' ) );
108
192
 
109
193
  }
110
194
 
111
195
  if ( material.isMeshStandardMaterial ) {
112
196
 
197
+ // METALNESS
198
+
199
+ let metalnessNode = null;
200
+
113
201
  if ( material.metalnessNode && material.metalnessNode.isNode ) {
114
202
 
115
- this.addSlot( 'fragment', new NodeSlot( material.metalnessNode, 'METALNESS', 'float' ) );
203
+ metalnessNode = material.metalnessNode;
116
204
 
117
205
  } else {
118
206
 
119
- this.addSlot( 'fragment', new NodeSlot( new MaterialNode( MaterialNode.METALNESS ), 'METALNESS', 'float' ) );
207
+ metalnessNode = new MaterialNode( MaterialNode.METALNESS );
120
208
 
121
209
  }
122
210
 
211
+ this.addFlow( 'fragment', new VarNode( metalnessNode, 'Metalness', 'float' ) );
212
+
213
+ this.addFlow( 'fragment', new ExpressionNode( 'DiffuseColor = vec4<f32>( DiffuseColor.rgb * ( 1.0 - Metalness ), DiffuseColor.a );' ) );
214
+
215
+ // ROUGHNESS
216
+
217
+ let roughnessNode = null;
218
+
123
219
  if ( material.roughnessNode && material.roughnessNode.isNode ) {
124
220
 
125
- this.addSlot( 'fragment', new NodeSlot( material.roughnessNode, 'ROUGHNESS', 'float' ) );
221
+ roughnessNode = material.roughnessNode;
126
222
 
127
223
  } else {
128
224
 
129
- this.addSlot( 'fragment', new NodeSlot( new MaterialNode( MaterialNode.ROUGHNESS ), 'ROUGHNESS', 'float' ) );
225
+ roughnessNode = new MaterialNode( MaterialNode.ROUGHNESS );
130
226
 
131
227
  }
132
228
 
229
+ roughnessNode = getRoughness( { roughness: roughnessNode } );
230
+
231
+ this.addFlow( 'fragment', new VarNode( roughnessNode, 'Roughness', 'float' ) );
232
+
233
+ // SPECULAR_TINT
234
+
235
+ this.addFlow( 'fragment', new VarNode( new ExpressionNode( 'mix( vec3<f32>( 0.04 ), Color.rgb, Metalness )', 'vec3' ), 'SpecularColor', 'color' ) );
236
+
237
+ // NORMAL_VIEW
238
+
133
239
  let normalNode = null;
134
240
 
135
241
  if ( material.normalNode && material.normalNode.isNode ) {
@@ -142,61 +248,80 @@ class WebGPUNodeBuilder extends NodeBuilder {
142
248
 
143
249
  }
144
250
 
145
- this.addSlot( 'fragment', new NodeSlot( new VarNode( normalNode, 'TransformedNormalView', 'vec3' ), 'NORMAL', 'vec3' ) );
251
+ this.addFlow( 'fragment', new VarNode( normalNode, 'TransformedNormalView', 'vec3' ) );
146
252
 
147
- } else if ( material.isMeshPhongMaterial ) {
253
+ }
148
254
 
149
- if ( material.specularNode && material.specularNode.isNode ) {
255
+ // LIGHT
150
256
 
151
- this.addSlot( 'fragment', new NodeSlot( material.specularNode, 'SPECULAR', 'vec3' ) );
257
+ let outputNode = colorNode;
152
258
 
153
- } else {
259
+ if ( lightNode && lightNode.isNode ) {
154
260
 
155
- this.addSlot( 'fragment', new NodeSlot( new MaterialNode( MaterialNode.SPECULAR ), 'SPECULAR', 'vec3' ) );
261
+ const lightContextNode = new LightContextNode( lightNode );
156
262
 
157
- }
263
+ outputNode = this.addFlow( 'fragment', new VarNode( lightContextNode, 'Light', 'vec3' ) );
158
264
 
159
- if ( material.shininessNode && material.shininessNode.isNode ) {
265
+ }
160
266
 
161
- this.addSlot( 'fragment', new NodeSlot( material.shininessNode, 'SHININESS', 'float' ) );
267
+ // RESULT
162
268
 
163
- } else {
269
+ const outputEncoding = this.renderer.outputEncoding;
164
270
 
165
- this.addSlot( 'fragment', new NodeSlot( new MaterialNode( MaterialNode.SHININESS ), 'SHININESS', 'float' ) );
271
+ if ( outputEncoding !== LinearEncoding ) {
166
272
 
167
- }
273
+ outputNode = new ColorSpaceNode( ColorSpaceNode.LINEAR_TO_LINEAR, vec4( outputNode ) );
274
+ outputNode.fromEncoding( outputEncoding );
168
275
 
169
276
  }
170
277
 
171
- if ( lightNode && lightNode.isNode ) {
278
+ this.addFlow( 'fragment', new VarNode( outputNode, 'Output', 'vec4' ) );
172
279
 
173
- const lightContextNode = new LightContextNode( lightNode );
280
+ }
174
281
 
175
- this.addSlot( 'fragment', new NodeSlot( lightContextNode, 'LIGHT', 'vec3' ) );
282
+ }
176
283
 
177
- }
284
+ addFlowCode( code ) {
285
+
286
+ if ( ! /;\s*$/.test( code ) ) {
287
+
288
+ code += ';';
178
289
 
179
290
  }
180
291
 
292
+ super.addFlowCode( code + '\n\t' );
293
+
181
294
  }
182
295
 
183
- getTexture( textureProperty, uvSnippet, biasSnippet = null ) {
296
+ getTexture( textureProperty, uvSnippet, biasSnippet, shaderStage = this.shaderStage ) {
184
297
 
185
- if ( biasSnippet !== null ) {
298
+ if ( shaderStage === 'fragment' ) {
186
299
 
187
- return `texture( sampler2D( ${textureProperty}, ${textureProperty}_sampler ), ${uvSnippet}, ${biasSnippet} )`;
300
+ return `textureSample( ${textureProperty}, ${textureProperty}_sampler, ${uvSnippet} )`;
188
301
 
189
302
  } else {
190
303
 
191
- return `texture( sampler2D( ${textureProperty}, ${textureProperty}_sampler ), ${uvSnippet} )`;
304
+ this._include( 'repeatWrapping' );
305
+
306
+ const dimension = `textureDimensions( ${textureProperty}, 0 )`;
307
+
308
+ return `textureLoad( ${textureProperty}, repeatWrapping( ${uvSnippet}, ${dimension} ), 0 )`;
192
309
 
193
310
  }
194
311
 
195
312
  }
196
313
 
197
- getPropertyName( node ) {
314
+ getPropertyName( node, shaderStage = this.shaderStage ) {
315
+
316
+ if ( node.isNodeVary === true ) {
198
317
 
199
- if ( node.isNodeUniform === true ) {
318
+ if ( shaderStage === 'vertex' ) {
319
+
320
+ return `NodeVarys.${ node.name }`;
321
+
322
+ }
323
+
324
+ } else if ( node.isNodeUniform === true ) {
200
325
 
201
326
  const name = node.name;
202
327
  const type = node.type;
@@ -205,9 +330,13 @@ class WebGPUNodeBuilder extends NodeBuilder {
205
330
 
206
331
  return name;
207
332
 
333
+ } else if ( type === 'buffer' ) {
334
+
335
+ return `NodeBuffer.${name}`;
336
+
208
337
  } else {
209
338
 
210
- return `nodeUniforms.${name}`;
339
+ return `NodeUniforms.${name}`;
211
340
 
212
341
  }
213
342
 
@@ -245,9 +374,33 @@ class WebGPUNodeBuilder extends NodeBuilder {
245
374
  const lastBinding = bindings[ bindings.length - 1 ];
246
375
  const index = lastBinding && lastBinding.isUniformsGroup ? bindings.length - 1 : bindings.length;
247
376
 
248
- bindings.splice( index, 0, sampler, texture );
377
+ if ( shaderStage === 'fragment' ) {
249
378
 
250
- uniformGPU = [ sampler, texture ];
379
+ bindings.splice( index, 0, sampler, texture );
380
+
381
+ uniformGPU = [ sampler, texture ];
382
+
383
+ } else {
384
+
385
+ bindings.splice( index, 0, texture );
386
+
387
+ uniformGPU = [ texture ];
388
+
389
+
390
+ }
391
+
392
+
393
+ } else if ( type === 'buffer' ) {
394
+
395
+ const buffer = new WebGPUUniformBuffer( 'NodeBuffer', node.value );
396
+
397
+ // add first textures in sequence and group for last
398
+ const lastBinding = bindings[ bindings.length - 1 ];
399
+ const index = lastBinding && lastBinding.isUniformsGroup ? bindings.length - 1 : bindings.length;
400
+
401
+ bindings.splice( index, 0, buffer );
402
+
403
+ uniformGPU = buffer;
251
404
 
252
405
  } else {
253
406
 
@@ -267,7 +420,7 @@ class WebGPUNodeBuilder extends NodeBuilder {
267
420
 
268
421
  uniformGPU = [];
269
422
 
270
- for ( const inputNode of node.value ) {
423
+ for ( const inputNode of node.nodes ) {
271
424
 
272
425
  const uniformNodeGPU = this._getNodeUniform( inputNode, type );
273
426
 
@@ -312,15 +465,49 @@ class WebGPUNodeBuilder extends NodeBuilder {
312
465
  if ( shaderStage === 'vertex' ) {
313
466
 
314
467
  const attributes = this.attributes;
468
+ const length = attributes.length;
315
469
 
316
- for ( let index = 0; index < attributes.length; index ++ ) {
470
+ snippet += '\n';
471
+
472
+ for ( let index = 0; index < length; index ++ ) {
317
473
 
318
474
  const attribute = attributes[ index ];
475
+ const name = attribute.name;
476
+ const type = this.getType( attribute.type );
477
+
478
+ snippet += `\t[[ location( ${index} ) ]] ${ name } : ${ type }`;
479
+
480
+ if ( index + 1 < length ) {
319
481
 
320
- snippet += `layout(location = ${index}) in ${attribute.type} ${attribute.name}; `;
482
+ snippet += ',\n';
483
+
484
+ }
321
485
 
322
486
  }
323
487
 
488
+ snippet += '\n';
489
+
490
+ }
491
+
492
+ return snippet;
493
+
494
+ }
495
+
496
+ getVars( shaderStage ) {
497
+
498
+ let snippet = '';
499
+
500
+ const vars = this.vars[ shaderStage ];
501
+
502
+ for ( let index = 0; index < vars.length; index ++ ) {
503
+
504
+ const variable = vars[ index ];
505
+
506
+ const name = variable.name;
507
+ const type = this.getType( variable.type );
508
+
509
+ snippet += `var ${name} : ${type}; `;
510
+
324
511
  }
325
512
 
326
513
  return snippet;
@@ -331,15 +518,43 @@ class WebGPUNodeBuilder extends NodeBuilder {
331
518
 
332
519
  let snippet = '';
333
520
 
334
- const varys = this.varys;
521
+ if ( shaderStage === 'vertex' ) {
522
+
523
+ snippet += '\t[[ builtin( position ) ]] Vertex: vec4<f32>;\n';
524
+
525
+ const varys = this.varys;
526
+
527
+ for ( let index = 0; index < varys.length; index ++ ) {
528
+
529
+ const vary = varys[ index ];
530
+
531
+ snippet += `\t[[ location( ${index} ) ]] ${ vary.name } : ${ this.getType( vary.type ) };\n`;
532
+
533
+ }
534
+
535
+ snippet = this._getWGSLStruct( 'NodeVarysStruct', snippet );
536
+
537
+ } else if ( shaderStage === 'fragment' ) {
335
538
 
336
- const ioStage = shaderStage === 'vertex' ? 'out' : 'in';
539
+ const varys = this.varys;
337
540
 
338
- for ( let index = 0; index < varys.length; index ++ ) {
541
+ snippet += '\n';
339
542
 
340
- const vary = varys[ index ];
543
+ for ( let index = 0; index < varys.length; index ++ ) {
341
544
 
342
- snippet += `layout(location = ${index}) ${ioStage} ${vary.type} ${vary.name}; `;
545
+ const vary = varys[ index ];
546
+
547
+ snippet += `\t[[ location( ${index} ) ]] ${ vary.name } : ${ this.getType( vary.type ) }`;
548
+
549
+ if ( index + 1 < varys.length ) {
550
+
551
+ snippet += ',\n';
552
+
553
+ }
554
+
555
+ }
556
+
557
+ snippet += '\n';
343
558
 
344
559
  }
345
560
 
@@ -360,12 +575,27 @@ class WebGPUNodeBuilder extends NodeBuilder {
360
575
 
361
576
  if ( uniform.type === 'texture' ) {
362
577
 
363
- snippet += `layout(set = 0, binding = ${index ++}) uniform sampler ${uniform.name}_sampler; `;
364
- snippet += `layout(set = 0, binding = ${index ++}) uniform texture2D ${uniform.name}; `;
578
+ if ( shaderStage === 'fragment' ) {
579
+
580
+ snippet += `[[ group( 0 ), binding( ${index ++} ) ]] var ${uniform.name}_sampler : sampler; `;
581
+
582
+ }
583
+
584
+ snippet += `[[ group( 0 ), binding( ${index ++} ) ]] var ${uniform.name} : texture_2d<f32>; `;
585
+
586
+ } else if ( uniform.type === 'buffer' ) {
587
+
588
+ const bufferNode = uniform.node;
589
+ const bufferType = this.getType( bufferNode.bufferType );
590
+ const bufferCount = bufferNode.bufferCount;
591
+
592
+ const bufferSnippet = `\t${uniform.name} : array< ${bufferType}, ${bufferCount} >;\n`;
593
+
594
+ snippet += this._getWGSLUniforms( 'NodeBuffer', bufferSnippet, index ++ ) + '\n\n';
365
595
 
366
596
  } else {
367
597
 
368
- const vectorType = this.getVectorType( uniform.type );
598
+ const vectorType = this.getType( this.getVectorType( uniform.type ) );
369
599
 
370
600
  if ( Array.isArray( uniform.value ) === true ) {
371
601
 
@@ -375,7 +605,7 @@ class WebGPUNodeBuilder extends NodeBuilder {
375
605
 
376
606
  } else {
377
607
 
378
- groupSnippet += `uniform ${vectorType} ${uniform.name}; `;
608
+ groupSnippet += `\t${uniform.name} : ${ vectorType};\n`;
379
609
 
380
610
  }
381
611
 
@@ -385,7 +615,7 @@ class WebGPUNodeBuilder extends NodeBuilder {
385
615
 
386
616
  if ( groupSnippet ) {
387
617
 
388
- snippet += `layout(set = 0, binding = ${index ++}) uniform NodeUniforms { ${groupSnippet} } nodeUniforms; `;
618
+ snippet += this._getWGSLUniforms( 'NodeUniforms', groupSnippet, index ++ );
389
619
 
390
620
  }
391
621
 
@@ -393,39 +623,91 @@ class WebGPUNodeBuilder extends NodeBuilder {
393
623
 
394
624
  }
395
625
 
396
- build() {
626
+ buildCode() {
397
627
 
398
- const keywords = this.getContextValue( 'keywords' );
628
+ const shadersData = { fragment: {}, vertex: {} };
399
629
 
400
- for ( const shaderStage of [ 'vertex', 'fragment' ] ) {
630
+ for ( const shaderStage in shadersData ) {
401
631
 
402
- this.shaderStage = shaderStage;
632
+ let flow = '// code\n';
633
+ flow += `\t${ this.flowCode[ shaderStage ] }`;
634
+ flow += '\n';
403
635
 
404
- keywords.include( this, this.nativeShader.fragmentShader );
636
+ const flowNodes = this.flowNodes[ shaderStage ];
637
+ const mainNode = flowNodes[ flowNodes.length - 1 ];
405
638
 
406
- }
639
+ for ( const node of flowNodes ) {
640
+
641
+ const flowSlotData = this.getFlowData( shaderStage, node );
642
+ const slotName = node.name;
643
+
644
+ if ( slotName ) {
645
+
646
+ if ( flow.length > 0 ) flow += '\n';
647
+
648
+ flow += `\t// FLOW -> ${ slotName }\n\t`;
649
+
650
+ }
651
+
652
+ flow += `${ flowSlotData.code }\n\t`;
653
+
654
+ if ( node === mainNode ) {
655
+
656
+ flow += '// FLOW RESULT\n\t';
657
+
658
+ if ( shaderStage === 'vertex' ) {
407
659
 
408
- super.build();
660
+ flow += 'NodeVarys.Vertex = ';
409
661
 
410
- this.vertexShader = this._composeShaderCode( this.nativeShader.vertexShader, this.vertexShader );
411
- this.fragmentShader = this._composeShaderCode( this.nativeShader.fragmentShader, this.fragmentShader );
662
+ } else if ( shaderStage === 'fragment' ) {
412
663
 
413
- return this;
664
+ flow += 'return ';
665
+
666
+ }
667
+
668
+ flow += `${ flowSlotData.result };`;
669
+
670
+ }
671
+
672
+ }
673
+
674
+ const stageData = shadersData[ shaderStage ];
675
+
676
+ stageData.uniforms = this.getUniforms( shaderStage );
677
+ stageData.attributes = this.getAttributes( shaderStage );
678
+ stageData.varys = this.getVarys( shaderStage );
679
+ stageData.vars = this.getVars( shaderStage );
680
+ stageData.codes = this.getCodes( shaderStage );
681
+ stageData.flow = flow;
682
+
683
+ }
684
+
685
+ this.vertexShader = this._getWGSLVertexCode( shadersData.vertex );
686
+ this.fragmentShader = this._getWGSLFragmentCode( shadersData.fragment );
414
687
 
415
688
  }
416
689
 
417
- _composeShaderCode( code, snippet ) {
690
+ getMethod( method ) {
418
691
 
419
- // use regex maybe for security?
420
- const versionStrIndex = code.indexOf( '\n' );
692
+ if ( wgslPolyfill[ method ] !== undefined ) {
421
693
 
422
- let finalCode = code.substr( 0, versionStrIndex ) + '\n\n';
694
+ this._include( method );
423
695
 
424
- finalCode += snippet;
696
+ }
425
697
 
426
- finalCode += code.substr( versionStrIndex );
698
+ return wgslMethods[ method ] || method;
427
699
 
428
- return finalCode;
700
+ }
701
+
702
+ getType( type ) {
703
+
704
+ return wgslTypeLib[ type ] || type;
705
+
706
+ }
707
+
708
+ _include( name ) {
709
+
710
+ wgslPolyfill[ name ].build( this );
429
711
 
430
712
  }
431
713
 
@@ -443,6 +725,82 @@ class WebGPUNodeBuilder extends NodeBuilder {
443
725
 
444
726
  }
445
727
 
728
+ _getWGSLVertexCode( shaderData ) {
729
+
730
+ return `${ this.getSignature() }
731
+
732
+ // uniforms
733
+ ${shaderData.uniforms}
734
+
735
+ // varys
736
+ ${shaderData.varys}
737
+
738
+ // codes
739
+ ${shaderData.codes}
740
+
741
+ [[ stage( vertex ) ]]
742
+ fn main( ${shaderData.attributes} ) -> NodeVarysStruct {
743
+
744
+ // system
745
+ var NodeVarys: NodeVarysStruct;
746
+
747
+ // vars
748
+ ${shaderData.vars}
749
+
750
+ // flow
751
+ ${shaderData.flow}
752
+
753
+ return NodeVarys;
754
+
755
+ }
756
+ `;
757
+
758
+ }
759
+
760
+ _getWGSLFragmentCode( shaderData ) {
761
+
762
+ return `${ this.getSignature() }
763
+
764
+ // uniforms
765
+ ${shaderData.uniforms}
766
+
767
+ // codes
768
+ ${shaderData.codes}
769
+
770
+ [[ stage( fragment ) ]]
771
+ fn main( ${shaderData.varys} ) -> [[ location( 0 ) ]] vec4<f32> {
772
+
773
+ // vars
774
+ ${shaderData.vars}
775
+
776
+ // flow
777
+ ${shaderData.flow}
778
+
779
+ }
780
+ `;
781
+
782
+ }
783
+
784
+ _getWGSLStruct( name, vars ) {
785
+
786
+ return `
787
+ struct ${name} {
788
+ \n${vars}
789
+ };`;
790
+
791
+ }
792
+
793
+ _getWGSLUniforms( name, vars, binding = 0, group = 0 ) {
794
+
795
+ const structName = name + 'Struct';
796
+ const structSnippet = this._getWGSLStruct( structName, vars );
797
+
798
+ return `${structSnippet}
799
+ [[ binding( ${binding} ), group( ${group} ) ]]
800
+ var<uniform> ${name} : ${structName};`;
801
+
802
+ }
803
+
446
804
  }
447
805
 
448
806
  export default WebGPUNodeBuilder;