@plastic-software/three 0.174.0 → 0.175.1

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 (567) hide show
  1. package/build/three.cjs +10744 -1476
  2. package/build/three.core.js +9633 -1096
  3. package/build/three.core.min.js +1 -1
  4. package/build/three.module.js +918 -189
  5. package/build/three.module.min.js +1 -1
  6. package/build/three.tsl.js +4 -2
  7. package/build/three.tsl.min.js +1 -1
  8. package/build/three.webgpu.js +2658 -1697
  9. package/build/three.webgpu.min.js +1 -1
  10. package/build/three.webgpu.nodes.js +2654 -1709
  11. package/build/three.webgpu.nodes.min.js +1 -1
  12. package/examples/jsm/Addons.js +1 -1
  13. package/examples/jsm/animation/AnimationClipCreator.js +57 -6
  14. package/examples/jsm/animation/CCDIKSolver.js +93 -39
  15. package/examples/jsm/capabilities/WebGL.js +28 -3
  16. package/examples/jsm/capabilities/WebGPU.js +16 -6
  17. package/examples/jsm/controls/ArcballControls.js +424 -154
  18. package/examples/jsm/controls/DragControls.js +93 -2
  19. package/examples/jsm/controls/FirstPersonControls.js +113 -4
  20. package/examples/jsm/controls/FlyControls.js +49 -2
  21. package/examples/jsm/controls/MapControls.js +42 -9
  22. package/examples/jsm/controls/OrbitControls.js +345 -42
  23. package/examples/jsm/controls/PointerLockControls.js +111 -9
  24. package/examples/jsm/controls/TrackballControls.js +159 -8
  25. package/examples/jsm/controls/TransformControls.js +252 -6
  26. package/examples/jsm/csm/CSM.js +226 -15
  27. package/examples/jsm/csm/CSMFrustum.js +52 -0
  28. package/examples/jsm/csm/CSMHelper.js +47 -0
  29. package/examples/jsm/csm/CSMShader.js +10 -1
  30. package/examples/jsm/csm/CSMShadowNode.js +156 -13
  31. package/examples/jsm/curves/CurveExtras.js +289 -31
  32. package/examples/jsm/curves/NURBSCurve.js +57 -14
  33. package/examples/jsm/curves/NURBSSurface.js +50 -6
  34. package/examples/jsm/curves/NURBSUtils.js +96 -112
  35. package/examples/jsm/curves/NURBSVolume.js +22 -4
  36. package/examples/jsm/effects/AnaglyphEffect.js +30 -0
  37. package/examples/jsm/effects/AsciiEffect.js +60 -15
  38. package/examples/jsm/effects/OutlineEffect.js +59 -111
  39. package/examples/jsm/effects/ParallaxBarrierEffect.js +28 -0
  40. package/examples/jsm/effects/PeppersGhostEffect.js +21 -2
  41. package/examples/jsm/effects/StereoEffect.js +29 -0
  42. package/examples/jsm/environments/DebugEnvironment.js +49 -0
  43. package/examples/jsm/environments/RoomEnvironment.js +23 -4
  44. package/examples/jsm/exporters/DRACOExporter.js +53 -13
  45. package/examples/jsm/exporters/EXRExporter.js +37 -8
  46. package/examples/jsm/exporters/GLTFExporter.js +171 -48
  47. package/examples/jsm/exporters/KTX2Exporter.js +20 -0
  48. package/examples/jsm/exporters/OBJExporter.js +18 -0
  49. package/examples/jsm/exporters/PLYExporter.js +39 -9
  50. package/examples/jsm/exporters/STLExporter.js +25 -5
  51. package/examples/jsm/exporters/USDZExporter.js +70 -3
  52. package/examples/jsm/geometries/BoxLineGeometry.js +22 -0
  53. package/examples/jsm/geometries/ConvexGeometry.js +18 -0
  54. package/examples/jsm/geometries/DecalGeometry.js +20 -9
  55. package/examples/jsm/geometries/ParametricFunctions.js +97 -0
  56. package/examples/jsm/geometries/ParametricGeometry.js +37 -5
  57. package/examples/jsm/geometries/RoundedBoxGeometry.js +21 -0
  58. package/examples/jsm/geometries/TeapotGeometry.js +22 -38
  59. package/examples/jsm/geometries/TextGeometry.js +44 -16
  60. package/examples/jsm/helpers/LightProbeHelper.js +35 -0
  61. package/examples/jsm/helpers/LightProbeHelperGPU.js +36 -0
  62. package/examples/jsm/helpers/OctreeHelper.js +35 -0
  63. package/examples/jsm/helpers/PositionalAudioHelper.js +59 -0
  64. package/examples/jsm/helpers/RectAreaLightHelper.js +35 -3
  65. package/examples/jsm/helpers/TextureHelper.js +27 -0
  66. package/examples/jsm/helpers/TextureHelperGPU.js +28 -0
  67. package/examples/jsm/helpers/VertexNormalsHelper.js +58 -2
  68. package/examples/jsm/helpers/VertexTangentsHelper.js +46 -2
  69. package/examples/jsm/helpers/ViewHelper.js +75 -1
  70. package/examples/jsm/interactive/HTMLMesh.js +25 -0
  71. package/examples/jsm/interactive/InteractiveGroup.js +65 -5
  72. package/examples/jsm/interactive/SelectionBox.js +74 -9
  73. package/examples/jsm/interactive/SelectionHelper.js +71 -29
  74. package/examples/jsm/libs/motion-controllers.module.js +1 -1
  75. package/examples/jsm/lighting/TiledLighting.js +23 -0
  76. package/examples/jsm/lights/LightProbeGenerator.js +26 -1
  77. package/examples/jsm/lights/RectAreaLightTexturesLib.js +48 -13
  78. package/examples/jsm/lights/RectAreaLightUniformsLib.js +15 -0
  79. package/examples/jsm/lines/Line2.js +36 -0
  80. package/examples/jsm/lines/LineGeometry.js +52 -0
  81. package/examples/jsm/lines/LineMaterial.js +95 -0
  82. package/examples/jsm/lines/LineSegments2.js +51 -2
  83. package/examples/jsm/lines/LineSegmentsGeometry.js +62 -8
  84. package/examples/jsm/lines/Wireframe.js +38 -2
  85. package/examples/jsm/lines/WireframeGeometry2.js +24 -0
  86. package/examples/jsm/lines/webgpu/Line2.js +25 -1
  87. package/examples/jsm/lines/webgpu/LineSegments2.js +44 -6
  88. package/examples/jsm/lines/webgpu/Wireframe.js +30 -2
  89. package/examples/jsm/loaders/3DMLoader.js +71 -2
  90. package/examples/jsm/loaders/3MFLoader.js +41 -3
  91. package/examples/jsm/loaders/AMFLoader.js +31 -12
  92. package/examples/jsm/loaders/BVHLoader.js +57 -11
  93. package/examples/jsm/loaders/ColladaLoader.js +35 -0
  94. package/examples/jsm/loaders/DDSLoader.js +24 -0
  95. package/examples/jsm/loaders/DRACOLoader.js +73 -1
  96. package/examples/jsm/loaders/EXRLoader.js +40 -8
  97. package/examples/jsm/loaders/FBXLoader.js +42 -14
  98. package/examples/jsm/loaders/FontLoader.js +60 -2
  99. package/examples/jsm/loaders/GCodeLoader.js +33 -5
  100. package/examples/jsm/loaders/GLTFLoader.js +218 -5
  101. package/examples/jsm/loaders/HDRCubeTextureLoader.js +48 -0
  102. package/examples/jsm/loaders/IESLoader.js +41 -0
  103. package/examples/jsm/loaders/KMZLoader.js +32 -0
  104. package/examples/jsm/loaders/KTX2Loader.js +86 -18
  105. package/examples/jsm/loaders/KTXLoader.js +26 -6
  106. package/examples/jsm/loaders/LDrawLoader.js +115 -5
  107. package/examples/jsm/loaders/LUT3dlLoader.js +46 -10
  108. package/examples/jsm/loaders/LUTCubeLoader.js +45 -9
  109. package/examples/jsm/loaders/LUTImageLoader.js +78 -38
  110. package/examples/jsm/loaders/LWOLoader.js +46 -7
  111. package/examples/jsm/loaders/LottieLoader.js +37 -0
  112. package/examples/jsm/loaders/MD2Loader.js +36 -1
  113. package/examples/jsm/loaders/MDDLoader.js +56 -12
  114. package/examples/jsm/loaders/MTLLoader.js +38 -33
  115. package/examples/jsm/loaders/MaterialXLoader.js +33 -0
  116. package/examples/jsm/loaders/NRRDLoader.js +36 -5
  117. package/examples/jsm/loaders/OBJLoader.js +48 -1
  118. package/examples/jsm/loaders/PCDLoader.js +47 -0
  119. package/examples/jsm/loaders/PDBLoader.js +40 -2
  120. package/examples/jsm/loaders/PLYLoader.js +62 -32
  121. package/examples/jsm/loaders/PVRLoader.js +23 -5
  122. package/examples/jsm/loaders/RGBELoader.js +38 -5
  123. package/examples/jsm/loaders/RGBMLoader.js +67 -1
  124. package/examples/jsm/loaders/STLLoader.js +47 -38
  125. package/examples/jsm/loaders/SVGLoader.js +113 -20
  126. package/examples/jsm/loaders/TDSLoader.js +81 -61
  127. package/examples/jsm/loaders/TGALoader.js +22 -0
  128. package/examples/jsm/loaders/TIFFLoader.js +22 -0
  129. package/examples/jsm/loaders/TTFLoader.js +36 -2
  130. package/examples/jsm/loaders/USDZLoader.js +34 -1
  131. package/examples/jsm/loaders/UltraHDRLoader.js +58 -12
  132. package/examples/jsm/loaders/VOXLoader.js +57 -0
  133. package/examples/jsm/loaders/VRMLLoader.js +32 -1
  134. package/examples/jsm/loaders/VTKLoader.js +38 -0
  135. package/examples/jsm/loaders/XYZLoader.js +35 -0
  136. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +39 -0
  137. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +39 -0
  138. package/examples/jsm/materials/MeshPostProcessingMaterial.js +24 -2
  139. package/examples/jsm/math/Capsule.js +89 -14
  140. package/examples/jsm/math/ColorConverter.js +21 -0
  141. package/examples/jsm/math/ColorSpaces.js +53 -0
  142. package/examples/jsm/math/ConvexHull.js +514 -92
  143. package/examples/jsm/math/ImprovedNoise.js +14 -2
  144. package/examples/jsm/math/Lut.js +111 -0
  145. package/examples/jsm/math/MeshSurfaceSampler.js +76 -13
  146. package/examples/jsm/math/OBB.js +139 -46
  147. package/examples/jsm/math/Octree.js +132 -5
  148. package/examples/jsm/math/SimplexNoise.js +66 -42
  149. package/examples/jsm/misc/ConvexObjectBreaker.js +43 -25
  150. package/examples/jsm/misc/GPUComputationRenderer.js +92 -17
  151. package/examples/jsm/misc/Gyroscope.js +11 -0
  152. package/examples/jsm/misc/MD2Character.js +115 -2
  153. package/examples/jsm/misc/MD2CharacterComplex.js +170 -8
  154. package/examples/jsm/misc/MorphAnimMesh.js +43 -0
  155. package/examples/jsm/misc/MorphBlendMesh.js +102 -0
  156. package/examples/jsm/misc/ProgressiveLightMap.js +40 -15
  157. package/examples/jsm/misc/ProgressiveLightMapGPU.js +33 -13
  158. package/examples/jsm/misc/RollerCoaster.js +52 -0
  159. package/examples/jsm/misc/Timer.js +79 -2
  160. package/examples/jsm/misc/TubePainter.js +53 -0
  161. package/examples/jsm/misc/Volume.js +108 -72
  162. package/examples/jsm/misc/VolumeSlice.js +88 -45
  163. package/examples/jsm/modifiers/CurveModifier.js +57 -34
  164. package/examples/jsm/modifiers/CurveModifierGPU.js +36 -17
  165. package/examples/jsm/modifiers/EdgeSplitModifier.js +18 -0
  166. package/examples/jsm/modifiers/SimplifyModifier.js +20 -8
  167. package/examples/jsm/modifiers/TessellateModifier.js +33 -2
  168. package/examples/jsm/objects/GroundedSkybox.js +23 -5
  169. package/examples/jsm/objects/Lensflare.js +91 -2
  170. package/examples/jsm/objects/LensflareMesh.js +53 -2
  171. package/examples/jsm/objects/MarchingCubes.js +88 -5
  172. package/examples/jsm/objects/Reflector.js +70 -0
  173. package/examples/jsm/objects/ReflectorForSSRPass.js +39 -0
  174. package/examples/jsm/objects/Refractor.js +61 -0
  175. package/examples/jsm/objects/ShadowMesh.js +53 -4
  176. package/examples/jsm/objects/Sky.js +26 -9
  177. package/examples/jsm/objects/SkyMesh.js +60 -9
  178. package/examples/jsm/objects/Water.js +44 -5
  179. package/examples/jsm/objects/Water2.js +42 -3
  180. package/examples/jsm/objects/Water2Mesh.js +38 -3
  181. package/examples/jsm/objects/WaterMesh.js +94 -7
  182. package/examples/jsm/physics/AmmoPhysics.js +47 -0
  183. package/examples/jsm/physics/JoltPhysics.js +48 -0
  184. package/examples/jsm/physics/RapierPhysics.js +56 -0
  185. package/examples/jsm/postprocessing/AfterimagePass.js +90 -38
  186. package/examples/jsm/postprocessing/BloomPass.js +125 -24
  187. package/examples/jsm/postprocessing/BokehPass.js +98 -22
  188. package/examples/jsm/postprocessing/ClearPass.js +53 -3
  189. package/examples/jsm/postprocessing/CubeTexturePass.js +81 -21
  190. package/examples/jsm/postprocessing/DotScreenPass.js +58 -10
  191. package/examples/jsm/postprocessing/EffectComposer.js +131 -0
  192. package/examples/jsm/postprocessing/FilmPass.js +53 -5
  193. package/examples/jsm/postprocessing/GTAOPass.js +191 -48
  194. package/examples/jsm/postprocessing/GlitchPass.js +84 -33
  195. package/examples/jsm/postprocessing/HalftonePass.js +64 -10
  196. package/examples/jsm/postprocessing/LUTPass.js +37 -8
  197. package/examples/jsm/postprocessing/MaskPass.js +90 -0
  198. package/examples/jsm/postprocessing/OutlinePass.js +266 -133
  199. package/examples/jsm/postprocessing/OutputPass.js +53 -14
  200. package/examples/jsm/postprocessing/Pass.js +98 -4
  201. package/examples/jsm/postprocessing/RenderPass.js +83 -0
  202. package/examples/jsm/postprocessing/RenderPixelatedPass.js +123 -45
  203. package/examples/jsm/postprocessing/RenderTransitionPass.js +119 -21
  204. package/examples/jsm/postprocessing/SAOPass.js +126 -53
  205. package/examples/jsm/postprocessing/SMAAPass.js +103 -71
  206. package/examples/jsm/postprocessing/SSAARenderPass.js +117 -35
  207. package/examples/jsm/postprocessing/SSAOPass.js +160 -47
  208. package/examples/jsm/postprocessing/SSRPass.js +230 -49
  209. package/examples/jsm/postprocessing/SavePass.js +68 -16
  210. package/examples/jsm/postprocessing/ShaderPass.js +64 -7
  211. package/examples/jsm/postprocessing/TAARenderPass.js +78 -24
  212. package/examples/jsm/postprocessing/TexturePass.js +71 -8
  213. package/examples/jsm/postprocessing/UnrealBloomPass.js +113 -37
  214. package/examples/jsm/renderers/CSS2DRenderer.js +77 -1
  215. package/examples/jsm/renderers/CSS3DRenderer.js +99 -3
  216. package/examples/jsm/renderers/Projector.js +18 -2
  217. package/examples/jsm/renderers/SVGRenderer.js +124 -0
  218. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +9 -5
  219. package/examples/jsm/shaders/AfterimageShader.js +6 -4
  220. package/examples/jsm/shaders/BasicShader.js +6 -2
  221. package/examples/jsm/shaders/BleachBypassShader.js +8 -4
  222. package/examples/jsm/shaders/BlendShader.js +6 -2
  223. package/examples/jsm/shaders/BokehShader.js +7 -4
  224. package/examples/jsm/shaders/BokehShader2.js +7 -3
  225. package/examples/jsm/shaders/BrightnessContrastShader.js +8 -5
  226. package/examples/jsm/shaders/ColorCorrectionShader.js +6 -2
  227. package/examples/jsm/shaders/ColorifyShader.js +6 -2
  228. package/examples/jsm/shaders/ConvolutionShader.js +7 -39
  229. package/examples/jsm/shaders/CopyShader.js +6 -2
  230. package/examples/jsm/shaders/DOFMipMapShader.js +8 -4
  231. package/examples/jsm/shaders/DepthLimitedBlurShader.js +7 -1
  232. package/examples/jsm/shaders/DigitalGlitch.js +7 -7
  233. package/examples/jsm/shaders/DotScreenShader.js +6 -4
  234. package/examples/jsm/shaders/ExposureShader.js +6 -2
  235. package/examples/jsm/shaders/FXAAShader.js +15 -7
  236. package/examples/jsm/shaders/FilmShader.js +10 -0
  237. package/examples/jsm/shaders/FocusShader.js +6 -4
  238. package/examples/jsm/shaders/FreiChenShader.js +7 -3
  239. package/examples/jsm/shaders/GTAOShader.js +33 -39
  240. package/examples/jsm/shaders/GammaCorrectionShader.js +8 -2
  241. package/examples/jsm/shaders/GodRaysShader.js +14 -5
  242. package/examples/jsm/shaders/HalftoneShader.js +11 -5
  243. package/examples/jsm/shaders/HorizontalBlurShader.js +9 -3
  244. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +6 -2
  245. package/examples/jsm/shaders/HueSaturationShader.js +7 -3
  246. package/examples/jsm/shaders/KaleidoShader.js +8 -4
  247. package/examples/jsm/shaders/LuminosityHighPassShader.js +6 -5
  248. package/examples/jsm/shaders/LuminosityShader.js +6 -3
  249. package/examples/jsm/shaders/MirrorShader.js +7 -4
  250. package/examples/jsm/shaders/NormalMapShader.js +5 -3
  251. package/examples/jsm/shaders/OutputShader.js +11 -0
  252. package/examples/jsm/shaders/PoissonDenoiseShader.js +21 -15
  253. package/examples/jsm/shaders/RGBShiftShader.js +5 -1
  254. package/examples/jsm/shaders/SAOShader.js +8 -2
  255. package/examples/jsm/shaders/SMAAShader.js +23 -1
  256. package/examples/jsm/shaders/SSAOShader.js +23 -5
  257. package/examples/jsm/shaders/SSRShader.js +25 -1
  258. package/examples/jsm/shaders/SepiaShader.js +6 -4
  259. package/examples/jsm/shaders/SobelOperatorShader.js +5 -2
  260. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +10 -8
  261. package/examples/jsm/shaders/TechnicolorShader.js +7 -4
  262. package/examples/jsm/shaders/ToonShader.js +29 -7
  263. package/examples/jsm/shaders/TriangleBlurShader.js +6 -4
  264. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +6 -3
  265. package/examples/jsm/shaders/VelocityShader.js +6 -2
  266. package/examples/jsm/shaders/VerticalBlurShader.js +6 -2
  267. package/examples/jsm/shaders/VerticalTiltShiftShader.js +5 -1
  268. package/examples/jsm/shaders/VignetteShader.js +6 -4
  269. package/examples/jsm/shaders/VolumeShader.js +7 -1
  270. package/examples/jsm/shaders/WaterRefractionShader.js +8 -0
  271. package/examples/jsm/textures/FlakesTexture.js +12 -0
  272. package/examples/jsm/transpiler/Transpiler.js +31 -0
  273. package/examples/jsm/tsl/display/AfterImageNode.js +1 -1
  274. package/examples/jsm/tsl/display/BloomNode.js +1 -1
  275. package/examples/jsm/tsl/display/PixelationPassNode.js +4 -4
  276. package/examples/jsm/tsl/display/SSRNode.js +1 -1
  277. package/examples/jsm/tsl/lighting/TiledLightsNode.js +29 -3
  278. package/examples/jsm/tsl/math/Bayer.js +14 -1
  279. package/examples/jsm/tsl/utils/Raymarching.js +4 -2
  280. package/examples/jsm/utils/BufferGeometryUtils.js +88 -29
  281. package/examples/jsm/utils/CameraUtils.js +10 -7
  282. package/examples/jsm/utils/GeometryCompressionUtils.js +20 -30
  283. package/examples/jsm/utils/GeometryUtils.js +12 -13
  284. package/examples/jsm/utils/LDrawUtils.js +11 -4
  285. package/examples/jsm/utils/SceneOptimizer.js +66 -20
  286. package/examples/jsm/utils/SceneUtils.js +50 -3
  287. package/examples/jsm/utils/ShadowMapViewer.js +47 -24
  288. package/examples/jsm/utils/ShadowMapViewerGPU.js +47 -24
  289. package/examples/jsm/utils/SkeletonUtils.js +45 -0
  290. package/examples/jsm/utils/SortUtils.js +14 -5
  291. package/examples/jsm/utils/UVsDebug.js +9 -4
  292. package/examples/jsm/utils/WebGLTextureUtils.js +13 -0
  293. package/examples/jsm/utils/WebGPUTextureUtils.js +14 -0
  294. package/examples/jsm/utils/WorkerPool.js +65 -2
  295. package/examples/jsm/webxr/ARButton.js +18 -0
  296. package/examples/jsm/webxr/OculusHandModel.js +83 -0
  297. package/examples/jsm/webxr/OculusHandPointerModel.js +125 -0
  298. package/examples/jsm/webxr/Text2D.js +11 -0
  299. package/examples/jsm/webxr/VRButton.js +30 -0
  300. package/examples/jsm/webxr/XRButton.js +22 -0
  301. package/examples/jsm/webxr/XRControllerModelFactory.js +87 -3
  302. package/examples/jsm/webxr/XREstimatedLight.js +33 -3
  303. package/examples/jsm/webxr/XRHandMeshModel.js +35 -0
  304. package/examples/jsm/webxr/XRHandModelFactory.js +92 -0
  305. package/examples/jsm/webxr/XRHandPrimitiveModel.js +42 -0
  306. package/examples/jsm/webxr/XRPlanes.js +17 -0
  307. package/package.json +1 -1
  308. package/src/Three.TSL.js +3 -1
  309. package/src/animation/AnimationAction.js +262 -30
  310. package/src/animation/AnimationClip.js +141 -2
  311. package/src/animation/AnimationMixer.js +99 -15
  312. package/src/animation/AnimationObjectGroup.js +41 -18
  313. package/src/animation/AnimationUtils.js +168 -18
  314. package/src/animation/KeyframeTrack.js +144 -10
  315. package/src/animation/PropertyBinding.js +77 -3
  316. package/src/animation/PropertyMixer.js +72 -5
  317. package/src/animation/tracks/BooleanKeyframeTrack.js +33 -6
  318. package/src/animation/tracks/ColorKeyframeTrack.js +26 -5
  319. package/src/animation/tracks/NumberKeyframeTrack.js +26 -2
  320. package/src/animation/tracks/QuaternionKeyframeTrack.js +30 -1
  321. package/src/animation/tracks/StringKeyframeTrack.js +33 -2
  322. package/src/animation/tracks/VectorKeyframeTrack.js +26 -2
  323. package/src/audio/AudioAnalyser.js +1 -1
  324. package/src/audio/AudioListener.js +2 -2
  325. package/src/audio/PositionalAudio.js +5 -5
  326. package/src/constants.js +1432 -5
  327. package/src/core/BufferAttribute.js +413 -3
  328. package/src/core/BufferGeometry.js +337 -1
  329. package/src/core/Clock.js +60 -0
  330. package/src/core/GLBufferAttribute.js +99 -0
  331. package/src/core/InstancedBufferAttribute.js +29 -0
  332. package/src/core/InstancedBufferGeometry.js +20 -0
  333. package/src/core/InstancedInterleavedBuffer.js +26 -0
  334. package/src/core/InterleavedBuffer.js +137 -3
  335. package/src/core/InterleavedBufferAttribute.js +197 -0
  336. package/src/core/Layers.js +71 -10
  337. package/src/core/Object3D.js +23 -0
  338. package/src/core/Raycaster.js +134 -1
  339. package/src/core/RenderTarget.js +166 -7
  340. package/src/core/RenderTarget3D.js +25 -0
  341. package/src/core/RenderTargetArray.js +18 -0
  342. package/src/core/Uniform.js +29 -0
  343. package/src/core/UniformsGroup.js +84 -2
  344. package/src/extras/Controls.js +16 -1
  345. package/src/extras/Earcut.js +3 -781
  346. package/src/extras/ImageUtils.js +3 -2
  347. package/src/extras/PMREMGenerator.js +22 -17
  348. package/src/extras/core/Curve.js +1 -1
  349. package/src/extras/core/Path.js +1 -1
  350. package/src/extras/lib/earcut.js +685 -0
  351. package/src/geometries/ConeGeometry.js +2 -2
  352. package/src/geometries/CylinderGeometry.js +2 -2
  353. package/src/geometries/ExtrudeGeometry.js +71 -39
  354. package/src/geometries/LatheGeometry.js +1 -1
  355. package/src/lights/LightShadow.js +1 -1
  356. package/src/lights/webgpu/IESSpotLight.js +1 -1
  357. package/src/loaders/AnimationLoader.js +31 -0
  358. package/src/loaders/AudioLoader.js +31 -0
  359. package/src/loaders/BufferGeometryLoader.js +34 -0
  360. package/src/loaders/Cache.js +45 -0
  361. package/src/loaders/CompressedTextureLoader.js +36 -3
  362. package/src/loaders/CubeTextureLoader.js +45 -0
  363. package/src/loaders/DataTextureLoader.js +44 -3
  364. package/src/loaders/FileLoader.js +57 -1
  365. package/src/loaders/ImageBitmapLoader.js +57 -0
  366. package/src/loaders/ImageLoader.js +30 -0
  367. package/src/loaders/Loader.js +4 -6
  368. package/src/loaders/LoaderUtils.js +18 -36
  369. package/src/loaders/LoadingManager.js +142 -0
  370. package/src/loaders/MaterialLoader.js +57 -0
  371. package/src/loaders/ObjectLoader.js +58 -1
  372. package/src/loaders/TextureLoader.js +33 -0
  373. package/src/loaders/nodes/NodeLoader.js +6 -2
  374. package/src/loaders/nodes/NodeMaterialLoader.js +1 -1
  375. package/src/loaders/nodes/NodeObjectLoader.js +3 -3
  376. package/src/materials/LineBasicMaterial.js +74 -1
  377. package/src/materials/LineDashedMaterial.js +52 -0
  378. package/src/materials/Material.js +18 -3
  379. package/src/materials/MeshBasicMaterial.js +165 -0
  380. package/src/materials/MeshDepthMaterial.js +93 -0
  381. package/src/materials/MeshDistanceMaterial.js +76 -0
  382. package/src/materials/MeshLambertMaterial.js +273 -0
  383. package/src/materials/MeshMatcapMaterial.js +142 -0
  384. package/src/materials/MeshNormalMaterial.js +113 -0
  385. package/src/materials/MeshPhongMaterial.js +288 -0
  386. package/src/materials/MeshPhysicalMaterial.js +292 -1
  387. package/src/materials/MeshStandardMaterial.js +297 -0
  388. package/src/materials/MeshToonMaterial.js +218 -0
  389. package/src/materials/PointsMaterial.js +89 -0
  390. package/src/materials/RawShaderMaterial.js +25 -0
  391. package/src/materials/ShaderMaterial.js +215 -6
  392. package/src/materials/ShadowMaterial.js +54 -0
  393. package/src/materials/SpriteMaterial.js +82 -0
  394. package/src/materials/nodes/Line2NodeMaterial.js +1 -1
  395. package/src/materials/nodes/LineBasicNodeMaterial.js +2 -2
  396. package/src/materials/nodes/LineDashedNodeMaterial.js +2 -2
  397. package/src/materials/nodes/MeshBasicNodeMaterial.js +2 -2
  398. package/src/materials/nodes/MeshLambertNodeMaterial.js +2 -2
  399. package/src/materials/nodes/MeshMatcapNodeMaterial.js +2 -2
  400. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  401. package/src/materials/nodes/MeshPhongNodeMaterial.js +2 -2
  402. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -2
  403. package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
  404. package/src/materials/nodes/MeshStandardNodeMaterial.js +2 -2
  405. package/src/materials/nodes/MeshToonNodeMaterial.js +2 -2
  406. package/src/materials/nodes/NodeMaterial.js +7 -3
  407. package/src/materials/nodes/PointsNodeMaterial.js +1 -1
  408. package/src/materials/nodes/ShadowNodeMaterial.js +11 -2
  409. package/src/materials/nodes/SpriteNodeMaterial.js +1 -1
  410. package/src/materials/nodes/VolumeNodeMaterial.js +10 -1
  411. package/src/math/Color.js +1 -1
  412. package/src/math/MathUtils.js +223 -0
  413. package/src/nodes/Nodes.js +1 -0
  414. package/src/nodes/accessors/BatchNode.js +8 -8
  415. package/src/nodes/accessors/BuiltinNode.js +1 -1
  416. package/src/nodes/accessors/CubeTextureNode.js +1 -1
  417. package/src/nodes/accessors/InstanceNode.js +5 -5
  418. package/src/nodes/accessors/InstancedMeshNode.js +1 -1
  419. package/src/nodes/accessors/MorphNode.js +27 -23
  420. package/src/nodes/accessors/Normal.js +1 -1
  421. package/src/nodes/accessors/Object3DNode.js +12 -12
  422. package/src/nodes/accessors/ReferenceBaseNode.js +2 -2
  423. package/src/nodes/accessors/ReferenceNode.js +1 -1
  424. package/src/nodes/accessors/SkinningNode.js +46 -37
  425. package/src/nodes/accessors/StorageBufferNode.js +1 -1
  426. package/src/nodes/accessors/StorageTextureNode.js +3 -3
  427. package/src/nodes/accessors/Texture3DNode.js +1 -1
  428. package/src/nodes/accessors/TextureNode.js +25 -5
  429. package/src/nodes/accessors/TextureSizeNode.js +1 -1
  430. package/src/nodes/accessors/UniformArrayNode.js +2 -2
  431. package/src/nodes/code/CodeNode.js +4 -4
  432. package/src/nodes/code/ExpressionNode.js +4 -4
  433. package/src/nodes/code/FunctionCallNode.js +23 -3
  434. package/src/nodes/code/ScriptableNode.js +4 -4
  435. package/src/nodes/code/ScriptableValueNode.js +2 -2
  436. package/src/nodes/core/AssignNode.js +1 -1
  437. package/src/nodes/core/AttributeNode.js +1 -1
  438. package/src/nodes/core/BypassNode.js +1 -1
  439. package/src/nodes/core/CacheNode.js +1 -1
  440. package/src/nodes/core/ContextNode.js +1 -1
  441. package/src/nodes/core/InputNode.js +2 -2
  442. package/src/nodes/core/Node.js +14 -2
  443. package/src/nodes/core/NodeBuilder.js +86 -14
  444. package/src/nodes/core/StackNode.js +5 -5
  445. package/src/nodes/core/StructNode.js +1 -1
  446. package/src/nodes/core/StructTypeNode.js +2 -2
  447. package/src/nodes/core/VarNode.js +2 -8
  448. package/src/nodes/core/VaryingNode.js +3 -3
  449. package/src/nodes/display/BlendModes.js +4 -4
  450. package/src/nodes/display/BumpMapNode.js +1 -1
  451. package/src/nodes/display/NormalMapNode.js +1 -1
  452. package/src/nodes/display/PosterizeNode.js +1 -1
  453. package/src/nodes/display/ScreenNode.js +3 -3
  454. package/src/nodes/display/ViewportDepthNode.js +2 -2
  455. package/src/nodes/display/ViewportDepthTextureNode.js +2 -2
  456. package/src/nodes/display/ViewportSharedTextureNode.js +2 -2
  457. package/src/nodes/display/ViewportTextureNode.js +4 -4
  458. package/src/nodes/functions/ShadowMaskModel.js +4 -4
  459. package/src/nodes/functions/material/getParallaxCorrectNormal.js +6 -6
  460. package/src/nodes/geometry/RangeNode.js +1 -1
  461. package/src/nodes/gpgpu/AtomicFunctionNode.js +16 -40
  462. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
  463. package/src/nodes/gpgpu/ComputeNode.js +30 -2
  464. package/src/nodes/lighting/AnalyticLightNode.js +9 -1
  465. package/src/nodes/lighting/LightsNode.js +3 -3
  466. package/src/nodes/lighting/ShadowNode.js +1 -1
  467. package/src/nodes/math/ConditionalNode.js +20 -3
  468. package/src/nodes/math/MathNode.js +83 -78
  469. package/src/nodes/math/OperatorNode.js +171 -82
  470. package/src/nodes/pmrem/PMREMNode.js +4 -4
  471. package/src/nodes/pmrem/PMREMUtils.js +2 -2
  472. package/src/nodes/tsl/TSLBase.js +2 -1
  473. package/src/nodes/tsl/TSLCore.js +115 -12
  474. package/src/nodes/utils/ArrayElementNode.js +3 -1
  475. package/src/nodes/utils/CubeMapNode.js +3 -3
  476. package/src/nodes/utils/DebugNode.js +70 -0
  477. package/src/nodes/utils/EquirectUVNode.js +2 -2
  478. package/src/nodes/utils/JoinNode.js +27 -2
  479. package/src/nodes/utils/LoopNode.js +58 -28
  480. package/src/nodes/utils/MaxMipLevelNode.js +1 -1
  481. package/src/nodes/utils/ReflectorNode.js +2 -2
  482. package/src/nodes/utils/RemapNode.js +6 -6
  483. package/src/nodes/utils/RotateNode.js +1 -1
  484. package/src/nodes/utils/SpriteSheetUVNode.js +3 -3
  485. package/src/nodes/utils/StorageArrayElementNode.js +1 -1
  486. package/src/nodes/utils/TriplanarTexturesNode.js +3 -3
  487. package/src/objects/BatchedMesh.js +4 -4
  488. package/src/objects/InstancedMesh.js +2 -2
  489. package/src/objects/LOD.js +1 -1
  490. package/src/objects/Skeleton.js +1 -1
  491. package/src/renderers/WebGL3DRenderTarget.js +25 -0
  492. package/src/renderers/WebGLArrayRenderTarget.js +25 -0
  493. package/src/renderers/WebGLCubeRenderTarget.js +39 -1
  494. package/src/renderers/WebGLRenderTarget.js +19 -0
  495. package/src/renderers/WebGLRenderer.js +617 -79
  496. package/src/renderers/common/Animation.js +2 -2
  497. package/src/renderers/common/Attributes.js +2 -2
  498. package/src/renderers/common/Backend.js +12 -3
  499. package/src/renderers/common/Background.js +1 -0
  500. package/src/renderers/common/Color4.js +1 -1
  501. package/src/renderers/common/CubeRenderTarget.js +13 -0
  502. package/src/renderers/common/PostProcessing.js +2 -0
  503. package/src/renderers/common/QuadMesh.js +2 -0
  504. package/src/renderers/common/RenderList.js +2 -2
  505. package/src/renderers/common/RenderObject.js +1 -1
  506. package/src/renderers/common/RenderObjects.js +2 -2
  507. package/src/renderers/common/Renderer.js +52 -31
  508. package/src/renderers/common/XRManager.js +333 -10
  509. package/src/renderers/common/extras/PMREMGenerator.js +6 -0
  510. package/src/renderers/common/nodes/NodeBuilderState.js +3 -3
  511. package/src/renderers/shaders/ShaderChunk/alphamap_fragment.glsl.js +10 -1
  512. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +8 -1
  513. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_maps.glsl.js +5 -1
  514. package/src/renderers/shaders/ShaderChunk/common.glsl.js +82 -0
  515. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +22 -2
  516. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +12 -1
  517. package/src/renderers/shaders/ShaderChunk/metalnessmap_fragment.glsl.js +8 -2
  518. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +31 -11
  519. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +5 -1
  520. package/src/renderers/shaders/ShaderChunk/normal_pars_fragment.glsl.js +1 -1
  521. package/src/renderers/shaders/ShaderChunk/normal_pars_vertex.glsl.js +1 -1
  522. package/src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js +2 -1
  523. package/src/renderers/shaders/ShaderChunk/roughnessmap_fragment.glsl.js +12 -1
  524. package/src/renderers/shaders/ShaderChunk/triplanar_fragment.glsl.js +20 -0
  525. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +52 -7
  526. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +25 -6
  527. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +19 -7
  528. package/src/renderers/shaders/ShaderChunk.js +2 -0
  529. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +2 -0
  530. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +1 -0
  531. package/src/renderers/shaders/UniformsLib.js +6 -5
  532. package/src/renderers/shaders/UniformsUtils.js +1 -3
  533. package/src/renderers/webgl/WebGLBackground.js +4 -2
  534. package/src/renderers/webgl/WebGLMaterials.js +12 -0
  535. package/src/renderers/webgl/WebGLProgram.js +25 -5
  536. package/src/renderers/webgl/WebGLPrograms.js +21 -7
  537. package/src/renderers/webgl/WebGLState.js +9 -9
  538. package/src/renderers/webgl-fallback/WebGLBackend.js +25 -26
  539. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +3 -12
  540. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +67 -19
  541. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +1 -1
  542. package/src/renderers/webgpu/WebGPUBackend.js +128 -87
  543. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +1 -11
  544. package/src/renderers/webgpu/WebGPURenderer.js +17 -11
  545. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +4 -4
  546. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +5 -3
  547. package/src/renderers/webgpu/utils/WebGPUConstants.js +1 -1
  548. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +1 -1
  549. package/src/renderers/webxr/WebXRController.js +87 -2
  550. package/src/renderers/webxr/WebXRDepthSensing.js +49 -0
  551. package/src/renderers/webxr/WebXRManager.js +173 -1
  552. package/src/scenes/Scene.js +2 -1
  553. package/src/textures/CanvasTexture.js +28 -0
  554. package/src/textures/CompressedArrayTexture.js +57 -0
  555. package/src/textures/CompressedCubeTexture.js +29 -0
  556. package/src/textures/CompressedTexture.js +64 -6
  557. package/src/textures/CubeTexture.js +52 -4
  558. package/src/textures/Data3DTexture.js +77 -0
  559. package/src/textures/DataArrayTexture.js +93 -0
  560. package/src/textures/DataTexture.js +65 -0
  561. package/src/textures/DepthTexture.js +59 -9
  562. package/src/textures/FramebufferTexture.js +62 -0
  563. package/src/textures/Source.js +69 -0
  564. package/src/textures/Texture.js +5 -5
  565. package/src/textures/VideoFrameTexture.js +43 -6
  566. package/src/textures/VideoTexture.js +49 -4
  567. package/examples/jsm/geometries/ParametricGeometries.js +0 -254
