{"version":3,"sources":["jsdelivr-header.js","/npm/three-trackballcontrols@0.9.0/index.js"],"names":[],"mappings":"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","file":"/npm/three-trackballcontrols@0.9.0/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.37.0.\n * Original file: /npm/three-trackballcontrols@0.9.0/index.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 Eberhard Graether / http://egraether.com/\n * @author Mark Lundin \t/ http://mark-lundin.com\n * @author Simone Manini / http://daron1337.github.io\n * @author Luca Antiga \t/ http://lantiga.github.io\n\n ** three-trackballcontrols module\n ** @author Jon Lim / https://jonlim.ca\n */\n\nconst THREE = window.THREE || require('three');\n\nconst TrackballControls = function (object, domElement) {\n  // Pre-flight checks, with warnings / errors.\n  if (domElement === undefined) console.warn('THREE.TrackballControls: The second parameter \"domElement\" is now mandatory.');\n  if (domElement === document) console.error('THREE.TrackballControls: \"document\" should not be used as the target \"domElement\". Please use \"renderer.domElement\" instead.');\n\n  const scope = this;\n  const STATE = {\n    NONE: -1,\n    ROTATE: 0,\n    ZOOM: 1,\n    PAN: 2,\n    TOUCH_ROTATE: 3,\n    TOUCH_ZOOM_PAN: 4,\n  };\n\n  this.object = object;\n  this.domElement = domElement;\n\n  // API\n\n  this.enabled = true;\n\n  this.screen = { left: 0, top: 0, width: 0, height: 0 };\n\n  this.rotateSpeed = 1.0;\n  this.zoomSpeed = 1.2;\n  this.panSpeed = 0.3;\n\n  this.noRotate = false;\n  this.noZoom = false;\n  this.noPan = false;\n\n  this.staticMoving = false;\n  this.dynamicDampingFactor = 0.2;\n\n  this.minDistance = 0;\n  this.maxDistance = Infinity;\n\n  /**\n   * `KeyboardEvent.keyCode` values which should trigger the different \n   * interaction states. Each element can be a single code or an array\n   * of codes. All elements are required.\n   */\n  this.keys = [\n    65, // A \n    83, // S \n    68, // D\n  ];\n\n  /**\n   * `Event` for pointer interactions which should trigger different\n   * interaction states.\n   */\n  this.mouseButtons = { \n    LEFT: THREE.MOUSE.ROTATE, \n    MIDDLE: THREE.MOUSE.ZOOM, \n    RIGHT: THREE.MOUSE.PAN,\n  };\n\n  // internals\n\n  this.target = new THREE.Vector3();\n\n  const EPS = 0.000001;\n\n  const lastPosition = new THREE.Vector3();\n\n  let _state = STATE.NONE,\n    _keyState = STATE.NONE,\n\n    _eye = new THREE.Vector3(),\n\n    _movePrev = new THREE.Vector2(),\n    _moveCurr = new THREE.Vector2(),\n\n    _lastAxis = new THREE.Vector3(),\n    _lastAngle = 0,\n\n    _zoomStart = new THREE.Vector2(),\n    _zoomEnd = new THREE.Vector2(),\n\n    _touchZoomDistanceStart = 0,\n    _touchZoomDistanceEnd = 0,\n\n    _panStart = new THREE.Vector2(),\n    _panEnd = new THREE.Vector2();\n\n  // for reset\n\n  this.target0 = this.target.clone();\n  this.position0 = this.object.position.clone();\n  this.up0 = this.object.up.clone();\n  this.zoom0 = this.object.zoom;\n\n  // events\n\n  var changeEvent = { type: 'change' };\n  var startEvent = { type: 'start' };\n  var endEvent = { type: 'end' };\n\n  // methods\n\n  this.handleResize = function () {\n\n    const box = scope.domElement.getBoundingClientRect();\n    // Adjustments come from similar code in the jquery offset() function.\n    const d = scope.domElement.ownerDocument.documentElement;\n    scope.screen.left = box.left + window.pageXOffset - d.clientLeft;\n    scope.screen.top = box.top + window.pageYOffset - d.clientTop;\n    scope.screen.width = box.width;\n    scope.screen.height = box.height;\n\n  };\n\n  const getMouseOnScreen = (function () {\n\n    const vector = new THREE.Vector2();\n    return function getMouseOnScreen(pageX, pageY) {\n      vector.set(\n        (pageX - scope.screen.left) / scope.screen.width,\n        (pageY - scope.screen.top) / scope.screen.height,\n      );\n\n      return vector;\n    };\n\n  }());\n\n  const getMouseOnCircle = (function () {\n\n    const vector = new THREE.Vector2();\n    return function getMouseOnCircle(pageX, pageY) {\n      vector.set(\n        ((pageX - scope.screen.width * 0.5 - scope.screen.left) / (scope.screen.width * 0.5)),\n        ((scope.screen.height + 2 * (scope.screen.top - pageY)) / scope.screen.width), // screen.width intentional\n      );\n\n      return vector;\n    };\n\n  }());\n\n  this.rotateCamera = (function () {\n\n    let axis = new THREE.Vector3(),\n      quaternion = new THREE.Quaternion(),\n      eyeDirection = new THREE.Vector3(),\n      objectUpDirection = new THREE.Vector3(),\n      objectSidewaysDirection = new THREE.Vector3(),\n      moveDirection = new THREE.Vector3(),\n      angle;\n\n    return function rotateCamera() {\n      moveDirection.set(_moveCurr.x - _movePrev.x, _moveCurr.y - _movePrev.y, 0);\n      angle = moveDirection.length();\n\n      if (angle) {\n\n        _eye.copy(scope.object.position).sub(scope.target);\n\n        eyeDirection.copy(_eye).normalize();\n        objectUpDirection.copy(scope.object.up).normalize();\n        objectSidewaysDirection.crossVectors(objectUpDirection, eyeDirection).normalize();\n\n        objectUpDirection.setLength(_moveCurr.y - _movePrev.y);\n        objectSidewaysDirection.setLength(_moveCurr.x - _movePrev.x);\n\n        moveDirection.copy(objectUpDirection.add(objectSidewaysDirection));\n\n        axis.crossVectors(moveDirection, _eye).normalize();\n\n        angle *= scope.rotateSpeed;\n        quaternion.setFromAxisAngle(axis, angle);\n\n        _eye.applyQuaternion(quaternion);\n        scope.object.up.applyQuaternion(quaternion);\n\n        _lastAxis.copy(axis);\n        _lastAngle = angle;\n\n      } else if (!scope.staticMoving && _lastAngle) {\n\n        _lastAngle *= Math.sqrt(1.0 - scope.dynamicDampingFactor);\n        _eye.copy(scope.object.position).sub(scope.target);\n        quaternion.setFromAxisAngle(_lastAxis, _lastAngle);\n        _eye.applyQuaternion(quaternion);\n        scope.object.up.applyQuaternion(quaternion);\n\n      }\n\n      _movePrev.copy(_moveCurr);\n    };\n\n  }());\n\n\n  this.zoomCamera = function () {\n\n    let factor;\n\n    if (_state === STATE.TOUCH_ZOOM_PAN) {\n\n      factor = _touchZoomDistanceStart / _touchZoomDistanceEnd;\n      _touchZoomDistanceStart = _touchZoomDistanceEnd;\n      _eye.multiplyScalar(factor);\n\n    } else {\n\n      factor = 1.0 + (_zoomEnd.y - _zoomStart.y) * scope.zoomSpeed;\n      if (factor !== 1.0 && factor > 0.0) {\n        _eye.multiplyScalar(factor);\n      }\n\n      if (scope.staticMoving) {\n        _zoomStart.copy(_zoomEnd);\n      } else {\n        _zoomStart.y += (_zoomEnd.y - _zoomStart.y) * this.dynamicDampingFactor;\n      }\n\n    }\n\n  };\n\n  this.panCamera = (function () {\n\n    let mouseChange = new THREE.Vector2(),\n      objectUp = new THREE.Vector3(),\n      pan = new THREE.Vector3();\n\n    return function panCamera() {\n      mouseChange.copy(_panEnd).sub(_panStart);\n\n      if (mouseChange.lengthSq()) {\n        mouseChange.multiplyScalar(_eye.length() * scope.panSpeed);\n\n        pan.copy(_eye).cross(scope.object.up).setLength(mouseChange.x);\n        pan.add(objectUp.copy(scope.object.up).setLength(mouseChange.y));\n\n        scope.object.position.add(pan);\n        scope.target.add(pan);\n\n        if (scope.staticMoving) {\n          _panStart.copy(_panEnd);\n        } else {\n          _panStart.add(mouseChange.subVectors(_panEnd, _panStart).multiplyScalar(scope.dynamicDampingFactor));\n        }\n      }\n\n    };\n\n  }());\n\n  this.checkDistances = function () {\n\n    if (!scope.noZoom || !scope.noPan) {\n\n      if (_eye.lengthSq() > scope.maxDistance * scope.maxDistance) {\n        scope.object.position.addVectors(scope.target, _eye.setLength(scope.maxDistance));\n        _zoomStart.copy(_zoomEnd);\n      }\n\n      if (_eye.lengthSq() < scope.minDistance * scope.minDistance) {\n        scope.object.position.addVectors(scope.target, _eye.setLength(scope.minDistance));\n        _zoomStart.copy(_zoomEnd);\n      }\n\n    }\n\n  };\n\n  this.update = function () {\n\n    _eye.subVectors(scope.object.position, scope.target);\n\n    if (!scope.noRotate) {\n      scope.rotateCamera();\n    }\n\n    if (!scope.noZoom) {\n      scope.zoomCamera();\n    }\n\n    if (!scope.noPan) {\n      scope.panCamera();\n    }\n\n    scope.object.position.addVectors(scope.target, _eye);\n    scope.checkDistances();\n    scope.object.lookAt(scope.target);\n\n    if (lastPosition.distanceToSquared(scope.object.position) > EPS) {\n      scope.dispatchEvent(changeEvent);\n      lastPosition.copy(scope.object.position);\n    }\n\n  };\n\n  this.reset = function () {\n\n    _state = STATE.NONE;\n    _keyState = STATE.NONE;\n\n    scope.target.copy(scope.target0);\n    scope.object.position.copy(scope.position0);\n    scope.object.up.copy(scope.up0);\n\n    _eye.subVectors(scope.object.position, scope.target);\n\n    scope.object.lookAt(scope.target);\n\n    scope.dispatchEvent(changeEvent);\n\n    lastPosition.copy(scope.object.position);\n\n  };\n\n  // Listeners\n\n  function onPointerDown( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tswitch ( event.pointerType ) {\n\n\t\t\tcase 'mouse':\n\t\t\tcase 'pen':\n\t\t\t\tonMouseDown( event );\n\t\t\t\tbreak;\n\n\t\t\t// TODO touch\n\n\t\t}\n\n\t}\n\n  function onPointerMove(event) {\n\n    if (scope.enabled === false) return;\n\n    switch (event.pointerType) {\n\n      case 'mouse':\n      case 'pen':\n        onMouseMove(event);\n        break;\n\n      // TODO touch\n\n    }\n\n  }\n\n  function onPointerUp(event) {\n\n    if (scope.enabled === false) return;\n\n    switch (event.pointerType) {\n\n      case 'mouse':\n      case 'pen':\n        onMouseUp(event);\n        break;\n\n      // TODO touch\n\n    }\n\n  }\n\n  function keydown(event) {\n\n    if (scope.enabled === false) return;\n\n    window.removeEventListener('keydown', keydown);\n\n    if (_keyState !== STATE.NONE) {\n      return;\n    } else if (event.keyCode === scope.keys[STATE.ROTATE] && !scope.noRotate) {\n      _keyState = STATE.ROTATE;\n    } else if (event.keyCode === scope.keys[STATE.ZOOM] && !scope.noZoom) {\n      _keyState = STATE.ZOOM;\n    } else if (event.keyCode === scope.keys[STATE.PAN] && !scope.noPan) {\n      _keyState = STATE.PAN;\n    }\n\n  }\n\n  function keyup() {\n\n    if (scope.enabled === false) return;\n\n    _keyState = STATE.NONE;\n\n    window.addEventListener('keydown', keydown, false);\n\n  }\n\n  function onMouseDown(event) {\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    if (_state === STATE.NONE) {\n\n      switch (event.button) {\n        case scope.mouseButtons.LEFT:\n          _state = STATE.ROTATE;\n          break;\n\n        case scope.mouseButtons.MIDDLE:\n          _state = STATE.ZOOM;\n          break;\n\n        case scope.mouseButtons.RIGHT:\n          _state = STATE.PAN;\n          break;\n\n        default:\n          _state = STATE.NONE;\n      }\n\n    }\n\n    const state = (_keyState !== STATE.NONE) ? _keyState : _state;\n\n    if (state === STATE.ROTATE && !scope.noRotate) {\n\n      _moveCurr.copy(getMouseOnCircle(event.pageX, event.pageY));\n      _movePrev.copy(_moveCurr);\n\n    } else if (state === STATE.ZOOM && !scope.noZoom) {\n\n      _zoomStart.copy(getMouseOnScreen(event.pageX, event.pageY));\n      _zoomEnd.copy(_zoomStart);\n\n    } else if (state === STATE.PAN && !scope.noPan) {\n\n      _panStart.copy(getMouseOnScreen(event.pageX, event.pageY));\n      _panEnd.copy(_panStart);\n\n    }\n\n    scope.domElement.ownerDocument.addEventListener('pointermove', onPointerMove, false);\n    scope.domElement.ownerDocument.addEventListener('pointerup', onPointerUp, false);\n\n    scope.dispatchEvent(startEvent);\n\n  }\n\n  function onMouseMove(event) {\n\n    if (scope.enabled === false) return;\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    const state = (_keyState !== STATE.NONE) ? _keyState : _state;\n\n    if (state === STATE.ROTATE && !scope.noRotate) {\n\n      _movePrev.copy(_moveCurr);\n      _moveCurr.copy(getMouseOnCircle(event.pageX, event.pageY));\n\n    } else if (state === STATE.ZOOM && !scope.noZoom) {\n\n      _zoomEnd.copy(getMouseOnScreen(event.pageX, event.pageY));\n\n    } else if (state === STATE.PAN && !scope.noPan) {\n\n      _panEnd.copy(getMouseOnScreen(event.pageX, event.pageY));\n\n    }\n\n  }\n\n  function onMouseUp(event) {\n\n    if (scope.enabled === false) return;\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    _state = STATE.NONE;\n\n    scope.domElement.ownerDocument.removeEventListener('pointermove', onPointerMove);\n    scope.domElement.ownerDocument.removeEventListener('pointerup', onPointerUp);\n    scope.dispatchEvent(endEvent);\n\n  }\n\n  function mousewheel(event) {\n\n    if (scope.enabled === false) return;\n    if (scope.noZoom === true) return;\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    switch (event.deltaMode) {\n\n      case 2:\n        // Zoom in pages\n        _zoomStart.y -= event.deltaY * 0.025;\n        break;\n\n      case 1:\n        // Zoom in lines\n        _zoomStart.y -= event.deltaY * 0.01;\n        break;\n\n      default:\n        // undefined, 0, assume pixels\n        _zoomStart.y -= event.deltaY * 0.00025;\n        break;\n\n    }\n\n    scope.dispatchEvent(startEvent);\n    scope.dispatchEvent(endEvent);\n\n  }\n\n  function touchstart(event) {\n\n    if (scope.enabled === false) return;\n\n    event.preventDefault();\n\n    switch (event.touches.length) {\n\n      case 1:\n        _state = STATE.TOUCH_ROTATE;\n        _moveCurr.copy(getMouseOnCircle(event.touches[0].pageX, event.touches[0].pageY));\n        _movePrev.copy(_moveCurr);\n        break;\n\n      default: // 2 or more\n        _state = STATE.TOUCH_ZOOM_PAN;\n        var dx = event.touches[0].pageX - event.touches[1].pageX;\n        var dy = event.touches[0].pageY - event.touches[1].pageY;\n        _touchZoomDistanceEnd = _touchZoomDistanceStart = Math.sqrt(dx * dx + dy * dy);\n\n        var x = (event.touches[0].pageX + event.touches[1].pageX) / 2;\n        var y = (event.touches[0].pageY + event.touches[1].pageY) / 2;\n        _panStart.copy(getMouseOnScreen(x, y));\n        _panEnd.copy(_panStart);\n        break;\n\n    }\n\n    scope.dispatchEvent(startEvent);\n\n  }\n\n  function touchmove(event) {\n\n    if (scope.enabled === false) return;\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    switch (event.touches.length) {\n\n      case 1:\n        _movePrev.copy(_moveCurr);\n        _moveCurr.copy(getMouseOnCircle(event.touches[0].pageX, event.touches[0].pageY));\n        break;\n\n      default: // 2 or more\n        var dx = event.touches[0].pageX - event.touches[1].pageX;\n        var dy = event.touches[0].pageY - event.touches[1].pageY;\n        _touchZoomDistanceEnd = Math.sqrt(dx * dx + dy * dy);\n\n        var x = (event.touches[0].pageX + event.touches[1].pageX) / 2;\n        var y = (event.touches[0].pageY + event.touches[1].pageY) / 2;\n        _panEnd.copy(getMouseOnScreen(x, y));\n        break;\n\n    }\n\n  }\n\n  function touchend(event) {\n\n    if (scope.enabled === false) return;\n\n    switch (event.touches.length) {\n\n      case 0:\n        _state = STATE.NONE;\n        break;\n\n      case 1:\n        _state = STATE.TOUCH_ROTATE;\n        _moveCurr.copy(getMouseOnCircle(event.touches[0].pageX, event.touches[0].pageY));\n        _movePrev.copy(_moveCurr);\n        break;\n\n    }\n\n    scope.dispatchEvent(endEvent);\n\n  }\n\n  function contextmenu(event) {\n\n    if (scope.enabled === false) return;\n\n    event.preventDefault();\n\n  }\n\n  this.dispose = function () {\n\n    scope.domElement.removeEventListener('contextmenu', contextmenu, false);\n    scope.domElement.removeEventListener('pointerdown', onPointerDown, false);\n    scope.domElement.removeEventListener('wheel', mousewheel, false);\n\n    scope.domElement.removeEventListener('touchstart', touchstart, false);\n    scope.domElement.removeEventListener('touchend', touchend, false);\n    scope.domElement.removeEventListener('touchmove', touchmove, false);\n\n    scope.domElement.ownerDocument.removeEventListener( 'pointermove', onPointerMove, false );\n\t\tscope.domElement.ownerDocument.removeEventListener( 'pointerup', onPointerUp, false );\n\n    window.removeEventListener('keydown', keydown, false);\n    window.removeEventListener('keyup', keyup, false);\n\n  };\n\n  this.domElement.addEventListener('contextmenu', contextmenu, false);\n\n  this.domElement.addEventListener('pointerdown', onPointerDown, false);\n  this.domElement.addEventListener('wheel', mousewheel, false);\n\n  this.domElement.addEventListener('touchstart', touchstart, false);\n  this.domElement.addEventListener('touchend', touchend, false);\n  this.domElement.addEventListener('touchmove', touchmove, false);\n\n  this.domElement.ownerDocument.addEventListener( 'pointermove', onPointerMove, false );\n\tthis.domElement.ownerDocument.addEventListener( 'pointerup', onPointerUp, false );\n\n  window.addEventListener('keydown', keydown, false);\n  window.addEventListener('keyup', keyup, false);\n\n  this.handleResize();\n\n  // force an update at start\n  this.update();\n\n};\n\nTrackballControls.prototype = Object.create(THREE.EventDispatcher.prototype);\nTrackballControls.prototype.constructor = TrackballControls;\n\nexport default TrackballControls;"]}