@plastic-software/three 0.175.14 → 0.179.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (572) hide show
  1. package/README.md +4 -4
  2. package/build/three.cjs +8402 -6787
  3. package/build/three.core.js +8007 -6688
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +397 -102
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +84 -27
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +6831 -2838
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +6648 -2838
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/jsm/Addons.js +1 -3
  14. package/examples/jsm/animation/AnimationClipCreator.js +1 -0
  15. package/examples/jsm/animation/CCDIKSolver.js +6 -3
  16. package/examples/jsm/capabilities/WebGL.js +1 -27
  17. package/examples/jsm/capabilities/WebGPU.js +2 -1
  18. package/examples/jsm/controls/ArcballControls.js +15 -4
  19. package/examples/jsm/controls/DragControls.js +1 -0
  20. package/examples/jsm/controls/FirstPersonControls.js +1 -0
  21. package/examples/jsm/controls/FlyControls.js +1 -0
  22. package/examples/jsm/controls/MapControls.js +1 -0
  23. package/examples/jsm/controls/OrbitControls.js +1 -0
  24. package/examples/jsm/controls/PointerLockControls.js +5 -3
  25. package/examples/jsm/controls/TrackballControls.js +1 -0
  26. package/examples/jsm/controls/TransformControls.js +62 -14
  27. package/examples/jsm/csm/CSM.js +2 -0
  28. package/examples/jsm/csm/CSMFrustum.js +2 -0
  29. package/examples/jsm/csm/CSMHelper.js +1 -0
  30. package/examples/jsm/csm/CSMShader.js +4 -1
  31. package/examples/jsm/csm/CSMShadowNode.js +22 -8
  32. package/examples/jsm/curves/CurveExtras.js +14 -0
  33. package/examples/jsm/curves/NURBSCurve.js +1 -0
  34. package/examples/jsm/curves/NURBSSurface.js +2 -0
  35. package/examples/jsm/curves/NURBSUtils.js +4 -1
  36. package/examples/jsm/curves/NURBSVolume.js +2 -0
  37. package/examples/jsm/effects/AnaglyphEffect.js +2 -0
  38. package/examples/jsm/effects/AsciiEffect.js +2 -0
  39. package/examples/jsm/effects/OutlineEffect.js +2 -0
  40. package/examples/jsm/effects/ParallaxBarrierEffect.js +2 -0
  41. package/examples/jsm/effects/StereoEffect.js +2 -0
  42. package/examples/jsm/environments/DebugEnvironment.js +1 -0
  43. package/examples/jsm/environments/RoomEnvironment.js +57 -38
  44. package/examples/jsm/exporters/DRACOExporter.js +4 -2
  45. package/examples/jsm/exporters/EXRExporter.js +2 -0
  46. package/examples/jsm/exporters/GLTFExporter.js +7 -4
  47. package/examples/jsm/exporters/KTX2Exporter.js +2 -0
  48. package/examples/jsm/exporters/OBJExporter.js +3 -1
  49. package/examples/jsm/exporters/PLYExporter.js +4 -2
  50. package/examples/jsm/exporters/STLExporter.js +2 -0
  51. package/examples/jsm/exporters/USDZExporter.js +679 -300
  52. package/examples/jsm/geometries/BoxLineGeometry.js +1 -0
  53. package/examples/jsm/geometries/ConvexGeometry.js +1 -0
  54. package/examples/jsm/geometries/DecalGeometry.js +1 -0
  55. package/examples/jsm/geometries/ParametricFunctions.js +4 -1
  56. package/examples/jsm/geometries/ParametricGeometry.js +1 -0
  57. package/examples/jsm/geometries/RoundedBoxGeometry.js +48 -8
  58. package/examples/jsm/geometries/TeapotGeometry.js +1 -0
  59. package/examples/jsm/geometries/TextGeometry.js +1 -0
  60. package/examples/jsm/helpers/LightProbeHelper.js +1 -0
  61. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -0
  62. package/examples/jsm/helpers/OctreeHelper.js +1 -0
  63. package/examples/jsm/helpers/PositionalAudioHelper.js +1 -0
  64. package/examples/jsm/helpers/RapierHelper.js +59 -0
  65. package/examples/jsm/helpers/RectAreaLightHelper.js +1 -0
  66. package/examples/jsm/helpers/TextureHelper.js +1 -0
  67. package/examples/jsm/helpers/TextureHelperGPU.js +5 -4
  68. package/examples/jsm/helpers/VertexNormalsHelper.js +1 -0
  69. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -0
  70. package/examples/jsm/helpers/ViewHelper.js +1 -0
  71. package/examples/jsm/interactive/HTMLMesh.js +11 -2
  72. package/examples/jsm/interactive/InteractiveGroup.js +1 -0
  73. package/examples/jsm/interactive/SelectionBox.js +2 -0
  74. package/examples/jsm/interactive/SelectionHelper.js +2 -0
  75. package/examples/jsm/libs/meshopt_decoder.module.js +75 -58
  76. package/examples/jsm/lighting/TiledLighting.js +1 -0
  77. package/examples/jsm/lights/LightProbeGenerator.js +15 -3
  78. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -0
  79. package/examples/jsm/lights/RectAreaLightUniformsLib.js +1 -0
  80. package/examples/jsm/lines/Line2.js +1 -0
  81. package/examples/jsm/lines/LineGeometry.js +1 -0
  82. package/examples/jsm/lines/LineMaterial.js +4 -4
  83. package/examples/jsm/lines/LineSegments2.js +1 -0
  84. package/examples/jsm/lines/LineSegmentsGeometry.js +1 -0
  85. package/examples/jsm/lines/Wireframe.js +1 -0
  86. package/examples/jsm/lines/WireframeGeometry2.js +1 -0
  87. package/examples/jsm/lines/webgpu/Line2.js +1 -0
  88. package/examples/jsm/lines/webgpu/LineSegments2.js +3 -1
  89. package/examples/jsm/lines/webgpu/Wireframe.js +1 -0
  90. package/examples/jsm/loaders/3DMLoader.js +1 -0
  91. package/examples/jsm/loaders/3MFLoader.js +1 -0
  92. package/examples/jsm/loaders/AMFLoader.js +1 -0
  93. package/examples/jsm/loaders/BVHLoader.js +1 -0
  94. package/examples/jsm/loaders/ColladaLoader.js +6 -5
  95. package/examples/jsm/loaders/DDSLoader.js +1 -0
  96. package/examples/jsm/loaders/DRACOLoader.js +2 -1
  97. package/examples/jsm/loaders/EXRLoader.js +211 -22
  98. package/examples/jsm/loaders/FBXLoader.js +25 -23
  99. package/examples/jsm/loaders/FontLoader.js +1 -0
  100. package/examples/jsm/loaders/GCodeLoader.js +1 -0
  101. package/examples/jsm/loaders/GLTFLoader.js +10 -82
  102. package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -0
  103. package/examples/jsm/loaders/IESLoader.js +1 -0
  104. package/examples/jsm/loaders/KMZLoader.js +1 -0
  105. package/examples/jsm/loaders/KTX2Loader.js +67 -26
  106. package/examples/jsm/loaders/KTXLoader.js +1 -0
  107. package/examples/jsm/loaders/LDrawLoader.js +55 -3
  108. package/examples/jsm/loaders/LUT3dlLoader.js +1 -0
  109. package/examples/jsm/loaders/LUTCubeLoader.js +1 -0
  110. package/examples/jsm/loaders/LUTImageLoader.js +1 -0
  111. package/examples/jsm/loaders/LWOLoader.js +1 -13
  112. package/examples/jsm/loaders/LottieLoader.js +15 -0
  113. package/examples/jsm/loaders/MD2Loader.js +1 -0
  114. package/examples/jsm/loaders/MDDLoader.js +1 -0
  115. package/examples/jsm/loaders/MTLLoader.js +4 -3
  116. package/examples/jsm/loaders/MaterialXLoader.js +213 -30
  117. package/examples/jsm/loaders/NRRDLoader.js +1 -0
  118. package/examples/jsm/loaders/OBJLoader.js +1 -0
  119. package/examples/jsm/loaders/PCDLoader.js +122 -19
  120. package/examples/jsm/loaders/PDBLoader.js +1 -0
  121. package/examples/jsm/loaders/PLYLoader.js +1 -0
  122. package/examples/jsm/loaders/PVRLoader.js +1 -0
  123. package/examples/jsm/loaders/RGBELoader.js +1 -0
  124. package/examples/jsm/loaders/RGBMLoader.js +1 -0
  125. package/examples/jsm/loaders/STLLoader.js +1 -0
  126. package/examples/jsm/loaders/SVGLoader.js +1 -0
  127. package/examples/jsm/loaders/TDSLoader.js +1 -0
  128. package/examples/jsm/loaders/TGALoader.js +1 -0
  129. package/examples/jsm/loaders/TIFFLoader.js +1 -0
  130. package/examples/jsm/loaders/TTFLoader.js +14 -1
  131. package/examples/jsm/loaders/USDLoader.js +219 -0
  132. package/examples/jsm/loaders/USDZLoader.js +4 -891
  133. package/examples/jsm/loaders/UltraHDRLoader.js +1 -0
  134. package/examples/jsm/loaders/VOXLoader.js +1 -0
  135. package/examples/jsm/loaders/VRMLLoader.js +3 -2
  136. package/examples/jsm/loaders/VTKLoader.js +1 -0
  137. package/examples/jsm/loaders/XYZLoader.js +1 -0
  138. package/examples/jsm/loaders/lwo/IFFParser.js +74 -74
  139. package/examples/jsm/loaders/usd/USDAParser.js +741 -0
  140. package/examples/jsm/loaders/usd/USDCParser.js +17 -0
  141. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +1 -0
  142. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -0
  143. package/examples/jsm/materials/MeshPostProcessingMaterial.js +1 -0
  144. package/examples/jsm/math/Capsule.js +2 -0
  145. package/examples/jsm/math/ColorConverter.js +1 -0
  146. package/examples/jsm/math/ConvexHull.js +2 -0
  147. package/examples/jsm/math/ImprovedNoise.js +19 -14
  148. package/examples/jsm/math/Lut.js +2 -0
  149. package/examples/jsm/math/MeshSurfaceSampler.js +2 -0
  150. package/examples/jsm/math/OBB.js +2 -0
  151. package/examples/jsm/math/Octree.js +20 -1
  152. package/examples/jsm/math/SimplexNoise.js +2 -0
  153. package/examples/jsm/misc/ConvexObjectBreaker.js +3 -1
  154. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  155. package/examples/jsm/misc/Gyroscope.js +1 -0
  156. package/examples/jsm/misc/MD2Character.js +2 -0
  157. package/examples/jsm/misc/MD2CharacterComplex.js +5 -3
  158. package/examples/jsm/misc/MorphAnimMesh.js +1 -0
  159. package/examples/jsm/misc/MorphBlendMesh.js +1 -0
  160. package/examples/jsm/misc/ProgressiveLightMap.js +2 -0
  161. package/examples/jsm/misc/ProgressiveLightMapGPU.js +2 -0
  162. package/examples/jsm/misc/RollerCoaster.js +5 -0
  163. package/examples/jsm/misc/TubePainter.js +1 -0
  164. package/examples/jsm/misc/Volume.js +2 -0
  165. package/examples/jsm/misc/VolumeSlice.js +1 -0
  166. package/examples/jsm/modifiers/CurveModifier.js +3 -0
  167. package/examples/jsm/modifiers/CurveModifierGPU.js +2 -0
  168. package/examples/jsm/modifiers/EdgeSplitModifier.js +2 -0
  169. package/examples/jsm/modifiers/SimplifyModifier.js +2 -0
  170. package/examples/jsm/modifiers/TessellateModifier.js +2 -0
  171. package/examples/jsm/objects/GroundedSkybox.js +1 -0
  172. package/examples/jsm/objects/Lensflare.js +3 -0
  173. package/examples/jsm/objects/LensflareMesh.js +4 -3
  174. package/examples/jsm/objects/MarchingCubes.js +2 -0
  175. package/examples/jsm/objects/Reflector.js +1 -0
  176. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  177. package/examples/jsm/objects/Refractor.js +1 -0
  178. package/examples/jsm/objects/ShadowMesh.js +1 -0
  179. package/examples/jsm/objects/Sky.js +2 -1
  180. package/examples/jsm/objects/SkyMesh.js +22 -19
  181. package/examples/jsm/objects/Water.js +1 -0
  182. package/examples/jsm/objects/Water2.js +1 -0
  183. package/examples/jsm/objects/Water2Mesh.js +3 -1
  184. package/examples/jsm/objects/WaterMesh.js +2 -1
  185. package/examples/jsm/physics/AmmoPhysics.js +1 -0
  186. package/examples/jsm/physics/JoltPhysics.js +1 -0
  187. package/examples/jsm/physics/RapierPhysics.js +149 -13
  188. package/examples/jsm/postprocessing/AfterimagePass.js +20 -2
  189. package/examples/jsm/postprocessing/BloomPass.js +2 -1
  190. package/examples/jsm/postprocessing/BokehPass.js +2 -1
  191. package/examples/jsm/postprocessing/ClearPass.js +1 -0
  192. package/examples/jsm/postprocessing/CubeTexturePass.js +1 -0
  193. package/examples/jsm/postprocessing/DotScreenPass.js +1 -0
  194. package/examples/jsm/postprocessing/EffectComposer.js +4 -2
  195. package/examples/jsm/postprocessing/FXAAPass.js +40 -0
  196. package/examples/jsm/postprocessing/FilmPass.js +1 -0
  197. package/examples/jsm/postprocessing/GTAOPass.js +14 -12
  198. package/examples/jsm/postprocessing/GlitchPass.js +2 -1
  199. package/examples/jsm/postprocessing/HalftonePass.js +2 -1
  200. package/examples/jsm/postprocessing/LUTPass.js +1 -0
  201. package/examples/jsm/postprocessing/MaskPass.js +1 -0
  202. package/examples/jsm/postprocessing/OutlinePass.js +22 -19
  203. package/examples/jsm/postprocessing/OutputPass.js +1 -0
  204. package/examples/jsm/postprocessing/Pass.js +3 -1
  205. package/examples/jsm/postprocessing/RenderPass.js +1 -0
  206. package/examples/jsm/postprocessing/RenderPixelatedPass.js +2 -1
  207. package/examples/jsm/postprocessing/RenderTransitionPass.js +4 -3
  208. package/examples/jsm/postprocessing/SAOPass.js +3 -2
  209. package/examples/jsm/postprocessing/SMAAPass.js +3 -2
  210. package/examples/jsm/postprocessing/SSAARenderPass.js +2 -1
  211. package/examples/jsm/postprocessing/SSAOPass.js +12 -10
  212. package/examples/jsm/postprocessing/SSRPass.js +4 -3
  213. package/examples/jsm/postprocessing/SavePass.js +2 -1
  214. package/examples/jsm/postprocessing/ShaderPass.js +1 -0
  215. package/examples/jsm/postprocessing/TAARenderPass.js +1 -0
  216. package/examples/jsm/postprocessing/TexturePass.js +1 -0
  217. package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -1
  218. package/examples/jsm/renderers/CSS2DRenderer.js +3 -0
  219. package/examples/jsm/renderers/CSS3DRenderer.js +4 -0
  220. package/examples/jsm/renderers/Projector.js +2 -0
  221. package/examples/jsm/renderers/SVGRenderer.js +3 -0
  222. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +4 -1
  223. package/examples/jsm/shaders/AfterimageShader.js +4 -1
  224. package/examples/jsm/shaders/BasicShader.js +4 -1
  225. package/examples/jsm/shaders/BleachBypassShader.js +4 -1
  226. package/examples/jsm/shaders/BlendShader.js +4 -1
  227. package/examples/jsm/shaders/BokehShader.js +4 -1
  228. package/examples/jsm/shaders/BokehShader2.js +4 -1
  229. package/examples/jsm/shaders/BrightnessContrastShader.js +4 -1
  230. package/examples/jsm/shaders/ColorCorrectionShader.js +4 -1
  231. package/examples/jsm/shaders/ColorifyShader.js +4 -1
  232. package/examples/jsm/shaders/ConvolutionShader.js +4 -1
  233. package/examples/jsm/shaders/CopyShader.js +4 -1
  234. package/examples/jsm/shaders/DOFMipMapShader.js +4 -1
  235. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  236. package/examples/jsm/shaders/DigitalGlitch.js +4 -1
  237. package/examples/jsm/shaders/DotScreenShader.js +4 -1
  238. package/examples/jsm/shaders/ExposureShader.js +4 -1
  239. package/examples/jsm/shaders/FXAAShader.js +4 -1
  240. package/examples/jsm/shaders/FilmShader.js +4 -1
  241. package/examples/jsm/shaders/FocusShader.js +4 -1
  242. package/examples/jsm/shaders/FreiChenShader.js +4 -1
  243. package/examples/jsm/shaders/GTAOShader.js +4 -1
  244. package/examples/jsm/shaders/GammaCorrectionShader.js +4 -1
  245. package/examples/jsm/shaders/GodRaysShader.js +4 -1
  246. package/examples/jsm/shaders/HalftoneShader.js +4 -1
  247. package/examples/jsm/shaders/HorizontalBlurShader.js +4 -1
  248. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +4 -1
  249. package/examples/jsm/shaders/HueSaturationShader.js +4 -1
  250. package/examples/jsm/shaders/KaleidoShader.js +4 -1
  251. package/examples/jsm/shaders/LuminosityHighPassShader.js +4 -1
  252. package/examples/jsm/shaders/LuminosityShader.js +4 -1
  253. package/examples/jsm/shaders/MirrorShader.js +4 -1
  254. package/examples/jsm/shaders/NormalMapShader.js +4 -1
  255. package/examples/jsm/shaders/OutputShader.js +4 -1
  256. package/examples/jsm/shaders/PoissonDenoiseShader.js +4 -1
  257. package/examples/jsm/shaders/RGBShiftShader.js +4 -1
  258. package/examples/jsm/shaders/SAOShader.js +4 -1
  259. package/examples/jsm/shaders/SMAAShader.js +1 -0
  260. package/examples/jsm/shaders/SSAOShader.js +4 -1
  261. package/examples/jsm/shaders/SSRShader.js +1 -0
  262. package/examples/jsm/shaders/SepiaShader.js +4 -1
  263. package/examples/jsm/shaders/SobelOperatorShader.js +4 -1
  264. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +4 -1
  265. package/examples/jsm/shaders/TechnicolorShader.js +4 -1
  266. package/examples/jsm/shaders/ToonShader.js +2 -1
  267. package/examples/jsm/shaders/TriangleBlurShader.js +4 -1
  268. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +15 -3
  269. package/examples/jsm/shaders/VelocityShader.js +4 -1
  270. package/examples/jsm/shaders/VerticalBlurShader.js +4 -1
  271. package/examples/jsm/shaders/VerticalTiltShiftShader.js +4 -1
  272. package/examples/jsm/shaders/VignetteShader.js +4 -1
  273. package/examples/jsm/shaders/VolumeShader.js +5 -2
  274. package/examples/jsm/shaders/WaterRefractionShader.js +4 -1
  275. package/examples/jsm/textures/FlakesTexture.js +2 -0
  276. package/examples/jsm/transpiler/AST.js +381 -30
  277. package/examples/jsm/transpiler/GLSLDecoder.js +227 -88
  278. package/examples/jsm/transpiler/Linker.js +327 -0
  279. package/examples/jsm/transpiler/TSLEncoder.js +234 -85
  280. package/examples/jsm/transpiler/Transpiler.js +19 -1
  281. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  282. package/examples/jsm/transpiler/WGSLEncoder.js +788 -0
  283. package/examples/jsm/tsl/display/AfterImageNode.js +2 -3
  284. package/examples/jsm/tsl/display/AnaglyphPassNode.js +1 -0
  285. package/examples/jsm/tsl/display/AnamorphicNode.js +5 -4
  286. package/examples/jsm/tsl/display/BloomNode.js +9 -7
  287. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +206 -0
  288. package/examples/jsm/tsl/display/DenoiseNode.js +33 -33
  289. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -0
  290. package/examples/jsm/tsl/display/DotScreenNode.js +1 -0
  291. package/examples/jsm/tsl/display/FXAANode.js +3 -2
  292. package/examples/jsm/tsl/display/FilmNode.js +1 -0
  293. package/examples/jsm/tsl/display/GTAONode.js +1 -0
  294. package/examples/jsm/tsl/display/GaussianBlurNode.js +9 -36
  295. package/examples/jsm/tsl/display/LensflareNode.js +1 -0
  296. package/examples/jsm/tsl/display/Lut3DNode.js +1 -0
  297. package/examples/jsm/tsl/display/OutlineNode.js +1 -0
  298. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +1 -0
  299. package/examples/jsm/tsl/display/PixelationPassNode.js +1 -0
  300. package/examples/jsm/tsl/display/RGBShiftNode.js +1 -0
  301. package/examples/jsm/tsl/display/SMAANode.js +9 -8
  302. package/examples/jsm/tsl/display/SSAAPassNode.js +5 -4
  303. package/examples/jsm/tsl/display/SSRNode.js +1 -0
  304. package/examples/jsm/tsl/display/SobelOperatorNode.js +1 -0
  305. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -0
  306. package/examples/jsm/tsl/display/StereoPassNode.js +1 -0
  307. package/examples/jsm/tsl/display/{TRAAPassNode.js → TRAANode.js} +184 -174
  308. package/examples/jsm/tsl/display/TransitionNode.js +1 -0
  309. package/examples/jsm/tsl/display/hashBlur.js +28 -6
  310. package/examples/jsm/tsl/lighting/TiledLightsNode.js +5 -4
  311. package/examples/jsm/tsl/math/Bayer.js +4 -1
  312. package/examples/jsm/tsl/shadows/TileShadowNode.js +456 -0
  313. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +212 -0
  314. package/examples/jsm/tsl/utils/Raymarching.js +6 -3
  315. package/examples/jsm/utils/BufferGeometryUtils.js +4 -1
  316. package/examples/jsm/utils/CameraUtils.js +4 -1
  317. package/examples/jsm/utils/GeometryCompressionUtils.js +4 -1
  318. package/examples/jsm/utils/GeometryUtils.js +4 -1
  319. package/examples/jsm/utils/LDrawUtils.js +2 -0
  320. package/examples/jsm/utils/SceneOptimizer.js +2 -0
  321. package/examples/jsm/utils/SceneUtils.js +4 -1
  322. package/examples/jsm/utils/ShadowMapViewer.js +2 -0
  323. package/examples/jsm/utils/ShadowMapViewerGPU.js +2 -0
  324. package/examples/jsm/utils/SkeletonUtils.js +4 -1
  325. package/examples/jsm/utils/SortUtils.js +4 -1
  326. package/examples/jsm/utils/UVsDebug.js +4 -1
  327. package/examples/jsm/utils/WebGLTextureUtils.js +4 -1
  328. package/examples/jsm/utils/WebGPUTextureUtils.js +4 -1
  329. package/examples/jsm/utils/WorkerPool.js +2 -0
  330. package/examples/jsm/webxr/ARButton.js +1 -0
  331. package/examples/jsm/webxr/OculusHandModel.js +1 -0
  332. package/examples/jsm/webxr/OculusHandPointerModel.js +1 -0
  333. package/examples/jsm/webxr/Text2D.js +4 -1
  334. package/examples/jsm/webxr/VRButton.js +1 -0
  335. package/examples/jsm/webxr/XRButton.js +1 -0
  336. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -0
  337. package/examples/jsm/webxr/XREstimatedLight.js +1 -0
  338. package/examples/jsm/webxr/XRHandMeshModel.js +2 -0
  339. package/examples/jsm/webxr/XRHandModelFactory.js +2 -0
  340. package/examples/jsm/webxr/XRHandPrimitiveModel.js +2 -0
  341. package/examples/jsm/webxr/XRPlanes.js +1 -0
  342. package/package.json +6 -4
  343. package/src/Three.Core.js +2 -1
  344. package/src/Three.TSL.js +83 -26
  345. package/src/Three.WebGPU.Nodes.js +1 -0
  346. package/src/Three.WebGPU.js +3 -0
  347. package/src/animation/KeyframeTrack.js +1 -1
  348. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  349. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  350. package/src/audio/AudioListener.js +13 -10
  351. package/src/cameras/ArrayCamera.js +9 -1
  352. package/src/cameras/Camera.js +14 -0
  353. package/src/cameras/OrthographicCamera.js +1 -1
  354. package/src/cameras/PerspectiveCamera.js +1 -1
  355. package/src/constants.js +47 -20
  356. package/src/core/BufferAttribute.js +3 -3
  357. package/src/core/BufferGeometry.js +2 -5
  358. package/src/core/Clock.js +2 -8
  359. package/src/core/GLBufferAttribute.js +13 -1
  360. package/src/core/Object3D.js +23 -22
  361. package/src/core/RenderTarget.js +65 -21
  362. package/src/core/RenderTarget3D.js +1 -0
  363. package/{examples/jsm/misc → src/core}/Timer.js +4 -40
  364. package/src/extras/PMREMGenerator.js +11 -0
  365. package/src/extras/TextureUtils.js +1 -5
  366. package/src/extras/core/Curve.js +1 -1
  367. package/src/extras/core/Path.js +22 -22
  368. package/src/geometries/CapsuleGeometry.js +167 -17
  369. package/src/geometries/ExtrudeGeometry.js +39 -29
  370. package/src/helpers/ArrowHelper.js +2 -2
  371. package/src/helpers/CameraHelper.js +41 -11
  372. package/src/helpers/SkeletonHelper.js +36 -7
  373. package/src/lights/LightShadow.js +34 -7
  374. package/src/lights/PointLightShadow.js +1 -1
  375. package/src/lights/SpotLightShadow.js +9 -1
  376. package/src/lights/webgpu/ProjectorLight.js +46 -0
  377. package/src/loaders/BufferGeometryLoader.js +1 -10
  378. package/src/loaders/FileLoader.js +27 -4
  379. package/src/loaders/ImageBitmapLoader.js +48 -9
  380. package/src/loaders/ImageLoader.js +55 -8
  381. package/src/loaders/Loader.js +14 -0
  382. package/src/loaders/LoadingManager.js +23 -0
  383. package/src/loaders/ObjectLoader.js +44 -16
  384. package/src/loaders/nodes/NodeObjectLoader.js +2 -2
  385. package/src/materials/Material.js +1 -7
  386. package/src/materials/MeshBasicMaterial.js +1 -1
  387. package/src/materials/nodes/Line2NodeMaterial.js +0 -8
  388. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  389. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  390. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  391. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  392. package/src/materials/nodes/MeshSSSNodeMaterial.js +2 -2
  393. package/src/materials/nodes/NodeMaterial.js +106 -20
  394. package/src/materials/nodes/PointsNodeMaterial.js +5 -0
  395. package/src/materials/nodes/manager/NodeMaterialObserver.js +107 -4
  396. package/src/math/Box3.js +28 -0
  397. package/src/math/Color.js +7 -7
  398. package/src/math/ColorManagement.js +22 -3
  399. package/src/math/Frustum.js +25 -9
  400. package/src/math/FrustumArray.js +258 -0
  401. package/src/math/Line3.js +129 -2
  402. package/src/math/Matrix4.js +48 -27
  403. package/src/math/Quaternion.js +1 -1
  404. package/src/math/Ray.js +2 -0
  405. package/src/math/Sphere.js +28 -0
  406. package/src/math/Spherical.js +2 -2
  407. package/src/nodes/Nodes.js +3 -3
  408. package/src/nodes/TSL.js +6 -3
  409. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  410. package/src/nodes/accessors/Bitangent.js +54 -26
  411. package/src/nodes/accessors/Camera.js +40 -13
  412. package/src/nodes/accessors/CubeTextureNode.js +50 -2
  413. package/src/nodes/accessors/InstanceNode.js +5 -4
  414. package/src/nodes/accessors/Lights.js +2 -2
  415. package/src/nodes/accessors/MaterialNode.js +4 -0
  416. package/src/nodes/accessors/ModelNode.js +1 -1
  417. package/src/nodes/accessors/Normal.js +110 -24
  418. package/src/nodes/accessors/Object3DNode.js +7 -8
  419. package/src/nodes/accessors/Position.js +14 -4
  420. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  421. package/src/nodes/accessors/ReferenceNode.js +19 -4
  422. package/src/nodes/accessors/ReflectVector.js +3 -3
  423. package/src/nodes/accessors/SceneNode.js +1 -1
  424. package/src/nodes/accessors/SkinningNode.js +3 -2
  425. package/src/nodes/accessors/StorageBufferNode.js +25 -0
  426. package/src/nodes/accessors/StorageTextureNode.js +15 -4
  427. package/src/nodes/accessors/Tangent.js +25 -17
  428. package/src/nodes/accessors/TangentUtils.js +46 -0
  429. package/src/nodes/accessors/TextureBicubic.js +21 -3
  430. package/src/nodes/accessors/TextureNode.js +71 -8
  431. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  432. package/src/nodes/accessors/VelocityNode.js +1 -0
  433. package/src/nodes/accessors/VertexColorNode.js +4 -4
  434. package/src/nodes/code/CodeNode.js +8 -11
  435. package/src/nodes/core/ArrayNode.js +12 -0
  436. package/src/nodes/core/AssignNode.js +30 -5
  437. package/src/nodes/core/AttributeNode.js +2 -2
  438. package/src/nodes/core/ContextNode.js +27 -4
  439. package/src/nodes/core/Node.js +83 -22
  440. package/src/nodes/core/NodeBuilder.js +273 -49
  441. package/src/nodes/core/NodeUtils.js +46 -1
  442. package/src/nodes/core/NodeVarying.js +19 -1
  443. package/src/nodes/core/PropertyNode.js +8 -12
  444. package/src/nodes/core/StackNode.js +171 -26
  445. package/src/nodes/core/StructTypeNode.js +26 -4
  446. package/src/nodes/core/SubBuildNode.js +89 -0
  447. package/src/nodes/core/UniformNode.js +63 -5
  448. package/src/nodes/core/VarNode.js +102 -4
  449. package/src/nodes/core/VaryingNode.js +45 -24
  450. package/src/nodes/display/BlendModes.js +42 -1
  451. package/src/nodes/display/ColorSpaceNode.js +4 -27
  452. package/src/nodes/display/FrontFacingNode.js +34 -2
  453. package/src/nodes/display/NormalMapNode.js +19 -50
  454. package/src/nodes/display/PassNode.js +165 -20
  455. package/src/nodes/display/ScreenNode.js +0 -26
  456. package/src/nodes/display/ViewportTextureNode.js +67 -7
  457. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  458. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  459. package/src/nodes/functions/PhongLightingModel.js +3 -3
  460. package/src/nodes/functions/PhysicalLightingModel.js +16 -16
  461. package/src/nodes/functions/ShadowMaskModel.js +5 -1
  462. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  463. package/src/nodes/functions/material/getParallaxCorrectNormal.js +1 -1
  464. package/src/nodes/gpgpu/AtomicFunctionNode.js +28 -10
  465. package/src/nodes/gpgpu/BarrierNode.js +3 -3
  466. package/src/nodes/gpgpu/ComputeNode.js +68 -24
  467. package/src/nodes/gpgpu/WorkgroupInfoNode.js +28 -3
  468. package/src/nodes/lighting/AnalyticLightNode.js +7 -13
  469. package/src/nodes/lighting/EnvironmentNode.js +5 -5
  470. package/src/nodes/lighting/HemisphereLightNode.js +2 -2
  471. package/src/nodes/lighting/IESSpotLightNode.js +2 -1
  472. package/src/nodes/lighting/LightsNode.js +29 -11
  473. package/src/nodes/lighting/ProjectorLightNode.js +91 -0
  474. package/src/nodes/lighting/ShadowBaseNode.js +1 -12
  475. package/src/nodes/lighting/ShadowFilterNode.js +274 -0
  476. package/src/nodes/lighting/ShadowNode.js +174 -242
  477. package/src/nodes/lighting/SpotLightNode.js +44 -7
  478. package/src/nodes/materialx/MaterialXNodes.js +131 -2
  479. package/src/nodes/materialx/lib/mx_noise.js +166 -2
  480. package/src/nodes/math/ConditionalNode.js +1 -20
  481. package/src/nodes/math/MathNode.js +146 -75
  482. package/src/nodes/math/OperatorNode.js +129 -119
  483. package/src/nodes/shapes/Shapes.js +5 -4
  484. package/src/nodes/tsl/TSLBase.js +1 -0
  485. package/src/nodes/tsl/TSLCore.js +222 -72
  486. package/src/nodes/utils/DebugNode.js +16 -4
  487. package/src/nodes/utils/Discard.js +2 -2
  488. package/src/nodes/utils/EquirectUV.js +27 -0
  489. package/src/nodes/utils/EventNode.js +83 -0
  490. package/src/nodes/utils/LoopNode.js +64 -34
  491. package/src/nodes/utils/MatcapUV.js +22 -0
  492. package/src/nodes/utils/RTTNode.js +22 -5
  493. package/src/nodes/utils/ReflectorNode.js +77 -7
  494. package/src/nodes/utils/SampleNode.js +81 -0
  495. package/src/nodes/utils/TriplanarTextures.js +65 -0
  496. package/src/objects/BatchedMesh.js +20 -6
  497. package/src/objects/Mesh.js +9 -0
  498. package/src/objects/Skeleton.js +1 -1
  499. package/src/objects/Sprite.js +9 -0
  500. package/src/renderers/WebGL3DRenderTarget.js +1 -0
  501. package/src/renderers/WebGLArrayRenderTarget.js +1 -0
  502. package/src/renderers/WebGLCubeRenderTarget.js +2 -4
  503. package/src/renderers/WebGLRenderer.js +45 -32
  504. package/src/renderers/common/Animation.js +2 -2
  505. package/src/renderers/common/Background.js +13 -2
  506. package/src/renderers/common/Bindings.js +19 -18
  507. package/src/renderers/common/Color4.js +2 -2
  508. package/src/renderers/common/CubeRenderTarget.js +1 -1
  509. package/src/renderers/common/PostProcessing.js +60 -5
  510. package/src/renderers/common/RenderList.js +0 -4
  511. package/src/renderers/common/RenderObject.js +80 -4
  512. package/src/renderers/common/Renderer.js +133 -22
  513. package/src/renderers/common/SampledTexture.js +3 -71
  514. package/src/renderers/common/Sampler.js +79 -0
  515. package/src/renderers/common/Storage3DTexture.js +100 -0
  516. package/src/renderers/common/StorageArrayTexture.js +84 -0
  517. package/src/renderers/common/StorageTexture.js +19 -0
  518. package/src/renderers/common/Textures.js +34 -24
  519. package/src/renderers/common/TimestampQueryPool.js +1 -0
  520. package/src/renderers/common/Uniform.js +1 -1
  521. package/src/renderers/common/UniformsGroup.js +14 -18
  522. package/src/renderers/common/XRManager.js +183 -35
  523. package/src/renderers/common/XRRenderTarget.js +21 -4
  524. package/src/renderers/common/extras/PMREMGenerator.js +30 -23
  525. package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
  526. package/src/renderers/common/nodes/Nodes.js +13 -3
  527. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +1 -1
  528. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +20 -2
  529. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
  530. package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
  531. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  532. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  533. package/src/renderers/webgl/WebGLMaterials.js +6 -6
  534. package/src/renderers/webgl/WebGLProgram.js +22 -16
  535. package/src/renderers/webgl/WebGLPrograms.js +8 -6
  536. package/src/renderers/webgl/WebGLShadowMap.js +14 -3
  537. package/src/renderers/webgl/WebGLState.js +4 -4
  538. package/src/renderers/webgl/WebGLTextures.js +163 -11
  539. package/src/renderers/webgl/WebGLUtils.js +1 -3
  540. package/src/renderers/webgl-fallback/WebGLBackend.js +261 -94
  541. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +75 -9
  542. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  543. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +1 -0
  544. package/src/renderers/webgl-fallback/utils/WebGLState.js +4 -4
  545. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +44 -29
  546. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +22 -21
  547. package/src/renderers/webgpu/WebGPUBackend.js +505 -143
  548. package/src/renderers/webgpu/WebGPURenderer.js +7 -0
  549. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +4 -1
  550. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +4 -1
  551. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +129 -96
  552. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +3 -0
  553. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +9 -1
  554. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +58 -31
  555. package/src/renderers/webgpu/utils/WebGPUConstants.js +8 -2
  556. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +39 -9
  557. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +50 -108
  558. package/src/renderers/webgpu/utils/WebGPUUtils.js +2 -17
  559. package/src/renderers/webxr/WebXRController.js +1 -1
  560. package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
  561. package/src/renderers/webxr/WebXRManager.js +70 -9
  562. package/src/textures/DepthTexture.js +6 -10
  563. package/src/textures/ExternalTexture.js +45 -0
  564. package/src/textures/FramebufferTexture.js +2 -2
  565. package/src/textures/Source.js +32 -0
  566. package/src/textures/Texture.js +118 -1
  567. package/src/textures/VideoTexture.js +31 -3
  568. package/examples/jsm/effects/PeppersGhostEffect.js +0 -172
  569. package/src/core/RenderTargetArray.js +0 -40
  570. package/src/nodes/utils/EquirectUVNode.js +0 -65
  571. package/src/nodes/utils/MatcapUVNode.js +0 -49
  572. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -1,9 +1,11 @@
