three-stdlib 2.35.5 → 2.35.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (514) hide show
  1. package/_polyfill/CapsuleGeometry.cjs +20 -17
  2. package/_polyfill/CapsuleGeometry.cjs.map +1 -1
  3. package/_polyfill/CapsuleGeometry.js +20 -17
  4. package/_polyfill/CapsuleGeometry.js.map +1 -1
  5. package/_polyfill/constants.cjs +1 -1
  6. package/_polyfill/constants.cjs.map +1 -1
  7. package/_polyfill/constants.js +1 -1
  8. package/_polyfill/constants.js.map +1 -1
  9. package/animation/AnimationClipCreator.cjs +13 -13
  10. package/animation/AnimationClipCreator.cjs.map +1 -1
  11. package/animation/AnimationClipCreator.js +13 -13
  12. package/animation/AnimationClipCreator.js.map +1 -1
  13. package/animation/CCDIKSolver.cjs +11 -11
  14. package/animation/CCDIKSolver.cjs.map +1 -1
  15. package/animation/CCDIKSolver.js +12 -12
  16. package/animation/CCDIKSolver.js.map +1 -1
  17. package/animation/MMDAnimationHelper.cjs +1 -1
  18. package/animation/MMDAnimationHelper.cjs.map +1 -1
  19. package/animation/MMDAnimationHelper.js +1 -1
  20. package/animation/MMDAnimationHelper.js.map +1 -1
  21. package/animation/MMDPhysics.cjs +4 -4
  22. package/animation/MMDPhysics.cjs.map +1 -1
  23. package/animation/MMDPhysics.js +4 -4
  24. package/animation/MMDPhysics.js.map +1 -1
  25. package/controls/ArcballControls.cjs +2 -2
  26. package/controls/ArcballControls.cjs.map +1 -1
  27. package/controls/ArcballControls.js +3 -3
  28. package/controls/ArcballControls.js.map +1 -1
  29. package/controls/FirstPersonControls.cjs +1 -1
  30. package/controls/FirstPersonControls.cjs.map +1 -1
  31. package/controls/FirstPersonControls.js +1 -1
  32. package/controls/FirstPersonControls.js.map +1 -1
  33. package/controls/OrbitControls.cjs +2 -2
  34. package/controls/OrbitControls.cjs.map +1 -1
  35. package/controls/OrbitControls.js +3 -3
  36. package/controls/OrbitControls.js.map +1 -1
  37. package/controls/PointerLockControls.cjs +2 -2
  38. package/controls/PointerLockControls.cjs.map +1 -1
  39. package/controls/PointerLockControls.js +3 -3
  40. package/controls/PointerLockControls.js.map +1 -1
  41. package/csm/CSM.cjs +4 -4
  42. package/csm/CSM.cjs.map +1 -1
  43. package/csm/CSM.js +5 -5
  44. package/csm/CSM.js.map +1 -1
  45. package/csm/CSMFrustum.cjs +1 -1
  46. package/csm/CSMFrustum.cjs.map +1 -1
  47. package/csm/CSMFrustum.js +2 -2
  48. package/csm/CSMFrustum.js.map +1 -1
  49. package/deprecated/Geometry.cjs +722 -715
  50. package/deprecated/Geometry.cjs.map +1 -1
  51. package/deprecated/Geometry.js +723 -716
  52. package/deprecated/Geometry.js.map +1 -1
  53. package/effects/AnaglyphEffect.cjs +2 -1
  54. package/effects/AnaglyphEffect.cjs.map +1 -1
  55. package/effects/AnaglyphEffect.js +3 -2
  56. package/effects/AnaglyphEffect.js.map +1 -1
  57. package/effects/OutlineEffect.cjs +2 -1
  58. package/effects/OutlineEffect.cjs.map +1 -1
  59. package/effects/OutlineEffect.js +3 -2
  60. package/effects/OutlineEffect.js.map +1 -1
  61. package/effects/ParallaxBarrierEffect.cjs +2 -1
  62. package/effects/ParallaxBarrierEffect.cjs.map +1 -1
  63. package/effects/ParallaxBarrierEffect.js +3 -2
  64. package/effects/ParallaxBarrierEffect.js.map +1 -1
  65. package/exporters/DRACOExporter.cjs +133 -122
  66. package/exporters/DRACOExporter.cjs.map +1 -1
  67. package/exporters/DRACOExporter.d.ts +34 -21
  68. package/exporters/DRACOExporter.js +133 -122
  69. package/exporters/DRACOExporter.js.map +1 -1
  70. package/exporters/GLTFExporter.cjs +170 -167
  71. package/exporters/GLTFExporter.cjs.map +1 -1
  72. package/exporters/GLTFExporter.js +170 -167
  73. package/exporters/GLTFExporter.js.map +1 -1
  74. package/geometries/LightningStrike.cjs +524 -515
  75. package/geometries/LightningStrike.cjs.map +1 -1
  76. package/geometries/LightningStrike.js +524 -515
  77. package/geometries/LightningStrike.js.map +1 -1
  78. package/geometries/RoundedBoxGeometry.cjs +1 -1
  79. package/geometries/RoundedBoxGeometry.cjs.map +1 -1
  80. package/geometries/RoundedBoxGeometry.js +2 -2
  81. package/geometries/RoundedBoxGeometry.js.map +1 -1
  82. package/helpers/RaycasterHelper.cjs +2 -2
  83. package/helpers/RaycasterHelper.cjs.map +1 -1
  84. package/helpers/RaycasterHelper.js +3 -3
  85. package/helpers/RaycasterHelper.js.map +1 -1
  86. package/helpers/VertexNormalsHelper.cjs +3 -3
  87. package/helpers/VertexNormalsHelper.cjs.map +1 -1
  88. package/helpers/VertexNormalsHelper.js +4 -4
  89. package/helpers/VertexNormalsHelper.js.map +1 -1
  90. package/helpers/VertexTangentsHelper.cjs +2 -2
  91. package/helpers/VertexTangentsHelper.cjs.map +1 -1
  92. package/helpers/VertexTangentsHelper.js +3 -3
  93. package/helpers/VertexTangentsHelper.js.map +1 -1
  94. package/interactive/InteractiveGroup.cjs +1 -1
  95. package/interactive/InteractiveGroup.cjs.map +1 -1
  96. package/interactive/InteractiveGroup.js +2 -2
  97. package/interactive/InteractiveGroup.js.map +1 -1
  98. package/interactive/SelectionBox.cjs +15 -15
  99. package/interactive/SelectionBox.cjs.map +1 -1
  100. package/interactive/SelectionBox.js +16 -16
  101. package/interactive/SelectionBox.js.map +1 -1
  102. package/libs/chevrotain.cjs +1 -1
  103. package/libs/chevrotain.cjs.map +1 -1
  104. package/libs/chevrotain.js +1 -1
  105. package/libs/chevrotain.js.map +1 -1
  106. package/libs/lottie.cjs +1 -1
  107. package/libs/lottie.cjs.map +1 -1
  108. package/libs/lottie.js +1 -1
  109. package/libs/lottie.js.map +1 -1
  110. package/libs/opentype.cjs +1 -1
  111. package/libs/opentype.cjs.map +1 -1
  112. package/libs/opentype.js +1 -1
  113. package/libs/opentype.js.map +1 -1
  114. package/lights/LightProbeGenerator.cjs +5 -5
  115. package/lights/LightProbeGenerator.cjs.map +1 -1
  116. package/lights/LightProbeGenerator.js +5 -5
  117. package/lights/LightProbeGenerator.js.map +1 -1
  118. package/lights/RectAreaLightUniformsLib.cjs +3 -3
  119. package/lights/RectAreaLightUniformsLib.cjs.map +1 -1
  120. package/lights/RectAreaLightUniformsLib.js +3 -3
  121. package/lights/RectAreaLightUniformsLib.js.map +1 -1
  122. package/lines/LineMaterial.cjs +2 -1
  123. package/lines/LineMaterial.cjs.map +1 -1
  124. package/lines/LineMaterial.js +3 -2
  125. package/lines/LineMaterial.js.map +1 -1
  126. package/lines/LineSegments2.cjs +13 -13
  127. package/lines/LineSegments2.cjs.map +1 -1
  128. package/lines/LineSegments2.js +14 -14
  129. package/lines/LineSegments2.js.map +1 -1
  130. package/lines/LineSegmentsGeometry.cjs +2 -2
  131. package/lines/LineSegmentsGeometry.cjs.map +1 -1
  132. package/lines/LineSegmentsGeometry.js +3 -3
  133. package/lines/LineSegmentsGeometry.js.map +1 -1
  134. package/lines/Wireframe.cjs +3 -3
  135. package/lines/Wireframe.cjs.map +1 -1
  136. package/lines/Wireframe.js +4 -4
  137. package/lines/Wireframe.js.map +1 -1
  138. package/loaders/BasisTextureLoader.cjs +441 -435
  139. package/loaders/BasisTextureLoader.cjs.map +1 -1
  140. package/loaders/BasisTextureLoader.js +441 -435
  141. package/loaders/BasisTextureLoader.js.map +1 -1
  142. package/loaders/EXRLoader.cjs +2 -1
  143. package/loaders/EXRLoader.cjs.map +1 -1
  144. package/loaders/EXRLoader.js +3 -2
  145. package/loaders/EXRLoader.js.map +1 -1
  146. package/loaders/FBXLoader.cjs +2 -2
  147. package/loaders/FBXLoader.cjs.map +1 -1
  148. package/loaders/FBXLoader.js +2 -2
  149. package/loaders/FBXLoader.js.map +1 -1
  150. package/loaders/FontLoader.cjs +2 -2
  151. package/loaders/FontLoader.cjs.map +1 -1
  152. package/loaders/FontLoader.d.ts +2 -2
  153. package/loaders/FontLoader.js +2 -2
  154. package/loaders/FontLoader.js.map +1 -1
  155. package/loaders/GLTFLoader.cjs +2 -2
  156. package/loaders/GLTFLoader.cjs.map +1 -1
  157. package/loaders/GLTFLoader.js +2 -2
  158. package/loaders/GLTFLoader.js.map +1 -1
  159. package/loaders/KTX2Loader.cjs +377 -374
  160. package/loaders/KTX2Loader.cjs.map +1 -1
  161. package/loaders/KTX2Loader.js +377 -374
  162. package/loaders/KTX2Loader.js.map +1 -1
  163. package/loaders/LDrawLoader.cjs +5 -4
  164. package/loaders/LDrawLoader.cjs.map +1 -1
  165. package/loaders/LDrawLoader.js +6 -5
  166. package/loaders/LDrawLoader.js.map +1 -1
  167. package/loaders/OBJLoader.cjs +5 -5
  168. package/loaders/OBJLoader.cjs.map +1 -1
  169. package/loaders/OBJLoader.js +6 -6
  170. package/loaders/OBJLoader.js.map +1 -1
  171. package/loaders/PRWMLoader.cjs +46 -43
  172. package/loaders/PRWMLoader.cjs.map +1 -1
  173. package/loaders/PRWMLoader.js +46 -43
  174. package/loaders/PRWMLoader.js.map +1 -1
  175. package/loaders/SVGLoader.cjs +1694 -1688
  176. package/loaders/SVGLoader.cjs.map +1 -1
  177. package/loaders/SVGLoader.js +1694 -1688
  178. package/loaders/SVGLoader.js.map +1 -1
  179. package/loaders/XLoader.cjs +1 -1
  180. package/loaders/XLoader.cjs.map +1 -1
  181. package/loaders/XLoader.js +1 -1
  182. package/loaders/XLoader.js.map +1 -1
  183. package/math/Capsule.cjs +3 -3
  184. package/math/Capsule.cjs.map +1 -1
  185. package/math/Capsule.js +3 -3
  186. package/math/Capsule.js.map +1 -1
  187. package/math/ColorConverter.cjs +9 -9
  188. package/math/ColorConverter.cjs.map +1 -1
  189. package/math/ColorConverter.js +9 -9
  190. package/math/ColorConverter.js.map +1 -1
  191. package/math/ConvexHull.cjs +53 -50
  192. package/math/ConvexHull.cjs.map +1 -1
  193. package/math/ConvexHull.js +53 -50
  194. package/math/ConvexHull.js.map +1 -1
  195. package/math/ImprovedNoise.cjs +1 -1
  196. package/math/ImprovedNoise.cjs.map +1 -1
  197. package/math/ImprovedNoise.js +1 -1
  198. package/math/ImprovedNoise.js.map +1 -1
  199. package/math/MeshSurfaceSampler.cjs +2 -2
  200. package/math/MeshSurfaceSampler.cjs.map +1 -1
  201. package/math/MeshSurfaceSampler.js +2 -2
  202. package/math/MeshSurfaceSampler.js.map +1 -1
  203. package/math/OBB.cjs +14 -14
  204. package/math/OBB.cjs.map +1 -1
  205. package/math/OBB.js +15 -15
  206. package/math/OBB.js.map +1 -1
  207. package/math/Octree.cjs +7 -7
  208. package/math/Octree.cjs.map +1 -1
  209. package/math/Octree.js +8 -8
  210. package/math/Octree.js.map +1 -1
  211. package/misc/ConvexObjectBreaker.cjs +271 -268
  212. package/misc/ConvexObjectBreaker.cjs.map +1 -1
  213. package/misc/ConvexObjectBreaker.js +272 -269
  214. package/misc/ConvexObjectBreaker.js.map +1 -1
  215. package/misc/Gyroscope.cjs +6 -6
  216. package/misc/Gyroscope.cjs.map +1 -1
  217. package/misc/Gyroscope.js +7 -7
  218. package/misc/Gyroscope.js.map +1 -1
  219. package/modifiers/CurveModifier.cjs +1 -1
  220. package/modifiers/CurveModifier.cjs.map +1 -1
  221. package/modifiers/CurveModifier.js +2 -2
  222. package/modifiers/CurveModifier.js.map +1 -1
  223. package/modifiers/SimplifyModifier.cjs +2 -2
  224. package/modifiers/SimplifyModifier.cjs.map +1 -1
  225. package/modifiers/SimplifyModifier.js +2 -2
  226. package/modifiers/SimplifyModifier.js.map +1 -1
  227. package/objects/BatchedMesh.cjs +2 -2
  228. package/objects/BatchedMesh.cjs.map +1 -1
  229. package/objects/BatchedMesh.js +3 -3
  230. package/objects/BatchedMesh.js.map +1 -1
  231. package/objects/GroundProjectedEnv.cjs +2 -1
  232. package/objects/GroundProjectedEnv.cjs.map +1 -1
  233. package/objects/GroundProjectedEnv.js +3 -2
  234. package/objects/GroundProjectedEnv.js.map +1 -1
  235. package/objects/Lensflare.cjs +209 -206
  236. package/objects/Lensflare.cjs.map +1 -1
  237. package/objects/Lensflare.js +209 -206
  238. package/objects/Lensflare.js.map +1 -1
  239. package/objects/Reflector.cjs +154 -146
  240. package/objects/Reflector.cjs.map +1 -1
  241. package/objects/Reflector.js +154 -146
  242. package/objects/Reflector.js.map +1 -1
  243. package/objects/ReflectorForSSRPass.cjs +183 -180
  244. package/objects/ReflectorForSSRPass.cjs.map +1 -1
  245. package/objects/ReflectorForSSRPass.js +183 -180
  246. package/objects/ReflectorForSSRPass.js.map +1 -1
  247. package/objects/Refractor.cjs +164 -161
  248. package/objects/Refractor.cjs.map +1 -1
  249. package/objects/Refractor.js +164 -161
  250. package/objects/Refractor.js.map +1 -1
  251. package/objects/ShadowMesh.cjs +1 -1
  252. package/objects/ShadowMesh.cjs.map +1 -1
  253. package/objects/ShadowMesh.js +2 -2
  254. package/objects/ShadowMesh.js.map +1 -1
  255. package/objects/Sky.cjs +35 -32
  256. package/objects/Sky.cjs.map +1 -1
  257. package/objects/Sky.d.ts +17 -42
  258. package/objects/Sky.js +35 -32
  259. package/objects/Sky.js.map +1 -1
  260. package/objects/Water.cjs +2 -1
  261. package/objects/Water.cjs.map +1 -1
  262. package/objects/Water.js +3 -2
  263. package/objects/Water.js.map +1 -1
  264. package/objects/Water2.cjs +143 -140
  265. package/objects/Water2.cjs.map +1 -1
  266. package/objects/Water2.js +143 -140
  267. package/objects/Water2.js.map +1 -1
  268. package/package.json +1 -1
  269. package/postprocessing/SAOPass.cjs +267 -264
  270. package/postprocessing/SAOPass.cjs.map +1 -1
  271. package/postprocessing/SAOPass.js +267 -264
  272. package/postprocessing/SAOPass.js.map +1 -1
  273. package/postprocessing/SSAOPass.cjs +253 -250
  274. package/postprocessing/SSAOPass.cjs.map +1 -1
  275. package/postprocessing/SSAOPass.js +253 -250
  276. package/postprocessing/SSAOPass.js.map +1 -1
  277. package/postprocessing/SSRPass.cjs +379 -376
  278. package/postprocessing/SSRPass.cjs.map +1 -1
  279. package/postprocessing/SSRPass.js +379 -376
  280. package/postprocessing/SSRPass.js.map +1 -1
  281. package/postprocessing/UnrealBloomPass.cjs +205 -202
  282. package/postprocessing/UnrealBloomPass.cjs.map +1 -1
  283. package/postprocessing/UnrealBloomPass.js +205 -202
  284. package/postprocessing/UnrealBloomPass.js.map +1 -1
  285. package/renderers/CSS2DRenderer.cjs +5 -5
  286. package/renderers/CSS2DRenderer.cjs.map +1 -1
  287. package/renderers/CSS2DRenderer.js +5 -5
  288. package/renderers/CSS2DRenderer.js.map +1 -1
  289. package/renderers/CSS3DRenderer.cjs +5 -5
  290. package/renderers/CSS3DRenderer.cjs.map +1 -1
  291. package/renderers/CSS3DRenderer.js +6 -6
  292. package/renderers/CSS3DRenderer.js.map +1 -1
  293. package/shaders/ACESFilmicToneMappingShader.cjs +71 -46
  294. package/shaders/ACESFilmicToneMappingShader.cjs.map +1 -1
  295. package/shaders/ACESFilmicToneMappingShader.js +71 -46
  296. package/shaders/ACESFilmicToneMappingShader.js.map +1 -1
  297. package/shaders/AfterimageShader.cjs +41 -22
  298. package/shaders/AfterimageShader.cjs.map +1 -1
  299. package/shaders/AfterimageShader.js +41 -22
  300. package/shaders/AfterimageShader.js.map +1 -1
  301. package/shaders/BasicShader.cjs +20 -6
  302. package/shaders/BasicShader.cjs.map +1 -1
  303. package/shaders/BasicShader.js +20 -6
  304. package/shaders/BasicShader.js.map +1 -1
  305. package/shaders/BleachBypassShader.cjs +46 -26
  306. package/shaders/BleachBypassShader.cjs.map +1 -1
  307. package/shaders/BleachBypassShader.js +46 -26
  308. package/shaders/BleachBypassShader.js.map +1 -1
  309. package/shaders/BlendShader.cjs +33 -19
  310. package/shaders/BlendShader.cjs.map +1 -1
  311. package/shaders/BlendShader.js +33 -19
  312. package/shaders/BlendShader.js.map +1 -1
  313. package/shaders/BokehShader.cjs +117 -90
  314. package/shaders/BokehShader.cjs.map +1 -1
  315. package/shaders/BokehShader.js +117 -90
  316. package/shaders/BokehShader.js.map +1 -1
  317. package/shaders/BokehShader2.cjs +333 -232
  318. package/shaders/BokehShader2.cjs.map +1 -1
  319. package/shaders/BokehShader2.js +333 -232
  320. package/shaders/BokehShader2.js.map +1 -1
  321. package/shaders/BrightnessContrastShader.cjs +38 -22
  322. package/shaders/BrightnessContrastShader.cjs.map +1 -1
  323. package/shaders/BrightnessContrastShader.js +38 -22
  324. package/shaders/BrightnessContrastShader.js.map +1 -1
  325. package/shaders/ColorCorrectionShader.cjs +35 -21
  326. package/shaders/ColorCorrectionShader.cjs.map +1 -1
  327. package/shaders/ColorCorrectionShader.js +35 -21
  328. package/shaders/ColorCorrectionShader.js.map +1 -1
  329. package/shaders/ColorifyShader.cjs +34 -19
  330. package/shaders/ColorifyShader.cjs.map +1 -1
  331. package/shaders/ColorifyShader.js +34 -19
  332. package/shaders/ColorifyShader.js.map +1 -1
  333. package/shaders/ConvolutionShader.cjs +43 -24
  334. package/shaders/ConvolutionShader.cjs.map +1 -1
  335. package/shaders/ConvolutionShader.js +43 -24
  336. package/shaders/ConvolutionShader.js.map +1 -1
  337. package/shaders/CopyShader.cjs +30 -16
  338. package/shaders/CopyShader.cjs.map +1 -1
  339. package/shaders/CopyShader.js +30 -16
  340. package/shaders/CopyShader.js.map +1 -1
  341. package/shaders/DOFMipMapShader.cjs +38 -21
  342. package/shaders/DOFMipMapShader.cjs.map +1 -1
  343. package/shaders/DOFMipMapShader.js +38 -21
  344. package/shaders/DOFMipMapShader.js.map +1 -1
  345. package/shaders/DepthLimitedBlurShader.cjs +98 -69
  346. package/shaders/DepthLimitedBlurShader.cjs.map +1 -1
  347. package/shaders/DepthLimitedBlurShader.js +98 -69
  348. package/shaders/DepthLimitedBlurShader.js.map +1 -1
  349. package/shaders/DigitalGlitch.cjs +70 -59
  350. package/shaders/DigitalGlitch.cjs.map +1 -1
  351. package/shaders/DigitalGlitch.js +70 -59
  352. package/shaders/DigitalGlitch.js.map +1 -1
  353. package/shaders/DotScreenShader.cjs +49 -28
  354. package/shaders/DotScreenShader.cjs.map +1 -1
  355. package/shaders/DotScreenShader.js +49 -28
  356. package/shaders/DotScreenShader.js.map +1 -1
  357. package/shaders/FXAAShader.cjs +1098 -1089
  358. package/shaders/FXAAShader.cjs.map +1 -1
  359. package/shaders/FXAAShader.js +1098 -1089
  360. package/shaders/FXAAShader.js.map +1 -1
  361. package/shaders/FilmShader.cjs +57 -29
  362. package/shaders/FilmShader.cjs.map +1 -1
  363. package/shaders/FilmShader.js +57 -29
  364. package/shaders/FilmShader.js.map +1 -1
  365. package/shaders/FocusShader.cjs +70 -43
  366. package/shaders/FocusShader.cjs.map +1 -1
  367. package/shaders/FocusShader.js +70 -43
  368. package/shaders/FocusShader.js.map +1 -1
  369. package/shaders/FreiChenShader.cjs +74 -53
  370. package/shaders/FreiChenShader.cjs.map +1 -1
  371. package/shaders/FreiChenShader.js +74 -53
  372. package/shaders/FreiChenShader.js.map +1 -1
  373. package/shaders/FresnelShader.cjs +55 -35
  374. package/shaders/FresnelShader.cjs.map +1 -1
  375. package/shaders/FresnelShader.js +55 -35
  376. package/shaders/FresnelShader.js.map +1 -1
  377. package/shaders/GammaCorrectionShader.cjs +33 -19
  378. package/shaders/GammaCorrectionShader.cjs.map +1 -1
  379. package/shaders/GammaCorrectionShader.js +33 -19
  380. package/shaders/GammaCorrectionShader.js.map +1 -1
  381. package/shaders/GodRaysShader.cjs +193 -116
  382. package/shaders/GodRaysShader.cjs.map +1 -1
  383. package/shaders/GodRaysShader.js +193 -116
  384. package/shaders/GodRaysShader.js.map +1 -1
  385. package/shaders/HalftoneShader.cjs +270 -192
  386. package/shaders/HalftoneShader.cjs.map +1 -1
  387. package/shaders/HalftoneShader.js +270 -192
  388. package/shaders/HalftoneShader.js.map +1 -1
  389. package/shaders/HorizontalTiltShiftShader.cjs +43 -27
  390. package/shaders/HorizontalTiltShiftShader.cjs.map +1 -1
  391. package/shaders/HorizontalTiltShiftShader.js +43 -27
  392. package/shaders/HorizontalTiltShiftShader.js.map +1 -1
  393. package/shaders/HueSaturationShader.cjs +47 -31
  394. package/shaders/HueSaturationShader.cjs.map +1 -1
  395. package/shaders/HueSaturationShader.js +47 -31
  396. package/shaders/HueSaturationShader.js.map +1 -1
  397. package/shaders/KaleidoShader.cjs +37 -24
  398. package/shaders/KaleidoShader.cjs.map +1 -1
  399. package/shaders/KaleidoShader.js +37 -24
  400. package/shaders/KaleidoShader.js.map +1 -1
  401. package/shaders/LuminosityHighPassShader.cjs +43 -24
  402. package/shaders/LuminosityHighPassShader.cjs.map +1 -1
  403. package/shaders/LuminosityHighPassShader.js +43 -24
  404. package/shaders/LuminosityHighPassShader.js.map +1 -1
  405. package/shaders/LuminosityShader.cjs +34 -17
  406. package/shaders/LuminosityShader.cjs.map +1 -1
  407. package/shaders/LuminosityShader.js +34 -17
  408. package/shaders/LuminosityShader.js.map +1 -1
  409. package/shaders/MirrorShader.cjs +39 -26
  410. package/shaders/MirrorShader.cjs.map +1 -1
  411. package/shaders/MirrorShader.js +39 -26
  412. package/shaders/MirrorShader.js.map +1 -1
  413. package/shaders/NormalMapShader.cjs +36 -21
  414. package/shaders/NormalMapShader.cjs.map +1 -1
  415. package/shaders/NormalMapShader.js +36 -21
  416. package/shaders/NormalMapShader.js.map +1 -1
  417. package/shaders/ParallaxShader.cjs +147 -97
  418. package/shaders/ParallaxShader.cjs.map +1 -1
  419. package/shaders/ParallaxShader.js +147 -97
  420. package/shaders/ParallaxShader.js.map +1 -1
  421. package/shaders/PixelShader.cjs +31 -18
  422. package/shaders/PixelShader.cjs.map +1 -1
  423. package/shaders/PixelShader.js +31 -18
  424. package/shaders/PixelShader.js.map +1 -1
  425. package/shaders/RGBShiftShader.cjs +33 -20
  426. package/shaders/RGBShiftShader.cjs.map +1 -1
  427. package/shaders/RGBShiftShader.js +33 -20
  428. package/shaders/RGBShiftShader.js.map +1 -1
  429. package/shaders/SAOShader.cjs +154 -117
  430. package/shaders/SAOShader.cjs.map +1 -1
  431. package/shaders/SAOShader.js +154 -117
  432. package/shaders/SAOShader.js.map +1 -1
  433. package/shaders/SMAAShader.cjs +358 -270
  434. package/shaders/SMAAShader.cjs.map +1 -1
  435. package/shaders/SMAAShader.js +358 -270
  436. package/shaders/SMAAShader.js.map +1 -1
  437. package/shaders/SSAOShader.cjs +236 -142
  438. package/shaders/SSAOShader.cjs.map +1 -1
  439. package/shaders/SSAOShader.js +236 -142
  440. package/shaders/SSAOShader.js.map +1 -1
  441. package/shaders/SSRShader.cjs +4 -4
  442. package/shaders/SSRShader.cjs.map +1 -1
  443. package/shaders/SSRShader.js +4 -4
  444. package/shaders/SSRShader.js.map +1 -1
  445. package/shaders/SepiaShader.cjs +36 -20
  446. package/shaders/SepiaShader.cjs.map +1 -1
  447. package/shaders/SepiaShader.js +36 -20
  448. package/shaders/SepiaShader.js.map +1 -1
  449. package/shaders/SobelOperatorShader.cjs +64 -37
  450. package/shaders/SobelOperatorShader.cjs.map +1 -1
  451. package/shaders/SobelOperatorShader.js +64 -37
  452. package/shaders/SobelOperatorShader.js.map +1 -1
  453. package/shaders/TechnicolorShader.cjs +29 -16
  454. package/shaders/TechnicolorShader.cjs.map +1 -1
  455. package/shaders/TechnicolorShader.js +29 -16
  456. package/shaders/TechnicolorShader.js.map +1 -1
  457. package/shaders/ToneMapShader.cjs +55 -35
  458. package/shaders/ToneMapShader.cjs.map +1 -1
  459. package/shaders/ToneMapShader.js +55 -35
  460. package/shaders/ToneMapShader.js.map +1 -1
  461. package/shaders/ToonShader.cjs +275 -165
  462. package/shaders/ToonShader.cjs.map +1 -1
  463. package/shaders/ToonShader.js +275 -165
  464. package/shaders/ToonShader.js.map +1 -1
  465. package/shaders/TriangleBlurShader.cjs +50 -27
  466. package/shaders/TriangleBlurShader.cjs.map +1 -1
  467. package/shaders/TriangleBlurShader.js +50 -27
  468. package/shaders/TriangleBlurShader.js.map +1 -1
  469. package/shaders/UnpackDepthRGBAShader.cjs +32 -17
  470. package/shaders/UnpackDepthRGBAShader.cjs.map +1 -1
  471. package/shaders/UnpackDepthRGBAShader.js +32 -17
  472. package/shaders/UnpackDepthRGBAShader.js.map +1 -1
  473. package/shaders/VerticalTiltShiftShader.cjs +43 -27
  474. package/shaders/VerticalTiltShiftShader.cjs.map +1 -1
  475. package/shaders/VerticalTiltShiftShader.js +43 -27
  476. package/shaders/VerticalTiltShiftShader.js.map +1 -1
  477. package/shaders/VignetteShader.cjs +43 -27
  478. package/shaders/VignetteShader.cjs.map +1 -1
  479. package/shaders/VignetteShader.js +43 -27
  480. package/shaders/VignetteShader.js.map +1 -1
  481. package/shaders/VolumeShader.cjs +264 -213
  482. package/shaders/VolumeShader.cjs.map +1 -1
  483. package/shaders/VolumeShader.js +264 -213
  484. package/shaders/VolumeShader.js.map +1 -1
  485. package/shaders/WaterRefractionShader.cjs +63 -35
  486. package/shaders/WaterRefractionShader.cjs.map +1 -1
  487. package/shaders/WaterRefractionShader.js +63 -35
  488. package/shaders/WaterRefractionShader.js.map +1 -1
  489. package/utils/GeometryCompressionUtils.cjs +2 -1
  490. package/utils/GeometryCompressionUtils.cjs.map +1 -1
  491. package/utils/GeometryCompressionUtils.js +3 -2
  492. package/utils/GeometryCompressionUtils.js.map +1 -1
  493. package/utils/RoughnessMipmapper.cjs +3 -3
  494. package/utils/RoughnessMipmapper.cjs.map +1 -1
  495. package/utils/RoughnessMipmapper.js +4 -4
  496. package/utils/RoughnessMipmapper.js.map +1 -1
  497. package/webxr/ARButton.cjs +3 -3
  498. package/webxr/ARButton.cjs.map +1 -1
  499. package/webxr/ARButton.d.ts +3 -3
  500. package/webxr/ARButton.js +3 -3
  501. package/webxr/ARButton.js.map +1 -1
  502. package/webxr/OculusHandPointerModel.cjs +2 -2
  503. package/webxr/OculusHandPointerModel.cjs.map +1 -1
  504. package/webxr/OculusHandPointerModel.js +2 -2
  505. package/webxr/OculusHandPointerModel.js.map +1 -1
  506. package/webxr/VRButton.cjs +98 -95
  507. package/webxr/VRButton.cjs.map +1 -1
  508. package/webxr/VRButton.d.ts +9 -6
  509. package/webxr/VRButton.js +98 -95
  510. package/webxr/VRButton.js.map +1 -1
  511. package/webxr/XRHandPrimitiveModel.cjs +2 -2
  512. package/webxr/XRHandPrimitiveModel.cjs.map +1 -1
  513. package/webxr/XRHandPrimitiveModel.js +3 -3
  514. package/webxr/XRHandPrimitiveModel.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"OrbitControls.js","sources":["../../src/controls/OrbitControls.ts"],"sourcesContent":["import {\n Matrix4,\n MOUSE,\n OrthographicCamera,\n PerspectiveCamera,\n Quaternion,\n Spherical,\n TOUCH,\n Vector2,\n Vector3,\n Ray,\n Plane,\n} from 'three'\nimport { EventDispatcher } from './EventDispatcher'\nimport { StandardControlsEventMap } from './StandardControlsEventMap'\n\nconst _ray = new Ray()\nconst _plane = new Plane()\nconst TILT_LIMIT = Math.cos(70 * (Math.PI / 180))\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one-finger move\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move\n\nconst moduloWrapAround = (offset: number, capacity: number) => ((offset % capacity) + capacity) % capacity\n\nclass OrbitControls extends EventDispatcher<StandardControlsEventMap> {\n object: PerspectiveCamera | OrthographicCamera\n domElement: HTMLElement | undefined\n // Set to false to disable this control\n enabled = true\n // \"target\" sets the location of focus, where the object orbits around\n target = new Vector3()\n // How far you can dolly in and out ( PerspectiveCamera only )\n minDistance = 0\n maxDistance = Infinity\n // How far you can zoom in and out ( OrthographicCamera only )\n minZoom = 0\n maxZoom = Infinity\n // How far you can orbit vertically, upper and lower limits.\n // Range is 0 to Math.PI radians.\n minPolarAngle = 0 // radians\n maxPolarAngle = Math.PI // radians\n // How far you can orbit horizontally, upper and lower limits.\n // If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI )\n minAzimuthAngle = -Infinity // radians\n maxAzimuthAngle = Infinity // radians\n // Set to true to enable damping (inertia)\n // If damping is enabled, you must call controls.update() in your animation loop\n enableDamping = false\n dampingFactor = 0.05\n // This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n // Set to false to disable zooming\n enableZoom = true\n zoomSpeed = 1.0\n // Set to false to disable rotating\n enableRotate = true\n rotateSpeed = 1.0\n // Set to false to disable panning\n enablePan = true\n panSpeed = 1.0\n screenSpacePanning = true // if false, pan orthogonal to world-space direction camera.up\n keyPanSpeed = 7.0 // pixels moved per arrow key push\n zoomToCursor = false\n // Set to true to automatically rotate around the target\n // If auto-rotate is enabled, you must call controls.update() in your animation loop\n autoRotate = false\n autoRotateSpeed = 2.0 // 30 seconds per orbit when fps is 60\n reverseOrbit = false // true if you want to reverse the orbit to mouse drag from left to right = orbits left\n reverseHorizontalOrbit = false // true if you want to reverse the horizontal orbit direction\n reverseVerticalOrbit = false // true if you want to reverse the vertical orbit direction\n // The four arrow keys\n keys = { LEFT: 'ArrowLeft', UP: 'ArrowUp', RIGHT: 'ArrowRight', BOTTOM: 'ArrowDown' }\n // Mouse buttons\n mouseButtons: Partial<{\n LEFT: MOUSE\n MIDDLE: MOUSE\n RIGHT: MOUSE\n }> = {\n LEFT: MOUSE.ROTATE,\n MIDDLE: MOUSE.DOLLY,\n RIGHT: MOUSE.PAN,\n }\n // Touch fingers\n touches: Partial<{\n ONE: TOUCH\n TWO: TOUCH\n }> = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN }\n target0: Vector3\n position0: Vector3\n zoom0: number\n // the target DOM element for key events\n _domElementKeyEvents: any = null\n\n getPolarAngle: () => number\n getAzimuthalAngle: () => number\n setPolarAngle: (x: number) => void\n setAzimuthalAngle: (x: number) => void\n getDistance: () => number\n // Not used in most scenarios, however they can be useful for specific use cases\n getZoomScale: () => number\n\n listenToKeyEvents: (domElement: HTMLElement) => void\n stopListenToKeyEvents: () => void\n saveState: () => void\n reset: () => void\n update: () => void\n connect: (domElement: HTMLElement) => void\n dispose: () => void\n\n // Dolly in programmatically\n dollyIn: (dollyScale?: number) => void\n // Dolly out programmatically\n dollyOut: (dollyScale?: number) => void\n // Get the current scale\n getScale: () => number\n // Set the current scale (these are not used in most scenarios, however they can be useful for specific use cases)\n setScale: (newScale: number) => void\n \n\n constructor(object: PerspectiveCamera | OrthographicCamera, domElement?: HTMLElement) {\n super()\n\n this.object = object\n this.domElement = domElement\n\n // for reset\n this.target0 = this.target.clone()\n this.position0 = this.object.position.clone()\n this.zoom0 = this.object.zoom\n\n //\n // public methods\n //\n\n this.getPolarAngle = (): number => spherical.phi\n\n this.getAzimuthalAngle = (): number => spherical.theta\n\n this.setPolarAngle = (value: number): void => {\n // use modulo wrapping to safeguard value\n let phi = moduloWrapAround(value, 2 * Math.PI)\n let currentPhi = spherical.phi\n\n // convert to the equivalent shortest angle\n if (currentPhi < 0) currentPhi += 2 * Math.PI\n if (phi < 0) phi += 2 * Math.PI\n let phiDist = Math.abs(phi - currentPhi)\n if (2 * Math.PI - phiDist < phiDist) {\n if (phi < currentPhi) {\n phi += 2 * Math.PI\n } else {\n currentPhi += 2 * Math.PI\n }\n }\n sphericalDelta.phi = phi - currentPhi\n scope.update()\n }\n\n this.setAzimuthalAngle = (value: number): void => {\n // use modulo wrapping to safeguard value\n let theta = moduloWrapAround(value, 2 * Math.PI)\n let currentTheta = spherical.theta\n\n // convert to the equivalent shortest angle\n if (currentTheta < 0) currentTheta += 2 * Math.PI\n if (theta < 0) theta += 2 * Math.PI\n let thetaDist = Math.abs(theta - currentTheta)\n if (2 * Math.PI - thetaDist < thetaDist) {\n if (theta < currentTheta) {\n theta += 2 * Math.PI\n } else {\n currentTheta += 2 * Math.PI\n }\n }\n sphericalDelta.theta = theta - currentTheta\n scope.update()\n }\n\n this.getDistance = (): number => scope.object.position.distanceTo(scope.target)\n\n this.listenToKeyEvents = (domElement: HTMLElement): void => {\n domElement.addEventListener('keydown', onKeyDown)\n this._domElementKeyEvents = domElement\n }\n\n this.stopListenToKeyEvents = (): void => {\n this._domElementKeyEvents.removeEventListener('keydown', onKeyDown)\n this._domElementKeyEvents = null\n }\n\n this.saveState = (): void => {\n scope.target0.copy(scope.target)\n scope.position0.copy(scope.object.position)\n scope.zoom0 = scope.object.zoom\n }\n\n this.reset = (): void => {\n scope.target.copy(scope.target0)\n scope.object.position.copy(scope.position0)\n scope.object.zoom = scope.zoom0\n scope.object.updateProjectionMatrix()\n\n // @ts-ignore\n scope.dispatchEvent(changeEvent)\n\n scope.update()\n\n state = STATE.NONE\n }\n\n // this method is exposed, but perhaps it would be better if we can make it private...\n this.update = ((): (() => void) => {\n const offset = new Vector3()\n const up = new Vector3(0, 1, 0)\n\n // so camera.up is the orbit axis\n const quat = new Quaternion().setFromUnitVectors(object.up, up)\n const quatInverse = quat.clone().invert()\n\n const lastPosition = new Vector3()\n const lastQuaternion = new Quaternion()\n\n const twoPI = 2 * Math.PI\n\n return function update(): boolean {\n const position = scope.object.position\n\n // update new up direction\n quat.setFromUnitVectors(object.up, up)\n quatInverse.copy(quat).invert()\n\n offset.copy(position).sub(scope.target)\n\n // rotate offset to \"y-axis-is-up\" space\n offset.applyQuaternion(quat)\n\n // angle from z-axis around y-axis\n spherical.setFromVector3(offset)\n\n if (scope.autoRotate && state === STATE.NONE) {\n rotateLeft(getAutoRotationAngle())\n }\n\n if (scope.enableDamping) {\n spherical.theta += sphericalDelta.theta * scope.dampingFactor\n spherical.phi += sphericalDelta.phi * scope.dampingFactor\n } else {\n spherical.theta += sphericalDelta.theta\n spherical.phi += sphericalDelta.phi\n }\n\n // restrict theta to be between desired limits\n\n let min = scope.minAzimuthAngle\n let max = scope.maxAzimuthAngle\n\n if (isFinite(min) && isFinite(max)) {\n if (min < -Math.PI) min += twoPI\n else if (min > Math.PI) min -= twoPI\n\n if (max < -Math.PI) max += twoPI\n else if (max > Math.PI) max -= twoPI\n\n if (min <= max) {\n spherical.theta = Math.max(min, Math.min(max, spherical.theta))\n } else {\n spherical.theta =\n spherical.theta > (min + max) / 2 ? Math.max(min, spherical.theta) : Math.min(max, spherical.theta)\n }\n }\n\n // restrict phi to be between desired limits\n spherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi))\n spherical.makeSafe()\n\n // move target to panned location\n\n if (scope.enableDamping === true) {\n scope.target.addScaledVector(panOffset, scope.dampingFactor)\n } else {\n scope.target.add(panOffset)\n }\n\n // adjust the camera position based on zoom only if we're not zooming to the cursor or if it's an ortho camera\n // we adjust zoom later in these cases\n if ((scope.zoomToCursor && performCursorZoom) || (scope.object as OrthographicCamera).isOrthographicCamera) {\n spherical.radius = clampDistance(spherical.radius)\n } else {\n spherical.radius = clampDistance(spherical.radius * scale)\n }\n\n offset.setFromSpherical(spherical)\n\n // rotate offset back to \"camera-up-vector-is-up\" space\n offset.applyQuaternion(quatInverse)\n\n position.copy(scope.target).add(offset)\n\n if (!scope.object.matrixAutoUpdate) scope.object.updateMatrix()\n scope.object.lookAt(scope.target)\n\n if (scope.enableDamping === true) {\n sphericalDelta.theta *= 1 - scope.dampingFactor\n sphericalDelta.phi *= 1 - scope.dampingFactor\n\n panOffset.multiplyScalar(1 - scope.dampingFactor)\n } else {\n sphericalDelta.set(0, 0, 0)\n\n panOffset.set(0, 0, 0)\n }\n\n // adjust camera position\n let zoomChanged = false\n if (scope.zoomToCursor && performCursorZoom) {\n let newRadius = null\n if (scope.object instanceof PerspectiveCamera && scope.object.isPerspectiveCamera) {\n // move the camera down the pointer ray\n // this method avoids floating point error\n const prevRadius = offset.length()\n newRadius = clampDistance(prevRadius * scale)\n\n const radiusDelta = prevRadius - newRadius\n scope.object.position.addScaledVector(dollyDirection, radiusDelta)\n scope.object.updateMatrixWorld()\n } else if ((scope.object as OrthographicCamera).isOrthographicCamera) {\n // adjust the ortho camera position based on zoom changes\n const mouseBefore = new Vector3(mouse.x, mouse.y, 0)\n mouseBefore.unproject(scope.object)\n\n scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / scale))\n scope.object.updateProjectionMatrix()\n zoomChanged = true\n\n const mouseAfter = new Vector3(mouse.x, mouse.y, 0)\n mouseAfter.unproject(scope.object)\n\n scope.object.position.sub(mouseAfter).add(mouseBefore)\n scope.object.updateMatrixWorld()\n\n newRadius = offset.length()\n } else {\n console.warn('WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled.')\n scope.zoomToCursor = false\n }\n\n // handle the placement of the target\n if (newRadius !== null) {\n if (scope.screenSpacePanning) {\n // position the orbit target in front of the new camera position\n scope.target\n .set(0, 0, -1)\n .transformDirection(scope.object.matrix)\n .multiplyScalar(newRadius)\n .add(scope.object.position)\n } else {\n // get the ray and translation plane to compute target\n _ray.origin.copy(scope.object.position)\n _ray.direction.set(0, 0, -1).transformDirection(scope.object.matrix)\n\n // if the camera is 20 degrees above the horizon then don't adjust the focus target to avoid\n // extremely large values\n if (Math.abs(scope.object.up.dot(_ray.direction)) < TILT_LIMIT) {\n object.lookAt(scope.target)\n } else {\n _plane.setFromNormalAndCoplanarPoint(scope.object.up, scope.target)\n _ray.intersectPlane(_plane, scope.target)\n }\n }\n }\n } else if (scope.object instanceof OrthographicCamera && scope.object.isOrthographicCamera) {\n zoomChanged = scale !== 1\n\n if (zoomChanged) {\n scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / scale))\n scope.object.updateProjectionMatrix()\n }\n }\n\n scale = 1\n performCursorZoom = false\n\n // update condition is:\n // min(camera displacement, camera rotation in radians)^2 > EPS\n // using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n if (\n zoomChanged ||\n lastPosition.distanceToSquared(scope.object.position) > EPS ||\n 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS\n ) {\n // @ts-ignore\n scope.dispatchEvent(changeEvent)\n\n lastPosition.copy(scope.object.position)\n lastQuaternion.copy(scope.object.quaternion)\n zoomChanged = false\n\n return true\n }\n\n return false\n }\n })()\n\n // https://github.com/mrdoob/three.js/issues/20575\n this.connect = (domElement: HTMLElement): void => {\n scope.domElement = domElement\n // disables touch scroll\n // touch-action needs to be defined for pointer events to work on mobile\n // https://stackoverflow.com/a/48254578\n scope.domElement.style.touchAction = 'none'\n scope.domElement.addEventListener('contextmenu', onContextMenu)\n scope.domElement.addEventListener('pointerdown', onPointerDown)\n scope.domElement.addEventListener('pointercancel', onPointerUp)\n scope.domElement.addEventListener('wheel', onMouseWheel)\n }\n\n this.dispose = (): void => {\n // Enabling touch scroll\n if (scope.domElement) {\n scope.domElement.style.touchAction = 'auto'\n }\n scope.domElement?.removeEventListener('contextmenu', onContextMenu)\n scope.domElement?.removeEventListener('pointerdown', onPointerDown)\n scope.domElement?.removeEventListener('pointercancel', onPointerUp)\n scope.domElement?.removeEventListener('wheel', onMouseWheel)\n scope.domElement?.ownerDocument.removeEventListener('pointermove', onPointerMove)\n scope.domElement?.ownerDocument.removeEventListener('pointerup', onPointerUp)\n if (scope._domElementKeyEvents !== null) {\n scope._domElementKeyEvents.removeEventListener('keydown', onKeyDown)\n }\n //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n }\n\n //\n // internals\n //\n\n const scope = this\n\n const changeEvent = { type: 'change' }\n const startEvent = { type: 'start' }\n const endEvent = { type: 'end' }\n\n const STATE = {\n NONE: -1,\n ROTATE: 0,\n DOLLY: 1,\n PAN: 2,\n TOUCH_ROTATE: 3,\n TOUCH_PAN: 4,\n TOUCH_DOLLY_PAN: 5,\n TOUCH_DOLLY_ROTATE: 6,\n }\n\n let state = STATE.NONE\n\n const EPS = 0.000001\n\n // current position in spherical coordinates\n const spherical = new Spherical()\n const sphericalDelta = new Spherical()\n\n let scale = 1\n const panOffset = new Vector3()\n\n const rotateStart = new Vector2()\n const rotateEnd = new Vector2()\n const rotateDelta = new Vector2()\n\n const panStart = new Vector2()\n const panEnd = new Vector2()\n const panDelta = new Vector2()\n\n const dollyStart = new Vector2()\n const dollyEnd = new Vector2()\n const dollyDelta = new Vector2()\n\n const dollyDirection = new Vector3()\n const mouse = new Vector2()\n let performCursorZoom = false\n\n const pointers: PointerEvent[] = []\n const pointerPositions: { [key: string]: Vector2 } = {}\n\n function getAutoRotationAngle(): number {\n return ((2 * Math.PI) / 60 / 60) * scope.autoRotateSpeed\n }\n\n function getZoomScale(): number {\n return Math.pow(0.95, scope.zoomSpeed)\n }\n\n function rotateLeft(angle: number): void {\n if (scope.reverseOrbit || scope.reverseHorizontalOrbit) {\n sphericalDelta.theta += angle\n } else {\n sphericalDelta.theta -= angle\n }\n }\n\n function rotateUp(angle: number): void {\n if (scope.reverseOrbit || scope.reverseVerticalOrbit) {\n sphericalDelta.phi += angle\n } else {\n sphericalDelta.phi -= angle\n }\n }\n\n const panLeft = (() => {\n const v = new Vector3()\n\n return function panLeft(distance: number, objectMatrix: Matrix4) {\n v.setFromMatrixColumn(objectMatrix, 0) // get X column of objectMatrix\n v.multiplyScalar(-distance)\n\n panOffset.add(v)\n }\n })()\n\n const panUp = (() => {\n const v = new Vector3()\n\n return function panUp(distance: number, objectMatrix: Matrix4) {\n if (scope.screenSpacePanning === true) {\n v.setFromMatrixColumn(objectMatrix, 1)\n } else {\n v.setFromMatrixColumn(objectMatrix, 0)\n v.crossVectors(scope.object.up, v)\n }\n\n v.multiplyScalar(distance)\n\n panOffset.add(v)\n }\n })()\n\n // deltaX and deltaY are in pixels; right and down are positive\n const pan = (() => {\n const offset = new Vector3()\n\n return function pan(deltaX: number, deltaY: number) {\n const element = scope.domElement\n\n if (element && scope.object instanceof PerspectiveCamera && scope.object.isPerspectiveCamera) {\n // perspective\n const position = scope.object.position\n offset.copy(position).sub(scope.target)\n let targetDistance = offset.length()\n\n // half of the fov is center to top of screen\n targetDistance *= Math.tan(((scope.object.fov / 2) * Math.PI) / 180.0)\n\n // we use only clientHeight here so aspect ratio does not distort speed\n panLeft((2 * deltaX * targetDistance) / element.clientHeight, scope.object.matrix)\n panUp((2 * deltaY * targetDistance) / element.clientHeight, scope.object.matrix)\n } else if (element && scope.object instanceof OrthographicCamera && scope.object.isOrthographicCamera) {\n // orthographic\n panLeft(\n (deltaX * (scope.object.right - scope.object.left)) / scope.object.zoom / element.clientWidth,\n scope.object.matrix,\n )\n panUp(\n (deltaY * (scope.object.top - scope.object.bottom)) / scope.object.zoom / element.clientHeight,\n scope.object.matrix,\n )\n } else {\n // camera neither orthographic nor perspective\n console.warn('WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.')\n scope.enablePan = false\n }\n }\n })()\n\n function setScale(newScale: number) {\n if (\n (scope.object instanceof PerspectiveCamera && scope.object.isPerspectiveCamera) ||\n (scope.object instanceof OrthographicCamera && scope.object.isOrthographicCamera)\n ) {\n scale = newScale\n } else {\n console.warn('WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.')\n scope.enableZoom = false\n }\n }\n\n function dollyOut(dollyScale: number) {\n setScale(scale / dollyScale)\n }\n\n function dollyIn(dollyScale: number) {\n setScale(scale * dollyScale)\n }\n\n function updateMouseParameters(event: MouseEvent): void {\n if (!scope.zoomToCursor || !scope.domElement) {\n return\n }\n\n performCursorZoom = true\n\n const rect = scope.domElement.getBoundingClientRect()\n const x = event.clientX - rect.left\n const y = event.clientY - rect.top\n const w = rect.width\n const h = rect.height\n\n mouse.x = (x / w) * 2 - 1\n mouse.y = -(y / h) * 2 + 1\n\n dollyDirection.set(mouse.x, mouse.y, 1).unproject(scope.object).sub(scope.object.position).normalize()\n }\n\n function clampDistance(dist: number): number {\n return Math.max(scope.minDistance, Math.min(scope.maxDistance, dist))\n }\n\n //\n // event callbacks - update the object state\n //\n\n function handleMouseDownRotate(event: MouseEvent) {\n rotateStart.set(event.clientX, event.clientY)\n }\n\n function handleMouseDownDolly(event: MouseEvent) {\n updateMouseParameters(event)\n dollyStart.set(event.clientX, event.clientY)\n }\n\n function handleMouseDownPan(event: MouseEvent) {\n panStart.set(event.clientX, event.clientY)\n }\n\n function handleMouseMoveRotate(event: MouseEvent) {\n rotateEnd.set(event.clientX, event.clientY)\n rotateDelta.subVectors(rotateEnd, rotateStart).multiplyScalar(scope.rotateSpeed)\n\n const element = scope.domElement\n\n if (element) {\n rotateLeft((2 * Math.PI * rotateDelta.x) / element.clientHeight) // yes, height\n rotateUp((2 * Math.PI * rotateDelta.y) / element.clientHeight)\n }\n rotateStart.copy(rotateEnd)\n scope.update()\n }\n\n function handleMouseMoveDolly(event: MouseEvent) {\n dollyEnd.set(event.clientX, event.clientY)\n dollyDelta.subVectors(dollyEnd, dollyStart)\n\n if (dollyDelta.y > 0) {\n dollyOut(getZoomScale())\n } else if (dollyDelta.y < 0) {\n dollyIn(getZoomScale())\n }\n\n dollyStart.copy(dollyEnd)\n scope.update()\n }\n\n function handleMouseMovePan(event: MouseEvent) {\n panEnd.set(event.clientX, event.clientY)\n panDelta.subVectors(panEnd, panStart).multiplyScalar(scope.panSpeed)\n pan(panDelta.x, panDelta.y)\n panStart.copy(panEnd)\n scope.update()\n }\n\n function handleMouseWheel(event: WheelEvent) {\n updateMouseParameters(event)\n\n if (event.deltaY < 0) {\n dollyIn(getZoomScale())\n } else if (event.deltaY > 0) {\n dollyOut(getZoomScale())\n }\n\n scope.update()\n }\n\n function handleKeyDown(event: KeyboardEvent) {\n let needsUpdate = false\n\n switch (event.code) {\n case scope.keys.UP:\n pan(0, scope.keyPanSpeed)\n needsUpdate = true\n break\n\n case scope.keys.BOTTOM:\n pan(0, -scope.keyPanSpeed)\n needsUpdate = true\n break\n\n case scope.keys.LEFT:\n pan(scope.keyPanSpeed, 0)\n needsUpdate = true\n break\n\n case scope.keys.RIGHT:\n pan(-scope.keyPanSpeed, 0)\n needsUpdate = true\n break\n }\n\n if (needsUpdate) {\n // prevent the browser from scrolling on cursor keys\n event.preventDefault()\n scope.update()\n }\n }\n\n function handleTouchStartRotate() {\n if (pointers.length == 1) {\n rotateStart.set(pointers[0].pageX, pointers[0].pageY)\n } else {\n const x = 0.5 * (pointers[0].pageX + pointers[1].pageX)\n const y = 0.5 * (pointers[0].pageY + pointers[1].pageY)\n\n rotateStart.set(x, y)\n }\n }\n\n function handleTouchStartPan() {\n if (pointers.length == 1) {\n panStart.set(pointers[0].pageX, pointers[0].pageY)\n } else {\n const x = 0.5 * (pointers[0].pageX + pointers[1].pageX)\n const y = 0.5 * (pointers[0].pageY + pointers[1].pageY)\n\n panStart.set(x, y)\n }\n }\n\n function handleTouchStartDolly() {\n const dx = pointers[0].pageX - pointers[1].pageX\n const dy = pointers[0].pageY - pointers[1].pageY\n const distance = Math.sqrt(dx * dx + dy * dy)\n\n dollyStart.set(0, distance)\n }\n\n function handleTouchStartDollyPan() {\n if (scope.enableZoom) handleTouchStartDolly()\n if (scope.enablePan) handleTouchStartPan()\n }\n\n function handleTouchStartDollyRotate() {\n if (scope.enableZoom) handleTouchStartDolly()\n if (scope.enableRotate) handleTouchStartRotate()\n }\n\n function handleTouchMoveRotate(event: PointerEvent) {\n if (pointers.length == 1) {\n rotateEnd.set(event.pageX, event.pageY)\n } else {\n const position = getSecondPointerPosition(event)\n const x = 0.5 * (event.pageX + position.x)\n const y = 0.5 * (event.pageY + position.y)\n rotateEnd.set(x, y)\n }\n\n rotateDelta.subVectors(rotateEnd, rotateStart).multiplyScalar(scope.rotateSpeed)\n\n const element = scope.domElement\n\n if (element) {\n rotateLeft((2 * Math.PI * rotateDelta.x) / element.clientHeight) // yes, height\n rotateUp((2 * Math.PI * rotateDelta.y) / element.clientHeight)\n }\n rotateStart.copy(rotateEnd)\n }\n\n function handleTouchMovePan(event: PointerEvent) {\n if (pointers.length == 1) {\n panEnd.set(event.pageX, event.pageY)\n } else {\n const position = getSecondPointerPosition(event)\n const x = 0.5 * (event.pageX + position.x)\n const y = 0.5 * (event.pageY + position.y)\n panEnd.set(x, y)\n }\n\n panDelta.subVectors(panEnd, panStart).multiplyScalar(scope.panSpeed)\n pan(panDelta.x, panDelta.y)\n panStart.copy(panEnd)\n }\n\n function handleTouchMoveDolly(event: PointerEvent) {\n const position = getSecondPointerPosition(event)\n const dx = event.pageX - position.x\n const dy = event.pageY - position.y\n const distance = Math.sqrt(dx * dx + dy * dy)\n\n dollyEnd.set(0, distance)\n dollyDelta.set(0, Math.pow(dollyEnd.y / dollyStart.y, scope.zoomSpeed))\n dollyOut(dollyDelta.y)\n dollyStart.copy(dollyEnd)\n }\n\n function handleTouchMoveDollyPan(event: PointerEvent) {\n if (scope.enableZoom) handleTouchMoveDolly(event)\n if (scope.enablePan) handleTouchMovePan(event)\n }\n\n function handleTouchMoveDollyRotate(event: PointerEvent) {\n if (scope.enableZoom) handleTouchMoveDolly(event)\n if (scope.enableRotate) handleTouchMoveRotate(event)\n }\n\n //\n // event handlers - FSM: listen for events and reset state\n //\n\n function onPointerDown(event: PointerEvent) {\n if (scope.enabled === false) return\n\n if (pointers.length === 0) {\n scope.domElement?.ownerDocument.addEventListener('pointermove', onPointerMove)\n scope.domElement?.ownerDocument.addEventListener('pointerup', onPointerUp)\n }\n\n addPointer(event)\n\n if (event.pointerType === 'touch') {\n onTouchStart(event)\n } else {\n onMouseDown(event)\n }\n }\n\n function onPointerMove(event: PointerEvent) {\n if (scope.enabled === false) return\n\n if (event.pointerType === 'touch') {\n onTouchMove(event)\n } else {\n onMouseMove(event)\n }\n }\n\n function onPointerUp(event: PointerEvent) {\n removePointer(event)\n\n if (pointers.length === 0) {\n scope.domElement?.releasePointerCapture(event.pointerId)\n\n scope.domElement?.ownerDocument.removeEventListener('pointermove', onPointerMove)\n scope.domElement?.ownerDocument.removeEventListener('pointerup', onPointerUp)\n }\n\n // @ts-ignore\n scope.dispatchEvent(endEvent)\n\n state = STATE.NONE\n }\n\n function onMouseDown(event: MouseEvent) {\n let mouseAction\n\n switch (event.button) {\n case 0:\n mouseAction = scope.mouseButtons.LEFT\n break\n\n case 1:\n mouseAction = scope.mouseButtons.MIDDLE\n break\n\n case 2:\n mouseAction = scope.mouseButtons.RIGHT\n break\n\n default:\n mouseAction = -1\n }\n\n switch (mouseAction) {\n case MOUSE.DOLLY:\n if (scope.enableZoom === false) return\n handleMouseDownDolly(event)\n state = STATE.DOLLY\n break\n\n case MOUSE.ROTATE:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n if (scope.enablePan === false) return\n handleMouseDownPan(event)\n state = STATE.PAN\n } else {\n if (scope.enableRotate === false) return\n handleMouseDownRotate(event)\n state = STATE.ROTATE\n }\n break\n\n case MOUSE.PAN:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n if (scope.enableRotate === false) return\n handleMouseDownRotate(event)\n state = STATE.ROTATE\n } else {\n if (scope.enablePan === false) return\n handleMouseDownPan(event)\n state = STATE.PAN\n }\n break\n\n default:\n state = STATE.NONE\n }\n\n if (state !== STATE.NONE) {\n // @ts-ignore\n scope.dispatchEvent(startEvent)\n }\n }\n\n function onMouseMove(event: MouseEvent) {\n if (scope.enabled === false) return\n\n switch (state) {\n case STATE.ROTATE:\n if (scope.enableRotate === false) return\n handleMouseMoveRotate(event)\n break\n\n case STATE.DOLLY:\n if (scope.enableZoom === false) return\n handleMouseMoveDolly(event)\n break\n\n case STATE.PAN:\n if (scope.enablePan === false) return\n handleMouseMovePan(event)\n break\n }\n }\n\n function onMouseWheel(event: WheelEvent) {\n if (scope.enabled === false || scope.enableZoom === false || (state !== STATE.NONE && state !== STATE.ROTATE)) {\n return\n }\n\n event.preventDefault()\n\n // @ts-ignore\n scope.dispatchEvent(startEvent)\n\n handleMouseWheel(event)\n\n // @ts-ignore\n scope.dispatchEvent(endEvent)\n }\n\n function onKeyDown(event: KeyboardEvent) {\n if (scope.enabled === false || scope.enablePan === false) return\n handleKeyDown(event)\n }\n\n function onTouchStart(event: PointerEvent) {\n trackPointer(event)\n\n switch (pointers.length) {\n case 1:\n switch (scope.touches.ONE) {\n case TOUCH.ROTATE:\n if (scope.enableRotate === false) return\n handleTouchStartRotate()\n state = STATE.TOUCH_ROTATE\n break\n\n case TOUCH.PAN:\n if (scope.enablePan === false) return\n handleTouchStartPan()\n state = STATE.TOUCH_PAN\n break\n\n default:\n state = STATE.NONE\n }\n\n break\n\n case 2:\n switch (scope.touches.TWO) {\n case TOUCH.DOLLY_PAN:\n if (scope.enableZoom === false && scope.enablePan === false) return\n handleTouchStartDollyPan()\n state = STATE.TOUCH_DOLLY_PAN\n break\n\n case TOUCH.DOLLY_ROTATE:\n if (scope.enableZoom === false && scope.enableRotate === false) return\n handleTouchStartDollyRotate()\n state = STATE.TOUCH_DOLLY_ROTATE\n break\n\n default:\n state = STATE.NONE\n }\n\n break\n\n default:\n state = STATE.NONE\n }\n\n if (state !== STATE.NONE) {\n // @ts-ignore\n scope.dispatchEvent(startEvent)\n }\n }\n\n function onTouchMove(event: PointerEvent) {\n trackPointer(event)\n\n switch (state) {\n case STATE.TOUCH_ROTATE:\n if (scope.enableRotate === false) return\n handleTouchMoveRotate(event)\n scope.update()\n break\n\n case STATE.TOUCH_PAN:\n if (scope.enablePan === false) return\n handleTouchMovePan(event)\n scope.update()\n break\n\n case STATE.TOUCH_DOLLY_PAN:\n if (scope.enableZoom === false && scope.enablePan === false) return\n handleTouchMoveDollyPan(event)\n scope.update()\n break\n\n case STATE.TOUCH_DOLLY_ROTATE:\n if (scope.enableZoom === false && scope.enableRotate === false) return\n handleTouchMoveDollyRotate(event)\n scope.update()\n break\n\n default:\n state = STATE.NONE\n }\n }\n\n function onContextMenu(event: Event) {\n if (scope.enabled === false) return\n event.preventDefault()\n }\n\n function addPointer(event: PointerEvent) {\n pointers.push(event)\n }\n\n function removePointer(event: PointerEvent) {\n delete pointerPositions[event.pointerId]\n\n for (let i = 0; i < pointers.length; i++) {\n if (pointers[i].pointerId == event.pointerId) {\n pointers.splice(i, 1)\n return\n }\n }\n }\n\n function trackPointer(event: PointerEvent) {\n let position = pointerPositions[event.pointerId]\n\n if (position === undefined) {\n position = new Vector2()\n pointerPositions[event.pointerId] = position\n }\n\n position.set(event.pageX, event.pageY)\n }\n\n function getSecondPointerPosition(event: PointerEvent) {\n const pointer = event.pointerId === pointers[0].pointerId ? pointers[1] : pointers[0]\n return pointerPositions[pointer.pointerId]\n }\n\n // Add dolly in/out methods for public API\n\n this.dollyIn = (dollyScale = getZoomScale()) => {\n dollyIn(dollyScale)\n scope.update()\n }\n\n this.dollyOut = (dollyScale = getZoomScale()) => {\n dollyOut(dollyScale)\n scope.update()\n }\n\n this.getScale = () => {\n return scale;\n }\n\n this.setScale = (newScale) => {\n setScale(newScale)\n scope.update()\n }\n\n this.getZoomScale = () => {\n return getZoomScale();\n }\n\n // connect events\n if (domElement !== undefined) this.connect(domElement)\n // force an update at start\n this.update()\n }\n}\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n// This is very similar to OrbitControls, another set of touch behavior\n//\n// Orbit - right mouse, or left mouse + ctrl/meta/shiftKey / touch: two-finger rotate\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - left mouse, or arrow keys / touch: one-finger move\n\nclass MapControls extends OrbitControls {\n constructor(object: PerspectiveCamera | OrthographicCamera, domElement?: HTMLElement) {\n super(object, domElement)\n\n this.screenSpacePanning = false // pan orthogonal to world-space direction camera.up\n\n this.mouseButtons.LEFT = MOUSE.PAN\n this.mouseButtons.RIGHT = MOUSE.ROTATE\n\n this.touches.ONE = TOUCH.PAN\n this.touches.TWO = TOUCH.DOLLY_ROTATE\n }\n}\n\nexport { OrbitControls, MapControls }\n"],"names":["domElement","panLeft","panUp","pan"],"mappings":"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"}
