@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
@@ -9,6 +9,10 @@ import { NodeUpdateType } from '../core/constants.js';
9
9
 
10
10
  import { IntType, NearestFilter, UnsignedIntType } from '../../constants.js';
11
11
 
12
+ import { Texture } from '../../textures/Texture.js';
13
+
14
+ const EmptyTexture = /*@__PURE__*/ new Texture();
15
+
12
16
  /**
13
17
  * This type of uniform node represents a 2D texture.
14
18
  *
@@ -25,12 +29,12 @@ class TextureNode extends UniformNode {
25
29
  /**
26
30
  * Constructs a new texture node.
27
31
  *
28
- * @param {Texture} value - The texture.
32
+ * @param {Texture} [value=EmptyTexture] - The texture.
29
33
  * @param {?Node<vec2|vec3>} [uvNode=null] - The uv node.
30
34
  * @param {?Node<int>} [levelNode=null] - The level node.
31
35
  * @param {?Node<float>} [biasNode=null] - The bias node.
32
36
  */
33
- constructor( value, uvNode = null, levelNode = null, biasNode = null ) {
37
+ constructor( value = EmptyTexture, uvNode = null, levelNode = null, biasNode = null ) {
34
38
 
35
39
  super( value );
36
40
 
@@ -266,7 +270,7 @@ class TextureNode extends UniformNode {
266
270
  setUpdateMatrix( value ) {
267
271
 
268
272
  this.updateMatrix = value;
269
- this.updateType = value ? NodeUpdateType.RENDER : NodeUpdateType.NONE;
273
+ this.updateType = value ? NodeUpdateType.OBJECT : NodeUpdateType.NONE;
270
274
 
271
275
  return this;
272
276
 
@@ -328,7 +332,7 @@ class TextureNode extends UniformNode {
328
332
 
329
333
  if ( ( uvNode === null || builder.context.forceUVContext === true ) && builder.context.getUV ) {
330
334
 
331
- uvNode = builder.context.getUV( this );
335
+ uvNode = builder.context.getUV( this, builder );
332
336
 
333
337
  }
334
338
 
@@ -550,6 +554,18 @@ class TextureNode extends UniformNode {
550
554
 
551
555
  }
552
556
 
557
+ /**
558
+ * TSL function for creating a texture node that fetches/loads texels without interpolation.
559
+ *
560
+ * @param {Node<uvec2>} uvNode - The uv node.
561
+ * @returns {TextureNode} A texture node representing the texture load.
562
+ */
563
+ load( uvNode ) {
564
+
565
+ return this.sample( uvNode ).setSampler( false );
566
+
567
+ }
568
+
553
569
  /**
554
570
  * Samples a blurred version of the texture by defining an internal bias.
555
571
  *
@@ -564,7 +580,7 @@ class TextureNode extends UniformNode {
564
580
 
565
581
  const map = textureNode.value;
566
582
 
567
- if ( map && map.generateMipmaps === false || map.minFilter === NearestFilter || map.magFilter === NearestFilter ) {
583
+ if ( textureNode.generateMipmaps === false && ( map && map.generateMipmaps === false || map.minFilter === NearestFilter || map.magFilter === NearestFilter ) ) {
568
584
 
569
585
  console.warn( 'THREE.TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture.' );
570
586
 
@@ -720,6 +736,9 @@ class TextureNode extends UniformNode {
720
736
 
721
737
  const newNode = new this.constructor( this.value, this.uvNode, this.levelNode, this.biasNode );
722
738
  newNode.sampler = this.sampler;
739
+ newNode.depthNode = this.depthNode;
740
+ newNode.compareNode = this.compareNode;
741
+ newNode.gradNode = this.gradNode;
723
742
 
724
743
  return newNode;
725
744
 
@@ -734,20 +753,64 @@ export default TextureNode;
734
753
  *
735
754
  * @tsl
736
755
  * @function
737
- * @param {Texture} value - The texture.
756
+ * @param {?Texture} value - The texture.
757
+ * @param {?Node<vec2|vec3>} [uvNode=null] - The uv node.
758
+ * @param {?Node<int>} [levelNode=null] - The level node.
759
+ * @param {?Node<float>} [biasNode=null] - The bias node.
760
+ * @returns {TextureNode}
761
+ */
762
+ const textureBase = /*@__PURE__*/ nodeProxy( TextureNode ).setParameterLength( 1, 4 ).setName( 'texture' );
763
+
764
+ /**
765
+ * TSL function for creating a texture node or sample a texture node already existing.
766
+ *
767
+ * @tsl
768
+ * @function
769
+ * @param {?Texture|TextureNode} [value=EmptyTexture] - The texture.
738
770
  * @param {?Node<vec2|vec3>} [uvNode=null] - The uv node.
739
771
  * @param {?Node<int>} [levelNode=null] - The level node.
740
772
  * @param {?Node<float>} [biasNode=null] - The bias node.
741
773
  * @returns {TextureNode}
742
774
  */
743
- export const texture = /*@__PURE__*/ nodeProxy( TextureNode ).setParameterLength( 1, 4 );
775
+ export const texture = ( value = EmptyTexture, uvNode = null, levelNode = null, biasNode = null ) => {
776
+
777
+ let textureNode;
778
+
779
+ if ( value && value.isTextureNode === true ) {
780
+
781
+ textureNode = nodeObject( value.clone() );
782
+ textureNode.referenceNode = value.getSelf(); // Ensure the reference is set to the original node
783
+
784
+ if ( uvNode !== null ) textureNode.uvNode = nodeObject( uvNode );
785
+ if ( levelNode !== null ) textureNode.levelNode = nodeObject( levelNode );
786
+ if ( biasNode !== null ) textureNode.biasNode = nodeObject( biasNode );
787
+
788
+ } else {
789
+
790
+ textureNode = textureBase( value, uvNode, levelNode, biasNode );
791
+
792
+ }
793
+
794
+ return textureNode;
795
+
796
+ };
797
+
798
+ /**
799
+ * TSL function for creating a uniform texture node.
800
+ *
801
+ * @tsl
802
+ * @function
803
+ * @param {?Texture} value - The texture.
804
+ * @returns {TextureNode}
805
+ */
806
+ export const uniformTexture = ( value = EmptyTexture ) => texture( value );
744
807
 
745
808
  /**
746
809
  * TSL function for creating a texture node that fetches/loads texels without interpolation.
747
810
  *
748
811
  * @tsl
749
812
  * @function
750
- * @param {Texture} value - The texture.
813
+ * @param {?Texture|TextureNode} [value=EmptyTexture] - The texture.
751
814
  * @param {?Node<vec2|vec3>} [uvNode=null] - The uv node.
752
815
  * @param {?Node<int>} [levelNode=null] - The level node.
753
816
  * @param {?Node<float>} [biasNode=null] - The bias node.
@@ -346,19 +346,3 @@ export default UniformArrayNode;
346
346
  * @returns {UniformArrayNode}
347
347
  */
348
348
  export const uniformArray = ( values, nodeType ) => nodeObject( new UniformArrayNode( values, nodeType ) );
349
-
350
- /**
351
- * @tsl
352
- * @function
353
- * @deprecated since r168. Use {@link uniformArray} instead.
354
- *
355
- * @param {Array<any>} values - Array-like data.
356
- * @param {string} nodeType - The data type of the array elements.
357
- * @returns {UniformArrayNode}
358
- */
359
- export const uniforms = ( values, nodeType ) => { // @deprecated, r168
360
-
361
- console.warn( 'THREE.TSL: uniforms() has been renamed to uniformArray().' );
362
- return nodeObject( new UniformArrayNode( values, nodeType ) );
363
-
364
- };
@@ -205,6 +205,7 @@ function getPreviousMatrix( object, index = 0 ) {
205
205
  if ( matrix === undefined ) {
206
206
 
207
207
  objectData[ index ] = matrix = new Matrix4();
208
+ objectData[ index ].copy( object.matrixWorld );
208
209
 
209
210
  }
210
211
 
@@ -18,9 +18,9 @@ class VertexColorNode extends AttributeNode {
18
18
  /**
19
19
  * Constructs a new vertex color node.
20
20
  *
21
- * @param {number} [index=0] - The attribute index.
21
+ * @param {number} index - The attribute index.
22
22
  */
23
- constructor( index = 0 ) {
23
+ constructor( index ) {
24
24
 
25
25
  super( null, 'vec4' );
26
26
 
@@ -104,7 +104,7 @@ export default VertexColorNode;
104
104
  *
105
105
  * @tsl
106
106
  * @function
107
- * @param {number} index - The attribute index.
107
+ * @param {number} [index=0] - The attribute index.
108
108
  * @returns {VertexColorNode}
109
109
  */
110
- export const vertexColor = ( index ) => nodeObject( new VertexColorNode( index ) );
110
+ export const vertexColor = ( index = 0 ) => nodeObject( new VertexColorNode( index ) );
@@ -36,6 +36,14 @@ class CodeNode extends Node {
36
36
  */
37
37
  this.isCodeNode = true;
38
38
 
39
+ /**
40
+ * This flag is used for global cache.
41
+ *
42
+ * @type {boolean}
43
+ * @default true
44
+ */
45
+ this.global = true;
46
+
39
47
  /**
40
48
  * The native code.
41
49
  *
@@ -62,17 +70,6 @@ class CodeNode extends Node {
62
70
 
63
71
  }
64
72
 
65
- /**
66
- * The method is overwritten so it always returns `true`.
67
- *
68
- * @return {boolean} Whether this node is global or not.
69
- */
70
- isGlobal() {
71
-
72
- return true;
73
-
74
- }
75
-
76
73
  /**
77
74
  * Sets the includes of this code node.
78
75
  *
@@ -58,6 +58,18 @@ class ArrayNode extends TempNode {
58
58
 
59
59
  }
60
60
 
61
+ /**
62
+ * Returns the number of elements in the node array.
63
+ *
64
+ * @param {NodeBuilder} builder - The current node builder.
65
+ * @return {number} The number of elements in the node array.
66
+ */
67
+ getArrayCount( /*builder*/ ) {
68
+
69
+ return this.count;
70
+
71
+ }
72
+
61
73
  /**
62
74
  * Returns the node's type.
63
75
  *
@@ -40,6 +40,15 @@ class AssignNode extends TempNode {
40
40
  */
41
41
  this.sourceNode = sourceNode;
42
42
 
43
+ /**
44
+ * This flag can be used for type testing.
45
+ *
46
+ * @type {boolean}
47
+ * @readonly
48
+ * @default true
49
+ */
50
+ this.isAssignNode = true;
51
+
43
52
  }
44
53
 
45
54
  /**
@@ -84,15 +93,28 @@ class AssignNode extends TempNode {
84
93
 
85
94
  }
86
95
 
87
- generate( builder, output ) {
96
+ setup( builder ) {
88
97
 
89
98
  const { targetNode, sourceNode } = this;
90
99
 
100
+ const targetProperties = builder.getNodeProperties( targetNode );
101
+ targetProperties.assign = true;
102
+
103
+ const properties = builder.getNodeProperties( this );
104
+ properties.sourceNode = sourceNode;
105
+ properties.targetNode = targetNode.context( { assign: true } );
106
+
107
+ }
108
+
109
+ generate( builder, output ) {
110
+
111
+ const { targetNode, sourceNode } = builder.getNodeProperties( this );
112
+
91
113
  const needsSplitAssign = this.needsSplitAssign( builder );
92
114
 
93
115
  const targetType = targetNode.getNodeType( builder );
94
116
 
95
- const target = targetNode.context( { assign: true } ).build( builder );
117
+ const target = targetNode.build( builder );
96
118
  const source = sourceNode.build( builder, targetType );
97
119
 
98
120
  const sourceType = sourceNode.getNodeType( builder );
@@ -118,11 +140,14 @@ class AssignNode extends TempNode {
118
140
 
119
141
  builder.addLineFlowCode( `${ sourceProperty } = ${ source }`, this );
120
142
 
121
- const targetRoot = targetNode.node.context( { assign: true } ).build( builder );
143
+ const splitNode = targetNode.node;
144
+ const splitTargetNode = splitNode.node.context( { assign: true } );
145
+
146
+ const targetRoot = splitTargetNode.build( builder );
122
147
 
123
- for ( let i = 0; i < targetNode.components.length; i ++ ) {
148
+ for ( let i = 0; i < splitNode.components.length; i ++ ) {
124
149
 
125
- const component = targetNode.components[ i ];
150
+ const component = splitNode.components[ i ];
126
151
 
127
152
  builder.addLineFlowCode( `${ targetRoot }.${ component } = ${ sourceProperty }[ ${ i } ]`, this );
128
153
 
@@ -161,7 +161,7 @@ export default AttributeNode;
161
161
  * @tsl
162
162
  * @function
163
163
  * @param {string} name - The name of the attribute.
164
- * @param {string} [nodeType] - The node type.
164
+ * @param {?string} [nodeType=null] - The node type.
165
165
  * @returns {AttributeNode}
166
166
  */
167
- export const attribute = ( name, nodeType ) => nodeObject( new AttributeNode( name, nodeType ) );
167
+ export const attribute = ( name, nodeType = null ) => nodeObject( new AttributeNode( name, nodeType ) );
@@ -80,8 +80,14 @@ class ContextNode extends Node {
80
80
 
81
81
  analyze( builder ) {
82
82
 
83
+ const previousContext = builder.getContext();
84
+
85
+ builder.setContext( { ...builder.context, ...this.value } );
86
+
83
87
  this.node.build( builder );
84
88
 
89
+ builder.setContext( previousContext );
90
+
85
91
  }
86
92
 
87
93
  setup( builder ) {
@@ -90,12 +96,10 @@ class ContextNode extends Node {
90
96
 
91
97
  builder.setContext( { ...builder.context, ...this.value } );
92
98
 
93
- const node = this.node.build( builder );
99
+ this.node.build( builder );
94
100
 
95
101
  builder.setContext( previousContext );
96
102
 
97
- return node;
98
-
99
103
  }
100
104
 
101
105
  generate( builder, output ) {
@@ -127,16 +131,35 @@ export default ContextNode;
127
131
  */
128
132
  export const context = /*@__PURE__*/ nodeProxy( ContextNode ).setParameterLength( 1, 2 );
129
133
 
134
+ /**
135
+ * TSL function for defining a name for the context value for a given node.
136
+ *
137
+ * @tsl
138
+ * @function
139
+ * @param {Node} node - The node whose context should be modified.
140
+ * @param {string} name - The name to set.
141
+ * @returns {ContextNode}
142
+ */
143
+ export const setName = ( node, name ) => context( node, { nodeName: name } );
144
+
130
145
  /**
131
146
  * TSL function for defining a label context value for a given node.
132
147
  *
133
148
  * @tsl
134
149
  * @function
150
+ * @deprecated
135
151
  * @param {Node} node - The node whose context should be modified.
136
152
  * @param {string} name - The name/label to set.
137
153
  * @returns {ContextNode}
138
154
  */
139
- export const label = ( node, name ) => context( node, { label: name } );
155
+ export function label( node, name ) {
156
+
157
+ console.warn( 'THREE.TSL: "label()" has been deprecated. Use "setName()" instead.' ); // @deprecated r179
158
+
159
+ return setName( node, name );
160
+
161
+ }
140
162
 
141
163
  addMethodChaining( 'context', context );
142
164
  addMethodChaining( 'label', label );
165
+ addMethodChaining( 'setName', setName );
@@ -4,6 +4,11 @@ import { getNodeChildren, getCacheKey, hash } from './NodeUtils.js';
4
4
  import { EventDispatcher } from '../../core/EventDispatcher.js';
5
5
  import { MathUtils } from '../../math/MathUtils.js';
6
6
 
7
+ const _parentBuildStage = {
8
+ analyze: 'setup',
9
+ generate: 'analyze'
10
+ };
11
+
7
12
  let _nodeId = 0;
8
13
 
9
14
  /**
@@ -87,6 +92,14 @@ class Node extends EventDispatcher {
87
92
  */
88
93
  this.global = false;
89
94
 
95
+ /**
96
+ * Create a list of parents for this node during the build process.
97
+ *
98
+ * @type {boolean}
99
+ * @default false
100
+ */
101
+ this.parents = false;
102
+
90
103
  /**
91
104
  * This flag can be used for type testing.
92
105
  *
@@ -248,7 +261,7 @@ class Node extends EventDispatcher {
248
261
  /**
249
262
  * By default this method returns the value of the {@link Node#global} flag. This method
250
263
  * can be overwritten in derived classes if an analytical way is required to determine the
251
- * global status.
264
+ * global cache referring to the current shader-stage.
252
265
  *
253
266
  * @param {NodeBuilder} builder - The current node builder.
254
267
  * @return {boolean} Whether this node is global or not.
@@ -467,10 +480,22 @@ class Node extends EventDispatcher {
467
480
 
468
481
  }
469
482
 
483
+ /**
484
+ * Returns the number of elements in the node array.
485
+ *
486
+ * @param {NodeBuilder} builder - The current node builder.
487
+ * @return {?number} The number of elements in the node array.
488
+ */
489
+ getArrayCount( /*builder*/ ) {
490
+
491
+ return null;
492
+
493
+ }
494
+
470
495
  /**
471
496
  * Represents the setup stage which is the first step of the build process, see {@link Node#build} method.
472
- * This method is often overwritten in derived modules to prepare the node which is used as the output/result.
473
- * The output node must be returned in the `return` statement.
497
+ * This method is often overwritten in derived modules to prepare the node which is used as a node's output/result.
498
+ * If an output node is prepared, then it must be returned in the `return` statement of the derived module's setup function.
474
499
  *
475
500
  * @param {NodeBuilder} builder - The current node builder.
476
501
  * @return {?Node} The output node.
@@ -498,11 +523,21 @@ class Node extends EventDispatcher {
498
523
  * This stage analyzes the node hierarchy and ensures descendent nodes are built.
499
524
  *
500
525
  * @param {NodeBuilder} builder - The current node builder.
526
+ * @param {?Node} output - The target output node.
501
527
  */
502
- analyze( builder ) {
528
+ analyze( builder, output = null ) {
503
529
 
504
530
  const usageCount = builder.increaseUsage( this );
505
531
 
532
+ if ( this.parents === true ) {
533
+
534
+ const nodeData = builder.getDataFromNode( this, 'any' );
535
+ nodeData.stages = nodeData.stages || {};
536
+ nodeData.stages[ builder.shaderStage ] = nodeData.stages[ builder.shaderStage ] || [];
537
+ nodeData.stages[ builder.shaderStage ].push( output );
538
+
539
+ }
540
+
506
541
  if ( usageCount === 1 ) {
507
542
 
508
543
  // node flow children
@@ -513,7 +548,7 @@ class Node extends EventDispatcher {
513
548
 
514
549
  if ( childNode && childNode.isNode === true ) {
515
550
 
516
- childNode.build( builder );
551
+ childNode.build( builder, this );
517
552
 
518
553
  }
519
554
 
@@ -586,12 +621,14 @@ class Node extends EventDispatcher {
586
621
  }
587
622
 
588
623
  /**
589
- * This method performs the build of a node. The behavior of this method as well as its return value depend
590
- * on the current build stage (setup, analyze or generate).
624
+ * This method performs the build of a node. The behavior and return value depend on the current build stage:
625
+ * - **setup**: Prepares the node and its children for the build process. This process can also create new nodes. Returns the node itself or a variant.
626
+ * - **analyze**: Analyzes the node hierarchy for optimizations in the code generation stage. Returns `null`.
627
+ * - **generate**: Generates the shader code for the node. Returns the generated shader string.
591
628
  *
592
629
  * @param {NodeBuilder} builder - The current node builder.
593
- * @param {?string} output - Can be used to define the output type.
594
- * @return {?string} When this method is executed in the setup or analyze stage, `null` is returned. In the generate stage, the generated shader string.
630
+ * @param {string|Node|null} [output=null] - Can be used to define the output type.
631
+ * @return {Node|string|null} The result of the build process, depending on the build stage.
595
632
  */
596
633
  build( builder, output = null ) {
597
634
 
@@ -603,6 +640,30 @@ class Node extends EventDispatcher {
603
640
 
604
641
  }
605
642
 
643
+ //
644
+
645
+ const nodeData = builder.getDataFromNode( this );
646
+ nodeData.buildStages = nodeData.buildStages || {};
647
+ nodeData.buildStages[ builder.buildStage ] = true;
648
+
649
+ const parentBuildStage = _parentBuildStage[ builder.buildStage ];
650
+
651
+ if ( parentBuildStage && nodeData.buildStages[ parentBuildStage ] !== true ) {
652
+
653
+ // force parent build stage (setup or analyze)
654
+
655
+ const previousBuildStage = builder.getBuildStage();
656
+
657
+ builder.setBuildStage( parentBuildStage );
658
+
659
+ this.build( builder );
660
+
661
+ builder.setBuildStage( previousBuildStage );
662
+
663
+ }
664
+
665
+ //
666
+
606
667
  builder.addNode( this );
607
668
  builder.addChain( this );
608
669
 
@@ -626,9 +687,7 @@ class Node extends EventDispatcher {
626
687
  //const stackNodesBeforeSetup = builder.stack.nodes.length;
627
688
 
628
689
  properties.initialized = true;
629
-
630
- const outputNode = this.setup( builder ); // return a node or null
631
- const isNodeOutput = outputNode && outputNode.isNode === true;
690
+ properties.outputNode = this.setup( builder ) || properties.outputNode || null;
632
691
 
633
692
  /*if ( isNodeOutput && builder.stack.nodes.length !== stackNodesBeforeSetup ) {
634
693
 
@@ -641,25 +700,27 @@ class Node extends EventDispatcher {
641
700
 
642
701
  if ( childNode && childNode.isNode === true ) {
643
702
 
644
- childNode.build( builder );
703
+ if ( childNode.parents === true ) {
645
704
 
646
- }
705
+ const childProperties = builder.getNodeProperties( childNode );
706
+ childProperties.parents = childProperties.parents || [];
707
+ childProperties.parents.push( this );
647
708
 
648
- }
709
+ }
649
710
 
650
- if ( isNodeOutput ) {
711
+ childNode.build( builder );
651
712
 
652
- outputNode.build( builder );
713
+ }
653
714
 
654
715
  }
655
716
 
656
- properties.outputNode = outputNode;
657
-
658
717
  }
659
718
 
719
+ result = properties.outputNode;
720
+
660
721
  } else if ( buildStage === 'analyze' ) {
661
722
 
662
- this.analyze( builder );
723
+ this.analyze( builder, output );
663
724
 
664
725
  } else if ( buildStage === 'generate' ) {
665
726
 
@@ -686,7 +747,7 @@ class Node extends EventDispatcher {
686
747
 
687
748
  console.warn( 'THREE.Node: Recursion detected.', this );
688
749
 
689
- result = '';
750
+ result = '/* Recursion detected. */';
690
751
 
691
752
  }
692
753
 
@@ -848,7 +909,7 @@ class Node extends EventDispatcher {
848
909
  type,
849
910
  meta,
850
911
  metadata: {
851
- version: 4.6,
912
+ version: 4.7,
852
913
  type: 'Node',
853
914
  generator: 'Node.toJSON'
854
915
  }