@plastic-software/three 0.175.13 → 0.178.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (529) hide show
  1. package/README.md +3 -3
  2. package/build/three.cjs +7747 -6792
  3. package/build/three.core.js +7371 -6576
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +190 -30
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +19 -11
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +4989 -2235
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +5082 -2469
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/jsm/Addons.js +0 -1
  14. package/examples/jsm/animation/AnimationClipCreator.js +1 -0
  15. package/examples/jsm/animation/CCDIKSolver.js +6 -3
  16. package/examples/jsm/capabilities/WebGL.js +1 -27
  17. package/examples/jsm/capabilities/WebGPU.js +1 -0
  18. package/examples/jsm/controls/ArcballControls.js +15 -4
  19. package/examples/jsm/controls/DragControls.js +1 -0
  20. package/examples/jsm/controls/FirstPersonControls.js +1 -0
  21. package/examples/jsm/controls/FlyControls.js +1 -0
  22. package/examples/jsm/controls/MapControls.js +1 -0
  23. package/examples/jsm/controls/OrbitControls.js +1 -0
  24. package/examples/jsm/controls/PointerLockControls.js +5 -3
  25. package/examples/jsm/controls/TrackballControls.js +1 -0
  26. package/examples/jsm/controls/TransformControls.js +62 -14
  27. package/examples/jsm/csm/CSM.js +2 -0
  28. package/examples/jsm/csm/CSMFrustum.js +2 -0
  29. package/examples/jsm/csm/CSMHelper.js +1 -0
  30. package/examples/jsm/csm/CSMShader.js +4 -1
  31. package/examples/jsm/csm/CSMShadowNode.js +18 -4
  32. package/examples/jsm/curves/CurveExtras.js +14 -0
  33. package/examples/jsm/curves/NURBSCurve.js +1 -0
  34. package/examples/jsm/curves/NURBSSurface.js +2 -0
  35. package/examples/jsm/curves/NURBSUtils.js +4 -1
  36. package/examples/jsm/curves/NURBSVolume.js +2 -0
  37. package/examples/jsm/effects/AnaglyphEffect.js +2 -0
  38. package/examples/jsm/effects/AsciiEffect.js +2 -0
  39. package/examples/jsm/effects/OutlineEffect.js +2 -0
  40. package/examples/jsm/effects/ParallaxBarrierEffect.js +2 -0
  41. package/examples/jsm/effects/StereoEffect.js +2 -0
  42. package/examples/jsm/environments/DebugEnvironment.js +1 -0
  43. package/examples/jsm/environments/RoomEnvironment.js +49 -35
  44. package/examples/jsm/exporters/DRACOExporter.js +4 -2
  45. package/examples/jsm/exporters/EXRExporter.js +2 -0
  46. package/examples/jsm/exporters/GLTFExporter.js +7 -4
  47. package/examples/jsm/exporters/KTX2Exporter.js +2 -0
  48. package/examples/jsm/exporters/OBJExporter.js +3 -1
  49. package/examples/jsm/exporters/PLYExporter.js +4 -2
  50. package/examples/jsm/exporters/STLExporter.js +2 -0
  51. package/examples/jsm/exporters/USDZExporter.js +12 -10
  52. package/examples/jsm/geometries/BoxLineGeometry.js +1 -0
  53. package/examples/jsm/geometries/ConvexGeometry.js +1 -0
  54. package/examples/jsm/geometries/DecalGeometry.js +1 -0
  55. package/examples/jsm/geometries/ParametricFunctions.js +4 -1
  56. package/examples/jsm/geometries/ParametricGeometry.js +1 -0
  57. package/examples/jsm/geometries/RoundedBoxGeometry.js +2 -1
  58. package/examples/jsm/geometries/TeapotGeometry.js +1 -0
  59. package/examples/jsm/geometries/TextGeometry.js +1 -0
  60. package/examples/jsm/helpers/LightProbeHelper.js +1 -0
  61. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -0
  62. package/examples/jsm/helpers/OctreeHelper.js +1 -0
  63. package/examples/jsm/helpers/PositionalAudioHelper.js +1 -0
  64. package/examples/jsm/helpers/RapierHelper.js +59 -0
  65. package/examples/jsm/helpers/RectAreaLightHelper.js +1 -0
  66. package/examples/jsm/helpers/TextureHelper.js +1 -0
  67. package/examples/jsm/helpers/TextureHelperGPU.js +5 -4
  68. package/examples/jsm/helpers/VertexNormalsHelper.js +1 -0
  69. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -0
  70. package/examples/jsm/helpers/ViewHelper.js +1 -0
  71. package/examples/jsm/interactive/HTMLMesh.js +7 -0
  72. package/examples/jsm/interactive/InteractiveGroup.js +1 -0
  73. package/examples/jsm/interactive/SelectionBox.js +2 -0
  74. package/examples/jsm/interactive/SelectionHelper.js +2 -0
  75. package/examples/jsm/lighting/TiledLighting.js +1 -0
  76. package/examples/jsm/lights/LightProbeGenerator.js +1 -0
  77. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -0
  78. package/examples/jsm/lights/RectAreaLightUniformsLib.js +1 -0
  79. package/examples/jsm/lines/Line2.js +1 -0
  80. package/examples/jsm/lines/LineGeometry.js +1 -0
  81. package/examples/jsm/lines/LineMaterial.js +4 -4
  82. package/examples/jsm/lines/LineSegments2.js +1 -0
  83. package/examples/jsm/lines/LineSegmentsGeometry.js +1 -0
  84. package/examples/jsm/lines/Wireframe.js +1 -0
  85. package/examples/jsm/lines/WireframeGeometry2.js +1 -0
  86. package/examples/jsm/lines/webgpu/Line2.js +1 -0
  87. package/examples/jsm/lines/webgpu/LineSegments2.js +3 -1
  88. package/examples/jsm/lines/webgpu/Wireframe.js +1 -0
  89. package/examples/jsm/loaders/3DMLoader.js +1 -0
  90. package/examples/jsm/loaders/3MFLoader.js +1 -0
  91. package/examples/jsm/loaders/AMFLoader.js +1 -0
  92. package/examples/jsm/loaders/BVHLoader.js +1 -0
  93. package/examples/jsm/loaders/ColladaLoader.js +6 -5
  94. package/examples/jsm/loaders/DDSLoader.js +1 -0
  95. package/examples/jsm/loaders/DRACOLoader.js +2 -1
  96. package/examples/jsm/loaders/EXRLoader.js +1 -0
  97. package/examples/jsm/loaders/FBXLoader.js +25 -23
  98. package/examples/jsm/loaders/FontLoader.js +1 -0
  99. package/examples/jsm/loaders/GCodeLoader.js +1 -0
  100. package/examples/jsm/loaders/GLTFLoader.js +10 -82
  101. package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -0
  102. package/examples/jsm/loaders/IESLoader.js +1 -0
  103. package/examples/jsm/loaders/KMZLoader.js +1 -0
  104. package/examples/jsm/loaders/KTX2Loader.js +67 -26
  105. package/examples/jsm/loaders/KTXLoader.js +1 -0
  106. package/examples/jsm/loaders/LDrawLoader.js +55 -3
  107. package/examples/jsm/loaders/LUT3dlLoader.js +1 -0
  108. package/examples/jsm/loaders/LUTCubeLoader.js +1 -0
  109. package/examples/jsm/loaders/LUTImageLoader.js +1 -0
  110. package/examples/jsm/loaders/LWOLoader.js +1 -13
  111. package/examples/jsm/loaders/LottieLoader.js +15 -0
  112. package/examples/jsm/loaders/MD2Loader.js +1 -0
  113. package/examples/jsm/loaders/MDDLoader.js +1 -0
  114. package/examples/jsm/loaders/MTLLoader.js +4 -3
  115. package/examples/jsm/loaders/MaterialXLoader.js +1 -0
  116. package/examples/jsm/loaders/NRRDLoader.js +1 -0
  117. package/examples/jsm/loaders/OBJLoader.js +1 -0
  118. package/examples/jsm/loaders/PCDLoader.js +122 -19
  119. package/examples/jsm/loaders/PDBLoader.js +1 -0
  120. package/examples/jsm/loaders/PLYLoader.js +1 -0
  121. package/examples/jsm/loaders/PVRLoader.js +1 -0
  122. package/examples/jsm/loaders/RGBELoader.js +1 -0
  123. package/examples/jsm/loaders/RGBMLoader.js +1 -0
  124. package/examples/jsm/loaders/STLLoader.js +1 -0
  125. package/examples/jsm/loaders/SVGLoader.js +1 -0
  126. package/examples/jsm/loaders/TDSLoader.js +1 -0
  127. package/examples/jsm/loaders/TGALoader.js +1 -0
  128. package/examples/jsm/loaders/TIFFLoader.js +1 -0
  129. package/examples/jsm/loaders/TTFLoader.js +1 -0
  130. package/examples/jsm/loaders/USDZLoader.js +1 -0
  131. package/examples/jsm/loaders/UltraHDRLoader.js +1 -0
  132. package/examples/jsm/loaders/VOXLoader.js +1 -0
  133. package/examples/jsm/loaders/VRMLLoader.js +3 -2
  134. package/examples/jsm/loaders/VTKLoader.js +1 -0
  135. package/examples/jsm/loaders/XYZLoader.js +1 -0
  136. package/examples/jsm/loaders/lwo/IFFParser.js +74 -74
  137. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +1 -0
  138. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -0
  139. package/examples/jsm/materials/MeshPostProcessingMaterial.js +1 -0
  140. package/examples/jsm/math/Capsule.js +2 -0
  141. package/examples/jsm/math/ColorConverter.js +1 -0
  142. package/examples/jsm/math/ConvexHull.js +2 -0
  143. package/examples/jsm/math/ImprovedNoise.js +19 -14
  144. package/examples/jsm/math/Lut.js +2 -0
  145. package/examples/jsm/math/MeshSurfaceSampler.js +2 -0
  146. package/examples/jsm/math/OBB.js +2 -0
  147. package/examples/jsm/math/Octree.js +20 -1
  148. package/examples/jsm/math/SimplexNoise.js +2 -0
  149. package/examples/jsm/misc/ConvexObjectBreaker.js +3 -1
  150. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  151. package/examples/jsm/misc/Gyroscope.js +1 -0
  152. package/examples/jsm/misc/MD2Character.js +2 -0
  153. package/examples/jsm/misc/MD2CharacterComplex.js +5 -3
  154. package/examples/jsm/misc/MorphAnimMesh.js +1 -0
  155. package/examples/jsm/misc/MorphBlendMesh.js +1 -0
  156. package/examples/jsm/misc/ProgressiveLightMap.js +2 -0
  157. package/examples/jsm/misc/ProgressiveLightMapGPU.js +2 -0
  158. package/examples/jsm/misc/RollerCoaster.js +5 -0
  159. package/examples/jsm/misc/Timer.js +2 -0
  160. package/examples/jsm/misc/TubePainter.js +1 -0
  161. package/examples/jsm/misc/Volume.js +2 -0
  162. package/examples/jsm/misc/VolumeSlice.js +1 -0
  163. package/examples/jsm/modifiers/CurveModifier.js +3 -0
  164. package/examples/jsm/modifiers/CurveModifierGPU.js +2 -0
  165. package/examples/jsm/modifiers/EdgeSplitModifier.js +2 -0
  166. package/examples/jsm/modifiers/SimplifyModifier.js +2 -0
  167. package/examples/jsm/modifiers/TessellateModifier.js +2 -0
  168. package/examples/jsm/objects/GroundedSkybox.js +1 -0
  169. package/examples/jsm/objects/Lensflare.js +3 -0
  170. package/examples/jsm/objects/LensflareMesh.js +1 -0
  171. package/examples/jsm/objects/MarchingCubes.js +2 -0
  172. package/examples/jsm/objects/Reflector.js +1 -0
  173. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  174. package/examples/jsm/objects/Refractor.js +1 -0
  175. package/examples/jsm/objects/ShadowMesh.js +1 -0
  176. package/examples/jsm/objects/Sky.js +2 -1
  177. package/examples/jsm/objects/SkyMesh.js +20 -17
  178. package/examples/jsm/objects/Water.js +1 -0
  179. package/examples/jsm/objects/Water2.js +1 -0
  180. package/examples/jsm/objects/Water2Mesh.js +3 -1
  181. package/examples/jsm/objects/WaterMesh.js +2 -1
  182. package/examples/jsm/physics/AmmoPhysics.js +1 -0
  183. package/examples/jsm/physics/JoltPhysics.js +1 -0
  184. package/examples/jsm/physics/RapierPhysics.js +139 -12
  185. package/examples/jsm/postprocessing/AfterimagePass.js +20 -2
  186. package/examples/jsm/postprocessing/BloomPass.js +2 -1
  187. package/examples/jsm/postprocessing/BokehPass.js +2 -1
  188. package/examples/jsm/postprocessing/ClearPass.js +1 -0
  189. package/examples/jsm/postprocessing/CubeTexturePass.js +1 -0
  190. package/examples/jsm/postprocessing/DotScreenPass.js +1 -0
  191. package/examples/jsm/postprocessing/EffectComposer.js +4 -2
  192. package/examples/jsm/postprocessing/FXAAPass.js +40 -0
  193. package/examples/jsm/postprocessing/FilmPass.js +1 -0
  194. package/examples/jsm/postprocessing/GTAOPass.js +4 -3
  195. package/examples/jsm/postprocessing/GlitchPass.js +2 -1
  196. package/examples/jsm/postprocessing/HalftonePass.js +2 -1
  197. package/examples/jsm/postprocessing/LUTPass.js +1 -0
  198. package/examples/jsm/postprocessing/MaskPass.js +1 -0
  199. package/examples/jsm/postprocessing/OutlinePass.js +5 -2
  200. package/examples/jsm/postprocessing/OutputPass.js +1 -0
  201. package/examples/jsm/postprocessing/Pass.js +3 -1
  202. package/examples/jsm/postprocessing/RenderPass.js +1 -0
  203. package/examples/jsm/postprocessing/RenderPixelatedPass.js +2 -1
  204. package/examples/jsm/postprocessing/RenderTransitionPass.js +4 -3
  205. package/examples/jsm/postprocessing/SAOPass.js +3 -2
  206. package/examples/jsm/postprocessing/SMAAPass.js +3 -2
  207. package/examples/jsm/postprocessing/SSAARenderPass.js +2 -1
  208. package/examples/jsm/postprocessing/SSAOPass.js +2 -1
  209. package/examples/jsm/postprocessing/SSRPass.js +4 -3
  210. package/examples/jsm/postprocessing/SavePass.js +2 -1
  211. package/examples/jsm/postprocessing/ShaderPass.js +1 -0
  212. package/examples/jsm/postprocessing/TAARenderPass.js +1 -0
  213. package/examples/jsm/postprocessing/TexturePass.js +1 -0
  214. package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -1
  215. package/examples/jsm/renderers/CSS2DRenderer.js +3 -0
  216. package/examples/jsm/renderers/CSS3DRenderer.js +4 -0
  217. package/examples/jsm/renderers/Projector.js +2 -0
  218. package/examples/jsm/renderers/SVGRenderer.js +3 -0
  219. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +4 -1
  220. package/examples/jsm/shaders/AfterimageShader.js +4 -1
  221. package/examples/jsm/shaders/BasicShader.js +4 -1
  222. package/examples/jsm/shaders/BleachBypassShader.js +4 -1
  223. package/examples/jsm/shaders/BlendShader.js +4 -1
  224. package/examples/jsm/shaders/BokehShader.js +4 -1
  225. package/examples/jsm/shaders/BokehShader2.js +4 -1
  226. package/examples/jsm/shaders/BrightnessContrastShader.js +4 -1
  227. package/examples/jsm/shaders/ColorCorrectionShader.js +4 -1
  228. package/examples/jsm/shaders/ColorifyShader.js +4 -1
  229. package/examples/jsm/shaders/ConvolutionShader.js +4 -1
  230. package/examples/jsm/shaders/CopyShader.js +4 -1
  231. package/examples/jsm/shaders/DOFMipMapShader.js +4 -1
  232. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  233. package/examples/jsm/shaders/DigitalGlitch.js +4 -1
  234. package/examples/jsm/shaders/DotScreenShader.js +4 -1
  235. package/examples/jsm/shaders/ExposureShader.js +4 -1
  236. package/examples/jsm/shaders/FXAAShader.js +4 -1
  237. package/examples/jsm/shaders/FilmShader.js +4 -1
  238. package/examples/jsm/shaders/FocusShader.js +4 -1
  239. package/examples/jsm/shaders/FreiChenShader.js +4 -1
  240. package/examples/jsm/shaders/GTAOShader.js +4 -1
  241. package/examples/jsm/shaders/GammaCorrectionShader.js +4 -1
  242. package/examples/jsm/shaders/GodRaysShader.js +4 -1
  243. package/examples/jsm/shaders/HalftoneShader.js +4 -1
  244. package/examples/jsm/shaders/HorizontalBlurShader.js +4 -1
  245. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +4 -1
  246. package/examples/jsm/shaders/HueSaturationShader.js +4 -1
  247. package/examples/jsm/shaders/KaleidoShader.js +4 -1
  248. package/examples/jsm/shaders/LuminosityHighPassShader.js +4 -1
  249. package/examples/jsm/shaders/LuminosityShader.js +4 -1
  250. package/examples/jsm/shaders/MirrorShader.js +4 -1
  251. package/examples/jsm/shaders/NormalMapShader.js +4 -1
  252. package/examples/jsm/shaders/OutputShader.js +4 -1
  253. package/examples/jsm/shaders/PoissonDenoiseShader.js +4 -1
  254. package/examples/jsm/shaders/RGBShiftShader.js +4 -1
  255. package/examples/jsm/shaders/SAOShader.js +4 -1
  256. package/examples/jsm/shaders/SMAAShader.js +1 -0
  257. package/examples/jsm/shaders/SSAOShader.js +4 -1
  258. package/examples/jsm/shaders/SSRShader.js +1 -0
  259. package/examples/jsm/shaders/SepiaShader.js +4 -1
  260. package/examples/jsm/shaders/SobelOperatorShader.js +4 -1
  261. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +4 -1
  262. package/examples/jsm/shaders/TechnicolorShader.js +4 -1
  263. package/examples/jsm/shaders/ToonShader.js +2 -1
  264. package/examples/jsm/shaders/TriangleBlurShader.js +4 -1
  265. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +4 -1
  266. package/examples/jsm/shaders/VelocityShader.js +4 -1
  267. package/examples/jsm/shaders/VerticalBlurShader.js +4 -1
  268. package/examples/jsm/shaders/VerticalTiltShiftShader.js +4 -1
  269. package/examples/jsm/shaders/VignetteShader.js +4 -1
  270. package/examples/jsm/shaders/VolumeShader.js +5 -2
  271. package/examples/jsm/shaders/WaterRefractionShader.js +4 -1
  272. package/examples/jsm/textures/FlakesTexture.js +2 -0
  273. package/examples/jsm/transpiler/AST.js +381 -30
  274. package/examples/jsm/transpiler/GLSLDecoder.js +226 -87
  275. package/examples/jsm/transpiler/Linker.js +327 -0
  276. package/examples/jsm/transpiler/TSLEncoder.js +234 -85
  277. package/examples/jsm/transpiler/Transpiler.js +19 -1
  278. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  279. package/examples/jsm/transpiler/WGSLEncoder.js +788 -0
  280. package/examples/jsm/tsl/display/AfterImageNode.js +2 -3
  281. package/examples/jsm/tsl/display/AnaglyphPassNode.js +1 -0
  282. package/examples/jsm/tsl/display/AnamorphicNode.js +5 -4
  283. package/examples/jsm/tsl/display/BloomNode.js +1 -0
  284. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +206 -0
  285. package/examples/jsm/tsl/display/DenoiseNode.js +33 -33
  286. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -0
  287. package/examples/jsm/tsl/display/DotScreenNode.js +1 -0
  288. package/examples/jsm/tsl/display/FXAANode.js +3 -2
  289. package/examples/jsm/tsl/display/FilmNode.js +1 -0
  290. package/examples/jsm/tsl/display/GTAONode.js +1 -0
  291. package/examples/jsm/tsl/display/GaussianBlurNode.js +4 -29
  292. package/examples/jsm/tsl/display/LensflareNode.js +1 -0
  293. package/examples/jsm/tsl/display/Lut3DNode.js +1 -0
  294. package/examples/jsm/tsl/display/OutlineNode.js +1 -0
  295. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +1 -0
  296. package/examples/jsm/tsl/display/PixelationPassNode.js +1 -0
  297. package/examples/jsm/tsl/display/RGBShiftNode.js +1 -0
  298. package/examples/jsm/tsl/display/SMAANode.js +9 -8
  299. package/examples/jsm/tsl/display/SSAAPassNode.js +5 -4
  300. package/examples/jsm/tsl/display/SSRNode.js +1 -0
  301. package/examples/jsm/tsl/display/SobelOperatorNode.js +1 -0
  302. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -0
  303. package/examples/jsm/tsl/display/StereoPassNode.js +1 -0
  304. package/examples/jsm/tsl/display/TRAAPassNode.js +5 -4
  305. package/examples/jsm/tsl/display/TransitionNode.js +1 -0
  306. package/examples/jsm/tsl/display/hashBlur.js +28 -6
  307. package/examples/jsm/tsl/lighting/TiledLightsNode.js +4 -3
  308. package/examples/jsm/tsl/math/Bayer.js +4 -1
  309. package/examples/jsm/tsl/shadows/TileShadowNode.js +456 -0
  310. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +212 -0
  311. package/examples/jsm/tsl/utils/Raymarching.js +6 -3
  312. package/examples/jsm/utils/BufferGeometryUtils.js +4 -1
  313. package/examples/jsm/utils/CameraUtils.js +4 -1
  314. package/examples/jsm/utils/GeometryCompressionUtils.js +4 -1
  315. package/examples/jsm/utils/GeometryUtils.js +4 -1
  316. package/examples/jsm/utils/LDrawUtils.js +2 -0
  317. package/examples/jsm/utils/SceneOptimizer.js +2 -0
  318. package/examples/jsm/utils/SceneUtils.js +4 -1
  319. package/examples/jsm/utils/ShadowMapViewer.js +2 -0
  320. package/examples/jsm/utils/ShadowMapViewerGPU.js +2 -0
  321. package/examples/jsm/utils/SkeletonUtils.js +4 -1
  322. package/examples/jsm/utils/SortUtils.js +4 -1
  323. package/examples/jsm/utils/UVsDebug.js +4 -1
  324. package/examples/jsm/utils/WebGLTextureUtils.js +4 -1
  325. package/examples/jsm/utils/WebGPUTextureUtils.js +4 -1
  326. package/examples/jsm/utils/WorkerPool.js +2 -0
  327. package/examples/jsm/webxr/ARButton.js +1 -0
  328. package/examples/jsm/webxr/OculusHandModel.js +1 -0
  329. package/examples/jsm/webxr/OculusHandPointerModel.js +1 -0
  330. package/examples/jsm/webxr/Text2D.js +4 -1
  331. package/examples/jsm/webxr/VRButton.js +1 -0
  332. package/examples/jsm/webxr/XRButton.js +1 -0
  333. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -0
  334. package/examples/jsm/webxr/XREstimatedLight.js +1 -0
  335. package/examples/jsm/webxr/XRHandMeshModel.js +2 -0
  336. package/examples/jsm/webxr/XRHandModelFactory.js +2 -0
  337. package/examples/jsm/webxr/XRHandPrimitiveModel.js +2 -0
  338. package/examples/jsm/webxr/XRPlanes.js +1 -0
  339. package/package.json +6 -4
  340. package/src/Three.Core.js +1 -1
  341. package/src/Three.TSL.js +18 -10
  342. package/src/Three.WebGPU.Nodes.js +1 -0
  343. package/src/Three.WebGPU.js +3 -0
  344. package/src/audio/AudioListener.js +13 -10
  345. package/src/cameras/ArrayCamera.js +9 -1
  346. package/src/constants.js +47 -20
  347. package/src/core/BufferAttribute.js +3 -3
  348. package/src/core/BufferGeometry.js +2 -5
  349. package/src/core/Clock.js +2 -8
  350. package/src/core/GLBufferAttribute.js +13 -1
  351. package/src/core/Object3D.js +23 -22
  352. package/src/core/RenderTarget.js +65 -21
  353. package/src/core/RenderTarget3D.js +1 -0
  354. package/src/extras/TextureUtils.js +1 -5
  355. package/src/extras/core/Curve.js +1 -1
  356. package/src/extras/core/Path.js +22 -22
  357. package/src/geometries/CapsuleGeometry.js +167 -17
  358. package/src/geometries/ExtrudeGeometry.js +39 -29
  359. package/src/helpers/ArrowHelper.js +2 -2
  360. package/src/helpers/SkeletonHelper.js +1 -1
  361. package/src/lights/LightShadow.js +14 -0
  362. package/src/lights/SpotLightShadow.js +9 -1
  363. package/src/lights/webgpu/ProjectorLight.js +46 -0
  364. package/src/loaders/BufferGeometryLoader.js +1 -10
  365. package/src/loaders/FileLoader.js +2 -2
  366. package/src/loaders/ImageBitmapLoader.js +25 -9
  367. package/src/loaders/ImageLoader.js +55 -8
  368. package/src/loaders/ObjectLoader.js +44 -16
  369. package/src/loaders/nodes/NodeObjectLoader.js +2 -2
  370. package/src/materials/Material.js +1 -7
  371. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  372. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  373. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  374. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  375. package/src/materials/nodes/MeshSSSNodeMaterial.js +2 -2
  376. package/src/materials/nodes/NodeMaterial.js +105 -19
  377. package/src/materials/nodes/manager/NodeMaterialObserver.js +20 -2
  378. package/src/math/Box3.js +28 -0
  379. package/src/math/Color.js +7 -7
  380. package/src/math/ColorManagement.js +22 -3
  381. package/src/math/Frustum.js +6 -1
  382. package/src/math/FrustumArray.js +253 -0
  383. package/src/math/Quaternion.js +1 -1
  384. package/src/math/Ray.js +2 -0
  385. package/src/math/Sphere.js +28 -0
  386. package/src/nodes/Nodes.js +2 -3
  387. package/src/nodes/TSL.js +5 -3
  388. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  389. package/src/nodes/accessors/Bitangent.js +54 -26
  390. package/src/nodes/accessors/Camera.js +31 -4
  391. package/src/nodes/accessors/CubeTextureNode.js +50 -2
  392. package/src/nodes/accessors/InstanceNode.js +5 -4
  393. package/src/nodes/accessors/Lights.js +2 -2
  394. package/src/nodes/accessors/MaterialNode.js +4 -0
  395. package/src/nodes/accessors/ModelNode.js +1 -1
  396. package/src/nodes/accessors/Normal.js +102 -16
  397. package/src/nodes/accessors/Object3DNode.js +7 -8
  398. package/src/nodes/accessors/Position.js +14 -4
  399. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  400. package/src/nodes/accessors/ReferenceNode.js +1 -1
  401. package/src/nodes/accessors/ReflectVector.js +3 -3
  402. package/src/nodes/accessors/SkinningNode.js +3 -2
  403. package/src/nodes/accessors/StorageBufferNode.js +25 -0
  404. package/src/nodes/accessors/StorageTextureNode.js +14 -3
  405. package/src/nodes/accessors/Tangent.js +25 -17
  406. package/src/nodes/accessors/TangentUtils.js +46 -0
  407. package/src/nodes/accessors/TextureBicubic.js +21 -3
  408. package/src/nodes/accessors/TextureNode.js +59 -8
  409. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  410. package/src/nodes/accessors/VelocityNode.js +1 -0
  411. package/src/nodes/accessors/VertexColorNode.js +4 -4
  412. package/src/nodes/code/CodeNode.js +8 -11
  413. package/src/nodes/core/AssignNode.js +27 -5
  414. package/src/nodes/core/AttributeNode.js +2 -2
  415. package/src/nodes/core/ContextNode.js +7 -3
  416. package/src/nodes/core/Node.js +69 -20
  417. package/src/nodes/core/NodeBuilder.js +248 -29
  418. package/src/nodes/core/NodeUtils.js +42 -0
  419. package/src/nodes/core/NodeVarying.js +19 -1
  420. package/src/nodes/core/PropertyNode.js +8 -12
  421. package/src/nodes/core/StackNode.js +129 -26
  422. package/src/nodes/core/StructTypeNode.js +26 -4
  423. package/src/nodes/core/SubBuildNode.js +89 -0
  424. package/src/nodes/core/VarNode.js +11 -2
  425. package/src/nodes/core/VaryingNode.js +45 -24
  426. package/src/nodes/display/BlendModes.js +42 -1
  427. package/src/nodes/display/ColorSpaceNode.js +4 -27
  428. package/src/nodes/display/FrontFacingNode.js +34 -2
  429. package/src/nodes/display/NormalMapNode.js +19 -50
  430. package/src/nodes/display/PassNode.js +18 -19
  431. package/src/nodes/display/ScreenNode.js +0 -26
  432. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  433. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  434. package/src/nodes/functions/PhongLightingModel.js +3 -3
  435. package/src/nodes/functions/PhysicalLightingModel.js +14 -14
  436. package/src/nodes/functions/ShadowMaskModel.js +5 -1
  437. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  438. package/src/nodes/functions/material/getParallaxCorrectNormal.js +1 -1
  439. package/src/nodes/gpgpu/AtomicFunctionNode.js +28 -10
  440. package/src/nodes/gpgpu/BarrierNode.js +3 -3
  441. package/src/nodes/gpgpu/ComputeNode.js +1 -1
  442. package/src/nodes/lighting/AnalyticLightNode.js +7 -13
  443. package/src/nodes/lighting/EnvironmentNode.js +5 -5
  444. package/src/nodes/lighting/HemisphereLightNode.js +2 -2
  445. package/src/nodes/lighting/IESSpotLightNode.js +2 -1
  446. package/src/nodes/lighting/LightsNode.js +29 -11
  447. package/src/nodes/lighting/ProjectorLightNode.js +78 -0
  448. package/src/nodes/lighting/ShadowBaseNode.js +1 -12
  449. package/src/nodes/lighting/ShadowFilterNode.js +274 -0
  450. package/src/nodes/lighting/ShadowNode.js +174 -242
  451. package/src/nodes/lighting/SpotLightNode.js +44 -7
  452. package/src/nodes/materialx/lib/mx_noise.js +1 -1
  453. package/src/nodes/math/ConditionalNode.js +0 -19
  454. package/src/nodes/math/MathNode.js +68 -21
  455. package/src/nodes/math/OperatorNode.js +108 -98
  456. package/src/nodes/shapes/Shapes.js +5 -4
  457. package/src/nodes/tsl/TSLBase.js +1 -0
  458. package/src/nodes/tsl/TSLCore.js +160 -65
  459. package/src/nodes/utils/DebugNode.js +15 -3
  460. package/src/nodes/utils/Discard.js +2 -2
  461. package/src/nodes/utils/EquirectUV.js +27 -0
  462. package/src/nodes/utils/LoopNode.js +64 -34
  463. package/src/nodes/utils/MatcapUV.js +22 -0
  464. package/src/nodes/utils/RTTNode.js +13 -5
  465. package/src/nodes/utils/ReflectorNode.js +77 -7
  466. package/src/nodes/utils/SampleNode.js +81 -0
  467. package/src/nodes/utils/TriplanarTextures.js +65 -0
  468. package/src/objects/BatchedMesh.js +16 -4
  469. package/src/objects/Mesh.js +9 -0
  470. package/src/objects/Skeleton.js +1 -1
  471. package/src/objects/Sprite.js +9 -0
  472. package/src/renderers/WebGL3DRenderTarget.js +1 -0
  473. package/src/renderers/WebGLArrayRenderTarget.js +1 -0
  474. package/src/renderers/WebGLCubeRenderTarget.js +2 -4
  475. package/src/renderers/WebGLRenderer.js +25 -11
  476. package/src/renderers/common/Animation.js +2 -2
  477. package/src/renderers/common/Background.js +13 -2
  478. package/src/renderers/common/CubeRenderTarget.js +1 -1
  479. package/src/renderers/common/RenderList.js +0 -4
  480. package/src/renderers/common/RenderObject.js +80 -4
  481. package/src/renderers/common/Renderer.js +116 -8
  482. package/src/renderers/common/Storage3DTexture.js +79 -0
  483. package/src/renderers/common/StorageArrayTexture.js +63 -0
  484. package/src/renderers/common/Textures.js +15 -21
  485. package/src/renderers/common/TimestampQueryPool.js +1 -0
  486. package/src/renderers/common/Uniform.js +1 -1
  487. package/src/renderers/common/UniformsGroup.js +14 -18
  488. package/src/renderers/common/XRManager.js +157 -27
  489. package/src/renderers/common/XRRenderTarget.js +21 -4
  490. package/src/renderers/common/extras/PMREMGenerator.js +30 -23
  491. package/src/renderers/common/nodes/Nodes.js +13 -3
  492. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_maps.glsl.js +1 -1
  493. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +1 -1
  494. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
  495. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  496. package/src/renderers/webgl/WebGLPrograms.js +4 -2
  497. package/src/renderers/webgl/WebGLShadowMap.js +3 -2
  498. package/src/renderers/webgl/WebGLState.js +4 -4
  499. package/src/renderers/webgl/WebGLTextures.js +144 -4
  500. package/src/renderers/webgl/WebGLUtils.js +1 -3
  501. package/src/renderers/webgl-fallback/WebGLBackend.js +244 -87
  502. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +73 -7
  503. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  504. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +1 -0
  505. package/src/renderers/webgl-fallback/utils/WebGLState.js +4 -4
  506. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +44 -29
  507. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +22 -21
  508. package/src/renderers/webgpu/WebGPUBackend.js +451 -128
  509. package/src/renderers/webgpu/WebGPURenderer.js +7 -0
  510. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +4 -1
  511. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +4 -1
  512. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +86 -33
  513. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +3 -0
  514. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +9 -1
  515. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +28 -5
  516. package/src/renderers/webgpu/utils/WebGPUConstants.js +8 -2
  517. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +38 -8
  518. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +45 -50
  519. package/src/renderers/webxr/WebXRController.js +1 -1
  520. package/src/renderers/webxr/WebXRManager.js +2 -1
  521. package/src/textures/DepthTexture.js +6 -10
  522. package/src/textures/Source.js +22 -0
  523. package/src/textures/Texture.js +118 -1
  524. package/src/textures/VideoTexture.js +1 -1
  525. package/examples/jsm/effects/PeppersGhostEffect.js +0 -172
  526. package/src/core/RenderTargetArray.js +0 -40
  527. package/src/nodes/utils/EquirectUVNode.js +0 -65
  528. package/src/nodes/utils/MatcapUVNode.js +0 -49
  529. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -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.
