super-three 0.175.0 → 0.177.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 (477) hide show
  1. package/README.md +3 -3
  2. package/build/three.cjs +7631 -6743
  3. package/build/three.core.js +7496 -6758
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +172 -22
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +14 -6
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +3948 -1678
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +3941 -1678
  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 -0
  17. package/examples/jsm/capabilities/WebGPU.js +1 -0
  18. package/examples/jsm/controls/ArcballControls.js +14 -3
  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 +1 -0
  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 +1 -0
  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 +5 -4
  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 +24 -22
  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 +58 -1
  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 +5 -6
  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/GLSLDecoder.js +1 -2
  274. package/examples/jsm/transpiler/TSLEncoder.js +52 -8
  275. package/examples/jsm/transpiler/Transpiler.js +2 -0
  276. package/examples/jsm/tsl/display/AfterImageNode.js +2 -3
  277. package/examples/jsm/tsl/display/AnaglyphPassNode.js +1 -0
  278. package/examples/jsm/tsl/display/AnamorphicNode.js +5 -4
  279. package/examples/jsm/tsl/display/BloomNode.js +1 -0
  280. package/examples/jsm/tsl/display/DenoiseNode.js +33 -33
  281. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -0
  282. package/examples/jsm/tsl/display/DotScreenNode.js +1 -0
  283. package/examples/jsm/tsl/display/FXAANode.js +3 -2
  284. package/examples/jsm/tsl/display/FilmNode.js +1 -0
  285. package/examples/jsm/tsl/display/GTAONode.js +1 -0
  286. package/examples/jsm/tsl/display/GaussianBlurNode.js +2 -27
  287. package/examples/jsm/tsl/display/LensflareNode.js +1 -0
  288. package/examples/jsm/tsl/display/Lut3DNode.js +1 -0
  289. package/examples/jsm/tsl/display/OutlineNode.js +1 -0
  290. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +1 -0
  291. package/examples/jsm/tsl/display/PixelationPassNode.js +1 -0
  292. package/examples/jsm/tsl/display/RGBShiftNode.js +1 -0
  293. package/examples/jsm/tsl/display/SMAANode.js +9 -8
  294. package/examples/jsm/tsl/display/SSAAPassNode.js +3 -2
  295. package/examples/jsm/tsl/display/SSRNode.js +1 -0
  296. package/examples/jsm/tsl/display/SobelOperatorNode.js +1 -0
  297. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -0
  298. package/examples/jsm/tsl/display/StereoPassNode.js +1 -0
  299. package/examples/jsm/tsl/display/TRAAPassNode.js +5 -4
  300. package/examples/jsm/tsl/display/TransitionNode.js +1 -0
  301. package/examples/jsm/tsl/display/hashBlur.js +28 -6
  302. package/examples/jsm/tsl/lighting/TiledLightsNode.js +4 -3
  303. package/examples/jsm/tsl/math/Bayer.js +4 -1
  304. package/examples/jsm/tsl/shadows/TileShadowNode.js +456 -0
  305. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +212 -0
  306. package/examples/jsm/tsl/utils/Raymarching.js +6 -3
  307. package/examples/jsm/utils/BufferGeometryUtils.js +4 -1
  308. package/examples/jsm/utils/CameraUtils.js +4 -1
  309. package/examples/jsm/utils/GeometryCompressionUtils.js +4 -1
  310. package/examples/jsm/utils/GeometryUtils.js +4 -1
  311. package/examples/jsm/utils/LDrawUtils.js +2 -0
  312. package/examples/jsm/utils/SceneOptimizer.js +2 -0
  313. package/examples/jsm/utils/SceneUtils.js +4 -1
  314. package/examples/jsm/utils/ShadowMapViewer.js +2 -0
  315. package/examples/jsm/utils/ShadowMapViewerGPU.js +2 -0
  316. package/examples/jsm/utils/SkeletonUtils.js +4 -1
  317. package/examples/jsm/utils/SortUtils.js +4 -1
  318. package/examples/jsm/utils/UVsDebug.js +4 -1
  319. package/examples/jsm/utils/WebGLTextureUtils.js +4 -1
  320. package/examples/jsm/utils/WebGPUTextureUtils.js +4 -1
  321. package/examples/jsm/utils/WorkerPool.js +2 -0
  322. package/examples/jsm/webxr/ARButton.js +1 -0
  323. package/examples/jsm/webxr/OculusHandModel.js +1 -0
  324. package/examples/jsm/webxr/OculusHandPointerModel.js +1 -0
  325. package/examples/jsm/webxr/Text2D.js +4 -1
  326. package/examples/jsm/webxr/VRButton.js +1 -0
  327. package/examples/jsm/webxr/XRButton.js +1 -0
  328. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -0
  329. package/examples/jsm/webxr/XREstimatedLight.js +1 -0
  330. package/examples/jsm/webxr/XRHandMeshModel.js +2 -0
  331. package/examples/jsm/webxr/XRHandModelFactory.js +2 -0
  332. package/examples/jsm/webxr/XRHandPrimitiveModel.js +2 -0
  333. package/examples/jsm/webxr/XRPlanes.js +1 -0
  334. package/package.json +6 -4
  335. package/src/Three.Core.js +1 -1
  336. package/src/Three.TSL.js +13 -5
  337. package/src/Three.WebGPU.Nodes.js +1 -0
  338. package/src/Three.WebGPU.js +1 -0
  339. package/src/audio/AudioListener.js +13 -10
  340. package/src/cameras/ArrayCamera.js +9 -1
  341. package/src/constants.js +47 -20
  342. package/src/core/BufferAttribute.js +1 -1
  343. package/src/core/BufferGeometry.js +2 -5
  344. package/src/core/Object3D.js +22 -21
  345. package/src/core/RenderTarget.js +65 -21
  346. package/src/core/RenderTarget3D.js +1 -0
  347. package/src/extras/TextureUtils.js +1 -5
  348. package/src/extras/core/Curve.js +1 -1
  349. package/src/geometries/CapsuleGeometry.js +167 -17
  350. package/src/geometries/ExtrudeGeometry.js +39 -29
  351. package/src/helpers/ArrowHelper.js +2 -2
  352. package/src/helpers/SkeletonHelper.js +1 -1
  353. package/src/lights/LightShadow.js +14 -0
  354. package/src/lights/SpotLightShadow.js +9 -1
  355. package/src/lights/webgpu/ProjectorLight.js +46 -0
  356. package/src/loaders/BufferGeometryLoader.js +1 -10
  357. package/src/loaders/ImageBitmapLoader.js +21 -5
  358. package/src/loaders/ObjectLoader.js +44 -16
  359. package/src/loaders/nodes/NodeObjectLoader.js +2 -2
  360. package/src/materials/Material.js +1 -7
  361. package/src/materials/nodes/NodeMaterial.js +81 -18
  362. package/src/materials/nodes/manager/NodeMaterialObserver.js +20 -2
  363. package/src/math/Box3.js +28 -0
  364. package/src/math/Color.js +7 -7
  365. package/src/math/ColorManagement.js +22 -3
  366. package/src/math/FrustumArray.js +253 -0
  367. package/src/math/Ray.js +2 -0
  368. package/src/math/Sphere.js +28 -0
  369. package/src/nodes/Nodes.js +1 -0
  370. package/src/nodes/TSL.js +1 -0
  371. package/src/nodes/accessors/Bitangent.js +31 -9
  372. package/src/nodes/accessors/Camera.js +31 -4
  373. package/src/nodes/accessors/CubeTextureNode.js +50 -2
  374. package/src/nodes/accessors/InstanceNode.js +5 -4
  375. package/src/nodes/accessors/Lights.js +2 -2
  376. package/src/nodes/accessors/MaterialNode.js +4 -0
  377. package/src/nodes/accessors/ModelNode.js +1 -1
  378. package/src/nodes/accessors/Normal.js +26 -6
  379. package/src/nodes/accessors/Object3DNode.js +6 -7
  380. package/src/nodes/accessors/Position.js +14 -4
  381. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  382. package/src/nodes/accessors/ReferenceNode.js +1 -1
  383. package/src/nodes/accessors/SkinningNode.js +3 -2
  384. package/src/nodes/accessors/StorageBufferNode.js +25 -0
  385. package/src/nodes/accessors/StorageTextureNode.js +14 -3
  386. package/src/nodes/accessors/TextureNode.js +59 -8
  387. package/src/nodes/accessors/VelocityNode.js +1 -0
  388. package/src/nodes/accessors/VertexColorNode.js +4 -4
  389. package/src/nodes/code/CodeNode.js +8 -11
  390. package/src/nodes/core/AssignNode.js +27 -5
  391. package/src/nodes/core/AttributeNode.js +2 -2
  392. package/src/nodes/core/CacheNode.js +14 -0
  393. package/src/nodes/core/ContextNode.js +7 -3
  394. package/src/nodes/core/Node.js +68 -19
  395. package/src/nodes/core/NodeBuilder.js +100 -12
  396. package/src/nodes/core/NodeUtils.js +42 -0
  397. package/src/nodes/core/NodeVarying.js +19 -1
  398. package/src/nodes/core/PropertyNode.js +8 -12
  399. package/src/nodes/core/StackNode.js +127 -2
  400. package/src/nodes/core/StructTypeNode.js +26 -4
  401. package/src/nodes/core/VarNode.js +11 -2
  402. package/src/nodes/core/VaryingNode.js +40 -21
  403. package/src/nodes/display/BlendModes.js +42 -1
  404. package/src/nodes/display/ColorSpaceNode.js +4 -27
  405. package/src/nodes/display/PassNode.js +8 -11
  406. package/src/nodes/functions/ShadowMaskModel.js +5 -1
  407. package/src/nodes/functions/material/getParallaxCorrectNormal.js +1 -1
  408. package/src/nodes/gpgpu/AtomicFunctionNode.js +28 -10
  409. package/src/nodes/gpgpu/BarrierNode.js +3 -3
  410. package/src/nodes/gpgpu/ComputeNode.js +1 -1
  411. package/src/nodes/lighting/AnalyticLightNode.js +7 -13
  412. package/src/nodes/lighting/HemisphereLightNode.js +2 -2
  413. package/src/nodes/lighting/IESSpotLightNode.js +2 -1
  414. package/src/nodes/lighting/LightsNode.js +25 -7
  415. package/src/nodes/lighting/ProjectorLightNode.js +78 -0
  416. package/src/nodes/lighting/ShadowBaseNode.js +1 -12
  417. package/src/nodes/lighting/ShadowFilterNode.js +274 -0
  418. package/src/nodes/lighting/ShadowNode.js +172 -240
  419. package/src/nodes/lighting/SpotLightNode.js +44 -7
  420. package/src/nodes/materialx/lib/mx_noise.js +1 -1
  421. package/src/nodes/math/MathNode.js +56 -20
  422. package/src/nodes/math/OperatorNode.js +109 -82
  423. package/src/nodes/shapes/Shapes.js +5 -4
  424. package/src/nodes/tsl/TSLCore.js +140 -49
  425. package/src/nodes/utils/DebugNode.js +15 -3
  426. package/src/nodes/utils/Discard.js +2 -2
  427. package/src/nodes/utils/LoopNode.js +64 -17
  428. package/src/nodes/utils/ReflectorNode.js +67 -4
  429. package/src/objects/BatchedMesh.js +16 -4
  430. package/src/objects/Mesh.js +9 -0
  431. package/src/objects/Skeleton.js +1 -1
  432. package/src/objects/Sprite.js +9 -0
  433. package/src/renderers/WebGL3DRenderTarget.js +1 -0
  434. package/src/renderers/WebGLArrayRenderTarget.js +1 -0
  435. package/src/renderers/WebGLCubeRenderTarget.js +2 -4
  436. package/src/renderers/WebGLRenderer.js +21 -10
  437. package/src/renderers/common/Animation.js +2 -2
  438. package/src/renderers/common/Background.js +11 -0
  439. package/src/renderers/common/RenderList.js +0 -4
  440. package/src/renderers/common/RenderObject.js +12 -1
  441. package/src/renderers/common/Renderer.js +116 -8
  442. package/src/renderers/common/Textures.js +15 -21
  443. package/src/renderers/common/TimestampQueryPool.js +1 -0
  444. package/src/renderers/common/Uniform.js +1 -1
  445. package/src/renderers/common/UniformsGroup.js +14 -18
  446. package/src/renderers/common/XRManager.js +154 -25
  447. package/src/renderers/common/extras/PMREMGenerator.js +29 -22
  448. package/src/renderers/common/nodes/Nodes.js +13 -3
  449. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +1 -1
  450. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
  451. package/src/renderers/webgl/WebGLShadowMap.js +3 -2
  452. package/src/renderers/webgl/WebGLTextures.js +143 -4
  453. package/src/renderers/webgl/WebGLUtils.js +1 -3
  454. package/src/renderers/webgl-fallback/WebGLBackend.js +170 -34
  455. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +75 -7
  456. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +1 -0
  457. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +42 -29
  458. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +22 -21
  459. package/src/renderers/webgpu/WebGPUBackend.js +442 -127
  460. package/src/renderers/webgpu/WebGPURenderer.js +7 -0
  461. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +4 -1
  462. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +4 -1
  463. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +75 -27
  464. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +3 -0
  465. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -1
  466. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +18 -5
  467. package/src/renderers/webgpu/utils/WebGPUConstants.js +1 -1
  468. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +34 -4
  469. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +44 -49
  470. package/src/renderers/webxr/WebXRController.js +1 -1
  471. package/src/renderers/webxr/WebXRManager.js +2 -1
  472. package/src/textures/DepthTexture.js +6 -10
  473. package/src/textures/Source.js +22 -0
  474. package/src/textures/Texture.js +118 -1
  475. package/src/textures/VideoTexture.js +1 -1
  476. package/examples/jsm/effects/PeppersGhostEffect.js +0 -172
  477. package/src/core/RenderTargetArray.js +0 -40
