@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
@@ -196,7 +196,7 @@ class NodeBuilder {
196
196
  /**
197
197
  * A reference to the current fog node.
198
198
  *
199
- * @type {?FogNode}
199
+ * @type {?Node}
200
200
  * @default null
201
201
  */
202
202
  this.fogNode = null;
@@ -419,6 +419,30 @@ class NodeBuilder {
419
419
  */
420
420
  this.buildStage = null;
421
421
 
422
+ /**
423
+ * The sub-build layers.
424
+ *
425
+ * @type {Array<SubBuildNode>}
426
+ * @default []
427
+ */
428
+ this.subBuildLayers = [];
429
+
430
+ /**
431
+ * The current stack of nodes.
432
+ *
433
+ * @type {?StackNode}
434
+ * @default null
435
+ */
436
+ this.currentStack = null;
437
+
438
+ /**
439
+ * The current sub-build TSL function(Fn).
440
+ *
441
+ * @type {?string}
442
+ * @default null
443
+ */
444
+ this.subBuildFn = null;
445
+
422
446
  }
423
447
 
424
448
  /**
@@ -1577,7 +1601,23 @@ class NodeBuilder {
1577
1601
 
1578
1602
  if ( nodeData[ shaderStage ] === undefined ) nodeData[ shaderStage ] = {};
1579
1603
 
1580
- return nodeData[ shaderStage ];
1604
+ //
1605
+
1606
+ let data = nodeData[ shaderStage ];
1607
+
1608
+ const subBuilds = nodeData.any ? nodeData.any.subBuilds : null;
1609
+ const subBuild = this.getClosestSubBuild( subBuilds );
1610
+
1611
+ if ( subBuild ) {
1612
+
1613
+ if ( data.subBuildsCache === undefined ) data.subBuildsCache = {};
1614
+
1615
+ data = data.subBuildsCache[ subBuild ] || ( data.subBuildsCache[ subBuild ] = {} );
1616
+ data.subBuilds = subBuilds;
1617
+
1618
+ }
1619
+
1620
+ return data;
1581
1621
 
1582
1622
  }
1583
1623
 
@@ -1707,23 +1747,6 @@ class NodeBuilder {
1707
1747
 
1708
1748
  }
1709
1749
 
1710
- /**
1711
- * Returns the array length.
1712
- *
1713
- * @param {Node} node - The node.
1714
- * @return {?number} The array length.
1715
- */
1716
- getArrayCount( node ) {
1717
-
1718
- let count = null;
1719
-
1720
- if ( node.isArrayNode ) count = node.count;
1721
- else if ( node.isVarNode && node.node.isArrayNode ) count = node.node.count;
1722
-
1723
- return count;
1724
-
1725
- }
1726
-
1727
1750
  /**
1728
1751
  * Returns an instance of {@link NodeVar} for the given variable node.
1729
1752
  *
@@ -1738,8 +1761,9 @@ class NodeBuilder {
1738
1761
  getVarFromNode( node, name = null, type = node.getNodeType( this ), shaderStage = this.shaderStage, readOnly = false ) {
1739
1762
 
1740
1763
  const nodeData = this.getDataFromNode( node, shaderStage );
1764
+ const subBuildVariable = this.getSubBuildProperty( 'variable', nodeData.subBuilds );
1741
1765
 
1742
- let nodeVar = nodeData.variable;
1766
+ let nodeVar = nodeData[ subBuildVariable ];
1743
1767
 
1744
1768
  if ( nodeVar === undefined ) {
1745
1769
 
@@ -1758,7 +1782,15 @@ class NodeBuilder {
1758
1782
 
1759
1783
  //
1760
1784
 
1761
- const count = this.getArrayCount( node );
1785
+ if ( subBuildVariable !== 'variable' ) {
1786
+
1787
+ name = this.getSubBuildProperty( name, nodeData.subBuilds );
1788
+
1789
+ }
1790
+
1791
+ //
1792
+
1793
+ const count = node.getArrayCount( this );
1762
1794
 
1763
1795
  nodeVar = new NodeVar( name, type, readOnly, count );
1764
1796
 
@@ -1770,7 +1802,7 @@ class NodeBuilder {
1770
1802
 
1771
1803
  this.registerDeclaration( nodeVar );
1772
1804
 
1773
- nodeData.variable = nodeVar;
1805
+ nodeData[ subBuildVariable ] = nodeVar;
1774
1806
 
1775
1807
  }
1776
1808
 
@@ -1831,13 +1863,16 @@ class NodeBuilder {
1831
1863
  * @param {(VaryingNode|PropertyNode)} node - The varying node.
1832
1864
  * @param {?string} name - The varying's name.
1833
1865
  * @param {string} [type=node.getNodeType( this )] - The varying's type.
1866
+ * @param {?string} interpolationType - The interpolation type of the varying.
1867
+ * @param {?string} interpolationSampling - The interpolation sampling type of the varying.
1834
1868
  * @return {NodeVar} The node varying.
1835
1869
  */
1836
- getVaryingFromNode( node, name = null, type = node.getNodeType( this ) ) {
1870
+ getVaryingFromNode( node, name = null, type = node.getNodeType( this ), interpolationType = null, interpolationSampling = null ) {
1837
1871
 
1838
1872
  const nodeData = this.getDataFromNode( node, 'any' );
1873
+ const subBuildVarying = this.getSubBuildProperty( 'varying', nodeData.subBuilds );
1839
1874
 
1840
- let nodeVarying = nodeData.varying;
1875
+ let nodeVarying = nodeData[ subBuildVarying ];
1841
1876
 
1842
1877
  if ( nodeVarying === undefined ) {
1843
1878
 
@@ -1846,13 +1881,23 @@ class NodeBuilder {
1846
1881
 
1847
1882
  if ( name === null ) name = 'nodeVarying' + index;
1848
1883
 
1849
- nodeVarying = new NodeVarying( name, type );
1884
+ //
1885
+
1886
+ if ( subBuildVarying !== 'varying' ) {
1887
+
1888
+ name = this.getSubBuildProperty( name, nodeData.subBuilds );
1889
+
1890
+ }
1891
+
1892
+ //
1893
+
1894
+ nodeVarying = new NodeVarying( name, type, interpolationType, interpolationSampling );
1850
1895
 
1851
1896
  varyings.push( nodeVarying );
1852
1897
 
1853
1898
  this.registerDeclaration( nodeVarying );
1854
1899
 
1855
- nodeData.varying = nodeVarying;
1900
+ nodeData[ subBuildVarying ] = nodeVarying;
1856
1901
 
1857
1902
  }
1858
1903
 
@@ -1883,8 +1928,6 @@ class NodeBuilder {
1883
1928
 
1884
1929
  }
1885
1930
 
1886
- declarations[ name ] = node;
1887
-
1888
1931
  if ( index > 1 ) {
1889
1932
 
1890
1933
  node.name = name;
@@ -1893,6 +1936,8 @@ class NodeBuilder {
1893
1936
 
1894
1937
  }
1895
1938
 
1939
+ declarations[ name ] = node;
1940
+
1896
1941
  }
1897
1942
 
1898
1943
  /**
@@ -2171,6 +2216,28 @@ class NodeBuilder {
2171
2216
 
2172
2217
  }
2173
2218
 
2219
+ /**
2220
+ * Executes the node in a specific build stage.
2221
+ *
2222
+ * @param {Node} node - The node to execute.
2223
+ * @param {string} buildStage - The build stage to execute the node in.
2224
+ * @param {Node|string|null} output - Expected output type. For example 'vec3'.
2225
+ * @return {Node|string|null} The result of the node build.
2226
+ */
2227
+ flowBuildStage( node, buildStage, output = null ) {
2228
+
2229
+ const previousBuildStage = this.getBuildStage();
2230
+
2231
+ this.setBuildStage( buildStage );
2232
+
2233
+ const result = node.build( this, output );
2234
+
2235
+ this.setBuildStage( previousBuildStage );
2236
+
2237
+ return result;
2238
+
2239
+ }
2240
+
2174
2241
  /**
2175
2242
  * Runs the node flow through all the steps of creation, 'setup', 'analyze', 'generate'.
2176
2243
  *
@@ -2281,27 +2348,53 @@ class NodeBuilder {
2281
2348
  * @param {Node} node - The node to execute.
2282
2349
  * @param {?string} output - Expected output type. For example 'vec3'.
2283
2350
  * @param {?string} propertyName - The property name to assign the result.
2284
- * @return {Object}
2351
+ * @return {Object|Node|null} The code flow or node.build() result.
2285
2352
  */
2286
2353
  flowNodeFromShaderStage( shaderStage, node, output = null, propertyName = null ) {
2287
2354
 
2355
+ const previousTab = this.tab;
2356
+ const previousCache = this.cache;
2288
2357
  const previousShaderStage = this.shaderStage;
2358
+ const previousContext = this.context;
2289
2359
 
2290
2360
  this.setShaderStage( shaderStage );
2291
2361
 
2292
- const flowData = this.flowChildNode( node, output );
2362
+ const context = { ...this.context };
2363
+ delete context.nodeBlock;
2364
+
2365
+ this.cache = this.globalCache;
2366
+ this.tab = '\t';
2367
+ this.context = context;
2293
2368
 
2294
- if ( propertyName !== null ) {
2369
+ let result = null;
2295
2370
 
2296
- flowData.code += `${ this.tab + propertyName } = ${ flowData.result };\n`;
2371
+ if ( this.buildStage === 'generate' ) {
2297
2372
 
2298
- }
2373
+ const flowData = this.flowChildNode( node, output );
2374
+
2375
+ if ( propertyName !== null ) {
2376
+
2377
+ flowData.code += `${ this.tab + propertyName } = ${ flowData.result };\n`;
2378
+
2379
+ }
2380
+
2381
+ this.flowCode[ shaderStage ] = this.flowCode[ shaderStage ] + flowData.code;
2382
+
2383
+ result = flowData;
2299
2384
 
2300
- this.flowCode[ shaderStage ] = this.flowCode[ shaderStage ] + flowData.code;
2385
+ } else {
2386
+
2387
+ result = node.build( this );
2388
+
2389
+ }
2301
2390
 
2302
2391
  this.setShaderStage( previousShaderStage );
2303
2392
 
2304
- return flowData;
2393
+ this.cache = previousCache;
2394
+ this.tab = previousTab;
2395
+ this.context = previousContext;
2396
+
2397
+ return result;
2305
2398
 
2306
2399
  }
2307
2400
 
@@ -2487,6 +2580,145 @@ class NodeBuilder {
2487
2580
 
2488
2581
  }
2489
2582
 
2583
+ /**
2584
+ * Returns the current sub-build layer.
2585
+ *
2586
+ * @return {SubBuildNode} The current sub-build layers.
2587
+ */
2588
+ get subBuild() {
2589
+
2590
+ return this.subBuildLayers[ this.subBuildLayers.length - 1 ] || null;
2591
+
2592
+ }
2593
+
2594
+ /**
2595
+ * Adds a sub-build layer to the node builder.
2596
+ *
2597
+ * @param {SubBuildNode} subBuild - The sub-build layer to add.
2598
+ */
2599
+ addSubBuild( subBuild ) {
2600
+
2601
+ this.subBuildLayers.push( subBuild );
2602
+
2603
+ }
2604
+
2605
+ /**
2606
+ * Removes the last sub-build layer from the node builder.
2607
+ *
2608
+ * @return {SubBuildNode} The removed sub-build layer.
2609
+ */
2610
+ removeSubBuild() {
2611
+
2612
+ return this.subBuildLayers.pop();
2613
+
2614
+ }
2615
+
2616
+ /**
2617
+ * Returns the closest sub-build layer for the given data.
2618
+ *
2619
+ * @param {Node|Set|Array} data - The data to get the closest sub-build layer from.
2620
+ * @return {?string} The closest sub-build name or null if none found.
2621
+ */
2622
+ getClosestSubBuild( data ) {
2623
+
2624
+ let subBuilds;
2625
+
2626
+ if ( data && data.isNode ) {
2627
+
2628
+ if ( data.isShaderCallNodeInternal ) {
2629
+
2630
+ subBuilds = data.shaderNode.subBuilds;
2631
+
2632
+ } else if ( data.isStackNode ) {
2633
+
2634
+ subBuilds = [ data.subBuild ];
2635
+
2636
+ } else {
2637
+
2638
+ subBuilds = this.getDataFromNode( data, 'any' ).subBuilds;
2639
+
2640
+ }
2641
+
2642
+ } else if ( data instanceof Set ) {
2643
+
2644
+ subBuilds = [ ...data ];
2645
+
2646
+ } else {
2647
+
2648
+ subBuilds = data;
2649
+
2650
+ }
2651
+
2652
+ if ( ! subBuilds ) return null;
2653
+
2654
+ const subBuildLayers = this.subBuildLayers;
2655
+
2656
+ for ( let i = subBuilds.length - 1; i >= 0; i -- ) {
2657
+
2658
+ const subBuild = subBuilds[ i ];
2659
+
2660
+ if ( subBuildLayers.includes( subBuild ) ) {
2661
+
2662
+ return subBuild;
2663
+
2664
+ }
2665
+
2666
+ }
2667
+
2668
+ return null;
2669
+
2670
+ }
2671
+
2672
+
2673
+ /**
2674
+ * Returns the output node of a sub-build layer.
2675
+ *
2676
+ * @param {Node} node - The node to get the output from.
2677
+ * @return {string} The output node name.
2678
+ */
2679
+ getSubBuildOutput( node ) {
2680
+
2681
+ return this.getSubBuildProperty( 'outputNode', node );
2682
+
2683
+ }
2684
+
2685
+ /**
2686
+ * Returns the sub-build property name for the given property and node.
2687
+ *
2688
+ * @param {string} [property=''] - The property name.
2689
+ * @param {?Node} [node=null] - The node to get the sub-build from.
2690
+ * @return {string} The sub-build property name.
2691
+ */
2692
+ getSubBuildProperty( property = '', node = null ) {
2693
+
2694
+ let subBuild;
2695
+
2696
+ if ( node !== null ) {
2697
+
2698
+ subBuild = this.getClosestSubBuild( node );
2699
+
2700
+ } else {
2701
+
2702
+ subBuild = this.subBuildFn;
2703
+
2704
+ }
2705
+
2706
+ let result;
2707
+
2708
+ if ( subBuild ) {
2709
+
2710
+ result = property ? ( subBuild + '_' + property ) : subBuild;
2711
+
2712
+ } else {
2713
+
2714
+ result = property;
2715
+
2716
+ }
2717
+
2718
+ return result;
2719
+
2720
+ }
2721
+
2490
2722
  /**
2491
2723
  * Central build method which controls the build for the given object.
2492
2724
  *
@@ -2516,7 +2748,7 @@ class NodeBuilder {
2516
2748
 
2517
2749
  }
2518
2750
 
2519
- // setup() -> stage 1: create possible new nodes and returns an output reference node
2751
+ // setup() -> stage 1: create possible new nodes and/or return an output reference node
2520
2752
  // analyze() -> stage 2: analyze nodes to possible optimization and validation
2521
2753
  // generate() -> stage 3: generate shader
2522
2754
 
@@ -2649,7 +2881,9 @@ class NodeBuilder {
2649
2881
 
2650
2882
  if ( fromTypeLength > toTypeLength ) {
2651
2883
 
2652
- return this.format( `${ snippet }.${ 'xyz'.slice( 0, toTypeLength ) }`, this.getTypeFromLength( toTypeLength, this.getComponentType( fromType ) ), toType );
2884
+ snippet = toType === 'bool' ? `all( ${ snippet } )` : `${ snippet }.${ 'xyz'.slice( 0, toTypeLength ) }`;
2885
+
2886
+ return this.format( snippet, this.getTypeFromLength( toTypeLength, this.getComponentType( fromType ) ), toType );
2653
2887
 
2654
2888
  }
2655
2889
 
@@ -2689,20 +2923,10 @@ class NodeBuilder {
2689
2923
 
2690
2924
  }
2691
2925
 
2692
- // Deprecated
2693
-
2694
2926
  /**
2695
- * @function
2696
- * @deprecated since r168. Use `new NodeMaterial()` instead, with targeted node material name.
2697
- *
2698
- * @param {string} [type='NodeMaterial'] - The node material type.
2699
- * @throws {Error}
2927
+ * Prevents the node builder from being used as an iterable in TSL.Fn(), avoiding potential runtime errors.
2700
2928
  */
2701
- createNodeMaterial( type = 'NodeMaterial' ) { // @deprecated, r168
2702
-
2703
- throw new Error( `THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${ type }() instead.` );
2704
-
2705
- }
2929
+ *[ Symbol.iterator ]() { }
2706
2930
 
2707
2931
  }
2708
2932
 
@@ -138,10 +138,13 @@ export function* getNodeChildren( node, toJSON = false ) {
138
138
 
139
139
  yield { property, childNode: object };
140
140
 
141
- } else if ( typeof object === 'object' ) {
141
+ } else if ( object && Object.getPrototypeOf( object ) === Object.prototype ) {
142
142
 
143
143
  for ( const subProperty in object ) {
144
144
 
145
+ // Ignore private properties.
146
+ if ( subProperty.startsWith( '_' ) === true ) continue;
147
+
145
148
  const child = object[ subProperty ];
146
149
 
147
150
  if ( child && ( child.isNode === true || toJSON && typeof child.toJSON === 'function' ) ) {
@@ -236,6 +239,48 @@ export function getLengthFromType( type ) {
236
239
 
237
240
  }
238
241
 
242
+ /**
243
+ * Returns the gpu memory length for the given data type.
244
+ *
245
+ * @method
246
+ * @param {string} type - The data type.
247
+ * @return {number} The length.
248
+ */
249
+ export function getMemoryLengthFromType( type ) {
250
+
251
+ if ( /float|int|uint/.test( type ) ) return 1;
252
+ if ( /vec2/.test( type ) ) return 2;
253
+ if ( /vec3/.test( type ) ) return 3;
254
+ if ( /vec4/.test( type ) ) return 4;
255
+ if ( /mat2/.test( type ) ) return 4;
256
+ if ( /mat3/.test( type ) ) return 12;
257
+ if ( /mat4/.test( type ) ) return 16;
258
+
259
+ console.error( 'THREE.TSL: Unsupported type:', type );
260
+
261
+ }
262
+
263
+ /**
264
+ * Returns the byte boundary for the given data type.
265
+ *
266
+ * @method
267
+ * @param {string} type - The data type.
268
+ * @return {number} The byte boundary.
269
+ */
270
+ export function getByteBoundaryFromType( type ) {
271
+
272
+ if ( /float|int|uint/.test( type ) ) return 4;
273
+ if ( /vec2/.test( type ) ) return 8;
274
+ if ( /vec3/.test( type ) ) return 16;
275
+ if ( /vec4/.test( type ) ) return 16;
276
+ if ( /mat2/.test( type ) ) return 8;
277
+ if ( /mat3/.test( type ) ) return 48;
278
+ if ( /mat4/.test( type ) ) return 64;
279
+
280
+ console.error( 'THREE.TSL: Unsupported type:', type );
281
+
282
+ }
283
+
239
284
  /**
240
285
  * Returns the data type for the given value.
241
286
  *
@@ -15,8 +15,10 @@ class NodeVarying extends NodeVar {
15
15
  *
16
16
  * @param {string} name - The name of the varying.
17
17
  * @param {string} type - The type of the varying.
18
+ * @param {?string} interpolationType - The interpolation type of the varying.
19
+ * @param {?string} interpolationSampling - The interpolation sampling type of the varying.
18
20
  */
19
- constructor( name, type ) {
21
+ constructor( name, type, interpolationType = null, interpolationSampling = null ) {
20
22
 
21
23
  super( name, type );
22
24
 
@@ -38,6 +40,22 @@ class NodeVarying extends NodeVar {
38
40
  */
39
41
  this.isNodeVarying = true;
40
42
 
43
+ /**
44
+ * The interpolation type of the varying data.
45
+ *
46
+ * @type {?string}
47
+ * @default null
48
+ */
49
+ this.interpolationType = interpolationType;
50
+
51
+ /**
52
+ * The interpolation sampling type of varying data.
53
+ *
54
+ * @type {?string}
55
+ * @default null
56
+ */
57
+ this.interpolationSampling = interpolationSampling;
58
+
41
59
  }
42
60
 
43
61
  }
@@ -58,6 +58,14 @@ class PropertyNode extends Node {
58
58
  */
59
59
  this.isPropertyNode = true;
60
60
 
61
+ /**
62
+ * This flag is used for global cache.
63
+ *
64
+ * @type {boolean}
65
+ * @default true
66
+ */
67
+ this.global = true;
68
+
61
69
  }
62
70
 
63
71
  getHash( builder ) {
@@ -66,18 +74,6 @@ class PropertyNode extends Node {
66
74
 
67
75
  }
68
76
 
69
- /**
70
- * The method is overwritten so it always returns `true`.
71
- *
72
- * @param {NodeBuilder} builder - The current node builder.
73
- * @return {boolean} Whether this node is global or not.
74
- */
75
- isGlobal( /*builder*/ ) {
76
-
77
- return true;
78
-
79
- }
80
-
81
77
  generate( builder ) {
82
78
 
83
79
  let nodeVar;