UNPKG

ami-cjs.js

Version:

<p align="center"> <img src="https://cloud.githubusercontent.com/assets/214063/23213764/78ade038-f90c-11e6-8208-4fcade5f3832.png" width="60%"> </p>

471 lines (338 loc) 14.1 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** * @author Eberhard Graether / http://egraether.com/ * @author Mark Lundin / http://mark-lundin.com * @author Patrick Fuller / http://patrick-fuller.com * @author Max Smolens / https://github.com/msmolens */ var Trackballortho = function (_THREE$EventDispatche) { _inherits(Trackballortho, _THREE$EventDispatche); function Trackballortho(object, domElement) { var state = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : { NONE: -1, ROTATE: 1, ZOOM: 2, PAN: 0, SCROLL: 4, TOUCH_ROTATE: 4, TOUCH_ZOOM_PAN: 5 }; _classCallCheck(this, Trackballortho); var _this2 = _possibleConstructorReturn(this, (Trackballortho.__proto__ || Object.getPrototypeOf(Trackballortho)).call(this)); var _this = _this2; var STATE = state; _this2.object = object; _this2.domElement = domElement !== undefined ? domElement : document; // API _this2.enabled = true; _this2.screen = { left: 0, top: 0, width: 0, height: 0 }; _this2.radius = 0; _this2.zoomSpeed = 1.2; _this2.noZoom = false; _this2.noPan = false; _this2.staticMoving = false; _this2.dynamicDampingFactor = 0.2; _this2.keys = [65 /* A*/, 83 /* S*/, 68]; // internals _this2.target = new THREE.Vector3(); var EPS = 0.000001; var _changed = true; var _state = STATE.NONE, _prevState = STATE.NONE, _eye = new THREE.Vector3(), _zoomStart = new THREE.Vector2(), _zoomEnd = new THREE.Vector2(), _touchZoomDistanceStart = 0, _touchZoomDistanceEnd = 0, _panStart = new THREE.Vector2(), _panEnd = new THREE.Vector2(); // window level fire after... // for reset _this2.target0 = _this2.target.clone(); _this2.position0 = _this2.object.position.clone(); _this2.up0 = _this2.object.up.clone(); _this2.left0 = _this2.object.left; _this2.right0 = _this2.object.right; _this2.top0 = _this2.object.top; _this2.bottom0 = _this2.object.bottom; // events var changeEvent = { type: 'change' }; var startEvent = { type: 'start' }; var endEvent = { type: 'end' }; // methods _this2.handleResize = function () { if (this.domElement === document) { this.screen.left = 0; this.screen.top = 0; this.screen.width = window.innerWidth; this.screen.height = window.innerHeight; } else { var box = this.domElement.getBoundingClientRect(); // adjustments come from similar code in the jquery offset() function var d = this.domElement.ownerDocument.documentElement; this.screen.left = box.left + window.pageXOffset - d.clientLeft; this.screen.top = box.top + window.pageYOffset - d.clientTop; this.screen.width = box.width; this.screen.height = box.height; } this.radius = 0.5 * Math.min(this.screen.width, this.screen.height); this.left0 = this.object.left; this.right0 = this.object.right; this.top0 = this.object.top; this.bottom0 = this.object.bottom; }; _this2.handleEvent = function (event) { if (typeof this[event.type] == 'function') { this[event.type](event); } }; var getMouseOnScreen = function () { var vector = new THREE.Vector2(); return function getMouseOnScreen(pageX, pageY) { vector.set((pageX - _this.screen.left) / _this.screen.width, (pageY - _this.screen.top) / _this.screen.height); return vector; }; }(); _this2.zoomCamera = function () { if (_state === STATE.TOUCH_ZOOM_PAN) { var factor = _touchZoomDistanceEnd / _touchZoomDistanceStart; _touchZoomDistanceStart = _touchZoomDistanceEnd; _this.object.zoom *= factor; _changed = true; } else { var factor = 1.0 + (_zoomEnd.y - _zoomStart.y) * _this.zoomSpeed; if (Math.abs(factor - 1.0) > EPS && factor > 0.0) { _this.object.zoom /= factor; if (_this.staticMoving) { _zoomStart.copy(_zoomEnd); } else { _zoomStart.y += (_zoomEnd.y - _zoomStart.y) * this.dynamicDampingFactor; } _changed = true; } } }; _this2.panCamera = function () { var mouseChange = new THREE.Vector2(), objectUp = new THREE.Vector3(), pan = new THREE.Vector3(); return function panCamera() { mouseChange.copy(_panEnd).sub(_panStart); if (mouseChange.lengthSq()) { // Scale movement to keep clicked/dragged position under cursor var scale_x = (_this.object.right - _this.object.left) / _this.object.zoom; var scale_y = (_this.object.top - _this.object.bottom) / _this.object.zoom; mouseChange.x *= scale_x; mouseChange.y *= scale_y; pan.copy(_eye).cross(_this.object.up).setLength(mouseChange.x); pan.add(objectUp.copy(_this.object.up).setLength(mouseChange.y)); _this.object.position.add(pan); _this.target.add(pan); if (_this.staticMoving) { _panStart.copy(_panEnd); } else { _panStart.add(mouseChange.subVectors(_panEnd, _panStart).multiplyScalar(_this.dynamicDampingFactor)); } _changed = true; } }; }(); _this2.update = function () { _eye.subVectors(_this.object.position, _this.target); if (!_this.noZoom) { _this.zoomCamera(); if (_changed) { _this.object.updateProjectionMatrix(); } } if (!_this.noPan) { _this.panCamera(); } _this.object.position.addVectors(_this.target, _eye); _this.object.lookAt(_this.target); if (_changed) { _this.dispatchEvent(changeEvent); _changed = false; } }; _this2.reset = function () { _state = STATE.NONE; _prevState = STATE.NONE; _this.target.copy(_this.target0); _this.object.position.copy(_this.position0); _this.object.up.copy(_this.up0); _eye.subVectors(_this.object.position, _this.target); _this.object.left = _this.left0; _this.object.right = _this.right0; _this.object.top = _this.top0; _this.object.bottom = _this.bottom0; _this.object.lookAt(_this.target); _this.dispatchEvent(changeEvent); _changed = false; }; // listeners function keydown(event) { if (_this.enabled === false) return; window.removeEventListener('keydown', keydown); _prevState = _state; if (_state !== STATE.NONE) { return; } else if (event.keyCode === _this.keys[STATE.ROTATE] && !_this.noRotate) { _state = STATE.ROTATE; } else if (event.keyCode === _this.keys[STATE.ZOOM] && !_this.noZoom) { _state = STATE.ZOOM; } else if (event.keyCode === _this.keys[STATE.PAN] && !_this.noPan) { _state = STATE.PAN; } } function keyup(event) { if (_this.enabled === false) return; _state = _prevState; window.addEventListener('keydown', keydown, false); } function mousedown(event) { if (_this.enabled === false) return; event.preventDefault(); event.stopPropagation(); if (_state === STATE.NONE) { _state = event.button; } if (_state === STATE.ROTATE && !_this.noRotate) {} else if (_state === STATE.ZOOM && !_this.noZoom) { _zoomStart.copy(getMouseOnScreen(event.pageX, event.pageY)); _zoomEnd.copy(_zoomStart); } else if (_state === STATE.PAN && !_this.noPan) { _panStart.copy(getMouseOnScreen(event.pageX, event.pageY)); _panEnd.copy(_panStart); } document.addEventListener('mousemove', mousemove, false); document.addEventListener('mouseup', mouseup, false); _this.dispatchEvent(startEvent); } function mousemove(event) { if (_this.enabled === false) return; event.preventDefault(); event.stopPropagation(); if (_state === STATE.ROTATE && !_this.noRotate) {} else if (_state === STATE.ZOOM && !_this.noZoom) { _zoomEnd.copy(getMouseOnScreen(event.pageX, event.pageY)); } else if (_state === STATE.PAN && !_this.noPan) { _panEnd.copy(getMouseOnScreen(event.pageX, event.pageY)); } } function mouseup(event) { if (_this.enabled === false) return; event.preventDefault(); event.stopPropagation(); _state = STATE.NONE; document.removeEventListener('mousemove', mousemove); document.removeEventListener('mouseup', mouseup); _this.dispatchEvent(endEvent); } function mousewheel(event) { if (_this.enabled === false) return; event.preventDefault(); event.stopPropagation(); var delta = 0; if (event.wheelDelta) { // WebKit / Opera / Explorer 9 delta = event.wheelDelta / 40; } else if (event.detail) { // Firefox delta = -event.detail / 3; } // FIRE SCROLL EVENT _this.dispatchEvent({ type: 'OnScroll', delta: delta }); // _zoomStart.y += delta * 0.01; _this.dispatchEvent(startEvent); _this.dispatchEvent(endEvent); } function touchstart(event) { if (_this.enabled === false) return; switch (event.touches.length) { case 1: _state = STATE.TOUCH_ROTATE; break; case 2: _state = STATE.TOUCH_ZOOM_PAN; var dx = event.touches[0].pageX - event.touches[1].pageX; var dy = event.touches[0].pageY - event.touches[1].pageY; _touchZoomDistanceEnd = _touchZoomDistanceStart = Math.sqrt(dx * dx + dy * dy); var x = (event.touches[0].pageX + event.touches[1].pageX) / 2; var y = (event.touches[0].pageY + event.touches[1].pageY) / 2; _panStart.copy(getMouseOnScreen(x, y)); _panEnd.copy(_panStart); break; default: _state = STATE.NONE; } _this.dispatchEvent(startEvent); } function touchmove(event) { if (_this.enabled === false) return; event.preventDefault(); event.stopPropagation(); switch (event.touches.length) { case 1: break; case 2: var dx = event.touches[0].pageX - event.touches[1].pageX; var dy = event.touches[0].pageY - event.touches[1].pageY; _touchZoomDistanceEnd = Math.sqrt(dx * dx + dy * dy); var x = (event.touches[0].pageX + event.touches[1].pageX) / 2; var y = (event.touches[0].pageY + event.touches[1].pageY) / 2; _panEnd.copy(getMouseOnScreen(x, y)); break; default: _state = STATE.NONE; } } function touchend(event) { if (_this.enabled === false) return; switch (event.touches.length) { case 1: break; case 2: _touchZoomDistanceStart = _touchZoomDistanceEnd = 0; var x = (event.touches[0].pageX + event.touches[1].pageX) / 2; var y = (event.touches[0].pageY + event.touches[1].pageY) / 2; _panEnd.copy(getMouseOnScreen(x, y)); _panStart.copy(_panEnd); break; } _state = STATE.NONE; _this.dispatchEvent(endEvent); } function contextmenu(event) { event.preventDefault(); } _this2.dispose = function () { this.domElement.removeEventListener('contextmenu', contextmenu, false); this.domElement.removeEventListener('mousedown', mousedown, false); this.domElement.removeEventListener('mousewheel', mousewheel, false); this.domElement.removeEventListener('MozMousePixelScroll', mousewheel, false); // firefox this.domElement.removeEventListener('touchstart', touchstart, false); this.domElement.removeEventListener('touchend', touchend, false); this.domElement.removeEventListener('touchmove', touchmove, false); document.removeEventListener('mousemove', mousemove, false); document.removeEventListener('mouseup', mouseup, false); window.removeEventListener('keydown', keydown, false); window.removeEventListener('keyup', keyup, false); }; _this2.domElement.addEventListener('contextmenu', contextmenu, false); _this2.domElement.addEventListener('mousedown', mousedown, false); _this2.domElement.addEventListener('mousewheel', mousewheel, false); _this2.domElement.addEventListener('MozMousePixelScroll', mousewheel, false); // firefox _this2.domElement.addEventListener('touchstart', touchstart, false); _this2.domElement.addEventListener('touchend', touchend, false); _this2.domElement.addEventListener('touchmove', touchmove, false); window.addEventListener('keydown', keydown, false); window.addEventListener('keyup', keyup, false); _this2.handleResize(); // force an update at start _this2.update(); return _this2; } return Trackballortho; }(THREE.EventDispatcher); exports.default = Trackballortho; module.exports = exports['default'];