@plastic-software/three 0.175.13 → 0.178.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 (529) hide show
  1. package/README.md +3 -3
  2. package/build/three.cjs +7747 -6792
  3. package/build/three.core.js +7371 -6576
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +190 -30
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +19 -11
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +4989 -2235
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +5082 -2469
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/jsm/Addons.js +0 -1
  14. package/examples/jsm/animation/AnimationClipCreator.js +1 -0
  15. package/examples/jsm/animation/CCDIKSolver.js +6 -3
  16. package/examples/jsm/capabilities/WebGL.js +1 -27
  17. package/examples/jsm/capabilities/WebGPU.js +1 -0
  18. package/examples/jsm/controls/ArcballControls.js +15 -4
  19. package/examples/jsm/controls/DragControls.js +1 -0
  20. package/examples/jsm/controls/FirstPersonControls.js +1 -0
  21. package/examples/jsm/controls/FlyControls.js +1 -0
  22. package/examples/jsm/controls/MapControls.js +1 -0
  23. package/examples/jsm/controls/OrbitControls.js +1 -0
  24. package/examples/jsm/controls/PointerLockControls.js +5 -3
  25. package/examples/jsm/controls/TrackballControls.js +1 -0
  26. package/examples/jsm/controls/TransformControls.js +62 -14
  27. package/examples/jsm/csm/CSM.js +2 -0
  28. package/examples/jsm/csm/CSMFrustum.js +2 -0
  29. package/examples/jsm/csm/CSMHelper.js +1 -0
  30. package/examples/jsm/csm/CSMShader.js +4 -1
  31. package/examples/jsm/csm/CSMShadowNode.js +18 -4
  32. package/examples/jsm/curves/CurveExtras.js +14 -0
  33. package/examples/jsm/curves/NURBSCurve.js +1 -0
  34. package/examples/jsm/curves/NURBSSurface.js +2 -0
  35. package/examples/jsm/curves/NURBSUtils.js +4 -1
  36. package/examples/jsm/curves/NURBSVolume.js +2 -0
  37. package/examples/jsm/effects/AnaglyphEffect.js +2 -0
  38. package/examples/jsm/effects/AsciiEffect.js +2 -0
  39. package/examples/jsm/effects/OutlineEffect.js +2 -0
  40. package/examples/jsm/effects/ParallaxBarrierEffect.js +2 -0
  41. package/examples/jsm/effects/StereoEffect.js +2 -0
  42. package/examples/jsm/environments/DebugEnvironment.js +1 -0
  43. package/examples/jsm/environments/RoomEnvironment.js +49 -35
  44. package/examples/jsm/exporters/DRACOExporter.js +4 -2
  45. package/examples/jsm/exporters/EXRExporter.js +2 -0
  46. package/examples/jsm/exporters/GLTFExporter.js +7 -4
  47. package/examples/jsm/exporters/KTX2Exporter.js +2 -0
  48. package/examples/jsm/exporters/OBJExporter.js +3 -1
  49. package/examples/jsm/exporters/PLYExporter.js +4 -2
  50. package/examples/jsm/exporters/STLExporter.js +2 -0
  51. package/examples/jsm/exporters/USDZExporter.js +12 -10
  52. package/examples/jsm/geometries/BoxLineGeometry.js +1 -0
  53. package/examples/jsm/geometries/ConvexGeometry.js +1 -0
  54. package/examples/jsm/geometries/DecalGeometry.js +1 -0
  55. package/examples/jsm/geometries/ParametricFunctions.js +4 -1
  56. package/examples/jsm/geometries/ParametricGeometry.js +1 -0
  57. package/examples/jsm/geometries/RoundedBoxGeometry.js +2 -1
  58. package/examples/jsm/geometries/TeapotGeometry.js +1 -0
  59. package/examples/jsm/geometries/TextGeometry.js +1 -0
  60. package/examples/jsm/helpers/LightProbeHelper.js +1 -0
  61. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -0
  62. package/examples/jsm/helpers/OctreeHelper.js +1 -0
  63. package/examples/jsm/helpers/PositionalAudioHelper.js +1 -0
  64. package/examples/jsm/helpers/RapierHelper.js +59 -0
  65. package/examples/jsm/helpers/RectAreaLightHelper.js +1 -0
  66. package/examples/jsm/helpers/TextureHelper.js +1 -0
  67. package/examples/jsm/helpers/TextureHelperGPU.js +5 -4
  68. package/examples/jsm/helpers/VertexNormalsHelper.js +1 -0
  69. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -0
  70. package/examples/jsm/helpers/ViewHelper.js +1 -0
  71. package/examples/jsm/interactive/HTMLMesh.js +7 -0
  72. package/examples/jsm/interactive/InteractiveGroup.js +1 -0
  73. package/examples/jsm/interactive/SelectionBox.js +2 -0
  74. package/examples/jsm/interactive/SelectionHelper.js +2 -0
  75. package/examples/jsm/lighting/TiledLighting.js +1 -0
  76. package/examples/jsm/lights/LightProbeGenerator.js +1 -0
  77. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -0
  78. package/examples/jsm/lights/RectAreaLightUniformsLib.js +1 -0
  79. package/examples/jsm/lines/Line2.js +1 -0
  80. package/examples/jsm/lines/LineGeometry.js +1 -0
  81. package/examples/jsm/lines/LineMaterial.js +4 -4
  82. package/examples/jsm/lines/LineSegments2.js +1 -0
  83. package/examples/jsm/lines/LineSegmentsGeometry.js +1 -0
  84. package/examples/jsm/lines/Wireframe.js +1 -0
  85. package/examples/jsm/lines/WireframeGeometry2.js +1 -0
  86. package/examples/jsm/lines/webgpu/Line2.js +1 -0
  87. package/examples/jsm/lines/webgpu/LineSegments2.js +3 -1
  88. package/examples/jsm/lines/webgpu/Wireframe.js +1 -0
  89. package/examples/jsm/loaders/3DMLoader.js +1 -0
  90. package/examples/jsm/loaders/3MFLoader.js +1 -0
  91. package/examples/jsm/loaders/AMFLoader.js +1 -0
  92. package/examples/jsm/loaders/BVHLoader.js +1 -0
  93. package/examples/jsm/loaders/ColladaLoader.js +6 -5
  94. package/examples/jsm/loaders/DDSLoader.js +1 -0
  95. package/examples/jsm/loaders/DRACOLoader.js +2 -1
  96. package/examples/jsm/loaders/EXRLoader.js +1 -0
  97. package/examples/jsm/loaders/FBXLoader.js +25 -23
  98. package/examples/jsm/loaders/FontLoader.js +1 -0
  99. package/examples/jsm/loaders/GCodeLoader.js +1 -0
  100. package/examples/jsm/loaders/GLTFLoader.js +10 -82
  101. package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -0
  102. package/examples/jsm/loaders/IESLoader.js +1 -0
  103. package/examples/jsm/loaders/KMZLoader.js +1 -0
  104. package/examples/jsm/loaders/KTX2Loader.js +67 -26
  105. package/examples/jsm/loaders/KTXLoader.js +1 -0
  106. package/examples/jsm/loaders/LDrawLoader.js +55 -3
  107. package/examples/jsm/loaders/LUT3dlLoader.js +1 -0
  108. package/examples/jsm/loaders/LUTCubeLoader.js +1 -0
  109. package/examples/jsm/loaders/LUTImageLoader.js +1 -0
  110. package/examples/jsm/loaders/LWOLoader.js +1 -13
  111. package/examples/jsm/loaders/LottieLoader.js +15 -0
  112. package/examples/jsm/loaders/MD2Loader.js +1 -0
  113. package/examples/jsm/loaders/MDDLoader.js +1 -0
  114. package/examples/jsm/loaders/MTLLoader.js +4 -3
  115. package/examples/jsm/loaders/MaterialXLoader.js +1 -0
  116. package/examples/jsm/loaders/NRRDLoader.js +1 -0
  117. package/examples/jsm/loaders/OBJLoader.js +1 -0
  118. package/examples/jsm/loaders/PCDLoader.js +122 -19
  119. package/examples/jsm/loaders/PDBLoader.js +1 -0
  120. package/examples/jsm/loaders/PLYLoader.js +1 -0
  121. package/examples/jsm/loaders/PVRLoader.js +1 -0
  122. package/examples/jsm/loaders/RGBELoader.js +1 -0
  123. package/examples/jsm/loaders/RGBMLoader.js +1 -0
  124. package/examples/jsm/loaders/STLLoader.js +1 -0
  125. package/examples/jsm/loaders/SVGLoader.js +1 -0
  126. package/examples/jsm/loaders/TDSLoader.js +1 -0
  127. package/examples/jsm/loaders/TGALoader.js +1 -0
  128. package/examples/jsm/loaders/TIFFLoader.js +1 -0
  129. package/examples/jsm/loaders/TTFLoader.js +1 -0
  130. package/examples/jsm/loaders/USDZLoader.js +1 -0
  131. package/examples/jsm/loaders/UltraHDRLoader.js +1 -0
  132. package/examples/jsm/loaders/VOXLoader.js +1 -0
  133. package/examples/jsm/loaders/VRMLLoader.js +3 -2
  134. package/examples/jsm/loaders/VTKLoader.js +1 -0
  135. package/examples/jsm/loaders/XYZLoader.js +1 -0
  136. package/examples/jsm/loaders/lwo/IFFParser.js +74 -74
  137. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +1 -0
  138. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -0
  139. package/examples/jsm/materials/MeshPostProcessingMaterial.js +1 -0
  140. package/examples/jsm/math/Capsule.js +2 -0
  141. package/examples/jsm/math/ColorConverter.js +1 -0
  142. package/examples/jsm/math/ConvexHull.js +2 -0
  143. package/examples/jsm/math/ImprovedNoise.js +19 -14
  144. package/examples/jsm/math/Lut.js +2 -0
  145. package/examples/jsm/math/MeshSurfaceSampler.js +2 -0
  146. package/examples/jsm/math/OBB.js +2 -0
  147. package/examples/jsm/math/Octree.js +20 -1
  148. package/examples/jsm/math/SimplexNoise.js +2 -0
  149. package/examples/jsm/misc/ConvexObjectBreaker.js +3 -1
  150. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  151. package/examples/jsm/misc/Gyroscope.js +1 -0
  152. package/examples/jsm/misc/MD2Character.js +2 -0
  153. package/examples/jsm/misc/MD2CharacterComplex.js +5 -3
  154. package/examples/jsm/misc/MorphAnimMesh.js +1 -0
  155. package/examples/jsm/misc/MorphBlendMesh.js +1 -0
  156. package/examples/jsm/misc/ProgressiveLightMap.js +2 -0
  157. package/examples/jsm/misc/ProgressiveLightMapGPU.js +2 -0
  158. package/examples/jsm/misc/RollerCoaster.js +5 -0
  159. package/examples/jsm/misc/Timer.js +2 -0
  160. package/examples/jsm/misc/TubePainter.js +1 -0
  161. package/examples/jsm/misc/Volume.js +2 -0
  162. package/examples/jsm/misc/VolumeSlice.js +1 -0
  163. package/examples/jsm/modifiers/CurveModifier.js +3 -0
  164. package/examples/jsm/modifiers/CurveModifierGPU.js +2 -0
  165. package/examples/jsm/modifiers/EdgeSplitModifier.js +2 -0
  166. package/examples/jsm/modifiers/SimplifyModifier.js +2 -0
  167. package/examples/jsm/modifiers/TessellateModifier.js +2 -0
  168. package/examples/jsm/objects/GroundedSkybox.js +1 -0
  169. package/examples/jsm/objects/Lensflare.js +3 -0
  170. package/examples/jsm/objects/LensflareMesh.js +1 -0
  171. package/examples/jsm/objects/MarchingCubes.js +2 -0
  172. package/examples/jsm/objects/Reflector.js +1 -0
  173. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  174. package/examples/jsm/objects/Refractor.js +1 -0
  175. package/examples/jsm/objects/ShadowMesh.js +1 -0
  176. package/examples/jsm/objects/Sky.js +2 -1
  177. package/examples/jsm/objects/SkyMesh.js +20 -17
  178. package/examples/jsm/objects/Water.js +1 -0
  179. package/examples/jsm/objects/Water2.js +1 -0
  180. package/examples/jsm/objects/Water2Mesh.js +3 -1
  181. package/examples/jsm/objects/WaterMesh.js +2 -1
  182. package/examples/jsm/physics/AmmoPhysics.js +1 -0
  183. package/examples/jsm/physics/JoltPhysics.js +1 -0
  184. package/examples/jsm/physics/RapierPhysics.js +139 -12
  185. package/examples/jsm/postprocessing/AfterimagePass.js +20 -2
  186. package/examples/jsm/postprocessing/BloomPass.js +2 -1
  187. package/examples/jsm/postprocessing/BokehPass.js +2 -1
  188. package/examples/jsm/postprocessing/ClearPass.js +1 -0
  189. package/examples/jsm/postprocessing/CubeTexturePass.js +1 -0
  190. package/examples/jsm/postprocessing/DotScreenPass.js +1 -0
  191. package/examples/jsm/postprocessing/EffectComposer.js +4 -2
  192. package/examples/jsm/postprocessing/FXAAPass.js +40 -0
  193. package/examples/jsm/postprocessing/FilmPass.js +1 -0
  194. package/examples/jsm/postprocessing/GTAOPass.js +4 -3
  195. package/examples/jsm/postprocessing/GlitchPass.js +2 -1
  196. package/examples/jsm/postprocessing/HalftonePass.js +2 -1
  197. package/examples/jsm/postprocessing/LUTPass.js +1 -0
  198. package/examples/jsm/postprocessing/MaskPass.js +1 -0
  199. package/examples/jsm/postprocessing/OutlinePass.js +5 -2
  200. package/examples/jsm/postprocessing/OutputPass.js +1 -0
  201. package/examples/jsm/postprocessing/Pass.js +3 -1
  202. package/examples/jsm/postprocessing/RenderPass.js +1 -0
  203. package/examples/jsm/postprocessing/RenderPixelatedPass.js +2 -1
  204. package/examples/jsm/postprocessing/RenderTransitionPass.js +4 -3
  205. package/examples/jsm/postprocessing/SAOPass.js +3 -2
  206. package/examples/jsm/postprocessing/SMAAPass.js +3 -2
  207. package/examples/jsm/postprocessing/SSAARenderPass.js +2 -1
  208. package/examples/jsm/postprocessing/SSAOPass.js +2 -1
  209. package/examples/jsm/postprocessing/SSRPass.js +4 -3
  210. package/examples/jsm/postprocessing/SavePass.js +2 -1
  211. package/examples/jsm/postprocessing/ShaderPass.js +1 -0
  212. package/examples/jsm/postprocessing/TAARenderPass.js +1 -0
  213. package/examples/jsm/postprocessing/TexturePass.js +1 -0
  214. package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -1
  215. package/examples/jsm/renderers/CSS2DRenderer.js +3 -0
  216. package/examples/jsm/renderers/CSS3DRenderer.js +4 -0
  217. package/examples/jsm/renderers/Projector.js +2 -0
  218. package/examples/jsm/renderers/SVGRenderer.js +3 -0
  219. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +4 -1
  220. package/examples/jsm/shaders/AfterimageShader.js +4 -1
  221. package/examples/jsm/shaders/BasicShader.js +4 -1
  222. package/examples/jsm/shaders/BleachBypassShader.js +4 -1
  223. package/examples/jsm/shaders/BlendShader.js +4 -1
  224. package/examples/jsm/shaders/BokehShader.js +4 -1
  225. package/examples/jsm/shaders/BokehShader2.js +4 -1
  226. package/examples/jsm/shaders/BrightnessContrastShader.js +4 -1
  227. package/examples/jsm/shaders/ColorCorrectionShader.js +4 -1
  228. package/examples/jsm/shaders/ColorifyShader.js +4 -1
  229. package/examples/jsm/shaders/ConvolutionShader.js +4 -1
  230. package/examples/jsm/shaders/CopyShader.js +4 -1
  231. package/examples/jsm/shaders/DOFMipMapShader.js +4 -1
  232. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  233. package/examples/jsm/shaders/DigitalGlitch.js +4 -1
  234. package/examples/jsm/shaders/DotScreenShader.js +4 -1
  235. package/examples/jsm/shaders/ExposureShader.js +4 -1
  236. package/examples/jsm/shaders/FXAAShader.js +4 -1
  237. package/examples/jsm/shaders/FilmShader.js +4 -1
  238. package/examples/jsm/shaders/FocusShader.js +4 -1
  239. package/examples/jsm/shaders/FreiChenShader.js +4 -1
  240. package/examples/jsm/shaders/GTAOShader.js +4 -1
  241. package/examples/jsm/shaders/GammaCorrectionShader.js +4 -1
  242. package/examples/jsm/shaders/GodRaysShader.js +4 -1
  243. package/examples/jsm/shaders/HalftoneShader.js +4 -1
  244. package/examples/jsm/shaders/HorizontalBlurShader.js +4 -1
  245. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +4 -1
  246. package/examples/jsm/shaders/HueSaturationShader.js +4 -1
  247. package/examples/jsm/shaders/KaleidoShader.js +4 -1
  248. package/examples/jsm/shaders/LuminosityHighPassShader.js +4 -1
  249. package/examples/jsm/shaders/LuminosityShader.js +4 -1
  250. package/examples/jsm/shaders/MirrorShader.js +4 -1
  251. package/examples/jsm/shaders/NormalMapShader.js +4 -1
  252. package/examples/jsm/shaders/OutputShader.js +4 -1
  253. package/examples/jsm/shaders/PoissonDenoiseShader.js +4 -1
  254. package/examples/jsm/shaders/RGBShiftShader.js +4 -1
  255. package/examples/jsm/shaders/SAOShader.js +4 -1
  256. package/examples/jsm/shaders/SMAAShader.js +1 -0
  257. package/examples/jsm/shaders/SSAOShader.js +4 -1
  258. package/examples/jsm/shaders/SSRShader.js +1 -0
  259. package/examples/jsm/shaders/SepiaShader.js +4 -1
  260. package/examples/jsm/shaders/SobelOperatorShader.js +4 -1
  261. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +4 -1
  262. package/examples/jsm/shaders/TechnicolorShader.js +4 -1
  263. package/examples/jsm/shaders/ToonShader.js +2 -1
  264. package/examples/jsm/shaders/TriangleBlurShader.js +4 -1
  265. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +4 -1
  266. package/examples/jsm/shaders/VelocityShader.js +4 -1
  267. package/examples/jsm/shaders/VerticalBlurShader.js +4 -1
  268. package/examples/jsm/shaders/VerticalTiltShiftShader.js +4 -1
  269. package/examples/jsm/shaders/VignetteShader.js +4 -1
  270. package/examples/jsm/shaders/VolumeShader.js +5 -2
  271. package/examples/jsm/shaders/WaterRefractionShader.js +4 -1
  272. package/examples/jsm/textures/FlakesTexture.js +2 -0
  273. package/examples/jsm/transpiler/AST.js +381 -30
  274. package/examples/jsm/transpiler/GLSLDecoder.js +226 -87
  275. package/examples/jsm/transpiler/Linker.js +327 -0
  276. package/examples/jsm/transpiler/TSLEncoder.js +234 -85
  277. package/examples/jsm/transpiler/Transpiler.js +19 -1
  278. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  279. package/examples/jsm/transpiler/WGSLEncoder.js +788 -0
  280. package/examples/jsm/tsl/display/AfterImageNode.js +2 -3
  281. package/examples/jsm/tsl/display/AnaglyphPassNode.js +1 -0
  282. package/examples/jsm/tsl/display/AnamorphicNode.js +5 -4
  283. package/examples/jsm/tsl/display/BloomNode.js +1 -0
  284. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +206 -0
  285. package/examples/jsm/tsl/display/DenoiseNode.js +33 -33
  286. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -0
  287. package/examples/jsm/tsl/display/DotScreenNode.js +1 -0
  288. package/examples/jsm/tsl/display/FXAANode.js +3 -2
  289. package/examples/jsm/tsl/display/FilmNode.js +1 -0
  290. package/examples/jsm/tsl/display/GTAONode.js +1 -0
  291. package/examples/jsm/tsl/display/GaussianBlurNode.js +4 -29
  292. package/examples/jsm/tsl/display/LensflareNode.js +1 -0
  293. package/examples/jsm/tsl/display/Lut3DNode.js +1 -0
  294. package/examples/jsm/tsl/display/OutlineNode.js +1 -0
  295. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +1 -0
  296. package/examples/jsm/tsl/display/PixelationPassNode.js +1 -0
  297. package/examples/jsm/tsl/display/RGBShiftNode.js +1 -0
  298. package/examples/jsm/tsl/display/SMAANode.js +9 -8
  299. package/examples/jsm/tsl/display/SSAAPassNode.js +5 -4
  300. package/examples/jsm/tsl/display/SSRNode.js +1 -0
  301. package/examples/jsm/tsl/display/SobelOperatorNode.js +1 -0
  302. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -0
  303. package/examples/jsm/tsl/display/StereoPassNode.js +1 -0
  304. package/examples/jsm/tsl/display/TRAAPassNode.js +5 -4
  305. package/examples/jsm/tsl/display/TransitionNode.js +1 -0
  306. package/examples/jsm/tsl/display/hashBlur.js +28 -6
  307. package/examples/jsm/tsl/lighting/TiledLightsNode.js +4 -3
  308. package/examples/jsm/tsl/math/Bayer.js +4 -1
  309. package/examples/jsm/tsl/shadows/TileShadowNode.js +456 -0
  310. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +212 -0
  311. package/examples/jsm/tsl/utils/Raymarching.js +6 -3
  312. package/examples/jsm/utils/BufferGeometryUtils.js +4 -1
  313. package/examples/jsm/utils/CameraUtils.js +4 -1
  314. package/examples/jsm/utils/GeometryCompressionUtils.js +4 -1
  315. package/examples/jsm/utils/GeometryUtils.js +4 -1
  316. package/examples/jsm/utils/LDrawUtils.js +2 -0
  317. package/examples/jsm/utils/SceneOptimizer.js +2 -0
  318. package/examples/jsm/utils/SceneUtils.js +4 -1
  319. package/examples/jsm/utils/ShadowMapViewer.js +2 -0
  320. package/examples/jsm/utils/ShadowMapViewerGPU.js +2 -0
  321. package/examples/jsm/utils/SkeletonUtils.js +4 -1
  322. package/examples/jsm/utils/SortUtils.js +4 -1
  323. package/examples/jsm/utils/UVsDebug.js +4 -1
  324. package/examples/jsm/utils/WebGLTextureUtils.js +4 -1
  325. package/examples/jsm/utils/WebGPUTextureUtils.js +4 -1
  326. package/examples/jsm/utils/WorkerPool.js +2 -0
  327. package/examples/jsm/webxr/ARButton.js +1 -0
  328. package/examples/jsm/webxr/OculusHandModel.js +1 -0
  329. package/examples/jsm/webxr/OculusHandPointerModel.js +1 -0
  330. package/examples/jsm/webxr/Text2D.js +4 -1
  331. package/examples/jsm/webxr/VRButton.js +1 -0
  332. package/examples/jsm/webxr/XRButton.js +1 -0
  333. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -0
  334. package/examples/jsm/webxr/XREstimatedLight.js +1 -0
  335. package/examples/jsm/webxr/XRHandMeshModel.js +2 -0
  336. package/examples/jsm/webxr/XRHandModelFactory.js +2 -0
  337. package/examples/jsm/webxr/XRHandPrimitiveModel.js +2 -0
  338. package/examples/jsm/webxr/XRPlanes.js +1 -0
  339. package/package.json +6 -4
  340. package/src/Three.Core.js +1 -1
  341. package/src/Three.TSL.js +18 -10
  342. package/src/Three.WebGPU.Nodes.js +1 -0
  343. package/src/Three.WebGPU.js +3 -0
  344. package/src/audio/AudioListener.js +13 -10
  345. package/src/cameras/ArrayCamera.js +9 -1
  346. package/src/constants.js +47 -20
  347. package/src/core/BufferAttribute.js +3 -3
  348. package/src/core/BufferGeometry.js +2 -5
  349. package/src/core/Clock.js +2 -8
  350. package/src/core/GLBufferAttribute.js +13 -1
  351. package/src/core/Object3D.js +23 -22
  352. package/src/core/RenderTarget.js +65 -21
  353. package/src/core/RenderTarget3D.js +1 -0
  354. package/src/extras/TextureUtils.js +1 -5
  355. package/src/extras/core/Curve.js +1 -1
  356. package/src/extras/core/Path.js +22 -22
  357. package/src/geometries/CapsuleGeometry.js +167 -17
  358. package/src/geometries/ExtrudeGeometry.js +39 -29
  359. package/src/helpers/ArrowHelper.js +2 -2
  360. package/src/helpers/SkeletonHelper.js +1 -1
  361. package/src/lights/LightShadow.js +14 -0
  362. package/src/lights/SpotLightShadow.js +9 -1
  363. package/src/lights/webgpu/ProjectorLight.js +46 -0
  364. package/src/loaders/BufferGeometryLoader.js +1 -10
  365. package/src/loaders/FileLoader.js +2 -2
  366. package/src/loaders/ImageBitmapLoader.js +25 -9
  367. package/src/loaders/ImageLoader.js +55 -8
  368. package/src/loaders/ObjectLoader.js +44 -16
  369. package/src/loaders/nodes/NodeObjectLoader.js +2 -2
  370. package/src/materials/Material.js +1 -7
  371. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  372. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  373. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  374. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  375. package/src/materials/nodes/MeshSSSNodeMaterial.js +2 -2
  376. package/src/materials/nodes/NodeMaterial.js +105 -19
  377. package/src/materials/nodes/manager/NodeMaterialObserver.js +20 -2
  378. package/src/math/Box3.js +28 -0
  379. package/src/math/Color.js +7 -7
  380. package/src/math/ColorManagement.js +22 -3
  381. package/src/math/Frustum.js +6 -1
  382. package/src/math/FrustumArray.js +253 -0
  383. package/src/math/Quaternion.js +1 -1
  384. package/src/math/Ray.js +2 -0
  385. package/src/math/Sphere.js +28 -0
  386. package/src/nodes/Nodes.js +2 -3
  387. package/src/nodes/TSL.js +5 -3
  388. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  389. package/src/nodes/accessors/Bitangent.js +54 -26
  390. package/src/nodes/accessors/Camera.js +31 -4
  391. package/src/nodes/accessors/CubeTextureNode.js +50 -2
  392. package/src/nodes/accessors/InstanceNode.js +5 -4
  393. package/src/nodes/accessors/Lights.js +2 -2
  394. package/src/nodes/accessors/MaterialNode.js +4 -0
  395. package/src/nodes/accessors/ModelNode.js +1 -1
  396. package/src/nodes/accessors/Normal.js +102 -16
  397. package/src/nodes/accessors/Object3DNode.js +7 -8
  398. package/src/nodes/accessors/Position.js +14 -4
  399. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  400. package/src/nodes/accessors/ReferenceNode.js +1 -1
  401. package/src/nodes/accessors/ReflectVector.js +3 -3
  402. package/src/nodes/accessors/SkinningNode.js +3 -2
  403. package/src/nodes/accessors/StorageBufferNode.js +25 -0
  404. package/src/nodes/accessors/StorageTextureNode.js +14 -3
  405. package/src/nodes/accessors/Tangent.js +25 -17
  406. package/src/nodes/accessors/TangentUtils.js +46 -0
  407. package/src/nodes/accessors/TextureBicubic.js +21 -3
  408. package/src/nodes/accessors/TextureNode.js +59 -8
  409. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  410. package/src/nodes/accessors/VelocityNode.js +1 -0
  411. package/src/nodes/accessors/VertexColorNode.js +4 -4
  412. package/src/nodes/code/CodeNode.js +8 -11
  413. package/src/nodes/core/AssignNode.js +27 -5
  414. package/src/nodes/core/AttributeNode.js +2 -2
  415. package/src/nodes/core/ContextNode.js +7 -3
  416. package/src/nodes/core/Node.js +69 -20
  417. package/src/nodes/core/NodeBuilder.js +248 -29
  418. package/src/nodes/core/NodeUtils.js +42 -0
  419. package/src/nodes/core/NodeVarying.js +19 -1
  420. package/src/nodes/core/PropertyNode.js +8 -12
  421. package/src/nodes/core/StackNode.js +129 -26
  422. package/src/nodes/core/StructTypeNode.js +26 -4
  423. package/src/nodes/core/SubBuildNode.js +89 -0
  424. package/src/nodes/core/VarNode.js +11 -2
  425. package/src/nodes/core/VaryingNode.js +45 -24
  426. package/src/nodes/display/BlendModes.js +42 -1
  427. package/src/nodes/display/ColorSpaceNode.js +4 -27
  428. package/src/nodes/display/FrontFacingNode.js +34 -2
  429. package/src/nodes/display/NormalMapNode.js +19 -50
  430. package/src/nodes/display/PassNode.js +18 -19
  431. package/src/nodes/display/ScreenNode.js +0 -26
  432. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  433. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  434. package/src/nodes/functions/PhongLightingModel.js +3 -3
  435. package/src/nodes/functions/PhysicalLightingModel.js +14 -14
  436. package/src/nodes/functions/ShadowMaskModel.js +5 -1
  437. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  438. package/src/nodes/functions/material/getParallaxCorrectNormal.js +1 -1
  439. package/src/nodes/gpgpu/AtomicFunctionNode.js +28 -10
  440. package/src/nodes/gpgpu/BarrierNode.js +3 -3
  441. package/src/nodes/gpgpu/ComputeNode.js +1 -1
  442. package/src/nodes/lighting/AnalyticLightNode.js +7 -13
  443. package/src/nodes/lighting/EnvironmentNode.js +5 -5
  444. package/src/nodes/lighting/HemisphereLightNode.js +2 -2
  445. package/src/nodes/lighting/IESSpotLightNode.js +2 -1
  446. package/src/nodes/lighting/LightsNode.js +29 -11
  447. package/src/nodes/lighting/ProjectorLightNode.js +78 -0
  448. package/src/nodes/lighting/ShadowBaseNode.js +1 -12
  449. package/src/nodes/lighting/ShadowFilterNode.js +274 -0
  450. package/src/nodes/lighting/ShadowNode.js +174 -242
  451. package/src/nodes/lighting/SpotLightNode.js +44 -7
  452. package/src/nodes/materialx/lib/mx_noise.js +1 -1
  453. package/src/nodes/math/ConditionalNode.js +0 -19
  454. package/src/nodes/math/MathNode.js +68 -21
  455. package/src/nodes/math/OperatorNode.js +108 -98
  456. package/src/nodes/shapes/Shapes.js +5 -4
  457. package/src/nodes/tsl/TSLBase.js +1 -0
  458. package/src/nodes/tsl/TSLCore.js +160 -65
  459. package/src/nodes/utils/DebugNode.js +15 -3
  460. package/src/nodes/utils/Discard.js +2 -2
  461. package/src/nodes/utils/EquirectUV.js +27 -0
  462. package/src/nodes/utils/LoopNode.js +64 -34
  463. package/src/nodes/utils/MatcapUV.js +22 -0
  464. package/src/nodes/utils/RTTNode.js +13 -5
  465. package/src/nodes/utils/ReflectorNode.js +77 -7
  466. package/src/nodes/utils/SampleNode.js +81 -0
  467. package/src/nodes/utils/TriplanarTextures.js +65 -0
  468. package/src/objects/BatchedMesh.js +16 -4
  469. package/src/objects/Mesh.js +9 -0
  470. package/src/objects/Skeleton.js +1 -1
  471. package/src/objects/Sprite.js +9 -0
  472. package/src/renderers/WebGL3DRenderTarget.js +1 -0
  473. package/src/renderers/WebGLArrayRenderTarget.js +1 -0
  474. package/src/renderers/WebGLCubeRenderTarget.js +2 -4
  475. package/src/renderers/WebGLRenderer.js +25 -11
  476. package/src/renderers/common/Animation.js +2 -2
  477. package/src/renderers/common/Background.js +13 -2
  478. package/src/renderers/common/CubeRenderTarget.js +1 -1
  479. package/src/renderers/common/RenderList.js +0 -4
  480. package/src/renderers/common/RenderObject.js +80 -4
  481. package/src/renderers/common/Renderer.js +116 -8
  482. package/src/renderers/common/Storage3DTexture.js +79 -0
  483. package/src/renderers/common/StorageArrayTexture.js +63 -0
  484. package/src/renderers/common/Textures.js +15 -21
  485. package/src/renderers/common/TimestampQueryPool.js +1 -0
  486. package/src/renderers/common/Uniform.js +1 -1
  487. package/src/renderers/common/UniformsGroup.js +14 -18
  488. package/src/renderers/common/XRManager.js +157 -27
  489. package/src/renderers/common/XRRenderTarget.js +21 -4
  490. package/src/renderers/common/extras/PMREMGenerator.js +30 -23
  491. package/src/renderers/common/nodes/Nodes.js +13 -3
  492. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_maps.glsl.js +1 -1
  493. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +1 -1
  494. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
  495. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  496. package/src/renderers/webgl/WebGLPrograms.js +4 -2
  497. package/src/renderers/webgl/WebGLShadowMap.js +3 -2
  498. package/src/renderers/webgl/WebGLState.js +4 -4
  499. package/src/renderers/webgl/WebGLTextures.js +144 -4
  500. package/src/renderers/webgl/WebGLUtils.js +1 -3
  501. package/src/renderers/webgl-fallback/WebGLBackend.js +244 -87
  502. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +73 -7
  503. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  504. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +1 -0
  505. package/src/renderers/webgl-fallback/utils/WebGLState.js +4 -4
  506. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +44 -29
  507. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +22 -21
  508. package/src/renderers/webgpu/WebGPUBackend.js +451 -128
  509. package/src/renderers/webgpu/WebGPURenderer.js +7 -0
  510. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +4 -1
  511. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +4 -1
  512. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +86 -33
  513. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +3 -0
  514. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +9 -1
  515. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +28 -5
  516. package/src/renderers/webgpu/utils/WebGPUConstants.js +8 -2
  517. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +38 -8
  518. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +45 -50
  519. package/src/renderers/webxr/WebXRController.js +1 -1
  520. package/src/renderers/webxr/WebXRManager.js +2 -1
  521. package/src/textures/DepthTexture.js +6 -10
  522. package/src/textures/Source.js +22 -0
  523. package/src/textures/Texture.js +118 -1
  524. package/src/textures/VideoTexture.js +1 -1
  525. package/examples/jsm/effects/PeppersGhostEffect.js +0 -172
  526. package/src/core/RenderTargetArray.js +0 -40
  527. package/src/nodes/utils/EquirectUVNode.js +0 -65
  528. package/src/nodes/utils/MatcapUVNode.js +0 -49
  529. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -2,6 +2,7 @@ import { REVISION } from 'three/webgpu';
