super-three 0.133.4 → 0.136.1

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