{"mappings":"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","names":["EventDispatcher","MOUSE","Quaternion","Spherical","TOUCH","Vector2","Vector3","Plane","Ray","MathUtils","_changeEvent","_startEvent","_endEvent","_ray","_plane","TILT_LIMIT","OrbitControls","object","domElement","spherical","onKeyDown","scope","state","STATE","offset","quat","quatInverse","lastPosition","lastQuaternion","lastTargetPosition","twoPI","deltaTime","position","rotateLeft","getAutoRotationAngle","sphericalDelta","min","max","panOffset","performCursorZoom","clampDistance","scale","zoomChanged","newRadius","prevRadius","radiusDelta","dollyDirection","mouseBefore","mouse","mouseAfter","EPS","onContextMenu","onPointerDown","onPointerUp","onMouseWheel","onPointerMove","rotateStart","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","pointers","pointerPositions","getZoomScale","delta","normalized_delta","angle","rotateUp","panLeft","v","distance","objectMatrix","panUp","pan","deltaX","deltaY","element","targetDistance","dollyOut","dollyScale","dollyIn","updateZoomParameters","x","y","rect","dx","dy","w","h","dist","handleMouseDownRotate","event","handleMouseDownDolly","handleMouseDownPan","handleMouseMoveRotate","handleMouseMoveDolly","handleMouseMovePan","handleMouseWheel","handleKeyDown","needsUpdate","handleTouchStartRotate","getSecondPointerPosition","handleTouchStartPan","handleTouchStartDolly","handleTouchStartDollyPan","handleTouchStartDollyRotate","handleTouchMoveRotate","handleTouchMovePan","handleTouchMoveDolly","centerX","centerY","handleTouchMoveDollyPan","handleTouchMoveDollyRotate","addPointer","onTouchStart","onMouseDown","onTouchMove","onMouseMove","removePointer","mouseAction","trackPointer","i","pointerId"],"sources":["../esm/npm/three@0.160.0/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\tPlane,\n\tRay,\n\tMathUtils\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' };\nconst _ray = new Ray();\nconst _plane = new Plane();\nconst TILT_LIMIT = Math.cos( 70 * MathUtils.DEG2RAD );\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// Sets the 3D cursor (similar to Blender), from which the maxTargetRadius takes effect\n\t\tthis.cursor = 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// Limit camera target within a spherical area around the cursor\n\t\tthis.minTargetRadius = 0;\n\t\tthis.maxTargetRadius = 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 \u003c 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\t\tthis.zoomToCursor = false;\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( deltaTime = null ) {\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 \u0026\u0026 state === STATE.NONE ) {\n\n\t\t\t\t\trotateLeft( getAutoRotationAngle( deltaTime ) );\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 ) \u0026\u0026 isFinite( max ) ) {\n\n\t\t\t\t\tif ( min \u003c - Math.PI ) min += twoPI; else if ( min \u003e Math.PI ) min -= twoPI;\n\n\t\t\t\t\tif ( max \u003c - Math.PI ) max += twoPI; else if ( max \u003e Math.PI ) max -= twoPI;\n\n\t\t\t\t\tif ( min \u003c= 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 \u003e ( 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\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\t// Limit the target distance from the cursor to create a sphere around the center of interest\n\t\t\t\tscope.target.sub( scope.cursor );\n\t\t\t\tscope.target.clampLength( scope.minTargetRadius, scope.maxTargetRadius );\n\t\t\t\tscope.target.add( scope.cursor );\n\n\t\t\t\t// adjust the camera position based on zoom only if we're not zooming to the cursor or if it's an ortho camera\n\t\t\t\t// we adjust zoom later in these cases\n\t\t\t\tif ( scope.zoomToCursor \u0026\u0026 performCursorZoom || scope.object.isOrthographicCamera ) {\n\n\t\t\t\t\tspherical.radius = clampDistance( spherical.radius );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tspherical.radius = clampDistance( spherical.radius * scale );\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\t// adjust camera position\n\t\t\t\tlet zoomChanged = false;\n\t\t\t\tif ( scope.zoomToCursor \u0026\u0026 performCursorZoom ) {\n\n\t\t\t\t\tlet newRadius = null;\n\t\t\t\t\tif ( scope.object.isPerspectiveCamera ) {\n\n\t\t\t\t\t\t// move the camera down the pointer ray\n\t\t\t\t\t\t// this method avoids floating point error\n\t\t\t\t\t\tconst prevRadius = offset.length();\n\t\t\t\t\t\tnewRadius = clampDistance( prevRadius * scale );\n\n\t\t\t\t\t\tconst radiusDelta = prevRadius - newRadius;\n\t\t\t\t\t\tscope.object.position.addScaledVector( dollyDirection, radiusDelta );\n\t\t\t\t\t\tscope.object.updateMatrixWorld();\n\n\t\t\t\t\t} else if ( scope.object.isOrthographicCamera ) {\n\n\t\t\t\t\t\t// adjust the ortho camera position based on zoom changes\n\t\t\t\t\t\tconst mouseBefore = new Vector3( mouse.x, mouse.y, 0 );\n\t\t\t\t\t\tmouseBefore.unproject( scope.object );\n\n\t\t\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / scale ) );\n\t\t\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\t\t\tzoomChanged = true;\n\n\t\t\t\t\t\tconst mouseAfter = new Vector3( mouse.x, mouse.y, 0 );\n\t\t\t\t\t\tmouseAfter.unproject( scope.object );\n\n\t\t\t\t\t\tscope.object.position.sub( mouseAfter ).add( mouseBefore );\n\t\t\t\t\t\tscope.object.updateMatrixWorld();\n\n\t\t\t\t\t\tnewRadius = offset.length();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled.' );\n\t\t\t\t\t\tscope.zoomToCursor = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// handle the placement of the target\n\t\t\t\t\tif ( newRadius !== null ) {\n\n\t\t\t\t\t\tif ( this.screenSpacePanning ) {\n\n\t\t\t\t\t\t\t// position the orbit target in front of the new camera position\n\t\t\t\t\t\t\tscope.target.set( 0, 0, - 1 )\n\t\t\t\t\t\t\t\t.transformDirection( scope.object.matrix )\n\t\t\t\t\t\t\t\t.multiplyScalar( newRadius )\n\t\t\t\t\t\t\t\t.add( scope.object.position );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// get the ray and translation plane to compute target\n\t\t\t\t\t\t\t_ray.origin.copy( scope.object.position );\n\t\t\t\t\t\t\t_ray.direction.set( 0, 0, - 1 ).transformDirection( scope.object.matrix );\n\n\t\t\t\t\t\t\t// if the camera is 20 degrees above the horizon then don't adjust the focus target to avoid\n\t\t\t\t\t\t\t// extremely large values\n\t\t\t\t\t\t\tif ( Math.abs( scope.object.up.dot( _ray.direction ) ) \u003c TILT_LIMIT ) {\n\n\t\t\t\t\t\t\t\tobject.lookAt( scope.target );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t_plane.setFromNormalAndCoplanarPoint( scope.object.up, scope.target );\n\t\t\t\t\t\t\t\t_ray.intersectPlane( _plane, scope.target );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( scope.object.isOrthographicCamera ) {\n\n\t\t\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / scale ) );\n\t\t\t\t\tscope.object.updateProjectionMatrix();\n\t\t\t\t\tzoomChanged = true;\n\n\t\t\t\t}\n\n\t\t\t\tscale = 1;\n\t\t\t\tperformCursorZoom = false;\n\n\t\t\t\t// update condition is:\n\t\t\t\t// min(camera displacement, camera rotation in radians)^2 \u003e 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 ) \u003e EPS ||\n\t\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) \u003e EPS ||\n\t\t\t\t\tlastTargetPosition.distanceToSquared( scope.target ) \u003e 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\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\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 dollyDirection = new Vector3();\n\t\tconst mouse = new Vector2();\n\t\tlet performCursorZoom = false;\n\n\t\tconst pointers = [];\n\t\tconst pointerPositions = {};\n\n\t\tfunction getAutoRotationAngle( deltaTime ) {\n\n\t\t\tif ( deltaTime !== null ) {\n\n\t\t\t\treturn ( 2 * Math.PI / 60 * scope.autoRotateSpeed ) * deltaTime;\n\n\t\t\t} else {\n\n\t\t\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getZoomScale( delta ) {\n\n\t\t\tconst normalized_delta = Math.abs( delta ) / ( 100 * ( window.devicePixelRatio | 0 ) );\n\t\t\treturn Math.pow( 0.95, scope.zoomSpeed * normalized_delta );\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 || scope.object.isOrthographicCamera ) {\n\n\t\t\t\tscale /= dollyScale;\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 || scope.object.isOrthographicCamera ) {\n\n\t\t\t\tscale *= dollyScale;\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 updateZoomParameters( x, y ) {\n\n\t\t\tif ( ! scope.zoomToCursor ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tperformCursorZoom = true;\n\n\t\t\tconst rect = scope.domElement.getBoundingClientRect();\n\t\t\tconst dx = x - rect.left;\n\t\t\tconst dy = y - rect.top;\n\t\t\tconst w = rect.width;\n\t\t\tconst h = rect.height;\n\n\t\t\tmouse.x = ( dx / w ) * 2 - 1;\n\t\t\tmouse.y = - ( dy / h ) * 2 + 1;\n\n\t\t\tdollyDirection.set( mouse.x, mouse.y, 1 ).unproject( scope.object ).sub( scope.object.position ).normalize();\n\n\t\t}\n\n\t\tfunction clampDistance( dist ) {\n\n\t\t\treturn Math.max( scope.minDistance, Math.min( scope.maxDistance, dist ) );\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\tupdateZoomParameters( event.clientX, event.clientX );\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 \u003e 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale( dollyDelta.y ) );\n\n\t\t\t} else if ( dollyDelta.y \u003c 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale( dollyDelta.y ) );\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\tupdateZoomParameters( event.clientX, event.clientY );\n\n\t\t\tif ( event.deltaY \u003c 0 ) {\n\n\t\t\t\tdollyIn( getZoomScale( event.deltaY ) );\n\n\t\t\t} else if ( event.deltaY \u003e 0 ) {\n\n\t\t\t\tdollyOut( getZoomScale( event.deltaY ) );\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( event ) {\n\n\t\t\tif ( pointers.length === 1 ) {\n\n\t\t\t\trotateStart.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\trotateStart.set( x, y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction handleTouchStartPan( event ) {\n\n\t\t\tif ( pointers.length === 1 ) {\n\n\t\t\t\tpanStart.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\tpanStart.set( x, y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction handleTouchStartDolly( 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\tdollyStart.set( 0, distance );\n\n\t\t}\n\n\t\tfunction handleTouchStartDollyPan( event ) {\n\n\t\t\tif ( scope.enableZoom ) handleTouchStartDolly( event );\n\n\t\t\tif ( scope.enablePan ) handleTouchStartPan( event );\n\n\t\t}\n\n\t\tfunction handleTouchStartDollyRotate( event ) {\n\n\t\t\tif ( scope.enableZoom ) handleTouchStartDolly( event );\n\n\t\t\tif ( scope.enableRotate ) handleTouchStartRotate( event );\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\tconst centerX = ( event.pageX + position.x ) * 0.5;\n\t\t\tconst centerY = ( event.pageY + position.y ) * 0.5;\n\n\t\t\tupdateZoomParameters( centerX, centerY );\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( event );\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( event );\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 \u0026\u0026 scope.enablePan === false ) return;\n\n\t\t\t\t\t\t\thandleTouchStartDollyPan( event );\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 \u0026\u0026 scope.enableRotate === false ) return;\n\n\t\t\t\t\t\t\thandleTouchStartDollyRotate( event );\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 \u0026\u0026 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 \u0026\u0026 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.pointerId );\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 \u003c pointers.length; i ++ ) {\n\n\t\t\t\tif ( pointers[ i ] == 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 pointerId = ( event.pointerId === pointers[ 0 ] ) ? pointers[ 1 ] : pointers[ 0 ];\n\n\t\t\treturn pointerPositions[ 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"],"version":3}