@@ -498,11 +511,21 @@ class Node extends EventDispatcher {
498
511
  * This stage analyzes the node hierarchy and ensures descendent nodes are built.
499
512
  *
500
513
  * @param {NodeBuilder} builder - The current node builder.
514
+ * @param {?Node} output - The target output node.
501
515
  */
502
- analyze( builder ) {
516
+ analyze( builder, output = null ) {
503
517
 
504
518
  const usageCount = builder.increaseUsage( this );
505
519
 
520
+ if ( this.parents === true ) {
521
+
522
+ const nodeData = builder.getDataFromNode( this, 'any' );
523
+ nodeData.stages = nodeData.stages || {};
524
+ nodeData.stages[ builder.shaderStage ] = nodeData.stages[ builder.shaderStage ] || [];
525
+ nodeData.stages[ builder.shaderStage ].push( output );
526
+
527
+ }
528
+
506
529
  if ( usageCount === 1 ) {
507
530
 
508
531
  // node flow children
@@ -513,7 +536,7 @@ class Node extends EventDispatcher {
513
536
 
514
537
  if ( childNode && childNode.isNode === true ) {
515
538
 
516
- childNode.build( builder );
539
+ childNode.build( builder, this );
517
540
 
518
541
  }
519
542
 
@@ -586,12 +609,14 @@ class Node extends EventDispatcher {
586
609
  }
587
610
 
588
611
  /**
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).
612
+ * This method performs the build of a node. The behavior and return value depend on the current build stage:
613
+ * - **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.
614
+ * - **analyze**: Analyzes the node hierarchy for optimizations in the code generation stage. Returns `null`.
615
+ * - **generate**: Generates the shader code for the node. Returns the generated shader string.
591
616
  *
592
617
  * @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.
618
+ * @param {string|Node|null} [output=null] - Can be used to define the output type.
619
+ * @return {Node|string|null} The result of the build process, depending on the build stage.
595
620
  */
596
621
  build( builder, output = null ) {
597
622
 
@@ -603,6 +628,30 @@ class Node extends EventDispatcher {
603
628
 
604
629
  }
605
630
 
631
+ //
632
+
633
+ const nodeData = builder.getDataFromNode( this );
634
+ nodeData.buildStages = nodeData.buildStages || {};
635
+ nodeData.buildStages[ builder.buildStage ] = true;
636
+
637
+ const parentBuildStage = _parentBuildStage[ builder.buildStage ];
638
+
639
+ if ( parentBuildStage && nodeData.buildStages[ parentBuildStage ] !== true ) {
640
+
641
+ // force parent build stage (setup or analyze)
642
+
643
+ const previousBuildStage = builder.getBuildStage();
644
+
645
+ builder.setBuildStage( parentBuildStage );
646
+
647
+ this.build( builder );
648
+
649
+ builder.setBuildStage( previousBuildStage );
650
+
651
+ }
652
+
653
+ //
654
+
606
655
  builder.addNode( this );
607
656
  builder.addChain( this );
608
657
 
@@ -626,9 +675,7 @@ class Node extends EventDispatcher {
626
675
  //const stackNodesBeforeSetup = builder.stack.nodes.length;
627
676
 
628
677
  properties.initialized = true;
629
-
630
- const outputNode = this.setup( builder ); // return a node or null
631
- const isNodeOutput = outputNode && outputNode.isNode === true;
678
+ properties.outputNode = this.setup( builder ) || properties.outputNode || null;
632
679
 
633
680
  /*if ( isNodeOutput && builder.stack.nodes.length !== stackNodesBeforeSetup ) {
634
681
 
@@ -641,25 +688,27 @@ class Node extends EventDispatcher {
641
688
 
642
689
  if ( childNode && childNode.isNode === true ) {
643
690
 
644
- childNode.build( builder );
691
+ if ( childNode.parents === true ) {
645
692
 
646
- }
693
+ const childProperties = builder.getNodeProperties( childNode );
694
+ childProperties.parents = childProperties.parents || [];
695
+ childProperties.parents.push( this );
647
696
 
648
- }
697
+ }
649
698
 
650
- if ( isNodeOutput ) {
699
+ childNode.build( builder );
651
700
 
652
- outputNode.build( builder );
701
+ }
653
702
 
654
703
  }
655
704
 
656
- properties.outputNode = outputNode;
657
-
658
705
  }
659
706
 
707
+ result = properties.outputNode;
708
+
660
709
  } else if ( buildStage === 'analyze' ) {
661
710
 
662
- this.analyze( builder );
711
+ this.analyze( builder, output );
663
712
 
664
713
  } else if ( buildStage === 'generate' ) {
665
714
 
@@ -686,7 +735,7 @@ class Node extends EventDispatcher {
686
735
 
687
736
  console.warn( 'THREE.Node: Recursion detected.', this );
688
737
 
689
- result = '';
738
+ result = '/* Recursion detected. */';
690
739
 
691
740
  }
692
741
 
@@ -848,7 +897,7 @@ class Node extends EventDispatcher {
848
897
  type,
849
898
  meta,
850
899
  metadata: {
851
- version: 4.6,
900
+ version: 4.7,
852
901
  type: 'Node',
853
902
  generator: 'Node.toJSON'
854
903
  }
@@ -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
 
@@ -1738,8 +1778,9 @@ class NodeBuilder {
1738
1778
  getVarFromNode( node, name = null, type = node.getNodeType( this ), shaderStage = this.shaderStage, readOnly = false ) {
1739
1779
 
1740
1780
  const nodeData = this.getDataFromNode( node, shaderStage );
1781
+ const subBuildVariable = this.getSubBuildProperty( 'variable', nodeData.subBuilds );
1741
1782
 
1742
- let nodeVar = nodeData.variable;
1783
+ let nodeVar = nodeData[ subBuildVariable ];
1743
1784
 
1744
1785
  if ( nodeVar === undefined ) {
1745
1786
 
@@ -1758,6 +1799,14 @@ class NodeBuilder {
1758
1799
 
1759
1800
  //
1760
1801
 
1802
+ if ( subBuildVariable !== 'variable' ) {
1803
+
1804
+ name = this.getSubBuildProperty( name, nodeData.subBuilds );
1805
+
1806
+ }
1807
+
1808
+ //
1809
+
1761
1810
  const count = this.getArrayCount( node );
1762
1811
 
1763
1812
  nodeVar = new NodeVar( name, type, readOnly, count );
@@ -1770,7 +1819,7 @@ class NodeBuilder {
1770
1819
 
1771
1820
  this.registerDeclaration( nodeVar );
1772
1821
 
1773
- nodeData.variable = nodeVar;
1822
+ nodeData[ subBuildVariable ] = nodeVar;
1774
1823
 
1775
1824
  }
1776
1825
 
@@ -1831,13 +1880,16 @@ class NodeBuilder {
1831
1880
  * @param {(VaryingNode|PropertyNode)} node - The varying node.
1832
1881
  * @param {?string} name - The varying's name.
1833
1882
  * @param {string} [type=node.getNodeType( this )] - The varying's type.
1883
+ * @param {?string} interpolationType - The interpolation type of the varying.
1884
+ * @param {?string} interpolationSampling - The interpolation sampling type of the varying.
1834
1885
  * @return {NodeVar} The node varying.
1835
1886
  */
1836
- getVaryingFromNode( node, name = null, type = node.getNodeType( this ) ) {
1887
+ getVaryingFromNode( node, name = null, type = node.getNodeType( this ), interpolationType = null, interpolationSampling = null ) {
1837
1888
 
1838
1889
  const nodeData = this.getDataFromNode( node, 'any' );
1890
+ const subBuildVarying = this.getSubBuildProperty( 'varying', nodeData.subBuilds );
1839
1891
 
1840
- let nodeVarying = nodeData.varying;
1892
+ let nodeVarying = nodeData[ subBuildVarying ];
1841
1893
 
1842
1894
  if ( nodeVarying === undefined ) {
1843
1895
 
@@ -1846,13 +1898,23 @@ class NodeBuilder {
1846
1898
 
1847
1899
  if ( name === null ) name = 'nodeVarying' + index;
1848
1900
 
1849
- nodeVarying = new NodeVarying( name, type );
1901
+ //
1902
+
1903
+ if ( subBuildVarying !== 'varying' ) {
1904
+
1905
+ name = this.getSubBuildProperty( name, nodeData.subBuilds );
1906
+
1907
+ }
1908
+
1909
+ //
1910
+
1911
+ nodeVarying = new NodeVarying( name, type, interpolationType, interpolationSampling );
1850
1912
 
1851
1913
  varyings.push( nodeVarying );
1852
1914
 
1853
1915
  this.registerDeclaration( nodeVarying );
1854
1916
 
1855
- nodeData.varying = nodeVarying;
1917
+ nodeData[ subBuildVarying ] = nodeVarying;
1856
1918
 
1857
1919
  }
1858
1920
 
@@ -1883,8 +1945,6 @@ class NodeBuilder {
1883
1945
 
1884
1946
  }
1885
1947
 
1886
- declarations[ name ] = node;
1887
-
1888
1948
  if ( index > 1 ) {
1889
1949
 
1890
1950
  node.name = name;
@@ -1893,6 +1953,8 @@ class NodeBuilder {
1893
1953
 
1894
1954
  }
1895
1955
 
1956
+ declarations[ name ] = node;
1957
+
1896
1958
  }
1897
1959
 
1898
1960
  /**
@@ -2281,27 +2343,53 @@ class NodeBuilder {
2281
2343
  * @param {Node} node - The node to execute.
2282
2344
  * @param {?string} output - Expected output type. For example 'vec3'.
2283
2345
  * @param {?string} propertyName - The property name to assign the result.
2284
- * @return {Object}
2346
+ * @return {Object|Node|null} The code flow or node.build() result.
2285
2347
  */
2286
2348
  flowNodeFromShaderStage( shaderStage, node, output = null, propertyName = null ) {
2287
2349
 
2350
+ const previousTab = this.tab;
2351
+ const previousCache = this.cache;
2288
2352
  const previousShaderStage = this.shaderStage;
2353
+ const previousContext = this.context;
2289
2354
 
2290
2355
  this.setShaderStage( shaderStage );
2291
2356
 
2292
- const flowData = this.flowChildNode( node, output );
2357
+ const context = { ...this.context };
2358
+ delete context.nodeBlock;
2293
2359
 
2294
- if ( propertyName !== null ) {
2360
+ this.cache = this.globalCache;
2361
+ this.tab = '\t';
2362
+ this.context = context;
2295
2363
 
2296
- flowData.code += `${ this.tab + propertyName } = ${ flowData.result };\n`;
2364
+ let result = null;
2297
2365
 
2298
- }
2366
+ if ( this.buildStage === 'generate' ) {
2367
+
2368
+ const flowData = this.flowChildNode( node, output );
2299
2369
 
2300
- this.flowCode[ shaderStage ] = this.flowCode[ shaderStage ] + flowData.code;
2370
+ if ( propertyName !== null ) {
2371
+
2372
+ flowData.code += `${ this.tab + propertyName } = ${ flowData.result };\n`;
2373
+
2374
+ }
2375
+
2376
+ this.flowCode[ shaderStage ] = this.flowCode[ shaderStage ] + flowData.code;
2377
+
2378
+ result = flowData;
2379
+
2380
+ } else {
2381
+
2382
+ result = node.build( this );
2383
+
2384
+ }
2301
2385
 
2302
2386
  this.setShaderStage( previousShaderStage );
2303
2387
 
2304
- return flowData;
2388
+ this.cache = previousCache;
2389
+ this.tab = previousTab;
2390
+ this.context = previousContext;
2391
+
2392
+ return result;
2305
2393
 
2306
2394
  }
2307
2395
 
@@ -2487,6 +2575,145 @@ class NodeBuilder {
2487
2575
 
2488
2576
  }
2489
2577
 
2578
+ /**
2579
+ * Returns the current sub-build layer.
2580
+ *
2581
+ * @return {SubBuildNode} The current sub-build layers.
2582
+ */
2583
+ get subBuild() {
2584
+
2585
+ return this.subBuildLayers[ this.subBuildLayers.length - 1 ] || null;
2586
+
2587
+ }
2588
+
2589
+ /**
2590
+ * Adds a sub-build layer to the node builder.
2591
+ *
2592
+ * @param {SubBuildNode} subBuild - The sub-build layer to add.
2593
+ */
2594
+ addSubBuild( subBuild ) {
2595
+
2596
+ this.subBuildLayers.push( subBuild );
2597
+
2598
+ }
2599
+
2600
+ /**
2601
+ * Removes the last sub-build layer from the node builder.
2602
+ *
2603
+ * @return {SubBuildNode} The removed sub-build layer.
2604
+ */
2605
+ removeSubBuild() {
2606
+
2607
+ return this.subBuildLayers.pop();
2608
+
2609
+ }
2610
+
2611
+ /**
2612
+ * Returns the closest sub-build layer for the given data.
2613
+ *
2614
+ * @param {Node|Set|Array} data - The data to get the closest sub-build layer from.
2615
+ * @return {?string} The closest sub-build name or null if none found.
2616
+ */
2617
+ getClosestSubBuild( data ) {
2618
+
2619
+ let subBuilds;
2620
+
2621
+ if ( data && data.isNode ) {
2622
+
2623
+ if ( data.isShaderCallNodeInternal ) {
2624
+
2625
+ subBuilds = data.shaderNode.subBuilds;
2626
+
2627
+ } else if ( data.isStackNode ) {
2628
+
2629
+ subBuilds = [ data.subBuild ];
2630
+
2631
+ } else {
2632
+
2633
+ subBuilds = this.getDataFromNode( data, 'any' ).subBuilds;
2634
+
2635
+ }
2636
+
2637
+ } else if ( data instanceof Set ) {
2638
+
2639
+ subBuilds = [ ...data ];
2640
+
2641
+ } else {
2642
+
2643
+ subBuilds = data;
2644
+
2645
+ }
2646
+
2647
+ if ( ! subBuilds ) return null;
2648
+
2649
+ const subBuildLayers = this.subBuildLayers;
2650
+
2651
+ for ( let i = subBuilds.length - 1; i >= 0; i -- ) {
2652
+
2653
+ const subBuild = subBuilds[ i ];
2654
+
2655
+ if ( subBuildLayers.includes( subBuild ) ) {
2656
+
2657
+ return subBuild;
2658
+
2659
+ }
2660
+
2661
+ }
2662
+
2663
+ return null;
2664
+
2665
+ }
2666
+
2667
+
2668
+ /**
2669
+ * Returns the output node of a sub-build layer.
2670
+ *
2671
+ * @param {Node} node - The node to get the output from.
2672
+ * @return {string} The output node name.
2673
+ */
2674
+ getSubBuildOutput( node ) {
2675
+
2676
+ return this.getSubBuildProperty( 'outputNode', node );
2677
+
2678
+ }
2679
+
2680
+ /**
2681
+ * Returns the sub-build property name for the given property and node.
2682
+ *
2683
+ * @param {string} [property=''] - The property name.
2684
+ * @param {?Node} [node=null] - The node to get the sub-build from.
2685
+ * @return {string} The sub-build property name.
2686
+ */
2687
+ getSubBuildProperty( property = '', node = null ) {
2688
+
2689
+ let subBuild;
2690
+
2691
+ if ( node !== null ) {
2692
+
2693
+ subBuild = this.getClosestSubBuild( node );
2694
+
2695
+ } else {
2696
+
2697
+ subBuild = this.subBuildFn;
2698
+
2699
+ }
2700
+
2701
+ let result;
2702
+
2703
+ if ( subBuild ) {
2704
+
2705
+ result = property ? ( subBuild + '_' + property ) : subBuild;
2706
+
2707
+ } else {
2708
+
2709
+ result = property;
2710
+
2711
+ }
2712
+
2713
+ return result;
2714
+
2715
+ }
2716
+
2490
2717
  /**
2491
2718
  * Central build method which controls the build for the given object.
2492
2719
  *
@@ -2649,7 +2876,9 @@ class NodeBuilder {
2649
2876
 
2650
2877
  if ( fromTypeLength > toTypeLength ) {
2651
2878
 
2652
- return this.format( `${ snippet }.${ 'xyz'.slice( 0, toTypeLength ) }`, this.getTypeFromLength( toTypeLength, this.getComponentType( fromType ) ), toType );
2879
+ snippet = toType === 'bool' ? `all( ${ snippet } )` : `${ snippet }.${ 'xyz'.slice( 0, toTypeLength ) }`;
2880
+
2881
+ return this.format( snippet, this.getTypeFromLength( toTypeLength, this.getComponentType( fromType ) ), toType );
2653
2882
 
2654
2883
  }
2655
2884
 
@@ -2689,20 +2918,10 @@ class NodeBuilder {
2689
2918
 
2690
2919
  }
2691
2920
 
2692
- // Deprecated
2693
-
2694
2921
  /**
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}
2922
+ * Prevents the node builder from being used as an iterable in TSL.Fn(), avoiding potential runtime errors.
2700
2923
  */
2701
- createNodeMaterial( type = 'NodeMaterial' ) { // @deprecated, r168
2702
-
2703
- throw new Error( `THREE.NodeBuilder: createNodeMaterial() was deprecated. Use new ${ type }() instead.` );
2704
-
2705
- }
2924
+ *[ Symbol.iterator ]() { }
2706
2925
 
2707
2926
  }
2708
2927
 
@@ -236,6 +236,48 @@ export function getLengthFromType( type ) {
236
236
 
237
237
  }
238
238
 
239
+ /**
240
+ * Returns the gpu memory length for the given data type.
241
+ *
242
+ * @method
243
+ * @param {string} type - The data type.
244
+ * @return {number} The length.
245
+ */
246
+ export function getMemoryLengthFromType( type ) {
247
+
248
+ if ( /float|int|uint/.test( type ) ) return 1;
249
+ if ( /vec2/.test( type ) ) return 2;
250
+ if ( /vec3/.test( type ) ) return 3;
251
+ if ( /vec4/.test( type ) ) return 4;
252
+ if ( /mat2/.test( type ) ) return 4;
253
+ if ( /mat3/.test( type ) ) return 12;
254
+ if ( /mat4/.test( type ) ) return 16;
255
+
256
+ console.error( 'THREE.TSL: Unsupported type:', type );
257
+
258
+ }
259
+
260
+ /**
261
+ * Returns the byte boundary for the given data type.
262
+ *
263
+ * @method
264
+ * @param {string} type - The data type.
265
+ * @return {number} The byte boundary.
266
+ */
267
+ export function getByteBoundaryFromType( type ) {
268
+
269
+ if ( /float|int|uint/.test( type ) ) return 4;
270
+ if ( /vec2/.test( type ) ) return 8;
271
+ if ( /vec3/.test( type ) ) return 16;
272
+ if ( /vec4/.test( type ) ) return 16;
273
+ if ( /mat2/.test( type ) ) return 8;
274
+ if ( /mat3/.test( type ) ) return 48;
275
+ if ( /mat4/.test( type ) ) return 64;
276
+
277
+ console.error( 'THREE.TSL: Unsupported type:', type );
278
+
279
+ }
280
+
239
281
  /**
240
282
  * Returns the data type for the given value.
241
283
  *
@@ -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;