super-three 0.177.0 → 0.181.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 (501) hide show
  1. package/README.md +1 -1
  2. package/build/three.cjs +1994 -749
  3. package/build/three.core.js +1358 -506
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +631 -247
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +113 -33
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +9571 -3424
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +9397 -3426
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  14. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  15. package/examples/jsm/Addons.js +2 -3
  16. package/examples/jsm/animation/CCDIKSolver.js +1 -1
  17. package/examples/jsm/capabilities/WebGL.js +0 -27
  18. package/examples/jsm/capabilities/WebGPU.js +1 -1
  19. package/examples/jsm/controls/ArcballControls.js +9 -9
  20. package/examples/jsm/controls/DragControls.js +7 -57
  21. package/examples/jsm/controls/FirstPersonControls.js +3 -3
  22. package/examples/jsm/controls/FlyControls.js +1 -1
  23. package/examples/jsm/controls/OrbitControls.js +2 -2
  24. package/examples/jsm/controls/PointerLockControls.js +2 -10
  25. package/examples/jsm/controls/TrackballControls.js +1 -1
  26. package/examples/jsm/controls/TransformControls.js +62 -15
  27. package/examples/jsm/csm/CSMShadowNode.js +4 -4
  28. package/examples/jsm/effects/AsciiEffect.js +8 -8
  29. package/examples/jsm/environments/RoomEnvironment.js +8 -3
  30. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  31. package/examples/jsm/exporters/EXRExporter.js +1 -1
  32. package/examples/jsm/exporters/GLTFExporter.js +33 -25
  33. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  34. package/examples/jsm/exporters/PLYExporter.js +1 -1
  35. package/examples/jsm/exporters/USDZExporter.js +683 -299
  36. package/examples/jsm/geometries/DecalGeometry.js +2 -2
  37. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  38. package/examples/jsm/geometries/RoundedBoxGeometry.js +47 -8
  39. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  40. package/examples/jsm/geometries/TextGeometry.js +3 -2
  41. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  42. package/examples/jsm/helpers/ViewHelper.js +43 -5
  43. package/examples/jsm/inspector/Inspector.js +427 -0
  44. package/examples/jsm/inspector/RendererInspector.js +415 -0
  45. package/examples/jsm/inspector/tabs/Console.js +204 -0
  46. package/examples/jsm/inspector/tabs/Parameters.js +332 -0
  47. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  48. package/examples/jsm/inspector/tabs/Viewer.js +166 -0
  49. package/examples/jsm/inspector/ui/Graph.js +95 -0
  50. package/examples/jsm/inspector/ui/Item.js +170 -0
  51. package/examples/jsm/inspector/ui/List.js +75 -0
  52. package/examples/jsm/inspector/ui/Profiler.js +170 -0
  53. package/examples/jsm/inspector/ui/Style.js +654 -0
  54. package/examples/jsm/inspector/ui/Tab.js +46 -0
  55. package/examples/jsm/inspector/ui/Values.js +423 -0
  56. package/examples/jsm/inspector/ui/utils.js +56 -0
  57. package/examples/jsm/interactive/HTMLMesh.js +11 -13
  58. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  59. package/examples/jsm/interactive/SelectionBox.js +30 -0
  60. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  61. package/examples/jsm/libs/meshopt_decoder.module.js +75 -58
  62. package/examples/jsm/lights/LightProbeGenerator.js +14 -3
  63. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  64. package/examples/jsm/lines/Line2.js +3 -3
  65. package/examples/jsm/lines/LineGeometry.js +1 -1
  66. package/examples/jsm/lines/LineSegments2.js +2 -2
  67. package/examples/jsm/lines/Wireframe.js +2 -2
  68. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  69. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  70. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  71. package/examples/jsm/loaders/3MFLoader.js +1 -1
  72. package/examples/jsm/loaders/ColladaLoader.js +4 -4
  73. package/examples/jsm/loaders/DDSLoader.js +1 -1
  74. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  75. package/examples/jsm/loaders/EXRLoader.js +210 -22
  76. package/examples/jsm/loaders/FBXLoader.js +4 -4
  77. package/examples/jsm/loaders/FontLoader.js +23 -5
  78. package/examples/jsm/loaders/GLTFLoader.js +14 -8
  79. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  80. package/examples/jsm/loaders/HDRLoader.js +486 -0
  81. package/examples/jsm/loaders/KTX2Loader.js +136 -49
  82. package/examples/jsm/loaders/KTXLoader.js +2 -2
  83. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  84. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  85. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  86. package/examples/jsm/loaders/LWOLoader.js +2 -2
  87. package/examples/jsm/loaders/MaterialXLoader.js +233 -34
  88. package/examples/jsm/loaders/OBJLoader.js +1 -1
  89. package/examples/jsm/loaders/PDBLoader.js +1 -1
  90. package/examples/jsm/loaders/RGBELoader.js +7 -473
  91. package/examples/jsm/loaders/SVGLoader.js +2 -2
  92. package/examples/jsm/loaders/TTFLoader.js +13 -1
  93. package/examples/jsm/loaders/USDLoader.js +219 -0
  94. package/examples/jsm/loaders/USDZLoader.js +4 -892
  95. package/examples/jsm/loaders/UltraHDRLoader.js +2 -2
  96. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  97. package/examples/jsm/loaders/usd/USDAParser.js +741 -0
  98. package/examples/jsm/loaders/usd/USDCParser.js +17 -0
  99. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  100. package/examples/jsm/math/ColorSpaces.js +19 -1
  101. package/examples/jsm/math/ConvexHull.js +3 -3
  102. package/examples/jsm/math/ImprovedNoise.js +1 -1
  103. package/examples/jsm/math/Lut.js +2 -2
  104. package/examples/jsm/math/SimplexNoise.js +1 -1
  105. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  106. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  107. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  108. package/examples/jsm/misc/TubePainter.js +383 -40
  109. package/examples/jsm/misc/Volume.js +1 -1
  110. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  111. package/examples/jsm/objects/LensflareMesh.js +3 -3
  112. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  113. package/examples/jsm/objects/Sky.js +1 -1
  114. package/examples/jsm/objects/SkyMesh.js +3 -3
  115. package/examples/jsm/objects/Water.js +3 -3
  116. package/examples/jsm/objects/WaterMesh.js +6 -6
  117. package/examples/jsm/physics/RapierPhysics.js +95 -16
  118. package/examples/jsm/postprocessing/GTAOPass.js +10 -9
  119. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  120. package/examples/jsm/postprocessing/OutlinePass.js +17 -17
  121. package/examples/jsm/postprocessing/SSAOPass.js +10 -9
  122. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  123. package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
  124. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  125. package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
  126. package/examples/jsm/renderers/SVGRenderer.js +1 -1
  127. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  128. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  129. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  130. package/examples/jsm/shaders/BokehShader.js +1 -1
  131. package/examples/jsm/shaders/BokehShader2.js +1 -1
  132. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  133. package/examples/jsm/shaders/FocusShader.js +1 -1
  134. package/examples/jsm/shaders/GTAOShader.js +2 -2
  135. package/examples/jsm/shaders/GodRaysShader.js +1 -1
  136. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  137. package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
  138. package/examples/jsm/shaders/SSRShader.js +1 -1
  139. package/examples/jsm/shaders/SepiaShader.js +1 -1
  140. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  141. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  142. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +11 -2
  143. package/examples/jsm/shaders/VignetteShader.js +1 -1
  144. package/examples/jsm/transpiler/AST.js +381 -30
  145. package/examples/jsm/transpiler/GLSLDecoder.js +247 -104
  146. package/examples/jsm/transpiler/Linker.js +327 -0
  147. package/examples/jsm/transpiler/TSLEncoder.js +196 -92
  148. package/examples/jsm/transpiler/Transpiler.js +17 -1
  149. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  150. package/examples/jsm/transpiler/WGSLEncoder.js +812 -0
  151. package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
  152. package/examples/jsm/tsl/display/AnamorphicNode.js +28 -4
  153. package/examples/jsm/tsl/display/BloomNode.js +11 -6
  154. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +207 -0
  155. package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
  156. package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
  157. package/examples/jsm/tsl/display/GTAONode.js +53 -5
  158. package/examples/jsm/tsl/display/GaussianBlurNode.js +55 -43
  159. package/examples/jsm/tsl/display/OutlineNode.js +13 -2
  160. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  161. package/examples/jsm/tsl/display/SSGINode.js +654 -0
  162. package/examples/jsm/tsl/display/SSRNode.js +182 -65
  163. package/examples/jsm/tsl/display/SSSNode.js +488 -0
  164. package/examples/jsm/tsl/display/TRAANode.js +578 -0
  165. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  166. package/examples/jsm/tsl/display/hashBlur.js +18 -20
  167. package/examples/jsm/tsl/lighting/TiledLightsNode.js +22 -2
  168. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  169. package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
  170. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  171. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  172. package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
  173. package/package.json +5 -10
  174. package/src/Three.Core.js +5 -2
  175. package/src/Three.TSL.js +112 -32
  176. package/src/Three.WebGPU.Nodes.js +2 -0
  177. package/src/Three.WebGPU.js +4 -0
  178. package/src/animation/AnimationClip.js +20 -4
  179. package/src/animation/AnimationMixer.js +3 -3
  180. package/src/animation/AnimationObjectGroup.js +2 -1
  181. package/src/animation/KeyframeTrack.js +8 -7
  182. package/src/animation/PropertyBinding.js +12 -11
  183. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  184. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  185. package/src/audio/Audio.js +10 -9
  186. package/src/audio/PositionalAudio.js +1 -1
  187. package/src/cameras/Camera.js +14 -0
  188. package/src/cameras/OrthographicCamera.js +2 -2
  189. package/src/cameras/PerspectiveCamera.js +2 -2
  190. package/src/cameras/StereoCamera.js +2 -2
  191. package/src/constants.js +13 -5
  192. package/src/core/BufferAttribute.js +3 -3
  193. package/src/core/BufferGeometry.js +10 -10
  194. package/src/core/Clock.js +2 -8
  195. package/src/core/EventDispatcher.js +1 -1
  196. package/src/core/GLBufferAttribute.js +13 -1
  197. package/src/core/InterleavedBuffer.js +1 -1
  198. package/src/core/InterleavedBufferAttribute.js +3 -2
  199. package/src/core/Object3D.js +4 -3
  200. package/src/core/Raycaster.js +2 -1
  201. package/src/core/RenderTarget.js +10 -1
  202. package/{examples/jsm/misc → src/core}/Timer.js +4 -42
  203. package/src/extras/Controls.js +5 -4
  204. package/src/extras/DataUtils.js +2 -1
  205. package/src/extras/Earcut.js +6 -0
  206. package/src/extras/ImageUtils.js +2 -2
  207. package/src/extras/PMREMGenerator.js +279 -55
  208. package/src/extras/TextureUtils.js +2 -1
  209. package/src/extras/core/Curve.js +2 -1
  210. package/src/extras/core/Interpolations.js +7 -1
  211. package/src/extras/core/Path.js +22 -22
  212. package/src/extras/core/ShapePath.js +4 -4
  213. package/src/extras/lib/earcut.js +8 -8
  214. package/src/geometries/BoxGeometry.js +1 -0
  215. package/src/geometries/CapsuleGeometry.js +1 -0
  216. package/src/geometries/CircleGeometry.js +1 -0
  217. package/src/geometries/ConeGeometry.js +1 -0
  218. package/src/geometries/CylinderGeometry.js +1 -0
  219. package/src/geometries/DodecahedronGeometry.js +1 -0
  220. package/src/geometries/ExtrudeGeometry.js +8 -6
  221. package/src/geometries/IcosahedronGeometry.js +1 -0
  222. package/src/geometries/LatheGeometry.js +1 -0
  223. package/src/geometries/OctahedronGeometry.js +1 -0
  224. package/src/geometries/PlaneGeometry.js +1 -0
  225. package/src/geometries/RingGeometry.js +1 -0
  226. package/src/geometries/ShapeGeometry.js +1 -0
  227. package/src/geometries/SphereGeometry.js +1 -0
  228. package/src/geometries/TetrahedronGeometry.js +1 -0
  229. package/src/geometries/TorusGeometry.js +1 -0
  230. package/src/geometries/TorusKnotGeometry.js +1 -0
  231. package/src/geometries/TubeGeometry.js +1 -0
  232. package/src/helpers/CameraHelper.js +42 -12
  233. package/src/helpers/SkeletonHelper.js +35 -6
  234. package/src/lights/LightShadow.js +21 -8
  235. package/src/lights/PointLightShadow.js +1 -1
  236. package/src/lights/webgpu/ProjectorLight.js +1 -1
  237. package/src/loaders/AnimationLoader.js +2 -1
  238. package/src/loaders/AudioLoader.js +2 -1
  239. package/src/loaders/BufferGeometryLoader.js +2 -2
  240. package/src/loaders/Cache.js +2 -2
  241. package/src/loaders/DataTextureLoader.js +1 -1
  242. package/src/loaders/FileLoader.js +29 -5
  243. package/src/loaders/ImageBitmapLoader.js +32 -8
  244. package/src/loaders/ImageLoader.js +56 -9
  245. package/src/loaders/Loader.js +17 -3
  246. package/src/loaders/LoadingManager.js +45 -0
  247. package/src/loaders/MaterialLoader.js +3 -2
  248. package/src/loaders/ObjectLoader.js +13 -13
  249. package/src/loaders/TextureLoader.js +1 -1
  250. package/src/loaders/nodes/NodeLoader.js +3 -2
  251. package/src/materials/Material.js +16 -3
  252. package/src/materials/MeshBasicMaterial.js +2 -1
  253. package/src/materials/MeshDepthMaterial.js +1 -0
  254. package/src/materials/MeshDistanceMaterial.js +1 -1
  255. package/src/materials/MeshLambertMaterial.js +2 -1
  256. package/src/materials/MeshMatcapMaterial.js +22 -0
  257. package/src/materials/MeshNormalMaterial.js +1 -0
  258. package/src/materials/MeshPhongMaterial.js +2 -1
  259. package/src/materials/MeshPhysicalMaterial.js +2 -1
  260. package/src/materials/MeshStandardMaterial.js +8 -7
  261. package/src/materials/MeshToonMaterial.js +1 -0
  262. package/src/materials/PointsMaterial.js +1 -1
  263. package/src/materials/ShaderMaterial.js +2 -2
  264. package/src/materials/nodes/Line2NodeMaterial.js +2 -10
  265. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  266. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  267. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  268. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  269. package/src/materials/nodes/MeshSSSNodeMaterial.js +3 -3
  270. package/src/materials/nodes/NodeMaterial.js +90 -27
  271. package/src/materials/nodes/PointsNodeMaterial.js +86 -28
  272. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  273. package/src/materials/nodes/manager/NodeMaterialObserver.js +89 -3
  274. package/src/math/Color.js +6 -5
  275. package/src/math/ColorManagement.js +9 -3
  276. package/src/math/Cylindrical.js +1 -1
  277. package/src/math/Euler.js +2 -1
  278. package/src/math/Frustum.js +25 -9
  279. package/src/math/FrustumArray.js +10 -5
  280. package/src/math/Line3.js +129 -2
  281. package/src/math/MathUtils.js +13 -11
  282. package/src/math/Matrix2.js +1 -1
  283. package/src/math/Matrix3.js +2 -2
  284. package/src/math/Matrix4.js +55 -34
  285. package/src/math/Plane.js +1 -1
  286. package/src/math/Quaternion.js +69 -67
  287. package/src/math/Spherical.js +3 -3
  288. package/src/nodes/Nodes.js +6 -4
  289. package/src/nodes/TSL.js +9 -4
  290. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  291. package/src/nodes/accessors/Bitangent.js +31 -25
  292. package/src/nodes/accessors/BufferNode.js +1 -1
  293. package/src/nodes/accessors/Camera.js +142 -16
  294. package/src/nodes/accessors/ClippingNode.js +6 -5
  295. package/src/nodes/accessors/CubeTextureNode.js +5 -4
  296. package/src/nodes/accessors/InstanceNode.js +25 -5
  297. package/src/nodes/accessors/Lights.js +10 -0
  298. package/src/nodes/accessors/Normal.js +97 -30
  299. package/src/nodes/accessors/Object3DNode.js +2 -2
  300. package/src/nodes/accessors/Position.js +25 -9
  301. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  302. package/src/nodes/accessors/ReferenceNode.js +20 -4
  303. package/src/nodes/accessors/ReflectVector.js +3 -3
  304. package/src/nodes/accessors/SceneNode.js +3 -2
  305. package/src/nodes/accessors/StorageBufferNode.js +2 -1
  306. package/src/nodes/accessors/StorageTextureNode.js +23 -1
  307. package/src/nodes/accessors/Tangent.js +25 -17
  308. package/src/nodes/accessors/TangentUtils.js +46 -0
  309. package/src/nodes/accessors/Texture3DNode.js +14 -1
  310. package/src/nodes/accessors/TextureBicubic.js +21 -3
  311. package/src/nodes/accessors/TextureNode.js +142 -44
  312. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  313. package/src/nodes/code/FunctionCallNode.js +24 -4
  314. package/src/nodes/code/FunctionNode.js +23 -0
  315. package/src/nodes/core/ArrayNode.js +13 -0
  316. package/src/nodes/core/AssignNode.js +6 -2
  317. package/src/nodes/core/AttributeNode.js +2 -1
  318. package/src/nodes/core/ContextNode.js +48 -10
  319. package/src/nodes/core/IndexNode.js +2 -2
  320. package/src/nodes/core/InputNode.js +2 -1
  321. package/src/nodes/core/InspectorNode.js +128 -0
  322. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +36 -17
  323. package/src/nodes/core/Node.js +167 -34
  324. package/src/nodes/core/NodeBuilder.js +404 -120
  325. package/src/nodes/core/NodeFrame.js +21 -21
  326. package/src/nodes/core/NodeFunction.js +2 -1
  327. package/src/nodes/core/NodeParser.js +2 -1
  328. package/src/nodes/core/NodeUniform.js +1 -1
  329. package/src/nodes/core/NodeUtils.js +17 -88
  330. package/src/nodes/core/ParameterNode.js +31 -0
  331. package/src/nodes/core/PropertyNode.js +7 -0
  332. package/src/nodes/core/StackNode.js +77 -30
  333. package/src/nodes/core/StructNode.js +5 -5
  334. package/src/nodes/core/StructTypeNode.js +1 -0
  335. package/src/nodes/core/SubBuildNode.js +89 -0
  336. package/src/nodes/core/UniformNode.js +80 -14
  337. package/src/nodes/core/VarNode.js +142 -16
  338. package/src/nodes/core/VaryingNode.js +9 -6
  339. package/src/nodes/display/BlendModes.js +7 -6
  340. package/src/nodes/display/BumpMapNode.js +1 -1
  341. package/src/nodes/display/ColorAdjustment.js +1 -1
  342. package/src/nodes/display/FrontFacingNode.js +35 -7
  343. package/src/nodes/display/NormalMapNode.js +20 -50
  344. package/src/nodes/display/PassNode.js +206 -17
  345. package/src/nodes/display/RenderOutputNode.js +28 -2
  346. package/src/nodes/display/ScreenNode.js +44 -40
  347. package/src/nodes/display/ToneMappingNode.js +31 -4
  348. package/src/nodes/display/ToonOutlinePassNode.js +8 -0
  349. package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
  350. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  351. package/src/nodes/display/ViewportTextureNode.js +94 -4
  352. package/src/nodes/fog/Fog.js +3 -2
  353. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  354. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  355. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  356. package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
  357. package/src/nodes/functions/BasicLightingModel.js +2 -1
  358. package/src/nodes/functions/PhongLightingModel.js +3 -3
  359. package/src/nodes/functions/PhysicalLightingModel.js +19 -18
  360. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  361. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  362. package/src/nodes/geometry/RangeNode.js +40 -4
  363. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  364. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
  365. package/src/nodes/gpgpu/ComputeNode.js +81 -25
  366. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  367. package/src/nodes/gpgpu/WorkgroupInfoNode.js +29 -3
  368. package/src/nodes/lighting/EnvironmentNode.js +11 -11
  369. package/src/nodes/lighting/LightsNode.js +7 -8
  370. package/src/nodes/lighting/PointShadowNode.js +6 -0
  371. package/src/nodes/lighting/ProjectorLightNode.js +19 -6
  372. package/src/nodes/lighting/ShadowFilterNode.js +3 -1
  373. package/src/nodes/lighting/ShadowNode.js +77 -10
  374. package/src/nodes/materialx/MaterialXNodes.js +131 -2
  375. package/src/nodes/materialx/lib/mx_noise.js +165 -1
  376. package/src/nodes/math/BitcastNode.js +156 -0
  377. package/src/nodes/math/ConditionalNode.js +25 -27
  378. package/src/nodes/math/MathNode.js +106 -65
  379. package/src/nodes/math/OperatorNode.js +28 -43
  380. package/src/nodes/pmrem/PMREMUtils.js +117 -2
  381. package/src/nodes/shapes/Shapes.js +1 -1
  382. package/src/nodes/tsl/TSLBase.js +6 -2
  383. package/src/nodes/tsl/TSLCore.js +546 -186
  384. package/src/nodes/utils/DebugNode.js +3 -2
  385. package/src/nodes/utils/EquirectUV.js +27 -0
  386. package/src/nodes/utils/EventNode.js +119 -0
  387. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  388. package/src/nodes/utils/JoinNode.js +6 -3
  389. package/src/nodes/utils/LoopNode.js +20 -41
  390. package/src/nodes/utils/MatcapUV.js +22 -0
  391. package/src/nodes/utils/MemberNode.js +59 -7
  392. package/src/nodes/utils/PostProcessingUtils.js +28 -1
  393. package/src/nodes/utils/RTTNode.js +33 -6
  394. package/src/nodes/utils/ReflectorNode.js +68 -10
  395. package/src/nodes/utils/SampleNode.js +91 -0
  396. package/src/nodes/utils/SplitNode.js +11 -0
  397. package/src/nodes/utils/Timer.js +0 -47
  398. package/src/nodes/utils/TriplanarTextures.js +65 -0
  399. package/src/objects/BatchedMesh.js +6 -4
  400. package/src/objects/LOD.js +1 -1
  401. package/src/objects/Line.js +2 -1
  402. package/src/objects/LineSegments.js +2 -1
  403. package/src/objects/Skeleton.js +3 -2
  404. package/src/objects/SkinnedMesh.js +3 -1
  405. package/src/objects/Sprite.js +4 -3
  406. package/src/renderers/WebGLRenderer.js +77 -66
  407. package/src/renderers/common/Animation.js +13 -1
  408. package/src/renderers/common/Attributes.js +1 -1
  409. package/src/renderers/common/Backend.js +108 -27
  410. package/src/renderers/common/Background.js +4 -3
  411. package/src/renderers/common/Bindings.js +76 -19
  412. package/src/renderers/common/CanvasTarget.js +341 -0
  413. package/src/renderers/common/ChainMap.js +1 -1
  414. package/src/renderers/common/Color4.js +2 -2
  415. package/src/renderers/common/CubeRenderTarget.js +1 -1
  416. package/src/renderers/common/DataMap.js +1 -1
  417. package/src/renderers/common/Geometries.js +26 -0
  418. package/src/renderers/common/Info.js +4 -2
  419. package/src/renderers/common/InspectorBase.js +146 -0
  420. package/src/renderers/common/Pipelines.js +1 -1
  421. package/src/renderers/common/PostProcessing.js +61 -25
  422. package/src/renderers/common/QuadMesh.js +7 -1
  423. package/src/renderers/common/RenderContext.js +2 -2
  424. package/src/renderers/common/RenderList.js +7 -3
  425. package/src/renderers/common/RenderObject.js +84 -5
  426. package/src/renderers/common/RenderObjects.js +1 -1
  427. package/src/renderers/common/Renderer.js +486 -255
  428. package/src/renderers/common/RendererUtils.js +9 -0
  429. package/src/renderers/common/SampledTexture.js +8 -68
  430. package/src/renderers/common/Sampler.js +117 -0
  431. package/src/renderers/common/Storage3DTexture.js +100 -0
  432. package/src/renderers/common/StorageArrayTexture.js +84 -0
  433. package/src/renderers/common/StorageTexture.js +27 -0
  434. package/src/renderers/common/Textures.js +138 -46
  435. package/src/renderers/common/TimestampQueryPool.js +65 -3
  436. package/src/renderers/common/UniformsGroup.js +2 -1
  437. package/src/renderers/common/XRManager.js +63 -24
  438. package/src/renderers/common/XRRenderTarget.js +21 -4
  439. package/src/renderers/common/extras/PMREMGenerator.js +161 -66
  440. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  441. package/src/renderers/common/nodes/NodeLibrary.js +9 -7
  442. package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
  443. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  444. package/src/renderers/common/nodes/Nodes.js +38 -16
  445. package/src/renderers/shaders/DFGLUTData.js +64 -0
  446. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  447. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
  448. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  449. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
  450. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  451. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  452. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  453. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  454. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +21 -11
  455. package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
  456. package/src/renderers/shaders/UniformsLib.js +1 -0
  457. package/src/renderers/shaders/UniformsUtils.js +25 -4
  458. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  459. package/src/renderers/webgl/WebGLCapabilities.js +4 -3
  460. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  461. package/src/renderers/webgl/WebGLInfo.js +3 -1
  462. package/src/renderers/webgl/WebGLProgram.js +25 -18
  463. package/src/renderers/webgl/WebGLPrograms.js +9 -6
  464. package/src/renderers/webgl/WebGLShadowMap.js +13 -2
  465. package/src/renderers/webgl/WebGLState.js +17 -16
  466. package/src/renderers/webgl/WebGLTextures.js +38 -21
  467. package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
  468. package/src/renderers/webgl/WebGLUtils.js +3 -2
  469. package/src/renderers/webgl-fallback/WebGLBackend.js +245 -182
  470. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +184 -30
  471. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  472. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  473. package/src/renderers/webgl-fallback/utils/WebGLState.js +9 -8
  474. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +171 -19
  475. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +51 -22
  476. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
  477. package/src/renderers/webgpu/WebGPUBackend.js +205 -128
  478. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  479. package/src/renderers/webgpu/WebGPURenderer.js +3 -2
  480. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +198 -121
  481. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +8 -1
  482. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +49 -33
  483. package/src/renderers/webgpu/utils/WebGPUConstants.js +14 -3
  484. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +56 -37
  485. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
  486. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +266 -158
  487. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +32 -9
  488. package/src/renderers/webgpu/utils/WebGPUUtils.js +24 -19
  489. package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
  490. package/src/renderers/webxr/WebXRManager.js +89 -13
  491. package/src/textures/ExternalTexture.js +56 -0
  492. package/src/textures/FramebufferTexture.js +2 -2
  493. package/src/textures/Source.js +14 -3
  494. package/src/textures/Texture.js +3 -2
  495. package/src/textures/VideoTexture.js +29 -2
  496. package/src/utils.js +67 -3
  497. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
  498. package/examples/jsm/tsl/display/TRAAPassNode.js +0 -452
  499. package/src/nodes/utils/EquirectUVNode.js +0 -65
  500. package/src/nodes/utils/MatcapUVNode.js +0 -49
  501. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -1,26 +1,31 @@
