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,4 +1,8 @@
1
- import TempNode from '../core/Node.js';
1
+ import TempNode from '../core/TempNode.js';
2
+ import ExpressionNode from '../core/ExpressionNode.js';
3
+ import JoinNode from '../utils/JoinNode.js';
4
+ import SplitNode from '../utils/SplitNode.js';
5
+ import OperatorNode from './OperatorNode.js';
2
6
 
3
7
  class MathNode extends TempNode {
4
8
 
@@ -16,7 +20,6 @@ class MathNode extends TempNode {
16
20
  static CEIL = 'ceil';
17
21
  static NORMALIZE = 'normalize';
18
22
  static FRACT = 'fract';
19
- static SATURATE = 'saturate';
20
23
  static SIN = 'sin';
21
24
  static COS = 'cos';
22
25
  static TAN = 'tan';
@@ -28,6 +31,9 @@ class MathNode extends TempNode {
28
31
  static LENGTH = 'length';
29
32
  static NEGATE = 'negate';
30
33
  static INVERT = 'invert';
34
+ static DFDX = 'dFdx';
35
+ static DFDY = 'dFdy';
36
+ static SATURATE = 'saturate'
31
37
 
32
38
  // 2 inputs
33
39
 
@@ -40,6 +46,7 @@ class MathNode extends TempNode {
40
46
  static DOT = 'dot';
41
47
  static CROSS = 'cross';
42
48
  static POW = 'pow';
49
+ static TRANSFORM_DIRECTION = 'transformDirection';
43
50
 
44
51
  // 3 inputs
45
52
 
@@ -49,39 +56,43 @@ class MathNode extends TempNode {
49
56
  static SMOOTHSTEP = 'smoothstep';
50
57
  static FACEFORWARD = 'faceforward';
51
58
 
52
- constructor( method, a, b = null, c = null ) {
59
+ constructor( method, aNode, bNode = null, cNode = null ) {
53
60
 
54
61
  super();
55
62
 
56
63
  this.method = method;
57
64
 
58
- this.a = a;
59
- this.b = b;
60
- this.c = c;
65
+ this.aNode = aNode;
66
+ this.bNode = bNode;
67
+ this.cNode = cNode;
61
68
 
62
69
  }
63
70
 
64
71
  getInputType( builder ) {
65
72
 
66
- const aLen = this.a.getTypeLength( builder );
67
- const bLen = this.b ? this.b.getTypeLength( builder ) : 0;
68
- const cLen = this.c ? this.c.getTypeLength( builder ) : 0;
73
+ const aType = this.aNode.getNodeType( builder );
74
+ const bType = this.bNode ? this.bNode.getNodeType( builder ) : null;
75
+ const cType = this.cNode ? this.cNode.getNodeType( builder ) : null;
76
+
77
+ const aLen = builder.getTypeLength( aType );
78
+ const bLen = builder.getTypeLength( bType );
79
+ const cLen = builder.getTypeLength( cType );
69
80
 
70
81
  if ( aLen > bLen && aLen > cLen ) {
71
82
 
72
- return this.a.getNodeType( builder );
83
+ return aType;
73
84
 
74
85
  } else if ( bLen > cLen ) {
75
86
 
76
- return this.b.getNodeType( builder );
87
+ return bType;
77
88
 
78
89
  } else if ( cLen > aLen ) {
79
90
 
80
- this.c.getNodeType( builder )
91
+ return cType;
81
92
 
82
93
  }
83
94
 
84
- return this.a.getNodeType( builder );
95
+ return aType;
85
96
 
86
97
  }
87
98
 
@@ -93,7 +104,7 @@ class MathNode extends TempNode {
93
104
 
94
105
  return 'float';
95
106
 
96
- } else if (method === MathNode.CROSS) {
107
+ } else if ( method === MathNode.CROSS ) {
97
108
 
98
109
  return 'vec3';
99
110
 
@@ -105,20 +116,62 @@ class MathNode extends TempNode {
105
116
 
106
117
  }
107
118
 
108
- generate( builder ) {
119
+ generate( builder, output ) {
109
120
 
110
121
  const method = this.method;
111
122
 
112
123
  const type = this.getNodeType( builder );
113
124
  const inputType = this.getInputType( builder );
114
125
 
115
- if ( method === MathNode.NEGATE ) {
126
+ const a = this.aNode;
127
+ const b = this.bNode;
128
+ const c = this.cNode;
129
+
130
+ const isWebGL = builder.renderer.isWebGLRenderer === true;
131
+
132
+ if ( isWebGL && ( method === MathNode.DFDX || method === MathNode.DFDY ) && output === 'vec3' ) {
133
+
134
+ // Workaround for Adreno 3XX dFd*( vec3 ) bug. See #9988
135
+
136
+ return new JoinNode( [
137
+ new MathNode( method, new SplitNode( a, 'x' ) ),
138
+ new MathNode( method, new SplitNode( a, 'y' ) ),
139
+ new MathNode( method, new SplitNode( a, 'z' ) )
140
+ ] ).build( builder );
141
+
142
+ } else if ( method === MathNode.TRANSFORM_DIRECTION ) {
143
+
144
+ // dir can be either a direction vector or a normal vector
145
+ // upper-left 3x3 of matrix is assumed to be orthogonal
146
+
147
+ let tA = a;
148
+ let tB = b;
149
+
150
+ if ( builder.isMatrix( tA.getNodeType( builder ) ) ) {
151
+
152
+ tB = new ExpressionNode( `${ builder.getType( 'vec4' ) }( ${ tB.build( builder, 'vec3' ) }, 0.0 )`, 'vec4' );
153
+
154
+ } else {
155
+
156
+ tA = new ExpressionNode( `${ builder.getType( 'vec4' ) }( ${ tA.build( builder, 'vec3' ) }, 0.0 )`, 'vec4' );
157
+
158
+ }
159
+
160
+ const mulNode = new SplitNode( new OperatorNode( '*', tA, tB ), 'xyz' );
161
+
162
+ return new MathNode( MathNode.NORMALIZE, mulNode ).build( builder );
163
+
164
+ } else if ( method === MathNode.SATURATE ) {
165
+
166
+ return `clamp( ${ a.build( builder, inputType ) }, 0.0, 1.0 )`;
167
+
168
+ } else if ( method === MathNode.NEGATE ) {
116
169
 
117
- return '( -' + this.a.build( builder, inputType ) + ' )';
170
+ return '( -' + a.build( builder, inputType ) + ' )';
118
171
 
119
172
  } else if ( method === MathNode.INVERT ) {
120
173
 
121
- return '( 1.0 - ' + this.a.build( builder, inputType ) + ' )';
174
+ return '( 1.0 - ' + a.build( builder, inputType ) + ' )';
122
175
 
123
176
  } else {
124
177
 
@@ -127,57 +180,57 @@ class MathNode extends TempNode {
127
180
  if ( method === MathNode.CROSS ) {
128
181
 
129
182
  params.push(
130
- this.a.build( builder, type ),
131
- this.b.build( builder, type )
183
+ a.build( builder, type ),
184
+ b.build( builder, type )
132
185
  );
133
186
 
134
187
  } else if ( method === MathNode.STEP ) {
135
188
 
136
189
  params.push(
137
- this.b.build( builder, this.a.getTypeLength( builder ) === 1 ? 'float' : inputType ),
138
- this.b.build( builder, inputType )
190
+ a.build( builder, builder.getTypeLength( a.getNodeType( builder ) ) === 1 ? 'float' : inputType ),
191
+ b.build( builder, inputType )
139
192
  );
140
193
 
141
- } else if ( method === MathNode.MIN || method === MathNode.MAX || method === MathNode.MOD ) {
194
+ } else if ( ( isWebGL && ( method === MathNode.MIN || method === MathNode.MAX ) ) || method === MathNode.MOD ) {
142
195
 
143
196
  params.push(
144
- this.a.build( builder, inputType ),
145
- this.b.build( builder, this.b.getTypeLength( builder ) === 1 ? 'float' : inputType )
197
+ a.build( builder, inputType ),
198
+ b.build( builder, builder.getTypeLength( b.getNodeType( builder ) ) === 1 ? 'float' : inputType )
146
199
  );
147
200
 
148
201
  } else if ( method === MathNode.REFRACT ) {
149
202
 
150
203
  params.push(
151
- this.a.build( builder, inputType ),
152
- this.b.build( builder, inputType ),
153
- this.c.build( builder, 'float' )
204
+ a.build( builder, inputType ),
205
+ b.build( builder, inputType ),
206
+ c.build( builder, 'float' )
154
207
  );
155
208
 
156
209
  } else if ( method === MathNode.MIX ) {
157
210
 
158
211
  params.push(
159
- this.a.build( builder, inputType ),
160
- this.b.build( builder, inputType ),
161
- this.c.build( builder, this.c.getTypeLength( builder ) === 1 ? 'float' : inputType )
212
+ a.build( builder, inputType ),
213
+ b.build( builder, inputType ),
214
+ c.build( builder, builder.getTypeLength( c.getNodeType( builder ) ) === 1 ? 'float' : inputType )
162
215
  );
163
216
 
164
217
  } else {
165
218
 
166
- params.push( this.a.build( builder, inputType ) );
219
+ params.push( a.build( builder, inputType ) );
167
220
 
168
- if ( this.c !== null ) {
221
+ if ( c !== null ) {
169
222
 
170
- params.push( this.b.build( builder, inputType ), this.c.build( builder, inputType ) );
223
+ params.push( b.build( builder, inputType ), c.build( builder, inputType ) );
171
224
 
172
- } else if ( this.b !== null ) {
225
+ } else if ( b !== null ) {
173
226
 
174
- params.push( this.b.build( builder, inputType ) );
227
+ params.push( b.build( builder, inputType ) );
175
228
 
176
229
  }
177
230
 
178
231
  }
179
232
 
180
- return `${method}( ${params.join(', ')} )`;
233
+ return `${ builder.getMethod( method ) }( ${params.join( ', ' )} )`;
181
234
 
182
235
  }
183
236
 
@@ -2,77 +2,170 @@ import TempNode from '../core/TempNode.js';
2
2
 
3
3
  class OperatorNode extends TempNode {
4
4
 
5
- constructor( op, a, b ) {
5
+ constructor( op, aNode, bNode, ...params ) {
6
6
 
7
7
  super();
8
8
 
9
9
  this.op = op;
10
10
 
11
- this.a = a;
12
- this.b = b;
11
+ if ( params.length > 0 ) {
12
+
13
+ let finalBNode = bNode;
14
+
15
+ for ( let i = 0; i < params.length; i ++ ) {
16
+
17
+ finalBNode = new OperatorNode( op, finalBNode, params[ i ] );
18
+
19
+ }
20
+
21
+ bNode = finalBNode;
22
+
23
+ }
24
+
25
+ this.aNode = aNode;
26
+ this.bNode = bNode;
13
27
 
14
28
  }
15
29
 
16
- getNodeType( builder ) {
30
+ getNodeType( builder, output ) {
17
31
 
18
- const typeA = this.a.getNodeType( builder );
19
- const typeB = this.b.getNodeType( builder );
32
+ const op = this.op;
20
33
 
21
- if ( builder.isMatrix( typeA ) && builder.isVector( typeB ) ) {
34
+ const aNode = this.aNode;
35
+ const bNode = this.bNode;
22
36
 
23
- // matrix x vector
37
+ const typeA = aNode.getNodeType( builder );
38
+ const typeB = bNode.getNodeType( builder );
24
39
 
25
- return builder.getVectorFromMatrix( typeA );
40
+ if ( typeA === 'void' || typeB === 'void' ) {
26
41
 
27
- } else if ( builder.isVector( typeA ) && builder.isMatrix( typeB ) ) {
42
+ return 'void';
28
43
 
29
- // vector x matrix
44
+ } else if ( op === '=' ) {
30
45
 
31
- return builder.getVectorFromMatrix( typeB );
46
+ return typeA;
32
47
 
33
- } else if ( builder.getTypeLength( typeB ) > builder.getTypeLength( typeA ) ) {
48
+ } else if ( op === '==' || op === '&&' ) {
34
49
 
35
- // anytype x anytype: use the greater length vector
50
+ return 'bool';
36
51
 
37
- return typeB;
52
+ } else if ( op === '<=' || op === '>' ) {
38
53
 
39
- }
54
+ const length = builder.getTypeLength( output );
55
+
56
+ return length > 1 ? `bvec${ length }` : 'bool';
57
+
58
+ } else {
59
+
60
+ if ( typeA === 'float' && builder.isMatrix( typeB ) ) {
40
61
 
41
- return typeA;
62
+ return typeB;
63
+
64
+ } else if ( builder.isMatrix( typeA ) && builder.isVector( typeB ) ) {
65
+
66
+ // matrix x vector
67
+
68
+ return builder.getVectorFromMatrix( typeA );
69
+
70
+ } else if ( builder.isVector( typeA ) && builder.isMatrix( typeB ) ) {
71
+
72
+ // vector x matrix
73
+
74
+ return builder.getVectorFromMatrix( typeB );
75
+
76
+ } else if ( builder.getTypeLength( typeB ) > builder.getTypeLength( typeA ) ) {
77
+
78
+ // anytype x anytype: use the greater length vector
79
+
80
+ return typeB;
81
+
82
+ }
83
+
84
+ return typeA;
85
+
86
+ }
42
87
 
43
88
  }
44
89
 
45
90
  generate( builder, output ) {
46
91
 
47
- let typeA = this.a.getNodeType( builder );
48
- let typeB = this.b.getNodeType( builder );
92
+ const op = this.op;
49
93
 
50
- let type = this.getNodeType( builder );
94
+ const aNode = this.aNode;
95
+ const bNode = this.bNode;
51
96
 
52
- if ( builder.isMatrix( typeA ) && builder.isVector( typeB ) ) {
97
+ const type = this.getNodeType( builder, output );
53
98
 
54
- // matrix x vector
99
+ let typeA = null;
100
+ let typeB = null;
55
101
 
56
- type = typeB = builder.getVectorFromMatrix( typeA );
102
+ if ( type !== 'void' ) {
57
103
 
58
- } else if ( builder.isVector( typeA ) && builder.isMatrix( typeB ) ) {
104
+ typeA = aNode.getNodeType( builder );
105
+ typeB = bNode.getNodeType( builder );
59
106
 
60
- // vector x matrix
107
+ if ( op === '=' ) {
61
108
 
62
- type = typeB = builder.getVectorFromMatrix( typeB );
109
+ typeB = typeA;
63
110
 
64
- } else {
111
+ } else if ( builder.isMatrix( typeA ) && builder.isVector( typeB ) ) {
112
+
113
+ // matrix x vector
114
+
115
+ typeB = builder.getVectorFromMatrix( typeA );
116
+
117
+ } else if ( builder.isVector( typeA ) && builder.isMatrix( typeB ) ) {
118
+
119
+ // vector x matrix
120
+
121
+ typeA = builder.getVectorFromMatrix( typeB );
122
+
123
+ } else {
65
124
 
66
- // anytype x anytype
125
+ // anytype x anytype
126
+
127
+ typeA = typeB = type;
128
+
129
+ }
130
+
131
+ } else {
67
132
 
68
133
  typeA = typeB = type;
69
134
 
70
135
  }
71
136
 
72
- const a = this.a.build( builder, typeA );
73
- const b = this.b.build( builder, typeB );
137
+ const a = aNode.build( builder, typeA );
138
+ const b = bNode.build( builder, typeB );
139
+
140
+ const outputLength = builder.getTypeLength( output );
141
+
142
+ if ( output !== 'void' ) {
74
143
 
75
- return `( ${a} ${this.op} ${b} )`;
144
+ if ( op === '=' ) {
145
+
146
+ builder.addFlowCode( `${a} ${this.op} ${b}` );
147
+
148
+ return a;
149
+
150
+ } else if ( op === '>' && outputLength > 1 ) {
151
+
152
+ return `${ builder.getMethod( 'greaterThan' ) }( ${a}, ${b} )`;
153
+
154
+ } else if ( op === '<=' && outputLength > 1 ) {
155
+
156
+ return `${ builder.getMethod( 'lessThanEqual' ) }( ${a}, ${b} )`;
157
+
158
+ } else {
159
+
160
+ return `( ${a} ${this.op} ${b} )`;
161
+
162
+ }
163
+
164
+ } else if ( typeA !== 'void' ) {
165
+
166
+ return `${a} ${this.op} ${b}`;
167
+
168
+ }
76
169
 
77
170
  }
78
171
 
@@ -0,0 +1,137 @@
1
+ import NodeFunction from '../core/NodeFunction.js';
2
+ import NodeFunctionInput from '../core/NodeFunctionInput.js';
3
+
4
+ const declarationRegexp = /^\s*(highp|mediump|lowp)?\s*([a-z_0-9]+)\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)/i;
5
+ const propertiesRegexp = /[a-z_0-9]+/ig;
6
+
7
+ const pragmaMain = '#pragma main';
8
+
9
+ const parse = ( source ) => {
10
+
11
+ source = source.trim();
12
+
13
+ const pragmaMainIndex = source.indexOf( pragmaMain );
14
+
15
+ const mainCode = pragmaMainIndex !== - 1 ? source.substr( pragmaMainIndex + pragmaMain.length ) : source;
16
+
17
+ const declaration = mainCode.match( declarationRegexp );
18
+
19
+ if ( declaration !== null && declaration.length === 5 ) {
20
+
21
+ // tokenizer
22
+
23
+ const inputsCode = declaration[ 4 ];
24
+ const propsMatches = [];
25
+
26
+ let nameMatch = null;
27
+
28
+ while ( ( nameMatch = propertiesRegexp.exec( inputsCode ) ) !== null ) {
29
+
30
+ propsMatches.push( nameMatch );
31
+
32
+ }
33
+
34
+ // parser
35
+
36
+ const inputs = [];
37
+
38
+ let i = 0;
39
+
40
+ while ( i < propsMatches.length ) {
41
+
42
+ const isConst = propsMatches[ i ][ 0 ] === 'const';
43
+
44
+ if ( isConst === true ) {
45
+
46
+ i ++;
47
+
48
+ }
49
+
50
+ let qualifier = propsMatches[ i ][ 0 ];
51
+
52
+ if ( qualifier === 'in' || qualifier === 'out' || qualifier === 'inout' ) {
53
+
54
+ i ++;
55
+
56
+ } else {
57
+
58
+ qualifier = '';
59
+
60
+ }
61
+
62
+ const type = propsMatches[ i ++ ][ 0 ];
63
+
64
+ let count = Number.parseInt( propsMatches[ i ][ 0 ] );
65
+
66
+ if ( Number.isNaN( count ) === false ) i ++;
67
+ else count = null;
68
+
69
+ const name = propsMatches[ i ++ ][ 0 ];
70
+
71
+ inputs.push( new NodeFunctionInput( type, name, count, qualifier, isConst ) );
72
+
73
+ }
74
+
75
+ //
76
+
77
+ const blockCode = mainCode.substring( declaration[ 0 ].length );
78
+
79
+ const name = declaration[ 3 ] !== undefined ? declaration[ 3 ] : '';
80
+ const type = declaration[ 2 ];
81
+
82
+ const presicion = declaration[ 1 ] !== undefined ? declaration[ 1 ] : '';
83
+
84
+ const headerCode = pragmaMainIndex !== - 1 ? source.substr( 0, pragmaMainIndex ) : '';
85
+
86
+ return {
87
+ type,
88
+ inputs,
89
+ name,
90
+ presicion,
91
+ inputsCode,
92
+ blockCode,
93
+ headerCode
94
+ };
95
+
96
+ } else {
97
+
98
+ throw new Error( 'FunctionNode: Function is not a GLSL code.' );
99
+
100
+ }
101
+
102
+ };
103
+
104
+ class GLSLNodeFunction extends NodeFunction {
105
+
106
+ constructor( source ) {
107
+
108
+ const { type, inputs, name, presicion, inputsCode, blockCode, headerCode } = parse( source );
109
+
110
+ super( type, inputs, name, presicion );
111
+
112
+ this.inputsCode = inputsCode;
113
+ this.blockCode = blockCode;
114
+ this.headerCode = headerCode;
115
+
116
+ }
117
+
118
+ getCode( name = this.name ) {
119
+
120
+ const headerCode = this.headerCode;
121
+ const presicion = this.presicion;
122
+
123
+ let declarationCode = `${ this.type } ${ name } ( ${ this.inputsCode.trim() } )`;
124
+
125
+ if ( presicion !== '' ) {
126
+
127
+ declarationCode = `${ presicion } ${ declarationCode }`;
128
+
129
+ }
130
+
131
+ return headerCode + declarationCode + this.blockCode;
132
+
133
+ }
134
+
135
+ }
136
+
137
+ export default GLSLNodeFunction;
@@ -0,0 +1,14 @@
1
+ import NodeParser from '../core/NodeParser.js';
2
+ import GLSLNodeFunction from './GLSLNodeFunction.js';
3
+
4
+ class GLSLNodeParser extends NodeParser {
5
+
6
+ parseFunction( source ) {
7
+
8
+ return new GLSLNodeFunction( source );
9
+
10
+ }
11
+
12
+ }
13
+
14
+ export default GLSLNodeParser;
@@ -0,0 +1,89 @@
1
+ import NodeFunction from '../core/NodeFunction.js';
2
+ import NodeFunctionInput from '../core/NodeFunctionInput.js';
3
+
4
+ const declarationRegexp = /^fn\s*([a-z_0-9]+)?\s*\(([\s\S]*?)\)\s*\-\>\s*([a-z_0-9]+)?/i;
5
+ const propertiesRegexp = /[a-z_0-9]+/ig;
6
+
7
+ const parse = ( source ) => {
8
+
9
+ source = source.trim();
10
+
11
+ const declaration = source.match( declarationRegexp );
12
+
13
+ if ( declaration !== null && declaration.length === 4 ) {
14
+
15
+ // tokenizer
16
+
17
+ const inputsCode = declaration[ 2 ];
18
+ const propsMatches = [];
19
+
20
+ let nameMatch = null;
21
+
22
+ while ( ( nameMatch = propertiesRegexp.exec( inputsCode ) ) !== null ) {
23
+
24
+ propsMatches.push( nameMatch );
25
+
26
+ }
27
+
28
+ // parser
29
+
30
+ const inputs = [];
31
+
32
+ let i = 0;
33
+
34
+ while ( i < propsMatches.length ) {
35
+
36
+ const name = propsMatches[ i ++ ][ 0 ];
37
+ const type = propsMatches[ i ++ ][ 0 ];
38
+
39
+ propsMatches[ i ++ ][ 0 ]; // precision
40
+
41
+ inputs.push( new NodeFunctionInput( type, name ) );
42
+
43
+ }
44
+
45
+ //
46
+
47
+ const blockCode = source.substring( declaration[ 0 ].length );
48
+
49
+ const name = declaration[ 1 ] !== undefined ? declaration[ 1 ] : '';
50
+ const type = declaration[ 3 ];
51
+
52
+ return {
53
+ type,
54
+ inputs,
55
+ name,
56
+ inputsCode,
57
+ blockCode
58
+ };
59
+
60
+ } else {
61
+
62
+ throw new Error( 'FunctionNode: Function is not a WGSL code.' );
63
+
64
+ }
65
+
66
+ };
67
+
68
+ class WGSLNodeFunction extends NodeFunction {
69
+
70
+ constructor( source ) {
71
+
72
+ const { type, inputs, name, inputsCode, blockCode } = parse( source );
73
+
74
+ super( type, inputs, name );
75
+
76
+ this.inputsCode = inputsCode;
77
+ this.blockCode = blockCode;
78
+
79
+ }
80
+
81
+ getCode( name = this.name ) {
82
+
83
+ return `fn ${ name } ( ${ this.inputsCode.trim() } ) -> ${ this.type }` + this.blockCode;
84
+
85
+ }
86
+
87
+ }
88
+
89
+ export default WGSLNodeFunction;
@@ -0,0 +1,14 @@
1
+ import NodeParser from '../core/NodeParser.js';
2
+ import WGSLNodeFunction from './WGSLNodeFunction.js';
3
+
4
+ class WGSLNodeParser extends NodeParser {
5
+
6
+ parseFunction( source ) {
7
+
8
+ return new WGSLNodeFunction( source );
9
+
10
+ }
11
+
12
+ }
13
+
14
+ export default WGSLNodeParser;