{"version":3,"file":"OrbitControls-a1394547.js","sources":["../../node_modules/three/examples/jsm/controls/OrbitControls.js"],"sourcesContent":["import {\n\tEventDispatcher,\n\tMOUSE,\n\tQuaternion,\n\tSpherical,\n\tTOUCH,\n\tVector2,\n\tVector3\n} from 'three';\n\n// OrbitControls 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 _changeEvent = { type: 'change' };\nconst _startEvent = { type: 'start' };\nconst _endEvent = { type: 'end' };\n\nclass OrbitControls extends EventDispatcher {\n\n\tconstructor( object, domElement ) {\n\n\t\tsuper();\n\n\t\tthis.object = object;\n\t\tthis.domElement = domElement;\n\t\tthis.domElement.style.touchAction = 'none'; // disable touch scroll\n\n\t\t// Set to false to disable this control\n\t\tthis.enabled = true;\n\n\t\t// \"target\" sets the location of focus, where the object orbits around\n\t\tthis.target = new Vector3();\n\n\t\t// How far you can dolly in and out ( PerspectiveCamera only )\n\t\tthis.minDistance = 0;\n\t\tthis.maxDistance = Infinity;\n\n\t\t// How far you can zoom in and out ( OrthographicCamera only )\n\t\tthis.minZoom = 0;\n\t\tthis.maxZoom = Infinity;\n\n\t\t// How far you can orbit vertically, upper and lower limits.\n\t\t// Range is 0 to Math.PI radians.\n\t\tthis.minPolarAngle = 0; // radians\n\t\tthis.maxPolarAngle = Math.PI; // radians\n\n\t\t// How far you can orbit horizontally, upper and lower limits.\n\t\t// If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI )\n\t\tthis.minAzimuthAngle = - Infinity; // radians\n\t\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t\t// Set to true to enable damping (inertia)\n\t\t// If damping is enabled, you must call controls.update() in your animation loop\n\t\tthis.enableDamping = false;\n\t\tthis.dampingFactor = 0.05;\n\n\t\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t\t// Set to false to disable zooming\n\t\tthis.enableZoom = true;\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t// Set to false to disable rotating\n\t\tthis.enableRotate = true;\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t// Set to false to disable panning\n\t\tthis.enablePan = true;\n\t\tthis.panSpeed = 1.0;\n\t\tthis.screenSpacePanning = true; // if false, pan orthogonal to world-space direction camera.up\n\t\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t\t// Set to true to automatically rotate around the target\n\t\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\t\tthis.autoRotate = false;\n\t\tthis.autoRotateSpeed = 2.0; // 30 seconds per orbit when fps is 60\n\n\t\t// The four arrow keys\n\t\tthis.keys = { LEFT: 'ArrowLeft', UP: 'ArrowUp', RIGHT: 'ArrowRight', BOTTOM: 'ArrowDown' };\n\n\t\t// Mouse buttons\n\t\tthis.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN };\n\n\t\t// Touch fingers\n\t\tthis.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\n\n\t\t// for reset\n\t\tthis.target0 = this.target.clone();\n\t\tthis.position0 = this.object.position.clone();\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t// the target DOM element for key events\n\t\tthis._domElementKeyEvents = null;\n\n\t\t//\n\t\t// public methods\n\t\t//\n\n\t\tthis.getPolarAngle = function () {\n\n\t\t\treturn spherical.phi;\n\n\t\t};\n\n\t\tthis.getAzimuthalAngle = function () {\n\n\t\t\treturn spherical.theta;\n\n\t\t};\n\n\t\tthis.getDistance = function () {\n\n\t\t\treturn this.object.position.distanceTo( this.target );\n\n\t\t};\n\n\t\tthis.listenToKeyEvents = function ( domElement ) {\n\n\t\t\tdomElement.addEventListener( 'keydown', onKeyDown );\n\t\t\tthis._domElementKeyEvents = domElement;\n\n\t\t};\n\n\t\tthis.stopListenToKeyEvents = function () {\n\n\t\t\tthis._domElementKeyEvents.removeEventListener( 'keydown', onKeyDown );\n\t\t\tthis._domElementKeyEvents = null;\n\n\t\t};\n\n\t\tthis.saveState = function () {\n\n\t\t\tscope.target0.copy( scope.target );\n\t\t\tscope.position0.copy( scope.object.position );\n\t\t\tscope.zoom0 = scope.object.zoom;\n\n\t\t};\n\n\t\tthis.reset = function () {\n\n\t\t\tscope.target.copy( scope.target0 );\n\t\t\tscope.object.position.copy( scope.position0 );\n\t\t\tscope.object.zoom = scope.zoom0;\n\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tscope.dispatchEvent( _changeEvent );\n\n\t\t\tscope.update();\n\n\t\t\tstate = STATE.NONE;\n\n\t\t};\n\n\t\t// this method is exposed, but perhaps it would be better if we can make it private...\n\t\tthis.update = function () {\n\n\t\t\tconst offset = new Vector3();\n\n\t\t\t// so camera.up is the orbit axis\n\t\t\tconst quat = new Quaternion().setFromUnitVectors( object.up, new Vector3( 0, 1, 0 ) );\n\t\t\tconst quatInverse = quat.clone().invert();\n\n\t\t\tconst lastPosition = new Vector3();\n\t\t\tconst lastQuaternion = new Quaternion();\n\t\t\tconst lastTargetPosition = new Vector3();\n\n\t\t\tconst twoPI = 2 * Math.PI;\n\n\t\t\treturn function update() {\n\n\t\t\t\tconst position = scope.object.position;\n\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t\t// angle from z-axis around y-axis\n\t\t\t\tspherical.setFromVector3( offset );\n\n\t\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t\t}\n\n\t\t\t\tif ( scope.enableDamping ) {\n\n\t\t\t\t\tspherical.theta += sphericalDelta.theta * scope.dampingFactor;\n\t\t\t\t\tspherical.phi += sphericalDelta.phi * scope.dampingFactor;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\t\tspherical.phi += sphericalDelta.phi;\n\n\t\t\t\t}\n\n\t\t\t\t// restrict theta to be between desired limits\n\n\t\t\t\tlet min = scope.minAzimuthAngle;\n\t\t\t\tlet max = scope.maxAzimuthAngle;\n\n\t\t\t\tif ( isFinite( min ) && isFinite( max ) ) {\n\n\t\t\t\t\tif ( min < - Math.PI ) min += twoPI; else if ( min > Math.PI ) min -= twoPI;\n\n\t\t\t\t\tif ( max < - Math.PI ) max += twoPI; else if ( max > Math.PI ) max -= twoPI;\n\n\t\t\t\t\tif ( min <= max ) {\n\n\t\t\t\t\t\tspherical.theta = Math.max( min, Math.min( max, spherical.theta ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tspherical.theta = ( spherical.theta > ( min + max ) / 2 ) ?\n\t\t\t\t\t\t\tMath.max( min, spherical.theta ) :\n\t\t\t\t\t\t\tMath.min( max, spherical.theta );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// restrict phi to be between desired limits\n\t\t\t\tspherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n\t\t\t\tspherical.makeSafe();\n\n\n\t\t\t\tspherical.radius *= scale;\n\n\t\t\t\t// restrict radius to be between desired limits\n\t\t\t\tspherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n\t\t\t\t// move target to panned location\n\n\t\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\t\tscope.target.addScaledVector( panOffset, scope.dampingFactor );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tscope.target.add( panOffset );\n\n\t\t\t\t}\n\n\t\t\t\toffset.setFromSpherical( spherical );\n\n\t\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\t\tsphericalDelta.theta *= ( 1 - scope.dampingFactor );\n\t\t\t\t\tsphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n\t\t\t\t\tpanOffset.multiplyScalar( 1 - scope.dampingFactor );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsphericalDelta.set( 0, 0, 0 );\n\n\t\t\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tscale = 1;\n\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\t\tif ( zoomChanged ||\n\t\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ||\n\t\t\t\t\tlastTargetPosition.distanceToSquared( scope.target ) > 0 ) {\n\n\t\t\t\t\tscope.dispatchEvent( _changeEvent );\n\n\t\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\t\tlastTargetPosition.copy( scope.target );\n\n\t\t\t\t\tzoomChanged = false;\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t};\n\n\t\t}();\n\n\t\tthis.dispose = function () {\n\n\t\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu );\n\n\t\t\tscope.domElement.removeEventListener( 'pointerdown', onPointerDown );\n\t\t\tscope.domElement.removeEventListener( 'pointercancel', onPointerUp );\n\t\t\tscope.domElement.removeEventListener( 'wheel', onMouseWheel );\n\n\t\t\tscope.domElement.removeEventListener( 'pointermove', onPointerMove );\n\t\t\tscope.domElement.removeEventListener( 'pointerup', onPointerUp );\n\n\n\t\t\tif ( scope._domElementKeyEvents !== null ) {\n\n\t\t\t\tscope._domElementKeyEvents.removeEventListener( 'keydown', onKeyDown );\n\t\t\t\tscope._domElementKeyEvents = null;\n\n\t\t\t}\n\n\t\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t\t};\n\n\t\t//\n\t\t// internals\n\t\t//\n\n\t\tconst scope = this;\n\n\t\tconst STATE = {\n\t\t\tNONE: - 1,\n\t\t\tROTATE: 0,\n\t\t\tDOLLY: 1,\n\t\t\tPAN: 2,\n\t\t\tTOUCH_ROTATE: 3,\n\t\t\tTOUCH_PAN: 4,\n\t\t\tTOUCH_DOLLY_PAN: 5,\n\t\t\tTOUCH_DOLLY_ROTATE: 6\n\t\t};\n\n\t\tlet state = STATE.NONE;\n\n\t\tconst EPS = 0.000001;\n\n\t\t// current position in spherical coordinates\n\t\tconst spherical = new Spherical();\n\t\tconst sphericalDelta = new Spherical();\n\n\t\tlet scale = 1;\n\t\tconst panOffset = new Vector3();\n\t\tlet zoomChanged = false;\n\n\t\tconst rotateStart = new Vector2();\n\t\tconst rotateEnd = new Vector2();\n\t\tconst rotateDelta = new Vector2();\n\n\t\tconst panStart = new Vector2();\n\t\tconst panEnd = new Vector2();\n\t\tconst panDelta = new Vector2();\n\n\t\tconst dollyStart = new Vector2();\n\t\tconst dollyEnd = new Vector2();\n\t\tconst dollyDelta = new Vector2();\n\n\t\tconst pointers = [];\n\t\tconst pointerPositions = {};\n\n\t\tfunction getAutoRotationAngle() {\n\n\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t\t}\n\n\t\tfunction getZoomScale() {\n\n\t\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t\t}\n\n\t\tfunction rotateLeft( angle ) {\n\n\t\t\tsphericalDelta.theta -= angle;\n\n\t\t}\n\n\t\tfunction rotateUp( angle ) {\n\n\t\t\tsphericalDelta.phi -= angle;\n\n\t\t}\n\n\t\tconst panLeft = function () {\n\n\t\t\tconst v = new Vector3();\n\n\t\t\treturn function panLeft( distance, objectMatrix ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t\t\tv.multiplyScalar( - distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\tconst panUp = function () {\n\n\t\t\tconst v = new Vector3();\n\n\t\t\treturn function panUp( distance, objectMatrix ) {\n\n\t\t\t\tif ( scope.screenSpacePanning === true ) {\n\n\t\t\t\t\tv.setFromMatrixColumn( objectMatrix, 1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv.setFromMatrixColumn( objectMatrix, 0 );\n\t\t\t\t\tv.crossVectors( scope.object.up, v );\n\n\t\t\t\t}\n\n\t\t\t\tv.multiplyScalar( distance );\n\n\t\t\t\tpanOffset.add( v );\n\n\t\t\t};\n\n\t\t}();\n\n\t\t// deltaX and deltaY are in pixels; right and down are positive\n\t\tconst pan = function () {\n\n\t\t\tconst offset = new Vector3();\n\n\t\t\treturn function pan( deltaX, deltaY ) {\n\n\t\t\t\tconst element = scope.domElement;\n\n\t\t\t\tif ( scope.object.isPerspectiveCamera ) {\n\n\t\t\t\t\t// perspective\n\t\t\t\t\tconst position = scope.object.position;\n\t\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\t\tlet targetDistance = offset.length();\n\n\t\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t\t// we use only clientHeight here so aspect ratio does not distort speed\n\t\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else if ( scope.object.isOrthographicCamera ) {\n\n\t\t\t\t\t// orthographic\n\t\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n\t\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\t\tscope.enablePan = false;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}();\n\n\t\tfunction dollyOut( dollyScale ) {\n\n\t\t\tif ( scope.object.isPerspectiveCamera ) {\n\n\t\t\t\tscale /= dollyScale;\n\n\t\t\t} else if ( scope.object.isOrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction dollyIn( dollyScale ) {\n\n\t\t\tif ( scope.object.isPerspectiveCamera ) {\n\n\t\t\t\tscale *= dollyScale;\n\n\t\t\t} else if ( scope.object.isOrthographicCamera ) {\n\n\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\t\tscope.enableZoom = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\t\t// event callbacks - update the object state\n\t\t//\n\n\t\tfunction handleMouseDownRotate( event ) {\n\n\t\t\trotateStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownDolly( event ) {\n\n\t\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseDownPan( event ) {\n\n\t\t\tpanStart.set( event.clientX, event.clientY );\n\n\t\t}\n\n\t\tfunction handleMouseMoveRotate( event ) {\n\n\t\t\trotateEnd.set( event.clientX, event.clientY );\n\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\n\n\t\t\tconst element = scope.domElement;\n\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\n\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMoveDolly( event ) {\n\n\t\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseMovePan( event ) {\n\n\t\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\t\tpanDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleMouseWheel( event ) {\n\n\t\t\tif ( event.deltaY < 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale() );\n\n\t\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale() );\n\n\t\t\t}\n\n\t\t\tscope.update();\n\n\t\t}\n\n\t\tfunction handleKeyDown( event ) {\n\n\t\t\tlet needsUpdate = false;\n\n\t\t\tswitch ( event.code ) {\n\n\t\t\t\tcase scope.keys.UP:\n\n\t\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\t\trotateUp( 2 * Math.PI * scope.rotateSpeed / scope.domElement.clientHeight );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpan( 0, scope.keyPanSpeed );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tneedsUpdate = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.BOTTOM:\n\n\t\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\t\trotateUp( - 2 * Math.PI * scope.rotateSpeed / scope.domElement.clientHeight );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tneedsUpdate = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.LEFT:\n\n\t\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\t\trotateLeft( 2 * Math.PI * scope.rotateSpeed / scope.domElement.clientHeight );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tneedsUpdate = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase scope.keys.RIGHT:\n\n\t\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\t\trotateLeft( - 2 * Math.PI * scope.rotateSpeed / scope.domElement.clientHeight );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tneedsUpdate = true;\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( needsUpdate ) {\n\n\t\t\t\t// prevent the browser from scrolling on cursor keys\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tscope.update();\n\n\t\t\t}\n\n\n\t\t}\n\n\t\tfunction handleTouchStartRotate() {\n\n\t\t\tif ( pointers.length === 1 ) {\n\n\t\t\t\trotateStart.set( pointers[ 0 ].pageX, pointers[ 0 ].pageY );\n\n\t\t\t} else {\n\n\t\t\t\tconst x = 0.5 * ( pointers[ 0 ].pageX + pointers[ 1 ].pageX );\n\t\t\t\tconst y = 0.5 * ( pointers[ 0 ].pageY + pointers[ 1 ].pageY );\n\n\t\t\t\trotateStart.set( x, y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction handleTouchStartPan() {\n\n\t\t\tif ( pointers.length === 1 ) {\n\n\t\t\t\tpanStart.set( pointers[ 0 ].pageX, pointers[ 0 ].pageY );\n\n\t\t\t} else {\n\n\t\t\t\tconst x = 0.5 * ( pointers[ 0 ].pageX + pointers[ 1 ].pageX );\n\t\t\t\tconst y = 0.5 * ( pointers[ 0 ].pageY + pointers[ 1 ].pageY );\n\n\t\t\t\tpanStart.set( x, y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction handleTouchStartDolly() {\n\n\t\t\tconst dx = pointers[ 0 ].pageX - pointers[ 1 ].pageX;\n\t\t\tconst dy = pointers[ 0 ].pageY - pointers[ 1 ].pageY;\n\n\t\t\tconst distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyStart.set( 0, distance );\n\n\t\t}\n\n\t\tfunction handleTouchStartDollyPan() {\n\n\t\t\tif ( scope.enableZoom ) handleTouchStartDolly();\n\n\t\t\tif ( scope.enablePan ) handleTouchStartPan();\n\n\t\t}\n\n\t\tfunction handleTouchStartDollyRotate() {\n\n\t\t\tif ( scope.enableZoom ) handleTouchStartDolly();\n\n\t\t\tif ( scope.enableRotate ) handleTouchStartRotate();\n\n\t\t}\n\n\t\tfunction handleTouchMoveRotate( event ) {\n\n\t\t\tif ( pointers.length == 1 ) {\n\n\t\t\t\trotateEnd.set( event.pageX, event.pageY );\n\n\t\t\t} else {\n\n\t\t\t\tconst position = getSecondPointerPosition( event );\n\n\t\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\t\trotateEnd.set( x, y );\n\n\t\t\t}\n\n\t\t\trotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\n\n\t\t\tconst element = scope.domElement;\n\n\t\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\n\n\t\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\n\n\t\t\trotateStart.copy( rotateEnd );\n\n\t\t}\n\n\t\tfunction handleTouchMovePan( event ) {\n\n\t\t\tif ( pointers.length === 1 ) {\n\n\t\t\t\tpanEnd.set( event.pageX, event.pageY );\n\n\t\t\t} else {\n\n\t\t\t\tconst position = getSecondPointerPosition( event );\n\n\t\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\t\tpanEnd.set( x, y );\n\n\t\t\t}\n\n\t\t\tpanDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\n\n\t\t\tpan( panDelta.x, panDelta.y );\n\n\t\t\tpanStart.copy( panEnd );\n\n\t\t}\n\n\t\tfunction handleTouchMoveDolly( event ) {\n\n\t\t\tconst position = getSecondPointerPosition( event );\n\n\t\t\tconst dx = event.pageX - position.x;\n\t\t\tconst dy = event.pageY - position.y;\n\n\t\t\tconst distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tdollyEnd.set( 0, distance );\n\n\t\t\tdollyDelta.set( 0, Math.pow( dollyEnd.y / dollyStart.y, scope.zoomSpeed ) );\n\n\t\t\tdollyOut( dollyDelta.y );\n\n\t\t\tdollyStart.copy( dollyEnd );\n\n\t\t}\n\n\t\tfunction handleTouchMoveDollyPan( event ) {\n\n\t\t\tif ( scope.enableZoom ) handleTouchMoveDolly( event );\n\n\t\t\tif ( scope.enablePan ) handleTouchMovePan( event );\n\n\t\t}\n\n\t\tfunction handleTouchMoveDollyRotate( event ) {\n\n\t\t\tif ( scope.enableZoom ) handleTouchMoveDolly( event );\n\n\t\t\tif ( scope.enableRotate ) handleTouchMoveRotate( event );\n\n\t\t}\n\n\t\t//\n\t\t// event handlers - FSM: listen for events and reset state\n\t\t//\n\n\t\tfunction onPointerDown( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tif ( pointers.length === 0 ) {\n\n\t\t\t\tscope.domElement.setPointerCapture( event.pointerId );\n\n\t\t\t\tscope.domElement.addEventListener( 'pointermove', onPointerMove );\n\t\t\t\tscope.domElement.addEventListener( 'pointerup', onPointerUp );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\taddPointer( event );\n\n\t\t\tif ( event.pointerType === 'touch' ) {\n\n\t\t\t\tonTouchStart( event );\n\n\t\t\t} else {\n\n\t\t\t\tonMouseDown( event );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onPointerMove( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tif ( event.pointerType === 'touch' ) {\n\n\t\t\t\tonTouchMove( event );\n\n\t\t\t} else {\n\n\t\t\t\tonMouseMove( event );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onPointerUp( event ) {\n\n\t\t\tremovePointer( event );\n\n\t\t\tif ( pointers.length === 0 ) {\n\n\t\t\t\tscope.domElement.releasePointerCapture( event.pointerId );\n\n\t\t\t\tscope.domElement.removeEventListener( 'pointermove', onPointerMove );\n\t\t\t\tscope.domElement.removeEventListener( 'pointerup', onPointerUp );\n\n\t\t\t}\n\n\t\t\tscope.dispatchEvent( _endEvent );\n\n\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tfunction onMouseDown( event ) {\n\n\t\t\tlet mouseAction;\n\n\t\t\tswitch ( event.button ) {\n\n\t\t\t\tcase 0:\n\n\t\t\t\t\tmouseAction = scope.mouseButtons.LEFT;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1:\n\n\t\t\t\t\tmouseAction = scope.mouseButtons.MIDDLE;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\n\n\t\t\t\t\tmouseAction = scope.mouseButtons.RIGHT;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tmouseAction = - 1;\n\n\t\t\t}\n\n\t\t\tswitch ( mouseAction ) {\n\n\t\t\t\tcase MOUSE.DOLLY:\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\t\thandleMouseDownDolly( event );\n\n\t\t\t\t\tstate = STATE.DOLLY;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MOUSE.ROTATE:\n\n\t\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\t\t\tstate = STATE.PAN;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MOUSE.PAN:\n\n\t\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\t\t\tstate = STATE.PAN;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tscope.dispatchEvent( _startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseMove( event ) {\n\n\t\t\tswitch ( state ) {\n\n\t\t\t\tcase STATE.ROTATE:\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleMouseMoveRotate( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase STATE.DOLLY:\n\n\t\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\t\thandleMouseMoveDolly( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase STATE.PAN:\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleMouseMovePan( event );\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onMouseWheel( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enableZoom === false || state !== STATE.NONE ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t\tscope.dispatchEvent( _startEvent );\n\n\t\t\thandleMouseWheel( event );\n\n\t\t\tscope.dispatchEvent( _endEvent );\n\n\t\t}\n\n\t\tfunction onKeyDown( event ) {\n\n\t\t\tif ( scope.enabled === false || scope.enablePan === false ) return;\n\n\t\t\thandleKeyDown( event );\n\n\t\t}\n\n\t\tfunction onTouchStart( event ) {\n\n\t\t\ttrackPointer( event );\n\n\t\t\tswitch ( pointers.length ) {\n\n\t\t\t\tcase 1:\n\n\t\t\t\t\tswitch ( scope.touches.ONE ) {\n\n\t\t\t\t\t\tcase TOUCH.ROTATE:\n\n\t\t\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\t\t\thandleTouchStartRotate();\n\n\t\t\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TOUCH.PAN:\n\n\t\t\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\t\t\thandleTouchStartPan();\n\n\t\t\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\n\n\t\t\t\t\tswitch ( scope.touches.TWO ) {\n\n\t\t\t\t\t\tcase TOUCH.DOLLY_PAN:\n\n\t\t\t\t\t\t\tif ( scope.enableZoom === false && scope.enablePan === false ) return;\n\n\t\t\t\t\t\t\thandleTouchStartDollyPan();\n\n\t\t\t\t\t\t\tstate = STATE.TOUCH_DOLLY_PAN;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TOUCH.DOLLY_ROTATE:\n\n\t\t\t\t\t\t\tif ( scope.enableZoom === false && scope.enableRotate === false ) return;\n\n\t\t\t\t\t\t\thandleTouchStartDollyRotate();\n\n\t\t\t\t\t\t\tstate = STATE.TOUCH_DOLLY_ROTATE;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t\tif ( state !== STATE.NONE ) {\n\n\t\t\t\tscope.dispatchEvent( _startEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onTouchMove( event ) {\n\n\t\t\ttrackPointer( event );\n\n\t\t\tswitch ( state ) {\n\n\t\t\t\tcase STATE.TOUCH_ROTATE:\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\t\tscope.update();\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase STATE.TOUCH_PAN:\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\t\tscope.update();\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase STATE.TOUCH_DOLLY_PAN:\n\n\t\t\t\t\tif ( scope.enableZoom === false && scope.enablePan === false ) return;\n\n\t\t\t\t\thandleTouchMoveDollyPan( event );\n\n\t\t\t\t\tscope.update();\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase STATE.TOUCH_DOLLY_ROTATE:\n\n\t\t\t\t\tif ( scope.enableZoom === false && scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleTouchMoveDollyRotate( event );\n\n\t\t\t\t\tscope.update();\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onContextMenu( event ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\n\t\t\tevent.preventDefault();\n\n\t\t}\n\n\t\tfunction addPointer( event ) {\n\n\t\t\tpointers.push( event );\n\n\t\t}\n\n\t\tfunction removePointer( event ) {\n\n\t\t\tdelete pointerPositions[ event.pointerId ];\n\n\t\t\tfor ( let i = 0; i < pointers.length; i ++ ) {\n\n\t\t\t\tif ( pointers[ i ].pointerId == event.pointerId ) {\n\n\t\t\t\t\tpointers.splice( i, 1 );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction trackPointer( event ) {\n\n\t\t\tlet position = pointerPositions[ event.pointerId ];\n\n\t\t\tif ( position === undefined ) {\n\n\t\t\t\tposition = new Vector2();\n\t\t\t\tpointerPositions[ event.pointerId ] = position;\n\n\t\t\t}\n\n\t\t\tposition.set( event.pageX, event.pageY );\n\n\t\t}\n\n\t\tfunction getSecondPointerPosition( event ) {\n\n\t\t\tconst pointer = ( event.pointerId === pointers[ 0 ].pointerId ) ? pointers[ 1 ] : pointers[ 0 ];\n\n\t\t\treturn pointerPositions[ pointer.pointerId ];\n\n\t\t}\n\n\t\t//\n\n\t\tscope.domElement.addEventListener( 'contextmenu', onContextMenu );\n\n\t\tscope.domElement.addEventListener( 'pointerdown', onPointerDown );\n\t\tscope.domElement.addEventListener( 'pointercancel', onPointerUp );\n\t\tscope.domElement.addEventListener( 'wheel', onMouseWheel, { passive: false } );\n\n\t\t// force an update at start\n\n\t\tthis.update();\n\n\t}\n\n}\n\nexport { OrbitControls };\n"],"names":["_changeEvent","_startEvent","_endEvent","OrbitControls","EventDispatcher","object","domElement","Vector3","MOUSE","TOUCH","spherical","onKeyDown","scope","state","STATE","offset","quat","Quaternion","quatInverse","lastPosition","lastQuaternion","lastTargetPosition","twoPI","position","rotateLeft","getAutoRotationAngle","sphericalDelta","min","max","scale","panOffset","zoomChanged","EPS","onContextMenu","onPointerDown","onPointerUp","onMouseWheel","onPointerMove","Spherical","rotateStart","Vector2","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","pointers","pointerPositions","getZoomScale","angle","rotateUp","panLeft","v","distance","objectMatrix","panUp","pan","deltaX","deltaY","element","targetDistance","dollyOut","dollyScale","dollyIn","handleMouseDownRotate","event","handleMouseDownDolly","handleMouseDownPan","handleMouseMoveRotate","handleMouseMoveDolly","handleMouseMovePan","handleMouseWheel","handleKeyDown","needsUpdate","handleTouchStartRotate","x","y","handleTouchStartPan","handleTouchStartDolly","dx","dy","handleTouchStartDollyPan","handleTouchStartDollyRotate","handleTouchMoveRotate","getSecondPointerPosition","handleTouchMovePan","handleTouchMoveDolly","handleTouchMoveDollyPan","handleTouchMoveDollyRotate","addPointer","onTouchStart","onMouseDown","onTouchMove","onMouseMove","removePointer","mouseAction","trackPointer","i","pointer"],"mappings":"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","x_google_ignoreList":[0]}