@@ -9,6 +9,10 @@ import { NodeUpdateType } from '../core/constants.js';
9
9
 
10
10
  import { IntType, NearestFilter, UnsignedIntType } from '../../constants.js';
11
11
 
12
+ import { Texture } from '../../textures/Texture.js';
13
+
14
+ const EmptyTexture = /*@__PURE__*/ new Texture();
15
+
12
16
  /**
13
17
  * This type of uniform node represents a 2D texture.
14
18
  *
@@ -25,12 +29,12 @@ class TextureNode extends UniformNode {
25
29
  /**
26
30
  * Constructs a new texture node.
27
31
  *
28
- * @param {Texture} value - The texture.
32
+ * @param {Texture} [value=EmptyTexture] - The texture.
29
33
  * @param {?Node<vec2|vec3>} [uvNode=null] - The uv node.
30
34
  * @param {?Node<int>} [levelNode=null] - The level node.
31
35
  * @param {?Node<float>} [biasNode=null] - The bias node.
32
36
  */
33
- constructor( value, uvNode = null, levelNode = null, biasNode = null ) {
37
+ constructor( value = EmptyTexture, uvNode = null, levelNode = null, biasNode = null ) {
34
38
 
35
39
  super( value );
36
40
 
@@ -266,7 +270,7 @@ class TextureNode extends UniformNode {
266
270
  setUpdateMatrix( value ) {
267
271
 
268
272
  this.updateMatrix = value;
269
- this.updateType = value ? NodeUpdateType.RENDER : NodeUpdateType.NONE;
273
+ this.updateType = value ? NodeUpdateType.OBJECT : NodeUpdateType.NONE;
270
274
 
271
275
  return this;
272
276
 
@@ -328,7 +332,7 @@ class TextureNode extends UniformNode {
328
332
 
329
333
  if ( ( uvNode === null || builder.context.forceUVContext === true ) && builder.context.getUV ) {
330
334
 
331
- uvNode = builder.context.getUV( this );
335
+ uvNode = builder.context.getUV( this, builder );
332
336
 
333
337
  }
334
338
 
@@ -564,7 +568,7 @@ class TextureNode extends UniformNode {
564
568
 
565
569
  const map = textureNode.value;
566
570
 
567
- if ( map && map.generateMipmaps === false || map.minFilter === NearestFilter || map.magFilter === NearestFilter ) {
571
+ if ( textureNode.generateMipmaps === false && ( map && map.generateMipmaps === false || map.minFilter === NearestFilter || map.magFilter === NearestFilter ) ) {
568
572
 
569
573
  console.warn( 'THREE.TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture.' );
570
574
 
@@ -720,6 +724,9 @@ class TextureNode extends UniformNode {
720
724
 
721
725
  const newNode = new this.constructor( this.value, this.uvNode, this.levelNode, this.biasNode );
722
726
  newNode.sampler = this.sampler;
727
+ newNode.depthNode = this.depthNode;
728
+ newNode.compareNode = this.compareNode;
729
+ newNode.gradNode = this.gradNode;
723
730
 
724
731
  return newNode;
725
732
 
@@ -734,20 +741,64 @@ export default TextureNode;
734
741
  *
735
742
  * @tsl
736
743
  * @function
737
- * @param {Texture} value - The texture.
744
+ * @param {?Texture} value - The texture.
738
745
  * @param {?Node<vec2|vec3>} [uvNode=null] - The uv node.
739
746
  * @param {?Node<int>} [levelNode=null] - The level node.
740
747
  * @param {?Node<float>} [biasNode=null] - The bias node.
741
748
  * @returns {TextureNode}
742
749
  */
743
- export const texture = /*@__PURE__*/ nodeProxy( TextureNode ).setParameterLength( 1, 4 );
750
+ const textureBase = /*@__PURE__*/ nodeProxy( TextureNode ).setParameterLength( 1, 4 ).setName( 'texture' );
751
+
752
+ /**
753
+ * TSL function for creating a texture node or sample a texture node already existing.
754
+ *
755
+ * @tsl
756
+ * @function
757
+ * @param {?Texture|TextureNode} [value=EmptyTexture] - The texture.
758
+ * @param {?Node<vec2|vec3>} [uvNode=null] - The uv node.
759
+ * @param {?Node<int>} [levelNode=null] - The level node.
760
+ * @param {?Node<float>} [biasNode=null] - The bias node.
761
+ * @returns {TextureNode}
762
+ */
763
+ export const texture = ( value = EmptyTexture, uvNode = null, levelNode = null, biasNode = null ) => {
764
+
765
+ let textureNode;
766
+
767
+ if ( value && value.isTextureNode === true ) {
768
+
769
+ textureNode = nodeObject( value.clone() );
770
+ textureNode.referenceNode = value.getSelf(); // Ensure the reference is set to the original node
771
+
772
+ if ( uvNode !== null ) textureNode.uvNode = nodeObject( uvNode );
773
+ if ( levelNode !== null ) textureNode.levelNode = nodeObject( levelNode );
774
+ if ( biasNode !== null ) textureNode.biasNode = nodeObject( biasNode );
775
+
776
+ } else {
777
+
778
+ textureNode = textureBase( value, uvNode, levelNode, biasNode );
779
+
780
+ }
781
+
782
+ return textureNode;
783
+
784
+ };
785
+
786
+ /**
787
+ * TSL function for creating a uniform texture node.
788
+ *
789
+ * @tsl
790
+ * @function
791
+ * @param {?Texture} value - The texture.
792
+ * @returns {TextureNode}
793
+ */
794
+ export const uniformTexture = ( value = EmptyTexture ) => texture( value );
744
795
 
745
796
  /**
746
797
  * TSL function for creating a texture node that fetches/loads texels without interpolation.
747
798
  *
748
799
  * @tsl
749
800
  * @function
750
- * @param {Texture} value - The texture.
801
+ * @param {?Texture|TextureNode} [value=EmptyTexture] - The texture.
751
802
  * @param {?Node<vec2|vec3>} [uvNode=null] - The uv node.
752
803
  * @param {?Node<int>} [levelNode=null] - The level node.
753
804
  * @param {?Node<float>} [biasNode=null] - The bias node.
@@ -205,6 +205,7 @@ function getPreviousMatrix( object, index = 0 ) {
205
205
  if ( matrix === undefined ) {
206
206
 
207
207
  objectData[ index ] = matrix = new Matrix4();
208
+ objectData[ index ].copy( object.matrixWorld );
208
209
 
209
210
  }
210
211
 
@@ -18,9 +18,9 @@ class VertexColorNode extends AttributeNode {
18
18
  /**
19
19
  * Constructs a new vertex color node.
20
20
  *
21
- * @param {number} [index=0] - The attribute index.
21
+ * @param {number} index - The attribute index.
22
22
  */
23
- constructor( index = 0 ) {
23
+ constructor( index ) {
24
24
 
25
25
  super( null, 'vec4' );
26
26
 
@@ -104,7 +104,7 @@ export default VertexColorNode;
104
104
  *
105
105
  * @tsl
106
106
  * @function
107
- * @param {number} index - The attribute index.
107
+ * @param {number} [index=0] - The attribute index.
108
108
  * @returns {VertexColorNode}
109
109
  */
110
- export const vertexColor = ( index ) => nodeObject( new VertexColorNode( index ) );
110
+ export const vertexColor = ( index = 0 ) => nodeObject( new VertexColorNode( index ) );
@@ -36,6 +36,14 @@ class CodeNode extends Node {
36
36
  */
37
37
  this.isCodeNode = true;
38
38
 
39
+ /**
40
+ * This flag is used for global cache.
41
+ *
42
+ * @type {boolean}
43
+ * @default true
44
+ */
45
+ this.global = true;
46
+
39
47
  /**
40
48
  * The native code.
41
49
  *
@@ -62,17 +70,6 @@ class CodeNode extends Node {
62
70
 
63
71
  }
64
72
 
65
- /**
66
- * The method is overwritten so it always returns `true`.
67
- *
68
- * @return {boolean} Whether this node is global or not.
69
- */
70
- isGlobal() {
71
-
72
- return true;
73
-
74
- }
75
-
76
73
  /**
77
74
  * Sets the includes of this code node.
78
75
  *
@@ -40,6 +40,15 @@ class AssignNode extends TempNode {
40
40
  */
41
41
  this.sourceNode = sourceNode;
42
42
 
43
+ /**
44
+ * This flag can be used for type testing.
45
+ *
46
+ * @type {boolean}
47
+ * @readonly
48
+ * @default true
49
+ */
50
+ this.isAssignNode = true;
51
+
43
52
  }
44
53
 
45
54
  /**
@@ -84,15 +93,25 @@ class AssignNode extends TempNode {
84
93
 
85
94
  }
86
95
 
87
- generate( builder, output ) {
96
+ setup( builder ) {
88
97
 
89
98
  const { targetNode, sourceNode } = this;
90
99
 
100
+ const properties = builder.getNodeProperties( this );
101
+ properties.sourceNode = sourceNode;
102
+ properties.targetNode = targetNode.context( { assign: true } );
103
+
104
+ }
105
+
106
+ generate( builder, output ) {
107
+
108
+ const { targetNode, sourceNode } = builder.getNodeProperties( this );
109
+
91
110
  const needsSplitAssign = this.needsSplitAssign( builder );
92
111
 
93
112
  const targetType = targetNode.getNodeType( builder );
94
113
 
95
- const target = targetNode.context( { assign: true } ).build( builder );
114
+ const target = targetNode.build( builder );
96
115
  const source = sourceNode.build( builder, targetType );
97
116
 
98
117
  const sourceType = sourceNode.getNodeType( builder );
@@ -118,11 +137,14 @@ class AssignNode extends TempNode {
118
137
 
119
138
  builder.addLineFlowCode( `${ sourceProperty } = ${ source }`, this );
120
139
 
121
- const targetRoot = targetNode.node.context( { assign: true } ).build( builder );
140
+ const splitNode = targetNode.node;
141
+ const splitTargetNode = splitNode.node.context( { assign: true } );
142
+
143
+ const targetRoot = splitTargetNode.build( builder );
122
144
 
123
- for ( let i = 0; i < targetNode.components.length; i ++ ) {
145
+ for ( let i = 0; i < splitNode.components.length; i ++ ) {
124
146
 
125
- const component = targetNode.components[ i ];
147
+ const component = splitNode.components[ i ];
126
148
 
127
149
  builder.addLineFlowCode( `${ targetRoot }.${ component } = ${ sourceProperty }[ ${ i } ]`, this );
128
150
 
@@ -161,7 +161,7 @@ export default AttributeNode;
161
161
  * @tsl
162
162
  * @function
163
163
  * @param {string} name - The name of the attribute.
164
- * @param {string} [nodeType] - The node type.
164
+ * @param {?string} [nodeType=null] - The node type.
165
165
  * @returns {AttributeNode}
166
166
  */
167
- export const attribute = ( name, nodeType ) => nodeObject( new AttributeNode( name, nodeType ) );
167
+ export const attribute = ( name, nodeType = null ) => nodeObject( new AttributeNode( name, nodeType ) );
@@ -97,4 +97,18 @@ export default CacheNode;
97
97
  */
98
98
  export const cache = ( node, parent ) => nodeObject( new CacheNode( nodeObject( node ), parent ) );
99
99
 
100
+ /**
101
+ * Assigns a namespace to the given node by updating its context.
102
+ *
103
+ * Important for TSL functions that use `.once( namespace )` to ensure that the namespace will run twice,
104
+ * once when the node is build in the specific namespace and once when the node is built in the others namespace.
105
+ *
106
+ * This is useful for nodes like `positionWorld` that need to be re-updated if used in `material.positionNode` and outside of it in the same material.
107
+ *
108
+ * @param {Object} node - The node to which the namespace will be assigned.
109
+ * @param {string} namespace - The namespace to be assigned to the node.
110
+ * @returns {Object} The updated node with the new namespace in its context.
111
+ */
112
+ export const namespace = ( node, namespace ) => node.context( { namespace } );
113
+
100
114
  addMethodChaining( 'cache', cache );
@@ -80,8 +80,14 @@ class ContextNode extends Node {
80
80
 
81
81
  analyze( builder ) {
82
82
 
83
+ const previousContext = builder.getContext();
84
+
85
+ builder.setContext( { ...builder.context, ...this.value } );
86
+
83
87
  this.node.build( builder );
84
88
 
89
+ builder.setContext( previousContext );
90
+
85
91
  }
86
92
 
87
93
  setup( builder ) {
@@ -90,12 +96,10 @@ class ContextNode extends Node {
90
96
 
91
97
  builder.setContext( { ...builder.context, ...this.value } );
92
98
 
93
- const node = this.node.build( builder );
99
+ this.node.build( builder );
94
100
 
95
101
  builder.setContext( previousContext );
96
102
 
97
- return node;
98
-
99
103
  }
100
104
 
101
105
  generate( builder, output ) {
@@ -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
 
@@ -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
  }
@@ -1831,9 +1831,11 @@ class NodeBuilder {
1831
1831
  * @param {(VaryingNode|PropertyNode)} node - The varying node.
1832
1832
  * @param {?string} name - The varying's name.
1833
1833
  * @param {string} [type=node.getNodeType( this )] - The varying's type.
1834
+ * @param {?string} interpolationType - The interpolation type of the varying.
1835
+ * @param {?string} interpolationSampling - The interpolation sampling type of the varying.
1834
1836
  * @return {NodeVar} The node varying.
1835
1837
  */
1836
- getVaryingFromNode( node, name = null, type = node.getNodeType( this ) ) {
1838
+ getVaryingFromNode( node, name = null, type = node.getNodeType( this ), interpolationType = null, interpolationSampling = null ) {
1837
1839
 
1838
1840
  const nodeData = this.getDataFromNode( node, 'any' );
1839
1841
 
@@ -1846,7 +1848,7 @@ class NodeBuilder {
1846
1848
 
1847
1849
  if ( name === null ) name = 'nodeVarying' + index;
1848
1850
 
1849
- nodeVarying = new NodeVarying( name, type );
1851
+ nodeVarying = new NodeVarying( name, type, interpolationType, interpolationSampling );
1850
1852
 
1851
1853
  varyings.push( nodeVarying );
1852
1854
 
@@ -1860,6 +1862,58 @@ class NodeBuilder {
1860
1862
 
1861
1863
  }
1862
1864
 
1865
+ /**
1866
+ * Returns the current namespace for the node builder.
1867
+ *
1868
+ * @return {string} The current namespace.
1869
+ */
1870
+ get namespace() {
1871
+
1872
+ return this.context.namespace;
1873
+
1874
+ }
1875
+
1876
+ /**
1877
+ * Returns the output namespace for the node builder, which is used for the current output node.
1878
+ *
1879
+ * @return {string} The output namespace.
1880
+ */
1881
+ getOutputNamespace() {
1882
+
1883
+ return this.getNamespace( 'outputNode' );
1884
+
1885
+ }
1886
+
1887
+ /**
1888
+ * Returns the namespace for the given property.
1889
+ *
1890
+ * If the property name is not set, it returns the namespace only.
1891
+ * If the namespace is not set, it returns the property name.
1892
+ * If the namespace is set, it returns the namespace concatenated with the property name.
1893
+ *
1894
+ * @param {string} [property=''] - The property name.
1895
+ * @return {string} The namespace for the property.
1896
+ */
1897
+ getNamespace( property = '' ) {
1898
+
1899
+ const ns = this.namespace;
1900
+
1901
+ let nsName;
1902
+
1903
+ if ( ns ) {
1904
+
1905
+ nsName = property ? ( ns + '_' + property ) : ns;
1906
+
1907
+ } else {
1908
+
1909
+ nsName = property;
1910
+
1911
+ }
1912
+
1913
+ return nsName;
1914
+
1915
+ }
1916
+
1863
1917
  /**
1864
1918
  * Registers a node declaration in the current shader stage.
1865
1919
  *
@@ -1883,8 +1937,6 @@ class NodeBuilder {
1883
1937
 
1884
1938
  }
1885
1939
 
1886
- declarations[ name ] = node;
1887
-
1888
1940
  if ( index > 1 ) {
1889
1941
 
1890
1942
  node.name = name;
@@ -1893,6 +1945,8 @@ class NodeBuilder {
1893
1945
 
1894
1946
  }
1895
1947
 
1948
+ declarations[ name ] = node;
1949
+
1896
1950
  }
1897
1951
 
1898
1952
  /**
@@ -2281,27 +2335,53 @@ class NodeBuilder {
2281
2335
  * @param {Node} node - The node to execute.
2282
2336
  * @param {?string} output - Expected output type. For example 'vec3'.
2283
2337
  * @param {?string} propertyName - The property name to assign the result.
2284
- * @return {Object}
2338
+ * @return {Object|Node|null} The code flow or node.build() result.
2285
2339
  */
2286
2340
  flowNodeFromShaderStage( shaderStage, node, output = null, propertyName = null ) {
2287
2341
 
2342
+ const previousTab = this.tab;
2343
+ const previousCache = this.cache;
2288
2344
  const previousShaderStage = this.shaderStage;
2345
+ const previousContext = this.context;
2289
2346
 
2290
2347
  this.setShaderStage( shaderStage );
2291
2348
 
2292
- const flowData = this.flowChildNode( node, output );
2349
+ const context = { ...this.context };
2350
+ delete context.nodeBlock;
2293
2351
 
2294
- if ( propertyName !== null ) {
2352
+ this.cache = this.globalCache;
2353
+ this.tab = '\t';
2354
+ this.context = context;
2295
2355
 
2296
- flowData.code += `${ this.tab + propertyName } = ${ flowData.result };\n`;
2356
+ let result = null;
2297
2357
 
2298
- }
2358
+ if ( this.buildStage === 'generate' ) {
2359
+
2360
+ const flowData = this.flowChildNode( node, output );
2361
+
2362
+ if ( propertyName !== null ) {
2363
+
2364
+ flowData.code += `${ this.tab + propertyName } = ${ flowData.result };\n`;
2365
+
2366
+ }
2367
+
2368
+ this.flowCode[ shaderStage ] = this.flowCode[ shaderStage ] + flowData.code;
2369
+
2370
+ result = flowData;
2371
+
2372
+ } else {
2373
+
2374
+ result = node.build( this );
2299
2375
 
2300
- this.flowCode[ shaderStage ] = this.flowCode[ shaderStage ] + flowData.code;
2376
+ }
2301
2377
 
2302
2378
  this.setShaderStage( previousShaderStage );
2303
2379
 
2304
- return flowData;
2380
+ this.cache = previousCache;
2381
+ this.tab = previousTab;
2382
+ this.context = previousContext;
2383
+
2384
+ return result;
2305
2385
 
2306
2386
  }
2307
2387
 
@@ -2649,7 +2729,9 @@ class NodeBuilder {
2649
2729
 
2650
2730
  if ( fromTypeLength > toTypeLength ) {
2651
2731
 
2652
- return this.format( `${ snippet }.${ 'xyz'.slice( 0, toTypeLength ) }`, this.getTypeFromLength( toTypeLength, this.getComponentType( fromType ) ), toType );
2732
+ snippet = toType === 'bool' ? `all( ${ snippet } )` : `${ snippet }.${ 'xyz'.slice( 0, toTypeLength ) }`;
2733
+
2734
+ return this.format( snippet, this.getTypeFromLength( toTypeLength, this.getComponentType( fromType ) ), toType );
2653
2735
 
2654
2736
  }
2655
2737
 
@@ -2689,6 +2771,11 @@ class NodeBuilder {
2689
2771
 
2690
2772
  }
2691
2773
 
2774
+ /**
2775
+ * Prevents the node builder from being used as an iterable in TSL.Fn(), avoiding potential runtime errors.
2776
+ */
2777
+ *[ Symbol.iterator ]() { }
2778
+
2692
2779
  // Deprecated
2693
2780
 
2694
2781
  /**
@@ -2704,6 +2791,7 @@ class NodeBuilder {
2704
2791
 
2705
2792
  }
2706
2793
 
2794
+
2707
2795
  }
2708
2796
 
2709
2797
  export default NodeBuilder;