1
1
  import { WebGLCoordinateSystem, WebGPUCoordinateSystem } from '../constants.js';
2
+ import { Vector2 } from './Vector2.js';
2
3
  import { Vector3 } from './Vector3.js';
3
4
  import { Sphere } from './Sphere.js';
4
5
  import { Plane } from './Plane.js';
5
6
 
6
7
  const _sphere = /*@__PURE__*/ new Sphere();
8
+ const _defaultSpriteCenter = /*@__PURE__*/ new Vector2( 0.5, 0.5 );
7
9
  const _vector = /*@__PURE__*/ new Vector3();
8
10
 
9
11
  /**
@@ -87,9 +89,10 @@ class Frustum {
87
89
  *
88
90
  * @param {Matrix4} m - The projection matrix.
89
91
  * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} coordinateSystem - The coordinate system.
92
+ * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.
90
93
  * @return {Frustum} A reference to this frustum.
91
94
  */
92
- setFromProjectionMatrix( m, coordinateSystem = WebGLCoordinateSystem ) {
95
+ setFromProjectionMatrix( m, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {
93
96
 
94
97
  const planes = this.planes;
95
98
  const me = m.elements;
@@ -102,19 +105,29 @@ class Frustum {
102
105
  planes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();
103
106
  planes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();
104
107
  planes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();
105
- planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();
106
108
 
107
- if ( coordinateSystem === WebGLCoordinateSystem ) {
109
+ if ( reversedDepth ) {
108
110
 
109
- planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();
111
+ planes[ 4 ].setComponents( me2, me6, me10, me14 ).normalize(); // far
112
+ planes[ 5 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); // near
110
113
 
111
- } else if ( coordinateSystem === WebGPUCoordinateSystem ) {
114
+ } else {
112
115
 
113
- planes[ 5 ].setComponents( me2, me6, me10, me14 ).normalize();
116
+ planes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); // far
114
117
 
115
- } else {
118
+ if ( coordinateSystem === WebGLCoordinateSystem ) {
119
+
120
+ planes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); // near
121
+
122
+ } else if ( coordinateSystem === WebGPUCoordinateSystem ) {
123
+
124
+ planes[ 5 ].setComponents( me2, me6, me10, me14 ).normalize(); // near
116
125
 
117
- throw new Error( 'THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: ' + coordinateSystem );
126
+ } else {
127
+
128
+ throw new Error( 'THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: ' + coordinateSystem );
129
+
130
+ }
118
131
 
119
132
  }
120
133
 
@@ -161,7 +174,10 @@ class Frustum {
161
174
  intersectsSprite( sprite ) {
162
175
 
163
176
  _sphere.center.set( 0, 0, 0 );
164
- _sphere.radius = 0.7071067811865476;
177
+
178
+ const offset = _defaultSpriteCenter.distanceTo( sprite.center );
179
+
180
+ _sphere.radius = 0.7071067811865476 + offset;
165
181
  _sphere.applyMatrix4( sprite.matrixWorld );
166
182
 
167
183
  return this.intersectsSphere( _sphere );
@@ -0,0 +1,258 @@
1
+ import { WebGLCoordinateSystem } from '../constants.js';
2
+ import { Frustum } from './Frustum.js';
3
+ import { Matrix4 } from './Matrix4.js';
4
+
5
+ const _projScreenMatrix = /*@__PURE__*/ new Matrix4();
6
+ const _frustum = /*@__PURE__*/ new Frustum();
7
+
8
+ /**
9
+ * FrustumArray is used to determine if an object is visible in at least one camera
10
+ * from an array of cameras. This is particularly useful for multi-view renderers.
11
+ */
12
+ class FrustumArray {
13
+
14
+ /**
15
+ * Constructs a new frustum array.
16
+ *
17
+ */
18
+ constructor() {
19
+
20
+ /**
21
+ * The coordinate system to use.
22
+ *
23
+ * @type {WebGLCoordinateSystem|WebGPUCoordinateSystem}
24
+ * @default WebGLCoordinateSystem
25
+ */
26
+ this.coordinateSystem = WebGLCoordinateSystem;
27
+
28
+ }
29
+
30
+ /**
31
+ * Returns `true` if the 3D object's bounding sphere is intersecting any frustum
32
+ * from the camera array.
33
+ *
34
+ * @param {Object3D} object - The 3D object to test.
35
+ * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.
36
+ * @return {boolean} Whether the 3D object is visible in any camera.
37
+ */
38
+ intersectsObject( object, cameraArray ) {
39
+
40
+ if ( ! cameraArray.isArrayCamera || cameraArray.cameras.length === 0 ) {
41
+
42
+ return false;
43
+
44
+ }
45
+
46
+ for ( let i = 0; i < cameraArray.cameras.length; i ++ ) {
47
+
48
+ const camera = cameraArray.cameras[ i ];
49
+
50
+ _projScreenMatrix.multiplyMatrices(
51
+ camera.projectionMatrix,
52
+ camera.matrixWorldInverse
53
+ );
54
+
55
+ _frustum.setFromProjectionMatrix(
56
+ _projScreenMatrix,
57
+ camera.coordinateSystem,
58
+ camera.reversedDepth
59
+ );
60
+
61
+ if ( _frustum.intersectsObject( object ) ) {
62
+
63
+ return true; // Object is visible in at least one camera
64
+
65
+ }
66
+
67
+ }
68
+
69
+ return false; // Not visible in any camera
70
+
71
+ }
72
+
73
+ /**
74
+ * Returns `true` if the given sprite is intersecting any frustum
75
+ * from the camera array.
76
+ *
77
+ * @param {Sprite} sprite - The sprite to test.
78
+ * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.
79
+ * @return {boolean} Whether the sprite is visible in any camera.
80
+ */
81
+ intersectsSprite( sprite, cameraArray ) {
82
+
83
+ if ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {
84
+
85
+ return false;
86
+
87
+ }
88
+
89
+ for ( let i = 0; i < cameraArray.cameras.length; i ++ ) {
90
+
91
+ const camera = cameraArray.cameras[ i ];
92
+
93
+ _projScreenMatrix.multiplyMatrices(
94
+ camera.projectionMatrix,
95
+ camera.matrixWorldInverse
96
+ );
97
+
98
+ _frustum.setFromProjectionMatrix(
99
+ _projScreenMatrix,
100
+ camera.coordinateSystem,
101
+ camera.reversedDepth
102
+ );
103
+
104
+ if ( _frustum.intersectsSprite( sprite ) ) {
105
+
106
+ return true; // Sprite is visible in at least one camera
107
+
108
+ }
109
+
110
+ }
111
+
112
+ return false; // Not visible in any camera
113
+
114
+ }
115
+
116
+ /**
117
+ * Returns `true` if the given bounding sphere is intersecting any frustum
118
+ * from the camera array.
119
+ *
120
+ * @param {Sphere} sphere - The bounding sphere to test.
121
+ * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.
122
+ * @return {boolean} Whether the sphere is visible in any camera.
123
+ */
124
+ intersectsSphere( sphere, cameraArray ) {
125
+
126
+ if ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {
127
+
128
+ return false;
129
+
130
+ }
131
+
132
+ for ( let i = 0; i < cameraArray.cameras.length; i ++ ) {
133
+
134
+ const camera = cameraArray.cameras[ i ];
135
+
136
+ _projScreenMatrix.multiplyMatrices(
137
+ camera.projectionMatrix,
138
+ camera.matrixWorldInverse
139
+ );
140
+
141
+ _frustum.setFromProjectionMatrix(
142
+ _projScreenMatrix,
143
+ camera.coordinateSystem,
144
+ camera.reversedDepth
145
+ );
146
+
147
+ if ( _frustum.intersectsSphere( sphere ) ) {
148
+
149
+ return true; // Sphere is visible in at least one camera
150
+
151
+ }
152
+
153
+ }
154
+
155
+ return false; // Not visible in any camera
156
+
157
+ }
158
+
159
+ /**
160
+ * Returns `true` if the given bounding box is intersecting any frustum
161
+ * from the camera array.
162
+ *
163
+ * @param {Box3} box - The bounding box to test.
164
+ * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.
165
+ * @return {boolean} Whether the box is visible in any camera.
166
+ */
167
+ intersectsBox( box, cameraArray ) {
168
+
169
+ if ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {
170
+
171
+ return false;
172
+
173
+ }
174
+
175
+ for ( let i = 0; i < cameraArray.cameras.length; i ++ ) {
176
+
177
+ const camera = cameraArray.cameras[ i ];
178
+
179
+ _projScreenMatrix.multiplyMatrices(
180
+ camera.projectionMatrix,
181
+ camera.matrixWorldInverse
182
+ );
183
+
184
+ _frustum.setFromProjectionMatrix(
185
+ _projScreenMatrix,
186
+ camera.coordinateSystem,
187
+ camera.reversedDepth
188
+ );
189
+
190
+ if ( _frustum.intersectsBox( box ) ) {
191
+
192
+ return true; // Box is visible in at least one camera
193
+
194
+ }
195
+
196
+ }
197
+
198
+ return false; // Not visible in any camera
199
+
200
+ }
201
+
202
+ /**
203
+ * Returns `true` if the given point lies within any frustum
204
+ * from the camera array.
205
+ *
206
+ * @param {Vector3} point - The point to test.
207
+ * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.
208
+ * @return {boolean} Whether the point is visible in any camera.
209
+ */
210
+ containsPoint( point, cameraArray ) {
211
+
212
+ if ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {
213
+
214
+ return false;
215
+
216
+ }
217
+
218
+ for ( let i = 0; i < cameraArray.cameras.length; i ++ ) {
219
+
220
+ const camera = cameraArray.cameras[ i ];
221
+
222
+ _projScreenMatrix.multiplyMatrices(
223
+ camera.projectionMatrix,
224
+ camera.matrixWorldInverse
225
+ );
226
+
227
+ _frustum.setFromProjectionMatrix(
228
+ _projScreenMatrix,
229
+ camera.coordinateSystem,
230
+ camera.reversedDepth
231
+ );
232
+
233
+ if ( _frustum.containsPoint( point ) ) {
234
+
235
+ return true; // Point is visible in at least one camera
236
+
237
+ }
238
+
239
+ }
240
+
241
+ return false; // Not visible in any camera
242
+
243
+ }
244
+
245
+ /**
246
+ * Returns a new frustum array with copied values from this instance.
247
+ *
248
+ * @return {FrustumArray} A clone of this instance.
249
+ */
250
+ clone() {
251
+
252
+ return new FrustumArray();
253
+
254
+ }
255
+
256
+ }
257
+
258
+ export { FrustumArray };
package/src/math/Line3.js CHANGED
@@ -4,6 +4,12 @@ import { clamp } from './MathUtils.js';
4
4
  const _startP = /*@__PURE__*/ new Vector3();
5
5
  const _startEnd = /*@__PURE__*/ new Vector3();
6
6
 
7
+ const _d1 = /*@__PURE__*/ new Vector3();
8
+ const _d2 = /*@__PURE__*/ new Vector3();
9
+ const _r = /*@__PURE__*/ new Vector3();
10
+ const _c1 = /*@__PURE__*/ new Vector3();
11
+ const _c2 = /*@__PURE__*/ new Vector3();
12
+
7
13
  /**
8
14
  * An analytical line segment in 3D space represented by a start and end point.
9
15
  */
@@ -151,11 +157,11 @@ class Line3 {
151
157
  }
152
158
 
153
159
  /**
154
- * Returns the closets point on the line for a given point.
160
+ * Returns the closest point on the line for a given point.
155
161
  *
156
162
  * @param {Vector3} point - The point to compute the closest point on the line for.
157
163
  * @param {boolean} clampToLine - Whether to clamp the result to the range `[0,1]` or not.
158
- * @param {Vector3} target - The target vector that is used to store the method's result.
164
+ * @param {Vector3} target - The target vector that is used to store the method's result.
159
165
  * @return {Vector3} The closest point on the line.
160
166
  */
161
167
  closestPointToPoint( point, clampToLine, target ) {
@@ -166,6 +172,127 @@ class Line3 {
166
172
 
167
173
  }
168
174
 
175
+ /**
176
+ * Returns the closest squared distance between this line segment and the given one.
177
+ *
178
+ * @param {Line3} line - The line segment to compute the closest squared distance to.
179
+ * @param {Vector3} [c1] - The closest point on this line segment.
180
+ * @param {Vector3} [c2] - The closest point on the given line segment.
181
+ * @return {number} The squared distance between this line segment and the given one.
182
+ */
183
+ distanceSqToLine3( line, c1 = _c1, c2 = _c2 ) {
184
+
185
+ // from Real-Time Collision Detection by Christer Ericson, chapter 5.1.9
186
+
187
+ // Computes closest points C1 and C2 of S1(s)=P1+s*(Q1-P1) and
188
+ // S2(t)=P2+t*(Q2-P2), returning s and t. Function result is squared
189
+ // distance between between S1(s) and S2(t)
190
+
191
+ const EPSILON = 1e-8 * 1e-8; // must be squared since we compare squared length
192
+ let s, t;
193
+
194
+ const p1 = this.start;
195
+ const p2 = line.start;
196
+ const q1 = this.end;
197
+ const q2 = line.end;
198
+
199
+ _d1.subVectors( q1, p1 ); // Direction vector of segment S1
200
+ _d2.subVectors( q2, p2 ); // Direction vector of segment S2
201
+ _r.subVectors( p1, p2 );
202
+
203
+ const a = _d1.dot( _d1 ); // Squared length of segment S1, always nonnegative
204
+ const e = _d2.dot( _d2 ); // Squared length of segment S2, always nonnegative
205
+ const f = _d2.dot( _r );
206
+
207
+ // Check if either or both segments degenerate into points
208
+
209
+ if ( a <= EPSILON && e <= EPSILON ) {
210
+
211
+ // Both segments degenerate into points
212
+
213
+ c1.copy( p1 );
214
+ c2.copy( p2 );
215
+
216
+ c1.sub( c2 );
217
+
218
+ return c1.dot( c1 );
219
+
220
+ }
221
+
222
+ if ( a <= EPSILON ) {
223
+
224
+ // First segment degenerates into a point
225
+
226
+ s = 0;
227
+ t = f / e; // s = 0 => t = (b*s + f) / e = f / e
228
+ t = clamp( t, 0, 1 );
229
+
230
+
231
+ } else {
232
+
233
+ const c = _d1.dot( _r );
234
+
235
+ if ( e <= EPSILON ) {
236
+
237
+ // Second segment degenerates into a point
238
+
239
+ t = 0;
240
+ s = clamp( - c / a, 0, 1 ); // t = 0 => s = (b*t - c) / a = -c / a
241
+
242
+ } else {
243
+
244
+ // The general nondegenerate case starts here
245
+
246
+ const b = _d1.dot( _d2 );
247
+ const denom = a * e - b * b; // Always nonnegative
248
+
249
+ // If segments not parallel, compute closest point on L1 to L2 and
250
+ // clamp to segment S1. Else pick arbitrary s (here 0)
251
+
252
+ if ( denom !== 0 ) {
253
+
254
+ s = clamp( ( b * f - c * e ) / denom, 0, 1 );
255
+
256
+ } else {
257
+
258
+ s = 0;
259
+
260
+ }
261
+
262
+ // Compute point on L2 closest to S1(s) using
263
+ // t = Dot((P1 + D1*s) - P2,D2) / Dot(D2,D2) = (b*s + f) / e
264
+
265
+ t = ( b * s + f ) / e;
266
+
267
+ // If t in [0,1] done. Else clamp t, recompute s for the new value
268
+ // of t using s = Dot((P2 + D2*t) - P1,D1) / Dot(D1,D1)= (t*b - c) / a
269
+ // and clamp s to [0, 1]
270
+
271
+ if ( t < 0 ) {
272
+
273
+ t = 0.;
274
+ s = clamp( - c / a, 0, 1 );
275
+
276
+ } else if ( t > 1 ) {
277
+
278
+ t = 1;
279
+ s = clamp( ( b - c ) / a, 0, 1 );
280
+
281
+ }
282
+
283
+ }
284
+
285
+ }
286
+
287
+ c1.copy( p1 ).add( _d1.multiplyScalar( s ) );
288
+ c2.copy( p2 ).add( _d2.multiplyScalar( t ) );
289
+
290
+ c1.sub( c2 );
291
+
292
+ return c1.dot( c1 );
293
+
294
+ }
295
+
169
296
  /**
170
297
  * Applies a 4x4 transformation matrix to this line segment.
171
298
  *
@@ -1103,11 +1103,13 @@ class Matrix4 {
1103
1103
  * @param {number} near - The distance from the camera to the near plane.
1104
1104
  * @param {number} far - The distance from the camera to the far plane.
1105
1105
  * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system.
1106
+ * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.
1106
1107
  * @return {Matrix4} A reference to this matrix.
1107
1108
  */
1108
- makePerspective( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem ) {
1109
+ makePerspective( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {
1109
1110
 
1110
1111
  const te = this.elements;
1112
+
1111
1113
  const x = 2 * near / ( right - left );
1112
1114
  const y = 2 * near / ( top - bottom );
1113
1115
 
@@ -1116,19 +1118,28 @@ class Matrix4 {
1116
1118
 
1117
1119
  let c, d;
1118
1120
 
1119
- if ( coordinateSystem === WebGLCoordinateSystem ) {
1121
+ if ( reversedDepth ) {
1120
1122
 
1121
- c = - ( far + near ) / ( far - near );
1122
- d = ( - 2 * far * near ) / ( far - near );
1123
+ c = near / ( far - near );
1124
+ d = ( far * near ) / ( far - near );
1123
1125
 
1124
- } else if ( coordinateSystem === WebGPUCoordinateSystem ) {
1126
+ } else {
1125
1127
 
1126
- c = - far / ( far - near );
1127
- d = ( - far * near ) / ( far - near );
1128
+ if ( coordinateSystem === WebGLCoordinateSystem ) {
1128
1129
 
1129
- } else {
1130
+ c = - ( far + near ) / ( far - near );
1131
+ d = ( - 2 * far * near ) / ( far - near );
1132
+
1133
+ } else if ( coordinateSystem === WebGPUCoordinateSystem ) {
1134
+
1135
+ c = - far / ( far - near );
1136
+ d = ( - far * near ) / ( far - near );
1130
1137
 
1131
- throw new Error( 'THREE.Matrix4.makePerspective(): Invalid coordinate system: ' + coordinateSystem );
1138
+ } else {
1139
+
1140
+ throw new Error( 'THREE.Matrix4.makePerspective(): Invalid coordinate system: ' + coordinateSystem );
1141
+
1142
+ }
1132
1143
 
1133
1144
  }
1134
1145
 
@@ -1152,39 +1163,49 @@ class Matrix4 {
1152
1163
  * @param {number} near - The distance from the camera to the near plane.
1153
1164
  * @param {number} far - The distance from the camera to the far plane.
1154
1165
  * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system.
1166
+ * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.
1155
1167
  * @return {Matrix4} A reference to this matrix.
1156
1168
  */
1157
- makeOrthographic( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem ) {
1169
+ makeOrthographic( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {
1158
1170
 
1159
1171
  const te = this.elements;
1160
- const w = 1.0 / ( right - left );
1161
- const h = 1.0 / ( top - bottom );
1162
- const p = 1.0 / ( far - near );
1163
-
1164
- const x = ( right + left ) * w;
1165
- const y = ( top + bottom ) * h;
1166
1172
 
1167
- let z, zInv;
1173
+ const x = 2 / ( right - left );
1174
+ const y = 2 / ( top - bottom );
1168
1175
 
1169
- if ( coordinateSystem === WebGLCoordinateSystem ) {
1176
+ const a = - ( right + left ) / ( right - left );
1177
+ const b = - ( top + bottom ) / ( top - bottom );
1170
1178
 
1171
- z = ( far + near ) * p;
1172
- zInv = - 2 * p;
1179
+ let c, d;
1173
1180
 
1174
- } else if ( coordinateSystem === WebGPUCoordinateSystem ) {
1181
+ if ( reversedDepth ) {
1175
1182
 
1176
- z = near * p;
1177
- zInv = - 1 * p;
1183
+ c = 1 / ( far - near );
1184
+ d = far / ( far - near );
1178
1185
 
1179
1186
  } else {
1180
1187
 
1181
- throw new Error( 'THREE.Matrix4.makeOrthographic(): Invalid coordinate system: ' + coordinateSystem );
1188
+ if ( coordinateSystem === WebGLCoordinateSystem ) {
1189
+
1190
+ c = - 2 / ( far - near );
1191
+ d = - ( far + near ) / ( far - near );
1192
+
1193
+ } else if ( coordinateSystem === WebGPUCoordinateSystem ) {
1194
+
1195
+ c = - 1 / ( far - near );
1196
+ d = - near / ( far - near );
1197
+
1198
+ } else {
1199
+
1200
+ throw new Error( 'THREE.Matrix4.makeOrthographic(): Invalid coordinate system: ' + coordinateSystem );
1201
+
1202
+ }
1182
1203
 
1183
1204
  }
1184
1205
 
1185
- te[ 0 ] = 2 * w; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = - x;
1186
- te[ 1 ] = 0; te[ 5 ] = 2 * h; te[ 9 ] = 0; te[ 13 ] = - y;
1187
- te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = zInv; te[ 14 ] = - z;
1206
+ te[ 0 ] = x; te[ 4 ] = 0; te[ 8 ] = 0; te[ 12 ] = a;
1207
+ te[ 1 ] = 0; te[ 5 ] = y; te[ 9 ] = 0; te[ 13 ] = b;
1208
+ te[ 2 ] = 0; te[ 6 ] = 0; te[ 10 ] = c; te[ 14 ] = d;
1188
1209
  te[ 3 ] = 0; te[ 7 ] = 0; te[ 11 ] = 0; te[ 15 ] = 1;
1189
1210
 
1190
1211
  return this;
@@ -482,7 +482,7 @@ class Quaternion {
482
482
 
483
483
  let r = vFrom.dot( vTo ) + 1;
484
484
 
485
- if ( r < Number.EPSILON ) {
485
+ if ( r < 1e-8 ) { // the epsilon value has been discussed in #31286
486
486
 
487
487
  // vFrom and vTo point in opposite directions
488
488
 
package/src/math/Ray.js CHANGED
@@ -346,6 +346,8 @@ class Ray {
346
346
  */
347
347
  intersectsSphere( sphere ) {
348
348
 
349
+ if ( sphere.radius < 0 ) return false; // handle empty spheres, see #31187
350
+
349
351
  return this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );
350
352
 
351
353
  }
@@ -387,6 +387,34 @@ class Sphere {
387
387
 
388
388
  }
389
389
 
390
+ /**
391
+ * Returns a serialized structure of the bounding sphere.
392
+ *
393
+ * @return {Object} Serialized structure with fields representing the object state.
394
+ */
395
+ toJSON() {
396
+
397
+ return {
398
+ radius: this.radius,
399
+ center: this.center.toArray()
400
+ };
401
+
402
+ }
403
+
404
+ /**
405
+ * Returns a serialized structure of the bounding sphere.
406
+ *
407
+ * @param {Object} json - The serialized json to set the sphere from.
408
+ * @return {Box3} A reference to this bounding sphere.
409
+ */
410
+ fromJSON( json ) {
411
+
412
+ this.radius = json.radius;
413
+ this.center.fromArray( json.center );
414
+ return this;
415
+
416
+ }
417
+
390
418
  }
391
419
 
392
420
  export { Sphere };
@@ -107,8 +107,8 @@ class Spherical {
107
107
  * Sets the spherical components from the given Cartesian coordinates.
108
108
  *
109
109
  * @param {number} x - The x value.
110
- * @param {number} y - The x value.
111
- * @param {number} z - The x value.
110
+ * @param {number} y - The y value.
111
+ * @param {number} z - The z value.
112
112
  * @return {Spherical} A reference to this spherical.
113
113
  */
114
114
  setFromCartesianCoords( x, y, z ) {