1
- import { Program, FunctionDeclaration, For, AccessorElements, Ternary, Varying, DynamicElement, StaticElement, FunctionParameter, Unary, Conditional, VariableDeclaration, Operator, Number, String, FunctionCall, Return, Accessor, Uniform, Discard } from './AST.js';
1
+ import { Program, FunctionDeclaration, Switch, For, AccessorElements, Ternary, Varying, DynamicElement, StaticElement, FunctionParameter, Unary, Conditional, VariableDeclaration, Operator, Number, String, FunctionCall, Return, Accessor, Uniform, Discard, SwitchCase, Continue, Break, While, Comment } from './AST.js';
2
+
3
+ import { isType } from './TranspilerUtils.js';
2
4
 
3
5
  const unaryOperators = [
4
6
  '+', '-', '~', '!', '++', '--'
5
7
  ];
6
8
 
9
+ const arithmeticOperators = [
10
+ '*', '/', '%', '+', '-', '<<', '>>'
11
+ ];
12
+
7
13
  const precedenceOperators = [
8
- '*', '/', '%',
9
- '-', '+',
10
- '<<', '>>',
11
- '<', '>', '<=', '>=',
12
- '==', '!=',
13
- '&',
14
- '^',
15
- '|',
16
- '&&',
17
- '^^',
18
- '||',
19
- '?',
20
- '=',
21
- '+=', '-=', '*=', '/=', '%=', '^=', '&=', '|=', '<<=', '>>=',
22
- ','
23
- ].reverse();
14
+ [ ',' ],
15
+ [ '=', '+=', '-=', '*=', '/=', '%=', '^=', '&=', '|=', '<<=', '>>=' ],
16
+ [ '?' ],
17
+ [ '||' ],
18
+ [ '^^' ],
19
+ [ '&&' ],
20
+ [ '|' ],
21
+ [ '^' ],
22
+ [ '&' ],
23
+ [ '==', '!=' ],
24
+ [ '<', '>', '<=', '>=' ],
25
+ [ '<<', '>>' ],
26
+ [ '+', '-' ],
27
+ [ '*', '/', '%' ]
28
+ ];
24
29
 
