vc-spaces365-threejs 0.180.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 (1120) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +86 -0
  3. package/build/three.cjs +77750 -0
  4. package/build/three.core.js +58846 -0
  5. package/build/three.core.min.js +6 -0
  6. package/build/three.module.js +18484 -0
  7. package/build/three.module.min.js +6 -0
  8. package/build/three.tsl.js +636 -0
  9. package/build/three.tsl.min.js +6 -0
  10. package/build/three.webgpu.js +77332 -0
  11. package/build/three.webgpu.min.js +6 -0
  12. package/build/three.webgpu.nodes.js +77103 -0
  13. package/build/three.webgpu.nodes.min.js +6 -0
  14. package/examples/fonts/LICENSE +13 -0
  15. package/examples/fonts/README.md +11 -0
  16. package/examples/fonts/droid/NOTICE +190 -0
  17. package/examples/fonts/droid/README.txt +18 -0
  18. package/examples/fonts/droid/droid_sans_bold.typeface.json +1 -0
  19. package/examples/fonts/droid/droid_sans_mono_regular.typeface.json +1 -0
  20. package/examples/fonts/droid/droid_sans_regular.typeface.json +1 -0
  21. package/examples/fonts/droid/droid_serif_bold.typeface.json +1 -0
  22. package/examples/fonts/droid/droid_serif_regular.typeface.json +1 -0
  23. package/examples/fonts/gentilis_bold.typeface.json +1 -0
  24. package/examples/fonts/gentilis_regular.typeface.json +1 -0
  25. package/examples/fonts/helvetiker_bold.typeface.json +1 -0
  26. package/examples/fonts/helvetiker_regular.typeface.json +1 -0
  27. package/examples/fonts/optimer_bold.typeface.json +1 -0
  28. package/examples/fonts/optimer_regular.typeface.json +1 -0
  29. package/examples/fonts/ttf/README.md +9 -0
  30. package/examples/fonts/ttf/kenpixel.ttf +0 -0
  31. package/examples/jsm/Addons.js +285 -0
  32. package/examples/jsm/animation/AnimationClipCreator.js +168 -0
  33. package/examples/jsm/animation/CCDIKSolver.js +591 -0
  34. package/examples/jsm/capabilities/WebGL.js +113 -0
  35. package/examples/jsm/capabilities/WebGPU.js +59 -0
  36. package/examples/jsm/controls/ArcballControls.js +3536 -0
  37. package/examples/jsm/controls/DragControls.js +452 -0
  38. package/examples/jsm/controls/FirstPersonControls.js +447 -0
  39. package/examples/jsm/controls/FlyControls.js +380 -0
  40. package/examples/jsm/controls/MapControls.js +62 -0
  41. package/examples/jsm/controls/OrbitControls.js +1860 -0
  42. package/examples/jsm/controls/PointerLockControls.js +264 -0
  43. package/examples/jsm/controls/TrackballControls.js +1001 -0
  44. package/examples/jsm/controls/TransformControls.js +1918 -0
  45. package/examples/jsm/csm/CSM.js +597 -0
  46. package/examples/jsm/csm/CSMFrustum.js +209 -0
  47. package/examples/jsm/csm/CSMHelper.js +243 -0
  48. package/examples/jsm/csm/CSMShader.js +307 -0
  49. package/examples/jsm/csm/CSMShadowNode.js +599 -0
  50. package/examples/jsm/curves/CurveExtras.js +694 -0
  51. package/examples/jsm/curves/NURBSCurve.js +155 -0
  52. package/examples/jsm/curves/NURBSSurface.js +98 -0
  53. package/examples/jsm/curves/NURBSUtils.js +532 -0
  54. package/examples/jsm/curves/NURBSVolume.js +82 -0
  55. package/examples/jsm/effects/AnaglyphEffect.js +179 -0
  56. package/examples/jsm/effects/AsciiEffect.js +310 -0
  57. package/examples/jsm/effects/OutlineEffect.js +489 -0
  58. package/examples/jsm/effects/ParallaxBarrierEffect.js +155 -0
  59. package/examples/jsm/effects/StereoEffect.js +91 -0
  60. package/examples/jsm/environments/DebugEnvironment.js +102 -0
  61. package/examples/jsm/environments/RoomEnvironment.js +182 -0
  62. package/examples/jsm/exporters/DRACOExporter.js +311 -0
  63. package/examples/jsm/exporters/EXRExporter.js +618 -0
  64. package/examples/jsm/exporters/GLTFExporter.js +3595 -0
  65. package/examples/jsm/exporters/KTX2Exporter.js +347 -0
  66. package/examples/jsm/exporters/OBJExporter.js +308 -0
  67. package/examples/jsm/exporters/PLYExporter.js +562 -0
  68. package/examples/jsm/exporters/STLExporter.js +221 -0
  69. package/examples/jsm/exporters/USDZExporter.js +1228 -0
  70. package/examples/jsm/geometries/BoxLineGeometry.js +92 -0
  71. package/examples/jsm/geometries/ConvexGeometry.js +72 -0
  72. package/examples/jsm/geometries/DecalGeometry.js +420 -0
  73. package/examples/jsm/geometries/ParametricFunctions.js +100 -0
  74. package/examples/jsm/geometries/ParametricGeometry.js +172 -0
  75. package/examples/jsm/geometries/RoundedBoxGeometry.js +216 -0
  76. package/examples/jsm/geometries/TeapotGeometry.js +689 -0
  77. package/examples/jsm/geometries/TextGeometry.js +83 -0
  78. package/examples/jsm/helpers/LightProbeHelper.js +165 -0
  79. package/examples/jsm/helpers/LightProbeHelperGPU.js +102 -0
  80. package/examples/jsm/helpers/OctreeHelper.js +109 -0
  81. package/examples/jsm/helpers/PositionalAudioHelper.js +169 -0
  82. package/examples/jsm/helpers/RapierHelper.js +59 -0
  83. package/examples/jsm/helpers/RectAreaLightHelper.js +118 -0
  84. package/examples/jsm/helpers/TextureHelper.js +265 -0
  85. package/examples/jsm/helpers/TextureHelperGPU.js +214 -0
  86. package/examples/jsm/helpers/VertexNormalsHelper.js +155 -0
  87. package/examples/jsm/helpers/VertexTangentsHelper.js +133 -0
  88. package/examples/jsm/helpers/ViewHelper.js +422 -0
  89. package/examples/jsm/interactive/HTMLMesh.js +605 -0
  90. package/examples/jsm/interactive/InteractiveGroup.js +224 -0
  91. package/examples/jsm/interactive/SelectionBox.js +294 -0
  92. package/examples/jsm/interactive/SelectionHelper.js +150 -0
  93. package/examples/jsm/libs/ammo.wasm.js +822 -0
  94. package/examples/jsm/libs/ammo.wasm.wasm +0 -0
  95. package/examples/jsm/libs/basis/README.md +46 -0
  96. package/examples/jsm/libs/basis/basis_transcoder.js +19 -0
  97. package/examples/jsm/libs/basis/basis_transcoder.wasm +0 -0
  98. package/examples/jsm/libs/chevrotain.module.min.js +141 -0
  99. package/examples/jsm/libs/demuxer_mp4.js +109 -0
  100. package/examples/jsm/libs/draco/README.md +32 -0
  101. package/examples/jsm/libs/draco/draco_decoder.js +34 -0
  102. package/examples/jsm/libs/draco/draco_decoder.wasm +0 -0
  103. package/examples/jsm/libs/draco/draco_encoder.js +33 -0
  104. package/examples/jsm/libs/draco/draco_wasm_wrapper.js +117 -0
  105. package/examples/jsm/libs/draco/gltf/draco_decoder.js +33 -0
  106. package/examples/jsm/libs/draco/gltf/draco_decoder.wasm +0 -0
  107. package/examples/jsm/libs/draco/gltf/draco_encoder.js +33 -0
  108. package/examples/jsm/libs/draco/gltf/draco_wasm_wrapper.js +116 -0
  109. package/examples/jsm/libs/ecsy.module.js +1792 -0
  110. package/examples/jsm/libs/fflate.module.js +2672 -0
  111. package/examples/jsm/libs/ktx-parse.module.js +1 -0
  112. package/examples/jsm/libs/lil-gui.module.min.js +8 -0
  113. package/examples/jsm/libs/lottie_canvas.module.js +14849 -0
  114. package/examples/jsm/libs/meshopt_decoder.module.js +195 -0
  115. package/examples/jsm/libs/mikktspace.module.js +128 -0
  116. package/examples/jsm/libs/motion-controllers.module.js +397 -0
  117. package/examples/jsm/libs/opentype.module.js +14506 -0
  118. package/examples/jsm/libs/potpack.module.js +125 -0
  119. package/examples/jsm/libs/rhino3dm/rhino3dm.js +21 -0
  120. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +16 -0
  121. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  122. package/examples/jsm/libs/stats.module.js +167 -0
  123. package/examples/jsm/libs/surfaceNet.js +201 -0
  124. package/examples/jsm/libs/tween.module.js +876 -0
  125. package/examples/jsm/libs/utif.module.js +1665 -0
  126. package/examples/jsm/libs/zstddec.module.js +1 -0
  127. package/examples/jsm/lighting/TiledLighting.js +42 -0
  128. package/examples/jsm/lights/LightProbeGenerator.js +337 -0
  129. package/examples/jsm/lights/RectAreaLightTexturesLib.js +127 -0
  130. package/examples/jsm/lights/RectAreaLightUniformsLib.js +40 -0
  131. package/examples/jsm/lines/Line2.js +56 -0
  132. package/examples/jsm/lines/LineGeometry.js +157 -0
  133. package/examples/jsm/lines/LineMaterial.js +697 -0
  134. package/examples/jsm/lines/LineSegments2.js +426 -0
  135. package/examples/jsm/lines/LineSegmentsGeometry.js +298 -0
  136. package/examples/jsm/lines/Wireframe.js +108 -0
  137. package/examples/jsm/lines/WireframeGeometry2.js +49 -0
  138. package/examples/jsm/lines/webgpu/Line2.js +46 -0
  139. package/examples/jsm/lines/webgpu/LineSegments2.js +411 -0
  140. package/examples/jsm/lines/webgpu/Wireframe.js +86 -0
  141. package/examples/jsm/loaders/3DMLoader.js +1835 -0
  142. package/examples/jsm/loaders/3MFLoader.js +1621 -0
  143. package/examples/jsm/loaders/AMFLoader.js +541 -0
  144. package/examples/jsm/loaders/BVHLoader.js +484 -0
  145. package/examples/jsm/loaders/ColladaLoader.js +4155 -0
  146. package/examples/jsm/loaders/DDSLoader.js +385 -0
  147. package/examples/jsm/loaders/DRACOLoader.js +688 -0
  148. package/examples/jsm/loaders/EXRLoader.js +2784 -0
  149. package/examples/jsm/loaders/FBXLoader.js +4382 -0
  150. package/examples/jsm/loaders/FontLoader.js +242 -0
  151. package/examples/jsm/loaders/GCodeLoader.js +292 -0
  152. package/examples/jsm/loaders/GLTFLoader.js +4890 -0
  153. package/examples/jsm/loaders/HDRCubeTextureLoader.js +164 -0
  154. package/examples/jsm/loaders/HDRLoader.js +486 -0
  155. package/examples/jsm/loaders/IESLoader.js +379 -0
  156. package/examples/jsm/loaders/KMZLoader.js +163 -0
  157. package/examples/jsm/loaders/KTX2Loader.js +1228 -0
  158. package/examples/jsm/loaders/KTXLoader.js +197 -0
  159. package/examples/jsm/loaders/LDrawLoader.js +2519 -0
  160. package/examples/jsm/loaders/LUT3dlLoader.js +205 -0
  161. package/examples/jsm/loaders/LUTCubeLoader.js +190 -0
  162. package/examples/jsm/loaders/LUTImageLoader.js +190 -0
  163. package/examples/jsm/loaders/LWOLoader.js +1079 -0
  164. package/examples/jsm/loaders/LottieLoader.js +130 -0
  165. package/examples/jsm/loaders/MD2Loader.js +435 -0
  166. package/examples/jsm/loaders/MDDLoader.js +147 -0
  167. package/examples/jsm/loaders/MTLLoader.js +593 -0
  168. package/examples/jsm/loaders/MaterialXLoader.js +1087 -0
  169. package/examples/jsm/loaders/NRRDLoader.js +718 -0
  170. package/examples/jsm/loaders/OBJLoader.js +955 -0
  171. package/examples/jsm/loaders/PCDLoader.js +618 -0
  172. package/examples/jsm/loaders/PDBLoader.js +272 -0
  173. package/examples/jsm/loaders/PLYLoader.js +805 -0
  174. package/examples/jsm/loaders/PVRLoader.js +270 -0
  175. package/examples/jsm/loaders/RGBELoader.js +18 -0
  176. package/examples/jsm/loaders/STLLoader.js +421 -0
  177. package/examples/jsm/loaders/SVGLoader.js +3267 -0
  178. package/examples/jsm/loaders/TDSLoader.js +1144 -0
  179. package/examples/jsm/loaders/TGALoader.js +540 -0
  180. package/examples/jsm/loaders/TIFFLoader.js +59 -0
  181. package/examples/jsm/loaders/TTFLoader.js +261 -0
  182. package/examples/jsm/loaders/USDLoader.js +219 -0
  183. package/examples/jsm/loaders/USDZLoader.js +16 -0
  184. package/examples/jsm/loaders/UltraHDRLoader.js +630 -0
  185. package/examples/jsm/loaders/VOXLoader.js +376 -0
  186. package/examples/jsm/loaders/VRMLLoader.js +3569 -0
  187. package/examples/jsm/loaders/VTKLoader.js +1276 -0
  188. package/examples/jsm/loaders/XYZLoader.js +143 -0
  189. package/examples/jsm/loaders/lwo/IFFParser.js +1217 -0
  190. package/examples/jsm/loaders/lwo/LWO2Parser.js +414 -0
  191. package/examples/jsm/loaders/lwo/LWO3Parser.js +373 -0
  192. package/examples/jsm/loaders/usd/USDAParser.js +741 -0
  193. package/examples/jsm/loaders/usd/USDCParser.js +17 -0
  194. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +183 -0
  195. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +154 -0
  196. package/examples/jsm/materials/MeshGouraudMaterial.js +434 -0
  197. package/examples/jsm/materials/MeshPostProcessingMaterial.js +167 -0
  198. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  199. package/examples/jsm/math/Capsule.js +159 -0
  200. package/examples/jsm/math/ColorConverter.js +58 -0
  201. package/examples/jsm/math/ColorSpaces.js +147 -0
  202. package/examples/jsm/math/ConvexHull.js +1695 -0
  203. package/examples/jsm/math/ImprovedNoise.js +88 -0
  204. package/examples/jsm/math/Lut.js +317 -0
  205. package/examples/jsm/math/MeshSurfaceSampler.js +315 -0
  206. package/examples/jsm/math/OBB.js +535 -0
  207. package/examples/jsm/math/Octree.js +692 -0
  208. package/examples/jsm/math/SimplexNoise.js +470 -0
  209. package/examples/jsm/misc/ConvexObjectBreaker.js +539 -0
  210. package/examples/jsm/misc/GPUComputationRenderer.js +506 -0
  211. package/examples/jsm/misc/Gyroscope.js +78 -0
  212. package/examples/jsm/misc/MD2Character.js +391 -0
  213. package/examples/jsm/misc/MD2CharacterComplex.js +740 -0
  214. package/examples/jsm/misc/MorphAnimMesh.js +119 -0
  215. package/examples/jsm/misc/MorphBlendMesh.js +425 -0
  216. package/examples/jsm/misc/ProgressiveLightMap.js +370 -0
  217. package/examples/jsm/misc/ProgressiveLightMapGPU.js +322 -0
  218. package/examples/jsm/misc/RollerCoaster.js +623 -0
  219. package/examples/jsm/misc/TubePainter.js +256 -0
  220. package/examples/jsm/misc/Volume.js +521 -0
  221. package/examples/jsm/misc/VolumeSlice.js +276 -0
  222. package/examples/jsm/modifiers/CurveModifier.js +374 -0
  223. package/examples/jsm/modifiers/CurveModifierGPU.js +256 -0
  224. package/examples/jsm/modifiers/EdgeSplitModifier.js +299 -0
  225. package/examples/jsm/modifiers/SimplifyModifier.js +632 -0
  226. package/examples/jsm/modifiers/TessellateModifier.js +340 -0
  227. package/examples/jsm/objects/GroundedSkybox.js +69 -0
  228. package/examples/jsm/objects/Lensflare.js +489 -0
  229. package/examples/jsm/objects/LensflareMesh.js +376 -0
  230. package/examples/jsm/objects/MarchingCubes.js +1261 -0
  231. package/examples/jsm/objects/Reflector.js +338 -0
  232. package/examples/jsm/objects/ReflectorForSSRPass.js +393 -0
  233. package/examples/jsm/objects/Refractor.js +389 -0
  234. package/examples/jsm/objects/ShadowMesh.js +130 -0
  235. package/examples/jsm/objects/Sky.js +237 -0
  236. package/examples/jsm/objects/SkyMesh.js +243 -0
  237. package/examples/jsm/objects/Water.js +373 -0
  238. package/examples/jsm/objects/Water2.js +401 -0
  239. package/examples/jsm/objects/Water2Mesh.js +199 -0
  240. package/examples/jsm/objects/WaterMesh.js +196 -0
  241. package/examples/jsm/offscreen/jank.js +45 -0
  242. package/examples/jsm/offscreen/offscreen.js +8 -0
  243. package/examples/jsm/offscreen/scene.js +86 -0
  244. package/examples/jsm/physics/AmmoPhysics.js +354 -0
  245. package/examples/jsm/physics/JoltPhysics.js +330 -0
  246. package/examples/jsm/physics/RapierPhysics.js +432 -0
  247. package/examples/jsm/postprocessing/AfterimagePass.js +185 -0
  248. package/examples/jsm/postprocessing/BloomPass.js +274 -0
  249. package/examples/jsm/postprocessing/BokehPass.js +218 -0
  250. package/examples/jsm/postprocessing/ClearPass.js +97 -0
  251. package/examples/jsm/postprocessing/CubeTexturePass.js +146 -0
  252. package/examples/jsm/postprocessing/DotScreenPass.js +114 -0
  253. package/examples/jsm/postprocessing/EffectComposer.js +363 -0
  254. package/examples/jsm/postprocessing/FXAAPass.js +40 -0
  255. package/examples/jsm/postprocessing/FilmPass.js +113 -0
  256. package/examples/jsm/postprocessing/GTAOPass.js +727 -0
  257. package/examples/jsm/postprocessing/GlitchPass.js +177 -0
  258. package/examples/jsm/postprocessing/HalftonePass.js +134 -0
  259. package/examples/jsm/postprocessing/LUTPass.js +138 -0
  260. package/examples/jsm/postprocessing/MaskPass.js +195 -0
  261. package/examples/jsm/postprocessing/OutlinePass.js +776 -0
  262. package/examples/jsm/postprocessing/OutputPass.js +139 -0
  263. package/examples/jsm/postprocessing/Pass.js +191 -0
  264. package/examples/jsm/postprocessing/RenderPass.js +183 -0
  265. package/examples/jsm/postprocessing/RenderPixelatedPass.js +314 -0
  266. package/examples/jsm/postprocessing/RenderTransitionPass.js +267 -0
  267. package/examples/jsm/postprocessing/SAOPass.js +407 -0
  268. package/examples/jsm/postprocessing/SMAAPass.js +230 -0
  269. package/examples/jsm/postprocessing/SSAARenderPass.js +313 -0
  270. package/examples/jsm/postprocessing/SSAOPass.js +527 -0
  271. package/examples/jsm/postprocessing/SSRPass.js +856 -0
  272. package/examples/jsm/postprocessing/SavePass.js +132 -0
  273. package/examples/jsm/postprocessing/ShaderPass.js +135 -0
  274. package/examples/jsm/postprocessing/TAARenderPass.js +243 -0
  275. package/examples/jsm/postprocessing/TexturePass.js +131 -0
  276. package/examples/jsm/postprocessing/UnrealBloomPass.js +492 -0
  277. package/examples/jsm/renderers/CSS2DRenderer.js +317 -0
  278. package/examples/jsm/renderers/CSS3DRenderer.js +453 -0
  279. package/examples/jsm/renderers/Projector.js +936 -0
  280. package/examples/jsm/renderers/SVGRenderer.js +685 -0
  281. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +96 -0
  282. package/examples/jsm/shaders/AfterimageShader.js +63 -0
  283. package/examples/jsm/shaders/BasicShader.js +36 -0
  284. package/examples/jsm/shaders/BleachBypassShader.js +68 -0
  285. package/examples/jsm/shaders/BlendShader.js +56 -0
  286. package/examples/jsm/shaders/BokehShader.js +151 -0
  287. package/examples/jsm/shaders/BokehShader2.js +404 -0
  288. package/examples/jsm/shaders/BrightnessContrastShader.js +62 -0
  289. package/examples/jsm/shaders/ColorCorrectionShader.js +59 -0
  290. package/examples/jsm/shaders/ColorifyShader.js +57 -0
  291. package/examples/jsm/shaders/ConvolutionShader.js +74 -0
  292. package/examples/jsm/shaders/CopyShader.js +52 -0
  293. package/examples/jsm/shaders/DOFMipMapShader.js +63 -0
  294. package/examples/jsm/shaders/DepthLimitedBlurShader.js +180 -0
  295. package/examples/jsm/shaders/DigitalGlitch.js +104 -0
  296. package/examples/jsm/shaders/DotScreenShader.js +75 -0
  297. package/examples/jsm/shaders/ExposureShader.js +51 -0
  298. package/examples/jsm/shaders/FXAAShader.js +298 -0
  299. package/examples/jsm/shaders/FilmShader.js +72 -0
  300. package/examples/jsm/shaders/FocusShader.js +94 -0
  301. package/examples/jsm/shaders/FreiChenShader.js +103 -0
  302. package/examples/jsm/shaders/GTAOShader.js +421 -0
  303. package/examples/jsm/shaders/GammaCorrectionShader.js +52 -0
  304. package/examples/jsm/shaders/GodRaysShader.js +333 -0
  305. package/examples/jsm/shaders/HalftoneShader.js +321 -0
  306. package/examples/jsm/shaders/HorizontalBlurShader.js +68 -0
  307. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +70 -0
  308. package/examples/jsm/shaders/HueSaturationShader.js +74 -0
  309. package/examples/jsm/shaders/KaleidoShader.js +65 -0
  310. package/examples/jsm/shaders/LuminosityHighPassShader.js +68 -0
  311. package/examples/jsm/shaders/LuminosityShader.js +54 -0
  312. package/examples/jsm/shaders/MirrorShader.js +62 -0
  313. package/examples/jsm/shaders/NormalMapShader.js +60 -0
  314. package/examples/jsm/shaders/OutputShader.js +103 -0
  315. package/examples/jsm/shaders/PoissonDenoiseShader.js +235 -0
  316. package/examples/jsm/shaders/RGBShiftShader.js +61 -0
  317. package/examples/jsm/shaders/SAOShader.js +188 -0
  318. package/examples/jsm/shaders/SMAAShader.js +489 -0
  319. package/examples/jsm/shaders/SSAOShader.js +321 -0
  320. package/examples/jsm/shaders/SSRShader.js +395 -0
  321. package/examples/jsm/shaders/SepiaShader.js +57 -0
  322. package/examples/jsm/shaders/SobelOperatorShader.js +98 -0
  323. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +95 -0
  324. package/examples/jsm/shaders/TechnicolorShader.js +51 -0
  325. package/examples/jsm/shaders/ToonShader.js +349 -0
  326. package/examples/jsm/shaders/TriangleBlurShader.js +79 -0
  327. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +62 -0
  328. package/examples/jsm/shaders/VelocityShader.js +137 -0
  329. package/examples/jsm/shaders/VerticalBlurShader.js +66 -0
  330. package/examples/jsm/shaders/VerticalTiltShiftShader.js +70 -0
  331. package/examples/jsm/shaders/VignetteShader.js +56 -0
  332. package/examples/jsm/shaders/VolumeShader.js +298 -0
  333. package/examples/jsm/shaders/WaterRefractionShader.js +106 -0
  334. package/examples/jsm/textures/FlakesTexture.js +54 -0
  335. package/examples/jsm/textures/IESTexture.js +101 -0
  336. package/examples/jsm/transpiler/AST.js +631 -0
  337. package/examples/jsm/transpiler/GLSLDecoder.js +1171 -0
  338. package/examples/jsm/transpiler/Linker.js +327 -0
  339. package/examples/jsm/transpiler/ShaderToyDecoder.js +49 -0
  340. package/examples/jsm/transpiler/TSLEncoder.js +933 -0
  341. package/examples/jsm/transpiler/Transpiler.js +67 -0
  342. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  343. package/examples/jsm/transpiler/WGSLEncoder.js +812 -0
  344. package/examples/jsm/tsl/display/AfterImageNode.js +242 -0
  345. package/examples/jsm/tsl/display/AnaglyphPassNode.js +107 -0
  346. package/examples/jsm/tsl/display/AnamorphicNode.js +281 -0
  347. package/examples/jsm/tsl/display/BleachBypass.js +33 -0
  348. package/examples/jsm/tsl/display/BloomNode.js +520 -0
  349. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +207 -0
  350. package/examples/jsm/tsl/display/DenoiseNode.js +332 -0
  351. package/examples/jsm/tsl/display/DepthOfFieldNode.js +547 -0
  352. package/examples/jsm/tsl/display/DotScreenNode.js +104 -0
  353. package/examples/jsm/tsl/display/FXAANode.js +365 -0
  354. package/examples/jsm/tsl/display/FilmNode.js +101 -0
  355. package/examples/jsm/tsl/display/GTAONode.js +530 -0
  356. package/examples/jsm/tsl/display/GaussianBlurNode.js +378 -0
  357. package/examples/jsm/tsl/display/LensflareNode.js +279 -0
  358. package/examples/jsm/tsl/display/Lut3DNode.js +109 -0
  359. package/examples/jsm/tsl/display/MotionBlur.js +33 -0
  360. package/examples/jsm/tsl/display/OutlineNode.js +751 -0
  361. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +89 -0
  362. package/examples/jsm/tsl/display/PixelationPassNode.js +334 -0
  363. package/examples/jsm/tsl/display/RGBShiftNode.js +96 -0
  364. package/examples/jsm/tsl/display/SMAANode.js +768 -0
  365. package/examples/jsm/tsl/display/SSAAPassNode.js +358 -0
  366. package/examples/jsm/tsl/display/SSGINode.js +650 -0
  367. package/examples/jsm/tsl/display/SSRNode.js +654 -0
  368. package/examples/jsm/tsl/display/Sepia.js +24 -0
  369. package/examples/jsm/tsl/display/SobelOperatorNode.js +168 -0
  370. package/examples/jsm/tsl/display/StereoCompositePassNode.js +185 -0
  371. package/examples/jsm/tsl/display/StereoPassNode.js +120 -0
  372. package/examples/jsm/tsl/display/TRAANode.js +461 -0
  373. package/examples/jsm/tsl/display/TransitionNode.js +141 -0
  374. package/examples/jsm/tsl/display/boxBlur.js +64 -0
  375. package/examples/jsm/tsl/display/hashBlur.js +53 -0
  376. package/examples/jsm/tsl/lighting/TiledLightsNode.js +422 -0
  377. package/examples/jsm/tsl/math/Bayer.js +34 -0
  378. package/examples/jsm/tsl/shadows/TileShadowNode.js +456 -0
  379. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +212 -0
  380. package/examples/jsm/tsl/utils/Raymarching.js +70 -0
  381. package/examples/jsm/utils/BufferGeometryUtils.js +1435 -0
  382. package/examples/jsm/utils/CameraUtils.js +82 -0
  383. package/examples/jsm/utils/GeometryCompressionUtils.js +547 -0
  384. package/examples/jsm/utils/GeometryUtils.js +226 -0
  385. package/examples/jsm/utils/LDrawUtils.js +211 -0
  386. package/examples/jsm/utils/SceneOptimizer.js +458 -0
  387. package/examples/jsm/utils/SceneUtils.js +363 -0
  388. package/examples/jsm/utils/ShadowMapViewer.js +230 -0
  389. package/examples/jsm/utils/ShadowMapViewerGPU.js +233 -0
  390. package/examples/jsm/utils/SkeletonUtils.js +490 -0
  391. package/examples/jsm/utils/SortUtils.js +175 -0
  392. package/examples/jsm/utils/UVsDebug.js +173 -0
  393. package/examples/jsm/utils/WebGLTextureUtils.js +115 -0
  394. package/examples/jsm/utils/WebGPUTextureUtils.js +81 -0
  395. package/examples/jsm/utils/WorkerPool.js +167 -0
  396. package/examples/jsm/webxr/ARButton.js +251 -0
  397. package/examples/jsm/webxr/OculusHandModel.js +194 -0
  398. package/examples/jsm/webxr/OculusHandPointerModel.js +539 -0
  399. package/examples/jsm/webxr/Text2D.js +52 -0
  400. package/examples/jsm/webxr/VRButton.js +264 -0
  401. package/examples/jsm/webxr/XRButton.js +246 -0
  402. package/examples/jsm/webxr/XRControllerModelFactory.js +403 -0
  403. package/examples/jsm/webxr/XREstimatedLight.js +254 -0
  404. package/examples/jsm/webxr/XRHandMeshModel.js +151 -0
  405. package/examples/jsm/webxr/XRHandModelFactory.js +197 -0
  406. package/examples/jsm/webxr/XRHandPrimitiveModel.js +147 -0
  407. package/examples/jsm/webxr/XRPlanes.js +118 -0
  408. package/package.json +134 -0
  409. package/src/Three.Core.js +185 -0
  410. package/src/Three.Legacy.js +0 -0
  411. package/src/Three.TSL.js +629 -0
  412. package/src/Three.WebGPU.Nodes.js +24 -0
  413. package/src/Three.WebGPU.js +26 -0
  414. package/src/Three.js +9 -0
  415. package/src/animation/AnimationAction.js +932 -0
  416. package/src/animation/AnimationClip.js +628 -0
  417. package/src/animation/AnimationMixer.js +854 -0
  418. package/src/animation/AnimationObjectGroup.js +411 -0
  419. package/src/animation/AnimationUtils.js +506 -0
  420. package/src/animation/KeyframeTrack.js +597 -0
  421. package/src/animation/PropertyBinding.js +794 -0
  422. package/src/animation/PropertyMixer.js +385 -0
  423. package/src/animation/tracks/BooleanKeyframeTrack.js +55 -0
  424. package/src/animation/tracks/ColorKeyframeTrack.js +36 -0
  425. package/src/animation/tracks/NumberKeyframeTrack.js +36 -0
  426. package/src/animation/tracks/QuaternionKeyframeTrack.js +51 -0
  427. package/src/animation/tracks/StringKeyframeTrack.js +55 -0
  428. package/src/animation/tracks/VectorKeyframeTrack.js +36 -0
  429. package/src/audio/Audio.js +778 -0
  430. package/src/audio/AudioAnalyser.js +97 -0
  431. package/src/audio/AudioContext.js +40 -0
  432. package/src/audio/AudioListener.js +216 -0
  433. package/src/audio/PositionalAudio.js +253 -0
  434. package/src/cameras/ArrayCamera.js +54 -0
  435. package/src/cameras/Camera.js +130 -0
  436. package/src/cameras/CubeCamera.js +239 -0
  437. package/src/cameras/OrthographicCamera.js +245 -0
  438. package/src/cameras/PerspectiveCamera.js +407 -0
  439. package/src/cameras/StereoCamera.js +146 -0
  440. package/src/constants.js +1675 -0
  441. package/src/core/BufferAttribute.js +1044 -0
  442. package/src/core/BufferGeometry.js +1446 -0
  443. package/src/core/Clock.js +128 -0
  444. package/src/core/EventDispatcher.js +131 -0
  445. package/src/core/GLBufferAttribute.js +171 -0
  446. package/src/core/InstancedBufferAttribute.js +68 -0
  447. package/src/core/InstancedBufferGeometry.js +60 -0
  448. package/src/core/InstancedInterleavedBuffer.js +74 -0
  449. package/src/core/InterleavedBuffer.js +291 -0
  450. package/src/core/InterleavedBufferAttribute.js +549 -0
  451. package/src/core/Layers.js +121 -0
  452. package/src/core/Object3D.js +1619 -0
  453. package/src/core/Raycaster.js +262 -0
  454. package/src/core/RenderTarget.js +392 -0
  455. package/src/core/RenderTarget3D.js +48 -0
  456. package/src/core/Timer.js +184 -0
  457. package/src/core/Uniform.js +46 -0
  458. package/src/core/UniformsGroup.js +180 -0
  459. package/src/extras/Controls.js +120 -0
  460. package/src/extras/DataUtils.js +217 -0
  461. package/src/extras/Earcut.js +22 -0
  462. package/src/extras/ImageUtils.js +137 -0
  463. package/src/extras/PMREMGenerator.js +966 -0
  464. package/src/extras/ShapeUtils.js +114 -0
  465. package/src/extras/TextureUtils.js +293 -0
  466. package/src/extras/core/Curve.js +517 -0
  467. package/src/extras/core/CurvePath.js +296 -0
  468. package/src/extras/core/Interpolations.js +105 -0
  469. package/src/extras/core/Path.js +329 -0
  470. package/src/extras/core/Shape.js +165 -0
  471. package/src/extras/core/ShapePath.js +367 -0
  472. package/src/extras/curves/ArcCurve.js +39 -0
  473. package/src/extras/curves/CatmullRomCurve3.js +326 -0
  474. package/src/extras/curves/CubicBezierCurve.js +145 -0
  475. package/src/extras/curves/CubicBezierCurve3.js +129 -0
  476. package/src/extras/curves/Curves.js +10 -0
  477. package/src/extras/curves/EllipseCurve.js +258 -0
  478. package/src/extras/curves/LineCurve.js +128 -0
  479. package/src/extras/curves/LineCurve3.js +128 -0
  480. package/src/extras/curves/QuadraticBezierCurve.js +133 -0
  481. package/src/extras/curves/QuadraticBezierCurve3.js +118 -0
  482. package/src/extras/curves/SplineCurve.js +145 -0
  483. package/src/extras/lib/earcut.js +685 -0
  484. package/src/geometries/BoxGeometry.js +218 -0
  485. package/src/geometries/CapsuleGeometry.js +217 -0
  486. package/src/geometries/CircleGeometry.js +141 -0
  487. package/src/geometries/ConeGeometry.js +69 -0
  488. package/src/geometries/CylinderGeometry.js +332 -0
  489. package/src/geometries/DodecahedronGeometry.js +98 -0
  490. package/src/geometries/EdgesGeometry.js +180 -0
  491. package/src/geometries/ExtrudeGeometry.js +909 -0
  492. package/src/geometries/Geometries.js +21 -0
  493. package/src/geometries/IcosahedronGeometry.js +74 -0
  494. package/src/geometries/LatheGeometry.js +229 -0
  495. package/src/geometries/OctahedronGeometry.js +69 -0
  496. package/src/geometries/PlaneGeometry.js +132 -0
  497. package/src/geometries/PolyhedronGeometry.js +348 -0
  498. package/src/geometries/RingGeometry.js +164 -0
  499. package/src/geometries/ShapeGeometry.js +232 -0
  500. package/src/geometries/SphereGeometry.js +174 -0
  501. package/src/geometries/TetrahedronGeometry.js +66 -0
  502. package/src/geometries/TorusGeometry.js +155 -0
  503. package/src/geometries/TorusKnotGeometry.js +205 -0
  504. package/src/geometries/TubeGeometry.js +252 -0
  505. package/src/geometries/WireframeGeometry.js +179 -0
  506. package/src/helpers/ArrowHelper.js +171 -0
  507. package/src/helpers/AxesHelper.js +96 -0
  508. package/src/helpers/Box3Helper.js +83 -0
  509. package/src/helpers/BoxHelper.js +149 -0
  510. package/src/helpers/CameraHelper.js +342 -0
  511. package/src/helpers/DirectionalLightHelper.js +145 -0
  512. package/src/helpers/GridHelper.js +82 -0
  513. package/src/helpers/HemisphereLightHelper.js +127 -0
  514. package/src/helpers/PlaneHelper.js +96 -0
  515. package/src/helpers/PointLightHelper.js +135 -0
  516. package/src/helpers/PolarGridHelper.js +126 -0
  517. package/src/helpers/SkeletonHelper.js +194 -0
  518. package/src/helpers/SpotLightHelper.js +151 -0
  519. package/src/lights/AmbientLight.js +42 -0
  520. package/src/lights/DirectionalLight.js +100 -0
  521. package/src/lights/DirectionalLightShadow.js +31 -0
  522. package/src/lights/HemisphereLight.js +66 -0
  523. package/src/lights/Light.js +95 -0
  524. package/src/lights/LightProbe.js +90 -0
  525. package/src/lights/LightShadow.js +338 -0
  526. package/src/lights/PointLight.js +116 -0
  527. package/src/lights/PointLightShadow.js +117 -0
  528. package/src/lights/RectAreaLight.js +115 -0
  529. package/src/lights/SpotLight.js +173 -0
  530. package/src/lights/SpotLightShadow.js +80 -0
  531. package/src/lights/webgpu/IESSpotLight.js +46 -0
  532. package/src/lights/webgpu/ProjectorLight.js +46 -0
  533. package/src/loaders/AnimationLoader.js +98 -0
  534. package/src/loaders/AudioLoader.js +98 -0
  535. package/src/loaders/BufferGeometryLoader.js +242 -0
  536. package/src/loaders/Cache.js +87 -0
  537. package/src/loaders/CompressedTextureLoader.js +167 -0
  538. package/src/loaders/CubeTextureLoader.js +103 -0
  539. package/src/loaders/DataTextureLoader.js +172 -0
  540. package/src/loaders/FileLoader.js +368 -0
  541. package/src/loaders/IESLoader.js +327 -0
  542. package/src/loaders/ImageBitmapLoader.js +220 -0
  543. package/src/loaders/ImageLoader.js +168 -0
  544. package/src/loaders/Loader.js +216 -0
  545. package/src/loaders/LoaderUtils.js +59 -0
  546. package/src/loaders/LoadingManager.js +307 -0
  547. package/src/loaders/MaterialLoader.js +438 -0
  548. package/src/loaders/ObjectLoader.js +1264 -0
  549. package/src/loaders/TextureLoader.js +74 -0
  550. package/src/loaders/nodes/NodeLoader.js +194 -0
  551. package/src/loaders/nodes/NodeMaterialLoader.js +108 -0
  552. package/src/loaders/nodes/NodeObjectLoader.js +151 -0
  553. package/src/materials/LineBasicMaterial.js +122 -0
  554. package/src/materials/LineDashedMaterial.js +86 -0
  555. package/src/materials/Material.js +1015 -0
  556. package/src/materials/Materials.js +39 -0
  557. package/src/materials/MeshBasicMaterial.js +249 -0
  558. package/src/materials/MeshDepthMaterial.js +147 -0
  559. package/src/materials/MeshDistanceMaterial.js +119 -0
  560. package/src/materials/MeshLambertMaterial.js +392 -0
  561. package/src/materials/MeshMatcapMaterial.js +223 -0
  562. package/src/materials/MeshNormalMaterial.js +174 -0
  563. package/src/materials/MeshPhongMaterial.js +411 -0
  564. package/src/materials/MeshPhysicalMaterial.js +535 -0
  565. package/src/materials/MeshStandardMaterial.js +424 -0
  566. package/src/materials/MeshToonMaterial.js +320 -0
  567. package/src/materials/PointsMaterial.js +139 -0
  568. package/src/materials/RawShaderMaterial.js +42 -0
  569. package/src/materials/ShaderMaterial.js +394 -0
  570. package/src/materials/ShadowMaterial.js +91 -0
  571. package/src/materials/SpriteMaterial.js +136 -0
  572. package/src/materials/nodes/Line2NodeMaterial.js +542 -0
  573. package/src/materials/nodes/LineBasicNodeMaterial.js +46 -0
  574. package/src/materials/nodes/LineDashedNodeMaterial.js +132 -0
  575. package/src/materials/nodes/MeshBasicNodeMaterial.js +134 -0
  576. package/src/materials/nodes/MeshLambertNodeMaterial.js +82 -0
  577. package/src/materials/nodes/MeshMatcapNodeMaterial.js +77 -0
  578. package/src/materials/nodes/MeshNormalNodeMaterial.js +67 -0
  579. package/src/materials/nodes/MeshPhongNodeMaterial.js +141 -0
  580. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +518 -0
  581. package/src/materials/nodes/MeshSSSNodeMaterial.js +175 -0
  582. package/src/materials/nodes/MeshStandardNodeMaterial.js +186 -0
  583. package/src/materials/nodes/MeshToonNodeMaterial.js +66 -0
  584. package/src/materials/nodes/NodeMaterial.js +1271 -0
  585. package/src/materials/nodes/NodeMaterials.js +21 -0
  586. package/src/materials/nodes/PointsNodeMaterial.js +211 -0
  587. package/src/materials/nodes/ShadowNodeMaterial.js +76 -0
  588. package/src/materials/nodes/SpriteNodeMaterial.js +186 -0
  589. package/src/materials/nodes/VolumeNodeMaterial.js +81 -0
  590. package/src/materials/nodes/manager/NodeMaterialObserver.js +612 -0
  591. package/src/math/Box2.js +381 -0
  592. package/src/math/Box3.js +805 -0
  593. package/src/math/Color.js +967 -0
  594. package/src/math/ColorManagement.js +215 -0
  595. package/src/math/Cylindrical.js +120 -0
  596. package/src/math/Euler.js +449 -0
  597. package/src/math/Frustum.js +285 -0
  598. package/src/math/FrustumArray.js +258 -0
  599. package/src/math/Interpolant.js +320 -0
  600. package/src/math/Line3.js +336 -0
  601. package/src/math/MathUtils.js +751 -0
  602. package/src/math/Matrix2.js +124 -0
  603. package/src/math/Matrix3.js +613 -0
  604. package/src/math/Matrix4.js +1301 -0
  605. package/src/math/Plane.js +367 -0
  606. package/src/math/Quaternion.js +943 -0
  607. package/src/math/Ray.js +655 -0
  608. package/src/math/Sphere.js +420 -0
  609. package/src/math/Spherical.js +147 -0
  610. package/src/math/SphericalHarmonics3.js +341 -0
  611. package/src/math/Triangle.js +539 -0
  612. package/src/math/Vector2.js +866 -0
  613. package/src/math/Vector3.js +1261 -0
  614. package/src/math/Vector4.js +1063 -0
  615. package/src/math/interpolants/CubicInterpolant.js +159 -0
  616. package/src/math/interpolants/DiscreteInterpolant.js +34 -0
  617. package/src/math/interpolants/LinearInterpolant.js +51 -0
  618. package/src/math/interpolants/QuaternionLinearInterpolant.js +48 -0
  619. package/src/nodes/Nodes.js +148 -0
  620. package/src/nodes/TSL.js +173 -0
  621. package/src/nodes/accessors/AccessorsUtils.js +53 -0
  622. package/src/nodes/accessors/Arrays.js +68 -0
  623. package/src/nodes/accessors/BatchNode.js +163 -0
  624. package/src/nodes/accessors/Bitangent.js +82 -0
  625. package/src/nodes/accessors/BufferAttributeNode.js +340 -0
  626. package/src/nodes/accessors/BufferNode.js +101 -0
  627. package/src/nodes/accessors/BuiltinNode.js +63 -0
  628. package/src/nodes/accessors/Camera.js +282 -0
  629. package/src/nodes/accessors/ClippingNode.js +255 -0
  630. package/src/nodes/accessors/CubeTextureNode.js +190 -0
  631. package/src/nodes/accessors/InstanceNode.js +244 -0
  632. package/src/nodes/accessors/InstancedMeshNode.js +50 -0
  633. package/src/nodes/accessors/Lights.js +129 -0
  634. package/src/nodes/accessors/MaterialNode.js +775 -0
  635. package/src/nodes/accessors/MaterialProperties.js +59 -0
  636. package/src/nodes/accessors/MaterialReferenceNode.js +85 -0
  637. package/src/nodes/accessors/ModelNode.js +184 -0
  638. package/src/nodes/accessors/ModelViewProjectionNode.js +13 -0
  639. package/src/nodes/accessors/MorphNode.js +310 -0
  640. package/src/nodes/accessors/Normal.js +243 -0
  641. package/src/nodes/accessors/Object3DNode.js +268 -0
  642. package/src/nodes/accessors/PointUVNode.js +55 -0
  643. package/src/nodes/accessors/Position.js +74 -0
  644. package/src/nodes/accessors/ReferenceBaseNode.js +357 -0
  645. package/src/nodes/accessors/ReferenceNode.js +424 -0
  646. package/src/nodes/accessors/ReflectVector.js +36 -0
  647. package/src/nodes/accessors/RendererReferenceNode.js +79 -0
  648. package/src/nodes/accessors/SceneNode.js +145 -0
  649. package/src/nodes/accessors/SkinningNode.js +327 -0
  650. package/src/nodes/accessors/StorageBufferNode.js +416 -0
  651. package/src/nodes/accessors/StorageTextureNode.js +242 -0
  652. package/src/nodes/accessors/Tangent.js +70 -0
  653. package/src/nodes/accessors/TangentUtils.js +46 -0
  654. package/src/nodes/accessors/Texture3DNode.js +199 -0
  655. package/src/nodes/accessors/TextureBicubic.js +92 -0
  656. package/src/nodes/accessors/TextureNode.js +894 -0
  657. package/src/nodes/accessors/TextureSizeNode.js +77 -0
  658. package/src/nodes/accessors/UV.js +11 -0
  659. package/src/nodes/accessors/UniformArrayNode.js +348 -0
  660. package/src/nodes/accessors/UserDataNode.js +77 -0
  661. package/src/nodes/accessors/VelocityNode.js +224 -0
  662. package/src/nodes/accessors/VertexColorNode.js +110 -0
  663. package/src/nodes/code/CodeNode.js +181 -0
  664. package/src/nodes/code/ExpressionNode.js +68 -0
  665. package/src/nodes/code/FunctionCallNode.js +187 -0
  666. package/src/nodes/code/FunctionNode.js +183 -0
  667. package/src/nodes/code/ScriptableNode.js +726 -0
  668. package/src/nodes/code/ScriptableValueNode.js +253 -0
  669. package/src/nodes/core/ArrayNode.js +154 -0
  670. package/src/nodes/core/AssignNode.js +202 -0
  671. package/src/nodes/core/AttributeNode.js +168 -0
  672. package/src/nodes/core/BypassNode.js +93 -0
  673. package/src/nodes/core/CacheNode.js +100 -0
  674. package/src/nodes/core/ConstNode.js +67 -0
  675. package/src/nodes/core/ContextNode.js +190 -0
  676. package/src/nodes/core/IndexNode.js +164 -0
  677. package/src/nodes/core/InputNode.js +136 -0
  678. package/src/nodes/core/LightingModel.js +77 -0
  679. package/src/nodes/core/MRTNode.js +150 -0
  680. package/src/nodes/core/Node.js +959 -0
  681. package/src/nodes/core/NodeAttribute.js +53 -0
  682. package/src/nodes/core/NodeBuilder.js +2968 -0
  683. package/src/nodes/core/NodeCache.js +75 -0
  684. package/src/nodes/core/NodeCode.js +46 -0
  685. package/src/nodes/core/NodeFrame.js +306 -0
  686. package/src/nodes/core/NodeFunction.js +69 -0
  687. package/src/nodes/core/NodeFunctionInput.js +61 -0
  688. package/src/nodes/core/NodeParser.js +23 -0
  689. package/src/nodes/core/NodeUniform.js +91 -0
  690. package/src/nodes/core/NodeUtils.js +480 -0
  691. package/src/nodes/core/NodeVar.js +60 -0
  692. package/src/nodes/core/NodeVarying.js +63 -0
  693. package/src/nodes/core/OutputStructNode.js +103 -0
  694. package/src/nodes/core/ParameterNode.js +94 -0
  695. package/src/nodes/core/PropertyNode.js +344 -0
  696. package/src/nodes/core/StackNode.js +376 -0
  697. package/src/nodes/core/StructNode.js +120 -0
  698. package/src/nodes/core/StructType.js +13 -0
  699. package/src/nodes/core/StructTypeNode.js +154 -0
  700. package/src/nodes/core/SubBuildNode.js +89 -0
  701. package/src/nodes/core/TempNode.js +88 -0
  702. package/src/nodes/core/UniformGroupNode.js +137 -0
  703. package/src/nodes/core/UniformNode.js +243 -0
  704. package/src/nodes/core/VarNode.js +284 -0
  705. package/src/nodes/core/VaryingNode.js +227 -0
  706. package/src/nodes/core/constants.js +68 -0
  707. package/src/nodes/display/BlendModes.js +235 -0
  708. package/src/nodes/display/BumpMapNode.js +117 -0
  709. package/src/nodes/display/ColorAdjustment.js +141 -0
  710. package/src/nodes/display/ColorSpaceFunctions.js +54 -0
  711. package/src/nodes/display/ColorSpaceNode.js +164 -0
  712. package/src/nodes/display/FrontFacingNode.js +102 -0
  713. package/src/nodes/display/NormalMapNode.js +118 -0
  714. package/src/nodes/display/PassNode.js +905 -0
  715. package/src/nodes/display/PosterizeNode.js +65 -0
  716. package/src/nodes/display/RenderOutputNode.js +124 -0
  717. package/src/nodes/display/ScreenNode.js +290 -0
  718. package/src/nodes/display/ToneMappingFunctions.js +242 -0
  719. package/src/nodes/display/ToneMappingNode.js +121 -0
  720. package/src/nodes/display/ToonOutlinePassNode.js +183 -0
  721. package/src/nodes/display/ViewportDepthNode.js +294 -0
  722. package/src/nodes/display/ViewportDepthTextureNode.js +67 -0
  723. package/src/nodes/display/ViewportSharedTextureNode.js +73 -0
  724. package/src/nodes/display/ViewportTextureNode.js +228 -0
  725. package/src/nodes/fog/Fog.js +114 -0
  726. package/src/nodes/functions/BSDF/BRDF_GGX.js +55 -0
  727. package/src/nodes/functions/BSDF/BRDF_Lambert.js +9 -0
  728. package/src/nodes/functions/BSDF/BRDF_Sheen.js +57 -0
  729. package/src/nodes/functions/BSDF/DFGApprox.js +30 -0
  730. package/src/nodes/functions/BSDF/D_GGX.js +23 -0
  731. package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +28 -0
  732. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +13 -0
  733. package/src/nodes/functions/BSDF/F_Schlick.js +16 -0
  734. package/src/nodes/functions/BSDF/LTC.js +175 -0
  735. package/src/nodes/functions/BSDF/Schlick_to_F0.js +21 -0
  736. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +26 -0
  737. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +29 -0
  738. package/src/nodes/functions/BasicLightingModel.js +100 -0
  739. package/src/nodes/functions/PhongLightingModel.js +99 -0
  740. package/src/nodes/functions/PhysicalLightingModel.js +796 -0
  741. package/src/nodes/functions/ShadowMaskModel.js +58 -0
  742. package/src/nodes/functions/ToonLightingModel.js +70 -0
  743. package/src/nodes/functions/VolumetricLightingModel.js +183 -0
  744. package/src/nodes/functions/material/getAlphaHashThreshold.js +68 -0
  745. package/src/nodes/functions/material/getGeometryRoughness.js +19 -0
  746. package/src/nodes/functions/material/getParallaxCorrectNormal.js +37 -0
  747. package/src/nodes/functions/material/getRoughness.js +18 -0
  748. package/src/nodes/functions/material/getShIrradianceAt.js +28 -0
  749. package/src/nodes/geometry/RangeNode.js +172 -0
  750. package/src/nodes/gpgpu/AtomicFunctionNode.js +274 -0
  751. package/src/nodes/gpgpu/BarrierNode.js +89 -0
  752. package/src/nodes/gpgpu/ComputeBuiltinNode.js +228 -0
  753. package/src/nodes/gpgpu/ComputeNode.js +273 -0
  754. package/src/nodes/gpgpu/SubgroupFunctionNode.js +430 -0
  755. package/src/nodes/gpgpu/WorkgroupInfoNode.js +234 -0
  756. package/src/nodes/lighting/AONode.js +45 -0
  757. package/src/nodes/lighting/AmbientLightNode.js +35 -0
  758. package/src/nodes/lighting/AnalyticLightNode.js +256 -0
  759. package/src/nodes/lighting/BasicEnvironmentNode.js +49 -0
  760. package/src/nodes/lighting/BasicLightMapNode.js +49 -0
  761. package/src/nodes/lighting/DirectionalLightNode.js +39 -0
  762. package/src/nodes/lighting/EnvironmentNode.js +153 -0
  763. package/src/nodes/lighting/HemisphereLightNode.js +87 -0
  764. package/src/nodes/lighting/IESSpotLightNode.js +49 -0
  765. package/src/nodes/lighting/IrradianceNode.js +44 -0
  766. package/src/nodes/lighting/LightProbeNode.js +73 -0
  767. package/src/nodes/lighting/LightUtils.js +25 -0
  768. package/src/nodes/lighting/LightingContextNode.js +115 -0
  769. package/src/nodes/lighting/LightingNode.js +36 -0
  770. package/src/nodes/lighting/LightsNode.js +455 -0
  771. package/src/nodes/lighting/PointLightNode.js +102 -0
  772. package/src/nodes/lighting/PointShadowNode.js +306 -0
  773. package/src/nodes/lighting/ProjectorLightNode.js +91 -0
  774. package/src/nodes/lighting/RectAreaLightNode.js +133 -0
  775. package/src/nodes/lighting/ShadowBaseNode.js +81 -0
  776. package/src/nodes/lighting/ShadowFilterNode.js +274 -0
  777. package/src/nodes/lighting/ShadowNode.js +745 -0
  778. package/src/nodes/lighting/SpotLightNode.js +168 -0
  779. package/src/nodes/materialx/DISCLAIMER.md +199 -0
  780. package/src/nodes/materialx/MaterialXNodes.js +197 -0
  781. package/src/nodes/materialx/lib/mx_hsv.js +127 -0
  782. package/src/nodes/materialx/lib/mx_noise.js +1491 -0
  783. package/src/nodes/materialx/lib/mx_transform_color.js +23 -0
  784. package/src/nodes/math/BitcastNode.js +156 -0
  785. package/src/nodes/math/ConditionalNode.js +245 -0
  786. package/src/nodes/math/Hash.js +21 -0
  787. package/src/nodes/math/MathNode.js +1167 -0
  788. package/src/nodes/math/MathUtils.js +54 -0
  789. package/src/nodes/math/OperatorNode.js +751 -0
  790. package/src/nodes/math/TriNoise3D.js +71 -0
  791. package/src/nodes/parsers/GLSLNodeFunction.js +168 -0
  792. package/src/nodes/parsers/GLSLNodeParser.js +25 -0
  793. package/src/nodes/pmrem/PMREMNode.js +397 -0
  794. package/src/nodes/pmrem/PMREMUtils.js +288 -0
  795. package/src/nodes/procedural/Checker.js +22 -0
  796. package/src/nodes/shapes/Shapes.js +33 -0
  797. package/src/nodes/tsl/TSLBase.js +35 -0
  798. package/src/nodes/tsl/TSLCore.js +1209 -0
  799. package/src/nodes/utils/ArrayElementNode.js +77 -0
  800. package/src/nodes/utils/ConvertNode.js +100 -0
  801. package/src/nodes/utils/CubeMapNode.js +237 -0
  802. package/src/nodes/utils/DebugNode.js +83 -0
  803. package/src/nodes/utils/Discard.js +24 -0
  804. package/src/nodes/utils/EquirectUV.js +27 -0
  805. package/src/nodes/utils/EventNode.js +83 -0
  806. package/src/nodes/utils/FlipNode.js +106 -0
  807. package/src/nodes/utils/FunctionOverloadingNode.js +152 -0
  808. package/src/nodes/utils/JoinNode.js +117 -0
  809. package/src/nodes/utils/LoopNode.js +354 -0
  810. package/src/nodes/utils/MatcapUV.js +22 -0
  811. package/src/nodes/utils/MaxMipLevelNode.js +103 -0
  812. package/src/nodes/utils/MemberNode.js +120 -0
  813. package/src/nodes/utils/Oscillators.js +41 -0
  814. package/src/nodes/utils/Packing.js +21 -0
  815. package/src/nodes/utils/PostProcessingUtils.js +95 -0
  816. package/src/nodes/utils/RTTNode.js +279 -0
  817. package/src/nodes/utils/ReflectorNode.js +623 -0
  818. package/src/nodes/utils/RemapNode.js +125 -0
  819. package/src/nodes/utils/RotateNode.js +103 -0
  820. package/src/nodes/utils/SampleNode.js +91 -0
  821. package/src/nodes/utils/SetNode.js +108 -0
  822. package/src/nodes/utils/SplitNode.js +179 -0
  823. package/src/nodes/utils/SpriteSheetUVNode.js +90 -0
  824. package/src/nodes/utils/SpriteUtils.js +63 -0
  825. package/src/nodes/utils/StorageArrayElementNode.js +143 -0
  826. package/src/nodes/utils/Timer.js +26 -0
  827. package/src/nodes/utils/TriplanarTextures.js +65 -0
  828. package/src/nodes/utils/UVUtils.js +39 -0
  829. package/src/nodes/utils/ViewportUtils.js +26 -0
  830. package/src/objects/BatchedMesh.js +1654 -0
  831. package/src/objects/Bone.js +41 -0
  832. package/src/objects/ClippingGroup.js +68 -0
  833. package/src/objects/Group.js +41 -0
  834. package/src/objects/InstancedMesh.js +395 -0
  835. package/src/objects/LOD.js +329 -0
  836. package/src/objects/Line.js +329 -0
  837. package/src/objects/LineLoop.js +37 -0
  838. package/src/objects/LineSegments.js +74 -0
  839. package/src/objects/Mesh.js +496 -0
  840. package/src/objects/Points.js +228 -0
  841. package/src/objects/Skeleton.js +383 -0
  842. package/src/objects/SkinnedMesh.js +352 -0
  843. package/src/objects/Sprite.js +245 -0
  844. package/src/renderers/WebGL3DRenderTarget.js +48 -0
  845. package/src/renderers/WebGLArrayRenderTarget.js +48 -0
  846. package/src/renderers/WebGLCubeRenderTarget.js +182 -0
  847. package/src/renderers/WebGLRenderTarget.js +34 -0
  848. package/src/renderers/WebGLRenderer.js +3508 -0
  849. package/src/renderers/common/Animation.js +147 -0
  850. package/src/renderers/common/Attributes.js +118 -0
  851. package/src/renderers/common/Backend.js +685 -0
  852. package/src/renderers/common/Background.js +212 -0
  853. package/src/renderers/common/BindGroup.js +61 -0
  854. package/src/renderers/common/Binding.js +60 -0
  855. package/src/renderers/common/Bindings.js +343 -0
  856. package/src/renderers/common/Buffer.js +87 -0
  857. package/src/renderers/common/BufferUtils.js +58 -0
  858. package/src/renderers/common/BundleGroup.js +83 -0
  859. package/src/renderers/common/ChainMap.js +98 -0
  860. package/src/renderers/common/ClippingContext.js +262 -0
  861. package/src/renderers/common/Color4.js +77 -0
  862. package/src/renderers/common/ComputePipeline.js +41 -0
  863. package/src/renderers/common/Constants.js +15 -0
  864. package/src/renderers/common/CubeRenderTarget.js +103 -0
  865. package/src/renderers/common/DataMap.js +90 -0
  866. package/src/renderers/common/Geometries.js +344 -0
  867. package/src/renderers/common/IndirectStorageBufferAttribute.js +38 -0
  868. package/src/renderers/common/Info.js +172 -0
  869. package/src/renderers/common/Lighting.js +73 -0
  870. package/src/renderers/common/Pipeline.js +35 -0
  871. package/src/renderers/common/Pipelines.js +465 -0
  872. package/src/renderers/common/PostProcessing.js +245 -0
  873. package/src/renderers/common/ProgrammableStage.js +78 -0
  874. package/src/renderers/common/QuadMesh.js +106 -0
  875. package/src/renderers/common/RenderBundle.js +24 -0
  876. package/src/renderers/common/RenderBundles.js +67 -0
  877. package/src/renderers/common/RenderContext.js +265 -0
  878. package/src/renderers/common/RenderContexts.js +116 -0
  879. package/src/renderers/common/RenderList.js +400 -0
  880. package/src/renderers/common/RenderLists.js +77 -0
  881. package/src/renderers/common/RenderObject.js +901 -0
  882. package/src/renderers/common/RenderObjects.js +202 -0
  883. package/src/renderers/common/RenderPipeline.js +40 -0
  884. package/src/renderers/common/Renderer.js +3125 -0
  885. package/src/renderers/common/RendererUtils.js +191 -0
  886. package/src/renderers/common/SampledTexture.js +144 -0
  887. package/src/renderers/common/Sampler.js +139 -0
  888. package/src/renderers/common/Storage3DTexture.js +100 -0
  889. package/src/renderers/common/StorageArrayTexture.js +84 -0
  890. package/src/renderers/common/StorageBuffer.js +41 -0
  891. package/src/renderers/common/StorageBufferAttribute.js +46 -0
  892. package/src/renderers/common/StorageInstancedBufferAttribute.js +46 -0
  893. package/src/renderers/common/StorageTexture.js +78 -0
  894. package/src/renderers/common/Textures.js +491 -0
  895. package/src/renderers/common/TimestampQueryPool.js +99 -0
  896. package/src/renderers/common/Uniform.js +367 -0
  897. package/src/renderers/common/UniformBuffer.js +34 -0
  898. package/src/renderers/common/UniformsGroup.js +487 -0
  899. package/src/renderers/common/XRManager.js +1676 -0
  900. package/src/renderers/common/XRRenderTarget.js +91 -0
  901. package/src/renderers/common/extras/PMREMGenerator.js +946 -0
  902. package/src/renderers/common/nodes/NodeBuilderState.js +152 -0
  903. package/src/renderers/common/nodes/NodeLibrary.js +196 -0
  904. package/src/renderers/common/nodes/NodeSampledTexture.js +140 -0
  905. package/src/renderers/common/nodes/NodeSampler.js +50 -0
  906. package/src/renderers/common/nodes/NodeStorageBuffer.js +61 -0
  907. package/src/renderers/common/nodes/NodeUniform.js +418 -0
  908. package/src/renderers/common/nodes/NodeUniformBuffer.js +53 -0
  909. package/src/renderers/common/nodes/NodeUniformsGroup.js +51 -0
  910. package/src/renderers/common/nodes/Nodes.js +819 -0
  911. package/src/renderers/shaders/ShaderChunk/alphahash_fragment.glsl.js +7 -0
  912. package/src/renderers/shaders/ShaderChunk/alphahash_pars_fragment.glsl.js +68 -0
  913. package/src/renderers/shaders/ShaderChunk/alphamap_fragment.glsl.js +7 -0
  914. package/src/renderers/shaders/ShaderChunk/alphamap_pars_fragment.glsl.js +7 -0
  915. package/src/renderers/shaders/ShaderChunk/alphatest_fragment.glsl.js +16 -0
  916. package/src/renderers/shaders/ShaderChunk/alphatest_pars_fragment.glsl.js +5 -0
  917. package/src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js +26 -0
  918. package/src/renderers/shaders/ShaderChunk/aomap_pars_fragment.glsl.js +8 -0
  919. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +49 -0
  920. package/src/renderers/shaders/ShaderChunk/batching_vertex.glsl.js +5 -0
  921. package/src/renderers/shaders/ShaderChunk/begin_vertex.glsl.js +9 -0
  922. package/src/renderers/shaders/ShaderChunk/beginnormal_vertex.glsl.js +9 -0
  923. package/src/renderers/shaders/ShaderChunk/bsdfs.glsl.js +33 -0
  924. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +43 -0
  925. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_begin.glsl.js +7 -0
  926. package/src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_maps.glsl.js +10 -0
  927. package/src/renderers/shaders/ShaderChunk/clearcoat_pars_fragment.glsl.js +21 -0
  928. package/src/renderers/shaders/ShaderChunk/clipping_planes_fragment.glsl.js +78 -0
  929. package/src/renderers/shaders/ShaderChunk/clipping_planes_pars_fragment.glsl.js +9 -0
  930. package/src/renderers/shaders/ShaderChunk/clipping_planes_pars_vertex.glsl.js +7 -0
  931. package/src/renderers/shaders/ShaderChunk/clipping_planes_vertex.glsl.js +7 -0
  932. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +11 -0
  933. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +11 -0
  934. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +11 -0
  935. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +31 -0
  936. package/src/renderers/shaders/ShaderChunk/colorspace_fragment.glsl.js +3 -0
  937. package/src/renderers/shaders/ShaderChunk/colorspace_pars_fragment.glsl.js +15 -0
  938. package/src/renderers/shaders/ShaderChunk/common.glsl.js +137 -0
  939. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +186 -0
  940. package/src/renderers/shaders/ShaderChunk/default_fragment.glsl.js +5 -0
  941. package/src/renderers/shaders/ShaderChunk/default_vertex.glsl.js +5 -0
  942. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +63 -0
  943. package/src/renderers/shaders/ShaderChunk/displacementmap_pars_vertex.glsl.js +9 -0
  944. package/src/renderers/shaders/ShaderChunk/displacementmap_vertex.glsl.js +7 -0
  945. package/src/renderers/shaders/ShaderChunk/dithering_fragment.glsl.js +7 -0
  946. package/src/renderers/shaders/ShaderChunk/dithering_pars_fragment.glsl.js +20 -0
  947. package/src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl.js +17 -0
  948. package/src/renderers/shaders/ShaderChunk/emissivemap_pars_fragment.glsl.js +7 -0
  949. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +15 -0
  950. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +62 -0
  951. package/src/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl.js +21 -0
  952. package/src/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl.js +22 -0
  953. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +69 -0
  954. package/src/renderers/shaders/ShaderChunk/envmap_vertex.glsl.js +37 -0
  955. package/src/renderers/shaders/ShaderChunk/fog_fragment.glsl.js +17 -0
  956. package/src/renderers/shaders/ShaderChunk/fog_pars_fragment.glsl.js +19 -0
  957. package/src/renderers/shaders/ShaderChunk/fog_pars_vertex.glsl.js +7 -0
  958. package/src/renderers/shaders/ShaderChunk/fog_vertex.glsl.js +7 -0
  959. package/src/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl.js +27 -0
  960. package/src/renderers/shaders/ShaderChunk/iridescence_fragment.glsl.js +120 -0
  961. package/src/renderers/shaders/ShaderChunk/iridescence_pars_fragment.glsl.js +14 -0
  962. package/src/renderers/shaders/ShaderChunk/lightmap_pars_fragment.glsl.js +8 -0
  963. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +209 -0
  964. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +13 -0
  965. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +40 -0
  966. package/src/renderers/shaders/ShaderChunk/lights_lambert_fragment.glsl.js +5 -0
  967. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +28 -0
  968. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +254 -0
  969. package/src/renderers/shaders/ShaderChunk/lights_phong_fragment.glsl.js +7 -0
  970. package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +32 -0
  971. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +157 -0
  972. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +563 -0
  973. package/src/renderers/shaders/ShaderChunk/lights_toon_fragment.glsl.js +4 -0
  974. package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +26 -0
  975. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +9 -0
  976. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +9 -0
  977. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +8 -0
  978. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +8 -0
  979. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +17 -0
  980. package/src/renderers/shaders/ShaderChunk/map_pars_fragment.glsl.js +7 -0
  981. package/src/renderers/shaders/ShaderChunk/map_particle_fragment.glsl.js +27 -0
  982. package/src/renderers/shaders/ShaderChunk/map_particle_pars_fragment.glsl.js +27 -0
  983. package/src/renderers/shaders/ShaderChunk/metalnessmap_fragment.glsl.js +12 -0
  984. package/src/renderers/shaders/ShaderChunk/metalnessmap_pars_fragment.glsl.js +7 -0
  985. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +24 -0
  986. package/src/renderers/shaders/ShaderChunk/morphinstance_vertex.glsl.js +14 -0
  987. package/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js +16 -0
  988. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +26 -0
  989. package/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js +16 -0
  990. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +76 -0
  991. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +33 -0
  992. package/src/renderers/shaders/ShaderChunk/normal_pars_fragment.glsl.js +14 -0
  993. package/src/renderers/shaders/ShaderChunk/normal_pars_vertex.glsl.js +14 -0
  994. package/src/renderers/shaders/ShaderChunk/normal_vertex.glsl.js +14 -0
  995. package/src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js +43 -0
  996. package/src/renderers/shaders/ShaderChunk/opaque_fragment.glsl.js +11 -0
  997. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +100 -0
  998. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +8 -0
  999. package/src/renderers/shaders/ShaderChunk/project_vertex.glsl.js +19 -0
  1000. package/src/renderers/shaders/ShaderChunk/roughnessmap_fragment.glsl.js +12 -0
  1001. package/src/renderers/shaders/ShaderChunk/roughnessmap_pars_fragment.glsl.js +7 -0
  1002. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +337 -0
  1003. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +71 -0
  1004. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +68 -0
  1005. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +66 -0
  1006. package/src/renderers/shaders/ShaderChunk/skinbase_vertex.glsl.js +10 -0
  1007. package/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js +25 -0
  1008. package/src/renderers/shaders/ShaderChunk/skinning_vertex.glsl.js +15 -0
  1009. package/src/renderers/shaders/ShaderChunk/skinnormal_vertex.glsl.js +20 -0
  1010. package/src/renderers/shaders/ShaderChunk/specularmap_fragment.glsl.js +14 -0
  1011. package/src/renderers/shaders/ShaderChunk/specularmap_pars_fragment.glsl.js +7 -0
  1012. package/src/renderers/shaders/ShaderChunk/tonemapping_fragment.glsl.js +7 -0
  1013. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +200 -0
  1014. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +36 -0
  1015. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +235 -0
  1016. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +119 -0
  1017. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +145 -0
  1018. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +122 -0
  1019. package/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js +21 -0
  1020. package/src/renderers/shaders/ShaderChunk.js +270 -0
  1021. package/src/renderers/shaders/ShaderLib/background.glsl.js +40 -0
  1022. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +63 -0
  1023. package/src/renderers/shaders/ShaderLib/cube.glsl.js +36 -0
  1024. package/src/renderers/shaders/ShaderLib/depth.glsl.js +114 -0
  1025. package/src/renderers/shaders/ShaderLib/distanceRGBA.glsl.js +78 -0
  1026. package/src/renderers/shaders/ShaderLib/equirect.glsl.js +35 -0
  1027. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +76 -0
  1028. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +116 -0
  1029. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +125 -0
  1030. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +112 -0
  1031. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +87 -0
  1032. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +127 -0
  1033. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +229 -0
  1034. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +119 -0
  1035. package/src/renderers/shaders/ShaderLib/points.glsl.js +87 -0
  1036. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +58 -0
  1037. package/src/renderers/shaders/ShaderLib/sprite.glsl.js +79 -0
  1038. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +53 -0
  1039. package/src/renderers/shaders/ShaderLib.js +361 -0
  1040. package/src/renderers/shaders/UniformsLib.js +235 -0
  1041. package/src/renderers/shaders/UniformsUtils.js +112 -0
  1042. package/src/renderers/webgl/WebGLAnimation.js +53 -0
  1043. package/src/renderers/webgl/WebGLAttributes.js +237 -0
  1044. package/src/renderers/webgl/WebGLBackground.js +303 -0
  1045. package/src/renderers/webgl/WebGLBindingStates.js +594 -0
  1046. package/src/renderers/webgl/WebGLBufferRenderer.js +89 -0
  1047. package/src/renderers/webgl/WebGLCapabilities.js +145 -0
  1048. package/src/renderers/webgl/WebGLClipping.js +171 -0
  1049. package/src/renderers/webgl/WebGLCubeMaps.js +99 -0
  1050. package/src/renderers/webgl/WebGLCubeUVMaps.js +134 -0
  1051. package/src/renderers/webgl/WebGLExtensions.js +84 -0
  1052. package/src/renderers/webgl/WebGLGeometries.js +183 -0
  1053. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +100 -0
  1054. package/src/renderers/webgl/WebGLInfo.js +73 -0
  1055. package/src/renderers/webgl/WebGLLights.js +571 -0
  1056. package/src/renderers/webgl/WebGLMaterials.js +591 -0
  1057. package/src/renderers/webgl/WebGLMorphtargets.js +168 -0
  1058. package/src/renderers/webgl/WebGLObjects.js +92 -0
  1059. package/src/renderers/webgl/WebGLProgram.js +1091 -0
  1060. package/src/renderers/webgl/WebGLPrograms.js +667 -0
  1061. package/src/renderers/webgl/WebGLProperties.js +55 -0
  1062. package/src/renderers/webgl/WebGLRenderLists.js +238 -0
  1063. package/src/renderers/webgl/WebGLRenderStates.js +116 -0
  1064. package/src/renderers/webgl/WebGLShader.js +12 -0
  1065. package/src/renderers/webgl/WebGLShaderCache.js +124 -0
  1066. package/src/renderers/webgl/WebGLShadowMap.js +436 -0
  1067. package/src/renderers/webgl/WebGLState.js +1332 -0
  1068. package/src/renderers/webgl/WebGLTextures.js +2342 -0
  1069. package/src/renderers/webgl/WebGLUniforms.js +1166 -0
  1070. package/src/renderers/webgl/WebGLUniformsGroups.js +394 -0
  1071. package/src/renderers/webgl/WebGLUtils.js +213 -0
  1072. package/src/renderers/webgl-fallback/WebGLBackend.js +2633 -0
  1073. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +140 -0
  1074. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +1517 -0
  1075. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +325 -0
  1076. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +64 -0
  1077. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +14 -0
  1078. package/src/renderers/webgl-fallback/utils/WebGLExtensions.js +83 -0
  1079. package/src/renderers/webgl-fallback/utils/WebGLState.js +1144 -0
  1080. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +1304 -0
  1081. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +366 -0
  1082. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +313 -0
  1083. package/src/renderers/webgpu/WebGPUBackend.js +2456 -0
  1084. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +69 -0
  1085. package/src/renderers/webgpu/WebGPURenderer.js +106 -0
  1086. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +66 -0
  1087. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +100 -0
  1088. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +2248 -0
  1089. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +187 -0
  1090. package/src/renderers/webgpu/nodes/WGSLNodeParser.js +25 -0
  1091. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +449 -0
  1092. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +484 -0
  1093. package/src/renderers/webgpu/utils/WebGPUConstants.js +339 -0
  1094. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +781 -0
  1095. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +439 -0
  1096. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +1505 -0
  1097. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +287 -0
  1098. package/src/renderers/webgpu/utils/WebGPUUtils.js +227 -0
  1099. package/src/renderers/webxr/WebXRController.js +428 -0
  1100. package/src/renderers/webxr/WebXRDepthSensing.js +155 -0
  1101. package/src/renderers/webxr/WebXRManager.js +1103 -0
  1102. package/src/scenes/Fog.js +98 -0
  1103. package/src/scenes/FogExp2.js +86 -0
  1104. package/src/scenes/Scene.js +165 -0
  1105. package/src/textures/CanvasTexture.js +45 -0
  1106. package/src/textures/CompressedArrayTexture.js +89 -0
  1107. package/src/textures/CompressedCubeTexture.js +48 -0
  1108. package/src/textures/CompressedTexture.js +86 -0
  1109. package/src/textures/CubeTexture.js +81 -0
  1110. package/src/textures/Data3DTexture.js +112 -0
  1111. package/src/textures/DataArrayTexture.js +134 -0
  1112. package/src/textures/DataTexture.js +87 -0
  1113. package/src/textures/DepthTexture.js +104 -0
  1114. package/src/textures/ExternalTexture.js +56 -0
  1115. package/src/textures/FramebufferTexture.js +85 -0
  1116. package/src/textures/Source.js +230 -0
  1117. package/src/textures/Texture.js +801 -0
  1118. package/src/textures/VideoFrameTexture.js +72 -0
  1119. package/src/textures/VideoTexture.js +125 -0
  1120. package/src/utils.js +216 -0
