@plastic-software/three 0.175.14 → 0.179.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 (572) hide show
  1. package/README.md +4 -4
  2. package/build/three.cjs +8402 -6787
  3. package/build/three.core.js +8007 -6688
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +397 -102
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +84 -27
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +6831 -2838
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +6648 -2838
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/jsm/Addons.js +1 -3
  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 +2 -1
  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 +22 -8
  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 +57 -38
  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 +679 -300
  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 +48 -8
  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 +11 -2
  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/libs/meshopt_decoder.module.js +75 -58
  76. package/examples/jsm/lighting/TiledLighting.js +1 -0
  77. package/examples/jsm/lights/LightProbeGenerator.js +15 -3
  78. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -0
  79. package/examples/jsm/lights/RectAreaLightUniformsLib.js +1 -0
  80. package/examples/jsm/lines/Line2.js +1 -0
  81. package/examples/jsm/lines/LineGeometry.js +1 -0
  82. package/examples/jsm/lines/LineMaterial.js +4 -4
  83. package/examples/jsm/lines/LineSegments2.js +1 -0
  84. package/examples/jsm/lines/LineSegmentsGeometry.js +1 -0
  85. package/examples/jsm/lines/Wireframe.js +1 -0
  86. package/examples/jsm/lines/WireframeGeometry2.js +1 -0
  87. package/examples/jsm/lines/webgpu/Line2.js +1 -0
  88. package/examples/jsm/lines/webgpu/LineSegments2.js +3 -1
  89. package/examples/jsm/lines/webgpu/Wireframe.js +1 -0
  90. package/examples/jsm/loaders/3DMLoader.js +1 -0
  91. package/examples/jsm/loaders/3MFLoader.js +1 -0
  92. package/examples/jsm/loaders/AMFLoader.js +1 -0
  93. package/examples/jsm/loaders/BVHLoader.js +1 -0
  94. package/examples/jsm/loaders/ColladaLoader.js +6 -5
  95. package/examples/jsm/loaders/DDSLoader.js +1 -0
  96. package/examples/jsm/loaders/DRACOLoader.js +2 -1
  97. package/examples/jsm/loaders/EXRLoader.js +211 -22
  98. package/examples/jsm/loaders/FBXLoader.js +25 -23
  99. package/examples/jsm/loaders/FontLoader.js +1 -0
  100. package/examples/jsm/loaders/GCodeLoader.js +1 -0
  101. package/examples/jsm/loaders/GLTFLoader.js +10 -82
  102. package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -0
  103. package/examples/jsm/loaders/IESLoader.js +1 -0
  104. package/examples/jsm/loaders/KMZLoader.js +1 -0
  105. package/examples/jsm/loaders/KTX2Loader.js +67 -26
  106. package/examples/jsm/loaders/KTXLoader.js +1 -0
  107. package/examples/jsm/loaders/LDrawLoader.js +55 -3
  108. package/examples/jsm/loaders/LUT3dlLoader.js +1 -0
  109. package/examples/jsm/loaders/LUTCubeLoader.js +1 -0
  110. package/examples/jsm/loaders/LUTImageLoader.js +1 -0
  111. package/examples/jsm/loaders/LWOLoader.js +1 -13
  112. package/examples/jsm/loaders/LottieLoader.js +15 -0
  113. package/examples/jsm/loaders/MD2Loader.js +1 -0
  114. package/examples/jsm/loaders/MDDLoader.js +1 -0
  115. package/examples/jsm/loaders/MTLLoader.js +4 -3
  116. package/examples/jsm/loaders/MaterialXLoader.js +213 -30
  117. package/examples/jsm/loaders/NRRDLoader.js +1 -0
  118. package/examples/jsm/loaders/OBJLoader.js +1 -0
  119. package/examples/jsm/loaders/PCDLoader.js +122 -19
  120. package/examples/jsm/loaders/PDBLoader.js +1 -0
  121. package/examples/jsm/loaders/PLYLoader.js +1 -0
  122. package/examples/jsm/loaders/PVRLoader.js +1 -0
  123. package/examples/jsm/loaders/RGBELoader.js +1 -0
  124. package/examples/jsm/loaders/RGBMLoader.js +1 -0
  125. package/examples/jsm/loaders/STLLoader.js +1 -0
  126. package/examples/jsm/loaders/SVGLoader.js +1 -0
  127. package/examples/jsm/loaders/TDSLoader.js +1 -0
  128. package/examples/jsm/loaders/TGALoader.js +1 -0
  129. package/examples/jsm/loaders/TIFFLoader.js +1 -0
  130. package/examples/jsm/loaders/TTFLoader.js +14 -1
  131. package/examples/jsm/loaders/USDLoader.js +219 -0
  132. package/examples/jsm/loaders/USDZLoader.js +4 -891
  133. package/examples/jsm/loaders/UltraHDRLoader.js +1 -0
  134. package/examples/jsm/loaders/VOXLoader.js +1 -0
  135. package/examples/jsm/loaders/VRMLLoader.js +3 -2
  136. package/examples/jsm/loaders/VTKLoader.js +1 -0
  137. package/examples/jsm/loaders/XYZLoader.js +1 -0
  138. package/examples/jsm/loaders/lwo/IFFParser.js +74 -74
  139. package/examples/jsm/loaders/usd/USDAParser.js +741 -0
  140. package/examples/jsm/loaders/usd/USDCParser.js +17 -0
  141. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +1 -0
  142. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -0
  143. package/examples/jsm/materials/MeshPostProcessingMaterial.js +1 -0
  144. package/examples/jsm/math/Capsule.js +2 -0
  145. package/examples/jsm/math/ColorConverter.js +1 -0
  146. package/examples/jsm/math/ConvexHull.js +2 -0
  147. package/examples/jsm/math/ImprovedNoise.js +19 -14
  148. package/examples/jsm/math/Lut.js +2 -0
  149. package/examples/jsm/math/MeshSurfaceSampler.js +2 -0
  150. package/examples/jsm/math/OBB.js +2 -0
  151. package/examples/jsm/math/Octree.js +20 -1
  152. package/examples/jsm/math/SimplexNoise.js +2 -0
  153. package/examples/jsm/misc/ConvexObjectBreaker.js +3 -1
  154. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  155. package/examples/jsm/misc/Gyroscope.js +1 -0
  156. package/examples/jsm/misc/MD2Character.js +2 -0
  157. package/examples/jsm/misc/MD2CharacterComplex.js +5 -3
  158. package/examples/jsm/misc/MorphAnimMesh.js +1 -0
  159. package/examples/jsm/misc/MorphBlendMesh.js +1 -0
  160. package/examples/jsm/misc/ProgressiveLightMap.js +2 -0
  161. package/examples/jsm/misc/ProgressiveLightMapGPU.js +2 -0
  162. package/examples/jsm/misc/RollerCoaster.js +5 -0
  163. package/examples/jsm/misc/TubePainter.js +1 -0
  164. package/examples/jsm/misc/Volume.js +2 -0
  165. package/examples/jsm/misc/VolumeSlice.js +1 -0
  166. package/examples/jsm/modifiers/CurveModifier.js +3 -0
  167. package/examples/jsm/modifiers/CurveModifierGPU.js +2 -0
  168. package/examples/jsm/modifiers/EdgeSplitModifier.js +2 -0
  169. package/examples/jsm/modifiers/SimplifyModifier.js +2 -0
  170. package/examples/jsm/modifiers/TessellateModifier.js +2 -0
  171. package/examples/jsm/objects/GroundedSkybox.js +1 -0
  172. package/examples/jsm/objects/Lensflare.js +3 -0
  173. package/examples/jsm/objects/LensflareMesh.js +4 -3
  174. package/examples/jsm/objects/MarchingCubes.js +2 -0
  175. package/examples/jsm/objects/Reflector.js +1 -0
  176. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  177. package/examples/jsm/objects/Refractor.js +1 -0
  178. package/examples/jsm/objects/ShadowMesh.js +1 -0
  179. package/examples/jsm/objects/Sky.js +2 -1
  180. package/examples/jsm/objects/SkyMesh.js +22 -19
  181. package/examples/jsm/objects/Water.js +1 -0
  182. package/examples/jsm/objects/Water2.js +1 -0
  183. package/examples/jsm/objects/Water2Mesh.js +3 -1
  184. package/examples/jsm/objects/WaterMesh.js +2 -1
  185. package/examples/jsm/physics/AmmoPhysics.js +1 -0
  186. package/examples/jsm/physics/JoltPhysics.js +1 -0
  187. package/examples/jsm/physics/RapierPhysics.js +149 -13
  188. package/examples/jsm/postprocessing/AfterimagePass.js +20 -2
  189. package/examples/jsm/postprocessing/BloomPass.js +2 -1
  190. package/examples/jsm/postprocessing/BokehPass.js +2 -1
  191. package/examples/jsm/postprocessing/ClearPass.js +1 -0
  192. package/examples/jsm/postprocessing/CubeTexturePass.js +1 -0
  193. package/examples/jsm/postprocessing/DotScreenPass.js +1 -0
  194. package/examples/jsm/postprocessing/EffectComposer.js +4 -2
  195. package/examples/jsm/postprocessing/FXAAPass.js +40 -0
  196. package/examples/jsm/postprocessing/FilmPass.js +1 -0
  197. package/examples/jsm/postprocessing/GTAOPass.js +14 -12
  198. package/examples/jsm/postprocessing/GlitchPass.js +2 -1
  199. package/examples/jsm/postprocessing/HalftonePass.js +2 -1
  200. package/examples/jsm/postprocessing/LUTPass.js +1 -0
  201. package/examples/jsm/postprocessing/MaskPass.js +1 -0
  202. package/examples/jsm/postprocessing/OutlinePass.js +22 -19
  203. package/examples/jsm/postprocessing/OutputPass.js +1 -0
  204. package/examples/jsm/postprocessing/Pass.js +3 -1
  205. package/examples/jsm/postprocessing/RenderPass.js +1 -0
  206. package/examples/jsm/postprocessing/RenderPixelatedPass.js +2 -1
  207. package/examples/jsm/postprocessing/RenderTransitionPass.js +4 -3
  208. package/examples/jsm/postprocessing/SAOPass.js +3 -2
  209. package/examples/jsm/postprocessing/SMAAPass.js +3 -2
  210. package/examples/jsm/postprocessing/SSAARenderPass.js +2 -1
  211. package/examples/jsm/postprocessing/SSAOPass.js +12 -10
  212. package/examples/jsm/postprocessing/SSRPass.js +4 -3
  213. package/examples/jsm/postprocessing/SavePass.js +2 -1
  214. package/examples/jsm/postprocessing/ShaderPass.js +1 -0
  215. package/examples/jsm/postprocessing/TAARenderPass.js +1 -0
  216. package/examples/jsm/postprocessing/TexturePass.js +1 -0
  217. package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -1
  218. package/examples/jsm/renderers/CSS2DRenderer.js +3 -0
  219. package/examples/jsm/renderers/CSS3DRenderer.js +4 -0
  220. package/examples/jsm/renderers/Projector.js +2 -0
  221. package/examples/jsm/renderers/SVGRenderer.js +3 -0
  222. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +4 -1
  223. package/examples/jsm/shaders/AfterimageShader.js +4 -1
  224. package/examples/jsm/shaders/BasicShader.js +4 -1
  225. package/examples/jsm/shaders/BleachBypassShader.js +4 -1
  226. package/examples/jsm/shaders/BlendShader.js +4 -1
  227. package/examples/jsm/shaders/BokehShader.js +4 -1
  228. package/examples/jsm/shaders/BokehShader2.js +4 -1
  229. package/examples/jsm/shaders/BrightnessContrastShader.js +4 -1
  230. package/examples/jsm/shaders/ColorCorrectionShader.js +4 -1
  231. package/examples/jsm/shaders/ColorifyShader.js +4 -1
  232. package/examples/jsm/shaders/ConvolutionShader.js +4 -1
  233. package/examples/jsm/shaders/CopyShader.js +4 -1
  234. package/examples/jsm/shaders/DOFMipMapShader.js +4 -1
  235. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  236. package/examples/jsm/shaders/DigitalGlitch.js +4 -1
  237. package/examples/jsm/shaders/DotScreenShader.js +4 -1
  238. package/examples/jsm/shaders/ExposureShader.js +4 -1
  239. package/examples/jsm/shaders/FXAAShader.js +4 -1
  240. package/examples/jsm/shaders/FilmShader.js +4 -1
  241. package/examples/jsm/shaders/FocusShader.js +4 -1
  242. package/examples/jsm/shaders/FreiChenShader.js +4 -1
  243. package/examples/jsm/shaders/GTAOShader.js +4 -1
  244. package/examples/jsm/shaders/GammaCorrectionShader.js +4 -1
  245. package/examples/jsm/shaders/GodRaysShader.js +4 -1
  246. package/examples/jsm/shaders/HalftoneShader.js +4 -1
  247. package/examples/jsm/shaders/HorizontalBlurShader.js +4 -1
  248. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +4 -1
  249. package/examples/jsm/shaders/HueSaturationShader.js +4 -1
  250. package/examples/jsm/shaders/KaleidoShader.js +4 -1
  251. package/examples/jsm/shaders/LuminosityHighPassShader.js +4 -1
  252. package/examples/jsm/shaders/LuminosityShader.js +4 -1
  253. package/examples/jsm/shaders/MirrorShader.js +4 -1
  254. package/examples/jsm/shaders/NormalMapShader.js +4 -1
  255. package/examples/jsm/shaders/OutputShader.js +4 -1
  256. package/examples/jsm/shaders/PoissonDenoiseShader.js +4 -1
  257. package/examples/jsm/shaders/RGBShiftShader.js +4 -1
  258. package/examples/jsm/shaders/SAOShader.js +4 -1
  259. package/examples/jsm/shaders/SMAAShader.js +1 -0
  260. package/examples/jsm/shaders/SSAOShader.js +4 -1
  261. package/examples/jsm/shaders/SSRShader.js +1 -0
  262. package/examples/jsm/shaders/SepiaShader.js +4 -1
  263. package/examples/jsm/shaders/SobelOperatorShader.js +4 -1
  264. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +4 -1
  265. package/examples/jsm/shaders/TechnicolorShader.js +4 -1
  266. package/examples/jsm/shaders/ToonShader.js +2 -1
  267. package/examples/jsm/shaders/TriangleBlurShader.js +4 -1
  268. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +15 -3
  269. package/examples/jsm/shaders/VelocityShader.js +4 -1
  270. package/examples/jsm/shaders/VerticalBlurShader.js +4 -1
  271. package/examples/jsm/shaders/VerticalTiltShiftShader.js +4 -1
  272. package/examples/jsm/shaders/VignetteShader.js +4 -1
  273. package/examples/jsm/shaders/VolumeShader.js +5 -2
  274. package/examples/jsm/shaders/WaterRefractionShader.js +4 -1
  275. package/examples/jsm/textures/FlakesTexture.js +2 -0
  276. package/examples/jsm/transpiler/AST.js +381 -30
  277. package/examples/jsm/transpiler/GLSLDecoder.js +227 -88
  278. package/examples/jsm/transpiler/Linker.js +327 -0
  279. package/examples/jsm/transpiler/TSLEncoder.js +234 -85
  280. package/examples/jsm/transpiler/Transpiler.js +19 -1
  281. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  282. package/examples/jsm/transpiler/WGSLEncoder.js +788 -0
  283. package/examples/jsm/tsl/display/AfterImageNode.js +2 -3
  284. package/examples/jsm/tsl/display/AnaglyphPassNode.js +1 -0
  285. package/examples/jsm/tsl/display/AnamorphicNode.js +5 -4
  286. package/examples/jsm/tsl/display/BloomNode.js +9 -7
  287. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +206 -0
  288. package/examples/jsm/tsl/display/DenoiseNode.js +33 -33
  289. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -0
  290. package/examples/jsm/tsl/display/DotScreenNode.js +1 -0
  291. package/examples/jsm/tsl/display/FXAANode.js +3 -2
  292. package/examples/jsm/tsl/display/FilmNode.js +1 -0
  293. package/examples/jsm/tsl/display/GTAONode.js +1 -0
  294. package/examples/jsm/tsl/display/GaussianBlurNode.js +9 -36
  295. package/examples/jsm/tsl/display/LensflareNode.js +1 -0
  296. package/examples/jsm/tsl/display/Lut3DNode.js +1 -0
  297. package/examples/jsm/tsl/display/OutlineNode.js +1 -0
  298. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +1 -0
  299. package/examples/jsm/tsl/display/PixelationPassNode.js +1 -0
  300. package/examples/jsm/tsl/display/RGBShiftNode.js +1 -0
  301. package/examples/jsm/tsl/display/SMAANode.js +9 -8
  302. package/examples/jsm/tsl/display/SSAAPassNode.js +5 -4
  303. package/examples/jsm/tsl/display/SSRNode.js +1 -0
  304. package/examples/jsm/tsl/display/SobelOperatorNode.js +1 -0
  305. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -0
  306. package/examples/jsm/tsl/display/StereoPassNode.js +1 -0
  307. package/examples/jsm/tsl/display/{TRAAPassNode.js → TRAANode.js} +184 -174
  308. package/examples/jsm/tsl/display/TransitionNode.js +1 -0
  309. package/examples/jsm/tsl/display/hashBlur.js +28 -6
  310. package/examples/jsm/tsl/lighting/TiledLightsNode.js +5 -4
  311. package/examples/jsm/tsl/math/Bayer.js +4 -1
  312. package/examples/jsm/tsl/shadows/TileShadowNode.js +456 -0
  313. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +212 -0
  314. package/examples/jsm/tsl/utils/Raymarching.js +6 -3
  315. package/examples/jsm/utils/BufferGeometryUtils.js +4 -1
  316. package/examples/jsm/utils/CameraUtils.js +4 -1
  317. package/examples/jsm/utils/GeometryCompressionUtils.js +4 -1
  318. package/examples/jsm/utils/GeometryUtils.js +4 -1
  319. package/examples/jsm/utils/LDrawUtils.js +2 -0
  320. package/examples/jsm/utils/SceneOptimizer.js +2 -0
  321. package/examples/jsm/utils/SceneUtils.js +4 -1
  322. package/examples/jsm/utils/ShadowMapViewer.js +2 -0
  323. package/examples/jsm/utils/ShadowMapViewerGPU.js +2 -0
  324. package/examples/jsm/utils/SkeletonUtils.js +4 -1
  325. package/examples/jsm/utils/SortUtils.js +4 -1
  326. package/examples/jsm/utils/UVsDebug.js +4 -1
  327. package/examples/jsm/utils/WebGLTextureUtils.js +4 -1
  328. package/examples/jsm/utils/WebGPUTextureUtils.js +4 -1
  329. package/examples/jsm/utils/WorkerPool.js +2 -0
  330. package/examples/jsm/webxr/ARButton.js +1 -0
  331. package/examples/jsm/webxr/OculusHandModel.js +1 -0
  332. package/examples/jsm/webxr/OculusHandPointerModel.js +1 -0
  333. package/examples/jsm/webxr/Text2D.js +4 -1
  334. package/examples/jsm/webxr/VRButton.js +1 -0
  335. package/examples/jsm/webxr/XRButton.js +1 -0
  336. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -0
  337. package/examples/jsm/webxr/XREstimatedLight.js +1 -0
  338. package/examples/jsm/webxr/XRHandMeshModel.js +2 -0
  339. package/examples/jsm/webxr/XRHandModelFactory.js +2 -0
  340. package/examples/jsm/webxr/XRHandPrimitiveModel.js +2 -0
  341. package/examples/jsm/webxr/XRPlanes.js +1 -0
  342. package/package.json +6 -4
  343. package/src/Three.Core.js +2 -1
  344. package/src/Three.TSL.js +83 -26
  345. package/src/Three.WebGPU.Nodes.js +1 -0
  346. package/src/Three.WebGPU.js +3 -0
  347. package/src/animation/KeyframeTrack.js +1 -1
  348. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  349. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  350. package/src/audio/AudioListener.js +13 -10
  351. package/src/cameras/ArrayCamera.js +9 -1
  352. package/src/cameras/Camera.js +14 -0
  353. package/src/cameras/OrthographicCamera.js +1 -1
  354. package/src/cameras/PerspectiveCamera.js +1 -1
  355. package/src/constants.js +47 -20
  356. package/src/core/BufferAttribute.js +3 -3
  357. package/src/core/BufferGeometry.js +2 -5
  358. package/src/core/Clock.js +2 -8
  359. package/src/core/GLBufferAttribute.js +13 -1
  360. package/src/core/Object3D.js +23 -22
  361. package/src/core/RenderTarget.js +65 -21
  362. package/src/core/RenderTarget3D.js +1 -0
  363. package/{examples/jsm/misc → src/core}/Timer.js +4 -40
  364. package/src/extras/PMREMGenerator.js +11 -0
  365. package/src/extras/TextureUtils.js +1 -5
  366. package/src/extras/core/Curve.js +1 -1
  367. package/src/extras/core/Path.js +22 -22
  368. package/src/geometries/CapsuleGeometry.js +167 -17
  369. package/src/geometries/ExtrudeGeometry.js +39 -29
  370. package/src/helpers/ArrowHelper.js +2 -2
  371. package/src/helpers/CameraHelper.js +41 -11
  372. package/src/helpers/SkeletonHelper.js +36 -7
  373. package/src/lights/LightShadow.js +34 -7
  374. package/src/lights/PointLightShadow.js +1 -1
  375. package/src/lights/SpotLightShadow.js +9 -1
  376. package/src/lights/webgpu/ProjectorLight.js +46 -0
  377. package/src/loaders/BufferGeometryLoader.js +1 -10
  378. package/src/loaders/FileLoader.js +27 -4
  379. package/src/loaders/ImageBitmapLoader.js +48 -9
  380. package/src/loaders/ImageLoader.js +55 -8
  381. package/src/loaders/Loader.js +14 -0
  382. package/src/loaders/LoadingManager.js +23 -0
  383. package/src/loaders/ObjectLoader.js +44 -16
  384. package/src/loaders/nodes/NodeObjectLoader.js +2 -2
  385. package/src/materials/Material.js +1 -7
  386. package/src/materials/MeshBasicMaterial.js +1 -1
  387. package/src/materials/nodes/Line2NodeMaterial.js +0 -8
  388. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  389. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  390. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  391. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  392. package/src/materials/nodes/MeshSSSNodeMaterial.js +2 -2
  393. package/src/materials/nodes/NodeMaterial.js +106 -20
  394. package/src/materials/nodes/PointsNodeMaterial.js +5 -0
  395. package/src/materials/nodes/manager/NodeMaterialObserver.js +107 -4
  396. package/src/math/Box3.js +28 -0
  397. package/src/math/Color.js +7 -7
  398. package/src/math/ColorManagement.js +22 -3
  399. package/src/math/Frustum.js +25 -9
  400. package/src/math/FrustumArray.js +258 -0
  401. package/src/math/Line3.js +129 -2
  402. package/src/math/Matrix4.js +48 -27
  403. package/src/math/Quaternion.js +1 -1
  404. package/src/math/Ray.js +2 -0
  405. package/src/math/Sphere.js +28 -0
  406. package/src/math/Spherical.js +2 -2
  407. package/src/nodes/Nodes.js +3 -3
  408. package/src/nodes/TSL.js +6 -3
  409. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  410. package/src/nodes/accessors/Bitangent.js +54 -26
  411. package/src/nodes/accessors/Camera.js +40 -13
  412. package/src/nodes/accessors/CubeTextureNode.js +50 -2
  413. package/src/nodes/accessors/InstanceNode.js +5 -4
  414. package/src/nodes/accessors/Lights.js +2 -2
  415. package/src/nodes/accessors/MaterialNode.js +4 -0
  416. package/src/nodes/accessors/ModelNode.js +1 -1
  417. package/src/nodes/accessors/Normal.js +110 -24
  418. package/src/nodes/accessors/Object3DNode.js +7 -8
  419. package/src/nodes/accessors/Position.js +14 -4
  420. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  421. package/src/nodes/accessors/ReferenceNode.js +19 -4
  422. package/src/nodes/accessors/ReflectVector.js +3 -3
  423. package/src/nodes/accessors/SceneNode.js +1 -1
  424. package/src/nodes/accessors/SkinningNode.js +3 -2
  425. package/src/nodes/accessors/StorageBufferNode.js +25 -0
  426. package/src/nodes/accessors/StorageTextureNode.js +15 -4
  427. package/src/nodes/accessors/Tangent.js +25 -17
  428. package/src/nodes/accessors/TangentUtils.js +46 -0
  429. package/src/nodes/accessors/TextureBicubic.js +21 -3
  430. package/src/nodes/accessors/TextureNode.js +71 -8
  431. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  432. package/src/nodes/accessors/VelocityNode.js +1 -0
  433. package/src/nodes/accessors/VertexColorNode.js +4 -4
  434. package/src/nodes/code/CodeNode.js +8 -11
  435. package/src/nodes/core/ArrayNode.js +12 -0
  436. package/src/nodes/core/AssignNode.js +30 -5
  437. package/src/nodes/core/AttributeNode.js +2 -2
  438. package/src/nodes/core/ContextNode.js +27 -4
  439. package/src/nodes/core/Node.js +83 -22
  440. package/src/nodes/core/NodeBuilder.js +273 -49
  441. package/src/nodes/core/NodeUtils.js +46 -1
  442. package/src/nodes/core/NodeVarying.js +19 -1
  443. package/src/nodes/core/PropertyNode.js +8 -12
  444. package/src/nodes/core/StackNode.js +171 -26
  445. package/src/nodes/core/StructTypeNode.js +26 -4
  446. package/src/nodes/core/SubBuildNode.js +89 -0
  447. package/src/nodes/core/UniformNode.js +63 -5
  448. package/src/nodes/core/VarNode.js +102 -4
  449. package/src/nodes/core/VaryingNode.js +45 -24
  450. package/src/nodes/display/BlendModes.js +42 -1
  451. package/src/nodes/display/ColorSpaceNode.js +4 -27
  452. package/src/nodes/display/FrontFacingNode.js +34 -2
  453. package/src/nodes/display/NormalMapNode.js +19 -50
  454. package/src/nodes/display/PassNode.js +165 -20
  455. package/src/nodes/display/ScreenNode.js +0 -26
  456. package/src/nodes/display/ViewportTextureNode.js +67 -7
  457. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  458. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  459. package/src/nodes/functions/PhongLightingModel.js +3 -3
  460. package/src/nodes/functions/PhysicalLightingModel.js +16 -16
  461. package/src/nodes/functions/ShadowMaskModel.js +5 -1
  462. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  463. package/src/nodes/functions/material/getParallaxCorrectNormal.js +1 -1
  464. package/src/nodes/gpgpu/AtomicFunctionNode.js +28 -10
  465. package/src/nodes/gpgpu/BarrierNode.js +3 -3
  466. package/src/nodes/gpgpu/ComputeNode.js +68 -24
  467. package/src/nodes/gpgpu/WorkgroupInfoNode.js +28 -3
  468. package/src/nodes/lighting/AnalyticLightNode.js +7 -13
  469. package/src/nodes/lighting/EnvironmentNode.js +5 -5
  470. package/src/nodes/lighting/HemisphereLightNode.js +2 -2
  471. package/src/nodes/lighting/IESSpotLightNode.js +2 -1
  472. package/src/nodes/lighting/LightsNode.js +29 -11
  473. package/src/nodes/lighting/ProjectorLightNode.js +91 -0
  474. package/src/nodes/lighting/ShadowBaseNode.js +1 -12
  475. package/src/nodes/lighting/ShadowFilterNode.js +274 -0
  476. package/src/nodes/lighting/ShadowNode.js +174 -242
  477. package/src/nodes/lighting/SpotLightNode.js +44 -7
  478. package/src/nodes/materialx/MaterialXNodes.js +131 -2
  479. package/src/nodes/materialx/lib/mx_noise.js +166 -2
  480. package/src/nodes/math/ConditionalNode.js +1 -20
  481. package/src/nodes/math/MathNode.js +146 -75
  482. package/src/nodes/math/OperatorNode.js +129 -119
  483. package/src/nodes/shapes/Shapes.js +5 -4
  484. package/src/nodes/tsl/TSLBase.js +1 -0
  485. package/src/nodes/tsl/TSLCore.js +222 -72
  486. package/src/nodes/utils/DebugNode.js +16 -4
  487. package/src/nodes/utils/Discard.js +2 -2
  488. package/src/nodes/utils/EquirectUV.js +27 -0
  489. package/src/nodes/utils/EventNode.js +83 -0
  490. package/src/nodes/utils/LoopNode.js +64 -34
  491. package/src/nodes/utils/MatcapUV.js +22 -0
  492. package/src/nodes/utils/RTTNode.js +22 -5
  493. package/src/nodes/utils/ReflectorNode.js +77 -7
  494. package/src/nodes/utils/SampleNode.js +81 -0
  495. package/src/nodes/utils/TriplanarTextures.js +65 -0
  496. package/src/objects/BatchedMesh.js +20 -6
  497. package/src/objects/Mesh.js +9 -0
  498. package/src/objects/Skeleton.js +1 -1
  499. package/src/objects/Sprite.js +9 -0
  500. package/src/renderers/WebGL3DRenderTarget.js +1 -0
  501. package/src/renderers/WebGLArrayRenderTarget.js +1 -0
  502. package/src/renderers/WebGLCubeRenderTarget.js +2 -4
  503. package/src/renderers/WebGLRenderer.js +45 -32
  504. package/src/renderers/common/Animation.js +2 -2
  505. package/src/renderers/common/Background.js +13 -2
  506. package/src/renderers/common/Bindings.js +19 -18
  507. package/src/renderers/common/Color4.js +2 -2
  508. package/src/renderers/common/CubeRenderTarget.js +1 -1
  509. package/src/renderers/common/PostProcessing.js +60 -5
  510. package/src/renderers/common/RenderList.js +0 -4
  511. package/src/renderers/common/RenderObject.js +80 -4
  512. package/src/renderers/common/Renderer.js +133 -22
  513. package/src/renderers/common/SampledTexture.js +3 -71
  514. package/src/renderers/common/Sampler.js +79 -0
  515. package/src/renderers/common/Storage3DTexture.js +100 -0
  516. package/src/renderers/common/StorageArrayTexture.js +84 -0
  517. package/src/renderers/common/StorageTexture.js +19 -0
  518. package/src/renderers/common/Textures.js +34 -24
  519. package/src/renderers/common/TimestampQueryPool.js +1 -0
  520. package/src/renderers/common/Uniform.js +1 -1
  521. package/src/renderers/common/UniformsGroup.js +14 -18
  522. package/src/renderers/common/XRManager.js +183 -35
  523. package/src/renderers/common/XRRenderTarget.js +21 -4
  524. package/src/renderers/common/extras/PMREMGenerator.js +30 -23
  525. package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
  526. package/src/renderers/common/nodes/Nodes.js +13 -3
  527. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +1 -1
  528. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +20 -2
  529. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
  530. package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
  531. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  532. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  533. package/src/renderers/webgl/WebGLMaterials.js +6 -6
  534. package/src/renderers/webgl/WebGLProgram.js +22 -16
  535. package/src/renderers/webgl/WebGLPrograms.js +8 -6
  536. package/src/renderers/webgl/WebGLShadowMap.js +14 -3
  537. package/src/renderers/webgl/WebGLState.js +4 -4
  538. package/src/renderers/webgl/WebGLTextures.js +163 -11
  539. package/src/renderers/webgl/WebGLUtils.js +1 -3
  540. package/src/renderers/webgl-fallback/WebGLBackend.js +261 -94
  541. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +75 -9
  542. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  543. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +1 -0
  544. package/src/renderers/webgl-fallback/utils/WebGLState.js +4 -4
  545. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +44 -29
  546. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +22 -21
  547. package/src/renderers/webgpu/WebGPUBackend.js +505 -143
  548. package/src/renderers/webgpu/WebGPURenderer.js +7 -0
  549. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +4 -1
  550. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +4 -1
  551. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +129 -96
  552. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +3 -0
  553. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +9 -1
  554. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +58 -31
  555. package/src/renderers/webgpu/utils/WebGPUConstants.js +8 -2
  556. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +39 -9
  557. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +50 -108
  558. package/src/renderers/webgpu/utils/WebGPUUtils.js +2 -17
  559. package/src/renderers/webxr/WebXRController.js +1 -1
  560. package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
  561. package/src/renderers/webxr/WebXRManager.js +70 -9
  562. package/src/textures/DepthTexture.js +6 -10
  563. package/src/textures/ExternalTexture.js +45 -0
  564. package/src/textures/FramebufferTexture.js +2 -2
  565. package/src/textures/Source.js +32 -0
  566. package/src/textures/Texture.js +118 -1
  567. package/src/textures/VideoTexture.js +31 -3
  568. package/examples/jsm/effects/PeppersGhostEffect.js +0 -172
  569. package/src/core/RenderTargetArray.js +0 -40
  570. package/src/nodes/utils/EquirectUVNode.js +0 -65
  571. package/src/nodes/utils/MatcapUVNode.js +0 -49
  572. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -61,6 +61,10 @@ const shaderNodeHandler = {
61
61
 
62
62
  return node.isStackNode ? ( ...params ) => nodeObj.add( nodeElement( ...params ) ) : ( ...params ) => nodeElement( nodeObj, ...params );
63
63
 
64
+ } else if ( prop === 'toVarIntent' ) {
65
+
66
+ return () => nodeObj;
67
+
64
68
  } else if ( prop === 'self' ) {
65
69
 
66
70
  return node;
@@ -85,7 +89,7 @@ const shaderNodeHandler = {
85
89
 
86
90
  prop = parseSwizzleAndSort( prop.slice( 3 ).toLowerCase() );
87
91
 
88
- return ( value ) => nodeObject( new SetNode( node, prop, value ) );
92
+ return ( value ) => nodeObject( new SetNode( node, prop, nodeObject( value ) ) );
89
93
 
90
94
  } else if ( /^flip[XYZWRGBASTPQ]{1,4}$/.test( prop ) === true ) {
91
95
 
@@ -175,7 +179,7 @@ const ShaderNodeObject = function ( obj, altType = null ) {
175
179
 
176
180
  } else if ( type === 'shader' ) {
177
181
 
178
- return Fn( obj );
182
+ return obj.isFn ? obj : Fn( obj );
179
183
 
180
184
  }
181
185
 
@@ -211,7 +215,28 @@ const ShaderNodeArray = function ( array, altType = null ) {
211
215
 
212
216
  const ShaderNodeProxy = function ( NodeClass, scope = null, factor = null, settings = null ) {
213
217
 
214
- const assignNode = ( node ) => nodeObject( settings !== null ? Object.assign( node, settings ) : node );
218
+ function assignNode( node ) {
219
+
220
+ if ( settings !== null ) {
221
+
222
+ node = nodeObject( Object.assign( node, settings ) );
223
+
224
+ if ( settings.intent === true ) {
225
+
226
+ node = node.toVarIntent();
227
+
228
+ }
229
+
230
+ } else {
231
+
232
+ node = nodeObject( node );
233
+
234
+ }
235
+
236
+ return node;
237
+
238
+
239
+ }
215
240
 
216
241
  let fn, name = scope, minParams, maxParams;
217
242
 
@@ -304,6 +329,8 @@ class ShaderCallNodeInternal extends Node {
304
329
  this.shaderNode = shaderNode;
305
330
  this.inputNodes = inputNodes;
306
331
 
332
+ this.isShaderCallNodeInternal = true;
333
+
307
334
  }
308
335
 
309
336
  getNodeType( builder ) {
@@ -323,10 +350,22 @@ class ShaderCallNodeInternal extends Node {
323
350
  const { shaderNode, inputNodes } = this;
324
351
 
325
352
  const properties = builder.getNodeProperties( shaderNode );
326
- if ( properties.onceOutput ) return properties.onceOutput;
353
+
354
+ const subBuild = builder.getClosestSubBuild( shaderNode.subBuilds ) || '';
355
+ const subBuildProperty = subBuild || 'default';
356
+
357
+ if ( properties[ subBuildProperty ] ) {
358
+
359
+ return properties[ subBuildProperty ];
360
+
361
+ }
327
362
 
328
363
  //
329
364
 
365
+ const previousSubBuildFn = builder.subBuildFn;
366
+
367
+ builder.subBuildFn = subBuild;
368
+
330
369
  let result = null;
331
370
 
332
371
  if ( shaderNode.layout ) {
@@ -357,16 +396,46 @@ class ShaderCallNodeInternal extends Node {
357
396
 
358
397
  } else {
359
398
 
399
+ let inputs = inputNodes;
400
+
401
+ if ( Array.isArray( inputs ) ) {
402
+
403
+ // If inputs is an array, we need to convert it to a Proxy
404
+ // so we can call TSL functions using the syntax `Fn( ( { r, g, b } ) => { ... } )`
405
+ // and call through `fn( 0, 1, 0 )` or `fn( { r: 0, g: 1, b: 0 } )`
406
+
407
+ let index = 0;
408
+
409
+ inputs = new Proxy( inputs, {
410
+ get: ( target, property, receiver ) => {
411
+
412
+ if ( target[ property ] === undefined ) {
413
+
414
+ return target[ index ++ ];
415
+
416
+ } else {
417
+
418
+ return Reflect.get( target, property, receiver );
419
+
420
+ }
421
+
422
+ }
423
+ } );
424
+
425
+ }
426
+
360
427
  const jsFunc = shaderNode.jsFunc;
361
- const outputNode = inputNodes !== null || jsFunc.length > 1 ? jsFunc( inputNodes || [], builder ) : jsFunc( builder );
428
+ const outputNode = inputs !== null || jsFunc.length > 1 ? jsFunc( inputs || [], builder ) : jsFunc( builder );
362
429
 
363
430
  result = nodeObject( outputNode );
364
431
 
365
432
  }
366
433
 
434
+ builder.subBuildFn = previousSubBuildFn;
435
+
367
436
  if ( shaderNode.once ) {
368
437
 
369
- properties.onceOutput = result;
438
+ properties[ subBuildProperty ] = result;
370
439
 
371
440
  }
372
441
 
@@ -374,41 +443,86 @@ class ShaderCallNodeInternal extends Node {
374
443
 
375
444
  }
376
445
 
446
+ setupOutput( builder ) {
447
+
448
+ builder.addStack();
449
+
450
+ builder.stack.outputNode = this.call( builder );
451
+
452
+ return builder.removeStack();
453
+
454
+ }
455
+
377
456
  getOutputNode( builder ) {
378
457
 
379
458
  const properties = builder.getNodeProperties( this );
459
+ const subBuildOutput = builder.getSubBuildOutput( this );
380
460
 
381
- if ( properties.outputNode === null ) {
461
+ properties[ subBuildOutput ] = properties[ subBuildOutput ] || this.setupOutput( builder );
462
+ properties[ subBuildOutput ].subBuild = builder.getClosestSubBuild( this );
382
463
 
383
- properties.outputNode = this.setupOutput( builder );
464
+ return properties[ subBuildOutput ];
384
465
 
385
- }
466
+ }
386
467
 
387
- return properties.outputNode;
468
+ build( builder, output = null ) {
388
469
 
389
- }
470
+ let result = null;
390
471
 
391
- setup( builder ) {
472
+ const buildStage = builder.getBuildStage();
473
+ const properties = builder.getNodeProperties( this );
392
474
 
393
- return this.getOutputNode( builder );
475
+ const subBuildOutput = builder.getSubBuildOutput( this );
476
+ const outputNode = this.getOutputNode( builder );
394
477
 
395
- }
478
+ if ( buildStage === 'setup' ) {
396
479
 
397
- setupOutput( builder ) {
480
+ const subBuildInitialized = builder.getSubBuildProperty( 'initialized', this );
398
481
 
399
- builder.addStack();
482
+ if ( properties[ subBuildInitialized ] !== true ) {
400
483
 
401
- builder.stack.outputNode = this.call( builder );
484
+ properties[ subBuildInitialized ] = true;
402
485
 
403
- return builder.removeStack();
486
+ properties[ subBuildOutput ] = this.getOutputNode( builder );
487
+ properties[ subBuildOutput ].build( builder );
404
488
 
405
- }
489
+ // If the shaderNode has subBuilds, add them to the chaining nodes
490
+ // so they can be built later in the build process.
406
491
 
407
- generate( builder, output ) {
492
+ if ( this.shaderNode.subBuilds ) {
408
493
 
409
- const outputNode = this.getOutputNode( builder );
494
+ for ( const node of builder.chaining ) {
495
+
496
+ const nodeData = builder.getDataFromNode( node, 'any' );
497
+ nodeData.subBuilds = nodeData.subBuilds || new Set();
498
+
499
+ for ( const subBuild of this.shaderNode.subBuilds ) {
500
+
501
+ nodeData.subBuilds.add( subBuild );
502
+
503
+ }
504
+
505
+ //builder.getDataFromNode( node ).subBuilds = nodeData.subBuilds;
506
+
507
+ }
508
+
509
+ }
510
+
511
+ }
512
+
513
+ result = properties[ subBuildOutput ];
514
+
515
+ } else if ( buildStage === 'analyze' ) {
516
+
517
+ outputNode.build( builder, output );
518
+
519
+ } else if ( buildStage === 'generate' ) {
410
520
 
411
- return outputNode.build( builder, output );
521
+ result = outputNode.build( builder, output ) || '';
522
+
523
+ }
524
+
525
+ return result;
412
526
 
413
527
  }
414
528
 
@@ -493,20 +607,6 @@ const getConstNode = ( value, type ) => {
493
607
 
494
608
  };
495
609
 
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
610
  const ConvertType = function ( type, cacheMap = null ) {
511
611
 
512
612
  return ( ...params ) => {
@@ -519,20 +619,20 @@ const ConvertType = function ( type, cacheMap = null ) {
519
619
 
520
620
  if ( params.length === 1 && cacheMap !== null && cacheMap.has( params[ 0 ] ) ) {
521
621
 
522
- return nodeObject( cacheMap.get( params[ 0 ] ) );
622
+ return nodeObjectIntent( cacheMap.get( params[ 0 ] ) );
523
623
 
524
624
  }
525
625
 
526
626
  if ( params.length === 1 ) {
527
627
 
528
628
  const node = getConstNode( params[ 0 ], type );
529
- if ( safeGetNodeType( node ) === type ) return nodeObject( node );
530
- return nodeObject( new ConvertNode( node, type ) );
629
+ if ( node.nodeType === type ) return nodeObjectIntent( node );
630
+ return nodeObjectIntent( new ConvertNode( node, type ) );
531
631
 
532
632
  }
533
633
 
534
634
  const nodes = params.map( param => getConstNode( param ) );
535
- return nodeObject( new JoinNode( nodes, type ) );
635
+ return nodeObjectIntent( new JoinNode( nodes, type ) );
536
636
 
537
637
  };
538
638
 
@@ -555,10 +655,12 @@ export function ShaderNode( jsFunc, nodeType ) {
555
655
  }
556
656
 
557
657
  export const nodeObject = ( val, altType = null ) => /* new */ ShaderNodeObject( val, altType );
658
+ export const nodeObjectIntent = ( val, altType = null ) => /* new */ nodeObject( val, altType ).toVarIntent();
558
659
  export const nodeObjects = ( val, altType = null ) => new ShaderNodeObjects( val, altType );
559
660
  export const nodeArray = ( val, altType = null ) => new ShaderNodeArray( val, altType );
560
- export const nodeProxy = ( ...params ) => new ShaderNodeProxy( ...params );
561
- export const nodeImmutable = ( ...params ) => new ShaderNodeImmutable( ...params );
661
+ export const nodeProxy = ( NodeClass, scope = null, factor = null, settings = null ) => new ShaderNodeProxy( NodeClass, scope, factor, settings );
662
+ export const nodeImmutable = ( NodeClass, ...params ) => new ShaderNodeImmutable( NodeClass, ...params );
663
+ export const nodeProxyIntent = ( NodeClass, scope = null, factor = null, settings = {} ) => new ShaderNodeProxy( NodeClass, scope, factor, { intent: true, ...settings } );
562
664
 
563
665
  let fnId = 0;
564
666
 
@@ -598,7 +700,9 @@ export const Fn = ( jsFunc, layout = null ) => {
598
700
 
599
701
  nodeObjects( params );
600
702
 
601
- if ( params[ 0 ] && params[ 0 ].isNode ) {
703
+ const isArrayAsParameter = params[ 0 ] && ( params[ 0 ].isNode || Object.getPrototypeOf( params[ 0 ] ) !== Object.prototype );
704
+
705
+ if ( isArrayAsParameter ) {
602
706
 
603
707
  inputs = [ ...params ];
604
708
 
@@ -608,11 +712,21 @@ export const Fn = ( jsFunc, layout = null ) => {
608
712
 
609
713
  }
610
714
 
611
- return shaderNode.call( inputs );
715
+ const fnCall = shaderNode.call( inputs );
716
+
717
+ if ( nodeType === 'void' ) fnCall.toStack();
718
+
719
+ return fnCall.toVarIntent();
612
720
 
613
721
  };
614
722
 
615
723
  fn.shaderNode = shaderNode;
724
+ fn.id = shaderNode.id;
725
+
726
+ fn.isFn = true;
727
+
728
+ fn.getNodeType = ( ...params ) => shaderNode.getNodeType( ...params );
729
+ fn.getCacheKey = ( ...params ) => shaderNode.getCacheKey( ...params );
616
730
 
617
731
  fn.setLayout = ( layout ) => {
618
732
 
@@ -622,9 +736,10 @@ export const Fn = ( jsFunc, layout = null ) => {
622
736
 
623
737
  };
624
738
 
625
- fn.once = () => {
739
+ fn.once = ( subBuilds = null ) => {
626
740
 
627
741
  shaderNode.once = true;
742
+ shaderNode.subBuilds = subBuilds;
628
743
 
629
744
  return fn;
630
745
 
@@ -663,31 +778,6 @@ export const Fn = ( jsFunc, layout = null ) => {
663
778
 
664
779
  };
665
780
 
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
781
  //
692
782
 
693
783
  export const setCurrentStack = ( stack ) => {
@@ -704,9 +794,44 @@ export const setCurrentStack = ( stack ) => {
704
794
 
705
795
  export const getCurrentStack = () => currentStack;
706
796
 
797
+ /**
798
+ * Represent a conditional node using if/else statements.
799
+ *
800
+ * ```js
801
+ * If( condition, function )
802
+ * .ElseIf( condition, function )
803
+ * .Else( function )
804
+ * ```
805
+ * @tsl
806
+ * @function
807
+ * @param {...any} params - The parameters for the conditional node.
808
+ * @returns {StackNode} The conditional node.
809
+ */
707
810
  export const If = ( ...params ) => currentStack.If( ...params );
708
811
 
709
- export function append( node ) {
812
+ /**
813
+ * Represent a conditional node using switch/case statements.
814
+ *
815
+ * ```js
816
+ * Switch( value )
817
+ * .Case( 1, function )
818
+ * .Case( 2, 3, 4, function )
819
+ * .Default( function )
820
+ * ```
821
+ * @tsl
822
+ * @function
823
+ * @param {...any} params - The parameters for the conditional node.
824
+ * @returns {StackNode} The conditional node.
825
+ */
826
+ export const Switch = ( ...params ) => currentStack.Switch( ...params );
827
+
828
+ /**
829
+ * Add the given node to the current stack.
830
+ *
831
+ * @param {Node} node - The node to add.
832
+ * @returns {Node} The node that was added to the stack.
833
+ */
834
+ export function Stack( node ) {
710
835
 
711
836
  if ( currentStack ) currentStack.add( node );
712
837
 
@@ -714,7 +839,7 @@ export function append( node ) {
714
839
 
715
840
  }
716
841
 
717
- addMethodChaining( 'append', append );
842
+ addMethodChaining( 'toStack', Stack );
718
843
 
719
844
  // types
720
845
 
@@ -776,3 +901,28 @@ export const split = ( node, channels ) => nodeObject( new SplitNode( nodeObject
776
901
 
777
902
  addMethodChaining( 'element', element );
778
903
  addMethodChaining( 'convert', convert );
904
+
905
+ // deprecated
906
+
907
+ /**
908
+ * @tsl
909
+ * @function
910
+ * @deprecated since r176. Use {@link Stack} instead.
911
+ *
912
+ * @param {Node} node - The node to add.
913
+ * @returns {Function}
914
+ */
915
+ export const append = ( node ) => { // @deprecated, r176
916
+
917
+ console.warn( 'THREE.TSL: append() has been renamed to Stack().' );
918
+ return Stack( node );
919
+
920
+ };
921
+
922
+ addMethodChaining( 'append', ( node ) => { // @deprecated, r176
923
+
924
+ console.warn( 'THREE.TSL: .append() has been renamed to .toStack().' );
925
+ return Stack( node );
926
+
927
+ } );
928
+
@@ -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
 
68
- export const debug = ( node, callback = null ) => nodeObject( new DebugNode( nodeObject( node ), callback ) );
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
+ */
80
+ export const debug = ( node, callback = null ) => nodeObject( new DebugNode( nodeObject( node ), callback ) ).toStack();
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
+ } );
@@ -0,0 +1,83 @@
1
+ import Node from '../core/Node.js';
2
+ import { NodeUpdateType } from '../core/constants.js';
3
+ import { nodeObject } from '../tsl/TSLCore.js';
4
+
5
+ /**
6
+ * EventNode is a node that executes a callback during specific update phases.
7
+ *
8
+ * @augments Node
9
+ */
10
+ class EventNode extends Node {
11
+
12
+ static get type() {
13
+
14
+ return 'EventNode';
15
+
16
+ }
17
+
18
+ /**
19
+ * Creates an EventNode.
20
+ *
21
+ * @param {string} eventType - The type of event
22
+ * @param {Function} callback - The callback to execute on update.
23
+ */
24
+ constructor( eventType, callback ) {
25
+
26
+ super( 'void' );
27
+
28
+ this.eventType = eventType;
29
+ this.callback = callback;
30
+
31
+ if ( eventType === EventNode.OBJECT ) {
32
+
33
+ this.updateType = NodeUpdateType.OBJECT;
34
+
35
+ } else if ( eventType === EventNode.MATERIAL ) {
36
+
37
+ this.updateType = NodeUpdateType.RENDER;
38
+
39
+ }
40
+
41
+ }
42
+
43
+ update( frame ) {
44
+
45
+ this.callback( frame );
46
+
47
+ }
48
+
49
+ }
50
+
51
+ EventNode.OBJECT = 'object';
52
+ EventNode.MATERIAL = 'material';
53
+
54
+ export default EventNode;
55
+
56
+ /**
57
+ * Helper to create an EventNode and add it to the stack.
58
+ *
59
+ * @param {string} type - The event type.
60
+ * @param {Function} callback - The callback function.
61
+ * @returns {EventNode}
62
+ */
63
+ const createEvent = ( type, callback ) => nodeObject( new EventNode( type, callback ) ).toStack();
64
+
65
+ /**
66
+ * Creates an event that triggers a function every time an object (Mesh|Sprite) is rendered.
67
+ *
68
+ * The event will be bound to the declared TSL function `Fn()`; it must be declared within a `Fn()` or the JS function call must be inherited from one.
69
+ *
70
+ * @param {Function} callback - The callback function.
71
+ * @returns {EventNode}
72
+ */
73
+ export const OnObjectUpdate = ( callback ) => createEvent( EventNode.OBJECT, callback );
74
+
75
+ /**
76
+ * Creates an event that triggers a function when the first object that uses the material is rendered.
77
+ *
78
+ * The event will be bound to the declared TSL function `Fn()`; it must be declared within a `Fn()` or the JS function call must be inherited from one.
79
+ *
80
+ * @param {Function} callback - The callback function.
81
+ * @returns {EventNode}
82
+ */
83
+ export const OnMaterialUpdate = ( callback ) => createEvent( EventNode.MATERIAL, callback );