25
30
  const associativityRightToLeft = [
26
31
  '=',
@@ -41,7 +46,7 @@ const samplers3D = [ 'sampler3D', 'isampler3D', 'usampler3D' ];
41
46
  const spaceRegExp = /^((\t| )\n*)+/;
42
47
  const lineRegExp = /^\n+/;
43
48
  const commentRegExp = /^\/\*[\s\S]*?\*\//;
44
- const inlineCommentRegExp = /^\/\/.*?(\n|$)/;
49
+ const inlineCommentRegExp = /^\/\/.*?(?=\n|$)/;
45
50
 
46
51
  const numberRegExp = /^((0x\w+)|(\.?\d+\.?\d*((e-?\d+)|\w)?))/;
47
52
  const stringDoubleRegExp = /^(\"((?:[^"\\]|\\.)*)\")/;
@@ -80,7 +85,9 @@ class Token {
80
85
  this.str = str;
81
86
  this.pos = pos;
82
87
 
83
- this.tag = null;
88
+ this.isTag = false;
89
+
90
+ this.tags = null;
84
91
 
85
92
  }
86
93
 
@@ -189,7 +196,7 @@ class Tokenizer {
189
196
 
190
197
  }
191
198
 
192
- readToken() {
199
+ nextToken() {
193
200
 
194
201
  const remainingCode = this.skip( spaceRegExp );
195
202
 
@@ -201,35 +208,46 @@ class Tokenizer {
201
208
  if ( result ) {
202
209
 
203
210
  const token = new Token( this, parser.type, result[ parser.group || 0 ], this.position );
211
+ token.isTag = parser.isTag;
204
212
 
205
213
  this.position += result[ 0 ].length;
206
214
 
207
- if ( parser.isTag ) {
215
+ return token;
216
+
217
+ }
218
+
219
+ }
220
+
221
+ }
208
222
 
209
- const nextToken = this.readToken();
223
+ readToken() {
210
224
 
211
- if ( nextToken ) {
225
+ let token = this.nextToken();
212
226
 
213
- nextToken.tag = token;
227
+ if ( token && token.isTag ) {
214
228
 
215
- }
229
+ const tags = [];
216
230
 
217
- return nextToken;
231
+ while ( token.isTag ) {
218
232
 
219
- }
233
+ tags.push( token );
220
234
 
221
- return token;
235
+ token = this.nextToken();
236
+
237
+ if ( ! token ) return;
222
238
 
223
239
  }
224
240
 
241
+ token.tags = tags;
242
+
225
243
  }
226
244
 
245
+ return token;
246
+
227
247
  }
228
248
 
229
249
  }
