{"version":3,"sources":["jsdelivr-header.js","/npm/three@0.114.0/examples/js/controls/OrbitControls.js"],"names":[],"mappings":"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","file":"/npm/three@0.114.0/examples/js/controls/OrbitControls.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/three@0.114.0/examples/js/controls/OrbitControls.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * @author qiao / https://github.com/qiao\n * @author mrdoob / http://mrdoob.com\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author erich666 / http://erichaines.com\n * @author ScieCode / http://github.com/sciecode\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//\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\nTHREE.OrbitControls = function ( object, domElement ) {\n\n\tif ( domElement === undefined ) console.warn( 'THREE.OrbitControls: The second parameter \"domElement\" is now mandatory.' );\n\tif ( domElement === document ) console.error( 'THREE.OrbitControls: \"document\" should not be used as the target \"domElement\". Please use \"renderer.domElement\" instead.' );\n\n\tthis.object = object;\n\tthis.domElement = domElement;\n\n\t// Set to false to disable this control\n\tthis.enabled = true;\n\n\t// \"target\" sets the location of focus, where the object orbits around\n\tthis.target = new THREE.Vector3();\n\n\t// How far you can dolly in and out ( PerspectiveCamera only )\n\tthis.minDistance = 0;\n\tthis.maxDistance = Infinity;\n\n\t// How far you can zoom in and out ( OrthographicCamera only )\n\tthis.minZoom = 0;\n\tthis.maxZoom = Infinity;\n\n\t// How far you can orbit vertically, upper and lower limits.\n\t// Range is 0 to Math.PI radians.\n\tthis.minPolarAngle = 0; // radians\n\tthis.maxPolarAngle = Math.PI; // radians\n\n\t// How far you can orbit horizontally, upper and lower limits.\n\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\tthis.minAzimuthAngle = - Infinity; // radians\n\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t// Set to true to enable damping (inertia)\n\t// If damping is enabled, you must call controls.update() in your animation loop\n\tthis.enableDamping = false;\n\tthis.dampingFactor = 0.05;\n\n\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t// Set to false to disable zooming\n\tthis.enableZoom = true;\n\tthis.zoomSpeed = 1.0;\n\n\t// Set to false to disable rotating\n\tthis.enableRotate = true;\n\tthis.rotateSpeed = 1.0;\n\n\t// Set to false to disable panning\n\tthis.enablePan = true;\n\tthis.panSpeed = 1.0;\n\tthis.screenSpacePanning = false; // if true, pan in screen-space\n\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t// Set to true to automatically rotate around the target\n\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\tthis.autoRotate = false;\n\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t// Set to false to disable use of the keys\n\tthis.enableKeys = true;\n\n\t// The four arrow keys\n\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t// Mouse buttons\n\tthis.mouseButtons = { LEFT: THREE.MOUSE.ROTATE, MIDDLE: THREE.MOUSE.DOLLY, RIGHT: THREE.MOUSE.PAN };\n\n\t// Touch fingers\n\tthis.touches = { ONE: THREE.TOUCH.ROTATE, TWO: THREE.TOUCH.DOLLY_PAN };\n\n\t// for reset\n\tthis.target0 = this.target.clone();\n\tthis.position0 = this.object.position.clone();\n\tthis.zoom0 = this.object.zoom;\n\n\t//\n\t// public methods\n\t//\n\n\tthis.getPolarAngle = function () {\n\n\t\treturn spherical.phi;\n\n\t};\n\n\tthis.getAzimuthalAngle = function () {\n\n\t\treturn spherical.theta;\n\n\t};\n\n\tthis.saveState = function () {\n\n\t\tscope.target0.copy( scope.target );\n\t\tscope.position0.copy( scope.object.position );\n\t\tscope.zoom0 = scope.object.zoom;\n\n\t};\n\n\tthis.reset = function () {\n\n\t\tscope.target.copy( scope.target0 );\n\t\tscope.object.position.copy( scope.position0 );\n\t\tscope.object.zoom = scope.zoom0;\n\n\t\tscope.object.updateProjectionMatrix();\n\t\tscope.dispatchEvent( changeEvent );\n\n\t\tscope.update();\n\n\t\tstate = STATE.NONE;\n\n\t};\n\n\t// this method is exposed, but perhaps it would be better if we can make it private...\n\tthis.update = function () {\n\n\t\tvar offset = new THREE.Vector3();\n\n\t\t// so camera.up is the orbit axis\n\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\tvar quatInverse = quat.clone().inverse();\n\n\t\tvar lastPosition = new THREE.Vector3();\n\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\treturn function update() {\n\n\t\t\tvar position = scope.object.position;\n\n\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t// angle from z-axis around y-axis\n\t\t\tspherical.setFromVector3( offset );\n\n\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t}\n\n\t\t\tif ( scope.enableDamping ) {\n\n\t\t\t\tspherical.theta += sphericalDelta.theta * scope.dampingFactor;\n\t\t\t\tspherical.phi += sphericalDelta.phi * scope.dampingFactor;\n\n\t\t\t} else {\n\n\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\tspherical.phi += sphericalDelta.phi;\n\n\t\t\t}\n\n\t\t\t// restrict theta to be between desired limits\n\t\t\tspherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) );\n\n\t\t\t// restrict phi to be between desired limits\n\t\t\tspherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n\t\t\tspherical.makeSafe();\n\n\n\t\t\tspherical.radius *= scale;\n\n\t\t\t// restrict radius to be between desired limits\n\t\t\tspherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n\t\t\t// move target to panned location\n\n\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\tscope.target.addScaledVector( panOffset, scope.dampingFactor );\n\n\t\t\t} else {\n\n\t\t\t\tscope.target.add( panOffset );\n\n\t\t\t}\n\n\t\t\toffset.setFromSpherical( spherical );\n\n\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\tsphericalDelta.theta *= ( 1 - scope.dampingFactor );\n\t\t\t\tsphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n\t\t\t\tpanOffset.multiplyScalar( 1 - scope.dampingFactor );\n\n\t\t\t} else {\n\n\t\t\t\tsphericalDelta.set( 0, 0, 0 );\n\n\t\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t}\n\n\t\t\tscale = 1;\n\n\t\t\t// update condition is:\n\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\tif ( zoomChanged ||\n\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\tzoomChanged = false;\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t};\n\n\t}();\n\n\tthis.dispose = function () {\n\n\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.removeEventListener( 'wheel', onMouseWheel, false );\n\n\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\tscope.domElement.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t};\n\n\t//\n\t// internals\n\t//\n\n\tvar scope = this;\n\n\tvar changeEvent = { type: 'change' };\n\tvar startEvent = { type: 'start' };\n\tvar endEvent = { type: 'end' };\n\n\tvar STATE = {\n\t\tNONE: - 1,\n\t\tROTATE: 0,\n\t\tDOLLY: 1,\n\t\tPAN: 2,\n\t\tTOUCH_ROTATE: 3,\n\t\tTOUCH_PAN: 4,\n\t\tTOUCH_DOLLY_PAN: 5,\n\t\tTOUCH_DOLLY_ROTATE: 6\n\t};\n\n\tvar state = STATE.NONE;\n\n\tvar EPS = 0.000001;\n\n\t// current position in spherical coordinates\n\tvar spherical = new THREE.Spherical();\n\tvar sphericalDelta = new THREE.Spherical();\n\n\tvar scale = 1;\n\tvar panOffset = new THREE.Vector3();\n\tvar zoomChanged = false;\n\n\tvar rotateStart = new THREE.Vector2();\n\tvar rotateEnd = new THREE.Vector2();\n\tvar rotateDelta = new THREE.Vector2();\n\n\tvar panStart = new THREE.Vector2();\n\tvar panEnd = new THREE.Vector2();\n\tvar panDelta = new THREE.Vector2();\n\n\tvar dollyStart = new THREE.Vector2();\n\tvar dollyEnd = new THREE.Vector2();\n\tvar dollyDelta = new THREE.Vector2();\n\n\tfunction getAutoRotationAngle() {\n\n\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t}\n\n\tfunction getZoomScale() {\n\n\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t}\n\n\tfunction rotateLeft( angle ) {\n\n\t\tsphericalDelta.theta -= angle;\n\n\t}\n\n\tfunction rotateUp( angle ) {\n\n\t\tsphericalDelta.phi -= angle;\n\n\t}\n\n\tvar panLeft = function () {\n\n\t\tvar v = new THREE.Vector3();\n\n\t\treturn function panLeft( distance, objectMatrix ) {\n\n\t\t\tv.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t\tv.multiplyScalar( - distance );\n\n\t\t\tpanOffset.add( v );\n\n\t\t};\n\n\t}();\n\n\tvar panUp = function () {\n\n\t\tvar v = new THREE.Vector3();\n\n\t\treturn function panUp( distance, objectMatrix ) {\n\n\t\t\tif ( scope.screenSpacePanning === true ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 1 );\n\n\t\t\t} else {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 0 );\n\t\t\t\tv.crossVectors( scope.object.up, v );\n\n\t\t\t}\n\n\t\t\tv.multiplyScalar( distance );\n\n\t\t\tpanOffset.add( v );\n\n\t\t};\n\n\t}();\n\n\t// deltaX and deltaY are in pixels; right and down are positive\n\tvar pan = function () {\n\n\t\tvar offset = new THREE.Vector3();\n\n\t\treturn function pan( deltaX, deltaY ) {\n\n\t\t\tvar element = scope.domElement;\n\n\t\t\tif ( scope.object.isPerspectiveCamera ) {\n\n\t\t\t\t// perspective\n\t\t\t\tvar position = scope.object.position;\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t// we use only clientHeight here so aspect ratio does not distort speed\n\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t} else if ( scope.object.isOrthographicCamera ) {\n\n\t\t\t\t// orthographic\n\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n\t\t\t} else {\n\n\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\tscope.enablePan = false;\n\n\t\t\t}\n\n\t\t};\n\n\t}();\n\n\tfunction dollyIn( dollyScale ) {\n\n\t\tif ( scope.object.isPerspectiveCamera ) {\n\n\t\t\tscale /= dollyScale;\n\n\t\t} else if ( scope.object.isOrthographicCamera ) {\n\n\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tzoomChanged = true;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tscope.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\tfunction dollyOut( dollyScale ) {\n\n\t\tif ( scope.object.isPerspectiveCamera ) {\n\n\t\t\tscale *= dollyScale;\n\n\t\t} else if ( scope.object.isOrthographicCamera ) {\n\n\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tzoomChanged = true;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tscope.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\t//\n\t// event callbacks - update the object state\n\t//\n\n\tfunction handleMouseDownRotate( event ) {\n\n\t\trotateStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseDownDolly( event ) {\n\n\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseDownPan( event ) {\n\n\t\tpanStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseMoveRotate( event ) {\n\n\t\trotateEnd.set( event.clientX, event.clientY );\n\n\t\trotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\n\n\t\tvar element = scope.domElement;\n\n\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\n\n\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\n\n\t\trotateStart.copy( rotateEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseMoveDolly( event ) {\n\n\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t}\n\n\t\tdollyStart.copy( dollyEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseMovePan( event ) {\n\n\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\tpanDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\n\n\t\tpan( panDelta.x, panDelta.y );\n\n\t\tpanStart.copy( panEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseUp( /*event*/ ) {\n\n\t\t// no-op\n\n\t}\n\n\tfunction handleMouseWheel( event ) {\n\n\t\tif ( event.deltaY < 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t}\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleKeyDown( event ) {\n\n\t\tvar needsUpdate = false;\n\n\t\tswitch ( event.keyCode ) {\n\n\t\t\tcase scope.keys.UP:\n\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.LEFT:\n\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.RIGHT:\n\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\t// prevent the browser from scrolling on cursor keys\n\t\t\tevent.preventDefault();\n\n\t\t\tscope.update();\n\n\t\t}\n\n\n\t}\n\n\tfunction handleTouchStartRotate( event ) {\n\n\t\tif ( event.touches.length == 1 ) {\n\n\t\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t} else {\n\n\t\t\tvar x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );\n\t\t\tvar y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );\n\n\t\t\trotateStart.set( x, y );\n\n\t\t}\n\n\t}\n\n\tfunction handleTouchStartPan( event ) {\n\n\t\tif ( event.touches.length == 1 ) {\n\n\t\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t} else {\n\n\t\t\tvar x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );\n\t\t\tvar y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );\n\n\t\t\tpanStart.set( x, y );\n\n\t\t}\n\n\t}\n\n\tfunction handleTouchStartDolly( event ) {\n\n\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tdollyStart.set( 0, distance );\n\n\t}\n\n\tfunction handleTouchStartDollyPan( event ) {\n\n\t\tif ( scope.enableZoom ) handleTouchStartDolly( event );\n\n\t\tif ( scope.enablePan ) handleTouchStartPan( event );\n\n\t}\n\n\tfunction handleTouchStartDollyRotate( event ) {\n\n\t\tif ( scope.enableZoom ) handleTouchStartDolly( event );\n\n\t\tif ( scope.enableRotate ) handleTouchStartRotate( event );\n\n\t}\n\n\tfunction handleTouchMoveRotate( event ) {\n\n\t\tif ( event.touches.length == 1 ) {\n\n\t\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t} else {\n\n\t\t\tvar x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );\n\t\t\tvar y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );\n\n\t\t\trotateEnd.set( x, y );\n\n\t\t}\n\n\t\trotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\n\n\t\tvar element = scope.domElement;\n\n\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\n\n\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\n\n\t\trotateStart.copy( rotateEnd );\n\n\t}\n\n\tfunction handleTouchMovePan( event ) {\n\n\t\tif ( event.touches.length == 1 ) {\n\n\t\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t} else {\n\n\t\t\tvar x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );\n\t\t\tvar y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );\n\n\t\t\tpanEnd.set( x, y );\n\n\t\t}\n\n\t\tpanDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\n\n\t\tpan( panDelta.x, panDelta.y );\n\n\t\tpanStart.copy( panEnd );\n\n\t}\n\n\tfunction handleTouchMoveDolly( event ) {\n\n\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tdollyEnd.set( 0, distance );\n\n\t\tdollyDelta.set( 0, Math.pow( dollyEnd.y / dollyStart.y, scope.zoomSpeed ) );\n\n\t\tdollyIn( dollyDelta.y );\n\n\t\tdollyStart.copy( dollyEnd );\n\n\t}\n\n\tfunction handleTouchMoveDollyPan( event ) {\n\n\t\tif ( scope.enableZoom ) handleTouchMoveDolly( event );\n\n\t\tif ( scope.enablePan ) handleTouchMovePan( event );\n\n\t}\n\n\tfunction handleTouchMoveDollyRotate( event ) {\n\n\t\tif ( scope.enableZoom ) handleTouchMoveDolly( event );\n\n\t\tif ( scope.enableRotate ) handleTouchMoveRotate( event );\n\n\t}\n\n\tfunction handleTouchEnd( /*event*/ ) {\n\n\t\t// no-op\n\n\t}\n\n\t//\n\t// event handlers - FSM: listen for events and reset state\n\t//\n\n\tfunction onMouseDown( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\t// Prevent the browser from scrolling.\n\t\tevent.preventDefault();\n\n\t\t// Manually set the focus since calling preventDefault above\n\t\t// prevents the browser from setting it automatically.\n\n\t\tscope.domElement.focus ? scope.domElement.focus() : window.focus();\n\n\t\tvar mouseAction;\n\n\t\tswitch ( event.button ) {\n\n\t\t\tcase 0:\n\n\t\t\t\tmouseAction = scope.mouseButtons.LEFT;\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\n\t\t\t\tmouseAction = scope.mouseButtons.MIDDLE;\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\n\t\t\t\tmouseAction = scope.mouseButtons.RIGHT;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tmouseAction = - 1;\n\n\t\t}\n\n\t\tswitch ( mouseAction ) {\n\n\t\t\tcase THREE.MOUSE.DOLLY:\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseDownDolly( event );\n\n\t\t\t\tstate = STATE.DOLLY;\n\n\t\t\t\tbreak;\n\n\t\t\tcase THREE.MOUSE.ROTATE:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\t\tstate = STATE.PAN;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase THREE.MOUSE.PAN:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\t\tstate = STATE.PAN;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tif ( state !== STATE.NONE ) {\n\n\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t}\n\n\t}\n\n\tfunction onMouseMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t\tswitch ( state ) {\n\n\t\t\tcase STATE.ROTATE:\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseMoveRotate( event );\n\n\t\t\t\tbreak;\n\n\t\t\tcase STATE.DOLLY:\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseMoveDolly( event );\n\n\t\t\t\tbreak;\n\n\t\t\tcase STATE.PAN:\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseMovePan( event );\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction onMouseUp( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\thandleMouseUp( event );\n\n\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onMouseWheel( event ) {\n\n\t\tif ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tscope.dispatchEvent( startEvent );\n\n\t\thandleMouseWheel( event );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t}\n\n\tfunction onKeyDown( event ) {\n\n\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\thandleKeyDown( event );\n\n\t}\n\n\tfunction onTouchStart( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault(); // prevent scrolling\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1:\n\n\t\t\t\tswitch ( scope.touches.ONE ) {\n\n\t\t\t\t\tcase THREE.TOUCH.ROTATE:\n\n\t\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase THREE.TOUCH.PAN:\n\n\t\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\t\thandleTouchStartPan( event );\n\n\t\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\n\t\t\t\tswitch ( scope.touches.TWO ) {\n\n\t\t\t\t\tcase THREE.TOUCH.DOLLY_PAN:\n\n\t\t\t\t\t\tif ( scope.enableZoom === false && scope.enablePan === false ) return;\n\n\t\t\t\t\t\thandleTouchStartDollyPan( event );\n\n\t\t\t\t\t\tstate = STATE.TOUCH_DOLLY_PAN;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase THREE.TOUCH.DOLLY_ROTATE:\n\n\t\t\t\t\t\tif ( scope.enableZoom === false && scope.enableRotate === false ) return;\n\n\t\t\t\t\t\thandleTouchStartDollyRotate( event );\n\n\t\t\t\t\t\tstate = STATE.TOUCH_DOLLY_ROTATE;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tif ( state !== STATE.NONE ) {\n\n\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t}\n\n\t}\n\n\tfunction onTouchMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault(); // prevent scrolling\n\t\tevent.stopPropagation();\n\n\t\tswitch ( state ) {\n\n\t\t\tcase STATE.TOUCH_ROTATE:\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\tscope.update();\n\n\t\t\t\tbreak;\n\n\t\t\tcase STATE.TOUCH_PAN:\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\tscope.update();\n\n\t\t\t\tbreak;\n\n\t\t\tcase STATE.TOUCH_DOLLY_PAN:\n\n\t\t\t\tif ( scope.enableZoom === false && scope.enablePan === false ) return;\n\n\t\t\t\thandleTouchMoveDollyPan( event );\n\n\t\t\t\tscope.update();\n\n\t\t\t\tbreak;\n\n\t\t\tcase STATE.TOUCH_DOLLY_ROTATE:\n\n\t\t\t\tif ( scope.enableZoom === false && scope.enableRotate === false ) return;\n\n\t\t\t\thandleTouchMoveDollyRotate( event );\n\n\t\t\t\tscope.update();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t}\n\n\tfunction onTouchEnd( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\thandleTouchEnd( event );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onContextMenu( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t}\n\n\t//\n\n\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\tscope.domElement.addEventListener( 'wheel', onMouseWheel, false );\n\n\tscope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\tscope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\tscope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\tscope.domElement.addEventListener( 'keydown', onKeyDown, false );\n\n\t// make sure element can receive keys.\n\n\tif ( scope.domElement.tabIndex === - 1 ) {\n\n\t\tscope.domElement.tabIndex = 0;\n\n\t}\n\n\t// force an update at start\n\n\tthis.update();\n\n};\n\nTHREE.OrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\nTHREE.OrbitControls.prototype.constructor = THREE.OrbitControls;\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\nTHREE.MapControls = function ( object, domElement ) {\n\n\tTHREE.OrbitControls.call( this, object, domElement );\n\n\tthis.mouseButtons.LEFT = THREE.MOUSE.PAN;\n\tthis.mouseButtons.RIGHT = THREE.MOUSE.ROTATE;\n\n\tthis.touches.ONE = THREE.TOUCH.PAN;\n\tthis.touches.TWO = THREE.TOUCH.DOLLY_ROTATE;\n\n};\n\nTHREE.MapControls.prototype = Object.create( THREE.EventDispatcher.prototype );\nTHREE.MapControls.prototype.constructor = THREE.MapControls;\n"]}