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
@@ -85,7 +85,7 @@ const shaderNodeHandler = {
85
85
 
86
86
  prop = parseSwizzleAndSort( prop.slice( 3 ).toLowerCase() );
87
87
 
88
- return ( value ) => nodeObject( new SetNode( node, prop, value ) );
88
+ return ( value ) => nodeObject( new SetNode( node, prop, nodeObject( value ) ) );
89
89
 
90
90
  } else if ( /^flip[XYZWRGBASTPQ]{1,4}$/.test( prop ) === true ) {
91
91
 
@@ -304,6 +304,8 @@ class ShaderCallNodeInternal extends Node {
304
304
  this.shaderNode = shaderNode;
305
305
  this.inputNodes = inputNodes;
306
306
 
307
+ this.isShaderCallNodeInternal = true;
308
+
307
309
  }
308
310
 
309
311
  getNodeType( builder ) {
@@ -323,7 +325,13 @@ class ShaderCallNodeInternal extends Node {
323
325
  const { shaderNode, inputNodes } = this;
324
326
 
325
327
  const properties = builder.getNodeProperties( shaderNode );
326
- if ( properties.onceOutput ) return properties.onceOutput;
328
+ const onceNS = shaderNode.namespace && shaderNode.namespace === builder.namespace ? builder.getNamespace( 'once' ) : 'once';
329
+
330
+ if ( properties[ onceNS ] ) {
331
+
332
+ return properties[ onceNS ];
333
+
334
+ }
327
335
 
328
336
  //
329
337
 
@@ -366,7 +374,7 @@ class ShaderCallNodeInternal extends Node {
366
374
 
367
375
  if ( shaderNode.once ) {
368
376
 
369
- properties.onceOutput = result;
377
+ properties[ onceNS ] = result;
370
378
 
371
379
  }
372
380
 
@@ -374,41 +382,63 @@ class ShaderCallNodeInternal extends Node {
374
382
 
375
383
  }
376
384
 
385
+ setupOutput( builder ) {
386
+
387
+ builder.addStack();
388
+
389
+ builder.stack.outputNode = this.call( builder );
390
+
391
+ return builder.removeStack();
392
+
393
+ }
394
+
377
395
  getOutputNode( builder ) {
378
396
 
379
397
  const properties = builder.getNodeProperties( this );
398
+ const outputNamespace = builder.getOutputNamespace();
380
399
 
381
- if ( properties.outputNode === null ) {
400
+ properties[ outputNamespace ] = properties[ outputNamespace ] || this.setupOutput( builder );
382
401
 
383
- properties.outputNode = this.setupOutput( builder );
402
+ return properties[ outputNamespace ];
384
403
 
385
- }
404
+ }
386
405
 
387
- return properties.outputNode;
406
+ build( builder, output = null ) {
388
407
 
389
- }
408
+ let result = null;
390
409
 
391
- setup( builder ) {
410
+ const buildStage = builder.getBuildStage();
411
+ const properties = builder.getNodeProperties( this );
392
412
 
393
- return this.getOutputNode( builder );
413
+ const outputNamespace = builder.getOutputNamespace();
414
+ const outputNode = this.getOutputNode( builder );
394
415
 
395
- }
416
+ if ( buildStage === 'setup' ) {
396
417
 
397
- setupOutput( builder ) {
418
+ const initializedNamespace = builder.getNamespace( 'initialized' );
398
419
 
399
- builder.addStack();
420
+ if ( properties[ initializedNamespace ] !== true ) {
400
421
 
401
- builder.stack.outputNode = this.call( builder );
422
+ properties[ initializedNamespace ] = true;
402
423
 
403
- return builder.removeStack();
424
+ properties[ outputNamespace ] = this.getOutputNode( builder );
425
+ properties[ outputNamespace ].build( builder );
404
426
 
405
- }
427
+ }
406
428
 
407
- generate( builder, output ) {
429
+ result = properties[ outputNamespace ];
408
430
 
409
- const outputNode = this.getOutputNode( builder );
431
+ } else if ( buildStage === 'analyze' ) {
432
+
433
+ outputNode.build( builder, output );
434
+
435
+ } else if ( buildStage === 'generate' ) {
410
436
 
411
- return outputNode.build( builder, output );
437
+ result = outputNode.build( builder, output ) || '';
438
+
439
+ }
440
+
441
+ return result;
412
442
 
413
443
  }
414
444
 
@@ -426,6 +456,7 @@ class ShaderNodeInternal extends Node {
426
456
  this.global = true;
427
457
 
428
458
  this.once = false;
459
+ this.namespace = null;
429
460
 
430
461
  }
431
462
 
@@ -598,7 +629,9 @@ export const Fn = ( jsFunc, layout = null ) => {
598
629
 
599
630
  nodeObjects( params );
600
631
 
601
- if ( params[ 0 ] && params[ 0 ].isNode ) {
632
+ const isArrayAsParameter = params[ 0 ] && ( params[ 0 ].isNode || Object.getPrototypeOf( params[ 0 ] ) !== Object.prototype );
633
+
634
+ if ( isArrayAsParameter ) {
602
635
 
603
636
  inputs = [ ...params ];
604
637
 
@@ -608,11 +641,19 @@ export const Fn = ( jsFunc, layout = null ) => {
608
641
 
609
642
  }
610
643
 
611
- return shaderNode.call( inputs );
644
+ const fnCall = shaderNode.call( inputs );
645
+
646
+ if ( nodeType === 'void' ) fnCall.toStack();
647
+
648
+ return fnCall;
612
649
 
613
650
  };
614
651
 
615
652
  fn.shaderNode = shaderNode;
653
+ fn.id = shaderNode.id;
654
+
655
+ fn.getNodeType = ( ...params ) => shaderNode.getNodeType( ...params );
656
+ fn.getCacheKey = ( ...params ) => shaderNode.getCacheKey( ...params );
616
657
 
617
658
  fn.setLayout = ( layout ) => {
618
659
 
@@ -622,9 +663,10 @@ export const Fn = ( jsFunc, layout = null ) => {
622
663
 
623
664
  };
624
665
 
625
- fn.once = () => {
666
+ fn.once = ( namespace = null ) => {
626
667
 
627
668
  shaderNode.once = true;
669
+ shaderNode.namespace = namespace;
628
670
 
629
671
  return fn;
630
672
 
@@ -663,31 +705,6 @@ export const Fn = ( jsFunc, layout = null ) => {
663
705
 
664
706
  };
665
707
 
666
- /**
667
- * @tsl
668
- * @function
669
- * @deprecated since r168. Use {@link Fn} instead.
670
- *
671
- * @param {...any} params
672
- * @returns {Function}
673
- */
674
- export const tslFn = ( ...params ) => { // @deprecated, r168
675
-
676
- console.warn( 'THREE.TSL: tslFn() has been renamed to Fn().' );
677
- return Fn( ...params );
678
-
679
- };
680
-
681
- //
682
-
683
- addMethodChaining( 'toGlobal', ( node ) => {
684
-
685
- node.global = true;
686
-
687
- return node;
688
-
689
- } );
690
-
691
708
  //
692
709
 
693
710
  export const setCurrentStack = ( stack ) => {
@@ -704,9 +721,44 @@ export const setCurrentStack = ( stack ) => {
704
721
 
705
722
  export const getCurrentStack = () => currentStack;
706
723
 
724
+ /**
725
+ * Represent a conditional node using if/else statements.
726
+ *
727
+ * ```js
728
+ * If( condition, function )
729
+ * .ElseIf( condition, function )
730
+ * .Else( function )
731
+ * ```
732
+ * @tsl
733
+ * @function
734
+ * @param {...any} params - The parameters for the conditional node.
735
+ * @returns {StackNode} The conditional node.
736
+ */
707
737
  export const If = ( ...params ) => currentStack.If( ...params );
708
738
 
709
- export function append( node ) {
739
+ /**
740
+ * Represent a conditional node using switch/case statements.
741
+ *
742
+ * ```js
743
+ * Switch( value )
744
+ * .Case( 1, function )
745
+ * .Case( 2, 3, 4, function )
746
+ * .Default( function )
747
+ * ```
748
+ * @tsl
749
+ * @function
750
+ * @param {...any} params - The parameters for the conditional node.
751
+ * @returns {StackNode} The conditional node.
752
+ */
753
+ export const Switch = ( ...params ) => currentStack.Switch( ...params );
754
+
755
+ /**
756
+ * Add the given node to the current stack.
757
+ *
758
+ * @param {Node} node - The node to add.
759
+ * @returns {Node} The node that was added to the stack.
760
+ */
761
+ export function Stack( node ) {
710
762
 
711
763
  if ( currentStack ) currentStack.add( node );
712
764
 
@@ -714,7 +766,7 @@ export function append( node ) {
714
766
 
715
767
  }
716
768
 
717
- addMethodChaining( 'append', append );
769
+ addMethodChaining( 'toStack', Stack );
718
770
 
719
771
  // types
720
772
 
@@ -776,3 +828,42 @@ export const split = ( node, channels ) => nodeObject( new SplitNode( nodeObject
776
828
 
777
829
  addMethodChaining( 'element', element );
778
830
  addMethodChaining( 'convert', convert );
831
+
832
+ // deprecated
833
+
834
+ /**
835
+ * @tsl
836
+ * @function
837
+ * @deprecated since r176. Use {@link Stack} instead.
838
+ *
839
+ * @param {Node} node - The node to add.
840
+ * @returns {Function}
841
+ */
842
+ export const append = ( node ) => { // @deprecated, r176
843
+
844
+ console.warn( 'THREE.TSL: append() has been renamed to Stack().' );
845
+ return Stack( node );
846
+
847
+ };
848
+
849
+ addMethodChaining( 'append', ( node ) => { // @deprecated, r176
850
+
851
+ console.warn( 'THREE.TSL: .append() has been renamed to .toStack().' );
852
+ return Stack( node );
853
+
854
+ } );
855
+
856
+ /**
857
+ * @tsl
858
+ * @function
859
+ * @deprecated since r168. Use {@link Fn} instead.
860
+ *
861
+ * @param {...any} params
862
+ * @returns {Function}
863
+ */
864
+ export const tslFn = ( ...params ) => { // @deprecated, r168
865
+
866
+ console.warn( 'THREE.TSL: tslFn() has been renamed to Fn().' );
867
+ return Fn( ...params );
868
+
869
+ };
@@ -41,15 +41,18 @@ class DebugNode extends TempNode {
41
41
  const callback = this.callback;
42
42
  const snippet = this.node.build( builder );
43
43
 
44
+ const title = '--- TSL debug - ' + builder.shaderStage + ' shader ---';
45
+ const border = '-'.repeat( title.length );
46
+
44
47
  let code = '';
45
- code += '// #--- TSL Debug ---#\n';
48
+ code += '// #' + title + '#\n';
46
49
  code += builder.flow.code.replace( /^\t/mg, '' ) + '\n';
47
50
  code += '/* ... */ ' + snippet + ' /* ... */\n';
48
- code += '// #-----------------#\n';
51
+ code += '// #' + border + '#\n';
49
52
 
50
53
  if ( callback !== null ) {
51
54
 
52
- callback( code );
55
+ callback( builder, code );
53
56
 
54
57
  } else {
55
58
 
@@ -65,6 +68,15 @@ class DebugNode extends TempNode {
65
68
 
66
69
  export default DebugNode;
67
70
 
71
+ /**
72
+ * TSL function for creating a debug node.
73
+ *
74
+ * @tsl
75
+ * @function
76
+ * @param {Node} node - The node to debug.
77
+ * @param {?Function} [callback=null] - Optional callback function to handle the debug output.
78
+ * @returns {DebugNode}
79
+ */
68
80
  export const debug = ( node, callback = null ) => nodeObject( new DebugNode( nodeObject( node ), callback ) );
69
81
 
70
82
  addMethodChaining( 'debug', debug );
@@ -10,7 +10,7 @@ import { addMethodChaining } from '../tsl/TSLCore.js';
10
10
  * @param {?ConditionalNode} conditional - An optional conditional node. It allows to decide whether the discard should be executed or not.
11
11
  * @return {Node} The `discard` expression.
12
12
  */
13
- export const Discard = ( conditional ) => ( conditional ? select( conditional, expression( 'discard' ) ) : expression( 'discard' ) ).append();
13
+ export const Discard = ( conditional ) => ( conditional ? select( conditional, expression( 'discard' ) ) : expression( 'discard' ) ).toStack();
14
14
 
15
15
  /**
16
16
  * Represents a `return` shader operation in TSL.
@@ -19,6 +19,6 @@ export const Discard = ( conditional ) => ( conditional ? select( conditional, e
19
19
  * @function
20
20
  * @return {ExpressionNode} The `return` expression.
21
21
  */
22
- export const Return = () => expression( 'return' ).append();
22
+ export const Return = () => expression( 'return' ).toStack();
23
23
 
24
24
  addMethodChaining( 'discard', Discard );
@@ -1,6 +1,6 @@
1
1
  import Node from '../core/Node.js';
2
2
  import { expression } from '../code/ExpressionNode.js';
3
- import { nodeObject, nodeArray } from '../tsl/TSLBase.js';
3
+ import { nodeObject, nodeArray, Fn } from '../tsl/TSLBase.js';
4
4
 
5
5
  /**
6
6
  * This module offers a variety of ways to implement loops in TSL. In it's basic form it's:
@@ -101,9 +101,17 @@ class LoopNode extends Node {
101
101
 
102
102
  const stack = builder.addStack(); // TODO: cache() it
103
103
 
104
- properties.returnsNode = this.params[ this.params.length - 1 ]( inputs, stack, builder );
104
+ properties.returnsNode = this.params[ this.params.length - 1 ]( inputs, builder );
105
105
  properties.stackNode = stack;
106
106
 
107
+ const baseParam = this.params[ 0 ];
108
+
109
+ if ( baseParam.isNode !== true && typeof baseParam.update === 'function' ) {
110
+
111
+ properties.updateNode = Fn( this.params[ 0 ].update )( inputs );
112
+
113
+ }
114
+
107
115
  builder.removeStack();
108
116
 
109
117
  return properties;
@@ -222,30 +230,69 @@ class LoopNode extends Node {
222
230
  const startSnippet = internalParam.start;
223
231
  const endSnippet = internalParam.end;
224
232
 
225
- let declarationSnippet = '';
226
- let conditionalSnippet = '';
227
- let updateSnippet = '';
233
+ let updateSnippet;
234
+
235
+ const deltaOperator = () => condition.includes( '<' ) ? '+=' : '-=';
236
+
237
+ if ( update !== undefined && update !== null ) {
238
+
239
+ switch ( typeof update ) {
240
+
241
+ case 'function':
242
+
243
+ const flow = builder.flowStagesNode( properties.updateNode, 'void' );
244
+ const snippet = flow.code.replace( /\t|;/g, '' );
245
+
246
+ updateSnippet = snippet;
247
+
248
+ break;
249
+
250
+ case 'number':
251
+
252
+ updateSnippet = name + ' ' + deltaOperator() + ' ' + builder.generateConst( type, update );
253
+
254
+ break;
228
255
 
229
- if ( ! update ) {
256
+ case 'string':
257
+
258
+ updateSnippet = name + ' ' + update;
259
+
260
+ break;
261
+
262
+ default:
263
+
264
+ if ( update.isNode ) {
265
+
266
+ updateSnippet = name + ' ' + deltaOperator() + ' ' + update.build( builder );
267
+
268
+ } else {
269
+
270
+ console.error( 'THREE.TSL: \'Loop( { update: ... } )\' is not a function, string or number.' );
271
+
272
+ updateSnippet = 'break /* invalid update */';
273
+
274
+ }
275
+
276
+ }
277
+
278
+ } else {
230
279
 
231
280
  if ( type === 'int' || type === 'uint' ) {
232
281
 
233
- if ( condition.includes( '<' ) ) update = '++';
234
- else update = '--';
282
+ update = condition.includes( '<' ) ? '++' : '--';
235
283
 
236
284
  } else {
237
285
 
238
- if ( condition.includes( '<' ) ) update = '+= 1.';
239
- else update = '-= 1.';
286
+ update = deltaOperator() + ' 1.';
240
287
 
241
288
  }
242
289
 
243
- }
290
+ updateSnippet = name + ' ' + update;
244
291
 
245
- declarationSnippet += builder.getVar( type, name ) + ' = ' + startSnippet;
292
+ }
246
293
 
247
- conditionalSnippet += name + ' ' + condition + ' ' + endSnippet;
248
- updateSnippet += name + ' ' + update;
294
+ const declarationSnippet = builder.getVar( type, name ) + ' = ' + startSnippet;
295
+ const conditionalSnippet = name + ' ' + condition + ' ' + endSnippet;
249
296
 
250
297
  loopSnippet = `for ( ${ declarationSnippet }; ${ conditionalSnippet }; ${ updateSnippet } )`;
251
298
 
@@ -285,7 +332,7 @@ export default LoopNode;
285
332
  * @param {...any} params - A list of parameters.
286
333
  * @returns {LoopNode}
287
334
  */
288
- export const Loop = ( ...params ) => nodeObject( new LoopNode( nodeArray( params, 'int' ) ) ).append();
335
+ export const Loop = ( ...params ) => nodeObject( new LoopNode( nodeArray( params, 'int' ) ) ).toStack();
289
336
 
290
337
  /**
291
338
  * TSL function for creating a `Continue()` expression.
@@ -294,7 +341,7 @@ export const Loop = ( ...params ) => nodeObject( new LoopNode( nodeArray( params
294
341
  * @function
295
342
  * @returns {ExpressionNode}
296
343
  */
297
- export const Continue = () => expression( 'continue' ).append();
344
+ export const Continue = () => expression( 'continue' ).toStack();
298
345
 
299
346
  /**
300
347
  * TSL function for creating a `Break()` expression.
@@ -303,7 +350,7 @@ export const Continue = () => expression( 'continue' ).append();
303
350
  * @function
304
351
  * @returns {ExpressionNode}
305
352
  */
306
- export const Break = () => expression( 'break' ).append();
353
+ export const Break = () => expression( 'break' ).toStack();
307
354
 
308
355
  // Deprecated
309
356
 
@@ -161,6 +161,17 @@ class ReflectorNode extends TextureNode {
161
161
 
162
162
  }
163
163
 
164
+ /**
165
+ * Frees internal resources. Should be called when the node is no longer in use.
166
+ */
167
+ dispose() {
168
+
169
+ super.dispose();
170
+
171
+ this._reflectorBaseNode.dispose();
172
+
173
+ }
174
+
164
175
  }
165
176
 
166
177
  /**
@@ -269,9 +280,9 @@ class ReflectorBaseNode extends Node {
269
280
  /**
270
281
  * Weak map for managing render targets.
271
282
  *
272
- * @type {WeakMap<Camera, RenderTarget>}
283
+ * @type {Map<Camera, RenderTarget>}
273
284
  */
274
- this.renderTargets = new WeakMap();
285
+ this.renderTargets = new Map();
275
286
 
276
287
  /**
277
288
  * Force render even if reflector is facing away from camera.
@@ -281,6 +292,17 @@ class ReflectorBaseNode extends Node {
281
292
  */
282
293
  this.forceUpdate = false;
283
294
 
295
+ /**
296
+ * Whether the reflector has been rendered or not.
297
+ *
298
+ * When the reflector is facing away from the camera,
299
+ * this flag is set to `false` and the texture will be empty(black).
300
+ *
301
+ * @type {boolean}
302
+ * @default {false}
303
+ */
304
+ this.hasOutput = false;
305
+
284
306
  }
285
307
 
286
308
  /**
@@ -308,6 +330,21 @@ class ReflectorBaseNode extends Node {
308
330
 
309
331
  }
310
332
 
333
+ /**
334
+ * Frees internal resources. Should be called when the node is no longer in use.
335
+ */
336
+ dispose() {
337
+
338
+ super.dispose();
339
+
340
+ for ( const renderTarget of this.renderTargets.values() ) {
341
+
342
+ renderTarget.dispose();
343
+
344
+ }
345
+
346
+ }
347
+
311
348
  /**
312
349
  * Returns a virtual camera for the given camera. The virtual camera is used to
313
350
  * render the scene from the reflector's view so correct reflections can be produced.
@@ -398,7 +435,21 @@ class ReflectorBaseNode extends Node {
398
435
  // Avoid rendering when reflector is facing away unless forcing an update
399
436
  const isFacingAway = _view.dot( _normal ) > 0;
400
437
 
401
- if ( isFacingAway === true && this.forceUpdate === false ) return;
438
+ let needsClear = false;
439
+
440
+ if ( isFacingAway === true && this.forceUpdate === false ) {
441
+
442
+ if ( this.hasOutput === false ) {
443
+
444
+ _inReflector = false;
445
+
446
+ return;
447
+
448
+ }
449
+
450
+ needsClear = true;
451
+
452
+ }
402
453
 
403
454
  _view.reflect( _normal ).negate();
404
455
  _view.add( _reflectorWorldPosition );
@@ -473,7 +524,19 @@ class ReflectorBaseNode extends Node {
473
524
  renderer.setRenderTarget( renderTarget );
474
525
  renderer.autoClear = true;
475
526
 
476
- renderer.render( scene, virtualCamera );
527
+ if ( needsClear ) {
528
+
529
+ renderer.clear();
530
+
531
+ this.hasOutput = false;
532
+
533
+ } else {
534
+
535
+ renderer.render( scene, virtualCamera );
536
+
537
+ this.hasOutput = true;
538
+
539
+ }
477
540
 
478
541
  renderer.setMRT( currentMRT );
479
542
  renderer.setRenderTarget( currentRenderTarget );
@@ -10,6 +10,7 @@ import { Sphere } from '../math/Sphere.js';
10
10
  import { Frustum } from '../math/Frustum.js';
11
11
  import { Vector3 } from '../math/Vector3.js';
12
12
  import { Color } from '../math/Color.js';
13
+ import { FrustumArray } from '../math/FrustumArray.js';
13
14
 
14
15
  function ascIdSort( a, b ) {
15
16
 
@@ -79,6 +80,7 @@ class MultiDrawRenderList {
79
80
  const _matrix = /*@__PURE__*/ new Matrix4();
80
81
  const _whiteColor = /*@__PURE__*/ new Color( 1, 1, 1 );
81
82
  const _frustum = /*@__PURE__*/ new Frustum();
83
+ const _frustumArray = /*@__PURE__*/ new FrustumArray();
82
84
  const _box = /*@__PURE__*/ new Box3();
83
85
  const _sphere = /*@__PURE__*/ new Sphere();
84
86
  const _vector = /*@__PURE__*/ new Vector3();
@@ -1441,15 +1443,24 @@ class BatchedMesh extends Mesh {
1441
1443
  } ) );
1442
1444
  this._instanceInfo = source._instanceInfo.map( info => ( { ...info } ) );
1443
1445
 
1446
+ this._availableInstanceIds = source._availableInstanceIds.slice();
1447
+ this._availableGeometryIds = source._availableGeometryIds.slice();
1448
+
1449
+ this._nextIndexStart = source._nextIndexStart;
1450
+ this._nextVertexStart = source._nextVertexStart;
1451
+ this._geometryCount = source._geometryCount;
1452
+
1444
1453
  this._maxInstanceCount = source._maxInstanceCount;
1445
1454
  this._maxVertexCount = source._maxVertexCount;
1446
1455
  this._maxIndexCount = source._maxIndexCount;
1447
1456
 
1448
1457
  this._geometryInitialized = source._geometryInitialized;
1449
- this._geometryCount = source._geometryCount;
1450
1458
  this._multiDrawCounts = source._multiDrawCounts.slice();
1451
1459
  this._multiDrawStarts = source._multiDrawStarts.slice();
1452
1460
 
1461
+ this._indirectTexture = source._indirectTexture.clone();
1462
+ this._indirectTexture.image.data = this._indirectTexture.image.data.slice();
1463
+
1453
1464
  this._matricesTexture = source._matricesTexture.clone();
1454
1465
  this._matricesTexture.image.data = this._matricesTexture.image.data.slice();
1455
1466
 
@@ -1511,8 +1522,9 @@ class BatchedMesh extends Mesh {
1511
1522
  const indirectTexture = this._indirectTexture;
1512
1523
  const indirectArray = indirectTexture.image.data;
1513
1524
 
1525
+ const frustum = camera.isArrayCamera ? _frustumArray : _frustum;
1514
1526
  // prepare the frustum in the local frame
1515
- if ( perObjectFrustumCulled ) {
1527
+ if ( perObjectFrustumCulled && ! camera.isArrayCamera ) {
1516
1528
 
1517
1529
  _matrix
1518
1530
  .multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse )
@@ -1546,7 +1558,7 @@ class BatchedMesh extends Mesh {
1546
1558
  let culled = false;
1547
1559
  if ( perObjectFrustumCulled ) {
1548
1560
 
1549
- culled = ! _frustum.intersectsSphere( _sphere );
1561
+ culled = ! frustum.intersectsSphere( _sphere, camera );
1550
1562
 
1551
1563
  }
1552
1564
 
@@ -1603,7 +1615,7 @@ class BatchedMesh extends Mesh {
1603
1615
  // get the bounds in world space
1604
1616
  this.getMatrixAt( i, _matrix );
1605
1617
  this.getBoundingSphereAt( geometryId, _sphere ).applyMatrix4( _matrix );
1606
- culled = ! _frustum.intersectsSphere( _sphere );
1618
+ culled = ! frustum.intersectsSphere( _sphere, camera );
1607
1619
 
1608
1620
  }
1609
1621
 
@@ -94,6 +94,15 @@ class Mesh extends Object3D {
94
94
  */
95
95
  this.morphTargetInfluences = undefined;
96
96
 
97
+ /**
98
+ * The number of instances of this mesh.
99
+ * Can only be used with {@link WebGPURenderer}.
100
+ *
101
+ * @type {number}
102
+ * @default 1
103
+ */
104
+ this.count = 1;
105
+
97
106
  this.updateMorphTargets();
98
107
 
99
108
  }
@@ -350,7 +350,7 @@ class Skeleton {
350
350
 
351
351
  const data = {
352
352
  metadata: {
353
- version: 4.6,
353
+ version: 4.7,
354
354
  type: 'Skeleton',
355
355
  generator: 'Skeleton.toJSON'
356
356
  },