@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
@@ -85,7 +85,7 @@ const shaderNodeHandler = {
85
85
 
86
86
  prop = parseSwizzleAndSort( prop.slice( 3 ).toLowerCase() );
87
87
 
88
- return ( value ) => nodeObject( new SetNode( node, prop, value ) );
88
+ return ( value ) => nodeObject( new SetNode( node, prop, nodeObject( value ) ) );
89
89
 
90
90
  } else if ( /^flip[XYZWRGBASTPQ]{1,4}$/.test( prop ) === true ) {
91
91
 
@@ -175,7 +175,7 @@ const ShaderNodeObject = function ( obj, altType = null ) {
175
175
 
176
176
  } else if ( type === 'shader' ) {
177
177
 
178
- return Fn( obj );
178
+ return obj.isFn ? obj : Fn( obj );
179
179
 
180
180
  }
181
181
 
@@ -304,6 +304,8 @@ class ShaderCallNodeInternal extends Node {
304
304
  this.shaderNode = shaderNode;
305
305
  this.inputNodes = inputNodes;
306
306
 
307
+ this.isShaderCallNodeInternal = true;
308
+
307
309
  }
308
310
 
309
311
  getNodeType( builder ) {
@@ -323,10 +325,22 @@ class ShaderCallNodeInternal extends Node {
323
325
  const { shaderNode, inputNodes } = this;
324
326
 
325
327
  const properties = builder.getNodeProperties( shaderNode );
326
- if ( properties.onceOutput ) return properties.onceOutput;
328
+
329
+ const subBuild = builder.getClosestSubBuild( shaderNode.subBuilds ) || '';
330
+ const subBuildProperty = subBuild || 'default';
331
+
332
+ if ( properties[ subBuildProperty ] ) {
333
+
334
+ return properties[ subBuildProperty ];
335
+
336
+ }
327
337
 
328
338
  //
329
339
 
340
+ const previousSubBuildFn = builder.subBuildFn;
341
+
342
+ builder.subBuildFn = subBuild;
343
+
330
344
  let result = null;
331
345
 
332
346
  if ( shaderNode.layout ) {
@@ -364,9 +378,11 @@ class ShaderCallNodeInternal extends Node {
364
378
 
365
379
  }
366
380
 
381
+ builder.subBuildFn = previousSubBuildFn;
382
+
367
383
  if ( shaderNode.once ) {
368
384
 
369
- properties.onceOutput = result;
385
+ properties[ subBuildProperty ] = result;
370
386
 
371
387
  }
372
388
 
@@ -374,41 +390,86 @@ class ShaderCallNodeInternal extends Node {
374
390
 
375
391
  }
376
392
 
393
+ setupOutput( builder ) {
394
+
395
+ builder.addStack();
396
+
397
+ builder.stack.outputNode = this.call( builder );
398
+
399
+ return builder.removeStack();
400
+
401
+ }
402
+
377
403
  getOutputNode( builder ) {
378
404
 
379
405
  const properties = builder.getNodeProperties( this );
406
+ const subBuildOutput = builder.getSubBuildOutput( this );
380
407
 
381
- if ( properties.outputNode === null ) {
408
+ properties[ subBuildOutput ] = properties[ subBuildOutput ] || this.setupOutput( builder );
409
+ properties[ subBuildOutput ].subBuild = builder.getClosestSubBuild( this );
382
410
 
383
- properties.outputNode = this.setupOutput( builder );
411
+ return properties[ subBuildOutput ];
384
412
 
385
- }
413
+ }
386
414
 
387
- return properties.outputNode;
415
+ build( builder, output = null ) {
388
416
 
389
- }
417
+ let result = null;
390
418
 
391
- setup( builder ) {
419
+ const buildStage = builder.getBuildStage();
420
+ const properties = builder.getNodeProperties( this );
392
421
 
393
- return this.getOutputNode( builder );
422
+ const subBuildOutput = builder.getSubBuildOutput( this );
423
+ const outputNode = this.getOutputNode( builder );
394
424
 
395
- }
425
+ if ( buildStage === 'setup' ) {
396
426
 
397
- setupOutput( builder ) {
427
+ const subBuildInitialized = builder.getSubBuildProperty( 'initialized', this );
398
428
 
399
- builder.addStack();
429
+ if ( properties[ subBuildInitialized ] !== true ) {
400
430
 
401
- builder.stack.outputNode = this.call( builder );
431
+ properties[ subBuildInitialized ] = true;
402
432
 
403
- return builder.removeStack();
433
+ properties[ subBuildOutput ] = this.getOutputNode( builder );
434
+ properties[ subBuildOutput ].build( builder );
404
435
 
405
- }
436
+ // If the shaderNode has subBuilds, add them to the chaining nodes
437
+ // so they can be built later in the build process.
406
438
 
407
- generate( builder, output ) {
439
+ if ( this.shaderNode.subBuilds ) {
408
440
 
409
- const outputNode = this.getOutputNode( builder );
441
+ for ( const node of builder.chaining ) {
442
+
443
+ const nodeData = builder.getDataFromNode( node, 'any' );
444
+ nodeData.subBuilds = nodeData.subBuilds || new Set();
445
+
446
+ for ( const subBuild of this.shaderNode.subBuilds ) {
447
+
448
+ nodeData.subBuilds.add( subBuild );
449
+
450
+ }
451
+
452
+ //builder.getDataFromNode( node ).subBuilds = nodeData.subBuilds;
453
+
454
+ }
455
+
456
+ }
457
+
458
+ }
459
+
460
+ result = properties[ subBuildOutput ];
410
461
 
411
- return outputNode.build( builder, output );
462
+ } else if ( buildStage === 'analyze' ) {
463
+
464
+ outputNode.build( builder, output );
465
+
466
+ } else if ( buildStage === 'generate' ) {
467
+
468
+ result = outputNode.build( builder, output ) || '';
469
+
470
+ }
471
+
472
+ return result;
412
473
 
413
474
  }
414
475
 
@@ -493,20 +554,6 @@ const getConstNode = ( value, type ) => {
493
554
 
494
555
  };
495
556
 
496
- const safeGetNodeType = ( node ) => {
497
-
498
- try {
499
-
500
- return node.getNodeType();
501
-
502
- } catch ( _ ) {
503
-
504
- return undefined;
505
-
506
- }
507
-
508
- };
509
-
510
557
  const ConvertType = function ( type, cacheMap = null ) {
511
558
 
512
559
  return ( ...params ) => {
@@ -526,7 +573,7 @@ const ConvertType = function ( type, cacheMap = null ) {
526
573
  if ( params.length === 1 ) {
527
574
 
528
575
  const node = getConstNode( params[ 0 ], type );
529
- if ( safeGetNodeType( node ) === type ) return nodeObject( node );
576
+ if ( node.nodeType === type ) return nodeObject( node );
530
577
  return nodeObject( new ConvertNode( node, type ) );
531
578
 
532
579
  }
@@ -598,7 +645,9 @@ export const Fn = ( jsFunc, layout = null ) => {
598
645
 
599
646
  nodeObjects( params );
600
647
 
601
- if ( params[ 0 ] && params[ 0 ].isNode ) {
648
+ const isArrayAsParameter = params[ 0 ] && ( params[ 0 ].isNode || Object.getPrototypeOf( params[ 0 ] ) !== Object.prototype );
649
+
650
+ if ( isArrayAsParameter ) {
602
651
 
603
652
  inputs = [ ...params ];
604
653
 
@@ -608,11 +657,21 @@ export const Fn = ( jsFunc, layout = null ) => {
608
657
 
609
658
  }
610
659
 
611
- return shaderNode.call( inputs );
660
+ const fnCall = shaderNode.call( inputs );
661
+
662
+ if ( nodeType === 'void' ) fnCall.toStack();
663
+
664
+ return fnCall;
612
665
 
613
666
  };
614
667
 
615
668
  fn.shaderNode = shaderNode;
669
+ fn.id = shaderNode.id;
670
+
671
+ fn.isFn = true;
672
+
673
+ fn.getNodeType = ( ...params ) => shaderNode.getNodeType( ...params );
674
+ fn.getCacheKey = ( ...params ) => shaderNode.getCacheKey( ...params );
616
675
 
617
676
  fn.setLayout = ( layout ) => {
618
677
 
@@ -622,9 +681,10 @@ export const Fn = ( jsFunc, layout = null ) => {
622
681
 
623
682
  };
624
683
 
625
- fn.once = () => {
684
+ fn.once = ( subBuilds = null ) => {
626
685
 
627
686
  shaderNode.once = true;
687
+ shaderNode.subBuilds = subBuilds;
628
688
 
629
689
  return fn;
630
690
 
@@ -663,31 +723,6 @@ export const Fn = ( jsFunc, layout = null ) => {
663
723
 
664
724
  };
665
725
 
666
- /**
667
- * @tsl
668
- * @function
669
- * @deprecated since r168. Use {@link Fn} instead.
670
- *
671
- * @param {...any} params
672
- * @returns {Function}
673
- */
674
- export const tslFn = ( ...params ) => { // @deprecated, r168
675
-
676
- console.warn( 'THREE.TSL: tslFn() has been renamed to Fn().' );
677
- return Fn( ...params );
678
-
679
- };
680
-
681
- //
682
-
683
- addMethodChaining( 'toGlobal', ( node ) => {
684
-
685
- node.global = true;
686
-
687
- return node;
688
-
689
- } );
690
-
691
726
  //
692
727
 
693
728
  export const setCurrentStack = ( stack ) => {
@@ -704,9 +739,44 @@ export const setCurrentStack = ( stack ) => {
704
739
 
705
740
  export const getCurrentStack = () => currentStack;
706
741
 
742
+ /**
743
+ * Represent a conditional node using if/else statements.
744
+ *
745
+ * ```js
746
+ * If( condition, function )
747
+ * .ElseIf( condition, function )
748
+ * .Else( function )
749
+ * ```
750
+ * @tsl
751
+ * @function
752
+ * @param {...any} params - The parameters for the conditional node.
753
+ * @returns {StackNode} The conditional node.
754
+ */
707
755
  export const If = ( ...params ) => currentStack.If( ...params );
708
756
 
709
- export function append( node ) {
757
+ /**
758
+ * Represent a conditional node using switch/case statements.
759
+ *
760
+ * ```js
761
+ * Switch( value )
762
+ * .Case( 1, function )
763
+ * .Case( 2, 3, 4, function )
764
+ * .Default( function )
765
+ * ```
766
+ * @tsl
767
+ * @function
768
+ * @param {...any} params - The parameters for the conditional node.
769
+ * @returns {StackNode} The conditional node.
770
+ */
771
+ export const Switch = ( ...params ) => currentStack.Switch( ...params );
772
+
773
+ /**
774
+ * Add the given node to the current stack.
775
+ *
776
+ * @param {Node} node - The node to add.
777
+ * @returns {Node} The node that was added to the stack.
778
+ */
779
+ export function Stack( node ) {
710
780
 
711
781
  if ( currentStack ) currentStack.add( node );
712
782
 
@@ -714,7 +784,7 @@ export function append( node ) {
714
784
 
715
785
  }
716
786
 
717
- addMethodChaining( 'append', append );
787
+ addMethodChaining( 'toStack', Stack );
718
788
 
719
789
  // types
720
790
 
@@ -776,3 +846,28 @@ export const split = ( node, channels ) => nodeObject( new SplitNode( nodeObject
776
846
 
777
847
  addMethodChaining( 'element', element );
778
848
  addMethodChaining( 'convert', convert );
849
+
850
+ // deprecated
851
+
852
+ /**
853
+ * @tsl
854
+ * @function
855
+ * @deprecated since r176. Use {@link Stack} instead.
856
+ *
857
+ * @param {Node} node - The node to add.
858
+ * @returns {Function}
859
+ */
860
+ export const append = ( node ) => { // @deprecated, r176
861
+
862
+ console.warn( 'THREE.TSL: append() has been renamed to Stack().' );
863
+ return Stack( node );
864
+
865
+ };
866
+
867
+ addMethodChaining( 'append', ( node ) => { // @deprecated, r176
868
+
869
+ console.warn( 'THREE.TSL: .append() has been renamed to .toStack().' );
870
+ return Stack( node );
871
+
872
+ } );
873
+
@@ -41,15 +41,18 @@ class DebugNode extends TempNode {
41
41
  const callback = this.callback;
42
42
  const snippet = this.node.build( builder );
43
43
 
44
+ const title = '--- TSL debug - ' + builder.shaderStage + ' shader ---';
45
+ const border = '-'.repeat( title.length );
46
+
44
47
  let code = '';
45
- code += '// #--- TSL Debug ---#\n';
48
+ code += '// #' + title + '#\n';
46
49
  code += builder.flow.code.replace( /^\t/mg, '' ) + '\n';
47
50
  code += '/* ... */ ' + snippet + ' /* ... */\n';
48
- code += '// #-----------------#\n';
51
+ code += '// #' + border + '#\n';
49
52
 
50
53
  if ( callback !== null ) {
51
54
 
52
- callback( code );
55
+ callback( builder, code );
53
56
 
54
57
  } else {
55
58
 
@@ -65,6 +68,15 @@ class DebugNode extends TempNode {
65
68
 
66
69
  export default DebugNode;
67
70
 
71
+ /**
72
+ * TSL function for creating a debug node.
73
+ *
74
+ * @tsl
75
+ * @function
76
+ * @param {Node} node - The node to debug.
77
+ * @param {?Function} [callback=null] - Optional callback function to handle the debug output.
78
+ * @returns {DebugNode}
79
+ */
68
80
  export const debug = ( node, callback = null ) => nodeObject( new DebugNode( nodeObject( node ), callback ) );
69
81
 
70
82
  addMethodChaining( 'debug', debug );
@@ -10,7 +10,7 @@ import { addMethodChaining } from '../tsl/TSLCore.js';
10
10
  * @param {?ConditionalNode} conditional - An optional conditional node. It allows to decide whether the discard should be executed or not.
11
11
  * @return {Node} The `discard` expression.
12
12
  */
13
- export const Discard = ( conditional ) => ( conditional ? select( conditional, expression( 'discard' ) ) : expression( 'discard' ) ).append();
13
+ export const Discard = ( conditional ) => ( conditional ? select( conditional, expression( 'discard' ) ) : expression( 'discard' ) ).toStack();
14
14
 
15
15
  /**
16
16
  * Represents a `return` shader operation in TSL.
@@ -19,6 +19,6 @@ export const Discard = ( conditional ) => ( conditional ? select( conditional, e
19
19
  * @function
20
20
  * @return {ExpressionNode} The `return` expression.
21
21
  */
22
- export const Return = () => expression( 'return' ).append();
22
+ export const Return = () => expression( 'return' ).toStack();
23
23
 
24
24
  addMethodChaining( 'discard', Discard );
@@ -0,0 +1,27 @@
1
+ import { positionWorldDirection } from '../accessors/Position.js';
2
+ import { Fn, vec2 } from '../tsl/TSLBase.js';
3
+
4
+ /**
5
+ * TSL function for creating an equirect uv node.
6
+ *
7
+ * Can be used to compute texture coordinates for projecting an
8
+ * equirectangular texture onto a mesh for using it as the scene's
9
+ * background.
10
+ *
11
+ * ```js
12
+ * scene.backgroundNode = texture( equirectTexture, equirectUV() );
13
+ * ```
14
+ *
15
+ * @tsl
16
+ * @function
17
+ * @param {?Node<vec3>} [dirNode=positionWorldDirection] - A direction vector for sampling which is by default `positionWorldDirection`.
18
+ * @returns {Node<vec2>}
19
+ */
20
+ export const equirectUV = /*@__PURE__*/ Fn( ( [ dir = positionWorldDirection ] ) => {
21
+
22
+ const u = dir.z.atan( dir.x ).mul( 1 / ( Math.PI * 2 ) ).add( 0.5 );
23
+ const v = dir.y.clamp( - 1.0, 1.0 ).asin().mul( 1 / Math.PI ).add( 0.5 );
24
+
25
+ return vec2( u, v );
26
+
27
+ } );
@@ -1,6 +1,6 @@
1
1
  import Node from '../core/Node.js';
2
2
  import { expression } from '../code/ExpressionNode.js';
3
- import { nodeObject, nodeArray } from '../tsl/TSLBase.js';
3
+ import { nodeObject, nodeArray, Fn } from '../tsl/TSLBase.js';
4
4
 
5
5
  /**
6
6
  * This module offers a variety of ways to implement loops in TSL. In it's basic form it's:
@@ -101,9 +101,17 @@ class LoopNode extends Node {
101
101
 
102
102
  const stack = builder.addStack(); // TODO: cache() it
103
103
 
104
- properties.returnsNode = this.params[ this.params.length - 1 ]( inputs, stack, builder );
104
+ properties.returnsNode = this.params[ this.params.length - 1 ]( inputs, builder );
105
105
  properties.stackNode = stack;
106
106
 
107
+ const baseParam = this.params[ 0 ];
108
+
109
+ if ( baseParam.isNode !== true && typeof baseParam.update === 'function' ) {
110
+
111
+ properties.updateNode = Fn( this.params[ 0 ].update )( inputs );
112
+
113
+ }
114
+
107
115
  builder.removeStack();
108
116
 
109
117
  return properties;
@@ -222,30 +230,69 @@ class LoopNode extends Node {
222
230
  const startSnippet = internalParam.start;
223
231
  const endSnippet = internalParam.end;
224
232
 
225
- let declarationSnippet = '';
226
- let conditionalSnippet = '';
227
- let updateSnippet = '';
233
+ let updateSnippet;
234
+
235
+ const deltaOperator = () => condition.includes( '<' ) ? '+=' : '-=';
236
+
237
+ if ( update !== undefined && update !== null ) {
238
+
239
+ switch ( typeof update ) {
240
+
241
+ case 'function':
242
+
243
+ const flow = builder.flowStagesNode( properties.updateNode, 'void' );
244
+ const snippet = flow.code.replace( /\t|;/g, '' );
245
+
246
+ updateSnippet = snippet;
247
+
248
+ break;
249
+
250
+ case 'number':
251
+
252
+ updateSnippet = name + ' ' + deltaOperator() + ' ' + builder.generateConst( type, update );
253
+
254
+ break;
255
+
256
+ case 'string':
257
+
258
+ updateSnippet = name + ' ' + update;
259
+
260
+ break;
261
+
262
+ default:
263
+
264
+ if ( update.isNode ) {
228
265
 
229
- if ( ! update ) {
266
+ updateSnippet = name + ' ' + deltaOperator() + ' ' + update.build( builder );
267
+
268
+ } else {
269
+
270
+ console.error( 'THREE.TSL: \'Loop( { update: ... } )\' is not a function, string or number.' );
271
+
272
+ updateSnippet = 'break /* invalid update */';
273
+
274
+ }
275
+
276
+ }
277
+
278
+ } else {
230
279
 
231
280
  if ( type === 'int' || type === 'uint' ) {
232
281
 
233
- if ( condition.includes( '<' ) ) update = '++';
234
- else update = '--';
282
+ update = condition.includes( '<' ) ? '++' : '--';
235
283
 
236
284
  } else {
237
285
 
238
- if ( condition.includes( '<' ) ) update = '+= 1.';
239
- else update = '-= 1.';
286
+ update = deltaOperator() + ' 1.';
240
287
 
241
288
  }
242
289
 
243
- }
290
+ updateSnippet = name + ' ' + update;
244
291
 
245
- declarationSnippet += builder.getVar( type, name ) + ' = ' + startSnippet;
292
+ }
246
293
 
247
- conditionalSnippet += name + ' ' + condition + ' ' + endSnippet;
248
- updateSnippet += name + ' ' + update;
294
+ const declarationSnippet = builder.getVar( type, name ) + ' = ' + startSnippet;
295
+ const conditionalSnippet = name + ' ' + condition + ' ' + endSnippet;
249
296
 
250
297
  loopSnippet = `for ( ${ declarationSnippet }; ${ conditionalSnippet }; ${ updateSnippet } )`;
251
298
 
@@ -285,7 +332,7 @@ export default LoopNode;
285
332
  * @param {...any} params - A list of parameters.
286
333
  * @returns {LoopNode}
287
334
  */
288
- export const Loop = ( ...params ) => nodeObject( new LoopNode( nodeArray( params, 'int' ) ) ).append();
335
+ export const Loop = ( ...params ) => nodeObject( new LoopNode( nodeArray( params, 'int' ) ) ).toStack();
289
336
 
290
337
  /**
291
338
  * TSL function for creating a `Continue()` expression.
@@ -294,7 +341,7 @@ export const Loop = ( ...params ) => nodeObject( new LoopNode( nodeArray( params
294
341
  * @function
295
342
  * @returns {ExpressionNode}
296
343
  */
297
- export const Continue = () => expression( 'continue' ).append();
344
+ export const Continue = () => expression( 'continue' ).toStack();
298
345
 
299
346
  /**
300
347
  * TSL function for creating a `Break()` expression.
@@ -303,21 +350,4 @@ export const Continue = () => expression( 'continue' ).append();
303
350
  * @function
304
351
  * @returns {ExpressionNode}
305
352
  */
306
- export const Break = () => expression( 'break' ).append();
307
-
308
- // Deprecated
309
-
310
- /**
311
- * @tsl
312
- * @function
313
- * @deprecated since r168. Use {@link Loop} instead.
314
- *
315
- * @param {...any} params
316
- * @returns {LoopNode}
317
- */
318
- export const loop = ( ...params ) => { // @deprecated, r168
319
-
320
- console.warn( 'THREE.TSL: loop() has been renamed to Loop().' );
321
- return Loop( ...params );
322
-
323
- };
353
+ export const Break = () => expression( 'break' ).toStack();
@@ -0,0 +1,22 @@
1
+ import { normalView } from '../accessors/Normal.js';
2
+ import { positionViewDirection } from '../accessors/Position.js';
3
+ import { Fn, vec2, vec3 } from '../tsl/TSLBase.js';
4
+
5
+ /**
6
+ * TSL function for creating a matcap uv node.
7
+ *
8
+ * Can be used to compute texture coordinates for projecting a
9
+ * matcap onto a mesh. Used by {@link MeshMatcapNodeMaterial}.
10
+ *
11
+ * @tsl
12
+ * @function
13
+ * @returns {Node<vec2>} The matcap UV coordinates.
14
+ */
15
+ export const matcapUV = /*@__PURE__*/ Fn( () => {
16
+
17
+ const x = vec3( positionViewDirection.z, 0, positionViewDirection.x.negate() ).normalize();
18
+ const y = positionViewDirection.cross( x );
19
+
20
+ return vec2( x.dot( normalView ), y.dot( normalView ) ).mul( 0.495 ).add( 0.5 ); // 0.495 to remove artifacts caused by undersized matcap disks
21
+
22
+ } ).once( [ 'NORMAL', 'VERTEX' ] )().toVar( 'matcapUV' );
@@ -131,7 +131,7 @@ class RTTNode extends TextureNode {
131
131
  * @readonly
132
132
  * @default true
133
133
  */
134
- get autoSize() {
134
+ get autoResize() {
135
135
 
136
136
  return this.width === null;
137
137
 
@@ -188,13 +188,21 @@ class RTTNode extends TextureNode {
188
188
 
189
189
  //
190
190
 
191
- if ( this.autoSize === true ) {
192
-
193
- this.pixelRatio = renderer.getPixelRatio();
191
+ if ( this.autoResize === true ) {
194
192
 
193
+ const pixelRatio = renderer.getPixelRatio();
195
194
  const size = renderer.getSize( _size );
196
195
 
197
- this.setSize( size.width, size.height );
196
+ const effectiveWidth = size.width * pixelRatio;
197
+ const effectiveHeight = size.height * pixelRatio;
198
+
199
+ if ( effectiveWidth !== this.renderTarget.width || effectiveHeight !== this.renderTarget.height ) {
200
+
201
+ this.renderTarget.setSize( effectiveWidth, effectiveHeight );
202
+
203
+ this.textureNeedsUpdate = true;
204
+
205
+ }
198
206
 
199
207
  }
200
208