230
250
 
231
- const isType = ( str ) => /void|bool|float|u?int|mat[234]|mat[234]x[234]|(u|i|b)?vec[234]/.test( str );
232
-
233
251
  class GLSLDecoder {
234
252
 
235
253
  constructor() {
@@ -238,8 +256,6 @@ class GLSLDecoder {
238
256
  this.tokenizer = null;
239
257
  this.keywords = [];
240
258
 
241
- this._currentFunction = null;
242
-
243
259
  this.addPolyfill( 'gl_FragCoord', 'vec3 gl_FragCoord = vec3( screenCoordinate.x, screenCoordinate.y.oneMinus(), screenCoordinate.z );' );
244
260
 
245
261
  }
@@ -317,7 +333,7 @@ class GLSLDecoder {
317
333
 
318
334
  let groupIndex = 0;
319
335
 
320
- for ( const operator of precedenceOperators ) {
336
+ for ( const operators of precedenceOperators ) {
321
337
 
322
338
  const parseToken = ( i, inverse = false ) => {
323
339
 
@@ -327,7 +343,16 @@ class GLSLDecoder {
327
343
 
328
344
  if ( ! token.isOperator || i === 0 || i === tokens.length - 1 ) return;
329
345
 
330
- if ( groupIndex === 0 && token.str === operator ) {
346
+ // important for negate operator after arithmetic operator: a * -1, a * -( b )
347
+ if ( inverse && arithmeticOperators.includes( tokens[ i - 1 ].str ) ) {
348
+
349
+ return;
350
+
351
+ }
352
+
353
+ if ( groupIndex === 0 && operators.includes( token.str ) ) {
354
+
355
+ const operator = token.str;
331
356
 
332
357
  if ( operator === '?' ) {
333
358
 
@@ -346,7 +371,7 @@ class GLSLDecoder {
346
371
  const left = this.parseExpressionFromTokens( tokens.slice( 0, i ) );
347
372
  const right = this.parseExpressionFromTokens( tokens.slice( i + 1, tokens.length ) );
348
373
 
349
- return this._evalOperator( new Operator( operator, left, right ) );
374
+ return new Operator( operator, left, right );
350
375
 
351
376
  }
352
377
 
@@ -372,7 +397,9 @@ class GLSLDecoder {
372
397
 
373
398
  };
374
399
 
375
- if ( associativityRightToLeft.includes( operator ) ) {
400
+ const isRightAssociative = operators.some( op => associativityRightToLeft.includes( op ) );
401
+
402
+ if ( isRightAssociative ) {
376
403
 
377
404
  for ( let i = 0; i < tokens.length; i ++ ) {
378
405
 
@@ -447,7 +474,7 @@ class GLSLDecoder {
447
474
  const rightTokens = tokens.slice( leftTokens.length + 1 );
448
475
  const right = this.parseExpressionFromTokens( rightTokens );
449
476
 
450
- return this._evalOperator( new Operator( operator.str, left, right ) );
477
+ return new Operator( operator.str, left, right );
451
478
 
452
479
  }
453
480
 
@@ -492,6 +519,14 @@ class GLSLDecoder {
492
519
 
493
520
  return new Discard();
494
521
 
522
+ } else if ( firstToken.str === 'continue' ) {
523
+
524
+ return new Continue();
525
+
526
+ } else if ( firstToken.str === 'break' ) {
527
+
528
+ return new Break();
529
+
495
530
  }
496
531
 
497
532
  const secondToken = tokens[ 1 ];
@@ -657,14 +692,9 @@ class GLSLDecoder {
657
692
  const paramsTokens = this.readTokensUntil( ')' );
658
693
 
659
694
  const params = this.parseFunctionParams( paramsTokens.slice( 1, paramsTokens.length - 1 ) );
695
+ const body = this.parseBlock();
660
696
 
661
- const func = new FunctionDeclaration( type, name, params );
662
-
663
- this._currentFunction = func;
664
-
665
- this.parseBlock( func );
666
-
667
- this._currentFunction = null;
697
+ const func = new FunctionDeclaration( type, name, params, body );
668
698
 
669
699
  return func;
670
700
 
@@ -760,6 +790,31 @@ class GLSLDecoder {
760
790
 
761
791
  }
762
792
 
793
+ parseWhile() {
794
+
795
+ this.readToken(); // skip 'while'
796
+
797
+ const conditionTokens = this.readTokensUntil( ')' ).slice( 1, - 1 );
798
+ const condition = this.parseExpressionFromTokens( conditionTokens );
799
+
800
+ let body;
801
+
802
+ if ( this.getToken().str === '{' ) {
803
+
804
+ body = this.parseBlock();
805
+
806
+ } else {
807
+
808
+ body = [ this.parseExpression() ];
809
+
810
+ }
811
+
812
+ const statement = new While( condition, body );
813
+
814
+ return statement;
815
+
816
+ }
817
+
763
818
  parseFor() {
764
819
 
765
820
  this.readToken(); // skip 'for'
@@ -785,22 +840,100 @@ class GLSLDecoder {
785
840
  const condition = this.parseExpressionFromTokens( conditionTokens );
786
841
  const afterthought = this.parseExpressionFromTokens( afterthoughtTokens );
787
842
 
788
- const statement = new For( initialization, condition, afterthought );
843
+ let body;
789
844
 
790
845
  if ( this.getToken().str === '{' ) {
791
846
 
792
- this.parseBlock( statement );
847
+ body = this.parseBlock();
793
848
 
794
849
  } else {
795
850
 
796
- statement.body.push( this.parseExpression() );
851
+ body = [ this.parseExpression() ];
797
852
 
798
853
  }
799
854
 
855
+ const statement = new For( initialization, condition, afterthought, body );
856
+
800
857
  return statement;
801
858
 
802
859
  }
803
860
 
861
+ parseSwitch() {
862
+
863
+ this.readToken(); // Skip 'switch'
864
+
865
+ const switchDeterminantTokens = this.readTokensUntil( ')' );
866
+
867
+ // Parse expression between parentheses. Index 1: char after '('. Index -1: char before ')'
868
+ const discriminant = this.parseExpressionFromTokens( switchDeterminantTokens.slice( 1, - 1 ) );
869
+
870
+ // Validate curly braces
871
+ if ( this.getToken().str !== '{' ) {
872
+
873
+ throw new Error( 'Expected \'{\' after switch(...) ' );
874
+
875
+ }
876
+
877
+ this.readToken(); // Skip '{'
878
+
879
+ const cases = this.parseSwitchCases();
880
+
881
+ const switchStatement = new Switch( discriminant, cases );
882
+
883
+ return switchStatement;
884
+
885
+ }
886
+
887
+ parseSwitchCases() {
888
+
889
+ const cases = [];
890
+
891
+ let token = this.getToken();
892
+ let conditions = null;
893
+
894
+ const isCase = ( token ) => token.str === 'case' || token.str === 'default';
895
+
896
+ while ( isCase( token ) ) {
897
+
898
+ this.readToken(); // Skip 'case' or 'default'
899
+
900
+ if ( token.str === 'case' ) {
901
+
902
+ const caseTokens = this.readTokensUntil( ':' );
903
+ const caseStatement = this.parseExpressionFromTokens( caseTokens.slice( 0, - 1 ) );
904
+
905
+ conditions = conditions || [];
906
+ conditions.push( caseStatement );
907
+
908
+ } else {
909
+
910
+ this.readTokensUntil( ':' ); // Skip 'default:'
911
+
912
+ conditions = null;
913
+
914
+ }
915
+
916
+ token = this.getToken();
917
+
918
+ if ( isCase( token ) ) {
919
+
920
+ // If the next token is another case/default, continue parsing
921
+ continue;
922
+
923
+ }
924
+
925
+ cases.push( new SwitchCase( this.parseBlock(), conditions ) );
926
+
927
+ token = this.getToken();
928
+
929
+ conditions = null;
930
+
931
+ }
932
+
933
+ return cases;
934
+
935
+ }
936
+
804
937
  parseIf() {
805
938
 
806
939
  const parseIfExpression = () => {
@@ -813,25 +946,28 @@ class GLSLDecoder {
813
946
 
814
947
  };
815
948
 
816
- const parseIfBlock = ( cond ) => {
949
+ const parseIfBlock = () => {
950
+
951
+ let body;
817
952
 
818
953
  if ( this.getToken().str === '{' ) {
819
954
 
820
- this.parseBlock( cond );
955
+ body = this.parseBlock();
821
956
 
822
957
  } else {
823
958
 
824
- cond.body.push( this.parseExpression() );
959
+ body = [ this.parseExpression() ];
825
960
 
826
961
  }
827
962
 
963
+ return body;
964
+
828
965
  };
829
966
 
830
967
  //
831
968
 
832
- const conditional = new Conditional( parseIfExpression() );
833
-
834
- parseIfBlock( conditional );
969
+ // Parse the first if statement
970
+ const conditional = new Conditional( parseIfExpression(), parseIfBlock() );
835
971
 
836
972
  //
837
973
 
@@ -841,21 +977,24 @@ class GLSLDecoder {
841
977
 
842
978
  this.readToken(); // skip 'else'
843
979
 
980
+ // Assign the current if/else statement as the previous within the chain of conditionals
844
981
  const previous = current;
845
982
 
846
- if ( this.getToken().str === 'if' ) {
847
-
848
- current = new Conditional( parseIfExpression() );
983
+ let expression = null;
849
984
 
850
- } else {
985
+ // If an 'else if' statement, parse the conditional within the if
986
+ if ( this.getToken().str === 'if' ) {
851
987
 
852
- current = new Conditional();
988
+ // Current conditional now equal to next conditional in the chain
989
+ expression = parseIfExpression();
853
990
 
854
991
  }
855
992
 
856
- previous.elseConditional = current;
993
+ current = new Conditional( expression, parseIfBlock() );
994
+ current.parent = previous;
857
995
 
858
- parseIfBlock( current );
996
+ // n - 1 conditional's else statement assigned to new if/else statement
997
+ previous.elseConditional = current;
859
998
 
860
999
  }
861
1000
 
@@ -863,7 +1002,9 @@ class GLSLDecoder {
863
1002
 
864
1003
  }
865
1004
 
866
- parseBlock( scope ) {
1005
+ parseBlock() {
1006
+
1007
+ const body = [];
867
1008
 
868
1009
  const firstToken = this.getToken();
869
1010
 
@@ -883,16 +1024,47 @@ class GLSLDecoder {
883
1024
 
884
1025
  groupIndex += getGroupDelta( token.str );
885
1026
 
886
- if ( groupIndex < 0 ) {
1027
+ if ( groupIndex === 0 && ( token.str === 'case' || token.str === 'default' ) ) {
1028
+
1029
+ return body; // switch case or default statement, return body
1030
+
1031
+ } else if ( groupIndex < 0 ) {
887
1032
 
888
1033
  this.readToken(); // skip '}'
889
1034
 
890
- break;
1035
+ return body;
891
1036
 
892
1037
  }
893
1038
 
894
1039
  //
895
1040
 
1041
+ if ( token.tags ) {
1042
+
1043
+ let lastStatement = null;
1044
+
1045
+ for ( const tag of token.tags ) {
1046
+
1047
+ if ( tag.type === Token.COMMENT ) {
1048
+
1049
+ const str = tag.str.replace( /\t/g, '' );
1050
+
1051
+ if ( ! lastStatement || lastStatement.isComment !== true ) {
1052
+
1053
+ lastStatement = new Comment( str );
1054
+ body.push( lastStatement );
1055
+
1056
+ } else {
1057
+
1058
+ lastStatement.comment += '\n' + str;
1059
+
1060
+ }
1061
+
1062
+ }
1063
+
1064
+ }
1065
+
1066
+ }
1067
+
896
1068
  if ( token.isLiteral || token.isOperator ) {
897
1069
 
898
1070
  if ( token.str === 'const' ) {
@@ -931,6 +1103,14 @@ class GLSLDecoder {
931
1103
 
932
1104
  statement = this.parseFor();
933
1105
 
1106
+ } else if ( token.str === 'while' ) {
1107
+
1108
+ statement = this.parseWhile();
1109
+
1110
+ } else if ( token.str === 'switch' ) {
1111
+
1112
+ statement = this.parseSwitch();
1113
+
934
1114
  } else {
935
1115
 
936
1116
  statement = this.parseExpression();
@@ -941,7 +1121,7 @@ class GLSLDecoder {
941
1121
 
942
1122
  if ( statement ) {
943
1123
 
944
- scope.body.push( statement );
1124
+ body.push( statement );
945
1125
 
946
1126
  } else {
947
1127
 
@@ -951,43 +1131,7 @@ class GLSLDecoder {
951
1131
 
952
1132
  }
953
1133
 
954
- }
955
-
956
- _evalOperator( operator ) {
957
-
958
- if ( operator.type.includes( '=' ) ) {
959
-
960
- const parameter = this._getFunctionParameter( operator.left.property );
961
-
962
- if ( parameter !== undefined ) {
963
-
964
- // Parameters are immutable in WGSL
965
-
966
- parameter.immutable = false;
967
-
968
- }
969
-
970
- }
971
-
972
- return operator;
973
-
974
- }
975
-
976
- _getFunctionParameter( name ) {
977
-
978
- if ( this._currentFunction ) {
979
-
980
- for ( const param of this._currentFunction.params ) {
981
-
982
- if ( param.name === name ) {
983
-
984
- return param;
985
-
986
- }
987
-
988
- }
989
-
990
- }
1134
+ return body;
991
1135
 
992
1136
  }
993
1137
 
@@ -1014,9 +1158,8 @@ class GLSLDecoder {
1014
1158
  this.index = 0;
1015
1159
  this.tokenizer = new Tokenizer( polyfill + source ).tokenize();
1016
1160
 
1017
- const program = new Program();
1018
-
1019
- this.parseBlock( program );
1161
+ const body = this.parseBlock();
1162
+ const program = new Program( body );
1020
1163
 
1021
1164
  return program;
1022
1165