@@ -11,6 +11,27 @@ import {
11
11
  Vector3,
12
12
  } from 'three';
13
13
 
14
+ /** @module BufferGeometryUtils */
15
+
16
+ /**
17
+ * Computes vertex tangents using the MikkTSpace algorithm. MikkTSpace generates the same tangents consistently,
18
+ * and is used in most modelling tools and normal map bakers. Use MikkTSpace for materials with normal maps,
19
+ * because inconsistent tangents may lead to subtle visual issues in the normal map, particularly around mirrored
20
+ * UV seams.
21
+ *
22
+ * In comparison to this method, {@link BufferGeometry#computeTangents} (a custom algorithm) generates tangents that
23
+ * probably will not match the tangents in other software. The custom algorithm is sufficient for general use with a
24
+ * custom material, and may be faster than MikkTSpace.
25
+ *
26
+ * Returns the original BufferGeometry. Indexed geometries will be de-indexed. Requires position, normal, and uv attributes.
27
+ *
28
+ * @param {BufferGeometry} geometry - The geometry to compute tangents for.
29
+ * @param {Object} MikkTSpace - Instance of `examples/jsm/libs/mikktspace.module.js`, or `mikktspace` npm package.
30
+ * Await `MikkTSpace.ready` before use.
31
+ * @param {boolean} [negateSign=true] - Whether to negate the sign component (.w) of each tangent.
32
+ * Required for normal map conventions in some formats, including glTF.
33
+ * @return {BufferGeometry} The updated geometry.
34
+ */
14
35
  function computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {
15
36
 
16
37
  if ( ! MikkTSpace || ! MikkTSpace.isReady ) {
@@ -100,9 +121,11 @@ function computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {
100
121
  }
101
122
 
102
123
  /**
103
- * @param {Array<BufferGeometry>} geometries
104
- * @param {boolean} useGroups
105
- * @return {BufferGeometry}
124
+ * Merges a set of geometries into a single instance. All geometries must have compatible attributes.
125
+ *
126
+ * @param {Array<BufferGeometry>} geometries - The geometries to merge.
127
+ * @param {boolean} [useGroups=false] - Whether to use groups or not.
128
+ * @return {?BufferGeometry} The merged geometry. Returns `null` if the merge does not succeed.
106
129
  */
107
130
  function mergeGeometries( geometries, useGroups = false ) {
108
131
 
@@ -296,8 +319,11 @@ function mergeGeometries( geometries, useGroups = false ) {
296
319
  }
297
320
 
298
321
  /**
299
- * @param {Array<BufferAttribute>} attributes
300
- * @return {BufferAttribute}
322
+ * Merges a set of attributes into a single instance. All attributes must have compatible properties and types.
323
+ * Instances of {@link InterleavedBufferAttribute} are not supported.
324
+ *
325
+ * @param {Array<BufferAttribute>} attributes - The attributes to merge.
326
+ * @return {?BufferAttribute} The merged attribute. Returns `null` if the merge does not succeed.
301
327
  */
302
328
  function mergeAttributes( attributes ) {
303
329
 
@@ -389,10 +415,12 @@ function mergeAttributes( attributes ) {
389
415
  }
390
416
 
391
417
  /**
392
- * @param {BufferAttribute} attribute
393
- * @return {BufferAttribute}
418
+ * Performs a deep clone of the given buffer attribute.
419
+ *
420
+ * @param {BufferAttribute} attribute - The attribute to clone.
421
+ * @return {BufferAttribute} The cloned attribute.
394
422
  */
395
- export function deepCloneAttribute( attribute ) {
423
+ function deepCloneAttribute( attribute ) {
396
424
 
397
425
  if ( attribute.isInstancedInterleavedBufferAttribute || attribute.isInterleavedBufferAttribute ) {
398
426
 
@@ -411,8 +439,11 @@ export function deepCloneAttribute( attribute ) {
411
439
  }
412
440
 
413
441
  /**
414
- * @param {Array<BufferAttribute>} attributes
415
- * @return {Array<InterleavedBufferAttribute>}
442
+ * Interleaves a set of attributes and returns a new array of corresponding attributes that share a
443
+ * single {@link InterleavedBuffer} instance. All attributes must have compatible types.
444
+ *
445
+ * @param {Array<BufferAttribute>} attributes - The attributes to interleave.
446
+ * @return {Array<InterleavedBufferAttribute>} An array of interleaved attributes. If interleave does not succeed, the method returns `null`.
416
447
  */
417
448
  function interleaveAttributes( attributes ) {
418
449
 
@@ -475,8 +506,13 @@ function interleaveAttributes( attributes ) {
475
506
 
476
507
  }
477
508
 
478
- // returns a new, non-interleaved version of the provided attribute
479
- export function deinterleaveAttribute( attribute ) {
509
+ /**
510
+ * Returns a new, non-interleaved version of the given attribute.
511
+ *
512
+ * @param {InterleavedBufferAttribute} attribute - The interleaved attribute.
513
+ * @return {BufferAttribute} The non-interleaved attribute.
514
+ */
515
+ function deinterleaveAttribute( attribute ) {
480
516
 
481
517
  const cons = attribute.data.array.constructor;
482
518
  const count = attribute.count;
@@ -523,8 +559,12 @@ export function deinterleaveAttribute( attribute ) {
523
559
 
524
560
  }
525
561
 
526
- // deinterleaves all attributes on the geometry
527
- export function deinterleaveGeometry( geometry ) {
562
+ /**
563
+ * Deinterleaves all attributes on the given geometry.
564
+ *
565
+ * @param {BufferGeometry} geometry - The geometry to deinterleave.
566
+ */
567
+ function deinterleaveGeometry( geometry ) {
528
568
 
529
569
  const attributes = geometry.attributes;
530
570
  const morphTargets = geometry.morphTargets;
@@ -567,8 +607,10 @@ export function deinterleaveGeometry( geometry ) {
567
607
  }
568
608
 
569
609
  /**
570
- * @param {BufferGeometry} geometry
571
- * @return {number}
610
+ * Returns the amount of bytes used by all attributes to represent the geometry.
611
+ *
612
+ * @param {BufferGeometry} geometry - The geometry.
613
+ * @return {number} The estimate bytes used.
572
614
  */
573
615
  function estimateBytesUsed( geometry ) {
574
616
 
@@ -590,9 +632,11 @@ function estimateBytesUsed( geometry ) {
590
632
  }
591
633
 
592
634
  /**
593
- * @param {BufferGeometry} geometry
594
- * @param {number} tolerance
595
- * @return {BufferGeometry}
635
+ * Returns a new geometry with vertices for which all similar vertex attributes (within tolerance) are merged.
636
+ *
637
+ * @param {BufferGeometry} geometry - The geometry to merge vertices for.
638
+ * @param {number} [tolerance=1e-4] - The tolerance value.
639
+ * @return {BufferGeometry} - The new geometry with merged vertices.
596
640
  */
597
641
  function mergeVertices( geometry, tolerance = 1e-4 ) {
598
642
 
@@ -753,9 +797,12 @@ function mergeVertices( geometry, tolerance = 1e-4 ) {
753
797
  }
754
798
 
755
799
  /**
756
- * @param {BufferGeometry} geometry
757
- * @param {number} drawMode
758
- * @return {BufferGeometry}
800
+ * Returns a new indexed geometry based on `TrianglesDrawMode` draw mode.
801
+ * This mode corresponds to the `gl.TRIANGLES` primitive in WebGL.
802
+ *
803
+ * @param {BufferGeometry} geometry - The geometry to convert.
804
+ * @param {number} drawMode - The current draw mode.
805
+ * @return {BufferGeometry} The new geometry using `TrianglesDrawMode`.
759
806
  */
760
807
  function toTrianglesDrawMode( geometry, drawMode ) {
761
808
 
@@ -864,9 +911,13 @@ function toTrianglesDrawMode( geometry, drawMode ) {
864
911
 
865
912
  /**
866
913
  * Calculates the morphed attributes of a morphed/skinned BufferGeometry.
867
- * Helpful for Raytracing or Decals.
868
- * @param {Mesh | Line | Points} object An instance of Mesh, Line or Points.
869
- * @return {Object} An Object with original position/normal attributes and morphed ones.
914
+ *
915
+ * Helpful for Raytracing or Decals (i.e. a `DecalGeometry` applied to a morphed Object with a `BufferGeometry`
916
+ * will use the original `BufferGeometry`, not the morphed/skinned one, generating an incorrect result.
917
+ * Using this function to create a shadow `Object3`D the `DecalGeometry` can be correctly generated).
918
+ *
919
+ * @param {Mesh|Line|Points} object - The 3D object to compute morph attributes for.
920
+ * @return {Object} An object with original position/normal attributes and morphed ones.
870
921
  */
871
922
  function computeMorphedAttributes( object ) {
872
923
 
@@ -1142,6 +1193,12 @@ function computeMorphedAttributes( object ) {
1142
1193
 
1143
1194
  }
1144
1195
 
1196
+ /**
1197
+ * Merges the {@link BufferGeometry#groups} for the given geometry.
1198
+ *
1199
+ * @param {BufferGeometry} geometry - The geometry to modify.
1200
+ * @return {BufferGeometry} - The updated geometry
1201
+ */
1145
1202
  function mergeGroups( geometry ) {
1146
1203
 
1147
1204
  if ( geometry.groups.length === 0 ) {
@@ -1244,15 +1301,14 @@ function mergeGroups( geometry ) {
1244
1301
 
1245
1302
  }
1246
1303
 
1247
-
1248
1304
  /**
1249
1305
  * Modifies the supplied geometry if it is non-indexed, otherwise creates a new,
1250
1306
  * non-indexed geometry. Returns the geometry with smooth normals everywhere except
1251
1307
  * faces that meet at an angle greater than the crease angle.
1252
1308
  *
1253
- * @param {BufferGeometry} geometry
1254
- * @param {number} [creaseAngle]
1255
- * @return {BufferGeometry}
1309
+ * @param {BufferGeometry} geometry - The geometry to modify.
1310
+ * @param {number} [creaseAngle=Math.PI/3] - The crease angle in radians.
1311
+ * @return {BufferGeometry} - The updated geometry
1256
1312
  */
1257
1313
  function toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {
1258
1314
 
@@ -1363,6 +1419,9 @@ export {
1363
1419
  computeMikkTSpaceTangents,
1364
1420
  mergeGeometries,
1365
1421
  mergeAttributes,
1422
+ deepCloneAttribute,
1423
+ deinterleaveAttribute,
1424
+ deinterleaveGeometry,
1366
1425
  interleaveAttributes,
1367
1426
  estimateBytesUsed,
1368
1427
  mergeVertices,
@@ -4,6 +4,8 @@ import {
4
4
  Vector3
5
5
  } from 'three';
6
6
 
7
+ /** @module CameraUtils */
8
+
7
9
  const _va = /*@__PURE__*/ new Vector3(), // from pe to pa
8
10
  _vb = /*@__PURE__*/ new Vector3(), // from pe to pb
9
11
  _vc = /*@__PURE__*/ new Vector3(), // from pe to pc
@@ -14,16 +16,17 @@ const _va = /*@__PURE__*/ new Vector3(), // from pe to pa
14
16
  _quat = /*@__PURE__*/ new Quaternion(); // temporary quaternion
15
17
 
16
18
 
17
- /** Set a PerspectiveCamera's projectionMatrix and quaternion
19
+ /**
20
+ * Set projection matrix and the orientation of a perspective camera
18
21
  * to exactly frame the corners of an arbitrary rectangle.
19
22
  * NOTE: This function ignores the standard parameters;
20
- * do not call updateProjectionMatrix() after this!
23
+ * do not call `updateProjectionMatrix()` after this.
21
24
  *
22
- * @param {PerspectiveCamera} camera
23
- * @param {Vector3} bottomLeftCorner
24
- * @param {Vector3} bottomRightCorner
25
- * @param {Vector3} topLeftCorner
26
- * @param {boolean} [estimateViewFrustum=false]
25
+ * @param {PerspectiveCamera} camera - The camera.
26
+ * @param {Vector3} bottomLeftCorner - The bottom-left corner point.
27
+ * @param {Vector3} bottomRightCorner - The bottom-right corner point.
28
+ * @param {Vector3} topLeftCorner - The top-left corner point.
29
+ * @param {boolean} [estimateViewFrustum=false] - If set to `true`, the function tries to estimate the camera's FOV.
27
30
  */
28
31
  function frameCorners( camera, bottomLeftCorner, bottomRightCorner, topLeftCorner, estimateViewFrustum = false ) {
29
32
 
@@ -1,10 +1,3 @@
1
- /**
2
- * Octahedron and Quantization encodings based on work by:
3
- *
4
- * @link https://github.com/tsherif/mesh-quantization-example
5
- *
6
- */
7
-
8
1
  import {
9
2
  BufferAttribute,
10
3
  Matrix3,
@@ -12,14 +5,15 @@ import {
12
5
  Vector3
13
6
  } from 'three';
14
7
 
8
+ /** @module GeometryCompressionUtils */
15
9
 
10
+ // Octahedron and Quantization encodings based on work by: https://github.com/tsherif/mesh-quantization-example
16
11
 
17
12
  /**
18
- * Make the input geometry's normal attribute encoded and compressed by 3 different methods.
19
- *
20
- * @param {THREE.BufferGeometry} geometry
21
- * @param {string} encodeMethod "DEFAULT" || "OCT1Byte" || "OCT2Byte" || "ANGLES"
13
+ * Compressed the given geometry's `normal` attribute by the selected encode method.
22
14
  *
15
+ * @param {BufferGeometry} geometry - The geometry whose normals should be compressed.
16
+ * @param {('DEFAULT'|'OCT1Byte'|'OCT2Byte'|'ANGLES')} encodeMethod - The compression method.
23
17
  */
24
18
  function compressNormals( geometry, encodeMethod ) {
25
19
 
@@ -27,7 +21,7 @@ function compressNormals( geometry, encodeMethod ) {
27
21
 
28
22
  if ( ! normal ) {
29
23
 
30
- console.error( 'Geometry must contain normal attribute. ' );
24
+ console.error( 'THREE.GeometryCompressionUtils.compressNormals(): Geometry must contain normal attribute.' );
31
25
 
32
26
  }
33
27
 
@@ -35,7 +29,7 @@ function compressNormals( geometry, encodeMethod ) {
35
29
 
36
30
  if ( normal.itemSize != 3 ) {
37
31
 
38
- console.error( 'normal.itemSize is not 3, which cannot be encoded. ' );
32
+ console.error( 'THREE.GeometryCompressionUtils.compressNormals(): normal.itemSize is not 3, which cannot be encoded.' );
39
33
 
40
34
  }
41
35
 
@@ -63,11 +57,10 @@ function compressNormals( geometry, encodeMethod ) {
63
57
 
64
58
  } else if ( encodeMethod == 'OCT1Byte' ) {
65
59
 
66
- /**
67
- * It is not recommended to use 1-byte octahedron normals encoding unless you want to extremely reduce the memory usage
68
- * As it makes vertex data not aligned to a 4 byte boundary which may harm some WebGL implementations and sometimes the normal distortion is visible
69
- * Please refer to @zeux 's comments in https://github.com/mrdoob/three.js/pull/18208
70
- */
60
+
61
+ // It is not recommended to use 1-byte octahedron normals encoding unless you want to extremely reduce the memory usage
62
+ // As it makes vertex data not aligned to a 4 byte boundary which may harm some WebGL implementations and sometimes the normal distortion is visible
63
+ // Please refer to @zeux 's comments in https://github.com/mrdoob/three.js/pull/18208
71
64
 
72
65
  result = new Int8Array( count * 2 );
73
66
 
@@ -127,20 +120,18 @@ function compressNormals( geometry, encodeMethod ) {
127
120
 
128
121
  }
129
122
 
130
-
131
123
  /**
132
- * Make the input geometry's position attribute encoded and compressed.
133
- *
134
- * @param {THREE.BufferGeometry} geometry
135
- *
136
- */
124
+ * Compressed the given geometry's `position` attribute.
125
+ *
126
+ * @param {BufferGeometry} geometry - The geometry whose position values should be compressed.
127
+ */
137
128
  function compressPositions( geometry ) {
138
129
 
139
130
  const position = geometry.attributes.position;
140
131
 
141
132
  if ( ! position ) {
142
133
 
143
- console.error( 'Geometry must contain position attribute. ' );
134
+ console.error( 'THREE.GeometryCompressionUtils.compressPositions(): Geometry must contain position attribute.' );
144
135
 
145
136
  }
146
137
 
@@ -148,7 +139,7 @@ function compressPositions( geometry ) {
148
139
 
149
140
  if ( position.itemSize != 3 ) {
150
141
 
151
- console.error( 'position.itemSize is not 3, which cannot be packed. ' );
142
+ console.error( 'THREE.GeometryCompressionUtils.compressPositions(): position.itemSize is not 3, which cannot be packed.' );
152
143
 
153
144
  }
154
145
 
@@ -171,10 +162,9 @@ function compressPositions( geometry ) {
171
162
  }
172
163
 
173
164
  /**
174
- * Make the input geometry's uv attribute encoded and compressed.
175
- *
176
- * @param {THREE.BufferGeometry} geometry
165
+ * Compressed the given geometry's `uv` attribute.
177
166
  *
167
+ * @param {BufferGeometry} geometry - The geometry whose texture coordinates should be compressed.
178
168
  */
179
169
  function compressUvs( geometry ) {
180
170
 
@@ -182,7 +172,7 @@ function compressUvs( geometry ) {
182
172
 
183
173
  if ( ! uvs ) {
184
174
 
185
- console.error( 'Geometry must contain uv attribute. ' );
175
+ console.error( 'THREE.GeometryCompressionUtils.compressUvs(): Geometry must contain uv attribute.' );
186
176
 
187
177
  }
188
178
 
@@ -1,20 +1,20 @@
1
1
  import { Vector3 } from 'three';
2
2
 
3
+ /** @module GeometryUtils */
3
4
 
4
5
  /**
5
- * Generates 2D-Coordinates in a very fast way.
6
+ * Generates 2D-Coordinates along a Hilbert curve.
6
7
  *
7
- * Based on work by:
8
- * @link http://www.openprocessing.org/sketch/15493
8
+ * Based on work by: {@link http://www.openprocessing.org/sketch/15493}
9
9
  *
10
- * @param {Vector3} center - Center of Hilbert curve.
10
+ * @param {Vector3} [center] - Center of Hilbert curve.
11
11
  * @param {number} [size=10] - Total width of Hilbert curve.
12
12
  * @param {number} [iterations=10] - Number of subdivisions.
13
13
  * @param {number} [v0=0] - Corner index -X, -Z.
14
14
  * @param {number} [v1=1] - Corner index -X, +Z.
15
15
  * @param {number} [v2=2] - Corner index +X, +Z.
16
16
  * @param {number} [v3=3] - Corner index +X, -Z.
17
- * @returns {Array<Array<number>>} The Hilbert curve points.
17
+ * @returns {Array<Vector3>} The Hilbert curve points.
18
18
  */
19
19
  function hilbert2D( center = new Vector3( 0, 0, 0 ), size = 10, iterations = 1, v0 = 0, v1 = 1, v2 = 2, v3 = 3 ) {
20
20
 
@@ -52,12 +52,11 @@ function hilbert2D( center = new Vector3( 0, 0, 0 ), size = 10, iterations = 1,
52
52
  }
53
53
 
54
54
  /**
55
- * Generates 3D-Coordinates in a very fast way.
55
+ * Generates 3D-Coordinates along a Hilbert curve.
56
56
  *
57
- * Based on work by:
58
- * @link https://openprocessing.org/user/5654
57
+ * Based on work by: {@link https://openprocessing.org/user/5654}
59
58
  *
60
- * @param {Vector3} [center=new Vector3( 0, 0, 0 )] - Center of Hilbert curve.
59
+ * @param {Vector3} [center] - Center of Hilbert curve.
61
60
  * @param {number} [size=10] - Total width of Hilbert curve.
62
61
  * @param {number} [iterations=1] - Number of subdivisions.
63
62
  * @param {number} [v0=0] - Corner index -X, +Y, -Z.
@@ -68,7 +67,7 @@ function hilbert2D( center = new Vector3( 0, 0, 0 ), size = 10, iterations = 1,
68
67
  * @param {number} [v5=5] - Corner index +X, -Y, +Z.
69
68
  * @param {number} [v6=6] - Corner index +X, +Y, +Z.
70
69
  * @param {number} [v7=7] - Corner index +X, +Y, -Z.
71
- * @returns {Array<Array<number>>} - The Hilbert curve points.
70
+ * @returns {Array<Vector3>} - The Hilbert curve points.
72
71
  */
73
72
  function hilbert3D( center = new Vector3( 0, 0, 0 ), size = 10, iterations = 1, v0 = 0, v1 = 1, v2 = 2, v3 = 3, v4 = 4, v5 = 5, v6 = 6, v7 = 7 ) {
74
73
 
@@ -119,12 +118,12 @@ function hilbert3D( center = new Vector3( 0, 0, 0 ), size = 10, iterations = 1,
119
118
  }
120
119
 
121
120
  /**
122
- * Generates a Gosper curve (lying in the XY plane)
121
+ * Generates a Gosper curve (lying in the XY plane).
123
122
  *
124
- * https://gist.github.com/nitaku/6521802
123
+ * Reference: {@link https://gist.github.com/nitaku/6521802}
125
124
  *
126
125
  * @param {number} [size=1] - The size of a single gosper island.
127
- * @return {Array<[number, number, number]>} The gosper island points.
126
+ * @return {Array<number>} The gosper island points.
128
127
  */
129
128
  function gosper( size = 1 ) {
130
129
 
@@ -9,14 +9,21 @@ import {
9
9
 
10
10
  import { mergeGeometries } from './BufferGeometryUtils.js';
11
11
 
12
+ /**
13
+ * Utility class for LDraw models.
14
+ */
12
15
  class LDrawUtils {
13
16
 
17
+ /**
18
+ * Merges geometries in the given object by materials and returns a new group object.
19
+ * Use on not indexed geometries. The object buffers reference the old object ones.
20
+ * Special treatment is done to the conditional lines generated by LDrawLoader.
21
+ *
22
+ * @param {Object3D} object - The object to merge.
23
+ * @returns {Group} The merged object.
24
+ */
14
25
  static mergeObject( object ) {
15
26
 
16
- // Merges geometries in object by materials and returns new object. Use on not indexed geometries.
17
- // The object buffers reference the old object ones.
18
- // Special treatment is done to the conditional lines generated by LDrawLoader.
19
-
20
27
  function extractGroup( geometry, group, elementSize, isConditionalLine ) {
21
28
 
22
29
  // Extracts a group from a geometry as a new geometry (with attribute buffers referencing original buffers)
@@ -1,7 +1,18 @@
1
1
  import * as THREE from 'three';
2
2
 
3
+ /**
4
+ * This class can be used to optimized scenes by converting
5
+ * individual meshes into {@link BatchedMesh}. This component
6
+ * is an experimental attempt to implement auto-batching in three.js.
7
+ */
3
8
  class SceneOptimizer {
4
9
 
10
+ /**
11
+ * Constructs a new scene optimizer.
12
+ *
13
+ * @param {Scene} scene - The scene to optimize.
14
+ * @param {SceneOptimizer~Options} options - The configuration options.
15
+ */
5
16
  constructor( scene, options = {} ) {
6
17
 
7
18
  this.scene = scene;
@@ -9,7 +20,7 @@ class SceneOptimizer {
9
20
 
10
21
  }
11
22
 
12
- bufferToHash( buffer ) {
23
+ _bufferToHash( buffer ) {
13
24
 
14
25
  let hash = 0;
15
26
  if ( buffer.byteLength !== 0 ) {
@@ -43,7 +54,7 @@ class SceneOptimizer {
43
54
 
44
55
  }
45
56
 
46
- getMaterialPropertiesHash( material ) {
57
+ _getMaterialPropertiesHash( material ) {
47
58
 
48
59
  const mapProps = [
49
60
  'map',
@@ -128,7 +139,7 @@ class SceneOptimizer {
128
139
 
129
140
  }
130
141
 
131
- getAttributesSignature( geometry ) {
142
+ _getAttributesSignature( geometry ) {
132
143
 
133
144
  return Object.keys( geometry.attributes )
134
145
  .sort()
@@ -142,24 +153,24 @@ class SceneOptimizer {
142
153
 
143
154
  }
144
155
 
145
- getGeometryHash( geometry ) {
156
+ _getGeometryHash( geometry ) {
146
157
 
147
158
  const indexHash = geometry.index
148
- ? this.bufferToHash( geometry.index.array )
159
+ ? this._bufferToHash( geometry.index.array )
149
160
  : 'noIndex';
150
- const positionHash = this.bufferToHash( geometry.attributes.position.array );
151
- const attributesSignature = this.getAttributesSignature( geometry );
161
+ const positionHash = this._bufferToHash( geometry.attributes.position.array );
162
+ const attributesSignature = this._getAttributesSignature( geometry );
152
163
  return `${indexHash}_${positionHash}_${attributesSignature}`;
153
164
 
154
165
  }
155
166
 
156
- getBatchKey( materialProps, attributesSignature ) {
167
+ _getBatchKey( materialProps, attributesSignature ) {
157
168
 
158
169
  return `${materialProps}_${attributesSignature}`;
159
170
 
160
171
  }
161
172
 
162
- analyzeModel() {
173
+ _analyzeModel() {
163
174
 
164
175
  const batchGroups = new Map();
165
176
  const singleGroups = new Map();
@@ -170,10 +181,10 @@ class SceneOptimizer {
170
181
 
171
182
  if ( ! node.isMesh ) return;
172
183
 
173
- const materialProps = this.getMaterialPropertiesHash( node.material );
174
- const attributesSignature = this.getAttributesSignature( node.geometry );
175
- const batchKey = this.getBatchKey( materialProps, attributesSignature );
176
- const geometryHash = this.getGeometryHash( node.geometry );
184
+ const materialProps = this._getMaterialPropertiesHash( node.material );
185
+ const attributesSignature = this._getAttributesSignature( node.geometry );
186
+ const batchKey = this._getBatchKey( materialProps, attributesSignature );
187
+ const geometryHash = this._getGeometryHash( node.geometry );
177
188
  uniqueGeometries.add( geometryHash );
178
189
 
179
190
  if ( ! batchGroups.has( batchKey ) ) {
@@ -222,7 +233,7 @@ class SceneOptimizer {
222
233
 
223
234
  }
224
235
 
225
- createBatchedMeshes( batchGroups ) {
236
+ _createBatchedMeshes( batchGroups ) {
226
237
 
227
238
  const meshesToRemove = new Set();
228
239
 
@@ -269,7 +280,7 @@ class SceneOptimizer {
269
280
 
270
281
  for ( const mesh of group.meshes ) {
271
282
 
272
- const geometryHash = this.getGeometryHash( mesh.geometry );
283
+ const geometryHash = this._getGeometryHash( mesh.geometry );
273
284
 
274
285
  if ( ! geometryIds.has( geometryHash ) ) {
275
286
 
@@ -308,6 +319,11 @@ class SceneOptimizer {
308
319
 
309
320
  }
310
321
 
322
+ /**
323
+ * Removes empty nodes from all descendants of the given 3D object.
324
+ *
325
+ * @param {Object3D} object - The 3D object to process.
326
+ */
311
327
  removeEmptyNodes( object ) {
312
328
 
313
329
  const children = [ ...object.children ];
@@ -327,6 +343,11 @@ class SceneOptimizer {
327
343
 
328
344
  }
329
345
 
346
+ /**
347
+ * Removes the given array of meshes from the scene.
348
+ *
349
+ * @param {Set<Mesh>} meshesToRemove - The meshes to remove.
350
+ */
330
351
  disposeMeshes( meshesToRemove ) {
331
352
 
332
353
  meshesToRemove.forEach( ( mesh ) => {
@@ -356,7 +377,7 @@ class SceneOptimizer {
356
377
 
357
378
  }
358
379
 
359
- logDebugInfo( stats ) {
380
+ _logDebugInfo( stats ) {
360
381
 
361
382
  console.group( 'Scene Optimization Results' );
362
383
  console.log( `Original meshes: ${stats.originalMeshes}` );
@@ -368,10 +389,18 @@ class SceneOptimizer {
368
389
 
369
390
  }
370
391
 
392
+ /**
393
+ * Performs the auto-baching by identifying groups of meshes in the scene
394
+ * that can be represented as a single {@link BatchedMesh}. The method modifies
395
+ * the scene by adding instances of `BatchedMesh` and removing the now redundant
396
+ * individual meshes.
397
+ *
398
+ * @return {Scene} The optimized scene.
399
+ */
371
400
  toBatchedMesh() {
372
401
 
373
- const { batchGroups, singleGroups, uniqueGeometries } = this.analyzeModel();
374
- const meshesToRemove = this.createBatchedMeshes( batchGroups );
402
+ const { batchGroups, singleGroups, uniqueGeometries } = this._analyzeModel();
403
+ const meshesToRemove = this._createBatchedMeshes( batchGroups );
375
404
 
376
405
  this.disposeMeshes( meshesToRemove );
377
406
  this.removeEmptyNodes( this.scene );
@@ -390,7 +419,7 @@ class SceneOptimizer {
390
419
  reductionRatio: ( ( 1 - totalFinalMeshes / totalOriginalMeshes ) * 100 ).toFixed( 1 ),
391
420
  };
392
421
 
393
- this.logDebugInfo( stats );
422
+ this._logDebugInfo( stats );
394
423
 
395
424
  }
396
425
 
@@ -398,7 +427,17 @@ class SceneOptimizer {
398
427
 
399
428
  }
400
429
 
401
- // Placeholder for future implementation
430
+ /**
431
+ * Performs the auto-instancing by identifying groups of meshes in the scene
432
+ * that can be represented as a single {@link InstancedMesh}. The method modifies
433
+ * the scene by adding instances of `InstancedMesh` and removing the now redundant
434
+ * individual meshes.
435
+ *
436
+ * This method is not yet implemented.
437
+ *
438
+ * @abstract
439
+ * @return {Scene} The optimized scene.
440
+ */
402
441
  toInstancingMesh() {
403
442
 
404
443
  throw new Error( 'InstancedMesh optimization not implemented yet' );
@@ -407,4 +446,11 @@ class SceneOptimizer {
407
446
 
408
447
  }
409
448
 
449
+ /**
450
+ * Constructor options of `SceneOptimizer`.
451
+ *
452
+ * @typedef {Object} SceneOptimizer~Options
453
+ * @property {boolean} [debug=false] - Whether to enable debug mode or not.
454
+ **/
455
+
410
456
  export { SceneOptimizer };