2
2
  import * as TSL from 'three/tsl';
3
3
 
4
4
  import { VariableDeclaration, Accessor } from './AST.js';
5
+ import { isExpression, isPrimitive } from './TranspilerUtils.js';
5
6
 
6
7
  const opLib = {
7
8
  '=': 'assign',
@@ -15,6 +16,7 @@ const opLib = {
15
16
  '<=': 'lessThanEqual',
16
17
  '>=': 'greaterThanEqual',
17
18
  '==': 'equal',
19
+ '!=': 'notEqual',
18
20
  '&&': 'and',
19
21
  '||': 'or',
20
22
  '^^': 'xor',
@@ -46,8 +48,6 @@ const unaryLib = {
46
48
 
47
49
  const textureLookupFunctions = [ 'texture', 'texture2D', 'texture3D', 'textureCube', 'textureLod', 'texelFetch', 'textureGrad' ];
48
50
 
49
- const isPrimitive = ( value ) => /^(true|false|-?(\d|\.\d))/.test( value );
50
-
51
51
  class TSLEncoder {
52
52
 
53
53
  constructor() {
@@ -57,11 +57,9 @@ class TSLEncoder {
57
57
  this.global = new Set();
58
58
  this.overloadings = new Map();
59
59
  this.iife = false;
60
- this.uniqueNames = false;
61
60
  this.reference = false;
62
61
 
63
- this._currentProperties = {};
64
- this._lastStatement = null;
62
+ this.block = null;
65
63
 
66
64
  }
67
65
 
@@ -71,7 +69,7 @@ class TSLEncoder {
71
69
 
72
70
  name = name.split( '.' )[ 0 ];
73
71
 
74
- if ( TSL[ name ] !== undefined && this.global.has( name ) === false && this._currentProperties[ name ] === undefined ) {
72
+ if ( TSL[ name ] !== undefined && this.global.has( name ) === false ) {
75
73
 
76
74
  this.imports.add( name );
77
75
 
@@ -129,29 +127,23 @@ class TSLEncoder {
129
127
 
130
128
  }
131
129
 
132
- emitExpression( node ) {
130
+ emitExpression( node, output = null ) {
133
131
 
134
132
  let code;
135
133
 
136
134
  if ( node.isAccessor ) {
137
135
 
138
- this.addImport( node.property );
139
-
140
- code = node.property;
141
-
142
- } else if ( node.isNumber ) {
136
+ if ( node.linker.reference === null ) {
143
137
 
144
- if ( node.type === 'int' || node.type === 'uint' ) {
138
+ this.addImport( node.property );
145
139
 
146
- code = node.type + '( ' + node.value + ' )';
140
+ }
147
141
 
148
- this.addImport( node.type );
142
+ code = node.property;
149
143
 
150
- } else {
144
+ } else if ( node.isNumber ) {
151
145
 
152
- code = node.value;
153
-
154
- }
146
+ code = node.value;
155
147
 
156
148
  } else if ( node.isString ) {
157
149
 
@@ -161,10 +153,10 @@ class TSLEncoder {
161
153
 
162
154
  const opFn = opLib[ node.type ] || node.type;
163
155
 
164
- const left = this.emitExpression( node.left );
165
- const right = this.emitExpression( node.right );
156
+ const left = this.emitExpression( node.left, output );
157
+ const right = this.emitExpression( node.right, output );
166
158
 
167
- if ( isPrimitive( left ) && isPrimitive( right ) ) {
159
+ if ( node.isNumericExpression ) {
168
160
 
169
161
  return left + ' ' + node.type + ' ' + right;
170
162
 
@@ -250,6 +242,18 @@ class TSLEncoder {
250
242
 
251
243
  code = 'Discard()';
252
244
 
245
+ } else if ( node.isBreak ) {
246
+
247
+ this.addImport( 'Break' );
248
+
249
+ code = 'Break()';
250
+
251
+ } else if ( node.isContinue ) {
252
+
253
+ this.addImport( 'Continue' );
254
+
255
+ code = 'Continue()';
256
+
253
257
  } else if ( node.isAccessorElements ) {
254
258
 
255
259
  code = this.emitExpression( node.object );
@@ -290,6 +294,14 @@ class TSLEncoder {
290
294
 
291
295
  code = this.emitFor( node );
292
296
 
297
+ } else if ( node.isWhile ) {
298
+
299
+ code = this.emitWhile( node );
300
+
301
+ } else if ( node.isSwitch ) {
302
+
303
+ code = this.emitSwitch( node );
304
+
293
305
  } else if ( node.isVariableDeclaration ) {
294
306
 
295
307
  code = this.emitVariables( node );
@@ -310,19 +322,29 @@ class TSLEncoder {
310
322
 
311
323
  code = this.emitConditional( node );
312
324
 
313
- } else if ( node.isUnary && node.expression.isNumber ) {
325
+ } else if ( node.isUnary && node.expression.isNumber && node.type === '-' ) {
326
+
327
+ code = '- ' + node.expression.value;
314
328
 
315
- code = node.expression.type + '( ' + node.type + ' ' + node.expression.value + ' )';
329
+ if ( node.expression.type !== 'float' ) {
316
330
 
317
- this.addImport( node.expression.type );
331
+ code = node.expression.type + '( ' + code + ' )';
332
+
333
+ this.addImport( node.expression.type );
334
+
335
+ }
318
336
 
319
337
  } else if ( node.isUnary ) {
320
338
 
321
339
  let type = unaryLib[ node.type ];
322
340
 
323
- if ( node.after === false && ( node.type === '++' || node.type === '--' ) ) {
341
+ if ( node.hasAssignment ) {
342
+
343
+ if ( node.after === false ) {
324
344
 
325
- type += 'Before';
345
+ type += 'Before';
346
+
347
+ }
326
348
 
327
349
  }
328
350
 
@@ -354,23 +376,34 @@ class TSLEncoder {
354
376
 
355
377
  emitBody( body ) {
356
378
 
357
- this.setLastStatement( null );
358
-
359
379
  let code = '';
360
380
 
361
381
  this.tab += '\t';
362
382
 
363
383
  for ( const statement of body ) {
364
384
 
365
- code += this.emitExtraLine( statement );
385
+ code += this.emitExtraLine( statement, body );
386
+
387
+ if ( statement.isComment ) {
388
+
389
+ code += this.emitComment( statement, body );
390
+
391
+ continue;
392
+
393
+ }
394
+
395
+ if ( this.block && this.block.isSwitchCase ) {
396
+
397
+ if ( statement.isBreak ) continue; // skip break statements in switch cases
398
+
399
+ }
400
+
366
401
  code += this.tab + this.emitExpression( statement );
367
402
 
368
403
  if ( code.slice( - 1 ) !== '}' ) code += ';';
369
404
 
370
405
  code += '\n';
371
406
 
372
- this.setLastStatement( statement );
373
-
374
407
  }
375
408
 
376
409
  code = code.slice( 0, - 1 ); // remove the last extra line
@@ -450,12 +483,34 @@ ${ this.tab }} )`;
450
483
  const name = node.initialization.name;
451
484
  const type = node.initialization.type;
452
485
  const condition = node.condition.type;
453
- const update = node.afterthought.type;
454
486
 
455
487
  const nameParam = name !== 'i' ? `, name: '${ name }'` : '';
456
488
  const typeParam = type !== 'int' ? `, type: '${ type }'` : '';
457
489
  const conditionParam = condition !== '<' ? `, condition: '${ condition }'` : '';
458
- const updateParam = update !== '++' ? `, update: '${ update }'` : '';
490
+
491
+ let updateParam = '';
492
+
493
+ if ( node.afterthought.isUnary ) {
494
+
495
+ if ( node.afterthought.type !== '++' ) {
496
+
497
+ updateParam = `, update: '${ node.afterthought.type }'`;
498
+
499
+ }
500
+
501
+ } else if ( node.afterthought.isOperator ) {
502
+
503
+ if ( node.afterthought.right.isAccessor || node.afterthought.right.isNumber ) {
504
+
505
+ updateParam = `, update: ${ this.emitExpression( node.afterthought.right ) }`;
506
+
507
+ } else {
508
+
509
+ updateParam = `, update: ( { i } ) => ${ this.emitExpression( node.afterthought ) }`;
510
+
511
+ }
512
+
513
+ }
459
514
 
460
515
  let loopStr = `Loop( { start: ${ start }, end: ${ end + nameParam + typeParam + conditionParam + updateParam } }, ( { ${ name } } ) => {\n\n`;
461
516
 
@@ -469,14 +524,73 @@ ${ this.tab }} )`;
469
524
 
470
525
  }
471
526
 
527
+
528
+ emitSwitch( switchNode ) {
529
+
530
+ const discriminantString = this.emitExpression( switchNode.discriminant );
531
+
532
+ this.tab += '\t';
533
+
534
+ let switchString = `Switch( ${ discriminantString } )\n${ this.tab }`;
535
+
536
+ const previousBlock = this.block;
537
+
538
+ for ( const switchCase of switchNode.cases ) {
539
+
540
+ this.block = switchCase;
541
+
542
+ let caseBodyString;
543
+
544
+ if ( ! switchCase.isDefault ) {
545
+
546
+ const caseConditions = [ ];
547
+
548
+ for ( const condition of switchCase.conditions ) {
549
+
550
+ caseConditions.push( this.emitExpression( condition ) );
551
+
552
+ }
553
+
554
+ caseBodyString = this.emitBody( switchCase.body );
555
+
556
+ switchString += `.Case( ${ caseConditions.join( ', ' ) }, `;
557
+
558
+ } else {
559
+
560
+ caseBodyString = this.emitBody( switchCase.body );
561
+
562
+ switchString += '.Default( ';
563
+
564
+ }
565
+
566
+ switchString += `() => {
567
+
568
+ ${ caseBodyString }
569
+
570
+ ${ this.tab }} )`;
571
+
572
+ }
573
+
574
+ this.block = previousBlock;
575
+
576
+ this.tab = this.tab.slice( 0, - 1 );
577
+
578
+ this.imports.add( 'Switch' );
579
+
580
+ return switchString;
581
+
582
+ }
583
+
472
584
  emitFor( node ) {
473
585
 
474
586
  const { initialization, condition, afterthought } = node;
475
587
 
476
588
  if ( ( initialization && initialization.isVariableDeclaration && initialization.next === null ) &&
477
589
  ( condition && condition.left.isAccessor && condition.left.property === initialization.name ) &&
478
- ( afterthought && afterthought.isUnary ) &&
479
- ( initialization.name === afterthought.expression.property )
590
+ ( afterthought && (
591
+ ( afterthought.isUnary && ( initialization.name === afterthought.expression.property ) ) ||
592
+ ( afterthought.isOperator && ( initialization.name === afterthought.left.property ) )
593
+ ) )
480
594
  ) {
481
595
 
482
596
  return this.emitLoop( node );
@@ -496,7 +610,7 @@ ${ this.tab }} )`;
496
610
  this.tab += '\t';
497
611
 
498
612
  let forStr = '{\n\n' + this.tab + initialization + ';\n\n';
499
- forStr += `${ this.tab }While( ${ condition }, () => {\n\n`;
613
+ forStr += `${ this.tab }Loop( ${ condition }, () => {\n\n`;
500
614
 
501
615
  forStr += this.emitBody( node.body ) + '\n\n';
502
616
 
@@ -508,42 +622,64 @@ ${ this.tab }} )`;
508
622
 
509
623
  forStr += this.tab + '}';
510
624
 
511
- this.imports.add( 'While' );
625
+ this.imports.add( 'Loop' );
512
626
 
513
627
  return forStr;
514
628
 
515
629
  }
516
630
 
631
+ emitWhile( node ) {
632
+
633
+ const condition = this.emitExpression( node.condition );
634
+
635
+ let whileStr = `Loop( ${ condition }, () => {\n\n`;
636
+
637
+ whileStr += this.emitBody( node.body ) + '\n\n';
638
+
639
+ whileStr += this.tab + '} )';
640
+
641
+ this.imports.add( 'Loop' );
642
+
643
+ return whileStr;
644
+
645
+ }
646
+
517
647
  emitVariables( node, isRoot = true ) {
518
648
 
519
649
  const { name, type, value, next } = node;
520
650
 
521
- const valueStr = value ? this.emitExpression( value ) : '';
522
-
523
651
  let varStr = isRoot ? 'const ' : '';
524
652
  varStr += name;
525
653
 
526
654
  if ( value ) {
527
655
 
528
- if ( value.isFunctionCall && value.name === type ) {
656
+ let valueStr = this.emitExpression( value );
529
657
 
530
- varStr += ' = ' + valueStr;
658
+ if ( value.isNumericExpression ) {
531
659
 
532
- } else {
660
+ // convert JS primitive to node
661
+
662
+ valueStr = `${ type }( ${ valueStr } )`;
533
663
 
534
- varStr += ` = ${ type }( ${ valueStr } )`;
664
+ this.addImport( type );
535
665
 
536
666
  }
537
667
 
538
- } else {
668
+ if ( node.linker.assignments.length > 0 ) {
539
669
 
540
- varStr += ` = ${ type }()`;
670
+ varStr += ' = ' + valueStr + '.toVar()';
541
671
 
542
- }
672
+ } else {
673
+
674
+ varStr += ' = ' + valueStr;
675
+
676
+ }
677
+
678
+ } else {
543
679
 
544
- if ( node.immutable === false ) {
680
+ varStr += ` = property( '${ type }' )`;
545
681
 
546
- varStr += '.toVar()';
682
+ this.addImport( 'property' );
547
683
 
548
684
  }
549
685
 
@@ -553,8 +689,6 @@ ${ this.tab }} )`;
553
689
 
554
690
  }
555
691
 
556
- this.addImport( type );
557
-
558
692
  return varStr;
559
693
 
560
694
  }
@@ -578,7 +712,7 @@ ${ this.tab }} )`;
578
712
 
579
713
  const prefix = this.iife === false ? 'export ' : '';
580
714
 
581
- return `${ prefix }const ${ name } = /*#__PURE__*/ overloadingFn( [ ${ nodes.map( node => node.name + '_' + nodes.indexOf( node ) ).join( ', ' ) } ] );\n`;
715
+ return `${ prefix }const ${ name } = /*@__PURE__*/ overloadingFn( [ ${ nodes.map( node => node.name + '_' + nodes.indexOf( node ) ).join( ', ' ) } ] );\n`;
582
716
 
583
717
  }
584
718
 
@@ -586,8 +720,6 @@ ${ this.tab }} )`;
586
720
 
587
721
  const { name, type } = node;
588
722
 
589
- this._currentProperties = { name: node };
590
-
591
723
  const params = [];
592
724
  const inputs = [];
593
725
  const mutableParams = [];
@@ -596,11 +728,9 @@ ${ this.tab }} )`;
596
728
 
597
729
  for ( const param of node.params ) {
598
730
 
599
- let str = `{ name: '${ param.name }', type: '${ param.type }'`;
600
-
601
731
  let name = param.name;
602
732
 
603
- if ( param.immutable === false && ( param.qualifier !== 'inout' && param.qualifier !== 'out' ) ) {
733
+ if ( param.linker.assignments.length > 0 ) {
604
734
 
605
735
  name = name + '_immutable';
606
736
 
@@ -616,20 +746,20 @@ ${ this.tab }} )`;
616
746
 
617
747
  }
618
748
 
619
- str += ', qualifier: \'' + param.qualifier + '\'';
620
-
621
749
  }
622
750
 
623
- inputs.push( str + ' }' );
751
+ inputs.push( param.name + ': \'' + param.type + '\'' );
624
752
  params.push( name );
625
753
 
626
- this._currentProperties[ name ] = param;
627
-
628
754
  }
629
755
 
630
756
  for ( const param of mutableParams ) {
631
757
 
632
- node.body.unshift( new VariableDeclaration( param.type, param.name, new Accessor( param.name + '_immutable' ) ) );
758
+ const mutableParam = new VariableDeclaration( param.type, param.name, new Accessor( param.name + '_immutable' ), null, true );
759
+ mutableParam.parent = param.parent; // link to the original node
760
+ mutableParam.linker.assignments.push( mutableParam );
761
+
762
+ node.body.unshift( mutableParam );
633
763
 
634
764
  }
635
765
 
@@ -661,27 +791,19 @@ ${ this.tab }} )`;
661
791
 
662
792
  const prefix = this.iife === false ? 'export ' : '';
663
793
 
664
- let funcStr = `${ prefix }const ${ fnName } = /*#__PURE__*/ Fn( (${ paramsStr }) => {
794
+ let funcStr = `${ prefix }const ${ fnName } = /*@__PURE__*/ Fn( (${ paramsStr }) => {
665
795
 
666
796
  ${ bodyStr }
667
797
 
668
- ${ this.tab }} )`;
669
-
670
- const layoutInput = inputs.length > 0 ? '\n\t\t' + this.tab + inputs.join( ',\n\t\t' + this.tab ) + '\n\t' + this.tab : '';
798
+ ${ this.tab }}`;
671
799
 
672
800
  if ( node.layout !== false && hasPointer === false ) {
673
801
 
674
- const uniqueName = this.uniqueNames ? fnName + '_' + Math.random().toString( 36 ).slice( 2 ) : fnName;
675
-
676
- funcStr += `.setLayout( {
677
- ${ this.tab }\tname: '${ uniqueName }',
678
- ${ this.tab }\ttype: '${ type }',
679
- ${ this.tab }\tinputs: [${ layoutInput }]
680
- ${ this.tab }} )`;
802
+ funcStr += ', { ' + inputs.join( ', ' ) + ', return: \'' + type + '\' }';
681
803
 
682
804
  }
683
805
 
684
- funcStr += ';\n';
806
+ funcStr += ' );\n';
685
807
 
686
808
  this.imports.add( 'Fn' );
687
809
 
@@ -697,21 +819,42 @@ ${ this.tab }} )`;
697
819
 
698
820
  }
699
821
 
700
- setLastStatement( statement ) {
822
+ emitComment( statement, body ) {
701
823
 
702
- this._lastStatement = statement;
824
+ const index = body.indexOf( statement );
825
+ const previous = body[ index - 1 ];
826
+ const next = body[ index + 1 ];
827
+
828
+ let output = '';
829
+
830
+ if ( previous && isExpression( previous ) ) {
831
+
832
+ output += '\n';
833
+
834
+ }
835
+
836
+ output += this.tab + statement.comment.replace( /\n/g, '\n' + this.tab ) + '\n';
837
+
838
+ if ( next && isExpression( next ) ) {
839
+
840
+ output += '\n';
841
+
842
+ }
843
+
844
+ return output;
703
845
 
704
846
  }
705
847
 
706
- emitExtraLine( statement ) {
848
+ emitExtraLine( statement, body ) {
849
+
850
+ const index = body.indexOf( statement );
851
+ const previous = body[ index - 1 ];
707
852
 
708
- const last = this._lastStatement;
709
- if ( last === null ) return '';
853
+ if ( previous === undefined ) return '';
710
854
 
711
855
  if ( statement.isReturn ) return '\n';
712
856
 
713
- const isExpression = ( st ) => st.isFunctionDeclaration !== true && st.isFor !== true && st.isConditional !== true;
714
- const lastExp = isExpression( last );
857
+ const lastExp = isExpression( previous );
715
858
  const currExp = isExpression( statement );
716
859
 
717
860
  if ( lastExp !== currExp || ( ! lastExp && ! currExp ) ) return '\n';
@@ -746,7 +889,15 @@ ${ this.tab }} )`;
746
889
 
747
890
  for ( const statement of ast.body ) {
748
891
 
749
- code += this.emitExtraLine( statement );
892
+ code += this.emitExtraLine( statement, ast.body );
893
+
894
+ if ( statement.isComment ) {
895
+
896
+ code += this.emitComment( statement, ast.body );
897
+
898
+ continue;
899
+
900
+ }
750
901
 
751
902
  if ( statement.isFunctionDeclaration ) {
752
903
 
@@ -758,8 +909,6 @@ ${ this.tab }} )`;
758
909
 
759
910
  }
760
911
 
761
- this.setLastStatement( statement );
762
-
763
912
  }
764
913
 
765
914
  const imports = [ ...this.imports ];
@@ -1,9 +1,13 @@
1
+ import Linker from './Linker.js';
2
+
1
3
  /**
2
4
  * A class that transpiles shader code from one language into another.
3
5
  *
4
6
  * `Transpiler` can only be used to convert GLSL into TSL right now. It is intended
5
7
  * to support developers when they want to migrate their custom materials from the
6
8
  * current to the new node-based material system.
9
+ *
10
+ * @three_import import Transpiler from 'three/addons/transpiler/Transpiler.js';
7
11
  */
8
12
  class Transpiler {
9
13
 
@@ -30,6 +34,15 @@ class Transpiler {
30
34
  */
31
35
  this.encoder = encoder;
32
36
 
37
+ /**
38
+ * The linker. It processes the AST and resolves
39
+ * variable and function references, ensuring that all
40
+ * dependencies are properly linked.
41
+ *
42
+ * @type {Linker}
43
+ */
44
+ this.linker = new Linker();
45
+
33
46
  }
34
47
 
35
48
  /**
@@ -40,7 +53,12 @@ class Transpiler {
40
53
  */
41
54
  parse( source ) {
42
55
 
43
- return this.encoder.emit( this.decoder.parse( source ) );
56
+ const ast = this.decoder.parse( source );
57
+
58
+ // Process the AST to resolve variable and function references and optimizations.
59
+ this.linker.process( ast );
60
+
61
+ return this.encoder.emit( ast );
44
62
 
45
63
  }
46
64
 
@@ -0,0 +1,29 @@
1
+ export function isExpression( st ) {
2
+
3
+ return st.isFunctionDeclaration !== true && st.isFor !== true && st.isWhile !== true && st.isConditional !== true && st.isSwitch !== true;
4
+
5
+ }
6
+
7
+ export function isPrimitive( value ) {
8
+
9
+ return /^(true|false|-?(\d|\.\d))/.test( value );
10
+
11
+ }
12
+
13
+ export function isType( str ) {
14
+
15
+ return /void|bool|float|u?int|mat[234]|mat[234]x[234]|(u|i|b)?vec[234]/.test( str );
16
+
17
+ }
18
+
19
+ export function toFloatType( type ) {
20
+
21
+ if ( /^(i?int)$/.test( type ) ) return 'float';
22
+
23
+ const vecMatch = /^(i|u)?vec([234])$/.exec( type );
24
+
25
+ if ( vecMatch ) return 'vec' + vecMatch[ 2 ];
26
+
27
+ return type;
28
+
29
+ }