@@ -0,0 +1,3536 @@
1
+ import {
2
+ Controls,
3
+ GridHelper,
4
+ EllipseCurve,
5
+ BufferGeometry,
6
+ Line,
7
+ LineBasicMaterial,
8
+ Raycaster,
9
+ Group,
10
+ Box3,
11
+ Sphere,
12
+ Quaternion,
13
+ Vector2,
14
+ Vector3,
15
+ Matrix4,
16
+ MathUtils
17
+ } from 'three';
18
+
19
+ //trackball state
20
+ const STATE = {
21
+
22
+ IDLE: Symbol(),
23
+ ROTATE: Symbol(),
24
+ PAN: Symbol(),
25
+ SCALE: Symbol(),
26
+ FOV: Symbol(),
27
+ FOCUS: Symbol(),
28
+ ZROTATE: Symbol(),
29
+ TOUCH_MULTI: Symbol(),
30
+ ANIMATION_FOCUS: Symbol(),
31
+ ANIMATION_ROTATE: Symbol()
32
+
33
+ };
34
+
35
+ const INPUT = {
36
+
37
+ NONE: Symbol(),
38
+ ONE_FINGER: Symbol(),
39
+ ONE_FINGER_SWITCHED: Symbol(),
40
+ TWO_FINGER: Symbol(),
41
+ MULT_FINGER: Symbol(),
42
+ CURSOR: Symbol()
43
+
44
+ };
45
+
46
+ //cursor center coordinates
47
+ const _center = {
48
+
49
+ x: 0,
50
+ y: 0
51
+
52
+ };
53
+
54
+ //transformation matrices for gizmos and camera
55
+ const _transformation = {
56
+
57
+ camera: new Matrix4(),
58
+ gizmos: new Matrix4()
59
+
60
+ };
61
+
62
+ /**
63
+ * Fires when the camera has been transformed by the controls.
64
+ *
65
+ * @event ArcballControls#change
66
+ * @type {Object}
67
+ */
68
+ const _changeEvent = { type: 'change' };
69
+
70
+ /**
71
+ * Fires when an interaction was initiated.
72
+ *
73
+ * @event ArcballControls#start
74
+ * @type {Object}
75
+ */
76
+ const _startEvent = { type: 'start' };
77
+
78
+ /**
79
+ * Fires when an interaction has finished.
80
+ *
81
+ * @event ArcballControls#end
82
+ * @type {Object}
83
+ */
84
+ const _endEvent = { type: 'end' };
85
+
86
+ const _raycaster = new Raycaster();
87
+ const _offset = new Vector3();
88
+
89
+ const _gizmoMatrixStateTemp = new Matrix4();
90
+ const _cameraMatrixStateTemp = new Matrix4();
91
+ const _scalePointTemp = new Vector3();
92
+
93
+ const _EPS = 0.000001;
94
+
95
+ /**
96
+ * Arcball controls allow the camera to be controlled by a virtual trackball with full touch support and advanced navigation functionality.
97
+ * Cursor/finger positions and movements are mapped over a virtual trackball surface represented by a gizmo and mapped in intuitive and
98
+ * consistent camera movements. Dragging cursor/fingers will cause camera to orbit around the center of the trackball in a conservative
99
+ * way (returning to the starting point will make the camera return to its starting orientation).
100
+ *
101
+ * In addition to supporting pan, zoom and pinch gestures, Arcball controls provide focus< functionality with a double click/tap for intuitively
102
+ * moving the object's point of interest in the center of the virtual trackball. Focus allows a much better inspection and navigation in complex
103
+ * environment. Moreover Arcball controls allow FOV manipulation (in a vertigo-style method) and z-rotation. Saving and restoring of Camera State
104
+ * is supported also through clipboard (use ctrl+c and ctrl+v shortcuts for copy and paste the state).
105
+ *
106
+ * Unlike {@link OrbitControls} and {@link TrackballControls}, `ArcballControls` doesn't require `update()` to be called externally in an
107
+ * animation loop when animations are on.
108
+ *
109
+ * @augments Controls
110
+ * @three_import import { ArcballControls } from 'three/addons/controls/ArcballControls.js';
111
+ */
112
+ class ArcballControls extends Controls {
113
+
114
+ /**
115
+ * Constructs a new controls instance.
116
+ *
117
+ * @param {Camera} camera - The camera to be controlled. The camera must not be a child of another object, unless that object is the scene itself.
118
+ * @param {?HTMLElement} [domElement=null] - The HTML element used for event listeners.
119
+ * @param {?Scene} [scene=null] The scene rendered by the camera. If not given, gizmos cannot be shown.
120
+ */
121
+ constructor( camera, domElement = null, scene = null ) {
122
+
123
+ super( camera, domElement );
124
+
125
+ /**
126
+ * The scene rendered by the camera. If not given, gizmos cannot be shown.
127
+ *
128
+ * @type {?Scene}
129
+ * @default null
130
+ */
131
+ this.scene = scene;
132
+
133
+ /**
134
+ * The control's focus point.
135
+ *
136
+ * @type {Vector3}
137
+ */
138
+ this.target = new Vector3();
139
+ this._currentTarget = new Vector3();
140
+
141
+ /**
142
+ * The size of the gizmo relative to the screen width and height.
143
+ *
144
+ * @type {number}
145
+ * @default 0.67
146
+ */
147
+ this.radiusFactor = 0.67;
148
+
149
+ /**
150
+ * Holds the mouse actions of this controls. This property is maintained by the methods
151
+ * `setMouseAction()` and `unsetMouseAction()`.
152
+ *
153
+ * @type {Array<Object>}
154
+ */
155
+ this.mouseActions = [];
156
+ this._mouseOp = null;
157
+
158
+
159
+ //global vectors and matrices that are used in some operations to avoid creating new objects every time (e.g. every time cursor moves)
160
+ this._v2_1 = new Vector2();
161
+ this._v3_1 = new Vector3();
162
+ this._v3_2 = new Vector3();
163
+
164
+ this._m4_1 = new Matrix4();
165
+ this._m4_2 = new Matrix4();
166
+
167
+ this._quat = new Quaternion();
168
+
169
+ //transformation matrices
170
+ this._translationMatrix = new Matrix4(); //matrix for translation operation
171
+ this._rotationMatrix = new Matrix4(); //matrix for rotation operation
172
+ this._scaleMatrix = new Matrix4(); //matrix for scaling operation
173
+
174
+ this._rotationAxis = new Vector3(); //axis for rotate operation
175
+
176
+
177
+ //camera state
178
+ this._cameraMatrixState = new Matrix4();
179
+ this._cameraProjectionState = new Matrix4();
180
+
181
+ this._fovState = 1;
182
+ this._upState = new Vector3();
183
+ this._zoomState = 1;
184
+ this._nearPos = 0;
185
+ this._farPos = 0;
186
+
187
+ this._gizmoMatrixState = new Matrix4();
188
+
189
+ //initial values
190
+ this._up0 = new Vector3();
191
+ this._zoom0 = 1;
192
+ this._fov0 = 0;
193
+ this._initialNear = 0;
194
+ this._nearPos0 = 0;
195
+ this._initialFar = 0;
196
+ this._farPos0 = 0;
197
+ this._cameraMatrixState0 = new Matrix4();
198
+ this._gizmoMatrixState0 = new Matrix4();
199
+ this._target0 = new Vector3();
200
+
201
+ //pointers array
202
+ this._button = - 1;
203
+ this._touchStart = [];
204
+ this._touchCurrent = [];
205
+ this._input = INPUT.NONE;
206
+
207
+ //two fingers touch interaction
208
+ this._switchSensibility = 32; //minimum movement to be performed to fire single pan start after the second finger has been released
209
+ this._startFingerDistance = 0; //distance between two fingers
210
+ this._currentFingerDistance = 0;
211
+ this._startFingerRotation = 0; //amount of rotation performed with two fingers
212
+ this._currentFingerRotation = 0;
213
+
214
+ //double tap
215
+ this._devPxRatio = 0;
216
+ this._downValid = true;
217
+ this._nclicks = 0;
218
+ this._downEvents = [];
219
+ this._downStart = 0; //pointerDown time
220
+ this._clickStart = 0; //first click time
221
+ this._maxDownTime = 250;
222
+ this._maxInterval = 300;
223
+ this._posThreshold = 24;
224
+ this._movementThreshold = 24;
225
+
226
+ //cursor positions
227
+ this._currentCursorPosition = new Vector3();
228
+ this._startCursorPosition = new Vector3();
229
+
230
+ //grid
231
+ this._grid = null; //grid to be visualized during pan operation
232
+ this._gridPosition = new Vector3();
233
+
234
+ //gizmos
235
+ this._gizmos = new Group();
236
+ this._curvePts = 128;
237
+
238
+
239
+ //animations
240
+ this._timeStart = - 1; //initial time
241
+ this._animationId = - 1;
242
+
243
+ /**
244
+ * Duration of focus animations in ms.
245
+ *
246
+ * @type {number}
247
+ * @default 500
248
+ */
249
+ this.focusAnimationTime = 500;
250
+
251
+ //rotate animation
252
+ this._timePrev = 0; //time at which previous rotate operation has been detected
253
+ this._timeCurrent = 0; //time at which current rotate operation has been detected
254
+ this._anglePrev = 0; //angle of previous rotation
255
+ this._angleCurrent = 0; //angle of current rotation
256
+ this._cursorPosPrev = new Vector3(); //cursor position when previous rotate operation has been detected
257
+ this._cursorPosCurr = new Vector3();//cursor position when current rotate operation has been detected
258
+ this._wPrev = 0; //angular velocity of the previous rotate operation
259
+ this._wCurr = 0; //angular velocity of the current rotate operation
260
+
261
+ //parameters
262
+
263
+ /**
264
+ * If set to `true`, the camera's near and far values will be adjusted every time zoom is
265
+ * performed trying to maintain the same visible portion given by initial near and far
266
+ * values. Only works with perspective cameras.
267
+ *
268
+ * @type {boolean}
269
+ * @default false
270
+ */
271
+ this.adjustNearFar = false;
272
+
273
+ /**
274
+ * The scaling factor used when performing zoom operation.
275
+ *
276
+ * @type {number}
277
+ * @default 1.1
278
+ */
279
+ this.scaleFactor = 1.1;
280
+
281
+ /**
282
+ * The damping inertia used if 'enableAnimations` is set to `true`.
283
+ *
284
+ * @type {number}
285
+ * @default 25
286
+ */
287
+ this.dampingFactor = 25;
288
+
289
+ /**
290
+ * Maximum angular velocity allowed on rotation animation start.
291
+ *
292
+ * @type {number}
293
+ * @default 20
294
+ */
295
+ this.wMax = 20;
296
+
297
+ /**
298
+ * Set to `true` to enable animations for rotation (damping) and focus operation.
299
+ *
300
+ * @type {boolean}
301
+ * @default true
302
+ */
303
+ this.enableAnimations = true;
304
+
305
+ /**
306
+ * If set to `true`, a grid will appear when panning operation is being performed
307
+ * (desktop interaction only).
308
+ *
309
+ * @type {boolean}
310
+ * @default false
311
+ */
312
+ this.enableGrid = false;
313
+
314
+ /**
315
+ * Set to `true` to make zoom become cursor centered.
316
+ *
317
+ * @type {boolean}
318
+ * @default false
319
+ */
320
+ this.cursorZoom = false;
321
+
322
+ /**
323
+ * The minimum FOV in degrees.
324
+ *
325
+ * @type {number}
326
+ * @default 5
327
+ */
328
+ this.minFov = 5;
329
+
330
+ /**
331
+ * The maximum FOV in degrees.
332
+ *
333
+ * @type {number}
334
+ * @default 90
335
+ */
336
+ this.maxFov = 90;
337
+
338
+ /**
339
+ * Speed of rotation.
340
+ *
341
+ * @type {number}
342
+ * @default 1
343
+ */
344
+ this.rotateSpeed = 1;
345
+
346
+ /**
347
+ * Enable or disable camera panning.
348
+ *
349
+ * @type {boolean}
350
+ * @default true
351
+ */
352
+ this.enablePan = true;
353
+
354
+ /**
355
+ * Enable or disable camera rotation.
356
+ *
357
+ * @type {boolean}
358
+ * @default true
359
+ */
360
+ this.enableRotate = true;
361
+
362
+ /**
363
+ * Enable or disable camera zoom.
364
+ *
365
+ * @type {boolean}
366
+ * @default true
367
+ */
368
+ this.enableZoom = true;
369
+
370
+ /**
371
+ * Enable or disable gizmos.
372
+ *
373
+ * @type {boolean}
374
+ * @default true
375
+ */
376
+ this.enableGizmos = true;
377
+
378
+ /**
379
+ * Enable or disable camera focusing on double-tap (or click) operations.
380
+ *
381
+ * @type {boolean}
382
+ * @default true
383
+ */
384
+ this.enableFocus = true;
385
+
386
+ /**
387
+ * How far you can dolly in. For perspective cameras only.
388
+ *
389
+ * @type {number}
390
+ * @default 0
391
+ */
392
+ this.minDistance = 0;
393
+
394
+ /**
395
+ * How far you can dolly out. For perspective cameras only.
396
+ *
397
+ * @type {number}
398
+ * @default Infinity
399
+ */
400
+ this.maxDistance = Infinity;
401
+
402
+ /**
403
+ * How far you can zoom in. For orthographic cameras only.
404
+ *
405
+ * @type {number}
406
+ * @default 0
407
+ */
408
+ this.minZoom = 0;
409
+
410
+ /**
411
+ * How far you can zoom out. For orthographic cameras only.
412
+ *
413
+ * @type {number}
414
+ * @default Infinity
415
+ */
416
+ this.maxZoom = Infinity;
417
+
418
+ //trackball parameters
419
+ this._tbRadius = 1;
420
+
421
+ //FSA
422
+ this._state = STATE.IDLE;
423
+
424
+ this.setCamera( camera );
425
+
426
+ if ( this.scene != null ) {
427
+
428
+ this.scene.add( this._gizmos );
429
+
430
+ }
431
+
432
+ this.initializeMouseActions();
433
+
434
+ // event listeners
435
+
436
+ this._onContextMenu = onContextMenu.bind( this );
437
+ this._onWheel = onWheel.bind( this );
438
+ this._onPointerUp = onPointerUp.bind( this );
439
+ this._onPointerMove = onPointerMove.bind( this );
440
+ this._onPointerDown = onPointerDown.bind( this );
441
+ this._onPointerCancel = onPointerCancel.bind( this );
442
+ this._onWindowResize = onWindowResize.bind( this );
443
+
444
+ if ( domElement !== null ) {
445
+
446
+ this.connect( domElement );
447
+
448
+ }
449
+
450
+ }
451
+
452
+ connect( element ) {
453
+
454
+ super.connect( element );
455
+
456
+ this.domElement.style.touchAction = 'none';
457
+ this._devPxRatio = window.devicePixelRatio;
458
+
459
+ this.domElement.addEventListener( 'contextmenu', this._onContextMenu );
460
+ this.domElement.addEventListener( 'wheel', this._onWheel, { passive: false } );
461
+ this.domElement.addEventListener( 'pointerdown', this._onPointerDown );
462
+ this.domElement.addEventListener( 'pointercancel', this._onPointerCancel );
463
+
464
+ window.addEventListener( 'resize', this._onWindowResize );
465
+
466
+ }
467
+
468
+ disconnect() {
469
+
470
+ this.domElement.removeEventListener( 'pointerdown', this._onPointerDown );
471
+ this.domElement.removeEventListener( 'pointercancel', this._onPointerCancel );
472
+ this.domElement.removeEventListener( 'wheel', this._onWheel );
473
+ this.domElement.removeEventListener( 'contextmenu', this._onContextMenu );
474
+
475
+ window.removeEventListener( 'pointermove', this._onPointerMove );
476
+ window.removeEventListener( 'pointerup', this._onPointerUp );
477
+
478
+ window.removeEventListener( 'resize', this._onWindowResize );
479
+
480
+ }
481
+
482
+ onSinglePanStart( event, operation ) {
483
+
484
+ if ( this.enabled ) {
485
+
486
+ this.dispatchEvent( _startEvent );
487
+
488
+ this.setCenter( event.clientX, event.clientY );
489
+
490
+ switch ( operation ) {
491
+
492
+ case 'PAN':
493
+
494
+ if ( ! this.enablePan ) {
495
+
496
+ return;
497
+
498
+ }
499
+
500
+ if ( this._animationId != - 1 ) {
501
+
502
+ cancelAnimationFrame( this._animationId );
503
+ this._animationId = - 1;
504
+ this._timeStart = - 1;
505
+
506
+ this.activateGizmos( false );
507
+ this.dispatchEvent( _changeEvent );
508
+
509
+ }
510
+
511
+ this.updateTbState( STATE.PAN, true );
512
+ this._startCursorPosition.copy( this.unprojectOnTbPlane( this.object, _center.x, _center.y, this.domElement ) );
513
+ if ( this.enableGrid ) {
514
+
515
+ this.drawGrid();
516
+ this.dispatchEvent( _changeEvent );
517
+
518
+ }
519
+
520
+ break;
521
+
522
+ case 'ROTATE':
523
+
524
+ if ( ! this.enableRotate ) {
525
+
526
+ return;
527
+
528
+ }
529
+
530
+ if ( this._animationId != - 1 ) {
531
+
532
+ cancelAnimationFrame( this._animationId );
533
+ this._animationId = - 1;
534
+ this._timeStart = - 1;
535
+
536
+ }
537
+
538
+ this.updateTbState( STATE.ROTATE, true );
539
+ this._startCursorPosition.copy( this.unprojectOnTbSurface( this.object, _center.x, _center.y, this.domElement, this._tbRadius ) );
540
+ this.activateGizmos( true );
541
+ if ( this.enableAnimations ) {
542
+
543
+ this._timePrev = this._timeCurrent = performance.now();
544
+ this._angleCurrent = this._anglePrev = 0;
545
+ this._cursorPosPrev.copy( this._startCursorPosition );
546
+ this._cursorPosCurr.copy( this._cursorPosPrev );
547
+ this._wCurr = 0;
548
+ this._wPrev = this._wCurr;
549
+
550
+ }
551
+
552
+ this.dispatchEvent( _changeEvent );
553
+ break;
554
+
555
+ case 'FOV':
556
+
557
+ if ( ! this.object.isPerspectiveCamera || ! this.enableZoom ) {
558
+
559
+ return;
560
+
561
+ }
562
+
563
+ if ( this._animationId != - 1 ) {
564
+
565
+ cancelAnimationFrame( this._animationId );
566
+ this._animationId = - 1;
567
+ this._timeStart = - 1;
568
+
569
+ this.activateGizmos( false );
570
+ this.dispatchEvent( _changeEvent );
571
+
572
+ }
573
+
574
+ this.updateTbState( STATE.FOV, true );
575
+ this._startCursorPosition.setY( this.getCursorNDC( _center.x, _center.y, this.domElement ).y * 0.5 );
576
+ this._currentCursorPosition.copy( this._startCursorPosition );
577
+ break;
578
+
579
+ case 'ZOOM':
580
+
581
+ if ( ! this.enableZoom ) {
582
+
583
+ return;
584
+
585
+ }
586
+
587
+ if ( this._animationId != - 1 ) {
588
+
589
+ cancelAnimationFrame( this._animationId );
590
+ this._animationId = - 1;
591
+ this._timeStart = - 1;
592
+
593
+ this.activateGizmos( false );
594
+ this.dispatchEvent( _changeEvent );
595
+
596
+ }
597
+
598
+ this.updateTbState( STATE.SCALE, true );
599
+ this._startCursorPosition.setY( this.getCursorNDC( _center.x, _center.y, this.domElement ).y * 0.5 );
600
+ this._currentCursorPosition.copy( this._startCursorPosition );
601
+ break;
602
+
603
+ }
604
+
605
+ }
606
+
607
+ }
608
+
609
+ onSinglePanMove( event, opState ) {
610
+
611
+ if ( this.enabled ) {
612
+
613
+ const restart = opState != this._state;
614
+ this.setCenter( event.clientX, event.clientY );
615
+
616
+ switch ( opState ) {
617
+
618
+ case STATE.PAN:
619
+
620
+ if ( this.enablePan ) {
621
+
622
+ if ( restart ) {
623
+
624
+ //switch to pan operation
625
+
626
+ this.dispatchEvent( _endEvent );
627
+ this.dispatchEvent( _startEvent );
628
+
629
+ this.updateTbState( opState, true );
630
+ this._startCursorPosition.copy( this.unprojectOnTbPlane( this.object, _center.x, _center.y, this.domElement ) );
631
+ if ( this.enableGrid ) {
632
+
633
+ this.drawGrid();
634
+
635
+ }
636
+
637
+ this.activateGizmos( false );
638
+
639
+ } else {
640
+
641
+ //continue with pan operation
642
+ this._currentCursorPosition.copy( this.unprojectOnTbPlane( this.object, _center.x, _center.y, this.domElement ) );
643
+ this.applyTransformMatrix( this.pan( this._startCursorPosition, this._currentCursorPosition ) );
644
+
645
+ }
646
+
647
+ }
648
+
649
+ break;
650
+
651
+ case STATE.ROTATE:
652
+
653
+ if ( this.enableRotate ) {
654
+
655
+ if ( restart ) {
656
+
657
+ //switch to rotate operation
658
+
659
+ this.dispatchEvent( _endEvent );
660
+ this.dispatchEvent( _startEvent );
661
+
662
+ this.updateTbState( opState, true );
663
+ this._startCursorPosition.copy( this.unprojectOnTbSurface( this.object, _center.x, _center.y, this.domElement, this._tbRadius ) );
664
+
665
+ if ( this.enableGrid ) {
666
+
667
+ this.disposeGrid();
668
+
669
+ }
670
+
671
+ this.activateGizmos( true );
672
+
673
+ } else {
674
+
675
+ //continue with rotate operation
676
+ this._currentCursorPosition.copy( this.unprojectOnTbSurface( this.object, _center.x, _center.y, this.domElement, this._tbRadius ) );
677
+
678
+ const distance = this._startCursorPosition.distanceTo( this._currentCursorPosition );
679
+ const angle = this._startCursorPosition.angleTo( this._currentCursorPosition );
680
+ const amount = Math.max( distance / this._tbRadius, angle ) * this.rotateSpeed; //effective rotation angle
681
+
682
+ this.applyTransformMatrix( this.rotate( this.calculateRotationAxis( this._startCursorPosition, this._currentCursorPosition ), amount ) );
683
+
684
+ if ( this.enableAnimations ) {
685
+
686
+ this._timePrev = this._timeCurrent;
687
+ this._timeCurrent = performance.now();
688
+ this._anglePrev = this._angleCurrent;
689
+ this._angleCurrent = amount;
690
+ this._cursorPosPrev.copy( this._cursorPosCurr );
691
+ this._cursorPosCurr.copy( this._currentCursorPosition );
692
+ this._wPrev = this._wCurr;
693
+ this._wCurr = this.calculateAngularSpeed( this._anglePrev, this._angleCurrent, this._timePrev, this._timeCurrent );
694
+
695
+ }
696
+
697
+ }
698
+
699
+ }
700
+
701
+ break;
702
+
703
+ case STATE.SCALE:
704
+
705
+ if ( this.enableZoom ) {
706
+
707
+ if ( restart ) {
708
+
709
+ //switch to zoom operation
710
+
711
+ this.dispatchEvent( _endEvent );
712
+ this.dispatchEvent( _startEvent );
713
+
714
+ this.updateTbState( opState, true );
715
+ this._startCursorPosition.setY( this.getCursorNDC( _center.x, _center.y, this.domElement ).y * 0.5 );
716
+ this._currentCursorPosition.copy( this._startCursorPosition );
717
+
718
+ if ( this.enableGrid ) {
719
+
720
+ this.disposeGrid();
721
+
722
+ }
723
+
724
+ this.activateGizmos( false );
725
+
726
+ } else {
727
+
728
+ //continue with zoom operation
729
+ const screenNotches = 8; //how many wheel notches corresponds to a full screen pan
730
+ this._currentCursorPosition.setY( this.getCursorNDC( _center.x, _center.y, this.domElement ).y * 0.5 );
731
+
732
+ const movement = this._currentCursorPosition.y - this._startCursorPosition.y;
733
+
734
+ let size = 1;
735
+
736
+ if ( movement < 0 ) {
737
+
738
+ size = 1 / ( Math.pow( this.scaleFactor, - movement * screenNotches ) );
739
+
740
+ } else if ( movement > 0 ) {
741
+
742
+ size = Math.pow( this.scaleFactor, movement * screenNotches );
743
+
744
+ }
745
+
746
+ this._v3_1.setFromMatrixPosition( this._gizmoMatrixState );
747
+
748
+ this.applyTransformMatrix( this.scale( size, this._v3_1 ) );
749
+
750
+ }
751
+
752
+ }
753
+
754
+ break;
755
+
756
+ case STATE.FOV:
757
+
758
+ if ( this.enableZoom && this.object.isPerspectiveCamera ) {
759
+
760
+ if ( restart ) {
761
+
762
+ //switch to fov operation
763
+
764
+ this.dispatchEvent( _endEvent );
765
+ this.dispatchEvent( _startEvent );
766
+
767
+ this.updateTbState( opState, true );
768
+ this._startCursorPosition.setY( this.getCursorNDC( _center.x, _center.y, this.domElement ).y * 0.5 );
769
+ this._currentCursorPosition.copy( this._startCursorPosition );
770
+
771
+ if ( this.enableGrid ) {
772
+
773
+ this.disposeGrid();
774
+
775
+ }
776
+
777
+ this.activateGizmos( false );
778
+
779
+ } else {
780
+
781
+ //continue with fov operation
782
+ const screenNotches = 8; //how many wheel notches corresponds to a full screen pan
783
+ this._currentCursorPosition.setY( this.getCursorNDC( _center.x, _center.y, this.domElement ).y * 0.5 );
784
+
785
+ const movement = this._currentCursorPosition.y - this._startCursorPosition.y;
786
+
787
+ let size = 1;
788
+
789
+ if ( movement < 0 ) {
790
+
791
+ size = 1 / ( Math.pow( this.scaleFactor, - movement * screenNotches ) );
792
+
793
+ } else if ( movement > 0 ) {
794
+
795
+ size = Math.pow( this.scaleFactor, movement * screenNotches );
796
+
797
+ }
798
+
799
+ this._v3_1.setFromMatrixPosition( this._cameraMatrixState );
800
+ const x = this._v3_1.distanceTo( this._gizmos.position );
801
+ let xNew = x / size; //distance between camera and gizmos if scale(size, scalepoint) would be performed
802
+
803
+ //check min and max distance
804
+ xNew = MathUtils.clamp( xNew, this.minDistance, this.maxDistance );
805
+
806
+ const y = x * Math.tan( MathUtils.DEG2RAD * this._fovState * 0.5 );
807
+
808
+ //calculate new fov
809
+ let newFov = MathUtils.RAD2DEG * ( Math.atan( y / xNew ) * 2 );
810
+
811
+ //check min and max fov
812
+ newFov = MathUtils.clamp( newFov, this.minFov, this.maxFov );
813
+
814
+ const newDistance = y / Math.tan( MathUtils.DEG2RAD * ( newFov / 2 ) );
815
+ size = x / newDistance;
816
+ this._v3_2.setFromMatrixPosition( this._gizmoMatrixState );
817
+
818
+ this.setFov( newFov );
819
+ this.applyTransformMatrix( this.scale( size, this._v3_2, false ) );
820
+
821
+ //adjusting distance
822
+ _offset.copy( this._gizmos.position ).sub( this.object.position ).normalize().multiplyScalar( newDistance / x );
823
+ this._m4_1.makeTranslation( _offset.x, _offset.y, _offset.z );
824
+
825
+ }
826
+
827
+ }
828
+
829
+ break;
830
+
831
+ }
832
+
833
+ this.dispatchEvent( _changeEvent );
834
+
835
+ }
836
+
837
+ }
838
+
839
+ onSinglePanEnd() {
840
+
841
+ if ( this._state == STATE.ROTATE ) {
842
+
843
+
844
+ if ( ! this.enableRotate ) {
845
+
846
+ return;
847
+
848
+ }
849
+
850
+ if ( this.enableAnimations ) {
851
+
852
+ //perform rotation animation
853
+ const deltaTime = ( performance.now() - this._timeCurrent );
854
+ if ( deltaTime < 120 ) {
855
+
856
+ const w = Math.abs( ( this._wPrev + this._wCurr ) / 2 );
857
+
858
+ const self = this;
859
+ this._animationId = window.requestAnimationFrame( function ( t ) {
860
+
861
+ self.updateTbState( STATE.ANIMATION_ROTATE, true );
862
+ const rotationAxis = self.calculateRotationAxis( self._cursorPosPrev, self._cursorPosCurr );
863
+
864
+ self.onRotationAnim( t, rotationAxis, Math.min( w, self.wMax ) );
865
+
866
+ } );
867
+
868
+ } else {
869
+
870
+ //cursor has been standing still for over 120 ms since last movement
871
+ this.updateTbState( STATE.IDLE, false );
872
+ this.activateGizmos( false );
873
+ this.dispatchEvent( _changeEvent );
874
+
875
+ }
876
+
877
+ } else {
878
+
879
+ this.updateTbState( STATE.IDLE, false );
880
+ this.activateGizmos( false );
881
+ this.dispatchEvent( _changeEvent );
882
+
883
+ }
884
+
885
+ } else if ( this._state == STATE.PAN || this._state == STATE.IDLE ) {
886
+
887
+ this.updateTbState( STATE.IDLE, false );
888
+
889
+ if ( this.enableGrid ) {
890
+
891
+ this.disposeGrid();
892
+
893
+ }
894
+
895
+ this.activateGizmos( false );
896
+ this.dispatchEvent( _changeEvent );
897
+
898
+
899
+ }
900
+
901
+ this.dispatchEvent( _endEvent );
902
+
903
+ }
904
+
905
+ onDoubleTap( event ) {
906
+
907
+ if ( this.enabled && this.enablePan && this.enableFocus && this.scene != null ) {
908
+
909
+ this.dispatchEvent( _startEvent );
910
+
911
+ this.setCenter( event.clientX, event.clientY );
912
+ const hitP = this.unprojectOnObj( this.getCursorNDC( _center.x, _center.y, this.domElement ), this.object );
913
+
914
+ if ( hitP != null && this.enableAnimations ) {
915
+
916
+ const self = this;
917
+ if ( this._animationId != - 1 ) {
918
+
919
+ window.cancelAnimationFrame( this._animationId );
920
+
921
+ }
922
+
923
+ this._timeStart = - 1;
924
+ this._animationId = window.requestAnimationFrame( function ( t ) {
925
+
926
+ self.updateTbState( STATE.ANIMATION_FOCUS, true );
927
+ self.onFocusAnim( t, hitP, self._cameraMatrixState, self._gizmoMatrixState );
928
+
929
+ } );
930
+
931
+ } else if ( hitP != null && ! this.enableAnimations ) {
932
+
933
+ this.updateTbState( STATE.FOCUS, true );
934
+ this.focus( hitP, this.scaleFactor );
935
+ this.updateTbState( STATE.IDLE, false );
936
+ this.dispatchEvent( _changeEvent );
937
+
938
+ }
939
+
940
+ }
941
+
942
+ this.dispatchEvent( _endEvent );
943
+
944
+ }
945
+
946
+ onDoublePanStart() {
947
+
948
+ if ( this.enabled && this.enablePan ) {
949
+
950
+ this.dispatchEvent( _startEvent );
951
+
952
+ this.updateTbState( STATE.PAN, true );
953
+
954
+ this.setCenter( ( this._touchCurrent[ 0 ].clientX + this._touchCurrent[ 1 ].clientX ) / 2, ( this._touchCurrent[ 0 ].clientY + this._touchCurrent[ 1 ].clientY ) / 2 );
955
+ this._startCursorPosition.copy( this.unprojectOnTbPlane( this.object, _center.x, _center.y, this.domElement, true ) );
956
+ this._currentCursorPosition.copy( this._startCursorPosition );
957
+
958
+ this.activateGizmos( false );
959
+
960
+ }
961
+
962
+ }
963
+
964
+ onDoublePanMove() {
965
+
966
+ if ( this.enabled && this.enablePan ) {
967
+
968
+ this.setCenter( ( this._touchCurrent[ 0 ].clientX + this._touchCurrent[ 1 ].clientX ) / 2, ( this._touchCurrent[ 0 ].clientY + this._touchCurrent[ 1 ].clientY ) / 2 );
969
+
970
+ if ( this._state != STATE.PAN ) {
971
+
972
+ this.updateTbState( STATE.PAN, true );
973
+ this._startCursorPosition.copy( this._currentCursorPosition );
974
+
975
+ }
976
+
977
+ this._currentCursorPosition.copy( this.unprojectOnTbPlane( this.object, _center.x, _center.y, this.domElement, true ) );
978
+ this.applyTransformMatrix( this.pan( this._startCursorPosition, this._currentCursorPosition, true ) );
979
+ this.dispatchEvent( _changeEvent );
980
+
981
+ }
982
+
983
+ }
984
+
985
+ onDoublePanEnd() {
986
+
987
+ this.updateTbState( STATE.IDLE, false );
988
+ this.dispatchEvent( _endEvent );
989
+
990
+ }
991
+
992
+ onRotateStart() {
993
+
994
+ if ( this.enabled && this.enableRotate ) {
995
+
996
+ this.dispatchEvent( _startEvent );
997
+
998
+ this.updateTbState( STATE.ZROTATE, true );
999
+
1000
+ //this._startFingerRotation = event.rotation;
1001
+
1002
+ this._startFingerRotation = this.getAngle( this._touchCurrent[ 1 ], this._touchCurrent[ 0 ] ) + this.getAngle( this._touchStart[ 1 ], this._touchStart[ 0 ] );
1003
+ this._currentFingerRotation = this._startFingerRotation;
1004
+
1005
+ this.object.getWorldDirection( this._rotationAxis ); //rotation axis
1006
+
1007
+ if ( ! this.enablePan && ! this.enableZoom ) {
1008
+
1009
+ this.activateGizmos( true );
1010
+
1011
+ }
1012
+
1013
+ }
1014
+
1015
+ }
1016
+
1017
+ onRotateMove() {
1018
+
1019
+ if ( this.enabled && this.enableRotate ) {
1020
+
1021
+ this.setCenter( ( this._touchCurrent[ 0 ].clientX + this._touchCurrent[ 1 ].clientX ) / 2, ( this._touchCurrent[ 0 ].clientY + this._touchCurrent[ 1 ].clientY ) / 2 );
1022
+ let rotationPoint;
1023
+
1024
+ if ( this._state != STATE.ZROTATE ) {
1025
+
1026
+ this.updateTbState( STATE.ZROTATE, true );
1027
+ this._startFingerRotation = this._currentFingerRotation;
1028
+
1029
+ }
1030
+
1031
+ //this._currentFingerRotation = event.rotation;
1032
+ this._currentFingerRotation = this.getAngle( this._touchCurrent[ 1 ], this._touchCurrent[ 0 ] ) + this.getAngle( this._touchStart[ 1 ], this._touchStart[ 0 ] );
1033
+
1034
+ if ( ! this.enablePan ) {
1035
+
1036
+ rotationPoint = new Vector3().setFromMatrixPosition( this._gizmoMatrixState );
1037
+
1038
+ } else {
1039
+
1040
+ this._v3_2.setFromMatrixPosition( this._gizmoMatrixState );
1041
+ rotationPoint = this.unprojectOnTbPlane( this.object, _center.x, _center.y, this.domElement ).applyQuaternion( this.object.quaternion ).multiplyScalar( 1 / this.object.zoom ).add( this._v3_2 );
1042
+
1043
+ }
1044
+
1045
+ const amount = MathUtils.DEG2RAD * ( this._startFingerRotation - this._currentFingerRotation );
1046
+
1047
+ this.applyTransformMatrix( this.zRotate( rotationPoint, amount ) );
1048
+ this.dispatchEvent( _changeEvent );
1049
+
1050
+ }
1051
+
1052
+ }
1053
+
1054
+ onRotateEnd() {
1055
+
1056
+ this.updateTbState( STATE.IDLE, false );
1057
+ this.activateGizmos( false );
1058
+ this.dispatchEvent( _endEvent );
1059
+
1060
+ }
1061
+
1062
+ onPinchStart() {
1063
+
1064
+ if ( this.enabled && this.enableZoom ) {
1065
+
1066
+ this.dispatchEvent( _startEvent );
1067
+ this.updateTbState( STATE.SCALE, true );
1068
+
1069
+ this._startFingerDistance = this.calculatePointersDistance( this._touchCurrent[ 0 ], this._touchCurrent[ 1 ] );
1070
+ this._currentFingerDistance = this._startFingerDistance;
1071
+
1072
+ this.activateGizmos( false );
1073
+
1074
+ }
1075
+
1076
+ }
1077
+
1078
+ onPinchMove() {
1079
+
1080
+ if ( this.enabled && this.enableZoom ) {
1081
+
1082
+ this.setCenter( ( this._touchCurrent[ 0 ].clientX + this._touchCurrent[ 1 ].clientX ) / 2, ( this._touchCurrent[ 0 ].clientY + this._touchCurrent[ 1 ].clientY ) / 2 );
1083
+ const minDistance = 12; //minimum distance between fingers (in css pixels)
1084
+
1085
+ if ( this._state != STATE.SCALE ) {
1086
+
1087
+ this._startFingerDistance = this._currentFingerDistance;
1088
+ this.updateTbState( STATE.SCALE, true );
1089
+
1090
+ }
1091
+
1092
+ this._currentFingerDistance = Math.max( this.calculatePointersDistance( this._touchCurrent[ 0 ], this._touchCurrent[ 1 ] ), minDistance * this._devPxRatio );
1093
+ const amount = this._currentFingerDistance / this._startFingerDistance;
1094
+
1095
+ let scalePoint;
1096
+
1097
+ if ( ! this.enablePan ) {
1098
+
1099
+ scalePoint = this._gizmos.position;
1100
+
1101
+ } else {
1102
+
1103
+ if ( this.object.isOrthographicCamera ) {
1104
+
1105
+ scalePoint = this.unprojectOnTbPlane( this.object, _center.x, _center.y, this.domElement )
1106
+ .applyQuaternion( this.object.quaternion )
1107
+ .multiplyScalar( 1 / this.object.zoom )
1108
+ .add( this._gizmos.position );
1109
+
1110
+ } else if ( this.object.isPerspectiveCamera ) {
1111
+
1112
+ scalePoint = this.unprojectOnTbPlane( this.object, _center.x, _center.y, this.domElement )
1113
+ .applyQuaternion( this.object.quaternion )
1114
+ .add( this._gizmos.position );
1115
+
1116
+ }
1117
+
1118
+ }
1119
+
1120
+ this.applyTransformMatrix( this.scale( amount, scalePoint ) );
1121
+ this.dispatchEvent( _changeEvent );
1122
+
1123
+ }
1124
+
1125
+ }
1126
+
1127
+ onPinchEnd() {
1128
+
1129
+ this.updateTbState( STATE.IDLE, false );
1130
+ this.dispatchEvent( _endEvent );
1131
+
1132
+ }
1133
+
1134
+ onTriplePanStart() {
1135
+
1136
+ if ( this.enabled && this.enableZoom ) {
1137
+
1138
+ this.dispatchEvent( _startEvent );
1139
+
1140
+ this.updateTbState( STATE.SCALE, true );
1141
+
1142
+ //const center = event.center;
1143
+ let clientX = 0;
1144
+ let clientY = 0;
1145
+ const nFingers = this._touchCurrent.length;
1146
+
1147
+ for ( let i = 0; i < nFingers; i ++ ) {
1148
+
1149
+ clientX += this._touchCurrent[ i ].clientX;
1150
+ clientY += this._touchCurrent[ i ].clientY;
1151
+
1152
+ }
1153
+
1154
+ this.setCenter( clientX / nFingers, clientY / nFingers );
1155
+
1156
+ this._startCursorPosition.setY( this.getCursorNDC( _center.x, _center.y, this.domElement ).y * 0.5 );
1157
+ this._currentCursorPosition.copy( this._startCursorPosition );
1158
+
1159
+ }
1160
+
1161
+ }
1162
+
1163
+ onTriplePanMove() {
1164
+
1165
+ if ( this.enabled && this.enableZoom ) {
1166
+
1167
+ // fov / 2
1168
+ // |\
1169
+ // | \
1170
+ // | \
1171
+ // x | \
1172
+ // | \
1173
+ // | \
1174
+ // | _ _ _\
1175
+ // y
1176
+
1177
+ //const center = event.center;
1178
+ let clientX = 0;
1179
+ let clientY = 0;
1180
+ const nFingers = this._touchCurrent.length;
1181
+
1182
+ for ( let i = 0; i < nFingers; i ++ ) {
1183
+
1184
+ clientX += this._touchCurrent[ i ].clientX;
1185
+ clientY += this._touchCurrent[ i ].clientY;
1186
+
1187
+ }
1188
+
1189
+ this.setCenter( clientX / nFingers, clientY / nFingers );
1190
+
1191
+ const screenNotches = 8; //how many wheel notches corresponds to a full screen pan
1192
+ this._currentCursorPosition.setY( this.getCursorNDC( _center.x, _center.y, this.domElement ).y * 0.5 );
1193
+
1194
+ const movement = this._currentCursorPosition.y - this._startCursorPosition.y;
1195
+
1196
+ let size = 1;
1197
+
1198
+ if ( movement < 0 ) {
1199
+
1200
+ size = 1 / ( Math.pow( this.scaleFactor, - movement * screenNotches ) );
1201
+
1202
+ } else if ( movement > 0 ) {
1203
+
1204
+ size = Math.pow( this.scaleFactor, movement * screenNotches );
1205
+
1206
+ }
1207
+
1208
+ this._v3_1.setFromMatrixPosition( this._cameraMatrixState );
1209
+ const x = this._v3_1.distanceTo( this._gizmos.position );
1210
+ let xNew = x / size; //distance between camera and gizmos if scale(size, scalepoint) would be performed
1211
+
1212
+ //check min and max distance
1213
+ xNew = MathUtils.clamp( xNew, this.minDistance, this.maxDistance );
1214
+
1215
+ const y = x * Math.tan( MathUtils.DEG2RAD * this._fovState * 0.5 );
1216
+
1217
+ //calculate new fov
1218
+ let newFov = MathUtils.RAD2DEG * ( Math.atan( y / xNew ) * 2 );
1219
+
1220
+ //check min and max fov
1221
+ newFov = MathUtils.clamp( newFov, this.minFov, this.maxFov );
1222
+
1223
+ const newDistance = y / Math.tan( MathUtils.DEG2RAD * ( newFov / 2 ) );
1224
+ size = x / newDistance;
1225
+ this._v3_2.setFromMatrixPosition( this._gizmoMatrixState );
1226
+
1227
+ this.setFov( newFov );
1228
+ this.applyTransformMatrix( this.scale( size, this._v3_2, false ) );
1229
+
1230
+ //adjusting distance
1231
+ _offset.copy( this._gizmos.position ).sub( this.object.position ).normalize().multiplyScalar( newDistance / x );
1232
+ this._m4_1.makeTranslation( _offset.x, _offset.y, _offset.z );
1233
+
1234
+ this.dispatchEvent( _changeEvent );
1235
+
1236
+ }
1237
+
1238
+ }
1239
+
1240
+ onTriplePanEnd() {
1241
+
1242
+ this.updateTbState( STATE.IDLE, false );
1243
+ this.dispatchEvent( _endEvent );
1244
+ //this.dispatchEvent( _changeEvent );
1245
+
1246
+ }
1247
+
1248
+ /**
1249
+ * Set _center's x/y coordinates.
1250
+ *
1251
+ * @private
1252
+ * @param {number} clientX - The x coordinate.
1253
+ * @param {number} clientY - The y coordinate.
1254
+ */
1255
+ setCenter( clientX, clientY ) {
1256
+
1257
+ _center.x = clientX;
1258
+ _center.y = clientY;
1259
+
1260
+ }
1261
+
1262
+ /**
1263
+ * Set default mouse actions.
1264
+ *
1265
+ * @private
1266
+ */
1267
+ initializeMouseActions() {
1268
+
1269
+ this.setMouseAction( 'PAN', 0, 'CTRL' );
1270
+ this.setMouseAction( 'PAN', 2 );
1271
+
1272
+ this.setMouseAction( 'ROTATE', 0 );
1273
+
1274
+ this.setMouseAction( 'ZOOM', 'WHEEL' );
1275
+ this.setMouseAction( 'ZOOM', 1 );
1276
+
1277
+ this.setMouseAction( 'FOV', 'WHEEL', 'SHIFT' );
1278
+ this.setMouseAction( 'FOV', 1, 'SHIFT' );
1279
+
1280
+
1281
+ }
1282
+
1283
+ /**
1284
+ * Compare two mouse actions.
1285
+ *
1286
+ * @private
1287
+ * @param {Object} action1 - The first mouse action.
1288
+ * @param {Object} action2 - The second mouse action.
1289
+ * @returns {boolean} `true` if action1 and action 2 are the same mouse action, `false` otherwise.
1290
+ */
1291
+ compareMouseAction( action1, action2 ) {
1292
+
1293
+ if ( action1.operation == action2.operation ) {
1294
+
1295
+ if ( action1.mouse == action2.mouse && action1.key == action2.key ) {
1296
+
1297
+ return true;
1298
+
1299
+ } else {
1300
+
1301
+ return false;
1302
+
1303
+ }
1304
+
1305
+ } else {
1306
+
1307
+ return false;
1308
+
1309
+ }
1310
+
1311
+ }
1312
+
1313
+ /**
1314
+ * Set a new mouse action by specifying the operation to be performed and a mouse/key combination. In case of conflict, replaces the existing one.
1315
+ *
1316
+ * @param {'PAN'|'ROTATE'|'ZOOM'|'FOV'} operation - The operation to be performed ('PAN', 'ROTATE', 'ZOOM', 'FOV').
1317
+ * @param {0|1|2|'WHEEL'} mouse - A mouse button (0, 1, 2) or 'WHEEL' for wheel notches.
1318
+ * @param {?('CTRL'|'SHIFT')} [key=null] - The keyboard modifier ('CTRL', 'SHIFT') or null if key is not needed.
1319
+ * @returns {boolean} `true` if the mouse action has been successfully added, `false` otherwise.
1320
+ */
1321
+ setMouseAction( operation, mouse, key = null ) {
1322
+
1323
+ const operationInput = [ 'PAN', 'ROTATE', 'ZOOM', 'FOV' ];
1324
+ const mouseInput = [ 0, 1, 2, 'WHEEL' ];
1325
+ const keyInput = [ 'CTRL', 'SHIFT', null ];
1326
+ let state;
1327
+
1328
+ if ( ! operationInput.includes( operation ) || ! mouseInput.includes( mouse ) || ! keyInput.includes( key ) ) {
1329
+
1330
+ //invalid parameters
1331
+ return false;
1332
+
1333
+ }
1334
+
1335
+ if ( mouse == 'WHEEL' ) {
1336
+
1337
+ if ( operation != 'ZOOM' && operation != 'FOV' ) {
1338
+
1339
+ //cannot associate 2D operation to 1D input
1340
+ return false;
1341
+
1342
+ }
1343
+
1344
+ }
1345
+
1346
+ switch ( operation ) {
1347
+
1348
+ case 'PAN':
1349
+
1350
+ state = STATE.PAN;
1351
+ break;
1352
+
1353
+ case 'ROTATE':
1354
+
1355
+ state = STATE.ROTATE;
1356
+ break;
1357
+
1358
+ case 'ZOOM':
1359
+
1360
+ state = STATE.SCALE;
1361
+ break;
1362
+
1363
+ case 'FOV':
1364
+
1365
+ state = STATE.FOV;
1366
+ break;
1367
+
1368
+ }
1369
+
1370
+ const action = {
1371
+
1372
+ operation: operation,
1373
+ mouse: mouse,
1374
+ key: key,
1375
+ state: state
1376
+
1377
+ };
1378
+
1379
+ for ( let i = 0; i < this.mouseActions.length; i ++ ) {
1380
+
1381
+ if ( this.mouseActions[ i ].mouse == action.mouse && this.mouseActions[ i ].key == action.key ) {
1382
+
1383
+ this.mouseActions.splice( i, 1, action );
1384
+ return true;
1385
+
1386
+ }
1387
+
1388
+ }
1389
+
1390
+ this.mouseActions.push( action );
1391
+ return true;
1392
+
1393
+ }
1394
+
1395
+ /**
1396
+ * Remove a mouse action by specifying its mouse/key combination.
1397
+ *
1398
+ * @param {0|1|2|'WHEEL'} mouse - A mouse button (0, 1, 2) or 'WHEEL' for wheel notches.
1399
+ * @param {?('CTRL'|'SHIFT')} key - The keyboard modifier ('CTRL', 'SHIFT') or null if key is not needed.
1400
+ * @returns {boolean} `true` if the operation has been successfully removed, `false` otherwise.
1401
+ */
1402
+ unsetMouseAction( mouse, key = null ) {
1403
+
1404
+ for ( let i = 0; i < this.mouseActions.length; i ++ ) {
1405
+
1406
+ if ( this.mouseActions[ i ].mouse == mouse && this.mouseActions[ i ].key == key ) {
1407
+
1408
+ this.mouseActions.splice( i, 1 );
1409
+ return true;
1410
+
1411
+ }
1412
+
1413
+ }
1414
+
1415
+ return false;
1416
+
1417
+ }
1418
+
1419
+ /**
1420
+ * Return the operation associated to a mouse/keyboard combination.
1421
+ *
1422
+ * @private
1423
+ * @param {0|1|2|'WHEEL'} mouse - Mouse button index (0, 1, 2) or 'WHEEL' for wheel notches.
1424
+ * @param {?('CTRL'|'SHIFT')} key - Keyboard modifier.
1425
+ * @returns {?('PAN'|'ROTATE'|'ZOOM'|'FOV')} The operation if it has been found, `null` otherwise.
1426
+ */
1427
+ getOpFromAction( mouse, key ) {
1428
+
1429
+ let action;
1430
+
1431
+ for ( let i = 0; i < this.mouseActions.length; i ++ ) {
1432
+
1433
+ action = this.mouseActions[ i ];
1434
+ if ( action.mouse == mouse && action.key == key ) {
1435
+
1436
+ return action.operation;
1437
+
1438
+ }
1439
+
1440
+ }
1441
+
1442
+ if ( key != null ) {
1443
+
1444
+ for ( let i = 0; i < this.mouseActions.length; i ++ ) {
1445
+
1446
+ action = this.mouseActions[ i ];
1447
+ if ( action.mouse == mouse && action.key == null ) {
1448
+
1449
+ return action.operation;
1450
+
1451
+ }
1452
+
1453
+ }
1454
+
1455
+ }
1456
+
1457
+ return null;
1458
+
1459
+ }
1460
+
1461
+ /**
1462
+ * Get the operation associated to mouse and key combination and returns the corresponding FSA state.
1463
+ *
1464
+ * @private
1465
+ * @param {0|1|2} mouse - Mouse button index (0, 1, 2)
1466
+ * @param {?('CTRL'|'SHIFT')} key - Keyboard modifier
1467
+ * @returns {?STATE} The FSA state obtained from the operation associated to mouse/keyboard combination.
1468
+ */
1469
+ getOpStateFromAction( mouse, key ) {
1470
+
1471
+ let action;
1472
+
1473
+ for ( let i = 0; i < this.mouseActions.length; i ++ ) {
1474
+
1475
+ action = this.mouseActions[ i ];
1476
+ if ( action.mouse == mouse && action.key == key ) {
1477
+
1478
+ return action.state;
1479
+
1480
+ }
1481
+
1482
+ }
1483
+
1484
+ if ( key != null ) {
1485
+
1486
+ for ( let i = 0; i < this.mouseActions.length; i ++ ) {
1487
+
1488
+ action = this.mouseActions[ i ];
1489
+ if ( action.mouse == mouse && action.key == null ) {
1490
+
1491
+ return action.state;
1492
+
1493
+ }
1494
+
1495
+ }
1496
+
1497
+ }
1498
+
1499
+ return null;
1500
+
1501
+ }
1502
+
1503
+ /**
1504
+ * Calculate the angle between two pointers.
1505
+ *
1506
+ * @private
1507
+ * @param {PointerEvent} p1 - The first pointer event.
1508
+ * @param {PointerEvent} p2 - The second pointer event.
1509
+ * @returns {number} The angle between two pointers in degrees.
1510
+ */
1511
+ getAngle( p1, p2 ) {
1512
+
1513
+ return Math.atan2( p2.clientY - p1.clientY, p2.clientX - p1.clientX ) * 180 / Math.PI;
1514
+
1515
+ }
1516
+
1517
+ /**
1518
+ * Updates a PointerEvent inside current pointerevents array.
1519
+ *
1520
+ * @private
1521
+ * @param {PointerEvent} event - The pointer event.
1522
+ */
1523
+ updateTouchEvent( event ) {
1524
+
1525
+ for ( let i = 0; i < this._touchCurrent.length; i ++ ) {
1526
+
1527
+ if ( this._touchCurrent[ i ].pointerId == event.pointerId ) {
1528
+
1529
+ this._touchCurrent.splice( i, 1, event );
1530
+ break;
1531
+
1532
+ }
1533
+
1534
+ }
1535
+
1536
+ }
1537
+
1538
+ /**
1539
+ * Applies a transformation matrix, to the camera and gizmos.
1540
+ *
1541
+ * @private
1542
+ * @param {Object} transformation - Object containing matrices to apply to camera and gizmos.
1543
+ */
1544
+ applyTransformMatrix( transformation ) {
1545
+
1546
+ if ( transformation.camera != null ) {
1547
+
1548
+ this._m4_1.copy( this._cameraMatrixState ).premultiply( transformation.camera );
1549
+ this._m4_1.decompose( this.object.position, this.object.quaternion, this.object.scale );
1550
+ this.object.updateMatrix();
1551
+
1552
+ //update camera up vector
1553
+ if ( this._state == STATE.ROTATE || this._state == STATE.ZROTATE || this._state == STATE.ANIMATION_ROTATE ) {
1554
+
1555
+ this.object.up.copy( this._upState ).applyQuaternion( this.object.quaternion );
1556
+
1557
+ }
1558
+
1559
+ }
1560
+
1561
+ if ( transformation.gizmos != null ) {
1562
+
1563
+ this._m4_1.copy( this._gizmoMatrixState ).premultiply( transformation.gizmos );
1564
+ this._m4_1.decompose( this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale );
1565
+ this._gizmos.updateMatrix();
1566
+
1567
+ }
1568
+
1569
+ if ( this._state == STATE.SCALE || this._state == STATE.FOCUS || this._state == STATE.ANIMATION_FOCUS ) {
1570
+
1571
+ this._tbRadius = this.calculateTbRadius( this.object );
1572
+
1573
+ if ( this.adjustNearFar ) {
1574
+
1575
+ const cameraDistance = this.object.position.distanceTo( this._gizmos.position );
1576
+
1577
+ const bb = new Box3();
1578
+ bb.setFromObject( this._gizmos );
1579
+ const sphere = new Sphere();
1580
+ bb.getBoundingSphere( sphere );
1581
+
1582
+ const adjustedNearPosition = Math.max( this._nearPos0, sphere.radius + sphere.center.length() );
1583
+ const regularNearPosition = cameraDistance - this._initialNear;
1584
+
1585
+ const minNearPos = Math.min( adjustedNearPosition, regularNearPosition );
1586
+ this.object.near = cameraDistance - minNearPos;
1587
+
1588
+
1589
+ const adjustedFarPosition = Math.min( this._farPos0, - sphere.radius + sphere.center.length() );
1590
+ const regularFarPosition = cameraDistance - this._initialFar;
1591
+
1592
+ const minFarPos = Math.min( adjustedFarPosition, regularFarPosition );
1593
+ this.object.far = cameraDistance - minFarPos;
1594
+
1595
+ this.object.updateProjectionMatrix();
1596
+
1597
+ } else {
1598
+
1599
+ let update = false;
1600
+
1601
+ if ( this.object.near != this._initialNear ) {
1602
+
1603
+ this.object.near = this._initialNear;
1604
+ update = true;
1605
+
1606
+ }
1607
+
1608
+ if ( this.object.far != this._initialFar ) {
1609
+
1610
+ this.object.far = this._initialFar;
1611
+ update = true;
1612
+
1613
+ }
1614
+
1615
+ if ( update ) {
1616
+
1617
+ this.object.updateProjectionMatrix();
1618
+
1619
+ }
1620
+
1621
+ }
1622
+
1623
+ }
1624
+
1625
+ }
1626
+
1627
+ /**
1628
+ * Calculates the angular speed.
1629
+ *
1630
+ * @private
1631
+ * @param {number} p0 - Position at t0.
1632
+ * @param {number} p1 - Position at t1.
1633
+ * @param {number} t0 - Initial time in milliseconds.
1634
+ * @param {number} t1 - Ending time in milliseconds.
1635
+ * @returns {number} The angular speed.
1636
+ */
1637
+ calculateAngularSpeed( p0, p1, t0, t1 ) {
1638
+
1639
+ const s = p1 - p0;
1640
+ const t = ( t1 - t0 ) / 1000;
1641
+ if ( t == 0 ) {
1642
+
1643
+ return 0;
1644
+
1645
+ }
1646
+
1647
+ return s / t;
1648
+
1649
+ }
1650
+
1651
+ /**
1652
+ * Calculates the distance between two pointers.
1653
+ *
1654
+ * @private
1655
+ * @param {PointerEvent} p0 - The first pointer.
1656
+ * @param {PointerEvent} p1 - The second pointer.
1657
+ * @returns {number} The distance between the two pointers.
1658
+ */
1659
+ calculatePointersDistance( p0, p1 ) {
1660
+
1661
+ return Math.sqrt( Math.pow( p1.clientX - p0.clientX, 2 ) + Math.pow( p1.clientY - p0.clientY, 2 ) );
1662
+
1663
+ }
1664
+
1665
+ /**
1666
+ * Calculates the rotation axis as the vector perpendicular between two vectors.
1667
+ *
1668
+ * @private
1669
+ * @param {Vector3} vec1 - The first vector.
1670
+ * @param {Vector3} vec2 - The second vector.
1671
+ * @returns {Vector3} The normalized rotation axis.
1672
+ */
1673
+ calculateRotationAxis( vec1, vec2 ) {
1674
+
1675
+ this._rotationMatrix.extractRotation( this._cameraMatrixState );
1676
+ this._quat.setFromRotationMatrix( this._rotationMatrix );
1677
+
1678
+ this._rotationAxis.crossVectors( vec1, vec2 ).applyQuaternion( this._quat );
1679
+ return this._rotationAxis.normalize().clone();
1680
+
1681
+ }
1682
+
1683
+ /**
1684
+ * Calculates the trackball radius so that gizmo's diameter will be 2/3 of the minimum side of the camera frustum.
1685
+ *
1686
+ * @private
1687
+ * @param {Camera} camera - The camera.
1688
+ * @returns {number} The trackball radius.
1689
+ */
1690
+ calculateTbRadius( camera ) {
1691
+
1692
+ const distance = camera.position.distanceTo( this._gizmos.position );
1693
+
1694
+ if ( camera.type == 'PerspectiveCamera' ) {
1695
+
1696
+ const halfFovV = MathUtils.DEG2RAD * camera.fov * 0.5; //vertical fov/2 in radians
1697
+ const halfFovH = Math.atan( ( camera.aspect ) * Math.tan( halfFovV ) ); //horizontal fov/2 in radians
1698
+ return Math.tan( Math.min( halfFovV, halfFovH ) ) * distance * this.radiusFactor;
1699
+
1700
+ } else if ( camera.type == 'OrthographicCamera' ) {
1701
+
1702
+ return Math.min( camera.top, camera.right ) * this.radiusFactor;
1703
+
1704
+ }
1705
+
1706
+ }
1707
+
1708
+ /**
1709
+ * Focus operation consist of positioning the point of interest in front of the camera and a slightly zoom in.
1710
+ *
1711
+ * @private
1712
+ * @param {Vector3} point - The point of interest.
1713
+ * @param {number} size - Scale factor.
1714
+ * @param {number} [amount=1] - Amount of operation to be completed (used for focus animations, default is complete full operation).
1715
+ */
1716
+ focus( point, size, amount = 1 ) {
1717
+
1718
+ //move center of camera (along with gizmos) towards point of interest
1719
+ _offset.copy( point ).sub( this._gizmos.position ).multiplyScalar( amount );
1720
+ this._translationMatrix.makeTranslation( _offset.x, _offset.y, _offset.z );
1721
+
1722
+ _gizmoMatrixStateTemp.copy( this._gizmoMatrixState );
1723
+ this._gizmoMatrixState.premultiply( this._translationMatrix );
1724
+ this._gizmoMatrixState.decompose( this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale );
1725
+
1726
+ _cameraMatrixStateTemp.copy( this._cameraMatrixState );
1727
+ this._cameraMatrixState.premultiply( this._translationMatrix );
1728
+ this._cameraMatrixState.decompose( this.object.position, this.object.quaternion, this.object.scale );
1729
+
1730
+ //apply zoom
1731
+ if ( this.enableZoom ) {
1732
+
1733
+ this.applyTransformMatrix( this.scale( size, this._gizmos.position ) );
1734
+
1735
+ }
1736
+
1737
+ this._gizmoMatrixState.copy( _gizmoMatrixStateTemp );
1738
+ this._cameraMatrixState.copy( _cameraMatrixStateTemp );
1739
+
1740
+ }
1741
+
1742
+ /**
1743
+ * Creates a grid if necessary and adds it to the scene.
1744
+ *
1745
+ * @private
1746
+ */
1747
+ drawGrid() {
1748
+
1749
+ if ( this.scene != null ) {
1750
+
1751
+ const color = 0x888888;
1752
+ const multiplier = 3;
1753
+ let size, divisions, maxLength, tick;
1754
+
1755
+ if ( this.object.isOrthographicCamera ) {
1756
+
1757
+ const width = this.object.right - this.object.left;
1758
+ const height = this.object.bottom - this.object.top;
1759
+
1760
+ maxLength = Math.max( width, height );
1761
+ tick = maxLength / 20;
1762
+
1763
+ size = maxLength / this.object.zoom * multiplier;
1764
+ divisions = size / tick * this.object.zoom;
1765
+
1766
+ } else if ( this.object.isPerspectiveCamera ) {
1767
+
1768
+ const distance = this.object.position.distanceTo( this._gizmos.position );
1769
+ const halfFovV = MathUtils.DEG2RAD * this.object.fov * 0.5;
1770
+ const halfFovH = Math.atan( ( this.object.aspect ) * Math.tan( halfFovV ) );
1771
+
1772
+ maxLength = Math.tan( Math.max( halfFovV, halfFovH ) ) * distance * 2;
1773
+ tick = maxLength / 20;
1774
+
1775
+ size = maxLength * multiplier;
1776
+ divisions = size / tick;
1777
+
1778
+ }
1779
+
1780
+ if ( this._grid == null ) {
1781
+
1782
+ this._grid = new GridHelper( size, divisions, color, color );
1783
+ this._grid.position.copy( this._gizmos.position );
1784
+ this._gridPosition.copy( this._grid.position );
1785
+ this._grid.quaternion.copy( this.object.quaternion );
1786
+ this._grid.rotateX( Math.PI * 0.5 );
1787
+
1788
+ this.scene.add( this._grid );
1789
+
1790
+ }
1791
+
1792
+ }
1793
+
1794
+ }
1795
+
1796
+ dispose() {
1797
+
1798
+ if ( this._animationId != - 1 ) {
1799
+
1800
+ window.cancelAnimationFrame( this._animationId );
1801
+
1802
+ }
1803
+
1804
+ this.disconnect();
1805
+
1806
+ if ( this.scene !== null ) this.scene.remove( this._gizmos );
1807
+ this.disposeGrid();
1808
+
1809
+ }
1810
+
1811
+ /**
1812
+ * Removes the grid from the scene.
1813
+ */
1814
+ disposeGrid() {
1815
+
1816
+ if ( this._grid != null && this.scene != null ) {
1817
+
1818
+ this.scene.remove( this._grid );
1819
+ this._grid = null;
1820
+
1821
+ }
1822
+
1823
+ }
1824
+
1825
+ /**
1826
+ * Computes the easing out cubic function for ease out effect in animation.
1827
+ *
1828
+ * @private
1829
+ * @param {number} t - The absolute progress of the animation in the bound of `0` (beginning of the) and `1` (ending of animation).
1830
+ * @returns {number} Result of easing out cubic at time `t`.
1831
+ */
1832
+ easeOutCubic( t ) {
1833
+
1834
+ return 1 - Math.pow( 1 - t, 3 );
1835
+
1836
+ }
1837
+
1838
+ /**
1839
+ * Makes rotation gizmos more or less visible.
1840
+ *
1841
+ * @param {boolean} isActive - If set to `true`, gizmos are more visible.
1842
+ */
1843
+ activateGizmos( isActive ) {
1844
+
1845
+ const gizmoX = this._gizmos.children[ 0 ];
1846
+ const gizmoY = this._gizmos.children[ 1 ];
1847
+ const gizmoZ = this._gizmos.children[ 2 ];
1848
+
1849
+ if ( isActive ) {
1850
+
1851
+ gizmoX.material.setValues( { opacity: 1 } );
1852
+ gizmoY.material.setValues( { opacity: 1 } );
1853
+ gizmoZ.material.setValues( { opacity: 1 } );
1854
+
1855
+ } else {
1856
+
1857
+ gizmoX.material.setValues( { opacity: 0.6 } );
1858
+ gizmoY.material.setValues( { opacity: 0.6 } );
1859
+ gizmoZ.material.setValues( { opacity: 0.6 } );
1860
+
1861
+ }
1862
+
1863
+ }
1864
+
1865
+ /**
1866
+ * Calculates the cursor position in NDC.
1867
+ *
1868
+ * @private
1869
+ * @param {number} cursorX - Cursor horizontal coordinate within the canvas.
1870
+ * @param {number} cursorY - Cursor vertical coordinate within the canvas.
1871
+ * @param {HTMLElement} canvas - The canvas where the renderer draws its output.
1872
+ * @returns {Vector2} Cursor normalized position inside the canvas.
1873
+ */
1874
+ getCursorNDC( cursorX, cursorY, canvas ) {
1875
+
1876
+ const canvasRect = canvas.getBoundingClientRect();
1877
+ this._v2_1.setX( ( ( cursorX - canvasRect.left ) / canvasRect.width ) * 2 - 1 );
1878
+ this._v2_1.setY( ( ( canvasRect.bottom - cursorY ) / canvasRect.height ) * 2 - 1 );
1879
+ return this._v2_1.clone();
1880
+
1881
+ }
1882
+
1883
+ /**
1884
+ * Calculates the cursor position inside the canvas x/y coordinates with the origin being in the center of the canvas.
1885
+ *
1886
+ * @private
1887
+ * @param {number} cursorX - Cursor horizontal coordinate within the canvas.
1888
+ * @param {number} cursorY - Cursor vertical coordinate within the canvas.
1889
+ * @param {HTMLElement} canvas - The canvas where the renderer draws its output.
1890
+ * @returns {Vector2} Cursor position inside the canvas.
1891
+ */
1892
+ getCursorPosition( cursorX, cursorY, canvas ) {
1893
+
1894
+ this._v2_1.copy( this.getCursorNDC( cursorX, cursorY, canvas ) );
1895
+ this._v2_1.x *= ( this.object.right - this.object.left ) * 0.5;
1896
+ this._v2_1.y *= ( this.object.top - this.object.bottom ) * 0.5;
1897
+ return this._v2_1.clone();
1898
+
1899
+ }
1900
+
1901
+ /**
1902
+ * Sets the camera to be controlled. Must be called in order to set a new camera to be controlled.
1903
+ *
1904
+ * @param {Camera} camera - The camera to be controlled.
1905
+ */
1906
+ setCamera( camera ) {
1907
+
1908
+ camera.lookAt( this.target );
1909
+ camera.updateMatrix();
1910
+
1911
+ //setting state
1912
+ if ( camera.type == 'PerspectiveCamera' ) {
1913
+
1914
+ this._fov0 = camera.fov;
1915
+ this._fovState = camera.fov;
1916
+
1917
+ }
1918
+
1919
+ this._cameraMatrixState0.copy( camera.matrix );
1920
+ this._cameraMatrixState.copy( this._cameraMatrixState0 );
1921
+ this._cameraProjectionState.copy( camera.projectionMatrix );
1922
+ this._zoom0 = camera.zoom;
1923
+ this._zoomState = this._zoom0;
1924
+
1925
+ this._initialNear = camera.near;
1926
+ this._nearPos0 = camera.position.distanceTo( this.target ) - camera.near;
1927
+ this._nearPos = this._initialNear;
1928
+
1929
+ this._initialFar = camera.far;
1930
+ this._farPos0 = camera.position.distanceTo( this.target ) - camera.far;
1931
+ this._farPos = this._initialFar;
1932
+
1933
+ this._up0.copy( camera.up );
1934
+ this._upState.copy( camera.up );
1935
+
1936
+ this.object = camera;
1937
+ this.object.updateProjectionMatrix();
1938
+
1939
+ //making gizmos
1940
+ this._tbRadius = this.calculateTbRadius( camera );
1941
+ this.makeGizmos( this.target, this._tbRadius );
1942
+
1943
+ }
1944
+
1945
+ /**
1946
+ * Sets gizmos visibility.
1947
+ *
1948
+ * @param {boolean} value - Value of gizmos visibility.
1949
+ */
1950
+ setGizmosVisible( value ) {
1951
+
1952
+ this._gizmos.visible = value;
1953
+ this.dispatchEvent( _changeEvent );
1954
+
1955
+ }
1956
+
1957
+ /**
1958
+ * Sets gizmos radius factor and redraws gizmos.
1959
+ *
1960
+ * @param {number} value - Value of radius factor.
1961
+ */
1962
+ setTbRadius( value ) {
1963
+
1964
+ this.radiusFactor = value;
1965
+ this._tbRadius = this.calculateTbRadius( this.object );
1966
+
1967
+ const curve = new EllipseCurve( 0, 0, this._tbRadius, this._tbRadius );
1968
+ const points = curve.getPoints( this._curvePts );
1969
+ const curveGeometry = new BufferGeometry().setFromPoints( points );
1970
+
1971
+
1972
+ for ( const gizmo in this._gizmos.children ) {
1973
+
1974
+ this._gizmos.children[ gizmo ].geometry = curveGeometry;
1975
+
1976
+ }
1977
+
1978
+ this.dispatchEvent( _changeEvent );
1979
+
1980
+ }
1981
+
1982
+ /**
1983
+ * Creates the rotation gizmos matching trackball center and radius.
1984
+ *
1985
+ * @private
1986
+ * @param {Vector3} tbCenter - The trackball center.
1987
+ * @param {number} tbRadius - The trackball radius.
1988
+ */
1989
+ makeGizmos( tbCenter, tbRadius ) {
1990
+
1991
+ const curve = new EllipseCurve( 0, 0, tbRadius, tbRadius );
1992
+ const points = curve.getPoints( this._curvePts );
1993
+
1994
+ //geometry
1995
+ const curveGeometry = new BufferGeometry().setFromPoints( points );
1996
+
1997
+ //material
1998
+ const curveMaterialX = new LineBasicMaterial( { color: 0xff8080, fog: false, transparent: true, opacity: 0.6 } );
1999
+ const curveMaterialY = new LineBasicMaterial( { color: 0x80ff80, fog: false, transparent: true, opacity: 0.6 } );
2000
+ const curveMaterialZ = new LineBasicMaterial( { color: 0x8080ff, fog: false, transparent: true, opacity: 0.6 } );
2001
+
2002
+ //line
2003
+ const gizmoX = new Line( curveGeometry, curveMaterialX );
2004
+ const gizmoY = new Line( curveGeometry, curveMaterialY );
2005
+ const gizmoZ = new Line( curveGeometry, curveMaterialZ );
2006
+
2007
+ const rotation = Math.PI * 0.5;
2008
+ gizmoX.rotation.x = rotation;
2009
+ gizmoY.rotation.y = rotation;
2010
+
2011
+
2012
+ //setting state
2013
+ this._gizmoMatrixState0.identity().setPosition( tbCenter );
2014
+ this._gizmoMatrixState.copy( this._gizmoMatrixState0 );
2015
+
2016
+ if ( this.object.zoom !== 1 ) {
2017
+
2018
+ //adapt gizmos size to camera zoom
2019
+ const size = 1 / this.object.zoom;
2020
+ this._scaleMatrix.makeScale( size, size, size );
2021
+ this._translationMatrix.makeTranslation( - tbCenter.x, - tbCenter.y, - tbCenter.z );
2022
+
2023
+ this._gizmoMatrixState.premultiply( this._translationMatrix ).premultiply( this._scaleMatrix );
2024
+ this._translationMatrix.makeTranslation( tbCenter.x, tbCenter.y, tbCenter.z );
2025
+ this._gizmoMatrixState.premultiply( this._translationMatrix );
2026
+
2027
+ }
2028
+
2029
+ this._gizmoMatrixState.decompose( this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale );
2030
+
2031
+ //
2032
+
2033
+ this._gizmos.traverse( function ( object ) {
2034
+
2035
+ if ( object.isLine ) {
2036
+
2037
+ object.geometry.dispose();
2038
+ object.material.dispose();
2039
+
2040
+ }
2041
+
2042
+ } );
2043
+
2044
+ this._gizmos.clear();
2045
+
2046
+ //
2047
+
2048
+ this._gizmos.add( gizmoX );
2049
+ this._gizmos.add( gizmoY );
2050
+ this._gizmos.add( gizmoZ );
2051
+
2052
+ }
2053
+
2054
+ /**
2055
+ * Performs animation for focus operation.
2056
+ *
2057
+ * @private
2058
+ * @param {number} time - Instant in which this function is called as performance.now().
2059
+ * @param {Vector3} point - Point of interest for focus operation.
2060
+ * @param {Matrix4} cameraMatrix - Camera matrix.
2061
+ * @param {Matrix4} gizmoMatrix - Gizmos matrix.
2062
+ */
2063
+ onFocusAnim( time, point, cameraMatrix, gizmoMatrix ) {
2064
+
2065
+ if ( this._timeStart == - 1 ) {
2066
+
2067
+ //animation start
2068
+ this._timeStart = time;
2069
+
2070
+ }
2071
+
2072
+ if ( this._state == STATE.ANIMATION_FOCUS ) {
2073
+
2074
+ const deltaTime = time - this._timeStart;
2075
+ const animTime = deltaTime / this.focusAnimationTime;
2076
+
2077
+ this._gizmoMatrixState.copy( gizmoMatrix );
2078
+
2079
+ if ( animTime >= 1 ) {
2080
+
2081
+ //animation end
2082
+
2083
+ this._gizmoMatrixState.decompose( this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale );
2084
+
2085
+ this.focus( point, this.scaleFactor );
2086
+
2087
+ this._timeStart = - 1;
2088
+ this.updateTbState( STATE.IDLE, false );
2089
+ this.activateGizmos( false );
2090
+
2091
+ this.dispatchEvent( _changeEvent );
2092
+
2093
+ } else {
2094
+
2095
+ const amount = this.easeOutCubic( animTime );
2096
+ const size = ( ( 1 - amount ) + ( this.scaleFactor * amount ) );
2097
+
2098
+ this._gizmoMatrixState.decompose( this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale );
2099
+ this.focus( point, size, amount );
2100
+
2101
+ this.dispatchEvent( _changeEvent );
2102
+ const self = this;
2103
+ this._animationId = window.requestAnimationFrame( function ( t ) {
2104
+
2105
+ self.onFocusAnim( t, point, cameraMatrix, gizmoMatrix.clone() );
2106
+
2107
+ } );
2108
+
2109
+ }
2110
+
2111
+ } else {
2112
+
2113
+ //interrupt animation
2114
+
2115
+ this._animationId = - 1;
2116
+ this._timeStart = - 1;
2117
+
2118
+ }
2119
+
2120
+ }
2121
+
2122
+ /**
2123
+ * Performs animation for rotation operation.
2124
+ *
2125
+ * @private
2126
+ * @param {number} time - Instant in which this function is called as performance.now().
2127
+ * @param {Vector3} rotationAxis - Rotation axis.
2128
+ * @param {number} w0 - Initial angular velocity.
2129
+ */
2130
+ onRotationAnim( time, rotationAxis, w0 ) {
2131
+
2132
+ if ( this._timeStart == - 1 ) {
2133
+
2134
+ //animation start
2135
+ this._anglePrev = 0;
2136
+ this._angleCurrent = 0;
2137
+ this._timeStart = time;
2138
+
2139
+ }
2140
+
2141
+ if ( this._state == STATE.ANIMATION_ROTATE ) {
2142
+
2143
+ //w = w0 + alpha * t
2144
+ const deltaTime = ( time - this._timeStart ) / 1000;
2145
+ const w = w0 + ( ( - this.dampingFactor ) * deltaTime );
2146
+
2147
+ if ( w > 0 ) {
2148
+
2149
+ //tetha = 0.5 * alpha * t^2 + w0 * t + tetha0
2150
+ this._angleCurrent = 0.5 * ( - this.dampingFactor ) * Math.pow( deltaTime, 2 ) + w0 * deltaTime + 0;
2151
+ this.applyTransformMatrix( this.rotate( rotationAxis, this._angleCurrent ) );
2152
+ this.dispatchEvent( _changeEvent );
2153
+ const self = this;
2154
+ this._animationId = window.requestAnimationFrame( function ( t ) {
2155
+
2156
+ self.onRotationAnim( t, rotationAxis, w0 );
2157
+
2158
+ } );
2159
+
2160
+ } else {
2161
+
2162
+ this._animationId = - 1;
2163
+ this._timeStart = - 1;
2164
+
2165
+ this.updateTbState( STATE.IDLE, false );
2166
+ this.activateGizmos( false );
2167
+
2168
+ this.dispatchEvent( _changeEvent );
2169
+
2170
+ }
2171
+
2172
+ } else {
2173
+
2174
+ //interrupt animation
2175
+
2176
+ this._animationId = - 1;
2177
+ this._timeStart = - 1;
2178
+
2179
+ if ( this._state != STATE.ROTATE ) {
2180
+
2181
+ this.activateGizmos( false );
2182
+ this.dispatchEvent( _changeEvent );
2183
+
2184
+ }
2185
+
2186
+ }
2187
+
2188
+ }
2189
+
2190
+
2191
+ /**
2192
+ * Performs pan operation moving camera between two points.
2193
+ *
2194
+ * @private
2195
+ * @param {Vector3} p0 - Initial point.
2196
+ * @param {Vector3} p1 - Ending point.
2197
+ * @param {boolean} [adjust=false] - If movement should be adjusted considering camera distance (Perspective only).
2198
+ * @returns {Object}
2199
+ */
2200
+ pan( p0, p1, adjust = false ) {
2201
+
2202
+ const movement = p0.clone().sub( p1 );
2203
+
2204
+ if ( this.object.isOrthographicCamera ) {
2205
+
2206
+ //adjust movement amount
2207
+ movement.multiplyScalar( 1 / this.object.zoom );
2208
+
2209
+ } else if ( this.object.isPerspectiveCamera && adjust ) {
2210
+
2211
+ //adjust movement amount
2212
+ this._v3_1.setFromMatrixPosition( this._cameraMatrixState0 ); //camera's initial position
2213
+ this._v3_2.setFromMatrixPosition( this._gizmoMatrixState0 ); //gizmo's initial position
2214
+ const distanceFactor = this._v3_1.distanceTo( this._v3_2 ) / this.object.position.distanceTo( this._gizmos.position );
2215
+ movement.multiplyScalar( 1 / distanceFactor );
2216
+
2217
+ }
2218
+
2219
+ this._v3_1.set( movement.x, movement.y, 0 ).applyQuaternion( this.object.quaternion );
2220
+
2221
+ this._m4_1.makeTranslation( this._v3_1.x, this._v3_1.y, this._v3_1.z );
2222
+
2223
+ this.setTransformationMatrices( this._m4_1, this._m4_1 );
2224
+ return _transformation;
2225
+
2226
+ }
2227
+
2228
+ /**
2229
+ * Resets the controls.
2230
+ */
2231
+ reset() {
2232
+
2233
+ this.target.copy( this._target0 );
2234
+ this.object.zoom = this._zoom0;
2235
+
2236
+ if ( this.object.isPerspectiveCamera ) {
2237
+
2238
+ this.object.fov = this._fov0;
2239
+
2240
+ }
2241
+
2242
+ this.object.near = this._nearPos;
2243
+ this.object.far = this._farPos;
2244
+ this._cameraMatrixState.copy( this._cameraMatrixState0 );
2245
+ this._cameraMatrixState.decompose( this.object.position, this.object.quaternion, this.object.scale );
2246
+ this.object.up.copy( this._up0 );
2247
+
2248
+ this.object.updateMatrix();
2249
+ this.object.updateProjectionMatrix();
2250
+
2251
+ this._gizmoMatrixState.copy( this._gizmoMatrixState0 );
2252
+ this._gizmoMatrixState0.decompose( this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale );
2253
+ this._gizmos.updateMatrix();
2254
+
2255
+ this._tbRadius = this.calculateTbRadius( this.object );
2256
+ this.makeGizmos( this._gizmos.position, this._tbRadius );
2257
+
2258
+ this.object.lookAt( this._gizmos.position );
2259
+
2260
+ this.updateTbState( STATE.IDLE, false );
2261
+
2262
+ this.dispatchEvent( _changeEvent );
2263
+
2264
+ }
2265
+
2266
+ /**
2267
+ * Rotates the camera around an axis passing by trackball's center.
2268
+ *
2269
+ * @private
2270
+ * @param {Vector3} axis - Rotation axis.
2271
+ * @param {number} angle - Angle in radians.
2272
+ * @returns {Object} Object with 'camera' field containing transformation matrix resulting from the operation to be applied to the camera.
2273
+ */
2274
+ rotate( axis, angle ) {
2275
+
2276
+ const point = this._gizmos.position; //rotation center
2277
+ this._translationMatrix.makeTranslation( - point.x, - point.y, - point.z );
2278
+ this._rotationMatrix.makeRotationAxis( axis, - angle );
2279
+
2280
+ //rotate camera
2281
+ this._m4_1.makeTranslation( point.x, point.y, point.z );
2282
+ this._m4_1.multiply( this._rotationMatrix );
2283
+ this._m4_1.multiply( this._translationMatrix );
2284
+
2285
+ this.setTransformationMatrices( this._m4_1 );
2286
+
2287
+ return _transformation;
2288
+
2289
+ }
2290
+
2291
+ /**
2292
+ * Copy the current state to clipboard (as a readable JSON text).
2293
+ */
2294
+ copyState() {
2295
+
2296
+ let state;
2297
+ if ( this.object.isOrthographicCamera ) {
2298
+
2299
+ state = JSON.stringify( {
2300
+ arcballState: {
2301
+ cameraFar: this.object.far,
2302
+ cameraMatrix: this.object.matrix,
2303
+ cameraNear: this.object.near,
2304
+ cameraUp: this.object.up,
2305
+ cameraZoom: this.object.zoom,
2306
+ gizmoMatrix: this._gizmos.matrix,
2307
+ target: this.target
2308
+
2309
+ }
2310
+ } );
2311
+
2312
+ } else if ( this.object.isPerspectiveCamera ) {
2313
+
2314
+ state = JSON.stringify( {
2315
+ arcballState: {
2316
+ cameraFar: this.object.far,
2317
+ cameraFov: this.object.fov,
2318
+ cameraMatrix: this.object.matrix,
2319
+ cameraNear: this.object.near,
2320
+ cameraUp: this.object.up,
2321
+ cameraZoom: this.object.zoom,
2322
+ gizmoMatrix: this._gizmos.matrix,
2323
+ target: this.target
2324
+
2325
+ }
2326
+ } );
2327
+
2328
+ }
2329
+
2330
+ navigator.clipboard.writeText( state );
2331
+
2332
+ }
2333
+
2334
+ /**
2335
+ * Set the controls state from the clipboard, assumes that the clipboard stores a JSON
2336
+ * text as saved from `copyState()`.
2337
+ */
2338
+ pasteState() {
2339
+
2340
+ const self = this;
2341
+ navigator.clipboard.readText().then( function resolved( value ) {
2342
+
2343
+ self.setStateFromJSON( value );
2344
+
2345
+ } );
2346
+
2347
+ }
2348
+
2349
+ /**
2350
+ * Saves the current state of the control. This can later be recover with `reset()`.
2351
+ */
2352
+ saveState() {
2353
+
2354
+ this.object.updateMatrix();
2355
+ this._gizmos.updateMatrix();
2356
+
2357
+ this._target0.copy( this.target );
2358
+ this._cameraMatrixState0.copy( this.object.matrix );
2359
+ this._gizmoMatrixState0.copy( this._gizmos.matrix );
2360
+ this._nearPos = this.object.near;
2361
+ this._farPos = this.object.far;
2362
+ this._zoom0 = this.object.zoom;
2363
+ this._up0.copy( this.object.up );
2364
+
2365
+ if ( this.object.isPerspectiveCamera ) {
2366
+
2367
+ this._fov0 = this.object.fov;
2368
+
2369
+ }
2370
+
2371
+ }
2372
+
2373
+ /**
2374
+ * Performs uniform scale operation around a given point.
2375
+ *
2376
+ * @private
2377
+ * @param {number} size - Scale factor.
2378
+ * @param {Vector3} point - Point around which scale.
2379
+ * @param {boolean} scaleGizmos - If gizmos should be scaled (Perspective only).
2380
+ * @returns {Object} Object with 'camera' and 'gizmo' fields containing transformation matrices resulting from the operation to be applied to the camera and gizmos.
2381
+ */
2382
+ scale( size, point, scaleGizmos = true ) {
2383
+
2384
+ _scalePointTemp.copy( point );
2385
+ let sizeInverse = 1 / size;
2386
+
2387
+ if ( this.object.isOrthographicCamera ) {
2388
+
2389
+ //camera zoom
2390
+ this.object.zoom = this._zoomState;
2391
+ this.object.zoom *= size;
2392
+
2393
+ //check min and max zoom
2394
+ if ( this.object.zoom > this.maxZoom ) {
2395
+
2396
+ this.object.zoom = this.maxZoom;
2397
+ sizeInverse = this._zoomState / this.maxZoom;
2398
+
2399
+ } else if ( this.object.zoom < this.minZoom ) {
2400
+
2401
+ this.object.zoom = this.minZoom;
2402
+ sizeInverse = this._zoomState / this.minZoom;
2403
+
2404
+ }
2405
+
2406
+ this.object.updateProjectionMatrix();
2407
+
2408
+ this._v3_1.setFromMatrixPosition( this._gizmoMatrixState ); //gizmos position
2409
+
2410
+ //scale gizmos so they appear in the same spot having the same dimension
2411
+ this._scaleMatrix.makeScale( sizeInverse, sizeInverse, sizeInverse );
2412
+ this._translationMatrix.makeTranslation( - this._v3_1.x, - this._v3_1.y, - this._v3_1.z );
2413
+
2414
+ this._m4_2.makeTranslation( this._v3_1.x, this._v3_1.y, this._v3_1.z ).multiply( this._scaleMatrix );
2415
+ this._m4_2.multiply( this._translationMatrix );
2416
+
2417
+
2418
+ //move camera and gizmos to obtain pinch effect
2419
+ _scalePointTemp.sub( this._v3_1 );
2420
+
2421
+ const amount = _scalePointTemp.clone().multiplyScalar( sizeInverse );
2422
+ _scalePointTemp.sub( amount );
2423
+
2424
+ this._m4_1.makeTranslation( _scalePointTemp.x, _scalePointTemp.y, _scalePointTemp.z );
2425
+ this._m4_2.premultiply( this._m4_1 );
2426
+
2427
+ this.setTransformationMatrices( this._m4_1, this._m4_2 );
2428
+ return _transformation;
2429
+
2430
+ } else if ( this.object.isPerspectiveCamera ) {
2431
+
2432
+ this._v3_1.setFromMatrixPosition( this._cameraMatrixState );
2433
+ this._v3_2.setFromMatrixPosition( this._gizmoMatrixState );
2434
+
2435
+ //move camera
2436
+ let distance = this._v3_1.distanceTo( _scalePointTemp );
2437
+ let amount = distance - ( distance * sizeInverse );
2438
+
2439
+ //check min and max distance
2440
+ const newDistance = distance - amount;
2441
+ if ( newDistance < this.minDistance ) {
2442
+
2443
+ sizeInverse = this.minDistance / distance;
2444
+ amount = distance - ( distance * sizeInverse );
2445
+
2446
+ } else if ( newDistance > this.maxDistance ) {
2447
+
2448
+ sizeInverse = this.maxDistance / distance;
2449
+ amount = distance - ( distance * sizeInverse );
2450
+
2451
+ }
2452
+
2453
+ _offset.copy( _scalePointTemp ).sub( this._v3_1 ).normalize().multiplyScalar( amount );
2454
+
2455
+ this._m4_1.makeTranslation( _offset.x, _offset.y, _offset.z );
2456
+
2457
+
2458
+ if ( scaleGizmos ) {
2459
+
2460
+ //scale gizmos so they appear in the same spot having the same dimension
2461
+ const pos = this._v3_2;
2462
+
2463
+ distance = pos.distanceTo( _scalePointTemp );
2464
+ amount = distance - ( distance * sizeInverse );
2465
+ _offset.copy( _scalePointTemp ).sub( this._v3_2 ).normalize().multiplyScalar( amount );
2466
+
2467
+ this._translationMatrix.makeTranslation( pos.x, pos.y, pos.z );
2468
+ this._scaleMatrix.makeScale( sizeInverse, sizeInverse, sizeInverse );
2469
+
2470
+ this._m4_2.makeTranslation( _offset.x, _offset.y, _offset.z ).multiply( this._translationMatrix );
2471
+ this._m4_2.multiply( this._scaleMatrix );
2472
+
2473
+ this._translationMatrix.makeTranslation( - pos.x, - pos.y, - pos.z );
2474
+
2475
+ this._m4_2.multiply( this._translationMatrix );
2476
+ this.setTransformationMatrices( this._m4_1, this._m4_2 );
2477
+
2478
+
2479
+ } else {
2480
+
2481
+ this.setTransformationMatrices( this._m4_1 );
2482
+
2483
+ }
2484
+
2485
+ return _transformation;
2486
+
2487
+ }
2488
+
2489
+ }
2490
+
2491
+ /**
2492
+ * Sets camera fov.
2493
+ *
2494
+ * @private
2495
+ * @param {number} value - The FOV to be set.
2496
+ */
2497
+ setFov( value ) {
2498
+
2499
+ if ( this.object.isPerspectiveCamera ) {
2500
+
2501
+ this.object.fov = MathUtils.clamp( value, this.minFov, this.maxFov );
2502
+ this.object.updateProjectionMatrix();
2503
+
2504
+ }
2505
+
2506
+ }
2507
+
2508
+ /**
2509
+ * Sets values in transformation object.
2510
+ *
2511
+ * @private
2512
+ * @param {?Matrix4} [camera=null] - Transformation to be applied to the camera.
2513
+ * @param {?Matrix4} [gizmos=null] - Transformation to be applied to gizmos.
2514
+ */
2515
+ setTransformationMatrices( camera = null, gizmos = null ) {
2516
+
2517
+ if ( camera != null ) {
2518
+
2519
+ if ( _transformation.camera != null ) {
2520
+
2521
+ _transformation.camera.copy( camera );
2522
+
2523
+ } else {
2524
+
2525
+ _transformation.camera = camera.clone();
2526
+
2527
+ }
2528
+
2529
+ } else {
2530
+
2531
+ _transformation.camera = null;
2532
+
2533
+ }
2534
+
2535
+ if ( gizmos != null ) {
2536
+
2537
+ if ( _transformation.gizmos != null ) {
2538
+
2539
+ _transformation.gizmos.copy( gizmos );
2540
+
2541
+ } else {
2542
+
2543
+ _transformation.gizmos = gizmos.clone();
2544
+
2545
+ }
2546
+
2547
+ } else {
2548
+
2549
+ _transformation.gizmos = null;
2550
+
2551
+ }
2552
+
2553
+ }
2554
+
2555
+ /**
2556
+ * Rotates camera around its direction axis passing by a given point by a given angle.
2557
+ *
2558
+ * @private
2559
+ * @param {Vector3} point - The point where the rotation axis is passing trough.
2560
+ * @param {number} angle - Angle in radians.
2561
+ * @returns {Object} The computed transformation matrix.
2562
+ */
2563
+ zRotate( point, angle ) {
2564
+
2565
+ this._rotationMatrix.makeRotationAxis( this._rotationAxis, angle );
2566
+ this._translationMatrix.makeTranslation( - point.x, - point.y, - point.z );
2567
+
2568
+ this._m4_1.makeTranslation( point.x, point.y, point.z );
2569
+ this._m4_1.multiply( this._rotationMatrix );
2570
+ this._m4_1.multiply( this._translationMatrix );
2571
+
2572
+ this._v3_1.setFromMatrixPosition( this._gizmoMatrixState ).sub( point ); //vector from rotation center to gizmos position
2573
+ this._v3_2.copy( this._v3_1 ).applyAxisAngle( this._rotationAxis, angle ); //apply rotation
2574
+ this._v3_2.sub( this._v3_1 );
2575
+
2576
+ this._m4_2.makeTranslation( this._v3_2.x, this._v3_2.y, this._v3_2.z );
2577
+
2578
+ this.setTransformationMatrices( this._m4_1, this._m4_2 );
2579
+ return _transformation;
2580
+
2581
+ }
2582
+
2583
+ /**
2584
+ * Returns the raycaster that is used for user interaction. This object is shared between all
2585
+ * instances of `ArcballControls`.
2586
+ *
2587
+ * @returns {Raycaster} The internal raycaster.
2588
+ */
2589
+ getRaycaster() {
2590
+
2591
+ return _raycaster;
2592
+
2593
+ }
2594
+
2595
+
2596
+ /**
2597
+ * Unprojects the cursor on the 3D object surface.
2598
+ *
2599
+ * @private
2600
+ * @param {Vector2} cursor - Cursor coordinates in NDC.
2601
+ * @param {Camera} camera - Virtual camera.
2602
+ * @returns {?Vector3} The point of intersection with the model, if exist, null otherwise.
2603
+ */
2604
+ unprojectOnObj( cursor, camera ) {
2605
+
2606
+ const raycaster = this.getRaycaster();
2607
+ raycaster.near = camera.near;
2608
+ raycaster.far = camera.far;
2609
+ raycaster.setFromCamera( cursor, camera );
2610
+
2611
+ const intersect = raycaster.intersectObjects( this.scene.children, true );
2612
+
2613
+ for ( let i = 0; i < intersect.length; i ++ ) {
2614
+
2615
+ if ( intersect[ i ].object.uuid != this._gizmos.uuid && intersect[ i ].face != null ) {
2616
+
2617
+ return intersect[ i ].point.clone();
2618
+
2619
+ }
2620
+
2621
+ }
2622
+
2623
+ return null;
2624
+
2625
+ }
2626
+
2627
+ /**
2628
+ * Unproject the cursor on the trackball surface.
2629
+ *
2630
+ * @private
2631
+ * @param {Camera} camera - The virtual camera.
2632
+ * @param {number} cursorX - Cursor horizontal coordinate on screen.
2633
+ * @param {number} cursorY - Cursor vertical coordinate on screen.
2634
+ * @param {HTMLElement} canvas - The canvas where the renderer draws its output.
2635
+ * @param {number} tbRadius - The trackball radius.
2636
+ * @returns {Vector3} The unprojected point on the trackball surface.
2637
+ */
2638
+ unprojectOnTbSurface( camera, cursorX, cursorY, canvas, tbRadius ) {
2639
+
2640
+ if ( camera.type == 'OrthographicCamera' ) {
2641
+
2642
+ this._v2_1.copy( this.getCursorPosition( cursorX, cursorY, canvas ) );
2643
+ this._v3_1.set( this._v2_1.x, this._v2_1.y, 0 );
2644
+
2645
+ const x2 = Math.pow( this._v2_1.x, 2 );
2646
+ const y2 = Math.pow( this._v2_1.y, 2 );
2647
+ const r2 = Math.pow( this._tbRadius, 2 );
2648
+
2649
+ if ( x2 + y2 <= r2 * 0.5 ) {
2650
+
2651
+ //intersection with sphere
2652
+ this._v3_1.setZ( Math.sqrt( r2 - ( x2 + y2 ) ) );
2653
+
2654
+ } else {
2655
+
2656
+ //intersection with hyperboloid
2657
+ this._v3_1.setZ( ( r2 * 0.5 ) / ( Math.sqrt( x2 + y2 ) ) );
2658
+
2659
+ }
2660
+
2661
+ return this._v3_1;
2662
+
2663
+ } else if ( camera.type == 'PerspectiveCamera' ) {
2664
+
2665
+ //unproject cursor on the near plane
2666
+ this._v2_1.copy( this.getCursorNDC( cursorX, cursorY, canvas ) );
2667
+
2668
+ this._v3_1.set( this._v2_1.x, this._v2_1.y, - 1 );
2669
+ this._v3_1.applyMatrix4( camera.projectionMatrixInverse );
2670
+
2671
+ const rayDir = this._v3_1.clone().normalize(); //unprojected ray direction
2672
+ const cameraGizmoDistance = camera.position.distanceTo( this._gizmos.position );
2673
+ const radius2 = Math.pow( tbRadius, 2 );
2674
+
2675
+ // camera
2676
+ // |\
2677
+ // | \
2678
+ // | \
2679
+ // h | \
2680
+ // | \
2681
+ // | \
2682
+ // _ _ | _ _ _\ _ _ near plane
2683
+ // l
2684
+
2685
+ const h = this._v3_1.z;
2686
+ const l = Math.sqrt( Math.pow( this._v3_1.x, 2 ) + Math.pow( this._v3_1.y, 2 ) );
2687
+
2688
+ if ( l == 0 ) {
2689
+
2690
+ //ray aligned with camera
2691
+ rayDir.set( this._v3_1.x, this._v3_1.y, tbRadius );
2692
+ return rayDir;
2693
+
2694
+ }
2695
+
2696
+ const m = h / l;
2697
+ const q = cameraGizmoDistance;
2698
+
2699
+ /*
2700
+ * calculate intersection point between unprojected ray and trackball surface
2701
+ *|y = m * x + q
2702
+ *|x^2 + y^2 = r^2
2703
+ *
2704
+ * (m^2 + 1) * x^2 + (2 * m * q) * x + q^2 - r^2 = 0
2705
+ */
2706
+ let a = Math.pow( m, 2 ) + 1;
2707
+ let b = 2 * m * q;
2708
+ let c = Math.pow( q, 2 ) - radius2;
2709
+ let delta = Math.pow( b, 2 ) - ( 4 * a * c );
2710
+
2711
+ if ( delta >= 0 ) {
2712
+
2713
+ //intersection with sphere
2714
+ this._v2_1.setX( ( - b - Math.sqrt( delta ) ) / ( 2 * a ) );
2715
+ this._v2_1.setY( m * this._v2_1.x + q );
2716
+
2717
+ const angle = MathUtils.RAD2DEG * this._v2_1.angle();
2718
+
2719
+ if ( angle >= 45 ) {
2720
+
2721
+ //if angle between intersection point and X' axis is >= 45°, return that point
2722
+ //otherwise, calculate intersection point with hyperboloid
2723
+
2724
+ const rayLength = Math.sqrt( Math.pow( this._v2_1.x, 2 ) + Math.pow( ( cameraGizmoDistance - this._v2_1.y ), 2 ) );
2725
+ rayDir.multiplyScalar( rayLength );
2726
+ rayDir.z += cameraGizmoDistance;
2727
+ return rayDir;
2728
+
2729
+ }
2730
+
2731
+ }
2732
+
2733
+ //intersection with hyperboloid
2734
+ /*
2735
+ *|y = m * x + q
2736
+ *|y = (1 / x) * (r^2 / 2)
2737
+ *
2738
+ * m * x^2 + q * x - r^2 / 2 = 0
2739
+ */
2740
+
2741
+ a = m;
2742
+ b = q;
2743
+ c = - radius2 * 0.5;
2744
+ delta = Math.pow( b, 2 ) - ( 4 * a * c );
2745
+ this._v2_1.setX( ( - b - Math.sqrt( delta ) ) / ( 2 * a ) );
2746
+ this._v2_1.setY( m * this._v2_1.x + q );
2747
+
2748
+ const rayLength = Math.sqrt( Math.pow( this._v2_1.x, 2 ) + Math.pow( ( cameraGizmoDistance - this._v2_1.y ), 2 ) );
2749
+
2750
+ rayDir.multiplyScalar( rayLength );
2751
+ rayDir.z += cameraGizmoDistance;
2752
+ return rayDir;
2753
+
2754
+ }
2755
+
2756
+ }
2757
+
2758
+
2759
+ /**
2760
+ * Unprojects the cursor on the plane passing through the center of the trackball orthogonal to the camera.
2761
+ *
2762
+ * @private
2763
+ * @param {Camera} camera - The virtual camera.
2764
+ * @param {number} cursorX - Cursor horizontal coordinate on screen.
2765
+ * @param {number} cursorY - Cursor vertical coordinate on screen.
2766
+ * @param {HTMLElement} canvas - The canvas where the renderer draws its output.
2767
+ * @param {boolean} [initialDistance=false] - If initial distance between camera and gizmos should be used for calculations instead of current (Perspective only).
2768
+ * @returns {Vector3} The unprojected point on the trackball plane.
2769
+ */
2770
+ unprojectOnTbPlane( camera, cursorX, cursorY, canvas, initialDistance = false ) {
2771
+
2772
+ if ( camera.type == 'OrthographicCamera' ) {
2773
+
2774
+ this._v2_1.copy( this.getCursorPosition( cursorX, cursorY, canvas ) );
2775
+ this._v3_1.set( this._v2_1.x, this._v2_1.y, 0 );
2776
+
2777
+ return this._v3_1.clone();
2778
+
2779
+ } else if ( camera.type == 'PerspectiveCamera' ) {
2780
+
2781
+ this._v2_1.copy( this.getCursorNDC( cursorX, cursorY, canvas ) );
2782
+
2783
+ //unproject cursor on the near plane
2784
+ this._v3_1.set( this._v2_1.x, this._v2_1.y, - 1 );
2785
+ this._v3_1.applyMatrix4( camera.projectionMatrixInverse );
2786
+
2787
+ const rayDir = this._v3_1.clone().normalize(); //unprojected ray direction
2788
+
2789
+ // camera
2790
+ // |\
2791
+ // | \
2792
+ // | \
2793
+ // h | \
2794
+ // | \
2795
+ // | \
2796
+ // _ _ | _ _ _\ _ _ near plane
2797
+ // l
2798
+
2799
+ const h = this._v3_1.z;
2800
+ const l = Math.sqrt( Math.pow( this._v3_1.x, 2 ) + Math.pow( this._v3_1.y, 2 ) );
2801
+ let cameraGizmoDistance;
2802
+
2803
+ if ( initialDistance ) {
2804
+
2805
+ cameraGizmoDistance = this._v3_1.setFromMatrixPosition( this._cameraMatrixState0 ).distanceTo( this._v3_2.setFromMatrixPosition( this._gizmoMatrixState0 ) );
2806
+
2807
+ } else {
2808
+
2809
+ cameraGizmoDistance = camera.position.distanceTo( this._gizmos.position );
2810
+
2811
+ }
2812
+
2813
+ /*
2814
+ * calculate intersection point between unprojected ray and the plane
2815
+ *|y = mx + q
2816
+ *|y = 0
2817
+ *
2818
+ * x = -q/m
2819
+ */
2820
+ if ( l == 0 ) {
2821
+
2822
+ //ray aligned with camera
2823
+ rayDir.set( 0, 0, 0 );
2824
+ return rayDir;
2825
+
2826
+ }
2827
+
2828
+ const m = h / l;
2829
+ const q = cameraGizmoDistance;
2830
+ const x = - q / m;
2831
+
2832
+ const rayLength = Math.sqrt( Math.pow( q, 2 ) + Math.pow( x, 2 ) );
2833
+ rayDir.multiplyScalar( rayLength );
2834
+ rayDir.z = 0;
2835
+ return rayDir;
2836
+
2837
+ }
2838
+
2839
+ }
2840
+
2841
+ /**
2842
+ * Updates camera and gizmos state.
2843
+ *
2844
+ * @private
2845
+ */
2846
+ updateMatrixState() {
2847
+
2848
+ //update camera and gizmos state
2849
+ this._cameraMatrixState.copy( this.object.matrix );
2850
+ this._gizmoMatrixState.copy( this._gizmos.matrix );
2851
+
2852
+ if ( this.object.isOrthographicCamera ) {
2853
+
2854
+ this._cameraProjectionState.copy( this.object.projectionMatrix );
2855
+ this.object.updateProjectionMatrix();
2856
+ this._zoomState = this.object.zoom;
2857
+
2858
+ } else if ( this.object.isPerspectiveCamera ) {
2859
+
2860
+ this._fovState = this.object.fov;
2861
+
2862
+ }
2863
+
2864
+ }
2865
+
2866
+ /**
2867
+ * Updates the trackball FSA.
2868
+ *
2869
+ * @private
2870
+ * @param {STATE} newState - New state of the FSA.
2871
+ * @param {boolean} updateMatrices - If matrices state should be updated.
2872
+ */
2873
+ updateTbState( newState, updateMatrices ) {
2874
+
2875
+ this._state = newState;
2876
+ if ( updateMatrices ) {
2877
+
2878
+ this.updateMatrixState();
2879
+
2880
+ }
2881
+
2882
+ }
2883
+
2884
+ update() {
2885
+
2886
+ if ( this.target.equals( this._currentTarget ) === false ) {
2887
+
2888
+ this._gizmos.position.copy( this.target ); //for correct radius calculation
2889
+ this._tbRadius = this.calculateTbRadius( this.object );
2890
+ this.makeGizmos( this.target, this._tbRadius );
2891
+ this._currentTarget.copy( this.target );
2892
+
2893
+ }
2894
+
2895
+ //check min/max parameters
2896
+ if ( this.object.isOrthographicCamera ) {
2897
+
2898
+ //check zoom
2899
+ if ( this.object.zoom > this.maxZoom || this.object.zoom < this.minZoom ) {
2900
+
2901
+ const newZoom = MathUtils.clamp( this.object.zoom, this.minZoom, this.maxZoom );
2902
+ this.applyTransformMatrix( this.scale( newZoom / this.object.zoom, this._gizmos.position, true ) );
2903
+
2904
+ }
2905
+
2906
+ } else if ( this.object.isPerspectiveCamera ) {
2907
+
2908
+ //check distance
2909
+ const distance = this.object.position.distanceTo( this._gizmos.position );
2910
+
2911
+ if ( distance > this.maxDistance + _EPS || distance < this.minDistance - _EPS ) {
2912
+
2913
+ const newDistance = MathUtils.clamp( distance, this.minDistance, this.maxDistance );
2914
+ this.applyTransformMatrix( this.scale( newDistance / distance, this._gizmos.position ) );
2915
+ this.updateMatrixState();
2916
+
2917
+ }
2918
+
2919
+ //check fov
2920
+ if ( this.object.fov < this.minFov || this.object.fov > this.maxFov ) {
2921
+
2922
+ this.object.fov = MathUtils.clamp( this.object.fov, this.minFov, this.maxFov );
2923
+ this.object.updateProjectionMatrix();
2924
+
2925
+ }
2926
+
2927
+ const oldRadius = this._tbRadius;
2928
+ this._tbRadius = this.calculateTbRadius( this.object );
2929
+
2930
+ if ( oldRadius < this._tbRadius - _EPS || oldRadius > this._tbRadius + _EPS ) {
2931
+
2932
+ const scale = ( this._gizmos.scale.x + this._gizmos.scale.y + this._gizmos.scale.z ) / 3;
2933
+ const newRadius = this._tbRadius / scale;
2934
+ const curve = new EllipseCurve( 0, 0, newRadius, newRadius );
2935
+ const points = curve.getPoints( this._curvePts );
2936
+ const curveGeometry = new BufferGeometry().setFromPoints( points );
2937
+
2938
+ for ( const gizmo in this._gizmos.children ) {
2939
+
2940
+ this._gizmos.children[ gizmo ].geometry = curveGeometry;
2941
+
2942
+ }
2943
+
2944
+ }
2945
+
2946
+ }
2947
+
2948
+ this.object.lookAt( this._gizmos.position );
2949
+
2950
+ }
2951
+
2952
+ setStateFromJSON( json ) {
2953
+
2954
+ const state = JSON.parse( json );
2955
+
2956
+ if ( state.arcballState != undefined ) {
2957
+
2958
+ this.target.fromArray( state.arcballState.target );
2959
+
2960
+ this._cameraMatrixState.fromArray( state.arcballState.cameraMatrix.elements );
2961
+ this._cameraMatrixState.decompose( this.object.position, this.object.quaternion, this.object.scale );
2962
+
2963
+ this.object.up.copy( state.arcballState.cameraUp );
2964
+ this.object.near = state.arcballState.cameraNear;
2965
+ this.object.far = state.arcballState.cameraFar;
2966
+
2967
+ this.object.zoom = state.arcballState.cameraZoom;
2968
+
2969
+ if ( this.object.isPerspectiveCamera ) {
2970
+
2971
+ this.object.fov = state.arcballState.cameraFov;
2972
+
2973
+ }
2974
+
2975
+ this._gizmoMatrixState.fromArray( state.arcballState.gizmoMatrix.elements );
2976
+ this._gizmoMatrixState.decompose( this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale );
2977
+
2978
+ this.object.updateMatrix();
2979
+ this.object.updateProjectionMatrix();
2980
+
2981
+ this._gizmos.updateMatrix();
2982
+
2983
+ this._tbRadius = this.calculateTbRadius( this.object );
2984
+ const gizmoTmp = new Matrix4().copy( this._gizmoMatrixState0 );
2985
+ this.makeGizmos( this._gizmos.position, this._tbRadius );
2986
+ this._gizmoMatrixState0.copy( gizmoTmp );
2987
+
2988
+ this.object.lookAt( this._gizmos.position );
2989
+ this.updateTbState( STATE.IDLE, false );
2990
+
2991
+ this.dispatchEvent( _changeEvent );
2992
+
2993
+ }
2994
+
2995
+ }
2996
+
2997
+ }
2998
+
2999
+ //listeners
3000
+
3001
+ function onWindowResize() {
3002
+
3003
+ const scale = ( this._gizmos.scale.x + this._gizmos.scale.y + this._gizmos.scale.z ) / 3;
3004
+ this._tbRadius = this.calculateTbRadius( this.object );
3005
+
3006
+ const newRadius = this._tbRadius / scale;
3007
+ const curve = new EllipseCurve( 0, 0, newRadius, newRadius );
3008
+ const points = curve.getPoints( this._curvePts );
3009
+ const curveGeometry = new BufferGeometry().setFromPoints( points );
3010
+
3011
+
3012
+ for ( const gizmo in this._gizmos.children ) {
3013
+
3014
+ this._gizmos.children[ gizmo ].geometry = curveGeometry;
3015
+
3016
+ }
3017
+
3018
+ this.dispatchEvent( _changeEvent );
3019
+
3020
+ }
3021
+
3022
+ function onContextMenu( event ) {
3023
+
3024
+ if ( ! this.enabled ) {
3025
+
3026
+ return;
3027
+
3028
+ }
3029
+
3030
+ for ( let i = 0; i < this.mouseActions.length; i ++ ) {
3031
+
3032
+ if ( this.mouseActions[ i ].mouse == 2 ) {
3033
+
3034
+ //prevent only if button 2 is actually used
3035
+ event.preventDefault();
3036
+ break;
3037
+
3038
+ }
3039
+
3040
+ }
3041
+
3042
+ }
3043
+
3044
+ function onPointerCancel() {
3045
+
3046
+ this._touchStart.splice( 0, this._touchStart.length );
3047
+ this._touchCurrent.splice( 0, this._touchCurrent.length );
3048
+ this._input = INPUT.NONE;
3049
+
3050
+ }
3051
+
3052
+ function onPointerDown( event ) {
3053
+
3054
+ if ( event.button == 0 && event.isPrimary ) {
3055
+
3056
+ this._downValid = true;
3057
+ this._downEvents.push( event );
3058
+ this._downStart = performance.now();
3059
+
3060
+ } else {
3061
+
3062
+ this._downValid = false;
3063
+
3064
+ }
3065
+
3066
+ if ( event.pointerType == 'touch' && this._input != INPUT.CURSOR ) {
3067
+
3068
+ this._touchStart.push( event );
3069
+ this._touchCurrent.push( event );
3070
+
3071
+ switch ( this._input ) {
3072
+
3073
+ case INPUT.NONE:
3074
+
3075
+ //singleStart
3076
+ this._input = INPUT.ONE_FINGER;
3077
+ this.onSinglePanStart( event, 'ROTATE' );
3078
+
3079
+ window.addEventListener( 'pointermove', this._onPointerMove );
3080
+ window.addEventListener( 'pointerup', this._onPointerUp );
3081
+
3082
+ break;
3083
+
3084
+ case INPUT.ONE_FINGER:
3085
+ case INPUT.ONE_FINGER_SWITCHED:
3086
+
3087
+ //doubleStart
3088
+ this._input = INPUT.TWO_FINGER;
3089
+
3090
+ this.onRotateStart();
3091
+ this.onPinchStart();
3092
+ this.onDoublePanStart();
3093
+
3094
+ break;
3095
+
3096
+ case INPUT.TWO_FINGER:
3097
+
3098
+ //multipleStart
3099
+ this._input = INPUT.MULT_FINGER;
3100
+ this.onTriplePanStart( event );
3101
+ break;
3102
+
3103
+ }
3104
+
3105
+ } else if ( event.pointerType != 'touch' && this._input == INPUT.NONE ) {
3106
+
3107
+ let modifier = null;
3108
+
3109
+ if ( event.ctrlKey || event.metaKey ) {
3110
+
3111
+ modifier = 'CTRL';
3112
+
3113
+ } else if ( event.shiftKey ) {
3114
+
3115
+ modifier = 'SHIFT';
3116
+
3117
+ }
3118
+
3119
+ this._mouseOp = this.getOpFromAction( event.button, modifier );
3120
+ if ( this._mouseOp != null ) {
3121
+
3122
+ window.addEventListener( 'pointermove', this._onPointerMove );
3123
+ window.addEventListener( 'pointerup', this._onPointerUp );
3124
+
3125
+ //singleStart
3126
+ this._input = INPUT.CURSOR;
3127
+ this._button = event.button;
3128
+ this.onSinglePanStart( event, this._mouseOp );
3129
+
3130
+ }
3131
+
3132
+ }
3133
+
3134
+ }
3135
+
3136
+ function onPointerMove( event ) {
3137
+
3138
+ if ( event.pointerType == 'touch' && this._input != INPUT.CURSOR ) {
3139
+
3140
+ switch ( this._input ) {
3141
+
3142
+ case INPUT.ONE_FINGER:
3143
+
3144
+ //singleMove
3145
+ this.updateTouchEvent( event );
3146
+
3147
+ this.onSinglePanMove( event, STATE.ROTATE );
3148
+ break;
3149
+
3150
+ case INPUT.ONE_FINGER_SWITCHED:
3151
+
3152
+ const movement = this.calculatePointersDistance( this._touchCurrent[ 0 ], event ) * this._devPxRatio;
3153
+
3154
+ if ( movement >= this._switchSensibility ) {
3155
+
3156
+ //singleMove
3157
+ this._input = INPUT.ONE_FINGER;
3158
+ this.updateTouchEvent( event );
3159
+
3160
+ this.onSinglePanStart( event, 'ROTATE' );
3161
+ break;
3162
+
3163
+ }
3164
+
3165
+ break;
3166
+
3167
+ case INPUT.TWO_FINGER:
3168
+
3169
+ //rotate/pan/pinchMove
3170
+ this.updateTouchEvent( event );
3171
+
3172
+ this.onRotateMove();
3173
+ this.onPinchMove();
3174
+ this.onDoublePanMove();
3175
+
3176
+ break;
3177
+
3178
+ case INPUT.MULT_FINGER:
3179
+
3180
+ //multMove
3181
+ this.updateTouchEvent( event );
3182
+
3183
+ this.onTriplePanMove( event );
3184
+ break;
3185
+
3186
+ }
3187
+
3188
+ } else if ( event.pointerType != 'touch' && this._input == INPUT.CURSOR ) {
3189
+
3190
+ let modifier = null;
3191
+
3192
+ if ( event.ctrlKey || event.metaKey ) {
3193
+
3194
+ modifier = 'CTRL';
3195
+
3196
+ } else if ( event.shiftKey ) {
3197
+
3198
+ modifier = 'SHIFT';
3199
+
3200
+ }
3201
+
3202
+ const mouseOpState = this.getOpStateFromAction( this._button, modifier );
3203
+
3204
+ if ( mouseOpState != null ) {
3205
+
3206
+ this.onSinglePanMove( event, mouseOpState );
3207
+
3208
+ }
3209
+
3210
+ }
3211
+
3212
+ //checkDistance
3213
+ if ( this._downValid ) {
3214
+
3215
+ const movement = this.calculatePointersDistance( this._downEvents[ this._downEvents.length - 1 ], event ) * this._devPxRatio;
3216
+ if ( movement > this._movementThreshold ) {
3217
+
3218
+ this._downValid = false;
3219
+
3220
+ }
3221
+
3222
+ }
3223
+
3224
+ }
3225
+
3226
+ function onPointerUp( event ) {
3227
+
3228
+ if ( event.pointerType == 'touch' && this._input != INPUT.CURSOR ) {
3229
+
3230
+ const nTouch = this._touchCurrent.length;
3231
+
3232
+ for ( let i = 0; i < nTouch; i ++ ) {
3233
+
3234
+ if ( this._touchCurrent[ i ].pointerId == event.pointerId ) {
3235
+
3236
+ this._touchCurrent.splice( i, 1 );
3237
+ this._touchStart.splice( i, 1 );
3238
+ break;
3239
+
3240
+ }
3241
+
3242
+ }
3243
+
3244
+ switch ( this._input ) {
3245
+
3246
+ case INPUT.ONE_FINGER:
3247
+ case INPUT.ONE_FINGER_SWITCHED:
3248
+
3249
+ //singleEnd
3250
+ window.removeEventListener( 'pointermove', this._onPointerMove );
3251
+ window.removeEventListener( 'pointerup', this._onPointerUp );
3252
+
3253
+ this._input = INPUT.NONE;
3254
+ this.onSinglePanEnd();
3255
+
3256
+ break;
3257
+
3258
+ case INPUT.TWO_FINGER:
3259
+
3260
+ //doubleEnd
3261
+ this.onDoublePanEnd( event );
3262
+ this.onPinchEnd( event );
3263
+ this.onRotateEnd( event );
3264
+
3265
+ //switching to singleStart
3266
+ this._input = INPUT.ONE_FINGER_SWITCHED;
3267
+
3268
+ break;
3269
+
3270
+ case INPUT.MULT_FINGER:
3271
+
3272
+ if ( this._touchCurrent.length == 0 ) {
3273
+
3274
+ window.removeEventListener( 'pointermove', this._onPointerMove );
3275
+ window.removeEventListener( 'pointerup', this._onPointerUp );
3276
+
3277
+ //multCancel
3278
+ this._input = INPUT.NONE;
3279
+ this.onTriplePanEnd();
3280
+
3281
+ }
3282
+
3283
+ break;
3284
+
3285
+ }
3286
+
3287
+ } else if ( event.pointerType != 'touch' && this._input == INPUT.CURSOR ) {
3288
+
3289
+ window.removeEventListener( 'pointermove', this._onPointerMove );
3290
+ window.removeEventListener( 'pointerup', this._onPointerUp );
3291
+
3292
+ this._input = INPUT.NONE;
3293
+ this.onSinglePanEnd();
3294
+ this._button = - 1;
3295
+
3296
+ }
3297
+
3298
+ if ( event.isPrimary ) {
3299
+
3300
+ if ( this._downValid ) {
3301
+
3302
+ const downTime = event.timeStamp - this._downEvents[ this._downEvents.length - 1 ].timeStamp;
3303
+
3304
+ if ( downTime <= this._maxDownTime ) {
3305
+
3306
+ if ( this._nclicks == 0 ) {
3307
+
3308
+ //first valid click detected
3309
+ this._nclicks = 1;
3310
+ this._clickStart = performance.now();
3311
+
3312
+ } else {
3313
+
3314
+ const clickInterval = event.timeStamp - this._clickStart;
3315
+ const movement = this.calculatePointersDistance( this._downEvents[ 1 ], this._downEvents[ 0 ] ) * this._devPxRatio;
3316
+
3317
+ if ( clickInterval <= this._maxInterval && movement <= this._posThreshold ) {
3318
+
3319
+ //second valid click detected
3320
+ //fire double tap and reset values
3321
+ this._nclicks = 0;
3322
+ this._downEvents.splice( 0, this._downEvents.length );
3323
+ this.onDoubleTap( event );
3324
+
3325
+ } else {
3326
+
3327
+ //new 'first click'
3328
+ this._nclicks = 1;
3329
+ this._downEvents.shift();
3330
+ this._clickStart = performance.now();
3331
+
3332
+ }
3333
+
3334
+ }
3335
+
3336
+ } else {
3337
+
3338
+ this._downValid = false;
3339
+ this._nclicks = 0;
3340
+ this._downEvents.splice( 0, this._downEvents.length );
3341
+
3342
+ }
3343
+
3344
+ } else {
3345
+
3346
+ this._nclicks = 0;
3347
+ this._downEvents.splice( 0, this._downEvents.length );
3348
+
3349
+ }
3350
+
3351
+ }
3352
+
3353
+ }
3354
+
3355
+ function onWheel( event ) {
3356
+
3357
+ if ( this.enabled && this.enableZoom ) {
3358
+
3359
+ let modifier = null;
3360
+
3361
+ if ( event.ctrlKey || event.metaKey ) {
3362
+
3363
+ modifier = 'CTRL';
3364
+
3365
+ } else if ( event.shiftKey ) {
3366
+
3367
+ modifier = 'SHIFT';
3368
+
3369
+ }
3370
+
3371
+ const mouseOp = this.getOpFromAction( 'WHEEL', modifier );
3372
+
3373
+ if ( mouseOp != null ) {
3374
+
3375
+ event.preventDefault();
3376
+ this.dispatchEvent( _startEvent );
3377
+
3378
+ const notchDeltaY = 125; //distance of one notch of mouse wheel
3379
+ let sgn = event.deltaY / notchDeltaY;
3380
+
3381
+ let size = 1;
3382
+
3383
+ if ( sgn > 0 ) {
3384
+
3385
+ size = 1 / this.scaleFactor;
3386
+
3387
+ } else if ( sgn < 0 ) {
3388
+
3389
+ size = this.scaleFactor;
3390
+
3391
+ }
3392
+
3393
+ switch ( mouseOp ) {
3394
+
3395
+ case 'ZOOM':
3396
+
3397
+ this.updateTbState( STATE.SCALE, true );
3398
+
3399
+ if ( sgn > 0 ) {
3400
+
3401
+ size = 1 / ( Math.pow( this.scaleFactor, sgn ) );
3402
+
3403
+ } else if ( sgn < 0 ) {
3404
+
3405
+ size = Math.pow( this.scaleFactor, - sgn );
3406
+
3407
+ }
3408
+
3409
+ if ( this.cursorZoom && this.enablePan ) {
3410
+
3411
+ let scalePoint;
3412
+
3413
+ if ( this.object.isOrthographicCamera ) {
3414
+
3415
+ scalePoint = this.unprojectOnTbPlane( this.object, event.clientX, event.clientY, this.domElement ).applyQuaternion( this.object.quaternion ).multiplyScalar( 1 / this.object.zoom ).add( this._gizmos.position );
3416
+
3417
+ } else if ( this.object.isPerspectiveCamera ) {
3418
+
3419
+ scalePoint = this.unprojectOnTbPlane( this.object, event.clientX, event.clientY, this.domElement ).applyQuaternion( this.object.quaternion ).add( this._gizmos.position );
3420
+
3421
+ }
3422
+
3423
+ this.applyTransformMatrix( this.scale( size, scalePoint ) );
3424
+
3425
+ } else {
3426
+
3427
+ this.applyTransformMatrix( this.scale( size, this._gizmos.position ) );
3428
+
3429
+ }
3430
+
3431
+ if ( this._grid != null ) {
3432
+
3433
+ this.disposeGrid();
3434
+ this.drawGrid();
3435
+
3436
+ }
3437
+
3438
+ this.updateTbState( STATE.IDLE, false );
3439
+
3440
+ this.dispatchEvent( _changeEvent );
3441
+ this.dispatchEvent( _endEvent );
3442
+
3443
+ break;
3444
+
3445
+ case 'FOV':
3446
+
3447
+ if ( this.object.isPerspectiveCamera ) {
3448
+
3449
+ this.updateTbState( STATE.FOV, true );
3450
+
3451
+
3452
+ //Vertigo effect
3453
+
3454
+ // fov / 2
3455
+ // |\
3456
+ // | \
3457
+ // | \
3458
+ // x | \
3459
+ // | \
3460
+ // | \
3461
+ // | _ _ _\
3462
+ // y
3463
+
3464
+ //check for iOs shift shortcut
3465
+ if ( event.deltaX != 0 ) {
3466
+
3467
+ sgn = event.deltaX / notchDeltaY;
3468
+
3469
+ size = 1;
3470
+
3471
+ if ( sgn > 0 ) {
3472
+
3473
+ size = 1 / ( Math.pow( this.scaleFactor, sgn ) );
3474
+
3475
+ } else if ( sgn < 0 ) {
3476
+
3477
+ size = Math.pow( this.scaleFactor, - sgn );
3478
+
3479
+ }
3480
+
3481
+ }
3482
+
3483
+ this._v3_1.setFromMatrixPosition( this._cameraMatrixState );
3484
+ const x = this._v3_1.distanceTo( this._gizmos.position );
3485
+ let xNew = x / size; //distance between camera and gizmos if scale(size, scalepoint) would be performed
3486
+
3487
+ //check min and max distance
3488
+ xNew = MathUtils.clamp( xNew, this.minDistance, this.maxDistance );
3489
+
3490
+ const y = x * Math.tan( MathUtils.DEG2RAD * this.object.fov * 0.5 );
3491
+
3492
+ //calculate new fov
3493
+ let newFov = MathUtils.RAD2DEG * ( Math.atan( y / xNew ) * 2 );
3494
+
3495
+ //check min and max fov
3496
+ if ( newFov > this.maxFov ) {
3497
+
3498
+ newFov = this.maxFov;
3499
+
3500
+ } else if ( newFov < this.minFov ) {
3501
+
3502
+ newFov = this.minFov;
3503
+
3504
+ }
3505
+
3506
+ const newDistance = y / Math.tan( MathUtils.DEG2RAD * ( newFov / 2 ) );
3507
+ size = x / newDistance;
3508
+
3509
+ this.setFov( newFov );
3510
+ this.applyTransformMatrix( this.scale( size, this._gizmos.position, false ) );
3511
+
3512
+ }
3513
+
3514
+ if ( this._grid != null ) {
3515
+
3516
+ this.disposeGrid();
3517
+ this.drawGrid();
3518
+
3519
+ }
3520
+
3521
+ this.updateTbState( STATE.IDLE, false );
3522
+
3523
+ this.dispatchEvent( _changeEvent );
3524
+ this.dispatchEvent( _endEvent );
3525
+
3526
+ break;
3527
+
3528
+ }
3529
+
3530
+ }
3531
+
3532
+ }
3533
+
3534
+ }
3535
+
3536
+ export { ArcballControls };