1
+ {"version":3,"file":"OrbitControls.js","sources":["../../src/controls/OrbitControls.ts"],"sourcesContent":["import {\n Matrix4,\n MOUSE,\n OrthographicCamera,\n PerspectiveCamera,\n Quaternion,\n Spherical,\n TOUCH,\n Vector2,\n Vector3,\n Ray,\n Plane,\n} from 'three'\nimport { EventDispatcher } from './EventDispatcher'\nimport { StandardControlsEventMap } from './StandardControlsEventMap'\n\nconst _ray = /* @__PURE__ */ new Ray()\nconst _plane = /* @__PURE__ */ new Plane()\nconst TILT_LIMIT = Math.cos(70 * (Math.PI / 180))\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one-finger move\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move\n\nconst moduloWrapAround = (offset: number, capacity: number) => ((offset % capacity) + capacity) % capacity\n\nclass OrbitControls extends EventDispatcher<StandardControlsEventMap> {\n object: PerspectiveCamera | OrthographicCamera\n domElement: HTMLElement | undefined\n // Set to false to disable this control\n enabled = true\n // \"target\" sets the location of focus, where the object orbits around\n target = new Vector3()\n // How far you can dolly in and out ( PerspectiveCamera only )\n minDistance = 0\n maxDistance = Infinity\n // How far you can zoom in and out ( OrthographicCamera only )\n minZoom = 0\n maxZoom = Infinity\n // How far you can orbit vertically, upper and lower limits.\n // Range is 0 to Math.PI radians.\n minPolarAngle = 0 // radians\n maxPolarAngle = Math.PI // radians\n // How far you can orbit horizontally, upper and lower limits.\n // If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI )\n minAzimuthAngle = -Infinity // radians\n maxAzimuthAngle = Infinity // radians\n // Set to true to enable damping (inertia)\n // If damping is enabled, you must call controls.update() in your animation loop\n enableDamping = false\n dampingFactor = 0.05\n // This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n // Set to false to disable zooming\n enableZoom = true\n zoomSpeed = 1.0\n // Set to false to disable rotating\n enableRotate = true\n rotateSpeed = 1.0\n // Set to false to disable panning\n enablePan = true\n panSpeed = 1.0\n screenSpacePanning = true // if false, pan orthogonal to world-space direction camera.up\n keyPanSpeed = 7.0 // pixels moved per arrow key push\n zoomToCursor = false\n // Set to true to automatically rotate around the target\n // If auto-rotate is enabled, you must call controls.update() in your animation loop\n autoRotate = false\n autoRotateSpeed = 2.0 // 30 seconds per orbit when fps is 60\n reverseOrbit = false // true if you want to reverse the orbit to mouse drag from left to right = orbits left\n reverseHorizontalOrbit = false // true if you want to reverse the horizontal orbit direction\n reverseVerticalOrbit = false // true if you want to reverse the vertical orbit direction\n // The four arrow keys\n keys = { LEFT: 'ArrowLeft', UP: 'ArrowUp', RIGHT: 'ArrowRight', BOTTOM: 'ArrowDown' }\n // Mouse buttons\n mouseButtons: Partial<{\n LEFT: MOUSE\n MIDDLE: MOUSE\n RIGHT: MOUSE\n }> = {\n LEFT: MOUSE.ROTATE,\n MIDDLE: MOUSE.DOLLY,\n RIGHT: MOUSE.PAN,\n }\n // Touch fingers\n touches: Partial<{\n ONE: TOUCH\n TWO: TOUCH\n }> = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN }\n target0: Vector3\n position0: Vector3\n zoom0: number\n // the target DOM element for key events\n _domElementKeyEvents: any = null\n\n getPolarAngle: () => number\n getAzimuthalAngle: () => number\n setPolarAngle: (x: number) => void\n setAzimuthalAngle: (x: number) => void\n getDistance: () => number\n // Not used in most scenarios, however they can be useful for specific use cases\n getZoomScale: () => number\n\n listenToKeyEvents: (domElement: HTMLElement) => void\n stopListenToKeyEvents: () => void\n saveState: () => void\n reset: () => void\n update: () => void\n connect: (domElement: HTMLElement) => void\n dispose: () => void\n\n // Dolly in programmatically\n dollyIn: (dollyScale?: number) => void\n // Dolly out programmatically\n dollyOut: (dollyScale?: number) => void\n // Get the current scale\n getScale: () => number\n // Set the current scale (these are not used in most scenarios, however they can be useful for specific use cases)\n setScale: (newScale: number) => void\n\n constructor(object: PerspectiveCamera | OrthographicCamera, domElement?: HTMLElement) {\n super()\n\n this.object = object\n this.domElement = domElement\n\n // for reset\n this.target0 = this.target.clone()\n this.position0 = this.object.position.clone()\n this.zoom0 = this.object.zoom\n\n //\n // public methods\n //\n\n this.getPolarAngle = (): number => spherical.phi\n\n this.getAzimuthalAngle = (): number => spherical.theta\n\n this.setPolarAngle = (value: number): void => {\n // use modulo wrapping to safeguard value\n let phi = moduloWrapAround(value, 2 * Math.PI)\n let currentPhi = spherical.phi\n\n // convert to the equivalent shortest angle\n if (currentPhi < 0) currentPhi += 2 * Math.PI\n if (phi < 0) phi += 2 * Math.PI\n let phiDist = Math.abs(phi - currentPhi)\n if (2 * Math.PI - phiDist < phiDist) {\n if (phi < currentPhi) {\n phi += 2 * Math.PI\n } else {\n currentPhi += 2 * Math.PI\n }\n }\n sphericalDelta.phi = phi - currentPhi\n scope.update()\n }\n\n this.setAzimuthalAngle = (value: number): void => {\n // use modulo wrapping to safeguard value\n let theta = moduloWrapAround(value, 2 * Math.PI)\n let currentTheta = spherical.theta\n\n // convert to the equivalent shortest angle\n if (currentTheta < 0) currentTheta += 2 * Math.PI\n if (theta < 0) theta += 2 * Math.PI\n let thetaDist = Math.abs(theta - currentTheta)\n if (2 * Math.PI - thetaDist < thetaDist) {\n if (theta < currentTheta) {\n theta += 2 * Math.PI\n } else {\n currentTheta += 2 * Math.PI\n }\n }\n sphericalDelta.theta = theta - currentTheta\n scope.update()\n }\n\n this.getDistance = (): number => scope.object.position.distanceTo(scope.target)\n\n this.listenToKeyEvents = (domElement: HTMLElement): void => {\n domElement.addEventListener('keydown', onKeyDown)\n this._domElementKeyEvents = domElement\n }\n\n this.stopListenToKeyEvents = (): void => {\n this._domElementKeyEvents.removeEventListener('keydown', onKeyDown)\n this._domElementKeyEvents = null\n }\n\n this.saveState = (): void => {\n scope.target0.copy(scope.target)\n scope.position0.copy(scope.object.position)\n scope.zoom0 = scope.object.zoom\n }\n\n this.reset = (): void => {\n scope.target.copy(scope.target0)\n scope.object.position.copy(scope.position0)\n scope.object.zoom = scope.zoom0\n scope.object.updateProjectionMatrix()\n\n // @ts-ignore\n scope.dispatchEvent(changeEvent)\n\n scope.update()\n\n state = STATE.NONE\n }\n\n // this method is exposed, but perhaps it would be better if we can make it private...\n this.update = ((): (() => void) => {\n const offset = new Vector3()\n const up = new Vector3(0, 1, 0)\n\n // so camera.up is the orbit axis\n const quat = new Quaternion().setFromUnitVectors(object.up, up)\n const quatInverse = quat.clone().invert()\n\n const lastPosition = new Vector3()\n const lastQuaternion = new Quaternion()\n\n const twoPI = 2 * Math.PI\n\n return function update(): boolean {\n const position = scope.object.position\n\n // update new up direction\n quat.setFromUnitVectors(object.up, up)\n quatInverse.copy(quat).invert()\n\n offset.copy(position).sub(scope.target)\n\n // rotate offset to \"y-axis-is-up\" space\n offset.applyQuaternion(quat)\n\n // angle from z-axis around y-axis\n spherical.setFromVector3(offset)\n\n if (scope.autoRotate && state === STATE.NONE) {\n rotateLeft(getAutoRotationAngle())\n }\n\n if (scope.enableDamping) {\n spherical.theta += sphericalDelta.theta * scope.dampingFactor\n spherical.phi += sphericalDelta.phi * scope.dampingFactor\n } else {\n spherical.theta += sphericalDelta.theta\n spherical.phi += sphericalDelta.phi\n }\n\n // restrict theta to be between desired limits\n\n let min = scope.minAzimuthAngle\n let max = scope.maxAzimuthAngle\n\n if (isFinite(min) && isFinite(max)) {\n if (min < -Math.PI) min += twoPI\n else if (min > Math.PI) min -= twoPI\n\n if (max < -Math.PI) max += twoPI\n else if (max > Math.PI) max -= twoPI\n\n if (min <= max) {\n spherical.theta = Math.max(min, Math.min(max, spherical.theta))\n } else {\n spherical.theta =\n spherical.theta > (min + max) / 2 ? Math.max(min, spherical.theta) : Math.min(max, spherical.theta)\n }\n }\n\n // restrict phi to be between desired limits\n spherical.phi = Math.max(scope.minPolarAngle, Math.min(scope.maxPolarAngle, spherical.phi))\n spherical.makeSafe()\n\n // move target to panned location\n\n if (scope.enableDamping === true) {\n scope.target.addScaledVector(panOffset, scope.dampingFactor)\n } else {\n scope.target.add(panOffset)\n }\n\n // adjust the camera position based on zoom only if we're not zooming to the cursor or if it's an ortho camera\n // we adjust zoom later in these cases\n if ((scope.zoomToCursor && performCursorZoom) || (scope.object as OrthographicCamera).isOrthographicCamera) {\n spherical.radius = clampDistance(spherical.radius)\n } else {\n spherical.radius = clampDistance(spherical.radius * scale)\n }\n\n offset.setFromSpherical(spherical)\n\n // rotate offset back to \"camera-up-vector-is-up\" space\n offset.applyQuaternion(quatInverse)\n\n position.copy(scope.target).add(offset)\n\n if (!scope.object.matrixAutoUpdate) scope.object.updateMatrix()\n scope.object.lookAt(scope.target)\n\n if (scope.enableDamping === true) {\n sphericalDelta.theta *= 1 - scope.dampingFactor\n sphericalDelta.phi *= 1 - scope.dampingFactor\n\n panOffset.multiplyScalar(1 - scope.dampingFactor)\n } else {\n sphericalDelta.set(0, 0, 0)\n\n panOffset.set(0, 0, 0)\n }\n\n // adjust camera position\n let zoomChanged = false\n if (scope.zoomToCursor && performCursorZoom) {\n let newRadius = null\n if (scope.object instanceof PerspectiveCamera && scope.object.isPerspectiveCamera) {\n // move the camera down the pointer ray\n // this method avoids floating point error\n const prevRadius = offset.length()\n newRadius = clampDistance(prevRadius * scale)\n\n const radiusDelta = prevRadius - newRadius\n scope.object.position.addScaledVector(dollyDirection, radiusDelta)\n scope.object.updateMatrixWorld()\n } else if ((scope.object as OrthographicCamera).isOrthographicCamera) {\n // adjust the ortho camera position based on zoom changes\n const mouseBefore = new Vector3(mouse.x, mouse.y, 0)\n mouseBefore.unproject(scope.object)\n\n scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / scale))\n scope.object.updateProjectionMatrix()\n zoomChanged = true\n\n const mouseAfter = new Vector3(mouse.x, mouse.y, 0)\n mouseAfter.unproject(scope.object)\n\n scope.object.position.sub(mouseAfter).add(mouseBefore)\n scope.object.updateMatrixWorld()\n\n newRadius = offset.length()\n } else {\n console.warn('WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled.')\n scope.zoomToCursor = false\n }\n\n // handle the placement of the target\n if (newRadius !== null) {\n if (scope.screenSpacePanning) {\n // position the orbit target in front of the new camera position\n scope.target\n .set(0, 0, -1)\n .transformDirection(scope.object.matrix)\n .multiplyScalar(newRadius)\n .add(scope.object.position)\n } else {\n // get the ray and translation plane to compute target\n _ray.origin.copy(scope.object.position)\n _ray.direction.set(0, 0, -1).transformDirection(scope.object.matrix)\n\n // if the camera is 20 degrees above the horizon then don't adjust the focus target to avoid\n // extremely large values\n if (Math.abs(scope.object.up.dot(_ray.direction)) < TILT_LIMIT) {\n object.lookAt(scope.target)\n } else {\n _plane.setFromNormalAndCoplanarPoint(scope.object.up, scope.target)\n _ray.intersectPlane(_plane, scope.target)\n }\n }\n }\n } else if (scope.object instanceof OrthographicCamera && scope.object.isOrthographicCamera) {\n zoomChanged = scale !== 1\n\n if (zoomChanged) {\n scope.object.zoom = Math.max(scope.minZoom, Math.min(scope.maxZoom, scope.object.zoom / scale))\n scope.object.updateProjectionMatrix()\n }\n }\n\n scale = 1\n performCursorZoom = false\n\n // update condition is:\n // min(camera displacement, camera rotation in radians)^2 > EPS\n // using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n if (\n zoomChanged ||\n lastPosition.distanceToSquared(scope.object.position) > EPS ||\n 8 * (1 - lastQuaternion.dot(scope.object.quaternion)) > EPS\n ) {\n // @ts-ignore\n scope.dispatchEvent(changeEvent)\n\n lastPosition.copy(scope.object.position)\n lastQuaternion.copy(scope.object.quaternion)\n zoomChanged = false\n\n return true\n }\n\n return false\n }\n })()\n\n // https://github.com/mrdoob/three.js/issues/20575\n this.connect = (domElement: HTMLElement): void => {\n scope.domElement = domElement\n // disables touch scroll\n // touch-action needs to be defined for pointer events to work on mobile\n // https://stackoverflow.com/a/48254578\n scope.domElement.style.touchAction = 'none'\n scope.domElement.addEventListener('contextmenu', onContextMenu)\n scope.domElement.addEventListener('pointerdown', onPointerDown)\n scope.domElement.addEventListener('pointercancel', onPointerUp)\n scope.domElement.addEventListener('wheel', onMouseWheel)\n }\n\n this.dispose = (): void => {\n // Enabling touch scroll\n if (scope.domElement) {\n scope.domElement.style.touchAction = 'auto'\n }\n scope.domElement?.removeEventListener('contextmenu', onContextMenu)\n scope.domElement?.removeEventListener('pointerdown', onPointerDown)\n scope.domElement?.removeEventListener('pointercancel', onPointerUp)\n scope.domElement?.removeEventListener('wheel', onMouseWheel)\n scope.domElement?.ownerDocument.removeEventListener('pointermove', onPointerMove)\n scope.domElement?.ownerDocument.removeEventListener('pointerup', onPointerUp)\n if (scope._domElementKeyEvents !== null) {\n scope._domElementKeyEvents.removeEventListener('keydown', onKeyDown)\n }\n //scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n }\n\n //\n // internals\n //\n\n const scope = this\n\n const changeEvent = { type: 'change' }\n const startEvent = { type: 'start' }\n const endEvent = { type: 'end' }\n\n const STATE = {\n NONE: -1,\n ROTATE: 0,\n DOLLY: 1,\n PAN: 2,\n TOUCH_ROTATE: 3,\n TOUCH_PAN: 4,\n TOUCH_DOLLY_PAN: 5,\n TOUCH_DOLLY_ROTATE: 6,\n }\n\n let state = STATE.NONE\n\n const EPS = 0.000001\n\n // current position in spherical coordinates\n const spherical = new Spherical()\n const sphericalDelta = new Spherical()\n\n let scale = 1\n const panOffset = new Vector3()\n\n const rotateStart = new Vector2()\n const rotateEnd = new Vector2()\n const rotateDelta = new Vector2()\n\n const panStart = new Vector2()\n const panEnd = new Vector2()\n const panDelta = new Vector2()\n\n const dollyStart = new Vector2()\n const dollyEnd = new Vector2()\n const dollyDelta = new Vector2()\n\n const dollyDirection = new Vector3()\n const mouse = new Vector2()\n let performCursorZoom = false\n\n const pointers: PointerEvent[] = []\n const pointerPositions: { [key: string]: Vector2 } = {}\n\n function getAutoRotationAngle(): number {\n return ((2 * Math.PI) / 60 / 60) * scope.autoRotateSpeed\n }\n\n function getZoomScale(): number {\n return Math.pow(0.95, scope.zoomSpeed)\n }\n\n function rotateLeft(angle: number): void {\n if (scope.reverseOrbit || scope.reverseHorizontalOrbit) {\n sphericalDelta.theta += angle\n } else {\n sphericalDelta.theta -= angle\n }\n }\n\n function rotateUp(angle: number): void {\n if (scope.reverseOrbit || scope.reverseVerticalOrbit) {\n sphericalDelta.phi += angle\n } else {\n sphericalDelta.phi -= angle\n }\n }\n\n const panLeft = (() => {\n const v = new Vector3()\n\n return function panLeft(distance: number, objectMatrix: Matrix4) {\n v.setFromMatrixColumn(objectMatrix, 0) // get X column of objectMatrix\n v.multiplyScalar(-distance)\n\n panOffset.add(v)\n }\n })()\n\n const panUp = (() => {\n const v = new Vector3()\n\n return function panUp(distance: number, objectMatrix: Matrix4) {\n if (scope.screenSpacePanning === true) {\n v.setFromMatrixColumn(objectMatrix, 1)\n } else {\n v.setFromMatrixColumn(objectMatrix, 0)\n v.crossVectors(scope.object.up, v)\n }\n\n v.multiplyScalar(distance)\n\n panOffset.add(v)\n }\n })()\n\n // deltaX and deltaY are in pixels; right and down are positive\n const pan = (() => {\n const offset = new Vector3()\n\n return function pan(deltaX: number, deltaY: number) {\n const element = scope.domElement\n\n if (element && scope.object instanceof PerspectiveCamera && scope.object.isPerspectiveCamera) {\n // perspective\n const position = scope.object.position\n offset.copy(position).sub(scope.target)\n let targetDistance = offset.length()\n\n // half of the fov is center to top of screen\n targetDistance *= Math.tan(((scope.object.fov / 2) * Math.PI) / 180.0)\n\n // we use only clientHeight here so aspect ratio does not distort speed\n panLeft((2 * deltaX * targetDistance) / element.clientHeight, scope.object.matrix)\n panUp((2 * deltaY * targetDistance) / element.clientHeight, scope.object.matrix)\n } else if (element && scope.object instanceof OrthographicCamera && scope.object.isOrthographicCamera) {\n // orthographic\n panLeft(\n (deltaX * (scope.object.right - scope.object.left)) / scope.object.zoom / element.clientWidth,\n scope.object.matrix,\n )\n panUp(\n (deltaY * (scope.object.top - scope.object.bottom)) / scope.object.zoom / element.clientHeight,\n scope.object.matrix,\n )\n } else {\n // camera neither orthographic nor perspective\n console.warn('WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.')\n scope.enablePan = false\n }\n }\n })()\n\n function setScale(newScale: number) {\n if (\n (scope.object instanceof PerspectiveCamera && scope.object.isPerspectiveCamera) ||\n (scope.object instanceof OrthographicCamera && scope.object.isOrthographicCamera)\n ) {\n scale = newScale\n } else {\n console.warn('WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.')\n scope.enableZoom = false\n }\n }\n\n function dollyOut(dollyScale: number) {\n setScale(scale / dollyScale)\n }\n\n function dollyIn(dollyScale: number) {\n setScale(scale * dollyScale)\n }\n\n function updateMouseParameters(event: MouseEvent): void {\n if (!scope.zoomToCursor || !scope.domElement) {\n return\n }\n\n performCursorZoom = true\n\n const rect = scope.domElement.getBoundingClientRect()\n const x = event.clientX - rect.left\n const y = event.clientY - rect.top\n const w = rect.width\n const h = rect.height\n\n mouse.x = (x / w) * 2 - 1\n mouse.y = -(y / h) * 2 + 1\n\n dollyDirection.set(mouse.x, mouse.y, 1).unproject(scope.object).sub(scope.object.position).normalize()\n }\n\n function clampDistance(dist: number): number {\n return Math.max(scope.minDistance, Math.min(scope.maxDistance, dist))\n }\n\n //\n // event callbacks - update the object state\n //\n\n function handleMouseDownRotate(event: MouseEvent) {\n rotateStart.set(event.clientX, event.clientY)\n }\n\n function handleMouseDownDolly(event: MouseEvent) {\n updateMouseParameters(event)\n dollyStart.set(event.clientX, event.clientY)\n }\n\n function handleMouseDownPan(event: MouseEvent) {\n panStart.set(event.clientX, event.clientY)\n }\n\n function handleMouseMoveRotate(event: MouseEvent) {\n rotateEnd.set(event.clientX, event.clientY)\n rotateDelta.subVectors(rotateEnd, rotateStart).multiplyScalar(scope.rotateSpeed)\n\n const element = scope.domElement\n\n if (element) {\n rotateLeft((2 * Math.PI * rotateDelta.x) / element.clientHeight) // yes, height\n rotateUp((2 * Math.PI * rotateDelta.y) / element.clientHeight)\n }\n rotateStart.copy(rotateEnd)\n scope.update()\n }\n\n function handleMouseMoveDolly(event: MouseEvent) {\n dollyEnd.set(event.clientX, event.clientY)\n dollyDelta.subVectors(dollyEnd, dollyStart)\n\n if (dollyDelta.y > 0) {\n dollyOut(getZoomScale())\n } else if (dollyDelta.y < 0) {\n dollyIn(getZoomScale())\n }\n\n dollyStart.copy(dollyEnd)\n scope.update()\n }\n\n function handleMouseMovePan(event: MouseEvent) {\n panEnd.set(event.clientX, event.clientY)\n panDelta.subVectors(panEnd, panStart).multiplyScalar(scope.panSpeed)\n pan(panDelta.x, panDelta.y)\n panStart.copy(panEnd)\n scope.update()\n }\n\n function handleMouseWheel(event: WheelEvent) {\n updateMouseParameters(event)\n\n if (event.deltaY < 0) {\n dollyIn(getZoomScale())\n } else if (event.deltaY > 0) {\n dollyOut(getZoomScale())\n }\n\n scope.update()\n }\n\n function handleKeyDown(event: KeyboardEvent) {\n let needsUpdate = false\n\n switch (event.code) {\n case scope.keys.UP:\n pan(0, scope.keyPanSpeed)\n needsUpdate = true\n break\n\n case scope.keys.BOTTOM:\n pan(0, -scope.keyPanSpeed)\n needsUpdate = true\n break\n\n case scope.keys.LEFT:\n pan(scope.keyPanSpeed, 0)\n needsUpdate = true\n break\n\n case scope.keys.RIGHT:\n pan(-scope.keyPanSpeed, 0)\n needsUpdate = true\n break\n }\n\n if (needsUpdate) {\n // prevent the browser from scrolling on cursor keys\n event.preventDefault()\n scope.update()\n }\n }\n\n function handleTouchStartRotate() {\n if (pointers.length == 1) {\n rotateStart.set(pointers[0].pageX, pointers[0].pageY)\n } else {\n const x = 0.5 * (pointers[0].pageX + pointers[1].pageX)\n const y = 0.5 * (pointers[0].pageY + pointers[1].pageY)\n\n rotateStart.set(x, y)\n }\n }\n\n function handleTouchStartPan() {\n if (pointers.length == 1) {\n panStart.set(pointers[0].pageX, pointers[0].pageY)\n } else {\n const x = 0.5 * (pointers[0].pageX + pointers[1].pageX)\n const y = 0.5 * (pointers[0].pageY + pointers[1].pageY)\n\n panStart.set(x, y)\n }\n }\n\n function handleTouchStartDolly() {\n const dx = pointers[0].pageX - pointers[1].pageX\n const dy = pointers[0].pageY - pointers[1].pageY\n const distance = Math.sqrt(dx * dx + dy * dy)\n\n dollyStart.set(0, distance)\n }\n\n function handleTouchStartDollyPan() {\n if (scope.enableZoom) handleTouchStartDolly()\n if (scope.enablePan) handleTouchStartPan()\n }\n\n function handleTouchStartDollyRotate() {\n if (scope.enableZoom) handleTouchStartDolly()\n if (scope.enableRotate) handleTouchStartRotate()\n }\n\n function handleTouchMoveRotate(event: PointerEvent) {\n if (pointers.length == 1) {\n rotateEnd.set(event.pageX, event.pageY)\n } else {\n const position = getSecondPointerPosition(event)\n const x = 0.5 * (event.pageX + position.x)\n const y = 0.5 * (event.pageY + position.y)\n rotateEnd.set(x, y)\n }\n\n rotateDelta.subVectors(rotateEnd, rotateStart).multiplyScalar(scope.rotateSpeed)\n\n const element = scope.domElement\n\n if (element) {\n rotateLeft((2 * Math.PI * rotateDelta.x) / element.clientHeight) // yes, height\n rotateUp((2 * Math.PI * rotateDelta.y) / element.clientHeight)\n }\n rotateStart.copy(rotateEnd)\n }\n\n function handleTouchMovePan(event: PointerEvent) {\n if (pointers.length == 1) {\n panEnd.set(event.pageX, event.pageY)\n } else {\n const position = getSecondPointerPosition(event)\n const x = 0.5 * (event.pageX + position.x)\n const y = 0.5 * (event.pageY + position.y)\n panEnd.set(x, y)\n }\n\n panDelta.subVectors(panEnd, panStart).multiplyScalar(scope.panSpeed)\n pan(panDelta.x, panDelta.y)\n panStart.copy(panEnd)\n }\n\n function handleTouchMoveDolly(event: PointerEvent) {\n const position = getSecondPointerPosition(event)\n const dx = event.pageX - position.x\n const dy = event.pageY - position.y\n const distance = Math.sqrt(dx * dx + dy * dy)\n\n dollyEnd.set(0, distance)\n dollyDelta.set(0, Math.pow(dollyEnd.y / dollyStart.y, scope.zoomSpeed))\n dollyOut(dollyDelta.y)\n dollyStart.copy(dollyEnd)\n }\n\n function handleTouchMoveDollyPan(event: PointerEvent) {\n if (scope.enableZoom) handleTouchMoveDolly(event)\n if (scope.enablePan) handleTouchMovePan(event)\n }\n\n function handleTouchMoveDollyRotate(event: PointerEvent) {\n if (scope.enableZoom) handleTouchMoveDolly(event)\n if (scope.enableRotate) handleTouchMoveRotate(event)\n }\n\n //\n // event handlers - FSM: listen for events and reset state\n //\n\n function onPointerDown(event: PointerEvent) {\n if (scope.enabled === false) return\n\n if (pointers.length === 0) {\n scope.domElement?.ownerDocument.addEventListener('pointermove', onPointerMove)\n scope.domElement?.ownerDocument.addEventListener('pointerup', onPointerUp)\n }\n\n addPointer(event)\n\n if (event.pointerType === 'touch') {\n onTouchStart(event)\n } else {\n onMouseDown(event)\n }\n }\n\n function onPointerMove(event: PointerEvent) {\n if (scope.enabled === false) return\n\n if (event.pointerType === 'touch') {\n onTouchMove(event)\n } else {\n onMouseMove(event)\n }\n }\n\n function onPointerUp(event: PointerEvent) {\n removePointer(event)\n\n if (pointers.length === 0) {\n scope.domElement?.releasePointerCapture(event.pointerId)\n\n scope.domElement?.ownerDocument.removeEventListener('pointermove', onPointerMove)\n scope.domElement?.ownerDocument.removeEventListener('pointerup', onPointerUp)\n }\n\n // @ts-ignore\n scope.dispatchEvent(endEvent)\n\n state = STATE.NONE\n }\n\n function onMouseDown(event: MouseEvent) {\n let mouseAction\n\n switch (event.button) {\n case 0:\n mouseAction = scope.mouseButtons.LEFT\n break\n\n case 1:\n mouseAction = scope.mouseButtons.MIDDLE\n break\n\n case 2:\n mouseAction = scope.mouseButtons.RIGHT\n break\n\n default:\n mouseAction = -1\n }\n\n switch (mouseAction) {\n case MOUSE.DOLLY:\n if (scope.enableZoom === false) return\n handleMouseDownDolly(event)\n state = STATE.DOLLY\n break\n\n case MOUSE.ROTATE:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n if (scope.enablePan === false) return\n handleMouseDownPan(event)\n state = STATE.PAN\n } else {\n if (scope.enableRotate === false) return\n handleMouseDownRotate(event)\n state = STATE.ROTATE\n }\n break\n\n case MOUSE.PAN:\n if (event.ctrlKey || event.metaKey || event.shiftKey) {\n if (scope.enableRotate === false) return\n handleMouseDownRotate(event)\n state = STATE.ROTATE\n } else {\n if (scope.enablePan === false) return\n handleMouseDownPan(event)\n state = STATE.PAN\n }\n break\n\n default:\n state = STATE.NONE\n }\n\n if (state !== STATE.NONE) {\n // @ts-ignore\n scope.dispatchEvent(startEvent)\n }\n }\n\n function onMouseMove(event: MouseEvent) {\n if (scope.enabled === false) return\n\n switch (state) {\n case STATE.ROTATE:\n if (scope.enableRotate === false) return\n handleMouseMoveRotate(event)\n break\n\n case STATE.DOLLY:\n if (scope.enableZoom === false) return\n handleMouseMoveDolly(event)\n break\n\n case STATE.PAN:\n if (scope.enablePan === false) return\n handleMouseMovePan(event)\n break\n }\n }\n\n function onMouseWheel(event: WheelEvent) {\n if (scope.enabled === false || scope.enableZoom === false || (state !== STATE.NONE && state !== STATE.ROTATE)) {\n return\n }\n\n event.preventDefault()\n\n // @ts-ignore\n scope.dispatchEvent(startEvent)\n\n handleMouseWheel(event)\n\n // @ts-ignore\n scope.dispatchEvent(endEvent)\n }\n\n function onKeyDown(event: KeyboardEvent) {\n if (scope.enabled === false || scope.enablePan === false) return\n handleKeyDown(event)\n }\n\n function onTouchStart(event: PointerEvent) {\n trackPointer(event)\n\n switch (pointers.length) {\n case 1:\n switch (scope.touches.ONE) {\n case TOUCH.ROTATE:\n if (scope.enableRotate === false) return\n handleTouchStartRotate()\n state = STATE.TOUCH_ROTATE\n break\n\n case TOUCH.PAN:\n if (scope.enablePan === false) return\n handleTouchStartPan()\n state = STATE.TOUCH_PAN\n break\n\n default:\n state = STATE.NONE\n }\n\n break\n\n case 2:\n switch (scope.touches.TWO) {\n case TOUCH.DOLLY_PAN:\n if (scope.enableZoom === false && scope.enablePan === false) return\n handleTouchStartDollyPan()\n state = STATE.TOUCH_DOLLY_PAN\n break\n\n case TOUCH.DOLLY_ROTATE:\n if (scope.enableZoom === false && scope.enableRotate === false) return\n handleTouchStartDollyRotate()\n state = STATE.TOUCH_DOLLY_ROTATE\n break\n\n default:\n state = STATE.NONE\n }\n\n break\n\n default:\n state = STATE.NONE\n }\n\n if (state !== STATE.NONE) {\n // @ts-ignore\n scope.dispatchEvent(startEvent)\n }\n }\n\n function onTouchMove(event: PointerEvent) {\n trackPointer(event)\n\n switch (state) {\n case STATE.TOUCH_ROTATE:\n if (scope.enableRotate === false) return\n handleTouchMoveRotate(event)\n scope.update()\n break\n\n case STATE.TOUCH_PAN:\n if (scope.enablePan === false) return\n handleTouchMovePan(event)\n scope.update()\n break\n\n case STATE.TOUCH_DOLLY_PAN:\n if (scope.enableZoom === false && scope.enablePan === false) return\n handleTouchMoveDollyPan(event)\n scope.update()\n break\n\n case STATE.TOUCH_DOLLY_ROTATE:\n if (scope.enableZoom === false && scope.enableRotate === false) return\n handleTouchMoveDollyRotate(event)\n scope.update()\n break\n\n default:\n state = STATE.NONE\n }\n }\n\n function onContextMenu(event: Event) {\n if (scope.enabled === false) return\n event.preventDefault()\n }\n\n function addPointer(event: PointerEvent) {\n pointers.push(event)\n }\n\n function removePointer(event: PointerEvent) {\n delete pointerPositions[event.pointerId]\n\n for (let i = 0; i < pointers.length; i++) {\n if (pointers[i].pointerId == event.pointerId) {\n pointers.splice(i, 1)\n return\n }\n }\n }\n\n function trackPointer(event: PointerEvent) {\n let position = pointerPositions[event.pointerId]\n\n if (position === undefined) {\n position = new Vector2()\n pointerPositions[event.pointerId] = position\n }\n\n position.set(event.pageX, event.pageY)\n }\n\n function getSecondPointerPosition(event: PointerEvent) {\n const pointer = event.pointerId === pointers[0].pointerId ? pointers[1] : pointers[0]\n return pointerPositions[pointer.pointerId]\n }\n\n // Add dolly in/out methods for public API\n\n this.dollyIn = (dollyScale = getZoomScale()) => {\n dollyIn(dollyScale)\n scope.update()\n }\n\n this.dollyOut = (dollyScale = getZoomScale()) => {\n dollyOut(dollyScale)\n scope.update()\n }\n\n this.getScale = () => {\n return scale\n }\n\n this.setScale = (newScale) => {\n setScale(newScale)\n scope.update()\n }\n\n this.getZoomScale = () => {\n return getZoomScale()\n }\n\n // connect events\n if (domElement !== undefined) this.connect(domElement)\n // force an update at start\n this.update()\n }\n}\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n// This is very similar to OrbitControls, another set of touch behavior\n//\n// Orbit - right mouse, or left mouse + ctrl/meta/shiftKey / touch: two-finger rotate\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - left mouse, or arrow keys / touch: one-finger move\n\nclass MapControls extends OrbitControls {\n constructor(object: PerspectiveCamera | OrthographicCamera, domElement?: HTMLElement) {\n super(object, domElement)\n\n this.screenSpacePanning = false // pan orthogonal to world-space direction camera.up\n\n this.mouseButtons.LEFT = MOUSE.PAN\n this.mouseButtons.RIGHT = MOUSE.ROTATE\n\n this.touches.ONE = TOUCH.PAN\n this.touches.TWO = TOUCH.DOLLY_ROTATE\n }\n}\n\nexport { OrbitControls, MapControls }\n"],"names":["domElement","panLeft","panUp","pan"],"mappings":";;;;;;;;AAgBA,MAAM,2BAA2B;AACjC,MAAM,6BAA6B;AACnC,MAAM,aAAa,KAAK,IAAI,MAAM,KAAK,KAAK,IAAI;AAShD,MAAM,mBAAmB,CAAC,QAAgB,cAAuB,SAAS,WAAY,YAAY;AAElG,MAAM,sBAAsB,gBAA0C;AAAA,EA6FpE,YAAY,QAAgD,YAA0B;AAC9E;AA7FR;AACA;AAEA;AAAA,mCAAU;AAEV;AAAA,kCAAS,IAAI;AAEb;AAAA,uCAAc;AACd,uCAAc;AAEd;AAAA,mCAAU;AACV,mCAAU;AAGV;AAAA;AAAA,yCAAgB;AAChB;AAAA,yCAAgB,KAAK;AAGrB;AAAA;AAAA;AAAA,2CAAkB;AAClB;AAAA,2CAAkB;AAGlB;AAAA;AAAA;AAAA,yCAAgB;AAChB,yCAAgB;AAGhB;AAAA;AAAA,sCAAa;AACb,qCAAY;AAEZ;AAAA,wCAAe;AACf,uCAAc;AAEd;AAAA,qCAAY;AACZ,oCAAW;AACX,8CAAqB;AACrB;AAAA,uCAAc;AACd;AAAA,wCAAe;AAGf;AAAA;AAAA,sCAAa;AACb,2CAAkB;AAClB;AAAA,wCAAe;AACf;AAAA,kDAAyB;AACzB;AAAA,gDAAuB;AAEvB;AAAA;AAAA,gCAAO,EAAE,MAAM,aAAa,IAAI,WAAW,OAAO,cAAc,QAAQ;AAExE;AAAA,wCAIK;AAAA,MACH,MAAM,MAAM;AAAA,MACZ,QAAQ,MAAM;AAAA,MACd,OAAO,MAAM;AAAA,IAAA;AAGf;AAAA,mCAGK,EAAE,KAAK,MAAM,QAAQ,KAAK,MAAM;AACrC;AACA;AACA;AAEA;AAAA,gDAA4B;AAE5B;AACA;AACA;AACA;AACA;AAEA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAAA;AAEA;AAAA;AAEA;AAAA;AAEA;AAAA;AAKE,SAAK,SAAS;AACd,SAAK,aAAa;AAGb,SAAA,UAAU,KAAK,OAAO,MAAM;AACjC,SAAK,YAAY,KAAK,OAAO,SAAS,MAAM;AACvC,SAAA,QAAQ,KAAK,OAAO;AAMpB,SAAA,gBAAgB,MAAc,UAAU;AAExC,SAAA,oBAAoB,MAAc,UAAU;AAE5C,SAAA,gBAAgB,CAAC,UAAwB;AAE5C,UAAI,MAAM,iBAAiB,OAAO,IAAI,KAAK,EAAE;AAC7C,UAAI,aAAa,UAAU;AAG3B,UAAI,aAAa;AAAG,sBAAc,IAAI,KAAK;AAC3C,UAAI,MAAM;AAAG,eAAO,IAAI,KAAK;AAC7B,UAAI,UAAU,KAAK,IAAI,MAAM,UAAU;AACvC,UAAI,IAAI,KAAK,KAAK,UAAU,SAAS;AACnC,YAAI,MAAM,YAAY;AACpB,iBAAO,IAAI,KAAK;AAAA,QAAA,OACX;AACL,wBAAc,IAAI,KAAK;AAAA,QACzB;AAAA,MACF;AACA,qBAAe,MAAM,MAAM;AAC3B,YAAM,OAAO;AAAA,IAAA;AAGV,SAAA,oBAAoB,CAAC,UAAwB;AAEhD,UAAI,QAAQ,iBAAiB,OAAO,IAAI,KAAK,EAAE;AAC/C,UAAI,eAAe,UAAU;AAG7B,UAAI,eAAe;AAAG,wBAAgB,IAAI,KAAK;AAC/C,UAAI,QAAQ;AAAG,iBAAS,IAAI,KAAK;AACjC,UAAI,YAAY,KAAK,IAAI,QAAQ,YAAY;AAC7C,UAAI,IAAI,KAAK,KAAK,YAAY,WAAW;AACvC,YAAI,QAAQ,cAAc;AACxB,mBAAS,IAAI,KAAK;AAAA,QAAA,OACb;AACL,0BAAgB,IAAI,KAAK;AAAA,QAC3B;AAAA,MACF;AACA,qBAAe,QAAQ,QAAQ;AAC/B,YAAM,OAAO;AAAA,IAAA;AAGf,SAAK,cAAc,MAAc,MAAM,OAAO,SAAS,WAAW,MAAM,MAAM;AAEzE,SAAA,oBAAoB,CAACA,gBAAkC;AAC1DA,kBAAW,iBAAiB,WAAW,SAAS;AAChD,WAAK,uBAAuBA;AAAAA,IAAA;AAG9B,SAAK,wBAAwB,MAAY;AAClC,WAAA,qBAAqB,oBAAoB,WAAW,SAAS;AAClE,WAAK,uBAAuB;AAAA,IAAA;AAG9B,SAAK,YAAY,MAAY;AACrB,YAAA,QAAQ,KAAK,MAAM,MAAM;AAC/B,YAAM,UAAU,KAAK,MAAM,OAAO,QAAQ;AACpC,YAAA,QAAQ,MAAM,OAAO;AAAA,IAAA;AAG7B,SAAK,QAAQ,MAAY;AACjB,YAAA,OAAO,KAAK,MAAM,OAAO;AAC/B,YAAM,OAAO,SAAS,KAAK,MAAM,SAAS;AACpC,YAAA,OAAO,OAAO,MAAM;AAC1B,YAAM,OAAO;AAGb,YAAM,cAAc,WAAW;AAE/B,YAAM,OAAO;AAEb,cAAQ,MAAM;AAAA,IAAA;AAIhB,SAAK,UAAU,MAAoB;AAC3B,YAAA,SAAS,IAAI;AACnB,YAAM,KAAK,IAAI,QAAQ,GAAG,GAAG,CAAC;AAG9B,YAAM,OAAO,IAAI,aAAa,mBAAmB,OAAO,IAAI,EAAE;AAC9D,YAAM,cAAc,KAAK,MAAM,EAAE,OAAO;AAElC,YAAA,eAAe,IAAI;AACnB,YAAA,iBAAiB,IAAI;AAErB,YAAA,QAAQ,IAAI,KAAK;AAEvB,aAAO,SAAS,SAAkB;AAC1B,cAAA,WAAW,MAAM,OAAO;AAGzB,aAAA,mBAAmB,OAAO,IAAI,EAAE;AACzB,oBAAA,KAAK,IAAI,EAAE,OAAO;AAE9B,eAAO,KAAK,QAAQ,EAAE,IAAI,MAAM,MAAM;AAGtC,eAAO,gBAAgB,IAAI;AAG3B,kBAAU,eAAe,MAAM;AAE/B,YAAI,MAAM,cAAc,UAAU,MAAM,MAAM;AAC5C,qBAAW,sBAAsB;AAAA,QACnC;AAEA,YAAI,MAAM,eAAe;AACb,oBAAA,SAAS,eAAe,QAAQ,MAAM;AACtC,oBAAA,OAAO,eAAe,MAAM,MAAM;AAAA,QAAA,OACvC;AACL,oBAAU,SAAS,eAAe;AAClC,oBAAU,OAAO,eAAe;AAAA,QAClC;AAIA,YAAI,MAAM,MAAM;AAChB,YAAI,MAAM,MAAM;AAEhB,YAAI,SAAS,GAAG,KAAK,SAAS,GAAG,GAAG;AAC9B,cAAA,MAAM,CAAC,KAAK;AAAW,mBAAA;AAAA,mBAClB,MAAM,KAAK;AAAW,mBAAA;AAE3B,cAAA,MAAM,CAAC,KAAK;AAAW,mBAAA;AAAA,mBAClB,MAAM,KAAK;AAAW,mBAAA;AAE/B,cAAI,OAAO,KAAK;AACJ,sBAAA,QAAQ,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,UAAU,KAAK,CAAC;AAAA,UAAA,OACzD;AACL,sBAAU,QACR,UAAU,SAAS,MAAM,OAAO,IAAI,KAAK,IAAI,KAAK,UAAU,KAAK,IAAI,KAAK,IAAI,KAAK,UAAU,KAAK;AAAA,UACtG;AAAA,QACF;AAGU,kBAAA,MAAM,KAAK,IAAI,MAAM,eAAe,KAAK,IAAI,MAAM,eAAe,UAAU,GAAG,CAAC;AAC1F,kBAAU,SAAS;AAIf,YAAA,MAAM,kBAAkB,MAAM;AAChC,gBAAM,OAAO,gBAAgB,WAAW,MAAM,aAAa;AAAA,QAAA,OACtD;AACC,gBAAA,OAAO,IAAI,SAAS;AAAA,QAC5B;AAIA,YAAK,MAAM,gBAAgB,qBAAuB,MAAM,OAA8B,sBAAsB;AAChG,oBAAA,SAAS,cAAc,UAAU,MAAM;AAAA,QAAA,OAC5C;AACL,oBAAU,SAAS,cAAc,UAAU,SAAS,KAAK;AAAA,QAC3D;AAEA,eAAO,iBAAiB,SAAS;AAGjC,eAAO,gBAAgB,WAAW;AAElC,iBAAS,KAAK,MAAM,MAAM,EAAE,IAAI,MAAM;AAElC,YAAA,CAAC,MAAM,OAAO;AAAkB,gBAAM,OAAO;AAC3C,cAAA,OAAO,OAAO,MAAM,MAAM;AAE5B,YAAA,MAAM,kBAAkB,MAAM;AACjB,yBAAA,SAAS,IAAI,MAAM;AACnB,yBAAA,OAAO,IAAI,MAAM;AAEtB,oBAAA,eAAe,IAAI,MAAM,aAAa;AAAA,QAAA,OAC3C;AACU,yBAAA,IAAI,GAAG,GAAG,CAAC;AAEhB,oBAAA,IAAI,GAAG,GAAG,CAAC;AAAA,QACvB;AAGA,YAAI,cAAc;AACd,YAAA,MAAM,gBAAgB,mBAAmB;AAC3C,cAAI,YAAY;AAChB,cAAI,MAAM,kBAAkB,qBAAqB,MAAM,OAAO,qBAAqB;AAG3E,kBAAA,aAAa,OAAO;AACd,wBAAA,cAAc,aAAa,KAAK;AAE5C,kBAAM,cAAc,aAAa;AACjC,kBAAM,OAAO,SAAS,gBAAgB,gBAAgB,WAAW;AACjE,kBAAM,OAAO;UAAkB,WACrB,MAAM,OAA8B,sBAAsB;AAEpE,kBAAM,cAAc,IAAI,QAAQ,MAAM,GAAG,MAAM,GAAG,CAAC;AACvC,wBAAA,UAAU,MAAM,MAAM;AAElC,kBAAM,OAAO,OAAO,KAAK,IAAI,MAAM,SAAS,KAAK,IAAI,MAAM,SAAS,MAAM,OAAO,OAAO,KAAK,CAAC;AAC9F,kBAAM,OAAO;AACC,0BAAA;AAEd,kBAAM,aAAa,IAAI,QAAQ,MAAM,GAAG,MAAM,GAAG,CAAC;AACvC,uBAAA,UAAU,MAAM,MAAM;AAEjC,kBAAM,OAAO,SAAS,IAAI,UAAU,EAAE,IAAI,WAAW;AACrD,kBAAM,OAAO;AAEb,wBAAY,OAAO;UAAO,OACrB;AACL,oBAAQ,KAAK,yFAAyF;AACtG,kBAAM,eAAe;AAAA,UACvB;AAGA,cAAI,cAAc,MAAM;AACtB,gBAAI,MAAM,oBAAoB;AAE5B,oBAAM,OACH,IAAI,GAAG,GAAG,EAAE,EACZ,mBAAmB,MAAM,OAAO,MAAM,EACtC,eAAe,SAAS,EACxB,IAAI,MAAM,OAAO,QAAQ;AAAA,YAAA,OACvB;AAEL,mBAAK,OAAO,KAAK,MAAM,OAAO,QAAQ;AACjC,mBAAA,UAAU,IAAI,GAAG,GAAG,EAAE,EAAE,mBAAmB,MAAM,OAAO,MAAM;AAI/D,kBAAA,KAAK,IAAI,MAAM,OAAO,GAAG,IAAI,KAAK,SAAS,CAAC,IAAI,YAAY;AACvD,uBAAA,OAAO,MAAM,MAAM;AAAA,cAAA,OACrB;AACL,uBAAO,8BAA8B,MAAM,OAAO,IAAI,MAAM,MAAM;AAC7D,qBAAA,eAAe,QAAQ,MAAM,MAAM;AAAA,cAC1C;AAAA,YACF;AAAA,UACF;AAAA,QAAA,WACS,MAAM,kBAAkB,sBAAsB,MAAM,OAAO,sBAAsB;AAC1F,wBAAc,UAAU;AAExB,cAAI,aAAa;AACf,kBAAM,OAAO,OAAO,KAAK,IAAI,MAAM,SAAS,KAAK,IAAI,MAAM,SAAS,MAAM,OAAO,OAAO,KAAK,CAAC;AAC9F,kBAAM,OAAO;UACf;AAAA,QACF;AAEQ,gBAAA;AACY,4BAAA;AAMpB,YACE,eACA,aAAa,kBAAkB,MAAM,OAAO,QAAQ,IAAI,OACxD,KAAK,IAAI,eAAe,IAAI,MAAM,OAAO,UAAU,KAAK,KACxD;AAEA,gBAAM,cAAc,WAAW;AAElB,uBAAA,KAAK,MAAM,OAAO,QAAQ;AACxB,yBAAA,KAAK,MAAM,OAAO,UAAU;AAC7B,wBAAA;AAEP,iBAAA;AAAA,QACT;AAEO,eAAA;AAAA,MAAA;AAAA,IACT;AAIG,SAAA,UAAU,CAACA,gBAAkC;AAChD,YAAM,aAAaA;AAIb,YAAA,WAAW,MAAM,cAAc;AAC/B,YAAA,WAAW,iBAAiB,eAAe,aAAa;AACxD,YAAA,WAAW,iBAAiB,eAAe,aAAa;AACxD,YAAA,WAAW,iBAAiB,iBAAiB,WAAW;AACxD,YAAA,WAAW,iBAAiB,SAAS,YAAY;AAAA,IAAA;AAGzD,SAAK,UAAU,MAAY;;AAEzB,UAAI,MAAM,YAAY;AACd,cAAA,WAAW,MAAM,cAAc;AAAA,MACvC;AACM,kBAAA,eAAA,mBAAY,oBAAoB,eAAe;AAC/C,kBAAA,eAAA,mBAAY,oBAAoB,eAAe;AAC/C,kBAAA,eAAA,mBAAY,oBAAoB,iBAAiB;AACjD,kBAAA,eAAA,mBAAY,oBAAoB,SAAS;AAC/C,kBAAM,eAAN,mBAAkB,cAAc,oBAAoB,eAAe;AACnE,kBAAM,eAAN,mBAAkB,cAAc,oBAAoB,aAAa;AAC7D,UAAA,MAAM,yBAAyB,MAAM;AACjC,cAAA,qBAAqB,oBAAoB,WAAW,SAAS;AAAA,MACrE;AAAA,IAAA;AAQF,UAAM,QAAQ;AAER,UAAA,cAAc,EAAE,MAAM;AACtB,UAAA,aAAa,EAAE,MAAM;AACrB,UAAA,WAAW,EAAE,MAAM;AAEzB,UAAM,QAAQ;AAAA,MACZ,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,KAAK;AAAA,MACL,cAAc;AAAA,MACd,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,IAAA;AAGtB,QAAI,QAAQ,MAAM;AAElB,UAAM,MAAM;AAGN,UAAA,YAAY,IAAI;AAChB,UAAA,iBAAiB,IAAI;AAE3B,QAAI,QAAQ;AACN,UAAA,YAAY,IAAI;AAEhB,UAAA,cAAc,IAAI;AAClB,UAAA,YAAY,IAAI;AAChB,UAAA,cAAc,IAAI;AAElB,UAAA,WAAW,IAAI;AACf,UAAA,SAAS,IAAI;AACb,UAAA,WAAW,IAAI;AAEf,UAAA,aAAa,IAAI;AACjB,UAAA,WAAW,IAAI;AACf,UAAA,aAAa,IAAI;AAEjB,UAAA,iBAAiB,IAAI;AACrB,UAAA,QAAQ,IAAI;AAClB,QAAI,oBAAoB;AAExB,UAAM,WAA2B,CAAA;AACjC,UAAM,mBAA+C,CAAA;AAErD,aAAS,uBAA+B;AACtC,aAAS,IAAI,KAAK,KAAM,KAAK,KAAM,MAAM;AAAA,IAC3C;AAEA,aAAS,eAAuB;AAC9B,aAAO,KAAK,IAAI,MAAM,MAAM,SAAS;AAAA,IACvC;AAEA,aAAS,WAAW,OAAqB;AACnC,UAAA,MAAM,gBAAgB,MAAM,wBAAwB;AACtD,uBAAe,SAAS;AAAA,MAAA,OACnB;AACL,uBAAe,SAAS;AAAA,MAC1B;AAAA,IACF;AAEA,aAAS,SAAS,OAAqB;AACjC,UAAA,MAAM,gBAAgB,MAAM,sBAAsB;AACpD,uBAAe,OAAO;AAAA,MAAA,OACjB;AACL,uBAAe,OAAO;AAAA,MACxB;AAAA,IACF;AAEA,UAAM,WAAW,MAAM;AACf,YAAA,IAAI,IAAI;AAEP,aAAA,SAASC,SAAQ,UAAkB,cAAuB;AAC7D,UAAA,oBAAoB,cAAc,CAAC;AACnC,UAAA,eAAe,CAAC,QAAQ;AAE1B,kBAAU,IAAI,CAAC;AAAA,MAAA;AAAA,IACjB;AAGF,UAAM,SAAS,MAAM;AACb,YAAA,IAAI,IAAI;AAEP,aAAA,SAASC,OAAM,UAAkB,cAAuB;AACzD,YAAA,MAAM,uBAAuB,MAAM;AACnC,YAAA,oBAAoB,cAAc,CAAC;AAAA,QAAA,OAChC;AACH,YAAA,oBAAoB,cAAc,CAAC;AACrC,YAAE,aAAa,MAAM,OAAO,IAAI,CAAC;AAAA,QACnC;AAEA,UAAE,eAAe,QAAQ;AAEzB,kBAAU,IAAI,CAAC;AAAA,MAAA;AAAA,IACjB;AAIF,UAAM,OAAO,MAAM;AACX,YAAA,SAAS,IAAI;AAEZ,aAAA,SAASC,KAAI,QAAgB,QAAgB;AAClD,cAAM,UAAU,MAAM;AAEtB,YAAI,WAAW,MAAM,kBAAkB,qBAAqB,MAAM,OAAO,qBAAqB;AAEtF,gBAAA,WAAW,MAAM,OAAO;AAC9B,iBAAO,KAAK,QAAQ,EAAE,IAAI,MAAM,MAAM;AAClC,cAAA,iBAAiB,OAAO;AAGV,4BAAA,KAAK,IAAM,MAAM,OAAO,MAAM,IAAK,KAAK,KAAM,GAAK;AAGrE,kBAAS,IAAI,SAAS,iBAAkB,QAAQ,cAAc,MAAM,OAAO,MAAM;AACjF,gBAAO,IAAI,SAAS,iBAAkB,QAAQ,cAAc,MAAM,OAAO,MAAM;AAAA,QAAA,WACtE,WAAW,MAAM,kBAAkB,sBAAsB,MAAM,OAAO,sBAAsB;AAErG;AAAA,YACG,UAAU,MAAM,OAAO,QAAQ,MAAM,OAAO,QAAS,MAAM,OAAO,OAAO,QAAQ;AAAA,YAClF,MAAM,OAAO;AAAA,UAAA;AAEf;AAAA,YACG,UAAU,MAAM,OAAO,MAAM,MAAM,OAAO,UAAW,MAAM,OAAO,OAAO,QAAQ;AAAA,YAClF,MAAM,OAAO;AAAA,UAAA;AAAA,QACf,OACK;AAEL,kBAAQ,KAAK,8EAA8E;AAC3F,gBAAM,YAAY;AAAA,QACpB;AAAA,MAAA;AAAA,IACF;AAGF,aAAS,SAAS,UAAkB;AAE/B,UAAA,MAAM,kBAAkB,qBAAqB,MAAM,OAAO,uBAC1D,MAAM,kBAAkB,sBAAsB,MAAM,OAAO,sBAC5D;AACQ,gBAAA;AAAA,MAAA,OACH;AACL,gBAAQ,KAAK,qFAAqF;AAClG,cAAM,aAAa;AAAA,MACrB;AAAA,IACF;AAEA,aAAS,SAAS,YAAoB;AACpC,eAAS,QAAQ,UAAU;AAAA,IAC7B;AAEA,aAAS,QAAQ,YAAoB;AACnC,eAAS,QAAQ,UAAU;AAAA,IAC7B;AAEA,aAAS,sBAAsB,OAAyB;AACtD,UAAI,CAAC,MAAM,gBAAgB,CAAC,MAAM,YAAY;AAC5C;AAAA,MACF;AAEoB,0BAAA;AAEd,YAAA,OAAO,MAAM,WAAW,sBAAsB;AAC9C,YAAA,IAAI,MAAM,UAAU,KAAK;AACzB,YAAA,IAAI,MAAM,UAAU,KAAK;AAC/B,YAAM,IAAI,KAAK;AACf,YAAM,IAAI,KAAK;AAET,YAAA,IAAK,IAAI,IAAK,IAAI;AACxB,YAAM,IAAI,EAAE,IAAI,KAAK,IAAI;AAEzB,qBAAe,IAAI,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,UAAU,MAAM,MAAM,EAAE,IAAI,MAAM,OAAO,QAAQ,EAAE;IAC7F;AAEA,aAAS,cAAc,MAAsB;AACpC,aAAA,KAAK,IAAI,MAAM,aAAa,KAAK,IAAI,MAAM,aAAa,IAAI,CAAC;AAAA,IACtE;AAMA,aAAS,sBAAsB,OAAmB;AAChD,kBAAY,IAAI,MAAM,SAAS,MAAM,OAAO;AAAA,IAC9C;AAEA,aAAS,qBAAqB,OAAmB;AAC/C,4BAAsB,KAAK;AAC3B,iBAAW,IAAI,MAAM,SAAS,MAAM,OAAO;AAAA,IAC7C;AAEA,aAAS,mBAAmB,OAAmB;AAC7C,eAAS,IAAI,MAAM,SAAS,MAAM,OAAO;AAAA,IAC3C;AAEA,aAAS,sBAAsB,OAAmB;AAChD,gBAAU,IAAI,MAAM,SAAS,MAAM,OAAO;AAC1C,kBAAY,WAAW,WAAW,WAAW,EAAE,eAAe,MAAM,WAAW;AAE/E,YAAM,UAAU,MAAM;AAEtB,UAAI,SAAS;AACX,mBAAY,IAAI,KAAK,KAAK,YAAY,IAAK,QAAQ,YAAY;AAC/D,iBAAU,IAAI,KAAK,KAAK,YAAY,IAAK,QAAQ,YAAY;AAAA,MAC/D;AACA,kBAAY,KAAK,SAAS;AAC1B,YAAM,OAAO;AAAA,IACf;AAEA,aAAS,qBAAqB,OAAmB;AAC/C,eAAS,IAAI,MAAM,SAAS,MAAM,OAAO;AAC9B,iBAAA,WAAW,UAAU,UAAU;AAEtC,UAAA,WAAW,IAAI,GAAG;AACpB,iBAAS,cAAc;AAAA,MAAA,WACd,WAAW,IAAI,GAAG;AAC3B,gBAAQ,cAAc;AAAA,MACxB;AAEA,iBAAW,KAAK,QAAQ;AACxB,YAAM,OAAO;AAAA,IACf;AAEA,aAAS,mBAAmB,OAAmB;AAC7C,aAAO,IAAI,MAAM,SAAS,MAAM,OAAO;AACvC,eAAS,WAAW,QAAQ,QAAQ,EAAE,eAAe,MAAM,QAAQ;AAC/D,UAAA,SAAS,GAAG,SAAS,CAAC;AAC1B,eAAS,KAAK,MAAM;AACpB,YAAM,OAAO;AAAA,IACf;AAEA,aAAS,iBAAiB,OAAmB;AAC3C,4BAAsB,KAAK;AAEvB,UAAA,MAAM,SAAS,GAAG;AACpB,gBAAQ,cAAc;AAAA,MAAA,WACb,MAAM,SAAS,GAAG;AAC3B,iBAAS,cAAc;AAAA,MACzB;AAEA,YAAM,OAAO;AAAA,IACf;AAEA,aAAS,cAAc,OAAsB;AAC3C,UAAI,cAAc;AAElB,cAAQ,MAAM,MAAM;AAAA,QAClB,KAAK,MAAM,KAAK;AACV,cAAA,GAAG,MAAM,WAAW;AACV,wBAAA;AACd;AAAA,QAEF,KAAK,MAAM,KAAK;AACV,cAAA,GAAG,CAAC,MAAM,WAAW;AACX,wBAAA;AACd;AAAA,QAEF,KAAK,MAAM,KAAK;AACV,cAAA,MAAM,aAAa,CAAC;AACV,wBAAA;AACd;AAAA,QAEF,KAAK,MAAM,KAAK;AACV,cAAA,CAAC,MAAM,aAAa,CAAC;AACX,wBAAA;AACd;AAAA,MACJ;AAEA,UAAI,aAAa;AAEf,cAAM,eAAe;AACrB,cAAM,OAAO;AAAA,MACf;AAAA,IACF;AAEA,aAAS,yBAAyB;AAC5B,UAAA,SAAS,UAAU,GAAG;AACZ,oBAAA,IAAI,SAAS,CAAC,EAAE,OAAO,SAAS,CAAC,EAAE,KAAK;AAAA,MAAA,OAC/C;AACC,cAAA,IAAI,OAAO,SAAS,CAAC,EAAE,QAAQ,SAAS,CAAC,EAAE;AAC3C,cAAA,IAAI,OAAO,SAAS,CAAC,EAAE,QAAQ,SAAS,CAAC,EAAE;AAErC,oBAAA,IAAI,GAAG,CAAC;AAAA,MACtB;AAAA,IACF;AAEA,aAAS,sBAAsB;AACzB,UAAA,SAAS,UAAU,GAAG;AACf,iBAAA,IAAI,SAAS,CAAC,EAAE,OAAO,SAAS,CAAC,EAAE,KAAK;AAAA,MAAA,OAC5C;AACC,cAAA,IAAI,OAAO,SAAS,CAAC,EAAE,QAAQ,SAAS,CAAC,EAAE;AAC3C,cAAA,IAAI,OAAO,SAAS,CAAC,EAAE,QAAQ,SAAS,CAAC,EAAE;AAExC,iBAAA,IAAI,GAAG,CAAC;AAAA,MACnB;AAAA,IACF;AAEA,aAAS,wBAAwB;AAC/B,YAAM,KAAK,SAAS,CAAC,EAAE,QAAQ,SAAS,CAAC,EAAE;AAC3C,YAAM,KAAK,SAAS,CAAC,EAAE,QAAQ,SAAS,CAAC,EAAE;AAC3C,YAAM,WAAW,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAEjC,iBAAA,IAAI,GAAG,QAAQ;AAAA,IAC5B;AAEA,aAAS,2BAA2B;AAClC,UAAI,MAAM;AAAkC;AAC5C,UAAI,MAAM;AAA+B;IAC3C;AAEA,aAAS,8BAA8B;AACrC,UAAI,MAAM;AAAkC;AAC5C,UAAI,MAAM;AAAqC;IACjD;AAEA,aAAS,sBAAsB,OAAqB;AAC9C,UAAA,SAAS,UAAU,GAAG;AACxB,kBAAU,IAAI,MAAM,OAAO,MAAM,KAAK;AAAA,MAAA,OACjC;AACC,cAAA,WAAW,yBAAyB,KAAK;AAC/C,cAAM,IAAI,OAAO,MAAM,QAAQ,SAAS;AACxC,cAAM,IAAI,OAAO,MAAM,QAAQ,SAAS;AAC9B,kBAAA,IAAI,GAAG,CAAC;AAAA,MACpB;AAEA,kBAAY,WAAW,WAAW,WAAW,EAAE,eAAe,MAAM,WAAW;AAE/E,YAAM,UAAU,MAAM;AAEtB,UAAI,SAAS;AACX,mBAAY,IAAI,KAAK,KAAK,YAAY,IAAK,QAAQ,YAAY;AAC/D,iBAAU,IAAI,KAAK,KAAK,YAAY,IAAK,QAAQ,YAAY;AAAA,MAC/D;AACA,kBAAY,KAAK,SAAS;AAAA,IAC5B;AAEA,aAAS,mBAAmB,OAAqB;AAC3C,UAAA,SAAS,UAAU,GAAG;AACxB,eAAO,IAAI,MAAM,OAAO,MAAM,KAAK;AAAA,MAAA,OAC9B;AACC,cAAA,WAAW,yBAAyB,KAAK;AAC/C,cAAM,IAAI,OAAO,MAAM,QAAQ,SAAS;AACxC,cAAM,IAAI,OAAO,MAAM,QAAQ,SAAS;AACjC,eAAA,IAAI,GAAG,CAAC;AAAA,MACjB;AAEA,eAAS,WAAW,QAAQ,QAAQ,EAAE,eAAe,MAAM,QAAQ;AAC/D,UAAA,SAAS,GAAG,SAAS,CAAC;AAC1B,eAAS,KAAK,MAAM;AAAA,IACtB;AAEA,aAAS,qBAAqB,OAAqB;AAC3C,YAAA,WAAW,yBAAyB,KAAK;AACzC,YAAA,KAAK,MAAM,QAAQ,SAAS;AAC5B,YAAA,KAAK,MAAM,QAAQ,SAAS;AAClC,YAAM,WAAW,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAEnC,eAAA,IAAI,GAAG,QAAQ;AACb,iBAAA,IAAI,GAAG,KAAK,IAAI,SAAS,IAAI,WAAW,GAAG,MAAM,SAAS,CAAC;AACtE,eAAS,WAAW,CAAC;AACrB,iBAAW,KAAK,QAAQ;AAAA,IAC1B;AAEA,aAAS,wBAAwB,OAAqB;AACpD,UAAI,MAAM;AAAY,6BAAqB,KAAK;AAChD,UAAI,MAAM;AAAW,2BAAmB,KAAK;AAAA,IAC/C;AAEA,aAAS,2BAA2B,OAAqB;AACvD,UAAI,MAAM;AAAY,6BAAqB,KAAK;AAChD,UAAI,MAAM;AAAc,8BAAsB,KAAK;AAAA,IACrD;AAMA,aAAS,cAAc,OAAqB;;AAC1C,UAAI,MAAM,YAAY;AAAO;AAEzB,UAAA,SAAS,WAAW,GAAG;AACzB,oBAAM,eAAN,mBAAkB,cAAc,iBAAiB,eAAe;AAChE,oBAAM,eAAN,mBAAkB,cAAc,iBAAiB,aAAa;AAAA,MAChE;AAEA,iBAAW,KAAK;AAEZ,UAAA,MAAM,gBAAgB,SAAS;AACjC,qBAAa,KAAK;AAAA,MAAA,OACb;AACL,oBAAY,KAAK;AAAA,MACnB;AAAA,IACF;AAEA,aAAS,cAAc,OAAqB;AAC1C,UAAI,MAAM,YAAY;AAAO;AAEzB,UAAA,MAAM,gBAAgB,SAAS;AACjC,oBAAY,KAAK;AAAA,MAAA,OACZ;AACL,oBAAY,KAAK;AAAA,MACnB;AAAA,IACF;AAEA,aAAS,YAAY,OAAqB;;AACxC,oBAAc,KAAK;AAEf,UAAA,SAAS,WAAW,GAAG;AACnB,oBAAA,eAAA,mBAAY,sBAAsB,MAAM;AAE9C,oBAAM,eAAN,mBAAkB,cAAc,oBAAoB,eAAe;AACnE,oBAAM,eAAN,mBAAkB,cAAc,oBAAoB,aAAa;AAAA,MACnE;AAGA,YAAM,cAAc,QAAQ;AAE5B,cAAQ,MAAM;AAAA,IAChB;AAEA,aAAS,YAAY,OAAmB;AAClC,UAAA;AAEJ,cAAQ,MAAM,QAAQ;AAAA,QACpB,KAAK;AACH,wBAAc,MAAM,aAAa;AACjC;AAAA,QAEF,KAAK;AACH,wBAAc,MAAM,aAAa;AACjC;AAAA,QAEF,KAAK;AACH,wBAAc,MAAM,aAAa;AACjC;AAAA,QAEF;AACgB,wBAAA;AAAA,MAClB;AAEA,cAAQ,aAAa;AAAA,QACnB,KAAK,MAAM;AACT,cAAI,MAAM,eAAe;AAAO;AAChC,+BAAqB,KAAK;AAC1B,kBAAQ,MAAM;AACd;AAAA,QAEF,KAAK,MAAM;AACT,cAAI,MAAM,WAAW,MAAM,WAAW,MAAM,UAAU;AACpD,gBAAI,MAAM,cAAc;AAAO;AAC/B,+BAAmB,KAAK;AACxB,oBAAQ,MAAM;AAAA,UAAA,OACT;AACL,gBAAI,MAAM,iBAAiB;AAAO;AAClC,kCAAsB,KAAK;AAC3B,oBAAQ,MAAM;AAAA,UAChB;AACA;AAAA,QAEF,KAAK,MAAM;AACT,cAAI,MAAM,WAAW,MAAM,WAAW,MAAM,UAAU;AACpD,gBAAI,MAAM,iBAAiB;AAAO;AAClC,kCAAsB,KAAK;AAC3B,oBAAQ,MAAM;AAAA,UAAA,OACT;AACL,gBAAI,MAAM,cAAc;AAAO;AAC/B,+BAAmB,KAAK;AACxB,oBAAQ,MAAM;AAAA,UAChB;AACA;AAAA,QAEF;AACE,kBAAQ,MAAM;AAAA,MAClB;AAEI,UAAA,UAAU,MAAM,MAAM;AAExB,cAAM,cAAc,UAAU;AAAA,MAChC;AAAA,IACF;AAEA,aAAS,YAAY,OAAmB;AACtC,UAAI,MAAM,YAAY;AAAO;AAE7B,cAAQ,OAAO;AAAA,QACb,KAAK,MAAM;AACT,cAAI,MAAM,iBAAiB;AAAO;AAClC,gCAAsB,KAAK;AAC3B;AAAA,QAEF,KAAK,MAAM;AACT,cAAI,MAAM,eAAe;AAAO;AAChC,+BAAqB,KAAK;AAC1B;AAAA,QAEF,KAAK,MAAM;AACT,cAAI,MAAM,cAAc;AAAO;AAC/B,6BAAmB,KAAK;AACxB;AAAA,MACJ;AAAA,IACF;AAEA,aAAS,aAAa,OAAmB;AACnC,UAAA,MAAM,YAAY,SAAS,MAAM,eAAe,SAAU,UAAU,MAAM,QAAQ,UAAU,MAAM,QAAS;AAC7G;AAAA,MACF;AAEA,YAAM,eAAe;AAGrB,YAAM,cAAc,UAAU;AAE9B,uBAAiB,KAAK;AAGtB,YAAM,cAAc,QAAQ;AAAA,IAC9B;AAEA,aAAS,UAAU,OAAsB;AACvC,UAAI,MAAM,YAAY,SAAS,MAAM,cAAc;AAAO;AAC1D,oBAAc,KAAK;AAAA,IACrB;AAEA,aAAS,aAAa,OAAqB;AACzC,mBAAa,KAAK;AAElB,cAAQ,SAAS,QAAQ;AAAA,QACvB,KAAK;AACK,kBAAA,MAAM,QAAQ,KAAK;AAAA,YACzB,KAAK,MAAM;AACT,kBAAI,MAAM,iBAAiB;AAAO;AACX;AACvB,sBAAQ,MAAM;AACd;AAAA,YAEF,KAAK,MAAM;AACT,kBAAI,MAAM,cAAc;AAAO;AACX;AACpB,sBAAQ,MAAM;AACd;AAAA,YAEF;AACE,sBAAQ,MAAM;AAAA,UAClB;AAEA;AAAA,QAEF,KAAK;AACK,kBAAA,MAAM,QAAQ,KAAK;AAAA,YACzB,KAAK,MAAM;AACT,kBAAI,MAAM,eAAe,SAAS,MAAM,cAAc;AAAO;AACpC;AACzB,sBAAQ,MAAM;AACd;AAAA,YAEF,KAAK,MAAM;AACT,kBAAI,MAAM,eAAe,SAAS,MAAM,iBAAiB;AAAO;AACpC;AAC5B,sBAAQ,MAAM;AACd;AAAA,YAEF;AACE,sBAAQ,MAAM;AAAA,UAClB;AAEA;AAAA,QAEF;AACE,kBAAQ,MAAM;AAAA,MAClB;AAEI,UAAA,UAAU,MAAM,MAAM;AAExB,cAAM,cAAc,UAAU;AAAA,MAChC;AAAA,IACF;AAEA,aAAS,YAAY,OAAqB;AACxC,mBAAa,KAAK;AAElB,cAAQ,OAAO;AAAA,QACb,KAAK,MAAM;AACT,cAAI,MAAM,iBAAiB;AAAO;AAClC,gCAAsB,KAAK;AAC3B,gBAAM,OAAO;AACb;AAAA,QAEF,KAAK,MAAM;AACT,cAAI,MAAM,cAAc;AAAO;AAC/B,6BAAmB,KAAK;AACxB,gBAAM,OAAO;AACb;AAAA,QAEF,KAAK,MAAM;AACT,cAAI,MAAM,eAAe,SAAS,MAAM,cAAc;AAAO;AAC7D,kCAAwB,KAAK;AAC7B,gBAAM,OAAO;AACb;AAAA,QAEF,KAAK,MAAM;AACT,cAAI,MAAM,eAAe,SAAS,MAAM,iBAAiB;AAAO;AAChE,qCAA2B,KAAK;AAChC,gBAAM,OAAO;AACb;AAAA,QAEF;AACE,kBAAQ,MAAM;AAAA,MAClB;AAAA,IACF;AAEA,aAAS,cAAc,OAAc;AACnC,UAAI,MAAM,YAAY;AAAO;AAC7B,YAAM,eAAe;AAAA,IACvB;AAEA,aAAS,WAAW,OAAqB;AACvC,eAAS,KAAK,KAAK;AAAA,IACrB;AAEA,aAAS,cAAc,OAAqB;AACnC,aAAA,iBAAiB,MAAM,SAAS;AAEvC,eAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAI,SAAS,CAAC,EAAE,aAAa,MAAM,WAAW;AACnC,mBAAA,OAAO,GAAG,CAAC;AACpB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,aAAS,aAAa,OAAqB;AACrC,UAAA,WAAW,iBAAiB,MAAM,SAAS;AAE/C,UAAI,aAAa,QAAW;AAC1B,mBAAW,IAAI;AACE,yBAAA,MAAM,SAAS,IAAI;AAAA,MACtC;AAEA,eAAS,IAAI,MAAM,OAAO,MAAM,KAAK;AAAA,IACvC;AAEA,aAAS,yBAAyB,OAAqB;AAC/C,YAAA,UAAU,MAAM,cAAc,SAAS,CAAC,EAAE,YAAY,SAAS,CAAC,IAAI,SAAS,CAAC;AAC7E,aAAA,iBAAiB,QAAQ,SAAS;AAAA,IAC3C;AAIA,SAAK,UAAU,CAAC,aAAa,aAAA,MAAmB;AAC9C,cAAQ,UAAU;AAClB,YAAM,OAAO;AAAA,IAAA;AAGf,SAAK,WAAW,CAAC,aAAa,aAAA,MAAmB;AAC/C,eAAS,UAAU;AACnB,YAAM,OAAO;AAAA,IAAA;AAGf,SAAK,WAAW,MAAM;AACb,aAAA;AAAA,IAAA;AAGJ,SAAA,WAAW,CAAC,aAAa;AAC5B,eAAS,QAAQ;AACjB,YAAM,OAAO;AAAA,IAAA;AAGf,SAAK,eAAe,MAAM;AACxB,aAAO,aAAa;AAAA,IAAA;AAItB,QAAI,eAAe;AAAW,WAAK,QAAQ,UAAU;AAErD,SAAK,OAAO;AAAA,EACd;AACF;AAUA,MAAM,oBAAoB,cAAc;AAAA,EACtC,YAAY,QAAgD,YAA0B;AACpF,UAAM,QAAQ,UAAU;AAExB,SAAK,qBAAqB;AAErB,SAAA,aAAa,OAAO,MAAM;AAC1B,SAAA,aAAa,QAAQ,MAAM;AAE3B,SAAA,QAAQ,MAAM,MAAM;AACpB,SAAA,QAAQ,MAAM,MAAM;AAAA,EAC3B;AACF;"}
@@ -8,8 +8,8 @@ var __publicField = (obj, key, value) => {
8
8
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
9
9
  const THREE = require("three");
10
10
  const EventDispatcher = require("./EventDispatcher.cjs");
11
- const _euler = new THREE.Euler(0, 0, 0, "YXZ");
12
- const _vector = new THREE.Vector3();
11
+ const _euler = /* @__PURE__ */ new THREE.Euler(0, 0, 0, "YXZ");
12
+ const _vector = /* @__PURE__ */ new THREE.Vector3();
13
13
  const _changeEvent = { type: "change" };
14
14
  const _lockEvent = { type: "lock" };
15
15
  const _unlockEvent = { type: "unlock" };
@@ -1 +1 @@
1
- {"version":3,"file":"PointerLockControls.cjs","sources":["../../src/controls/PointerLockControls.ts"],"sourcesContent":["import { Euler, Camera, Vector3 } from 'three'\nimport { EventDispatcher } from './EventDispatcher'\n\nconst _euler = new Euler(0, 0, 0, 'YXZ')\nconst _vector = new Vector3()\nconst _changeEvent = { type: 'change' }\nconst _lockEvent = { type: 'lock' }\nconst _unlockEvent = { type: 'unlock' }\nconst _PI_2 = Math.PI / 2\n\nexport interface PointerLockControlsEventMap {\n /**\n * Fires when the user moves the mouse.\n */\n change: {};\n\n /**\n * Fires when the pointer lock status is \"locked\" (in other words: the mouse is captured).\n */\n lock: {};\n\n /**\n * Fires when the pointer lock status is \"unlocked\" (in other words: the mouse is not captured anymore).\n */\n unlock: {};\n}\n\nclass PointerLockControls extends EventDispatcher<PointerLockControlsEventMap> {\n public camera: Camera\n public domElement?: HTMLElement\n public isLocked: boolean\n public minPolarAngle: number\n public maxPolarAngle: number\n public pointerSpeed: number\n\n constructor(camera: Camera, domElement?: HTMLElement) {\n super()\n\n this.camera = camera\n this.domElement = domElement\n this.isLocked = false\n\n // Set to constrain the pitch of the camera\n // Range is 0 to Math.PI radians\n this.minPolarAngle = 0 // radians\n this.maxPolarAngle = Math.PI // radians\n\n this.pointerSpeed = 1.0\n if (domElement) this.connect(domElement)\n }\n\n private onMouseMove = (event: MouseEvent): void => {\n if (!this.domElement || this.isLocked === false) return\n _euler.setFromQuaternion(this.camera.quaternion)\n _euler.y -= event.movementX * 0.002 * this.pointerSpeed\n _euler.x -= event.movementY * 0.002 * this.pointerSpeed\n _euler.x = Math.max(_PI_2 - this.maxPolarAngle, Math.min(_PI_2 - this.minPolarAngle, _euler.x))\n this.camera.quaternion.setFromEuler(_euler)\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n\n private onPointerlockChange = (): void => {\n if (!this.domElement) return\n if (this.domElement.ownerDocument.pointerLockElement === this.domElement) {\n // @ts-ignore\n this.dispatchEvent(_lockEvent)\n this.isLocked = true\n } else {\n // @ts-ignore\n this.dispatchEvent(_unlockEvent)\n this.isLocked = false\n }\n }\n\n private onPointerlockError = (): void => {\n console.error('THREE.PointerLockControls: Unable to use Pointer Lock API')\n }\n\n public connect = (domElement: HTMLElement): void => {\n this.domElement = domElement || this.domElement\n if (!this.domElement) return\n this.domElement.ownerDocument.addEventListener('mousemove', this.onMouseMove)\n this.domElement.ownerDocument.addEventListener('pointerlockchange', this.onPointerlockChange)\n this.domElement.ownerDocument.addEventListener('pointerlockerror', this.onPointerlockError)\n }\n\n public disconnect = (): void => {\n if (!this.domElement) return\n this.domElement.ownerDocument.removeEventListener('mousemove', this.onMouseMove)\n this.domElement.ownerDocument.removeEventListener('pointerlockchange', this.onPointerlockChange)\n this.domElement.ownerDocument.removeEventListener('pointerlockerror', this.onPointerlockError)\n }\n\n public dispose = (): void => {\n this.disconnect()\n }\n\n public getObject = (): Camera => {\n // retaining this method for backward compatibility\n return this.camera\n }\n\n private direction = new Vector3(0, 0, -1)\n public getDirection = (v: Vector3): Vector3 => {\n return v.copy(this.direction).applyQuaternion(this.camera.quaternion)\n }\n\n public moveForward = (distance: number): void => {\n // move forward parallel to the xz-plane\n // assumes camera.up is y-up\n _vector.setFromMatrixColumn(this.camera.matrix, 0)\n _vector.crossVectors(this.camera.up, _vector)\n this.camera.position.addScaledVector(_vector, distance)\n }\n\n public moveRight = (distance: number): void => {\n _vector.setFromMatrixColumn(this.camera.matrix, 0)\n this.camera.position.addScaledVector(_vector, distance)\n }\n\n public lock = (): void => {\n if (this.domElement) this.domElement.requestPointerLock()\n }\n\n public unlock = (): void => {\n if (this.domElement) this.domElement.ownerDocument.exitPointerLock()\n }\n}\n\nexport { PointerLockControls }\n"],"names":["Euler","Vector3","EventDispatcher"],"mappings":"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"}
1
+ {"version":3,"file":"PointerLockControls.cjs","sources":["../../src/controls/PointerLockControls.ts"],"sourcesContent":["import { Euler, Camera, Vector3 } from 'three'\nimport { EventDispatcher } from './EventDispatcher'\n\nconst _euler = /* @__PURE__ */ new Euler(0, 0, 0, 'YXZ')\nconst _vector = /* @__PURE__ */ new Vector3()\nconst _changeEvent = { type: 'change' }\nconst _lockEvent = { type: 'lock' }\nconst _unlockEvent = { type: 'unlock' }\nconst _PI_2 = Math.PI / 2\n\nexport interface PointerLockControlsEventMap {\n /**\n * Fires when the user moves the mouse.\n */\n change: {}\n\n /**\n * Fires when the pointer lock status is \"locked\" (in other words: the mouse is captured).\n */\n lock: {}\n\n /**\n * Fires when the pointer lock status is \"unlocked\" (in other words: the mouse is not captured anymore).\n */\n unlock: {}\n}\n\nclass PointerLockControls extends EventDispatcher<PointerLockControlsEventMap> {\n public camera: Camera\n public domElement?: HTMLElement\n public isLocked: boolean\n public minPolarAngle: number\n public maxPolarAngle: number\n public pointerSpeed: number\n\n constructor(camera: Camera, domElement?: HTMLElement) {\n super()\n\n this.camera = camera\n this.domElement = domElement\n this.isLocked = false\n\n // Set to constrain the pitch of the camera\n // Range is 0 to Math.PI radians\n this.minPolarAngle = 0 // radians\n this.maxPolarAngle = Math.PI // radians\n\n this.pointerSpeed = 1.0\n if (domElement) this.connect(domElement)\n }\n\n private onMouseMove = (event: MouseEvent): void => {\n if (!this.domElement || this.isLocked === false) return\n _euler.setFromQuaternion(this.camera.quaternion)\n _euler.y -= event.movementX * 0.002 * this.pointerSpeed\n _euler.x -= event.movementY * 0.002 * this.pointerSpeed\n _euler.x = Math.max(_PI_2 - this.maxPolarAngle, Math.min(_PI_2 - this.minPolarAngle, _euler.x))\n this.camera.quaternion.setFromEuler(_euler)\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n\n private onPointerlockChange = (): void => {\n if (!this.domElement) return\n if (this.domElement.ownerDocument.pointerLockElement === this.domElement) {\n // @ts-ignore\n this.dispatchEvent(_lockEvent)\n this.isLocked = true\n } else {\n // @ts-ignore\n this.dispatchEvent(_unlockEvent)\n this.isLocked = false\n }\n }\n\n private onPointerlockError = (): void => {\n console.error('THREE.PointerLockControls: Unable to use Pointer Lock API')\n }\n\n public connect = (domElement: HTMLElement): void => {\n this.domElement = domElement || this.domElement\n if (!this.domElement) return\n this.domElement.ownerDocument.addEventListener('mousemove', this.onMouseMove)\n this.domElement.ownerDocument.addEventListener('pointerlockchange', this.onPointerlockChange)\n this.domElement.ownerDocument.addEventListener('pointerlockerror', this.onPointerlockError)\n }\n\n public disconnect = (): void => {\n if (!this.domElement) return\n this.domElement.ownerDocument.removeEventListener('mousemove', this.onMouseMove)\n this.domElement.ownerDocument.removeEventListener('pointerlockchange', this.onPointerlockChange)\n this.domElement.ownerDocument.removeEventListener('pointerlockerror', this.onPointerlockError)\n }\n\n public dispose = (): void => {\n this.disconnect()\n }\n\n public getObject = (): Camera => {\n // retaining this method for backward compatibility\n return this.camera\n }\n\n private direction = new Vector3(0, 0, -1)\n public getDirection = (v: Vector3): Vector3 => {\n return v.copy(this.direction).applyQuaternion(this.camera.quaternion)\n }\n\n public moveForward = (distance: number): void => {\n // move forward parallel to the xz-plane\n // assumes camera.up is y-up\n _vector.setFromMatrixColumn(this.camera.matrix, 0)\n _vector.crossVectors(this.camera.up, _vector)\n this.camera.position.addScaledVector(_vector, distance)\n }\n\n public moveRight = (distance: number): void => {\n _vector.setFromMatrixColumn(this.camera.matrix, 0)\n this.camera.position.addScaledVector(_vector, distance)\n }\n\n public lock = (): void => {\n if (this.domElement) this.domElement.requestPointerLock()\n }\n\n public unlock = (): void => {\n if (this.domElement) this.domElement.ownerDocument.exitPointerLock()\n }\n}\n\nexport { PointerLockControls }\n"],"names":["Euler","Vector3","EventDispatcher"],"mappings":"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"}
@@ -4,10 +4,10 @@ var __publicField = (obj, key, value) => {
4
4
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
5
  return value;
6
6
  };
7
- import { Euler, Vector3 } from "three";
7
+ import { Vector3, Euler } from "three";
8
8
  import { EventDispatcher } from "./EventDispatcher.js";
9
- const _euler = new Euler(0, 0, 0, "YXZ");
10
- const _vector = new Vector3();
9
+ const _euler = /* @__PURE__ */ new Euler(0, 0, 0, "YXZ");
10
+ const _vector = /* @__PURE__ */ new Vector3();
11
11
  const _changeEvent = { type: "change" };
12
12
  const _lockEvent = { type: "lock" };
13
13
  const _unlockEvent = { type: "unlock" };
@@ -1 +1 @@
1
- {"version":3,"file":"PointerLockControls.js","sources":["../../src/controls/PointerLockControls.ts"],"sourcesContent":["import { Euler, Camera, Vector3 } from 'three'\nimport { EventDispatcher } from './EventDispatcher'\n\nconst _euler = new Euler(0, 0, 0, 'YXZ')\nconst _vector = new Vector3()\nconst _changeEvent = { type: 'change' }\nconst _lockEvent = { type: 'lock' }\nconst _unlockEvent = { type: 'unlock' }\nconst _PI_2 = Math.PI / 2\n\nexport interface PointerLockControlsEventMap {\n /**\n * Fires when the user moves the mouse.\n */\n change: {};\n\n /**\n * Fires when the pointer lock status is \"locked\" (in other words: the mouse is captured).\n */\n lock: {};\n\n /**\n * Fires when the pointer lock status is \"unlocked\" (in other words: the mouse is not captured anymore).\n */\n unlock: {};\n}\n\nclass PointerLockControls extends EventDispatcher<PointerLockControlsEventMap> {\n public camera: Camera\n public domElement?: HTMLElement\n public isLocked: boolean\n public minPolarAngle: number\n public maxPolarAngle: number\n public pointerSpeed: number\n\n constructor(camera: Camera, domElement?: HTMLElement) {\n super()\n\n this.camera = camera\n this.domElement = domElement\n this.isLocked = false\n\n // Set to constrain the pitch of the camera\n // Range is 0 to Math.PI radians\n this.minPolarAngle = 0 // radians\n this.maxPolarAngle = Math.PI // radians\n\n this.pointerSpeed = 1.0\n if (domElement) this.connect(domElement)\n }\n\n private onMouseMove = (event: MouseEvent): void => {\n if (!this.domElement || this.isLocked === false) return\n _euler.setFromQuaternion(this.camera.quaternion)\n _euler.y -= event.movementX * 0.002 * this.pointerSpeed\n _euler.x -= event.movementY * 0.002 * this.pointerSpeed\n _euler.x = Math.max(_PI_2 - this.maxPolarAngle, Math.min(_PI_2 - this.minPolarAngle, _euler.x))\n this.camera.quaternion.setFromEuler(_euler)\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n\n private onPointerlockChange = (): void => {\n if (!this.domElement) return\n if (this.domElement.ownerDocument.pointerLockElement === this.domElement) {\n // @ts-ignore\n this.dispatchEvent(_lockEvent)\n this.isLocked = true\n } else {\n // @ts-ignore\n this.dispatchEvent(_unlockEvent)\n this.isLocked = false\n }\n }\n\n private onPointerlockError = (): void => {\n console.error('THREE.PointerLockControls: Unable to use Pointer Lock API')\n }\n\n public connect = (domElement: HTMLElement): void => {\n this.domElement = domElement || this.domElement\n if (!this.domElement) return\n this.domElement.ownerDocument.addEventListener('mousemove', this.onMouseMove)\n this.domElement.ownerDocument.addEventListener('pointerlockchange', this.onPointerlockChange)\n this.domElement.ownerDocument.addEventListener('pointerlockerror', this.onPointerlockError)\n }\n\n public disconnect = (): void => {\n if (!this.domElement) return\n this.domElement.ownerDocument.removeEventListener('mousemove', this.onMouseMove)\n this.domElement.ownerDocument.removeEventListener('pointerlockchange', this.onPointerlockChange)\n this.domElement.ownerDocument.removeEventListener('pointerlockerror', this.onPointerlockError)\n }\n\n public dispose = (): void => {\n this.disconnect()\n }\n\n public getObject = (): Camera => {\n // retaining this method for backward compatibility\n return this.camera\n }\n\n private direction = new Vector3(0, 0, -1)\n public getDirection = (v: Vector3): Vector3 => {\n return v.copy(this.direction).applyQuaternion(this.camera.quaternion)\n }\n\n public moveForward = (distance: number): void => {\n // move forward parallel to the xz-plane\n // assumes camera.up is y-up\n _vector.setFromMatrixColumn(this.camera.matrix, 0)\n _vector.crossVectors(this.camera.up, _vector)\n this.camera.position.addScaledVector(_vector, distance)\n }\n\n public moveRight = (distance: number): void => {\n _vector.setFromMatrixColumn(this.camera.matrix, 0)\n this.camera.position.addScaledVector(_vector, distance)\n }\n\n public lock = (): void => {\n if (this.domElement) this.domElement.requestPointerLock()\n }\n\n public unlock = (): void => {\n if (this.domElement) this.domElement.ownerDocument.exitPointerLock()\n }\n}\n\nexport { PointerLockControls }\n"],"names":[],"mappings":";;;;;;;;AAGA,MAAM,SAAS,IAAI,MAAM,GAAG,GAAG,GAAG,KAAK;AACvC,MAAM,UAAU,IAAI;AACpB,MAAM,eAAe,EAAE,MAAM;AAC7B,MAAM,aAAa,EAAE,MAAM;AAC3B,MAAM,eAAe,EAAE,MAAM;AAC7B,MAAM,QAAQ,KAAK,KAAK;AAmBxB,MAAM,4BAA4B,gBAA6C;AAAA,EAQ7E,YAAY,QAAgB,YAA0B;AAC9C;AARD;AACA;AACA;AACA;AACA;AACA;AAkBC,uCAAc,CAAC,UAA4B;AACjD,UAAI,CAAC,KAAK,cAAc,KAAK,aAAa;AAAO;AAC1C,aAAA,kBAAkB,KAAK,OAAO,UAAU;AAC/C,aAAO,KAAK,MAAM,YAAY,OAAQ,KAAK;AAC3C,aAAO,KAAK,MAAM,YAAY,OAAQ,KAAK;AAC3C,aAAO,IAAI,KAAK,IAAI,QAAQ,KAAK,eAAe,KAAK,IAAI,QAAQ,KAAK,eAAe,OAAO,CAAC,CAAC;AACzF,WAAA,OAAO,WAAW,aAAa,MAAM;AAE1C,WAAK,cAAc,YAAY;AAAA,IAAA;AAGzB,+CAAsB,MAAY;AACxC,UAAI,CAAC,KAAK;AAAY;AACtB,UAAI,KAAK,WAAW,cAAc,uBAAuB,KAAK,YAAY;AAExE,aAAK,cAAc,UAAU;AAC7B,aAAK,WAAW;AAAA,MAAA,OACX;AAEL,aAAK,cAAc,YAAY;AAC/B,aAAK,WAAW;AAAA,MAClB;AAAA,IAAA;AAGM,8CAAqB,MAAY;AACvC,cAAQ,MAAM,2DAA2D;AAAA,IAAA;AAGpE,mCAAU,CAAC,eAAkC;AAC7C,WAAA,aAAa,cAAc,KAAK;AACrC,UAAI,CAAC,KAAK;AAAY;AACtB,WAAK,WAAW,cAAc,iBAAiB,aAAa,KAAK,WAAW;AAC5E,WAAK,WAAW,cAAc,iBAAiB,qBAAqB,KAAK,mBAAmB;AAC5F,WAAK,WAAW,cAAc,iBAAiB,oBAAoB,KAAK,kBAAkB;AAAA,IAAA;AAGrF,sCAAa,MAAY;AAC9B,UAAI,CAAC,KAAK;AAAY;AACtB,WAAK,WAAW,cAAc,oBAAoB,aAAa,KAAK,WAAW;AAC/E,WAAK,WAAW,cAAc,oBAAoB,qBAAqB,KAAK,mBAAmB;AAC/F,WAAK,WAAW,cAAc,oBAAoB,oBAAoB,KAAK,kBAAkB;AAAA,IAAA;AAGxF,mCAAU,MAAY;AAC3B,WAAK,WAAW;AAAA,IAAA;AAGX,qCAAY,MAAc;AAE/B,aAAO,KAAK;AAAA,IAAA;AAGN,qCAAY,IAAI,QAAQ,GAAG,GAAG,EAAE;AACjC,wCAAe,CAAC,MAAwB;AACtC,aAAA,EAAE,KAAK,KAAK,SAAS,EAAE,gBAAgB,KAAK,OAAO,UAAU;AAAA,IAAA;AAG/D,uCAAc,CAAC,aAA2B;AAG/C,cAAQ,oBAAoB,KAAK,OAAO,QAAQ,CAAC;AACjD,cAAQ,aAAa,KAAK,OAAO,IAAI,OAAO;AAC5C,WAAK,OAAO,SAAS,gBAAgB,SAAS,QAAQ;AAAA,IAAA;AAGjD,qCAAY,CAAC,aAA2B;AAC7C,cAAQ,oBAAoB,KAAK,OAAO,QAAQ,CAAC;AACjD,WAAK,OAAO,SAAS,gBAAgB,SAAS,QAAQ;AAAA,IAAA;AAGjD,gCAAO,MAAY;AACxB,UAAI,KAAK;AAAY,aAAK,WAAW;IAAmB;AAGnD,kCAAS,MAAY;AAC1B,UAAI,KAAK;AAAiB,aAAA,WAAW,cAAc;IAAgB;AAxFnE,SAAK,SAAS;AACd,SAAK,aAAa;AAClB,SAAK,WAAW;AAIhB,SAAK,gBAAgB;AACrB,SAAK,gBAAgB,KAAK;AAE1B,SAAK,eAAe;AAChB,QAAA;AAAY,WAAK,QAAQ,UAAU;AAAA,EACzC;AA+EF;"}
1
+ {"version":3,"file":"PointerLockControls.js","sources":["../../src/controls/PointerLockControls.ts"],"sourcesContent":["import { Euler, Camera, Vector3 } from 'three'\nimport { EventDispatcher } from './EventDispatcher'\n\nconst _euler = /* @__PURE__ */ new Euler(0, 0, 0, 'YXZ')\nconst _vector = /* @__PURE__ */ new Vector3()\nconst _changeEvent = { type: 'change' }\nconst _lockEvent = { type: 'lock' }\nconst _unlockEvent = { type: 'unlock' }\nconst _PI_2 = Math.PI / 2\n\nexport interface PointerLockControlsEventMap {\n /**\n * Fires when the user moves the mouse.\n */\n change: {}\n\n /**\n * Fires when the pointer lock status is \"locked\" (in other words: the mouse is captured).\n */\n lock: {}\n\n /**\n * Fires when the pointer lock status is \"unlocked\" (in other words: the mouse is not captured anymore).\n */\n unlock: {}\n}\n\nclass PointerLockControls extends EventDispatcher<PointerLockControlsEventMap> {\n public camera: Camera\n public domElement?: HTMLElement\n public isLocked: boolean\n public minPolarAngle: number\n public maxPolarAngle: number\n public pointerSpeed: number\n\n constructor(camera: Camera, domElement?: HTMLElement) {\n super()\n\n this.camera = camera\n this.domElement = domElement\n this.isLocked = false\n\n // Set to constrain the pitch of the camera\n // Range is 0 to Math.PI radians\n this.minPolarAngle = 0 // radians\n this.maxPolarAngle = Math.PI // radians\n\n this.pointerSpeed = 1.0\n if (domElement) this.connect(domElement)\n }\n\n private onMouseMove = (event: MouseEvent): void => {\n if (!this.domElement || this.isLocked === false) return\n _euler.setFromQuaternion(this.camera.quaternion)\n _euler.y -= event.movementX * 0.002 * this.pointerSpeed\n _euler.x -= event.movementY * 0.002 * this.pointerSpeed\n _euler.x = Math.max(_PI_2 - this.maxPolarAngle, Math.min(_PI_2 - this.minPolarAngle, _euler.x))\n this.camera.quaternion.setFromEuler(_euler)\n // @ts-ignore\n this.dispatchEvent(_changeEvent)\n }\n\n private onPointerlockChange = (): void => {\n if (!this.domElement) return\n if (this.domElement.ownerDocument.pointerLockElement === this.domElement) {\n // @ts-ignore\n this.dispatchEvent(_lockEvent)\n this.isLocked = true\n } else {\n // @ts-ignore\n this.dispatchEvent(_unlockEvent)\n this.isLocked = false\n }\n }\n\n private onPointerlockError = (): void => {\n console.error('THREE.PointerLockControls: Unable to use Pointer Lock API')\n }\n\n public connect = (domElement: HTMLElement): void => {\n this.domElement = domElement || this.domElement\n if (!this.domElement) return\n this.domElement.ownerDocument.addEventListener('mousemove', this.onMouseMove)\n this.domElement.ownerDocument.addEventListener('pointerlockchange', this.onPointerlockChange)\n this.domElement.ownerDocument.addEventListener('pointerlockerror', this.onPointerlockError)\n }\n\n public disconnect = (): void => {\n if (!this.domElement) return\n this.domElement.ownerDocument.removeEventListener('mousemove', this.onMouseMove)\n this.domElement.ownerDocument.removeEventListener('pointerlockchange', this.onPointerlockChange)\n this.domElement.ownerDocument.removeEventListener('pointerlockerror', this.onPointerlockError)\n }\n\n public dispose = (): void => {\n this.disconnect()\n }\n\n public getObject = (): Camera => {\n // retaining this method for backward compatibility\n return this.camera\n }\n\n private direction = new Vector3(0, 0, -1)\n public getDirection = (v: Vector3): Vector3 => {\n return v.copy(this.direction).applyQuaternion(this.camera.quaternion)\n }\n\n public moveForward = (distance: number): void => {\n // move forward parallel to the xz-plane\n // assumes camera.up is y-up\n _vector.setFromMatrixColumn(this.camera.matrix, 0)\n _vector.crossVectors(this.camera.up, _vector)\n this.camera.position.addScaledVector(_vector, distance)\n }\n\n public moveRight = (distance: number): void => {\n _vector.setFromMatrixColumn(this.camera.matrix, 0)\n this.camera.position.addScaledVector(_vector, distance)\n }\n\n public lock = (): void => {\n if (this.domElement) this.domElement.requestPointerLock()\n }\n\n public unlock = (): void => {\n if (this.domElement) this.domElement.ownerDocument.exitPointerLock()\n }\n}\n\nexport { PointerLockControls }\n"],"names":[],"mappings":";;;;;;;;AAGA,MAAM,SAA6B,oBAAA,MAAM,GAAG,GAAG,GAAG,KAAK;AACvD,MAAM,8BAA8B;AACpC,MAAM,eAAe,EAAE,MAAM;AAC7B,MAAM,aAAa,EAAE,MAAM;AAC3B,MAAM,eAAe,EAAE,MAAM;AAC7B,MAAM,QAAQ,KAAK,KAAK;AAmBxB,MAAM,4BAA4B,gBAA6C;AAAA,EAQ7E,YAAY,QAAgB,YAA0B;AAC9C;AARD;AACA;AACA;AACA;AACA;AACA;AAkBC,uCAAc,CAAC,UAA4B;AACjD,UAAI,CAAC,KAAK,cAAc,KAAK,aAAa;AAAO;AAC1C,aAAA,kBAAkB,KAAK,OAAO,UAAU;AAC/C,aAAO,KAAK,MAAM,YAAY,OAAQ,KAAK;AAC3C,aAAO,KAAK,MAAM,YAAY,OAAQ,KAAK;AAC3C,aAAO,IAAI,KAAK,IAAI,QAAQ,KAAK,eAAe,KAAK,IAAI,QAAQ,KAAK,eAAe,OAAO,CAAC,CAAC;AACzF,WAAA,OAAO,WAAW,aAAa,MAAM;AAE1C,WAAK,cAAc,YAAY;AAAA,IAAA;AAGzB,+CAAsB,MAAY;AACxC,UAAI,CAAC,KAAK;AAAY;AACtB,UAAI,KAAK,WAAW,cAAc,uBAAuB,KAAK,YAAY;AAExE,aAAK,cAAc,UAAU;AAC7B,aAAK,WAAW;AAAA,MAAA,OACX;AAEL,aAAK,cAAc,YAAY;AAC/B,aAAK,WAAW;AAAA,MAClB;AAAA,IAAA;AAGM,8CAAqB,MAAY;AACvC,cAAQ,MAAM,2DAA2D;AAAA,IAAA;AAGpE,mCAAU,CAAC,eAAkC;AAC7C,WAAA,aAAa,cAAc,KAAK;AACrC,UAAI,CAAC,KAAK;AAAY;AACtB,WAAK,WAAW,cAAc,iBAAiB,aAAa,KAAK,WAAW;AAC5E,WAAK,WAAW,cAAc,iBAAiB,qBAAqB,KAAK,mBAAmB;AAC5F,WAAK,WAAW,cAAc,iBAAiB,oBAAoB,KAAK,kBAAkB;AAAA,IAAA;AAGrF,sCAAa,MAAY;AAC9B,UAAI,CAAC,KAAK;AAAY;AACtB,WAAK,WAAW,cAAc,oBAAoB,aAAa,KAAK,WAAW;AAC/E,WAAK,WAAW,cAAc,oBAAoB,qBAAqB,KAAK,mBAAmB;AAC/F,WAAK,WAAW,cAAc,oBAAoB,oBAAoB,KAAK,kBAAkB;AAAA,IAAA;AAGxF,mCAAU,MAAY;AAC3B,WAAK,WAAW;AAAA,IAAA;AAGX,qCAAY,MAAc;AAE/B,aAAO,KAAK;AAAA,IAAA;AAGN,qCAAY,IAAI,QAAQ,GAAG,GAAG,EAAE;AACjC,wCAAe,CAAC,MAAwB;AACtC,aAAA,EAAE,KAAK,KAAK,SAAS,EAAE,gBAAgB,KAAK,OAAO,UAAU;AAAA,IAAA;AAG/D,uCAAc,CAAC,aAA2B;AAG/C,cAAQ,oBAAoB,KAAK,OAAO,QAAQ,CAAC;AACjD,cAAQ,aAAa,KAAK,OAAO,IAAI,OAAO;AAC5C,WAAK,OAAO,SAAS,gBAAgB,SAAS,QAAQ;AAAA,IAAA;AAGjD,qCAAY,CAAC,aAA2B;AAC7C,cAAQ,oBAAoB,KAAK,OAAO,QAAQ,CAAC;AACjD,WAAK,OAAO,SAAS,gBAAgB,SAAS,QAAQ;AAAA,IAAA;AAGjD,gCAAO,MAAY;AACxB,UAAI,KAAK;AAAY,aAAK,WAAW;IAAmB;AAGnD,kCAAS,MAAY;AAC1B,UAAI,KAAK;AAAiB,aAAA,WAAW,cAAc;IAAgB;AAxFnE,SAAK,SAAS;AACd,SAAK,aAAa;AAClB,SAAK,WAAW;AAIhB,SAAK,gBAAgB;AACrB,SAAK,gBAAgB,KAAK;AAE1B,SAAK,eAAe;AAChB,QAAA;AAAY,WAAK,QAAQ,UAAU;AAAA,EACzC;AA+EF;"}
package/csm/CSM.cjs CHANGED
@@ -3,10 +3,10 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const THREE = require("three");
4
4
  const CSMFrustum = require("./CSMFrustum.cjs");
5
5
  const CSMShader = require("./CSMShader.cjs");
6
- const _cameraToLightMatrix = new THREE.Matrix4();
7
- const _lightSpaceFrustum = new CSMFrustum.CSMFrustum();
8
- const _center = new THREE.Vector3();
9
- const _bbox = new THREE.Box3();
6
+ const _cameraToLightMatrix = /* @__PURE__ */ new THREE.Matrix4();
7
+ const _lightSpaceFrustum = /* @__PURE__ */ new CSMFrustum.CSMFrustum();
8
+ const _center = /* @__PURE__ */ new THREE.Vector3();
9
+ const _bbox = /* @__PURE__ */ new THREE.Box3();
10
10
  const _uniformArray = [];
11
11
  const _logArray = [];
12
12
  class CSM {
package/csm/CSM.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"CSM.cjs","sources":["../../src/csm/CSM.js"],"sourcesContent":["import { Vector2, Vector3, DirectionalLight, MathUtils, ShaderChunk, Matrix4, Box3 } from 'three'\nimport { CSMFrustum } from './CSMFrustum'\nimport { CSMShader } from './CSMShader'\n\nconst _cameraToLightMatrix = new Matrix4()\nconst _lightSpaceFrustum = new CSMFrustum()\nconst _center = new Vector3()\nconst _bbox = new Box3()\nconst _uniformArray = []\nconst _logArray = []\n\nexport class CSM {\n constructor(data) {\n data = data || {}\n\n this.camera = data.camera\n this.parent = data.parent\n this.cascades = data.cascades || 3\n this.maxFar = data.maxFar || 100000\n this.mode = data.mode || 'practical'\n this.shadowMapSize = data.shadowMapSize || 2048\n this.shadowBias = data.shadowBias || 0.000001\n this.lightDirection = data.lightDirection || new Vector3(1, -1, 1).normalize()\n this.lightIntensity = data.lightIntensity || 1\n this.lightNear = data.lightNear || 1\n this.lightFar = data.lightFar || 2000\n this.lightMargin = data.lightMargin || 200\n this.customSplitsCallback = data.customSplitsCallback\n this.fade = false\n this.mainFrustum = new CSMFrustum()\n this.frustums = []\n this.breaks = []\n\n this.lights = []\n this.shaders = new Map()\n\n this.createLights()\n this.updateFrustums()\n this.injectInclude()\n }\n\n createLights() {\n for (let i = 0; i < this.cascades; i++) {\n const light = new DirectionalLight(0xffffff, this.lightIntensity)\n light.castShadow = true\n light.shadow.mapSize.width = this.shadowMapSize\n light.shadow.mapSize.height = this.shadowMapSize\n\n light.shadow.camera.near = this.lightNear\n light.shadow.camera.far = this.lightFar\n light.shadow.bias = this.shadowBias\n\n this.parent.add(light)\n this.parent.add(light.target)\n this.lights.push(light)\n }\n }\n\n initCascades() {\n const camera = this.camera\n camera.updateProjectionMatrix()\n this.mainFrustum.setFromProjectionMatrix(camera.projectionMatrix, this.maxFar)\n this.mainFrustum.split(this.breaks, this.frustums)\n }\n\n updateShadowBounds() {\n const frustums = this.frustums\n for (let i = 0; i < frustums.length; i++) {\n const light = this.lights[i]\n const shadowCam = light.shadow.camera\n const frustum = this.frustums[i]\n\n // Get the two points that represent that furthest points on the frustum assuming\n // that's either the diagonal across the far plane or the diagonal across the whole\n // frustum itself.\n const nearVerts = frustum.vertices.near\n const farVerts = frustum.vertices.far\n const point1 = farVerts[0]\n let point2\n if (point1.distanceTo(farVerts[2]) > point1.distanceTo(nearVerts[2])) {\n point2 = farVerts[2]\n } else {\n point2 = nearVerts[2]\n }\n\n let squaredBBWidth = point1.distanceTo(point2)\n if (this.fade) {\n // expand the shadow extents by the fade margin if fade is enabled.\n const camera = this.camera\n const far = Math.max(camera.far, this.maxFar)\n const linearDepth = frustum.vertices.far[0].z / (far - camera.near)\n const margin = 0.25 * Math.pow(linearDepth, 2.0) * (far - camera.near)\n\n squaredBBWidth += margin\n }\n\n shadowCam.left = -squaredBBWidth / 2\n shadowCam.right = squaredBBWidth / 2\n shadowCam.top = squaredBBWidth / 2\n shadowCam.bottom = -squaredBBWidth / 2\n shadowCam.updateProjectionMatrix()\n }\n }\n\n getBreaks() {\n const camera = this.camera\n const far = Math.min(camera.far, this.maxFar)\n this.breaks.length = 0\n\n switch (this.mode) {\n case 'uniform':\n uniformSplit(this.cascades, camera.near, far, this.breaks)\n break\n case 'logarithmic':\n logarithmicSplit(this.cascades, camera.near, far, this.breaks)\n break\n case 'practical':\n practicalSplit(this.cascades, camera.near, far, 0.5, this.breaks)\n break\n case 'custom':\n if (this.customSplitsCallback === undefined) console.error('CSM: Custom split scheme callback not defined.')\n this.customSplitsCallback(this.cascades, camera.near, far, this.breaks)\n break\n }\n\n function uniformSplit(amount, near, far, target) {\n for (let i = 1; i < amount; i++) {\n target.push((near + ((far - near) * i) / amount) / far)\n }\n\n target.push(1)\n }\n\n function logarithmicSplit(amount, near, far, target) {\n for (let i = 1; i < amount; i++) {\n target.push((near * (far / near) ** (i / amount)) / far)\n }\n\n target.push(1)\n }\n\n function practicalSplit(amount, near, far, lambda, target) {\n _uniformArray.length = 0\n _logArray.length = 0\n logarithmicSplit(amount, near, far, _logArray)\n uniformSplit(amount, near, far, _uniformArray)\n\n for (let i = 1; i < amount; i++) {\n target.push(MathUtils.lerp(_uniformArray[i - 1], _logArray[i - 1], lambda))\n }\n\n target.push(1)\n }\n }\n\n update() {\n const camera = this.camera\n const frustums = this.frustums\n for (let i = 0; i < frustums.length; i++) {\n const light = this.lights[i]\n const shadowCam = light.shadow.camera\n const texelWidth = (shadowCam.right - shadowCam.left) / this.shadowMapSize\n const texelHeight = (shadowCam.top - shadowCam.bottom) / this.shadowMapSize\n light.shadow.camera.updateMatrixWorld(true)\n _cameraToLightMatrix.multiplyMatrices(light.shadow.camera.matrixWorldInverse, camera.matrixWorld)\n frustums[i].toSpace(_cameraToLightMatrix, _lightSpaceFrustum)\n\n const nearVerts = _lightSpaceFrustum.vertices.near\n const farVerts = _lightSpaceFrustum.vertices.far\n _bbox.makeEmpty()\n for (let j = 0; j < 4; j++) {\n _bbox.expandByPoint(nearVerts[j])\n _bbox.expandByPoint(farVerts[j])\n }\n\n _bbox.getCenter(_center)\n _center.z = _bbox.max.z + this.lightMargin\n _center.x = Math.floor(_center.x / texelWidth) * texelWidth\n _center.y = Math.floor(_center.y / texelHeight) * texelHeight\n _center.applyMatrix4(light.shadow.camera.matrixWorld)\n\n light.position.copy(_center)\n light.target.position.copy(_center)\n\n light.target.position.x += this.lightDirection.x\n light.target.position.y += this.lightDirection.y\n light.target.position.z += this.lightDirection.z\n }\n }\n\n injectInclude() {\n ShaderChunk.lights_fragment_begin = CSMShader.lights_fragment_begin\n ShaderChunk.lights_pars_begin = CSMShader.lights_pars_begin\n }\n\n setupMaterial(material) {\n material.defines = material.defines || {}\n material.defines.USE_CSM = 1\n material.defines.CSM_CASCADES = this.cascades\n\n if (this.fade) {\n material.defines.CSM_FADE = ''\n }\n\n const breaksVec2 = []\n const scope = this\n const shaders = this.shaders\n\n material.onBeforeCompile = function (shader) {\n const far = Math.min(scope.camera.far, scope.maxFar)\n scope.getExtendedBreaks(breaksVec2)\n\n shader.uniforms.CSM_cascades = { value: breaksVec2 }\n shader.uniforms.cameraNear = { value: scope.camera.near }\n shader.uniforms.shadowFar = { value: far }\n\n shaders.set(material, shader)\n }\n\n shaders.set(material, null)\n }\n\n updateUniforms() {\n const far = Math.min(this.camera.far, this.maxFar)\n const shaders = this.shaders\n\n shaders.forEach(function (shader, material) {\n if (shader !== null) {\n const uniforms = shader.uniforms\n this.getExtendedBreaks(uniforms.CSM_cascades.value)\n uniforms.cameraNear.value = this.camera.near\n uniforms.shadowFar.value = far\n }\n\n if (!this.fade && 'CSM_FADE' in material.defines) {\n delete material.defines.CSM_FADE\n material.needsUpdate = true\n } else if (this.fade && !('CSM_FADE' in material.defines)) {\n material.defines.CSM_FADE = ''\n material.needsUpdate = true\n }\n }, this)\n }\n\n getExtendedBreaks(target) {\n while (target.length < this.breaks.length) {\n target.push(new Vector2())\n }\n\n target.length = this.breaks.length\n\n for (let i = 0; i < this.cascades; i++) {\n const amount = this.breaks[i]\n const prev = this.breaks[i - 1] || 0\n target[i].x = prev\n target[i].y = amount\n }\n }\n\n updateFrustums() {\n this.getBreaks()\n this.initCascades()\n this.updateShadowBounds()\n this.updateUniforms()\n }\n\n remove() {\n for (let i = 0; i < this.lights.length; i++) {\n this.parent.remove(this.lights[i])\n }\n }\n\n dispose() {\n const shaders = this.shaders\n shaders.forEach(function (shader, material) {\n delete material.onBeforeCompile\n delete material.defines.USE_CSM\n delete material.defines.CSM_CASCADES\n delete material.defines.CSM_FADE\n\n if (shader !== null) {\n delete shader.uniforms.CSM_cascades\n delete shader.uniforms.cameraNear\n delete shader.uniforms.shadowFar\n }\n\n material.needsUpdate = true\n })\n shaders.clear()\n }\n}\n"],"names":["Matrix4","CSMFrustum","Vector3","Box3","DirectionalLight","far","MathUtils","ShaderChunk","CSMShader","Vector2"],"mappings":"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"}
1
+ {"version":3,"file":"CSM.cjs","sources":["../../src/csm/CSM.js"],"sourcesContent":["import { Vector2, Vector3, DirectionalLight, MathUtils, ShaderChunk, Matrix4, Box3 } from 'three'\nimport { CSMFrustum } from './CSMFrustum'\nimport { CSMShader } from './CSMShader'\n\nconst _cameraToLightMatrix = /* @__PURE__ */ new Matrix4()\nconst _lightSpaceFrustum = /* @__PURE__ */ new CSMFrustum()\nconst _center = /* @__PURE__ */ new Vector3()\nconst _bbox = /* @__PURE__ */ new Box3()\nconst _uniformArray = []\nconst _logArray = []\n\nexport class CSM {\n constructor(data) {\n data = data || {}\n\n this.camera = data.camera\n this.parent = data.parent\n this.cascades = data.cascades || 3\n this.maxFar = data.maxFar || 100000\n this.mode = data.mode || 'practical'\n this.shadowMapSize = data.shadowMapSize || 2048\n this.shadowBias = data.shadowBias || 0.000001\n this.lightDirection = data.lightDirection || new Vector3(1, -1, 1).normalize()\n this.lightIntensity = data.lightIntensity || 1\n this.lightNear = data.lightNear || 1\n this.lightFar = data.lightFar || 2000\n this.lightMargin = data.lightMargin || 200\n this.customSplitsCallback = data.customSplitsCallback\n this.fade = false\n this.mainFrustum = new CSMFrustum()\n this.frustums = []\n this.breaks = []\n\n this.lights = []\n this.shaders = new Map()\n\n this.createLights()\n this.updateFrustums()\n this.injectInclude()\n }\n\n createLights() {\n for (let i = 0; i < this.cascades; i++) {\n const light = new DirectionalLight(0xffffff, this.lightIntensity)\n light.castShadow = true\n light.shadow.mapSize.width = this.shadowMapSize\n light.shadow.mapSize.height = this.shadowMapSize\n\n light.shadow.camera.near = this.lightNear\n light.shadow.camera.far = this.lightFar\n light.shadow.bias = this.shadowBias\n\n this.parent.add(light)\n this.parent.add(light.target)\n this.lights.push(light)\n }\n }\n\n initCascades() {\n const camera = this.camera\n camera.updateProjectionMatrix()\n this.mainFrustum.setFromProjectionMatrix(camera.projectionMatrix, this.maxFar)\n this.mainFrustum.split(this.breaks, this.frustums)\n }\n\n updateShadowBounds() {\n const frustums = this.frustums\n for (let i = 0; i < frustums.length; i++) {\n const light = this.lights[i]\n const shadowCam = light.shadow.camera\n const frustum = this.frustums[i]\n\n // Get the two points that represent that furthest points on the frustum assuming\n // that's either the diagonal across the far plane or the diagonal across the whole\n // frustum itself.\n const nearVerts = frustum.vertices.near\n const farVerts = frustum.vertices.far\n const point1 = farVerts[0]\n let point2\n if (point1.distanceTo(farVerts[2]) > point1.distanceTo(nearVerts[2])) {\n point2 = farVerts[2]\n } else {\n point2 = nearVerts[2]\n }\n\n let squaredBBWidth = point1.distanceTo(point2)\n if (this.fade) {\n // expand the shadow extents by the fade margin if fade is enabled.\n const camera = this.camera\n const far = Math.max(camera.far, this.maxFar)\n const linearDepth = frustum.vertices.far[0].z / (far - camera.near)\n const margin = 0.25 * Math.pow(linearDepth, 2.0) * (far - camera.near)\n\n squaredBBWidth += margin\n }\n\n shadowCam.left = -squaredBBWidth / 2\n shadowCam.right = squaredBBWidth / 2\n shadowCam.top = squaredBBWidth / 2\n shadowCam.bottom = -squaredBBWidth / 2\n shadowCam.updateProjectionMatrix()\n }\n }\n\n getBreaks() {\n const camera = this.camera\n const far = Math.min(camera.far, this.maxFar)\n this.breaks.length = 0\n\n switch (this.mode) {\n case 'uniform':\n uniformSplit(this.cascades, camera.near, far, this.breaks)\n break\n case 'logarithmic':\n logarithmicSplit(this.cascades, camera.near, far, this.breaks)\n break\n case 'practical':\n practicalSplit(this.cascades, camera.near, far, 0.5, this.breaks)\n break\n case 'custom':\n if (this.customSplitsCallback === undefined) console.error('CSM: Custom split scheme callback not defined.')\n this.customSplitsCallback(this.cascades, camera.near, far, this.breaks)\n break\n }\n\n function uniformSplit(amount, near, far, target) {\n for (let i = 1; i < amount; i++) {\n target.push((near + ((far - near) * i) / amount) / far)\n }\n\n target.push(1)\n }\n\n function logarithmicSplit(amount, near, far, target) {\n for (let i = 1; i < amount; i++) {\n target.push((near * (far / near) ** (i / amount)) / far)\n }\n\n target.push(1)\n }\n\n function practicalSplit(amount, near, far, lambda, target) {\n _uniformArray.length = 0\n _logArray.length = 0\n logarithmicSplit(amount, near, far, _logArray)\n uniformSplit(amount, near, far, _uniformArray)\n\n for (let i = 1; i < amount; i++) {\n target.push(MathUtils.lerp(_uniformArray[i - 1], _logArray[i - 1], lambda))\n }\n\n target.push(1)\n }\n }\n\n update() {\n const camera = this.camera\n const frustums = this.frustums\n for (let i = 0; i < frustums.length; i++) {\n const light = this.lights[i]\n const shadowCam = light.shadow.camera\n const texelWidth = (shadowCam.right - shadowCam.left) / this.shadowMapSize\n const texelHeight = (shadowCam.top - shadowCam.bottom) / this.shadowMapSize\n light.shadow.camera.updateMatrixWorld(true)\n _cameraToLightMatrix.multiplyMatrices(light.shadow.camera.matrixWorldInverse, camera.matrixWorld)\n frustums[i].toSpace(_cameraToLightMatrix, _lightSpaceFrustum)\n\n const nearVerts = _lightSpaceFrustum.vertices.near\n const farVerts = _lightSpaceFrustum.vertices.far\n _bbox.makeEmpty()\n for (let j = 0; j < 4; j++) {\n _bbox.expandByPoint(nearVerts[j])\n _bbox.expandByPoint(farVerts[j])\n }\n\n _bbox.getCenter(_center)\n _center.z = _bbox.max.z + this.lightMargin\n _center.x = Math.floor(_center.x / texelWidth) * texelWidth\n _center.y = Math.floor(_center.y / texelHeight) * texelHeight\n _center.applyMatrix4(light.shadow.camera.matrixWorld)\n\n light.position.copy(_center)\n light.target.position.copy(_center)\n\n light.target.position.x += this.lightDirection.x\n light.target.position.y += this.lightDirection.y\n light.target.position.z += this.lightDirection.z\n }\n }\n\n injectInclude() {\n ShaderChunk.lights_fragment_begin = CSMShader.lights_fragment_begin\n ShaderChunk.lights_pars_begin = CSMShader.lights_pars_begin\n }\n\n setupMaterial(material) {\n material.defines = material.defines || {}\n material.defines.USE_CSM = 1\n material.defines.CSM_CASCADES = this.cascades\n\n if (this.fade) {\n material.defines.CSM_FADE = ''\n }\n\n const breaksVec2 = []\n const scope = this\n const shaders = this.shaders\n\n material.onBeforeCompile = function (shader) {\n const far = Math.min(scope.camera.far, scope.maxFar)\n scope.getExtendedBreaks(breaksVec2)\n\n shader.uniforms.CSM_cascades = { value: breaksVec2 }\n shader.uniforms.cameraNear = { value: scope.camera.near }\n shader.uniforms.shadowFar = { value: far }\n\n shaders.set(material, shader)\n }\n\n shaders.set(material, null)\n }\n\n updateUniforms() {\n const far = Math.min(this.camera.far, this.maxFar)\n const shaders = this.shaders\n\n shaders.forEach(function (shader, material) {\n if (shader !== null) {\n const uniforms = shader.uniforms\n this.getExtendedBreaks(uniforms.CSM_cascades.value)\n uniforms.cameraNear.value = this.camera.near\n uniforms.shadowFar.value = far\n }\n\n if (!this.fade && 'CSM_FADE' in material.defines) {\n delete material.defines.CSM_FADE\n material.needsUpdate = true\n } else if (this.fade && !('CSM_FADE' in material.defines)) {\n material.defines.CSM_FADE = ''\n material.needsUpdate = true\n }\n }, this)\n }\n\n getExtendedBreaks(target) {\n while (target.length < this.breaks.length) {\n target.push(new Vector2())\n }\n\n target.length = this.breaks.length\n\n for (let i = 0; i < this.cascades; i++) {\n const amount = this.breaks[i]\n const prev = this.breaks[i - 1] || 0\n target[i].x = prev\n target[i].y = amount\n }\n }\n\n updateFrustums() {\n this.getBreaks()\n this.initCascades()\n this.updateShadowBounds()\n this.updateUniforms()\n }\n\n remove() {\n for (let i = 0; i < this.lights.length; i++) {\n this.parent.remove(this.lights[i])\n }\n }\n\n dispose() {\n const shaders = this.shaders\n shaders.forEach(function (shader, material) {\n delete material.onBeforeCompile\n delete material.defines.USE_CSM\n delete material.defines.CSM_CASCADES\n delete material.defines.CSM_FADE\n\n if (shader !== null) {\n delete shader.uniforms.CSM_cascades\n delete shader.uniforms.cameraNear\n delete shader.uniforms.shadowFar\n }\n\n material.needsUpdate = true\n })\n shaders.clear()\n }\n}\n"],"names":["Matrix4","CSMFrustum","Vector3","Box3","DirectionalLight","far","MathUtils","ShaderChunk","CSMShader","Vector2"],"mappings":"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"}
package/csm/CSM.js CHANGED
@@ -1,10 +1,10 @@
1
- import { Matrix4, Vector3, Box3, DirectionalLight, MathUtils, ShaderChunk, Vector2 } from "three";
1
+ import { Vector3, DirectionalLight, MathUtils, ShaderChunk, Vector2, Matrix4, Box3 } from "three";
2
2
  import { CSMFrustum } from "./CSMFrustum.js";
3
3
  import { CSMShader } from "./CSMShader.js";
4
- const _cameraToLightMatrix = new Matrix4();
5
- const _lightSpaceFrustum = new CSMFrustum();
6
- const _center = new Vector3();
7
- const _bbox = new Box3();
4
+ const _cameraToLightMatrix = /* @__PURE__ */ new Matrix4();
5
+ const _lightSpaceFrustum = /* @__PURE__ */ new CSMFrustum();
6
+ const _center = /* @__PURE__ */ new Vector3();
7
+ const _bbox = /* @__PURE__ */ new Box3();
8
8
  const _uniformArray = [];
9
9
  const _logArray = [];
10
10
  class CSM {
package/csm/CSM.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"CSM.js","sources":["../../src/csm/CSM.js"],"sourcesContent":["import { Vector2, Vector3, DirectionalLight, MathUtils, ShaderChunk, Matrix4, Box3 } from 'three'\nimport { CSMFrustum } from './CSMFrustum'\nimport { CSMShader } from './CSMShader'\n\nconst _cameraToLightMatrix = new Matrix4()\nconst _lightSpaceFrustum = new CSMFrustum()\nconst _center = new Vector3()\nconst _bbox = new Box3()\nconst _uniformArray = []\nconst _logArray = []\n\nexport class CSM {\n constructor(data) {\n data = data || {}\n\n this.camera = data.camera\n this.parent = data.parent\n this.cascades = data.cascades || 3\n this.maxFar = data.maxFar || 100000\n this.mode = data.mode || 'practical'\n this.shadowMapSize = data.shadowMapSize || 2048\n this.shadowBias = data.shadowBias || 0.000001\n this.lightDirection = data.lightDirection || new Vector3(1, -1, 1).normalize()\n this.lightIntensity = data.lightIntensity || 1\n this.lightNear = data.lightNear || 1\n this.lightFar = data.lightFar || 2000\n this.lightMargin = data.lightMargin || 200\n this.customSplitsCallback = data.customSplitsCallback\n this.fade = false\n this.mainFrustum = new CSMFrustum()\n this.frustums = []\n this.breaks = []\n\n this.lights = []\n this.shaders = new Map()\n\n this.createLights()\n this.updateFrustums()\n this.injectInclude()\n }\n\n createLights() {\n for (let i = 0; i < this.cascades; i++) {\n const light = new DirectionalLight(0xffffff, this.lightIntensity)\n light.castShadow = true\n light.shadow.mapSize.width = this.shadowMapSize\n light.shadow.mapSize.height = this.shadowMapSize\n\n light.shadow.camera.near = this.lightNear\n light.shadow.camera.far = this.lightFar\n light.shadow.bias = this.shadowBias\n\n this.parent.add(light)\n this.parent.add(light.target)\n this.lights.push(light)\n }\n }\n\n initCascades() {\n const camera = this.camera\n camera.updateProjectionMatrix()\n this.mainFrustum.setFromProjectionMatrix(camera.projectionMatrix, this.maxFar)\n this.mainFrustum.split(this.breaks, this.frustums)\n }\n\n updateShadowBounds() {\n const frustums = this.frustums\n for (let i = 0; i < frustums.length; i++) {\n const light = this.lights[i]\n const shadowCam = light.shadow.camera\n const frustum = this.frustums[i]\n\n // Get the two points that represent that furthest points on the frustum assuming\n // that's either the diagonal across the far plane or the diagonal across the whole\n // frustum itself.\n const nearVerts = frustum.vertices.near\n const farVerts = frustum.vertices.far\n const point1 = farVerts[0]\n let point2\n if (point1.distanceTo(farVerts[2]) > point1.distanceTo(nearVerts[2])) {\n point2 = farVerts[2]\n } else {\n point2 = nearVerts[2]\n }\n\n let squaredBBWidth = point1.distanceTo(point2)\n if (this.fade) {\n // expand the shadow extents by the fade margin if fade is enabled.\n const camera = this.camera\n const far = Math.max(camera.far, this.maxFar)\n const linearDepth = frustum.vertices.far[0].z / (far - camera.near)\n const margin = 0.25 * Math.pow(linearDepth, 2.0) * (far - camera.near)\n\n squaredBBWidth += margin\n }\n\n shadowCam.left = -squaredBBWidth / 2\n shadowCam.right = squaredBBWidth / 2\n shadowCam.top = squaredBBWidth / 2\n shadowCam.bottom = -squaredBBWidth / 2\n shadowCam.updateProjectionMatrix()\n }\n }\n\n getBreaks() {\n const camera = this.camera\n const far = Math.min(camera.far, this.maxFar)\n this.breaks.length = 0\n\n switch (this.mode) {\n case 'uniform':\n uniformSplit(this.cascades, camera.near, far, this.breaks)\n break\n case 'logarithmic':\n logarithmicSplit(this.cascades, camera.near, far, this.breaks)\n break\n case 'practical':\n practicalSplit(this.cascades, camera.near, far, 0.5, this.breaks)\n break\n case 'custom':\n if (this.customSplitsCallback === undefined) console.error('CSM: Custom split scheme callback not defined.')\n this.customSplitsCallback(this.cascades, camera.near, far, this.breaks)\n break\n }\n\n function uniformSplit(amount, near, far, target) {\n for (let i = 1; i < amount; i++) {\n target.push((near + ((far - near) * i) / amount) / far)\n }\n\n target.push(1)\n }\n\n function logarithmicSplit(amount, near, far, target) {\n for (let i = 1; i < amount; i++) {\n target.push((near * (far / near) ** (i / amount)) / far)\n }\n\n target.push(1)\n }\n\n function practicalSplit(amount, near, far, lambda, target) {\n _uniformArray.length = 0\n _logArray.length = 0\n logarithmicSplit(amount, near, far, _logArray)\n uniformSplit(amount, near, far, _uniformArray)\n\n for (let i = 1; i < amount; i++) {\n target.push(MathUtils.lerp(_uniformArray[i - 1], _logArray[i - 1], lambda))\n }\n\n target.push(1)\n }\n }\n\n update() {\n const camera = this.camera\n const frustums = this.frustums\n for (let i = 0; i < frustums.length; i++) {\n const light = this.lights[i]\n const shadowCam = light.shadow.camera\n const texelWidth = (shadowCam.right - shadowCam.left) / this.shadowMapSize\n const texelHeight = (shadowCam.top - shadowCam.bottom) / this.shadowMapSize\n light.shadow.camera.updateMatrixWorld(true)\n _cameraToLightMatrix.multiplyMatrices(light.shadow.camera.matrixWorldInverse, camera.matrixWorld)\n frustums[i].toSpace(_cameraToLightMatrix, _lightSpaceFrustum)\n\n const nearVerts = _lightSpaceFrustum.vertices.near\n const farVerts = _lightSpaceFrustum.vertices.far\n _bbox.makeEmpty()\n for (let j = 0; j < 4; j++) {\n _bbox.expandByPoint(nearVerts[j])\n _bbox.expandByPoint(farVerts[j])\n }\n\n _bbox.getCenter(_center)\n _center.z = _bbox.max.z + this.lightMargin\n _center.x = Math.floor(_center.x / texelWidth) * texelWidth\n _center.y = Math.floor(_center.y / texelHeight) * texelHeight\n _center.applyMatrix4(light.shadow.camera.matrixWorld)\n\n light.position.copy(_center)\n light.target.position.copy(_center)\n\n light.target.position.x += this.lightDirection.x\n light.target.position.y += this.lightDirection.y\n light.target.position.z += this.lightDirection.z\n }\n }\n\n injectInclude() {\n ShaderChunk.lights_fragment_begin = CSMShader.lights_fragment_begin\n ShaderChunk.lights_pars_begin = CSMShader.lights_pars_begin\n }\n\n setupMaterial(material) {\n material.defines = material.defines || {}\n material.defines.USE_CSM = 1\n material.defines.CSM_CASCADES = this.cascades\n\n if (this.fade) {\n material.defines.CSM_FADE = ''\n }\n\n const breaksVec2 = []\n const scope = this\n const shaders = this.shaders\n\n material.onBeforeCompile = function (shader) {\n const far = Math.min(scope.camera.far, scope.maxFar)\n scope.getExtendedBreaks(breaksVec2)\n\n shader.uniforms.CSM_cascades = { value: breaksVec2 }\n shader.uniforms.cameraNear = { value: scope.camera.near }\n shader.uniforms.shadowFar = { value: far }\n\n shaders.set(material, shader)\n }\n\n shaders.set(material, null)\n }\n\n updateUniforms() {\n const far = Math.min(this.camera.far, this.maxFar)\n const shaders = this.shaders\n\n shaders.forEach(function (shader, material) {\n if (shader !== null) {\n const uniforms = shader.uniforms\n this.getExtendedBreaks(uniforms.CSM_cascades.value)\n uniforms.cameraNear.value = this.camera.near\n uniforms.shadowFar.value = far\n }\n\n if (!this.fade && 'CSM_FADE' in material.defines) {\n delete material.defines.CSM_FADE\n material.needsUpdate = true\n } else if (this.fade && !('CSM_FADE' in material.defines)) {\n material.defines.CSM_FADE = ''\n material.needsUpdate = true\n }\n }, this)\n }\n\n getExtendedBreaks(target) {\n while (target.length < this.breaks.length) {\n target.push(new Vector2())\n }\n\n target.length = this.breaks.length\n\n for (let i = 0; i < this.cascades; i++) {\n const amount = this.breaks[i]\n const prev = this.breaks[i - 1] || 0\n target[i].x = prev\n target[i].y = amount\n }\n }\n\n updateFrustums() {\n this.getBreaks()\n this.initCascades()\n this.updateShadowBounds()\n this.updateUniforms()\n }\n\n remove() {\n for (let i = 0; i < this.lights.length; i++) {\n this.parent.remove(this.lights[i])\n }\n }\n\n dispose() {\n const shaders = this.shaders\n shaders.forEach(function (shader, material) {\n delete material.onBeforeCompile\n delete material.defines.USE_CSM\n delete material.defines.CSM_CASCADES\n delete material.defines.CSM_FADE\n\n if (shader !== null) {\n delete shader.uniforms.CSM_cascades\n delete shader.uniforms.cameraNear\n delete shader.uniforms.shadowFar\n }\n\n material.needsUpdate = true\n })\n shaders.clear()\n }\n}\n"],"names":["far"],"mappings":"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"}
1
+ {"version":3,"file":"CSM.js","sources":["../../src/csm/CSM.js"],"sourcesContent":["import { Vector2, Vector3, DirectionalLight, MathUtils, ShaderChunk, Matrix4, Box3 } from 'three'\nimport { CSMFrustum } from './CSMFrustum'\nimport { CSMShader } from './CSMShader'\n\nconst _cameraToLightMatrix = /* @__PURE__ */ new Matrix4()\nconst _lightSpaceFrustum = /* @__PURE__ */ new CSMFrustum()\nconst _center = /* @__PURE__ */ new Vector3()\nconst _bbox = /* @__PURE__ */ new Box3()\nconst _uniformArray = []\nconst _logArray = []\n\nexport class CSM {\n constructor(data) {\n data = data || {}\n\n this.camera = data.camera\n this.parent = data.parent\n this.cascades = data.cascades || 3\n this.maxFar = data.maxFar || 100000\n this.mode = data.mode || 'practical'\n this.shadowMapSize = data.shadowMapSize || 2048\n this.shadowBias = data.shadowBias || 0.000001\n this.lightDirection = data.lightDirection || new Vector3(1, -1, 1).normalize()\n this.lightIntensity = data.lightIntensity || 1\n this.lightNear = data.lightNear || 1\n this.lightFar = data.lightFar || 2000\n this.lightMargin = data.lightMargin || 200\n this.customSplitsCallback = data.customSplitsCallback\n this.fade = false\n this.mainFrustum = new CSMFrustum()\n this.frustums = []\n this.breaks = []\n\n this.lights = []\n this.shaders = new Map()\n\n this.createLights()\n this.updateFrustums()\n this.injectInclude()\n }\n\n createLights() {\n for (let i = 0; i < this.cascades; i++) {\n const light = new DirectionalLight(0xffffff, this.lightIntensity)\n light.castShadow = true\n light.shadow.mapSize.width = this.shadowMapSize\n light.shadow.mapSize.height = this.shadowMapSize\n\n light.shadow.camera.near = this.lightNear\n light.shadow.camera.far = this.lightFar\n light.shadow.bias = this.shadowBias\n\n this.parent.add(light)\n this.parent.add(light.target)\n this.lights.push(light)\n }\n }\n\n initCascades() {\n const camera = this.camera\n camera.updateProjectionMatrix()\n this.mainFrustum.setFromProjectionMatrix(camera.projectionMatrix, this.maxFar)\n this.mainFrustum.split(this.breaks, this.frustums)\n }\n\n updateShadowBounds() {\n const frustums = this.frustums\n for (let i = 0; i < frustums.length; i++) {\n const light = this.lights[i]\n const shadowCam = light.shadow.camera\n const frustum = this.frustums[i]\n\n // Get the two points that represent that furthest points on the frustum assuming\n // that's either the diagonal across the far plane or the diagonal across the whole\n // frustum itself.\n const nearVerts = frustum.vertices.near\n const farVerts = frustum.vertices.far\n const point1 = farVerts[0]\n let point2\n if (point1.distanceTo(farVerts[2]) > point1.distanceTo(nearVerts[2])) {\n point2 = farVerts[2]\n } else {\n point2 = nearVerts[2]\n }\n\n let squaredBBWidth = point1.distanceTo(point2)\n if (this.fade) {\n // expand the shadow extents by the fade margin if fade is enabled.\n const camera = this.camera\n const far = Math.max(camera.far, this.maxFar)\n const linearDepth = frustum.vertices.far[0].z / (far - camera.near)\n const margin = 0.25 * Math.pow(linearDepth, 2.0) * (far - camera.near)\n\n squaredBBWidth += margin\n }\n\n shadowCam.left = -squaredBBWidth / 2\n shadowCam.right = squaredBBWidth / 2\n shadowCam.top = squaredBBWidth / 2\n shadowCam.bottom = -squaredBBWidth / 2\n shadowCam.updateProjectionMatrix()\n }\n }\n\n getBreaks() {\n const camera = this.camera\n const far = Math.min(camera.far, this.maxFar)\n this.breaks.length = 0\n\n switch (this.mode) {\n case 'uniform':\n uniformSplit(this.cascades, camera.near, far, this.breaks)\n break\n case 'logarithmic':\n logarithmicSplit(this.cascades, camera.near, far, this.breaks)\n break\n case 'practical':\n practicalSplit(this.cascades, camera.near, far, 0.5, this.breaks)\n break\n case 'custom':\n if (this.customSplitsCallback === undefined) console.error('CSM: Custom split scheme callback not defined.')\n this.customSplitsCallback(this.cascades, camera.near, far, this.breaks)\n break\n }\n\n function uniformSplit(amount, near, far, target) {\n for (let i = 1; i < amount; i++) {\n target.push((near + ((far - near) * i) / amount) / far)\n }\n\n target.push(1)\n }\n\n function logarithmicSplit(amount, near, far, target) {\n for (let i = 1; i < amount; i++) {\n target.push((near * (far / near) ** (i / amount)) / far)\n }\n\n target.push(1)\n }\n\n function practicalSplit(amount, near, far, lambda, target) {\n _uniformArray.length = 0\n _logArray.length = 0\n logarithmicSplit(amount, near, far, _logArray)\n uniformSplit(amount, near, far, _uniformArray)\n\n for (let i = 1; i < amount; i++) {\n target.push(MathUtils.lerp(_uniformArray[i - 1], _logArray[i - 1], lambda))\n }\n\n target.push(1)\n }\n }\n\n update() {\n const camera = this.camera\n const frustums = this.frustums\n for (let i = 0; i < frustums.length; i++) {\n const light = this.lights[i]\n const shadowCam = light.shadow.camera\n const texelWidth = (shadowCam.right - shadowCam.left) / this.shadowMapSize\n const texelHeight = (shadowCam.top - shadowCam.bottom) / this.shadowMapSize\n light.shadow.camera.updateMatrixWorld(true)\n _cameraToLightMatrix.multiplyMatrices(light.shadow.camera.matrixWorldInverse, camera.matrixWorld)\n frustums[i].toSpace(_cameraToLightMatrix, _lightSpaceFrustum)\n\n const nearVerts = _lightSpaceFrustum.vertices.near\n const farVerts = _lightSpaceFrustum.vertices.far\n _bbox.makeEmpty()\n for (let j = 0; j < 4; j++) {\n _bbox.expandByPoint(nearVerts[j])\n _bbox.expandByPoint(farVerts[j])\n }\n\n _bbox.getCenter(_center)\n _center.z = _bbox.max.z + this.lightMargin\n _center.x = Math.floor(_center.x / texelWidth) * texelWidth\n _center.y = Math.floor(_center.y / texelHeight) * texelHeight\n _center.applyMatrix4(light.shadow.camera.matrixWorld)\n\n light.position.copy(_center)\n light.target.position.copy(_center)\n\n light.target.position.x += this.lightDirection.x\n light.target.position.y += this.lightDirection.y\n light.target.position.z += this.lightDirection.z\n }\n }\n\n injectInclude() {\n ShaderChunk.lights_fragment_begin = CSMShader.lights_fragment_begin\n ShaderChunk.lights_pars_begin = CSMShader.lights_pars_begin\n }\n\n setupMaterial(material) {\n material.defines = material.defines || {}\n material.defines.USE_CSM = 1\n material.defines.CSM_CASCADES = this.cascades\n\n if (this.fade) {\n material.defines.CSM_FADE = ''\n }\n\n const breaksVec2 = []\n const scope = this\n const shaders = this.shaders\n\n material.onBeforeCompile = function (shader) {\n const far = Math.min(scope.camera.far, scope.maxFar)\n scope.getExtendedBreaks(breaksVec2)\n\n shader.uniforms.CSM_cascades = { value: breaksVec2 }\n shader.uniforms.cameraNear = { value: scope.camera.near }\n shader.uniforms.shadowFar = { value: far }\n\n shaders.set(material, shader)\n }\n\n shaders.set(material, null)\n }\n\n updateUniforms() {\n const far = Math.min(this.camera.far, this.maxFar)\n const shaders = this.shaders\n\n shaders.forEach(function (shader, material) {\n if (shader !== null) {\n const uniforms = shader.uniforms\n this.getExtendedBreaks(uniforms.CSM_cascades.value)\n uniforms.cameraNear.value = this.camera.near\n uniforms.shadowFar.value = far\n }\n\n if (!this.fade && 'CSM_FADE' in material.defines) {\n delete material.defines.CSM_FADE\n material.needsUpdate = true\n } else if (this.fade && !('CSM_FADE' in material.defines)) {\n material.defines.CSM_FADE = ''\n material.needsUpdate = true\n }\n }, this)\n }\n\n getExtendedBreaks(target) {\n while (target.length < this.breaks.length) {\n target.push(new Vector2())\n }\n\n target.length = this.breaks.length\n\n for (let i = 0; i < this.cascades; i++) {\n const amount = this.breaks[i]\n const prev = this.breaks[i - 1] || 0\n target[i].x = prev\n target[i].y = amount\n }\n }\n\n updateFrustums() {\n this.getBreaks()\n this.initCascades()\n this.updateShadowBounds()\n this.updateUniforms()\n }\n\n remove() {\n for (let i = 0; i < this.lights.length; i++) {\n this.parent.remove(this.lights[i])\n }\n }\n\n dispose() {\n const shaders = this.shaders\n shaders.forEach(function (shader, material) {\n delete material.onBeforeCompile\n delete material.defines.USE_CSM\n delete material.defines.CSM_CASCADES\n delete material.defines.CSM_FADE\n\n if (shader !== null) {\n delete shader.uniforms.CSM_cascades\n delete shader.uniforms.cameraNear\n delete shader.uniforms.shadowFar\n }\n\n material.needsUpdate = true\n })\n shaders.clear()\n }\n}\n"],"names":["far"],"mappings":";;;AAIA,MAAM,uBAAuC,oBAAI,QAAS;AAC1D,MAAM,qBAAqC,oBAAI,WAAY;AAC3D,MAAM,UAA0B,oBAAI,QAAS;AAC7C,MAAM,QAAwB,oBAAI,KAAM;AACxC,MAAM,gBAAgB,CAAE;AACxB,MAAM,YAAY,CAAE;AAEb,MAAM,IAAI;AAAA,EACf,YAAY,MAAM;AAChB,WAAO,QAAQ,CAAE;AAEjB,SAAK,SAAS,KAAK;AACnB,SAAK,SAAS,KAAK;AACnB,SAAK,WAAW,KAAK,YAAY;AACjC,SAAK,SAAS,KAAK,UAAU;AAC7B,SAAK,OAAO,KAAK,QAAQ;AACzB,SAAK,gBAAgB,KAAK,iBAAiB;AAC3C,SAAK,aAAa,KAAK,cAAc;AACrC,SAAK,iBAAiB,KAAK,kBAAkB,IAAI,QAAQ,GAAG,IAAI,CAAC,EAAE,UAAW;AAC9E,SAAK,iBAAiB,KAAK,kBAAkB;AAC7C,SAAK,YAAY,KAAK,aAAa;AACnC,SAAK,WAAW,KAAK,YAAY;AACjC,SAAK,cAAc,KAAK,eAAe;AACvC,SAAK,uBAAuB,KAAK;AACjC,SAAK,OAAO;AACZ,SAAK,cAAc,IAAI,WAAY;AACnC,SAAK,WAAW,CAAE;AAClB,SAAK,SAAS,CAAE;AAEhB,SAAK,SAAS,CAAE;AAChB,SAAK,UAAU,oBAAI,IAAK;AAExB,SAAK,aAAc;AACnB,SAAK,eAAgB;AACrB,SAAK,cAAe;AAAA,EACrB;AAAA,EAED,eAAe;AACb,aAAS,IAAI,GAAG,IAAI,KAAK,UAAU,KAAK;AACtC,YAAM,QAAQ,IAAI,iBAAiB,UAAU,KAAK,cAAc;AAChE,YAAM,aAAa;AACnB,YAAM,OAAO,QAAQ,QAAQ,KAAK;AAClC,YAAM,OAAO,QAAQ,SAAS,KAAK;AAEnC,YAAM,OAAO,OAAO,OAAO,KAAK;AAChC,YAAM,OAAO,OAAO,MAAM,KAAK;AAC/B,YAAM,OAAO,OAAO,KAAK;AAEzB,WAAK,OAAO,IAAI,KAAK;AACrB,WAAK,OAAO,IAAI,MAAM,MAAM;AAC5B,WAAK,OAAO,KAAK,KAAK;AAAA,IACvB;AAAA,EACF;AAAA,EAED,eAAe;AACb,UAAM,SAAS,KAAK;AACpB,WAAO,uBAAwB;AAC/B,SAAK,YAAY,wBAAwB,OAAO,kBAAkB,KAAK,MAAM;AAC7E,SAAK,YAAY,MAAM,KAAK,QAAQ,KAAK,QAAQ;AAAA,EAClD;AAAA,EAED,qBAAqB;AACnB,UAAM,WAAW,KAAK;AACtB,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAM,QAAQ,KAAK,OAAO,CAAC;AAC3B,YAAM,YAAY,MAAM,OAAO;AAC/B,YAAM,UAAU,KAAK,SAAS,CAAC;AAK/B,YAAM,YAAY,QAAQ,SAAS;AACnC,YAAM,WAAW,QAAQ,SAAS;AAClC,YAAM,SAAS,SAAS,CAAC;AACzB,UAAI;AACJ,UAAI,OAAO,WAAW,SAAS,CAAC,CAAC,IAAI,OAAO,WAAW,UAAU,CAAC,CAAC,GAAG;AACpE,iBAAS,SAAS,CAAC;AAAA,MAC3B,OAAa;AACL,iBAAS,UAAU,CAAC;AAAA,MACrB;AAED,UAAI,iBAAiB,OAAO,WAAW,MAAM;AAC7C,UAAI,KAAK,MAAM;AAEb,cAAM,SAAS,KAAK;AACpB,cAAM,MAAM,KAAK,IAAI,OAAO,KAAK,KAAK,MAAM;AAC5C,cAAM,cAAc,QAAQ,SAAS,IAAI,CAAC,EAAE,KAAK,MAAM,OAAO;AAC9D,cAAM,SAAS,OAAO,KAAK,IAAI,aAAa,CAAG,KAAK,MAAM,OAAO;AAEjE,0BAAkB;AAAA,MACnB;AAED,gBAAU,OAAO,CAAC,iBAAiB;AACnC,gBAAU,QAAQ,iBAAiB;AACnC,gBAAU,MAAM,iBAAiB;AACjC,gBAAU,SAAS,CAAC,iBAAiB;AACrC,gBAAU,uBAAwB;AAAA,IACnC;AAAA,EACF;AAAA,EAED,YAAY;AACV,UAAM,SAAS,KAAK;AACpB,UAAM,MAAM,KAAK,IAAI,OAAO,KAAK,KAAK,MAAM;AAC5C,SAAK,OAAO,SAAS;AAErB,YAAQ,KAAK,MAAI;AAAA,MACf,KAAK;AACH,qBAAa,KAAK,UAAU,OAAO,MAAM,KAAK,KAAK,MAAM;AACzD;AAAA,MACF,KAAK;AACH,yBAAiB,KAAK,UAAU,OAAO,MAAM,KAAK,KAAK,MAAM;AAC7D;AAAA,MACF,KAAK;AACH,uBAAe,KAAK,UAAU,OAAO,MAAM,KAAK,KAAK,KAAK,MAAM;AAChE;AAAA,MACF,KAAK;AACH,YAAI,KAAK,yBAAyB;AAAW,kBAAQ,MAAM,gDAAgD;AAC3G,aAAK,qBAAqB,KAAK,UAAU,OAAO,MAAM,KAAK,KAAK,MAAM;AACtE;AAAA,IACH;AAED,aAAS,aAAa,QAAQ,MAAMA,MAAK,QAAQ;AAC/C,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,eAAO,MAAM,QAASA,OAAM,QAAQ,IAAK,UAAUA,IAAG;AAAA,MACvD;AAED,aAAO,KAAK,CAAC;AAAA,IACd;AAED,aAAS,iBAAiB,QAAQ,MAAMA,MAAK,QAAQ;AACnD,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,eAAO,KAAM,QAAQA,OAAM,UAAU,IAAI,UAAWA,IAAG;AAAA,MACxD;AAED,aAAO,KAAK,CAAC;AAAA,IACd;AAED,aAAS,eAAe,QAAQ,MAAMA,MAAK,QAAQ,QAAQ;AACzD,oBAAc,SAAS;AACvB,gBAAU,SAAS;AACnB,uBAAiB,QAAQ,MAAMA,MAAK,SAAS;AAC7C,mBAAa,QAAQ,MAAMA,MAAK,aAAa;AAE7C,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,eAAO,KAAK,UAAU,KAAK,cAAc,IAAI,CAAC,GAAG,UAAU,IAAI,CAAC,GAAG,MAAM,CAAC;AAAA,MAC3E;AAED,aAAO,KAAK,CAAC;AAAA,IACd;AAAA,EACF;AAAA,EAED,SAAS;AACP,UAAM,SAAS,KAAK;AACpB,UAAM,WAAW,KAAK;AACtB,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAM,QAAQ,KAAK,OAAO,CAAC;AAC3B,YAAM,YAAY,MAAM,OAAO;AAC/B,YAAM,cAAc,UAAU,QAAQ,UAAU,QAAQ,KAAK;AAC7D,YAAM,eAAe,UAAU,MAAM,UAAU,UAAU,KAAK;AAC9D,YAAM,OAAO,OAAO,kBAAkB,IAAI;AAC1C,2BAAqB,iBAAiB,MAAM,OAAO,OAAO,oBAAoB,OAAO,WAAW;AAChG,eAAS,CAAC,EAAE,QAAQ,sBAAsB,kBAAkB;AAE5D,YAAM,YAAY,mBAAmB,SAAS;AAC9C,YAAM,WAAW,mBAAmB,SAAS;AAC7C,YAAM,UAAW;AACjB,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAM,cAAc,UAAU,CAAC,CAAC;AAChC,cAAM,cAAc,SAAS,CAAC,CAAC;AAAA,MAChC;AAED,YAAM,UAAU,OAAO;AACvB,cAAQ,IAAI,MAAM,IAAI,IAAI,KAAK;AAC/B,cAAQ,IAAI,KAAK,MAAM,QAAQ,IAAI,UAAU,IAAI;AACjD,cAAQ,IAAI,KAAK,MAAM,QAAQ,IAAI,WAAW,IAAI;AAClD,cAAQ,aAAa,MAAM,OAAO,OAAO,WAAW;AAEpD,YAAM,SAAS,KAAK,OAAO;AAC3B,YAAM,OAAO,SAAS,KAAK,OAAO;AAElC,YAAM,OAAO,SAAS,KAAK,KAAK,eAAe;AAC/C,YAAM,OAAO,SAAS,KAAK,KAAK,eAAe;AAC/C,YAAM,OAAO,SAAS,KAAK,KAAK,eAAe;AAAA,IAChD;AAAA,EACF;AAAA,EAED,gBAAgB;AACd,gBAAY,wBAAwB,UAAU;AAC9C,gBAAY,oBAAoB,UAAU;AAAA,EAC3C;AAAA,EAED,cAAc,UAAU;AACtB,aAAS,UAAU,SAAS,WAAW,CAAE;AACzC,aAAS,QAAQ,UAAU;AAC3B,aAAS,QAAQ,eAAe,KAAK;AAErC,QAAI,KAAK,MAAM;AACb,eAAS,QAAQ,WAAW;AAAA,IAC7B;AAED,UAAM,aAAa,CAAE;AACrB,UAAM,QAAQ;AACd,UAAM,UAAU,KAAK;AAErB,aAAS,kBAAkB,SAAU,QAAQ;AAC3C,YAAM,MAAM,KAAK,IAAI,MAAM,OAAO,KAAK,MAAM,MAAM;AACnD,YAAM,kBAAkB,UAAU;AAElC,aAAO,SAAS,eAAe,EAAE,OAAO,WAAY;AACpD,aAAO,SAAS,aAAa,EAAE,OAAO,MAAM,OAAO,KAAM;AACzD,aAAO,SAAS,YAAY,EAAE,OAAO,IAAK;AAE1C,cAAQ,IAAI,UAAU,MAAM;AAAA,IAC7B;AAED,YAAQ,IAAI,UAAU,IAAI;AAAA,EAC3B;AAAA,EAED,iBAAiB;AACf,UAAM,MAAM,KAAK,IAAI,KAAK,OAAO,KAAK,KAAK,MAAM;AACjD,UAAM,UAAU,KAAK;AAErB,YAAQ,QAAQ,SAAU,QAAQ,UAAU;AAC1C,UAAI,WAAW,MAAM;AACnB,cAAM,WAAW,OAAO;AACxB,aAAK,kBAAkB,SAAS,aAAa,KAAK;AAClD,iBAAS,WAAW,QAAQ,KAAK,OAAO;AACxC,iBAAS,UAAU,QAAQ;AAAA,MAC5B;AAED,UAAI,CAAC,KAAK,QAAQ,cAAc,SAAS,SAAS;AAChD,eAAO,SAAS,QAAQ;AACxB,iBAAS,cAAc;AAAA,MAC/B,WAAiB,KAAK,QAAQ,EAAE,cAAc,SAAS,UAAU;AACzD,iBAAS,QAAQ,WAAW;AAC5B,iBAAS,cAAc;AAAA,MACxB;AAAA,IACF,GAAE,IAAI;AAAA,EACR;AAAA,EAED,kBAAkB,QAAQ;AACxB,WAAO,OAAO,SAAS,KAAK,OAAO,QAAQ;AACzC,aAAO,KAAK,IAAI,SAAS;AAAA,IAC1B;AAED,WAAO,SAAS,KAAK,OAAO;AAE5B,aAAS,IAAI,GAAG,IAAI,KAAK,UAAU,KAAK;AACtC,YAAM,SAAS,KAAK,OAAO,CAAC;AAC5B,YAAM,OAAO,KAAK,OAAO,IAAI,CAAC,KAAK;AACnC,aAAO,CAAC,EAAE,IAAI;AACd,aAAO,CAAC,EAAE,IAAI;AAAA,IACf;AAAA,EACF;AAAA,EAED,iBAAiB;AACf,SAAK,UAAW;AAChB,SAAK,aAAc;AACnB,SAAK,mBAAoB;AACzB,SAAK,eAAgB;AAAA,EACtB;AAAA,EAED,SAAS;AACP,aAAS,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,KAAK;AAC3C,WAAK,OAAO,OAAO,KAAK,OAAO,CAAC,CAAC;AAAA,IAClC;AAAA,EACF;AAAA,EAED,UAAU;AACR,UAAM,UAAU,KAAK;AACrB,YAAQ,QAAQ,SAAU,QAAQ,UAAU;AAC1C,aAAO,SAAS;AAChB,aAAO,SAAS,QAAQ;AACxB,aAAO,SAAS,QAAQ;AACxB,aAAO,SAAS,QAAQ;AAExB,UAAI,WAAW,MAAM;AACnB,eAAO,OAAO,SAAS;AACvB,eAAO,OAAO,SAAS;AACvB,eAAO,OAAO,SAAS;AAAA,MACxB;AAED,eAAS,cAAc;AAAA,IAC7B,CAAK;AACD,YAAQ,MAAO;AAAA,EAChB;AACH;"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const THREE = require("three");
4
- const inverseProjectionMatrix = new THREE.Matrix4();
4
+ const inverseProjectionMatrix = /* @__PURE__ */ new THREE.Matrix4();
5
5
  class CSMFrustum {
6
6
  constructor(data) {
7
7
  data = data || {};
@@ -1 +1 @@
1
- {"version":3,"file":"CSMFrustum.cjs","sources":["../../src/csm/CSMFrustum.js"],"sourcesContent":["import { Vector3, Matrix4 } from 'three'\n\nconst inverseProjectionMatrix = new Matrix4()\n\nclass CSMFrustum {\n constructor(data) {\n data = data || {}\n\n this.vertices = {\n near: [new Vector3(), new Vector3(), new Vector3(), new Vector3()],\n far: [new Vector3(), new Vector3(), new Vector3(), new Vector3()],\n }\n\n if (data.projectionMatrix !== undefined) {\n this.setFromProjectionMatrix(data.projectionMatrix, data.maxFar || 10000)\n }\n }\n\n setFromProjectionMatrix(projectionMatrix, maxFar) {\n const isOrthographic = projectionMatrix.elements[2 * 4 + 3] === 0\n\n inverseProjectionMatrix.copy(projectionMatrix).invert()\n\n // 3 --- 0 vertices.near/far order\n // | |\n // 2 --- 1\n // clip space spans from [-1, 1]\n\n this.vertices.near[0].set(1, 1, -1)\n this.vertices.near[1].set(1, -1, -1)\n this.vertices.near[2].set(-1, -1, -1)\n this.vertices.near[3].set(-1, 1, -1)\n this.vertices.near.forEach(function (v) {\n v.applyMatrix4(inverseProjectionMatrix)\n })\n\n this.vertices.far[0].set(1, 1, 1)\n this.vertices.far[1].set(1, -1, 1)\n this.vertices.far[2].set(-1, -1, 1)\n this.vertices.far[3].set(-1, 1, 1)\n this.vertices.far.forEach(function (v) {\n v.applyMatrix4(inverseProjectionMatrix)\n\n const absZ = Math.abs(v.z)\n if (isOrthographic) {\n v.z *= Math.min(maxFar / absZ, 1.0)\n } else {\n v.multiplyScalar(Math.min(maxFar / absZ, 1.0))\n }\n })\n\n return this.vertices\n }\n\n split(breaks, target) {\n while (breaks.length > target.length) {\n target.push(new CSMFrustum())\n }\n\n target.length = breaks.length\n\n for (let i = 0; i < breaks.length; i++) {\n const cascade = target[i]\n\n if (i === 0) {\n for (let j = 0; j < 4; j++) {\n cascade.vertices.near[j].copy(this.vertices.near[j])\n }\n } else {\n for (let j = 0; j < 4; j++) {\n cascade.vertices.near[j].lerpVectors(this.vertices.near[j], this.vertices.far[j], breaks[i - 1])\n }\n }\n\n if (i === breaks.length - 1) {\n for (let j = 0; j < 4; j++) {\n cascade.vertices.far[j].copy(this.vertices.far[j])\n }\n } else {\n for (let j = 0; j < 4; j++) {\n cascade.vertices.far[j].lerpVectors(this.vertices.near[j], this.vertices.far[j], breaks[i])\n }\n }\n }\n }\n\n toSpace(cameraMatrix, target) {\n for (let i = 0; i < 4; i++) {\n target.vertices.near[i].copy(this.vertices.near[i]).applyMatrix4(cameraMatrix)\n\n target.vertices.far[i].copy(this.vertices.far[i]).applyMatrix4(cameraMatrix)\n }\n }\n}\n\nexport { CSMFrustum }\n"],"names":["Matrix4","Vector3"],"mappings":"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"}
1
+ {"version":3,"file":"CSMFrustum.cjs","sources":["../../src/csm/CSMFrustum.js"],"sourcesContent":["import { Vector3, Matrix4 } from 'three'\n\nconst inverseProjectionMatrix = /* @__PURE__ */ new Matrix4()\n\nclass CSMFrustum {\n constructor(data) {\n data = data || {}\n\n this.vertices = {\n near: [new Vector3(), new Vector3(), new Vector3(), new Vector3()],\n far: [new Vector3(), new Vector3(), new Vector3(), new Vector3()],\n }\n\n if (data.projectionMatrix !== undefined) {\n this.setFromProjectionMatrix(data.projectionMatrix, data.maxFar || 10000)\n }\n }\n\n setFromProjectionMatrix(projectionMatrix, maxFar) {\n const isOrthographic = projectionMatrix.elements[2 * 4 + 3] === 0\n\n inverseProjectionMatrix.copy(projectionMatrix).invert()\n\n // 3 --- 0 vertices.near/far order\n // | |\n // 2 --- 1\n // clip space spans from [-1, 1]\n\n this.vertices.near[0].set(1, 1, -1)\n this.vertices.near[1].set(1, -1, -1)\n this.vertices.near[2].set(-1, -1, -1)\n this.vertices.near[3].set(-1, 1, -1)\n this.vertices.near.forEach(function (v) {\n v.applyMatrix4(inverseProjectionMatrix)\n })\n\n this.vertices.far[0].set(1, 1, 1)\n this.vertices.far[1].set(1, -1, 1)\n this.vertices.far[2].set(-1, -1, 1)\n this.vertices.far[3].set(-1, 1, 1)\n this.vertices.far.forEach(function (v) {\n v.applyMatrix4(inverseProjectionMatrix)\n\n const absZ = Math.abs(v.z)\n if (isOrthographic) {\n v.z *= Math.min(maxFar / absZ, 1.0)\n } else {\n v.multiplyScalar(Math.min(maxFar / absZ, 1.0))\n }\n })\n\n return this.vertices\n }\n\n split(breaks, target) {\n while (breaks.length > target.length) {\n target.push(new CSMFrustum())\n }\n\n target.length = breaks.length\n\n for (let i = 0; i < breaks.length; i++) {\n const cascade = target[i]\n\n if (i === 0) {\n for (let j = 0; j < 4; j++) {\n cascade.vertices.near[j].copy(this.vertices.near[j])\n }\n } else {\n for (let j = 0; j < 4; j++) {\n cascade.vertices.near[j].lerpVectors(this.vertices.near[j], this.vertices.far[j], breaks[i - 1])\n }\n }\n\n if (i === breaks.length - 1) {\n for (let j = 0; j < 4; j++) {\n cascade.vertices.far[j].copy(this.vertices.far[j])\n }\n } else {\n for (let j = 0; j < 4; j++) {\n cascade.vertices.far[j].lerpVectors(this.vertices.near[j], this.vertices.far[j], breaks[i])\n }\n }\n }\n }\n\n toSpace(cameraMatrix, target) {\n for (let i = 0; i < 4; i++) {\n target.vertices.near[i].copy(this.vertices.near[i]).applyMatrix4(cameraMatrix)\n\n target.vertices.far[i].copy(this.vertices.far[i]).applyMatrix4(cameraMatrix)\n }\n }\n}\n\nexport { CSMFrustum }\n"],"names":["Matrix4","Vector3"],"mappings":"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"}
package/csm/CSMFrustum.js CHANGED
@@ -1,5 +1,5 @@
1
- import { Matrix4, Vector3 } from "three";
2
- const inverseProjectionMatrix = new Matrix4();
1
+ import { Vector3, Matrix4 } from "three";
2
+ const inverseProjectionMatrix = /* @__PURE__ */ new Matrix4();
3
3
  class CSMFrustum {
4
4
  constructor(data) {
5
5
  data = data || {};