3466 lines
136 KiB
JavaScript
3466 lines
136 KiB
JavaScript
|
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
|
||
|
'use strict';
|
||
|
|
||
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
|
||
|
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; }
|
||
|
|
||
|
var utils = require('./utils');
|
||
|
var Plugin = require('./plugin');
|
||
|
|
||
|
module.exports = function (_Plugin) {
|
||
|
_inherits(Bounce, _Plugin);
|
||
|
|
||
|
/**
|
||
|
* @private
|
||
|
* @param {Viewport} parent
|
||
|
* @param {object} [options]
|
||
|
* @param {string} [options.sides=all] all, horizontal, vertical, or combination of top, bottom, right, left (e.g., 'top-bottom-right')
|
||
|
* @param {number} [options.friction=0.5] friction to apply to decelerate if active
|
||
|
* @param {number} [options.time=150] time in ms to finish bounce
|
||
|
* @param {string|function} [ease=easeInOutSine] ease function or name (see http://easings.net/ for supported names)
|
||
|
* @param {string} [options.underflow=center] (top/bottom/center and left/right/center, or center) where to place world if too small for screen
|
||
|
* @fires bounce-start-x
|
||
|
* @fires bounce.end-x
|
||
|
* @fires bounce-start-y
|
||
|
* @fires bounce-end-y
|
||
|
*/
|
||
|
function Bounce(parent, options) {
|
||
|
_classCallCheck(this, Bounce);
|
||
|
|
||
|
var _this = _possibleConstructorReturn(this, (Bounce.__proto__ || Object.getPrototypeOf(Bounce)).call(this, parent));
|
||
|
|
||
|
options = options || {};
|
||
|
_this.time = options.time || 150;
|
||
|
_this.ease = utils.ease(options.ease, 'easeInOutSine');
|
||
|
_this.friction = options.friction || 0.5;
|
||
|
options.sides = options.sides || 'all';
|
||
|
if (options.sides) {
|
||
|
if (options.sides === 'all') {
|
||
|
_this.top = _this.bottom = _this.left = _this.right = true;
|
||
|
} else if (options.sides === 'horizontal') {
|
||
|
_this.right = _this.left = true;
|
||
|
} else if (options.sides === 'vertical') {
|
||
|
_this.top = _this.bottom = true;
|
||
|
} else {
|
||
|
_this.top = options.sides.indexOf('top') !== -1;
|
||
|
_this.bottom = options.sides.indexOf('bottom') !== -1;
|
||
|
_this.left = options.sides.indexOf('left') !== -1;
|
||
|
_this.right = options.sides.indexOf('right') !== -1;
|
||
|
}
|
||
|
}
|
||
|
_this.parseUnderflow(options.underflow || 'center');
|
||
|
_this.last = {};
|
||
|
return _this;
|
||
|
}
|
||
|
|
||
|
_createClass(Bounce, [{
|
||
|
key: 'parseUnderflow',
|
||
|
value: function parseUnderflow(clamp) {
|
||
|
clamp = clamp.toLowerCase();
|
||
|
if (clamp === 'center') {
|
||
|
this.underflowX = 0;
|
||
|
this.underflowY = 0;
|
||
|
} else {
|
||
|
this.underflowX = clamp.indexOf('left') !== -1 ? -1 : clamp.indexOf('right') !== -1 ? 1 : 0;
|
||
|
this.underflowY = clamp.indexOf('top') !== -1 ? -1 : clamp.indexOf('bottom') !== -1 ? 1 : 0;
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'down',
|
||
|
value: function down() {
|
||
|
this.toX = this.toY = null;
|
||
|
}
|
||
|
}, {
|
||
|
key: 'up',
|
||
|
value: function up() {
|
||
|
this.bounce();
|
||
|
}
|
||
|
}, {
|
||
|
key: 'update',
|
||
|
value: function update(elapsed) {
|
||
|
if (this.paused) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
this.bounce();
|
||
|
if (this.toX) {
|
||
|
var toX = this.toX;
|
||
|
toX.time += elapsed;
|
||
|
this.parent.emit('moved', { viewport: this.parent, type: 'bounce-x' });
|
||
|
if (toX.time >= this.time) {
|
||
|
this.parent.x = toX.end;
|
||
|
this.toX = null;
|
||
|
this.parent.emit('bounce-x-end', this.parent);
|
||
|
} else {
|
||
|
this.parent.x = this.ease(toX.time, toX.start, toX.delta, this.time);
|
||
|
}
|
||
|
this.parent.dirty = true;
|
||
|
}
|
||
|
if (this.toY) {
|
||
|
var toY = this.toY;
|
||
|
toY.time += elapsed;
|
||
|
this.parent.emit('moved', { viewport: this.parent, type: 'bounce-y' });
|
||
|
if (toY.time >= this.time) {
|
||
|
this.parent.y = toY.end;
|
||
|
this.toY = null;
|
||
|
this.parent.emit('bounce-y-end', this.parent);
|
||
|
} else {
|
||
|
this.parent.y = this.ease(toY.time, toY.start, toY.delta, this.time);
|
||
|
}
|
||
|
this.parent.dirty = true;
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'calcUnderflowX',
|
||
|
value: function calcUnderflowX() {
|
||
|
var x = void 0;
|
||
|
switch (this.underflowX) {
|
||
|
case -1:
|
||
|
x = 0;
|
||
|
break;
|
||
|
case 1:
|
||
|
x = this.parent.screenWidth - this.parent.screenWorldWidth;
|
||
|
break;
|
||
|
default:
|
||
|
x = (this.parent.screenWidth - this.parent.screenWorldWidth) / 2;
|
||
|
}
|
||
|
return x;
|
||
|
}
|
||
|
}, {
|
||
|
key: 'calcUnderflowY',
|
||
|
value: function calcUnderflowY() {
|
||
|
var y = void 0;
|
||
|
switch (this.underflowY) {
|
||
|
case -1:
|
||
|
y = 0;
|
||
|
break;
|
||
|
case 1:
|
||
|
y = this.parent.screenHeight - this.parent.screenWorldHeight;
|
||
|
break;
|
||
|
default:
|
||
|
y = (this.parent.screenHeight - this.parent.screenWorldHeight) / 2;
|
||
|
}
|
||
|
return y;
|
||
|
}
|
||
|
}, {
|
||
|
key: 'bounce',
|
||
|
value: function bounce() {
|
||
|
if (this.paused) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var oob = void 0;
|
||
|
var decelerate = this.parent.plugins['decelerate'];
|
||
|
if (decelerate && (decelerate.x || decelerate.y)) {
|
||
|
if (decelerate.x && decelerate.percentChangeX === decelerate.friction || decelerate.y && decelerate.percentChangeY === decelerate.friction) {
|
||
|
oob = this.parent.OOB();
|
||
|
if (oob.left && this.left || oob.right && this.right) {
|
||
|
decelerate.percentChangeX = this.friction;
|
||
|
}
|
||
|
if (oob.top && this.top || oob.bottom && this.bottom) {
|
||
|
decelerate.percentChangeY = this.friction;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
var drag = this.parent.plugins['drag'] || {};
|
||
|
var pinch = this.parent.plugins['pinch'] || {};
|
||
|
decelerate = decelerate || {};
|
||
|
if (!drag.active && !pinch.active && (!this.toX || !this.toY) && (!decelerate.x || !decelerate.y)) {
|
||
|
oob = oob || this.parent.OOB();
|
||
|
var point = oob.cornerPoint;
|
||
|
if (!this.toX && !decelerate.x) {
|
||
|
var x = null;
|
||
|
if (oob.left && this.left) {
|
||
|
x = this.parent.screenWorldWidth < this.parent.screenWidth ? this.calcUnderflowX() : 0;
|
||
|
} else if (oob.right && this.right) {
|
||
|
x = this.parent.screenWorldWidth < this.parent.screenWidth ? this.calcUnderflowX() : -point.x;
|
||
|
}
|
||
|
if (x !== null && this.parent.x !== x) {
|
||
|
this.toX = { time: 0, start: this.parent.x, delta: x - this.parent.x, end: x };
|
||
|
this.parent.emit('bounce-x-start', this.parent);
|
||
|
}
|
||
|
}
|
||
|
if (!this.toY && !decelerate.y) {
|
||
|
var y = null;
|
||
|
if (oob.top && this.top) {
|
||
|
y = this.parent.screenWorldHeight < this.parent.screenHeight ? this.calcUnderflowY() : 0;
|
||
|
} else if (oob.bottom && this.bottom) {
|
||
|
y = this.parent.screenWorldHeight < this.parent.screenHeight ? this.calcUnderflowY() : -point.y;
|
||
|
}
|
||
|
if (y !== null && this.parent.y !== y) {
|
||
|
this.toY = { time: 0, start: this.parent.y, delta: y - this.parent.y, end: y };
|
||
|
this.parent.emit('bounce-y-start', this.parent);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'reset',
|
||
|
value: function reset() {
|
||
|
this.toX = this.toY = null;
|
||
|
}
|
||
|
}]);
|
||
|
|
||
|
return Bounce;
|
||
|
}(Plugin);
|
||
|
|
||
|
},{"./plugin":9,"./utils":12}],2:[function(require,module,exports){
|
||
|
'use strict';
|
||
|
|
||
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
|
||
|
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; }
|
||
|
|
||
|
var Plugin = require('./plugin');
|
||
|
|
||
|
module.exports = function (_Plugin) {
|
||
|
_inherits(ClampZoom, _Plugin);
|
||
|
|
||
|
/**
|
||
|
* @private
|
||
|
* @param {object} [options]
|
||
|
* @param {number} [options.minWidth] minimum width
|
||
|
* @param {number} [options.minHeight] minimum height
|
||
|
* @param {number} [options.maxWidth] maximum width
|
||
|
* @param {number} [options.maxHeight] maximum height
|
||
|
*/
|
||
|
function ClampZoom(parent, options) {
|
||
|
_classCallCheck(this, ClampZoom);
|
||
|
|
||
|
var _this = _possibleConstructorReturn(this, (ClampZoom.__proto__ || Object.getPrototypeOf(ClampZoom)).call(this, parent));
|
||
|
|
||
|
_this.minWidth = options.minWidth;
|
||
|
_this.minHeight = options.minHeight;
|
||
|
_this.maxWidth = options.maxWidth;
|
||
|
_this.maxHeight = options.maxHeight;
|
||
|
return _this;
|
||
|
}
|
||
|
|
||
|
_createClass(ClampZoom, [{
|
||
|
key: 'resize',
|
||
|
value: function resize() {
|
||
|
this.clamp();
|
||
|
}
|
||
|
}, {
|
||
|
key: 'clamp',
|
||
|
value: function clamp() {
|
||
|
if (this.paused) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var width = this.parent.worldScreenWidth;
|
||
|
var height = this.parent.worldScreenHeight;
|
||
|
if (this.minWidth && width < this.minWidth) {
|
||
|
this.parent.fitWidth(this.minWidth);
|
||
|
width = this.parent.worldScreenWidth;
|
||
|
height = this.parent.worldScreenHeight;
|
||
|
this.parent.emit('zoomed', { viewport: this.parent, type: 'clamp-zoom' });
|
||
|
}
|
||
|
if (this.maxWidth && width > this.maxWidth) {
|
||
|
this.parent.fitWidth(this.maxWidth);
|
||
|
width = this.parent.worldScreenWidth;
|
||
|
height = this.parent.worldScreenHeight;
|
||
|
this.parent.emit('zoomed', { viewport: this.parent, type: 'clamp-zoom' });
|
||
|
}
|
||
|
if (this.minHeight && height < this.minHeight) {
|
||
|
this.parent.fitHeight(this.minHeight);
|
||
|
width = this.parent.worldScreenWidth;
|
||
|
height = this.parent.worldScreenHeight;
|
||
|
this.parent.emit('zoomed', { viewport: this.parent, type: 'clamp-zoom' });
|
||
|
}
|
||
|
if (this.maxHeight && height > this.maxHeight) {
|
||
|
this.parent.fitHeight(this.maxHeight);
|
||
|
this.parent.emit('zoomed', { viewport: this.parent, type: 'clamp-zoom' });
|
||
|
}
|
||
|
}
|
||
|
}]);
|
||
|
|
||
|
return ClampZoom;
|
||
|
}(Plugin);
|
||
|
|
||
|
},{"./plugin":9}],3:[function(require,module,exports){
|
||
|
'use strict';
|
||
|
|
||
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
|
||
|
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; }
|
||
|
|
||
|
var Plugin = require('./plugin');
|
||
|
var utils = require('./utils');
|
||
|
|
||
|
module.exports = function (_Plugin) {
|
||
|
_inherits(clamp, _Plugin);
|
||
|
|
||
|
/**
|
||
|
* @private
|
||
|
* @param {object} options
|
||
|
* @param {(number|boolean)} [options.left] clamp left; true=0
|
||
|
* @param {(number|boolean)} [options.right] clamp right; true=viewport.worldWidth
|
||
|
* @param {(number|boolean)} [options.top] clamp top; true=0
|
||
|
* @param {(number|boolean)} [options.bottom] clamp bottom; true=viewport.worldHeight
|
||
|
* @param {string} [options.direction] (all, x, or y) using clamps of [0, viewport.worldWidth/viewport.worldHeight]; replaces left/right/top/bottom if set
|
||
|
* @param {string} [options.underflow=center] (top/bottom/center and left/right/center, or center) where to place world if too small for screen
|
||
|
*/
|
||
|
function clamp(parent, options) {
|
||
|
_classCallCheck(this, clamp);
|
||
|
|
||
|
options = options || {};
|
||
|
|
||
|
var _this = _possibleConstructorReturn(this, (clamp.__proto__ || Object.getPrototypeOf(clamp)).call(this, parent));
|
||
|
|
||
|
if (typeof options.direction === 'undefined') {
|
||
|
_this.left = utils.defaults(options.left, null);
|
||
|
_this.right = utils.defaults(options.right, null);
|
||
|
_this.top = utils.defaults(options.top, null);
|
||
|
_this.bottom = utils.defaults(options.bottom, null);
|
||
|
} else {
|
||
|
_this.left = options.direction === 'x' || options.direction === 'all';
|
||
|
_this.right = options.direction === 'x' || options.direction === 'all';
|
||
|
_this.top = options.direction === 'y' || options.direction === 'all';
|
||
|
_this.bottom = options.direction === 'y' || options.direction === 'all';
|
||
|
}
|
||
|
_this.parseUnderflow(options.underflow || 'center');
|
||
|
_this.move();
|
||
|
return _this;
|
||
|
}
|
||
|
|
||
|
_createClass(clamp, [{
|
||
|
key: 'parseUnderflow',
|
||
|
value: function parseUnderflow(clamp) {
|
||
|
clamp = clamp.toLowerCase();
|
||
|
if (clamp === 'center') {
|
||
|
this.underflowX = 0;
|
||
|
this.underflowY = 0;
|
||
|
} else {
|
||
|
this.underflowX = clamp.indexOf('left') !== -1 ? -1 : clamp.indexOf('right') !== -1 ? 1 : 0;
|
||
|
this.underflowY = clamp.indexOf('top') !== -1 ? -1 : clamp.indexOf('bottom') !== -1 ? 1 : 0;
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'move',
|
||
|
value: function move() {
|
||
|
this.update();
|
||
|
}
|
||
|
}, {
|
||
|
key: 'update',
|
||
|
value: function update() {
|
||
|
if (this.paused) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var decelerate = this.parent.plugins['decelerate'] || {};
|
||
|
if (this.left !== null || this.right !== null) {
|
||
|
var moved = void 0;
|
||
|
if (this.parent.screenWorldWidth < this.parent.screenWidth) {
|
||
|
switch (this.underflowX) {
|
||
|
case -1:
|
||
|
if (this.parent.x !== 0) {
|
||
|
this.parent.x = 0;
|
||
|
moved = true;
|
||
|
}
|
||
|
break;
|
||
|
case 1:
|
||
|
if (this.parent.x !== this.parent.screenWidth - this.parent.screenWorldWidth) {
|
||
|
this.parent.x = this.parent.screenWidth - this.parent.screenWorldWidth;
|
||
|
moved = true;
|
||
|
}
|
||
|
break;
|
||
|
default:
|
||
|
if (this.parent.x !== (this.parent.screenWidth - this.parent.screenWorldWidth) / 2) {
|
||
|
this.parent.x = (this.parent.screenWidth - this.parent.screenWorldWidth) / 2;
|
||
|
moved = true;
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
if (this.left !== null) {
|
||
|
if (this.parent.left < (this.left === true ? 0 : this.left)) {
|
||
|
this.parent.x = -(this.left === true ? 0 : this.left) * this.parent.scale.x;
|
||
|
decelerate.x = 0;
|
||
|
moved = true;
|
||
|
}
|
||
|
}
|
||
|
if (this.right !== null) {
|
||
|
if (this.parent.right > (this.right === true ? this.parent.worldWidth : this.right)) {
|
||
|
this.parent.x = -(this.right === true ? this.parent.worldWidth : this.right) * this.parent.scale.x + this.parent.screenWidth;
|
||
|
decelerate.x = 0;
|
||
|
moved = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (moved) {
|
||
|
this.parent.emit('moved', { viewport: this.parent, type: 'clamp-x' });
|
||
|
}
|
||
|
}
|
||
|
if (this.top !== null || this.bottom !== null) {
|
||
|
var _moved = void 0;
|
||
|
if (this.parent.screenWorldHeight < this.parent.screenHeight) {
|
||
|
switch (this.underflowY) {
|
||
|
case -1:
|
||
|
if (this.parent.y !== 0) {
|
||
|
this.parent.y = 0;
|
||
|
_moved = true;
|
||
|
}
|
||
|
break;
|
||
|
case 1:
|
||
|
if (this.parent.y !== this.parent.screenHeight - this.parent.screenWorldHeight) {
|
||
|
this.parent.y = this.parent.screenHeight - this.parent.screenWorldHeight;
|
||
|
_moved = true;
|
||
|
}
|
||
|
break;
|
||
|
default:
|
||
|
if (this.parent.y !== (this.parent.screenHeight - this.parent.screenWorldHeight) / 2) {
|
||
|
this.parent.y = (this.parent.screenHeight - this.parent.screenWorldHeight) / 2;
|
||
|
_moved = true;
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
if (this.top !== null) {
|
||
|
if (this.parent.top < (this.top === true ? 0 : this.top)) {
|
||
|
this.parent.y = -(this.top === true ? 0 : this.top) * this.parent.scale.y;
|
||
|
decelerate.y = 0;
|
||
|
_moved = true;
|
||
|
}
|
||
|
}
|
||
|
if (this.bottom !== null) {
|
||
|
if (this.parent.bottom > (this.bottom === true ? this.parent.worldHeight : this.bottom)) {
|
||
|
this.parent.y = -(this.bottom === true ? this.parent.worldHeight : this.bottom) * this.parent.scale.y + this.parent.screenHeight;
|
||
|
decelerate.y = 0;
|
||
|
_moved = true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (_moved) {
|
||
|
this.parent.emit('moved', { viewport: this.parent, type: 'clamp-y' });
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}]);
|
||
|
|
||
|
return clamp;
|
||
|
}(Plugin);
|
||
|
|
||
|
},{"./plugin":9,"./utils":12}],4:[function(require,module,exports){
|
||
|
'use strict';
|
||
|
|
||
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
|
||
|
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; }
|
||
|
|
||
|
var utils = require('./utils');
|
||
|
var Plugin = require('./plugin');
|
||
|
|
||
|
module.exports = function (_Plugin) {
|
||
|
_inherits(Decelerate, _Plugin);
|
||
|
|
||
|
/**
|
||
|
* @private
|
||
|
* @param {Viewport} parent
|
||
|
* @param {object} [options]
|
||
|
* @param {number} [options.friction=0.95] percent to decelerate after movement
|
||
|
* @param {number} [options.bounce=0.8] percent to decelerate when past boundaries (only applicable when viewport.bounce() is active)
|
||
|
* @param {number} [options.minSpeed=0.01] minimum velocity before stopping/reversing acceleration
|
||
|
*/
|
||
|
function Decelerate(parent, options) {
|
||
|
_classCallCheck(this, Decelerate);
|
||
|
|
||
|
var _this = _possibleConstructorReturn(this, (Decelerate.__proto__ || Object.getPrototypeOf(Decelerate)).call(this, parent));
|
||
|
|
||
|
options = options || {};
|
||
|
_this.friction = options.friction || 0.95;
|
||
|
_this.bounce = options.bounce || 0.5;
|
||
|
_this.minSpeed = typeof options.minSpeed !== 'undefined' ? options.minSpeed : 0.01;
|
||
|
_this.saved = [];
|
||
|
return _this;
|
||
|
}
|
||
|
|
||
|
_createClass(Decelerate, [{
|
||
|
key: 'down',
|
||
|
value: function down() {
|
||
|
this.saved = [];
|
||
|
this.x = this.y = false;
|
||
|
}
|
||
|
}, {
|
||
|
key: 'move',
|
||
|
value: function move() {
|
||
|
if (this.paused) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var count = this.parent.countDownPointers();
|
||
|
if (count === 1 || count > 1 && !this.parent.plugins['pinch']) {
|
||
|
this.saved.push({ x: this.parent.x, y: this.parent.y, time: performance.now() });
|
||
|
if (this.saved.length > 60) {
|
||
|
this.saved.splice(0, 30);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'up',
|
||
|
value: function up() {
|
||
|
if (this.parent.countDownPointers() === 0 && this.saved.length) {
|
||
|
var now = performance.now();
|
||
|
var _iteratorNormalCompletion = true;
|
||
|
var _didIteratorError = false;
|
||
|
var _iteratorError = undefined;
|
||
|
|
||
|
try {
|
||
|
for (var _iterator = this.saved[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
||
|
var save = _step.value;
|
||
|
|
||
|
if (save.time >= now - 100) {
|
||
|
var time = now - save.time;
|
||
|
this.x = (this.parent.x - save.x) / time;
|
||
|
this.y = (this.parent.y - save.y) / time;
|
||
|
this.percentChangeX = this.percentChangeY = this.friction;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
} catch (err) {
|
||
|
_didIteratorError = true;
|
||
|
_iteratorError = err;
|
||
|
} finally {
|
||
|
try {
|
||
|
if (!_iteratorNormalCompletion && _iterator.return) {
|
||
|
_iterator.return();
|
||
|
}
|
||
|
} finally {
|
||
|
if (_didIteratorError) {
|
||
|
throw _iteratorError;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* manually activate plugin
|
||
|
* @param {object} options
|
||
|
* @param {number} [options.x]
|
||
|
* @param {number} [options.y]
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'activate',
|
||
|
value: function activate(options) {
|
||
|
options = options || {};
|
||
|
if (typeof options.x !== 'undefined') {
|
||
|
this.x = options.x;
|
||
|
this.percentChangeX = this.friction;
|
||
|
}
|
||
|
if (typeof options.y !== 'undefined') {
|
||
|
this.y = options.y;
|
||
|
this.percentChangeY = this.friction;
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'update',
|
||
|
value: function update(elapsed) {
|
||
|
if (this.paused) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var moved = void 0;
|
||
|
if (this.x) {
|
||
|
this.parent.x += this.x * elapsed;
|
||
|
this.x *= this.percentChangeX;
|
||
|
if (Math.abs(this.x) < this.minSpeed) {
|
||
|
this.x = 0;
|
||
|
}
|
||
|
moved = true;
|
||
|
}
|
||
|
if (this.y) {
|
||
|
this.parent.y += this.y * elapsed;
|
||
|
this.y *= this.percentChangeY;
|
||
|
if (Math.abs(this.y) < this.minSpeed) {
|
||
|
this.y = 0;
|
||
|
}
|
||
|
moved = true;
|
||
|
}
|
||
|
if (moved) {
|
||
|
this.parent.dirty = true;
|
||
|
this.parent.emit('moved', { viewport: this.parent, type: 'decelerate' });
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'reset',
|
||
|
value: function reset() {
|
||
|
this.x = this.y = null;
|
||
|
}
|
||
|
}]);
|
||
|
|
||
|
return Decelerate;
|
||
|
}(Plugin);
|
||
|
|
||
|
},{"./plugin":9,"./utils":12}],5:[function(require,module,exports){
|
||
|
'use strict';
|
||
|
|
||
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
|
||
|
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; }
|
||
|
|
||
|
var utils = require('./utils');
|
||
|
var Plugin = require('./plugin');
|
||
|
|
||
|
module.exports = function (_Plugin) {
|
||
|
_inherits(Drag, _Plugin);
|
||
|
|
||
|
/**
|
||
|
* enable one-finger touch to drag
|
||
|
* @private
|
||
|
* @param {Viewport} parent
|
||
|
* @param {object} [options]
|
||
|
* @param {string} [options.direction=all] direction to drag (all, x, or y)
|
||
|
* @param {boolean} [options.wheel=true] use wheel to scroll in y direction (unless wheel plugin is active)
|
||
|
* @param {number} [options.wheelScroll=1] number of pixels to scroll with each wheel spin
|
||
|
* @param {boolean} [options.reverse] reverse the direction of the wheel scroll
|
||
|
* @param {boolean|string} [options.clampWheel] (true, x, or y) clamp wheel (to avoid weird bounce with mouse wheel)
|
||
|
* @param {string} [options.underflow=center] (top/bottom/center and left/right/center, or center) where to place world if too small for screen
|
||
|
*/
|
||
|
function Drag(parent, options) {
|
||
|
_classCallCheck(this, Drag);
|
||
|
|
||
|
options = options || {};
|
||
|
|
||
|
var _this = _possibleConstructorReturn(this, (Drag.__proto__ || Object.getPrototypeOf(Drag)).call(this, parent));
|
||
|
|
||
|
_this.moved = false;
|
||
|
_this.wheelActive = utils.defaults(options.wheel, true);
|
||
|
_this.wheelScroll = options.wheelScroll || 1;
|
||
|
_this.reverse = options.reverse ? 1 : -1;
|
||
|
_this.clampWheel = options.clampWheel;
|
||
|
_this.xDirection = !options.direction || options.direction === 'all' || options.direction === 'x';
|
||
|
_this.yDirection = !options.direction || options.direction === 'all' || options.direction === 'y';
|
||
|
_this.parseUnderflow(options.underflow || 'center');
|
||
|
return _this;
|
||
|
}
|
||
|
|
||
|
_createClass(Drag, [{
|
||
|
key: 'parseUnderflow',
|
||
|
value: function parseUnderflow(clamp) {
|
||
|
clamp = clamp.toLowerCase();
|
||
|
if (clamp === 'center') {
|
||
|
this.underflowX = 0;
|
||
|
this.underflowY = 0;
|
||
|
} else {
|
||
|
this.underflowX = clamp.indexOf('left') !== -1 ? -1 : clamp.indexOf('right') !== -1 ? 1 : 0;
|
||
|
this.underflowY = clamp.indexOf('top') !== -1 ? -1 : clamp.indexOf('bottom') !== -1 ? 1 : 0;
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'down',
|
||
|
value: function down(e) {
|
||
|
if (this.paused) {
|
||
|
return;
|
||
|
}
|
||
|
var count = this.parent.countDownPointers();
|
||
|
if ((count === 1 || count > 1 && !this.parent.plugins['pinch']) && this.parent.parent) {
|
||
|
var parent = this.parent.parent.toLocal(e.data.global);
|
||
|
this.last = { x: e.data.global.x, y: e.data.global.y, parent: parent };
|
||
|
this.current = e.data.pointerId;
|
||
|
} else {
|
||
|
this.last = null;
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'move',
|
||
|
value: function move(e) {
|
||
|
if (this.paused) {
|
||
|
return;
|
||
|
}
|
||
|
if (this.last && this.current === e.data.pointerId) {
|
||
|
var x = e.data.global.x;
|
||
|
var y = e.data.global.y;
|
||
|
var count = this.parent.countDownPointers();
|
||
|
if (count === 1 || count > 1 && !this.parent.plugins['pinch']) {
|
||
|
var distX = x - this.last.x;
|
||
|
var distY = y - this.last.y;
|
||
|
if (this.moved || this.xDirection && this.parent.checkThreshold(distX) || this.yDirection && this.parent.checkThreshold(distY)) {
|
||
|
var newParent = this.parent.parent.toLocal(e.data.global);
|
||
|
if (this.xDirection) {
|
||
|
this.parent.x += newParent.x - this.last.parent.x;
|
||
|
}
|
||
|
if (this.yDirection) {
|
||
|
this.parent.y += newParent.y - this.last.parent.y;
|
||
|
}
|
||
|
this.last = { x: x, y: y, parent: newParent };
|
||
|
if (!this.moved) {
|
||
|
this.parent.emit('drag-start', { screen: this.last, world: this.parent.toWorld(this.last), viewport: this.parent });
|
||
|
}
|
||
|
this.moved = true;
|
||
|
this.parent.dirty = true;
|
||
|
this.parent.emit('moved', { viewport: this.parent, type: 'drag' });
|
||
|
}
|
||
|
} else {
|
||
|
this.moved = false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'up',
|
||
|
value: function up() {
|
||
|
var touches = this.parent.getTouchPointers();
|
||
|
if (touches.length === 1) {
|
||
|
var pointer = touches[0];
|
||
|
if (pointer.last) {
|
||
|
var parent = this.parent.parent.toLocal(pointer.last);
|
||
|
this.last = { x: pointer.last.x, y: pointer.last.y, parent: parent };
|
||
|
this.current = pointer.last.data.pointerId;
|
||
|
}
|
||
|
this.moved = false;
|
||
|
} else if (this.last) {
|
||
|
if (this.moved) {
|
||
|
this.parent.emit('drag-end', { screen: this.last, world: this.parent.toWorld(this.last), viewport: this.parent });
|
||
|
this.last = this.moved = false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'wheel',
|
||
|
value: function wheel(e) {
|
||
|
if (this.paused) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (this.wheelActive) {
|
||
|
var wheel = this.parent.plugins['wheel'];
|
||
|
if (!wheel) {
|
||
|
this.parent.x += e.deltaX * this.wheelScroll * this.reverse;
|
||
|
this.parent.y += e.deltaY * this.wheelScroll * this.reverse;
|
||
|
if (this.clampWheel) {
|
||
|
this.clamp();
|
||
|
}
|
||
|
this.parent.emit('wheel-scroll', this.parent);
|
||
|
this.parent.emit('moved', this.parent);
|
||
|
this.parent.dirty = true;
|
||
|
e.preventDefault();
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'resume',
|
||
|
value: function resume() {
|
||
|
this.last = null;
|
||
|
this.paused = false;
|
||
|
}
|
||
|
}, {
|
||
|
key: 'clamp',
|
||
|
value: function clamp() {
|
||
|
var decelerate = this.parent.plugins['decelerate'] || {};
|
||
|
if (this.clampWheel !== 'y') {
|
||
|
if (this.parent.screenWorldWidth < this.parent.screenWidth) {
|
||
|
switch (this.underflowX) {
|
||
|
case -1:
|
||
|
this.parent.x = 0;
|
||
|
break;
|
||
|
case 1:
|
||
|
this.parent.x = this.parent.screenWidth - this.parent.screenWorldWidth;
|
||
|
break;
|
||
|
default:
|
||
|
this.parent.x = (this.parent.screenWidth - this.parent.screenWorldWidth) / 2;
|
||
|
}
|
||
|
} else {
|
||
|
if (this.parent.left < 0) {
|
||
|
this.parent.x = 0;
|
||
|
decelerate.x = 0;
|
||
|
} else if (this.parent.right > this.parent.worldWidth) {
|
||
|
this.parent.x = -this.parent.worldWidth * this.parent.scale.x + this.parent.screenWidth;
|
||
|
decelerate.x = 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (this.clampWheel !== 'x') {
|
||
|
if (this.parent.screenWorldHeight < this.parent.screenHeight) {
|
||
|
switch (this.underflowY) {
|
||
|
case -1:
|
||
|
this.parent.y = 0;
|
||
|
break;
|
||
|
case 1:
|
||
|
this.parent.y = this.parent.screenHeight - this.parent.screenWorldHeight;
|
||
|
break;
|
||
|
default:
|
||
|
this.parent.y = (this.parent.screenHeight - this.parent.screenWorldHeight) / 2;
|
||
|
}
|
||
|
} else {
|
||
|
if (this.parent.top < 0) {
|
||
|
this.parent.y = 0;
|
||
|
decelerate.y = 0;
|
||
|
}
|
||
|
if (this.parent.bottom > this.parent.worldHeight) {
|
||
|
this.parent.y = -this.parent.worldHeight * this.parent.scale.y + this.parent.screenHeight;
|
||
|
decelerate.y = 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'active',
|
||
|
get: function get() {
|
||
|
return this.moved;
|
||
|
}
|
||
|
}]);
|
||
|
|
||
|
return Drag;
|
||
|
}(Plugin);
|
||
|
|
||
|
},{"./plugin":9,"./utils":12}],6:[function(require,module,exports){
|
||
|
'use strict';
|
||
|
|
||
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
|
||
|
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; }
|
||
|
|
||
|
var Plugin = require('./plugin');
|
||
|
|
||
|
module.exports = function (_Plugin) {
|
||
|
_inherits(Follow, _Plugin);
|
||
|
|
||
|
/**
|
||
|
* @private
|
||
|
* @param {Viewport} parent
|
||
|
* @param {PIXI.DisplayObject} target to follow (object must include {x: x-coordinate, y: y-coordinate})
|
||
|
* @param {object} [options]
|
||
|
* @param {number} [options.speed=0] to follow in pixels/frame (0=teleport to location)
|
||
|
* @param {number} [options.radius] radius (in world coordinates) of center circle where movement is allowed without moving the viewport
|
||
|
*/
|
||
|
function Follow(parent, target, options) {
|
||
|
_classCallCheck(this, Follow);
|
||
|
|
||
|
var _this = _possibleConstructorReturn(this, (Follow.__proto__ || Object.getPrototypeOf(Follow)).call(this, parent));
|
||
|
|
||
|
options = options || {};
|
||
|
_this.speed = options.speed || 0;
|
||
|
_this.target = target;
|
||
|
_this.radius = options.radius;
|
||
|
return _this;
|
||
|
}
|
||
|
|
||
|
_createClass(Follow, [{
|
||
|
key: 'update',
|
||
|
value: function update() {
|
||
|
if (this.paused) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var center = this.parent.center;
|
||
|
var toX = this.target.x,
|
||
|
toY = this.target.y;
|
||
|
if (this.radius) {
|
||
|
var distance = Math.sqrt(Math.pow(this.target.y - center.y, 2) + Math.pow(this.target.x - center.x, 2));
|
||
|
if (distance > this.radius) {
|
||
|
var angle = Math.atan2(this.target.y - center.y, this.target.x - center.x);
|
||
|
toX = this.target.x - Math.cos(angle) * this.radius;
|
||
|
toY = this.target.y - Math.sin(angle) * this.radius;
|
||
|
} else {
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
if (this.speed) {
|
||
|
var deltaX = toX - center.x;
|
||
|
var deltaY = toY - center.y;
|
||
|
if (deltaX || deltaY) {
|
||
|
var _angle = Math.atan2(toY - center.y, toX - center.x);
|
||
|
var changeX = Math.cos(_angle) * this.speed;
|
||
|
var changeY = Math.sin(_angle) * this.speed;
|
||
|
var x = Math.abs(changeX) > Math.abs(deltaX) ? toX : center.x + changeX;
|
||
|
var y = Math.abs(changeY) > Math.abs(deltaY) ? toY : center.y + changeY;
|
||
|
this.parent.moveCenter(x, y);
|
||
|
this.parent.emit('moved', { viewport: this.parent, type: 'follow' });
|
||
|
}
|
||
|
} else {
|
||
|
this.parent.moveCenter(toX, toY);
|
||
|
this.parent.emit('moved', { viewport: this.parent, type: 'follow' });
|
||
|
}
|
||
|
}
|
||
|
}]);
|
||
|
|
||
|
return Follow;
|
||
|
}(Plugin);
|
||
|
|
||
|
},{"./plugin":9}],7:[function(require,module,exports){
|
||
|
'use strict';
|
||
|
|
||
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
|
||
|
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; }
|
||
|
|
||
|
var utils = require('./utils');
|
||
|
var Plugin = require('./plugin');
|
||
|
|
||
|
module.exports = function (_Plugin) {
|
||
|
_inherits(MouseEdges, _Plugin);
|
||
|
|
||
|
/**
|
||
|
* Scroll viewport when mouse hovers near one of the edges.
|
||
|
* @private
|
||
|
* @param {Viewport} parent
|
||
|
* @param {object} [options]
|
||
|
* @param {number} [options.radius] distance from center of screen in screen pixels
|
||
|
* @param {number} [options.distance] distance from all sides in screen pixels
|
||
|
* @param {number} [options.top] alternatively, set top distance (leave unset for no top scroll)
|
||
|
* @param {number} [options.bottom] alternatively, set bottom distance (leave unset for no top scroll)
|
||
|
* @param {number} [options.left] alternatively, set left distance (leave unset for no top scroll)
|
||
|
* @param {number} [options.right] alternatively, set right distance (leave unset for no top scroll)
|
||
|
* @param {number} [options.speed=8] speed in pixels/frame to scroll viewport
|
||
|
* @param {boolean} [options.reverse] reverse direction of scroll
|
||
|
* @param {boolean} [options.noDecelerate] don't use decelerate plugin even if it's installed
|
||
|
* @param {boolean} [options.linear] if using radius, use linear movement (+/- 1, +/- 1) instead of angled movement (Math.cos(angle from center), Math.sin(angle from center))
|
||
|
*
|
||
|
* @event mouse-edge-start(Viewport) emitted when mouse-edge starts
|
||
|
* @event mouse-edge-end(Viewport) emitted when mouse-edge ends
|
||
|
*/
|
||
|
function MouseEdges(parent, options) {
|
||
|
_classCallCheck(this, MouseEdges);
|
||
|
|
||
|
var _this = _possibleConstructorReturn(this, (MouseEdges.__proto__ || Object.getPrototypeOf(MouseEdges)).call(this, parent));
|
||
|
|
||
|
options = options || {};
|
||
|
_this.options = options;
|
||
|
_this.reverse = options.reverse ? 1 : -1;
|
||
|
_this.noDecelerate = options.noDecelerate;
|
||
|
_this.linear = options.linear;
|
||
|
_this.radiusSquared = Math.pow(options.radius, 2);
|
||
|
_this.resize();
|
||
|
_this.speed = options.speed || 8;
|
||
|
return _this;
|
||
|
}
|
||
|
|
||
|
_createClass(MouseEdges, [{
|
||
|
key: 'resize',
|
||
|
value: function resize() {
|
||
|
var options = this.options;
|
||
|
var distance = options.distance;
|
||
|
if (utils.exists(distance)) {
|
||
|
this.left = distance;
|
||
|
this.top = distance;
|
||
|
this.right = window.innerWidth - distance;
|
||
|
this.bottom = window.innerHeight - distance;
|
||
|
} else if (!this.radius) {
|
||
|
this.left = utils.exists(options.left) ? options.left : null;
|
||
|
this.top = utils.exists(options.top) ? options.top : null;
|
||
|
this.right = utils.exists(options.right) ? window.innerWidth - options.right : null;
|
||
|
this.bottom = utils.exists(options.bottom) ? window.innerHeight - options.bottom : null;
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'down',
|
||
|
value: function down() {
|
||
|
this.horizontal = this.vertical = null;
|
||
|
}
|
||
|
}, {
|
||
|
key: 'move',
|
||
|
value: function move(e) {
|
||
|
if (e.data.identifier !== 'MOUSE' || e.data.buttons !== 0) {
|
||
|
return;
|
||
|
}
|
||
|
var x = e.data.global.x;
|
||
|
var y = e.data.global.y;
|
||
|
|
||
|
if (this.radiusSquared) {
|
||
|
var center = this.parent.toScreen(this.parent.center);
|
||
|
var distance = Math.pow(center.x - x, 2) + Math.pow(center.y - y, 2);
|
||
|
if (distance >= this.radiusSquared) {
|
||
|
var angle = Math.atan2(center.y - y, center.x - x);
|
||
|
if (this.linear) {
|
||
|
this.horizontal = Math.round(Math.cos(angle)) * this.speed * this.reverse * (60 / 1000);
|
||
|
this.vertical = Math.round(Math.sin(angle)) * this.speed * this.reverse * (60 / 1000);
|
||
|
} else {
|
||
|
this.horizontal = Math.cos(angle) * this.speed * this.reverse * (60 / 1000);
|
||
|
this.vertical = Math.sin(angle) * this.speed * this.reverse * (60 / 1000);
|
||
|
}
|
||
|
} else {
|
||
|
if (this.horizontal) {
|
||
|
this.decelerateHorizontal();
|
||
|
}
|
||
|
if (this.vertical) {
|
||
|
this.decelerateVertical();
|
||
|
}
|
||
|
this.horizontal = this.vertical = 0;
|
||
|
}
|
||
|
} else {
|
||
|
if (utils.exists(this.left) && x < this.left) {
|
||
|
this.horizontal = 1 * this.reverse * this.speed * (60 / 1000);
|
||
|
} else if (utils.exists(this.right) && x > this.right) {
|
||
|
this.horizontal = -1 * this.reverse * this.speed * (60 / 1000);
|
||
|
} else {
|
||
|
this.decelerateHorizontal();
|
||
|
this.horizontal = 0;
|
||
|
}
|
||
|
if (utils.exists(this.top) && y < this.top) {
|
||
|
this.vertical = 1 * this.reverse * this.speed * (60 / 1000);
|
||
|
} else if (utils.exists(this.bottom) && y > this.bottom) {
|
||
|
this.vertical = -1 * this.reverse * this.speed * (60 / 1000);
|
||
|
} else {
|
||
|
this.decelerateVertical();
|
||
|
this.vertical = 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'decelerateHorizontal',
|
||
|
value: function decelerateHorizontal() {
|
||
|
var decelerate = this.parent.plugins['decelerate'];
|
||
|
if (this.horizontal && decelerate && !this.noDecelerate) {
|
||
|
decelerate.activate({ x: this.horizontal * this.speed * this.reverse / (1000 / 60) });
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'decelerateVertical',
|
||
|
value: function decelerateVertical() {
|
||
|
var decelerate = this.parent.plugins['decelerate'];
|
||
|
if (this.vertical && decelerate && !this.noDecelerate) {
|
||
|
decelerate.activate({ y: this.vertical * this.speed * this.reverse / (1000 / 60) });
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'up',
|
||
|
value: function up() {
|
||
|
if (this.horizontal) {
|
||
|
this.decelerateHorizontal();
|
||
|
}
|
||
|
if (this.vertical) {
|
||
|
this.decelerateVertical();
|
||
|
}
|
||
|
this.horizontal = this.vertical = null;
|
||
|
}
|
||
|
}, {
|
||
|
key: 'update',
|
||
|
value: function update() {
|
||
|
if (this.paused) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (this.horizontal || this.vertical) {
|
||
|
var center = this.parent.center;
|
||
|
if (this.horizontal) {
|
||
|
center.x += this.horizontal * this.speed;
|
||
|
}
|
||
|
if (this.vertical) {
|
||
|
center.y += this.vertical * this.speed;
|
||
|
}
|
||
|
this.parent.moveCenter(center);
|
||
|
this.parent.emit('moved', { viewport: this.parent, type: 'mouse-edges' });
|
||
|
}
|
||
|
}
|
||
|
}]);
|
||
|
|
||
|
return MouseEdges;
|
||
|
}(Plugin);
|
||
|
|
||
|
},{"./plugin":9,"./utils":12}],8:[function(require,module,exports){
|
||
|
'use strict';
|
||
|
|
||
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
|
||
|
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; }
|
||
|
|
||
|
var Plugin = require('./plugin');
|
||
|
|
||
|
module.exports = function (_Plugin) {
|
||
|
_inherits(Pinch, _Plugin);
|
||
|
|
||
|
/**
|
||
|
* @private
|
||
|
* @param {Viewport} parent
|
||
|
* @param {object} [options]
|
||
|
* @param {boolean} [options.noDrag] disable two-finger dragging
|
||
|
* @param {number} [options.percent=1.0] percent to modify pinch speed
|
||
|
* @param {PIXI.Point} [options.center] place this point at center during zoom instead of center of two fingers
|
||
|
*/
|
||
|
function Pinch(parent, options) {
|
||
|
_classCallCheck(this, Pinch);
|
||
|
|
||
|
var _this = _possibleConstructorReturn(this, (Pinch.__proto__ || Object.getPrototypeOf(Pinch)).call(this, parent));
|
||
|
|
||
|
options = options || {};
|
||
|
_this.percent = options.percent || 1.0;
|
||
|
_this.noDrag = options.noDrag;
|
||
|
_this.center = options.center;
|
||
|
return _this;
|
||
|
}
|
||
|
|
||
|
_createClass(Pinch, [{
|
||
|
key: 'down',
|
||
|
value: function down() {
|
||
|
if (this.parent.countDownPointers() >= 2) {
|
||
|
this.active = true;
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'move',
|
||
|
value: function move(e) {
|
||
|
if (this.paused || !this.active) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var x = e.data.global.x;
|
||
|
var y = e.data.global.y;
|
||
|
|
||
|
var pointers = this.parent.getTouchPointers();
|
||
|
if (pointers.length >= 2) {
|
||
|
var first = pointers[0];
|
||
|
var second = pointers[1];
|
||
|
var last = first.last && second.last ? Math.sqrt(Math.pow(second.last.x - first.last.x, 2) + Math.pow(second.last.y - first.last.y, 2)) : null;
|
||
|
if (first.pointerId === e.data.pointerId) {
|
||
|
first.last = { x: x, y: y, data: e.data };
|
||
|
} else if (second.pointerId === e.data.pointerId) {
|
||
|
second.last = { x: x, y: y, data: e.data };
|
||
|
}
|
||
|
if (last) {
|
||
|
var oldPoint = void 0;
|
||
|
var point = { x: first.last.x + (second.last.x - first.last.x) / 2, y: first.last.y + (second.last.y - first.last.y) / 2 };
|
||
|
if (!this.center) {
|
||
|
oldPoint = this.parent.toLocal(point);
|
||
|
}
|
||
|
var dist = Math.sqrt(Math.pow(second.last.x - first.last.x, 2) + Math.pow(second.last.y - first.last.y, 2));
|
||
|
var change = (dist - last) / this.parent.screenWidth * this.parent.scale.x * this.percent;
|
||
|
this.parent.scale.x += change;
|
||
|
this.parent.scale.y += change;
|
||
|
this.parent.emit('zoomed', { viewport: this.parent, type: 'pinch' });
|
||
|
var clamp = this.parent.plugins['clamp-zoom'];
|
||
|
if (clamp) {
|
||
|
clamp.clamp();
|
||
|
}
|
||
|
if (this.center) {
|
||
|
this.parent.moveCenter(this.center);
|
||
|
} else {
|
||
|
var newPoint = this.parent.toGlobal(oldPoint);
|
||
|
this.parent.x += point.x - newPoint.x;
|
||
|
this.parent.y += point.y - newPoint.y;
|
||
|
this.parent.emit('moved', { viewport: this.parent, type: 'pinch' });
|
||
|
}
|
||
|
if (!this.noDrag && this.lastCenter) {
|
||
|
this.parent.x += point.x - this.lastCenter.x;
|
||
|
this.parent.y += point.y - this.lastCenter.y;
|
||
|
this.parent.emit('moved', { viewport: this.parent, type: 'pinch' });
|
||
|
}
|
||
|
this.lastCenter = point;
|
||
|
this.moved = true;
|
||
|
} else {
|
||
|
if (!this.pinching) {
|
||
|
this.parent.emit('pinch-start', this.parent);
|
||
|
this.pinching = true;
|
||
|
}
|
||
|
}
|
||
|
this.parent.dirty = true;
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'up',
|
||
|
value: function up() {
|
||
|
if (this.pinching) {
|
||
|
if (this.parent.touches.length <= 1) {
|
||
|
this.active = false;
|
||
|
this.lastCenter = null;
|
||
|
this.pinching = false;
|
||
|
this.moved = false;
|
||
|
this.parent.emit('pinch-end', this.parent);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}]);
|
||
|
|
||
|
return Pinch;
|
||
|
}(Plugin);
|
||
|
|
||
|
},{"./plugin":9}],9:[function(require,module,exports){
|
||
|
"use strict";
|
||
|
|
||
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
|
||
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
||
|
|
||
|
module.exports = function () {
|
||
|
function Plugin(parent) {
|
||
|
_classCallCheck(this, Plugin);
|
||
|
|
||
|
this.parent = parent;
|
||
|
this.paused = false;
|
||
|
}
|
||
|
|
||
|
_createClass(Plugin, [{
|
||
|
key: "down",
|
||
|
value: function down() {}
|
||
|
}, {
|
||
|
key: "move",
|
||
|
value: function move() {}
|
||
|
}, {
|
||
|
key: "up",
|
||
|
value: function up() {}
|
||
|
}, {
|
||
|
key: "wheel",
|
||
|
value: function wheel() {}
|
||
|
}, {
|
||
|
key: "update",
|
||
|
value: function update() {}
|
||
|
}, {
|
||
|
key: "resize",
|
||
|
value: function resize() {}
|
||
|
}, {
|
||
|
key: "reset",
|
||
|
value: function reset() {}
|
||
|
}, {
|
||
|
key: "pause",
|
||
|
value: function pause() {
|
||
|
this.paused = true;
|
||
|
}
|
||
|
}, {
|
||
|
key: "resume",
|
||
|
value: function resume() {
|
||
|
this.paused = false;
|
||
|
}
|
||
|
}]);
|
||
|
|
||
|
return Plugin;
|
||
|
}();
|
||
|
|
||
|
},{}],10:[function(require,module,exports){
|
||
|
'use strict';
|
||
|
|
||
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
|
||
|
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
|
||
|
|
||
|
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; }
|
||
|
|
||
|
var Plugin = require('./plugin');
|
||
|
var utils = require('./utils');
|
||
|
|
||
|
module.exports = function (_Plugin) {
|
||
|
_inherits(SnapZoom, _Plugin);
|
||
|
|
||
|
/**
|
||
|
* @private
|
||
|
* @param {Viewport} parent
|
||
|
* @param {object} [options]
|
||
|
* @param {number} [options.width] the desired width to snap (to maintain aspect ratio, choose only width or height)
|
||
|
* @param {number} [options.height] the desired height to snap (to maintain aspect ratio, choose only width or height)
|
||
|
* @param {number} [options.time=1000]
|
||
|
* @param {string|function} [options.ease=easeInOutSine] ease function or name (see http://easings.net/ for supported names)
|
||
|
* @param {PIXI.Point} [options.center] place this point at center during zoom instead of center of the viewport
|
||
|
* @param {boolean} [options.interrupt=true] pause snapping with any user input on the viewport
|
||
|
* @param {boolean} [options.removeOnComplete] removes this plugin after snapping is complete
|
||
|
* @param {boolean} [options.removeOnInterrupt] removes this plugin if interrupted by any user input
|
||
|
* @param {boolean} [options.forceStart] starts the snap immediately regardless of whether the viewport is at the desired zoom
|
||
|
* @param {boolean} [options.noMove] zoom but do not move
|
||
|
*
|
||
|
* @event snap-zoom-start(Viewport) emitted each time a fit animation starts
|
||
|
* @event snap-zoom-end(Viewport) emitted each time fit reaches its target
|
||
|
* @event snap-zoom-end(Viewport) emitted each time fit reaches its target
|
||
|
*/
|
||
|
function SnapZoom(parent, options) {
|
||
|
_classCallCheck(this, SnapZoom);
|
||
|
|
||
|
var _this = _possibleConstructorReturn(this, (SnapZoom.__proto__ || Object.getPrototypeOf(SnapZoom)).call(this, parent));
|
||
|
|
||
|
options = options || {};
|
||
|
_this.width = options.width;
|
||
|
_this.height = options.height;
|
||
|
if (_this.width > 0) {
|
||
|
_this.x_scale = parent._screenWidth / _this.width;
|
||
|
}
|
||
|
if (_this.height > 0) {
|
||
|
_this.y_scale = parent._screenHeight / _this.height;
|
||
|
}
|
||
|
_this.xIndependent = utils.exists(_this.x_scale);
|
||
|
_this.yIndependent = utils.exists(_this.y_scale);
|
||
|
_this.x_scale = _this.xIndependent ? _this.x_scale : _this.y_scale;
|
||
|
_this.y_scale = _this.yIndependent ? _this.y_scale : _this.x_scale;
|
||
|
|
||
|
_this.time = utils.defaults(options.time, 1000);
|
||
|
_this.ease = utils.ease(options.ease, 'easeInOutSine');
|
||
|
_this.center = options.center;
|
||
|
_this.noMove = options.noMove;
|
||
|
_this.stopOnResize = options.stopOnResize;
|
||
|
_this.removeOnInterrupt = options.removeOnInterrupt;
|
||
|
_this.removeOnComplete = utils.defaults(options.removeOnComplete, true);
|
||
|
_this.interrupt = utils.defaults(options.interrupt, true);
|
||
|
if (_this.time === 0) {
|
||
|
parent.container.scale.x = _this.x_scale;
|
||
|
parent.container.scale.y = _this.y_scale;
|
||
|
if (_this.removeOnComplete) {
|
||
|
_this.parent.removePlugin('snap-zoom');
|
||
|
}
|
||
|
} else if (options.forceStart) {
|
||
|
_this.createSnapping();
|
||
|
}
|
||
|
return _this;
|
||
|
}
|
||
|
|
||
|
_createClass(SnapZoom, [{
|
||
|
key: 'createSnapping',
|
||
|
value: function createSnapping() {
|
||
|
var scale = this.parent.scale;
|
||
|
this.snapping = { time: 0, startX: scale.x, startY: scale.y, deltaX: this.x_scale - scale.x, deltaY: this.y_scale - scale.y };
|
||
|
this.parent.emit('snap-zoom-start', this.parent);
|
||
|
}
|
||
|
}, {
|
||
|
key: 'resize',
|
||
|
value: function resize() {
|
||
|
this.snapping = null;
|
||
|
|
||
|
if (this.width > 0) {
|
||
|
this.x_scale = this.parent._screenWidth / this.width;
|
||
|
}
|
||
|
if (this.height > 0) {
|
||
|
this.y_scale = this.parent._screenHeight / this.height;
|
||
|
}
|
||
|
this.x_scale = this.xIndependent ? this.x_scale : this.y_scale;
|
||
|
this.y_scale = this.yIndependent ? this.y_scale : this.x_scale;
|
||
|
}
|
||
|
}, {
|
||
|
key: 'reset',
|
||
|
value: function reset() {
|
||
|
this.snapping = null;
|
||
|
}
|
||
|
}, {
|
||
|
key: 'wheel',
|
||
|
value: function wheel() {
|
||
|
if (this.removeOnInterrupt) {
|
||
|
this.parent.removePlugin('snap-zoom');
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'down',
|
||
|
value: function down() {
|
||
|
if (this.removeOnInterrupt) {
|
||
|
this.parent.removePlugin('snap-zoom');
|
||
|
} else if (this.interrupt) {
|
||
|
this.snapping = null;
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'update',
|
||
|
value: function update(elapsed) {
|
||
|
if (this.paused) {
|
||
|
return;
|
||
|
}
|
||
|
if (this.interrupt && this.parent.countDownPointers() !== 0) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var oldCenter = void 0;
|
||
|
if (!this.center && !this.noMove) {
|
||
|
oldCenter = this.parent.center;
|
||
|
}
|
||
|
if (!this.snapping) {
|
||
|
if (this.parent.scale.x !== this.x_scale || this.parent.scale.y !== this.y_scale) {
|
||
|
this.createSnapping();
|
||
|
}
|
||
|
} else if (this.snapping) {
|
||
|
var snapping = this.snapping;
|
||
|
snapping.time += elapsed;
|
||
|
if (snapping.time >= this.time) {
|
||
|
this.parent.scale.set(this.x_scale, this.y_scale);
|
||
|
if (this.removeOnComplete) {
|
||
|
this.parent.removePlugin('snap-zoom');
|
||
|
}
|
||
|
this.parent.emit('snap-zoom-end', this.parent);
|
||
|
this.snapping = null;
|
||
|
} else {
|
||
|
var _snapping = this.snapping;
|
||
|
this.parent.scale.x = this.ease(_snapping.time, _snapping.startX, _snapping.deltaX, this.time);
|
||
|
this.parent.scale.y = this.ease(_snapping.time, _snapping.startY, _snapping.deltaY, this.time);
|
||
|
}
|
||
|
var clamp = this.parent.plugins['clamp-zoom'];
|
||
|
if (clamp) {
|
||
|
clamp.clamp();
|
||
|
}
|
||
|
if (!this.noMove) {
|
||
|
if (!this.center) {
|
||
|
this.parent.moveCenter(oldCenter);
|
||
|
} else {
|
||
|
this.parent.moveCenter(this.center);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'resume',
|
||
|
value: function resume() {
|
||
|
this.snapping = null;
|
||
|
_get(SnapZoom.prototype.__proto__ || Object.getPrototypeOf(SnapZoom.prototype), 'resume', this).call(this);
|
||
|
}
|
||
|
}]);
|
||
|
|
||
|
return SnapZoom;
|
||
|
}(Plugin);
|
||
|
|
||
|
},{"./plugin":9,"./utils":12}],11:[function(require,module,exports){
|
||
|
'use strict';
|
||
|
|
||
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
|
||
|
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; }
|
||
|
|
||
|
var Plugin = require('./plugin');
|
||
|
var utils = require('./utils');
|
||
|
|
||
|
module.exports = function (_Plugin) {
|
||
|
_inherits(Snap, _Plugin);
|
||
|
|
||
|
/**
|
||
|
* @private
|
||
|
* @param {Viewport} parent
|
||
|
* @param {number} x
|
||
|
* @param {number} y
|
||
|
* @param {object} [options]
|
||
|
* @param {boolean} [options.topLeft] snap to the top-left of viewport instead of center
|
||
|
* @param {number} [options.friction=0.8] friction/frame to apply if decelerate is active
|
||
|
* @param {number} [options.time=1000]
|
||
|
* @param {string|function} [options.ease=easeInOutSine] ease function or name (see http://easings.net/ for supported names)
|
||
|
* @param {boolean} [options.interrupt=true] pause snapping with any user input on the viewport
|
||
|
* @param {boolean} [options.removeOnComplete] removes this plugin after snapping is complete
|
||
|
* @param {boolean} [options.removeOnInterrupt] removes this plugin if interrupted by any user input
|
||
|
* @param {boolean} [options.forceStart] starts the snap immediately regardless of whether the viewport is at the desired location
|
||
|
*
|
||
|
* @event snap-start(Viewport) emitted each time a snap animation starts
|
||
|
* @event snap-restart(Viewport) emitted each time a snap resets because of a change in viewport size
|
||
|
* @event snap-end(Viewport) emitted each time snap reaches its target
|
||
|
* @event snap-remove(Viewport) emitted if snap plugin is removed
|
||
|
*/
|
||
|
function Snap(parent, x, y, options) {
|
||
|
_classCallCheck(this, Snap);
|
||
|
|
||
|
var _this = _possibleConstructorReturn(this, (Snap.__proto__ || Object.getPrototypeOf(Snap)).call(this, parent));
|
||
|
|
||
|
options = options || {};
|
||
|
_this.friction = options.friction || 0.8;
|
||
|
_this.time = options.time || 1000;
|
||
|
_this.ease = utils.ease(options.ease, 'easeInOutSine');
|
||
|
_this.x = x;
|
||
|
_this.y = y;
|
||
|
_this.topLeft = options.topLeft;
|
||
|
_this.interrupt = utils.defaults(options.interrupt, true);
|
||
|
_this.removeOnComplete = options.removeOnComplete;
|
||
|
_this.removeOnInterrupt = options.removeOnInterrupt;
|
||
|
if (options.forceStart) {
|
||
|
_this.startEase();
|
||
|
}
|
||
|
return _this;
|
||
|
}
|
||
|
|
||
|
_createClass(Snap, [{
|
||
|
key: 'snapStart',
|
||
|
value: function snapStart() {
|
||
|
this.percent = 0;
|
||
|
this.snapping = { time: 0 };
|
||
|
var current = this.topLeft ? this.parent.corner : this.parent.center;
|
||
|
this.deltaX = this.x - current.x;
|
||
|
this.deltaY = this.y - current.y;
|
||
|
this.startX = current.x;
|
||
|
this.startY = current.y;
|
||
|
this.parent.emit('snap-start', this.parent);
|
||
|
}
|
||
|
}, {
|
||
|
key: 'wheel',
|
||
|
value: function wheel() {
|
||
|
if (this.removeOnInterrupt) {
|
||
|
this.parent.removePlugin('snap');
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'down',
|
||
|
value: function down() {
|
||
|
if (this.removeOnInterrupt) {
|
||
|
this.parent.removePlugin('snap');
|
||
|
} else if (this.interrupt) {
|
||
|
this.snapping = null;
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'up',
|
||
|
value: function up() {
|
||
|
if (this.parent.countDownPointers() === 0) {
|
||
|
var decelerate = this.parent.plugins['decelerate'];
|
||
|
if (decelerate && (decelerate.x || decelerate.y)) {
|
||
|
decelerate.percentChangeX = decelerate.percentChangeY = this.friction;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'update',
|
||
|
value: function update(elapsed) {
|
||
|
if (this.paused) {
|
||
|
return;
|
||
|
}
|
||
|
if (this.interrupt && this.parent.countDownPointers() !== 0) {
|
||
|
return;
|
||
|
}
|
||
|
if (!this.snapping) {
|
||
|
var current = this.topLeft ? this.parent.corner : this.parent.center;
|
||
|
if (current.x !== this.x || current.y !== this.y) {
|
||
|
this.snapStart();
|
||
|
}
|
||
|
} else {
|
||
|
var snapping = this.snapping;
|
||
|
snapping.time += elapsed;
|
||
|
var finished = void 0,
|
||
|
x = void 0,
|
||
|
y = void 0;
|
||
|
if (snapping.time > this.time) {
|
||
|
finished = true;
|
||
|
x = this.startX + this.deltaX;
|
||
|
y = this.startY + this.deltaY;
|
||
|
} else {
|
||
|
var percent = this.ease(snapping.time, 0, 1, this.time);
|
||
|
x = this.startX + this.deltaX * percent;
|
||
|
y = this.startY + this.deltaY * percent;
|
||
|
}
|
||
|
if (this.topLeft) {
|
||
|
this.parent.moveCorner(x, y);
|
||
|
} else {
|
||
|
this.parent.moveCenter(x, y);
|
||
|
}
|
||
|
this.parent.emit('moved', { viewport: this.parent, type: 'snap' });
|
||
|
if (finished) {
|
||
|
if (this.removeOnComplete) {
|
||
|
this.parent.removePlugin('snap');
|
||
|
}
|
||
|
this.parent.emit('snap-end', this.parent);
|
||
|
this.snapping = null;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}]);
|
||
|
|
||
|
return Snap;
|
||
|
}(Plugin);
|
||
|
|
||
|
},{"./plugin":9,"./utils":12}],12:[function(require,module,exports){
|
||
|
'use strict';
|
||
|
|
||
|
var Penner = require('penner');
|
||
|
|
||
|
function exists(a) {
|
||
|
return a !== undefined && a !== null;
|
||
|
}
|
||
|
|
||
|
function defaults(a, defaults) {
|
||
|
return a !== undefined && a !== null ? a : defaults;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param {(function|string)} [ease]
|
||
|
* @param {string} defaults for pennr equation
|
||
|
* @private
|
||
|
* @returns {function} correct penner equation
|
||
|
*/
|
||
|
function ease(ease, defaults) {
|
||
|
if (!exists(ease)) {
|
||
|
return Penner[defaults];
|
||
|
} else if (typeof ease === 'function') {
|
||
|
return ease;
|
||
|
} else if (typeof ease === 'string') {
|
||
|
return Penner[ease];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
exists: exists,
|
||
|
defaults: defaults,
|
||
|
ease: ease
|
||
|
};
|
||
|
|
||
|
},{"penner":15}],13:[function(require,module,exports){
|
||
|
'use strict';
|
||
|
|
||
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
|
||
|
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
|
||
|
|
||
|
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; }
|
||
|
|
||
|
var utils = require('./utils');
|
||
|
var Drag = require('./drag');
|
||
|
var Pinch = require('./pinch');
|
||
|
var Clamp = require('./clamp');
|
||
|
var ClampZoom = require('./clamp-zoom');
|
||
|
var Decelerate = require('./decelerate');
|
||
|
var Bounce = require('./bounce');
|
||
|
var Snap = require('./snap');
|
||
|
var SnapZoom = require('./snap-zoom');
|
||
|
var Follow = require('./follow');
|
||
|
var Wheel = require('./wheel');
|
||
|
var MouseEdges = require('./mouse-edges');
|
||
|
|
||
|
var PLUGIN_ORDER = ['drag', 'pinch', 'wheel', 'follow', 'mouse-edges', 'decelerate', 'bounce', 'snap-zoom', 'clamp-zoom', 'snap', 'clamp'];
|
||
|
|
||
|
var Viewport = function (_PIXI$Container) {
|
||
|
_inherits(Viewport, _PIXI$Container);
|
||
|
|
||
|
/**
|
||
|
* @extends PIXI.Container
|
||
|
* @extends EventEmitter
|
||
|
* @param {object} [options]
|
||
|
* @param {number} [options.screenWidth=window.innerWidth]
|
||
|
* @param {number} [options.screenHeight=window.innerHeight]
|
||
|
* @param {number} [options.worldWidth=this.width]
|
||
|
* @param {number} [options.worldHeight=this.height]
|
||
|
* @param {number} [options.threshold = 5] number of pixels to move to trigger an input event (e.g., drag, pinch)
|
||
|
* @param {(PIXI.Rectangle|PIXI.Circle|PIXI.Ellipse|PIXI.Polygon|PIXI.RoundedRectangle)} [options.forceHitArea] change the default hitArea from world size to a new value
|
||
|
* @param {PIXI.ticker.Ticker} [options.ticker=PIXI.ticker.shared] use this PIXI.ticker for updates
|
||
|
* @param {PIXI.InteractionManager} [options.interaction=null] InteractionManager, available from instantiated WebGLRenderer/CanvasRenderer.plugins.interaction - used to calculate pointer postion relative to canvas location on screen
|
||
|
* @param {HTMLElement} [options.divWheel=document.body] div to attach the wheel event
|
||
|
* @fires clicked
|
||
|
* @fires drag-start
|
||
|
* @fires drag-end
|
||
|
* @fires drag-remove
|
||
|
* @fires pinch-start
|
||
|
* @fires pinch-end
|
||
|
* @fires pinch-remove
|
||
|
* @fires snap-start
|
||
|
* @fires snap-end
|
||
|
* @fires snap-remove
|
||
|
* @fires snap-zoom-start
|
||
|
* @fires snap-zoom-end
|
||
|
* @fires snap-zoom-remove
|
||
|
* @fires bounce-x-start
|
||
|
* @fires bounce-x-end
|
||
|
* @fires bounce-y-start
|
||
|
* @fires bounce-y-end
|
||
|
* @fires bounce-remove
|
||
|
* @fires wheel
|
||
|
* @fires wheel-remove
|
||
|
* @fires wheel-scroll
|
||
|
* @fires wheel-scroll-remove
|
||
|
* @fires mouse-edge-start
|
||
|
* @fires mouse-edge-end
|
||
|
* @fires mouse-edge-remove
|
||
|
* @fires moved
|
||
|
*/
|
||
|
function Viewport(options) {
|
||
|
_classCallCheck(this, Viewport);
|
||
|
|
||
|
options = options || {};
|
||
|
|
||
|
var _this = _possibleConstructorReturn(this, (Viewport.__proto__ || Object.getPrototypeOf(Viewport)).call(this));
|
||
|
|
||
|
_this.plugins = {};
|
||
|
_this.pluginsList = [];
|
||
|
_this._screenWidth = options.screenWidth;
|
||
|
_this._screenHeight = options.screenHeight;
|
||
|
_this._worldWidth = options.worldWidth;
|
||
|
_this._worldHeight = options.worldHeight;
|
||
|
_this.hitAreaFullScreen = utils.defaults(options.hitAreaFullScreen, true);
|
||
|
_this.forceHitArea = options.forceHitArea;
|
||
|
_this.threshold = utils.defaults(options.threshold, 5);
|
||
|
_this.interaction = options.interaction || null;
|
||
|
_this.div = options.divWheel || document.body;
|
||
|
_this.listeners(_this.div);
|
||
|
|
||
|
/**
|
||
|
* active touch point ids on the viewport
|
||
|
* @type {number[]}
|
||
|
* @readonly
|
||
|
*/
|
||
|
_this.touches = [];
|
||
|
|
||
|
_this.ticker = options.ticker || PIXI.ticker.shared;
|
||
|
_this.tickerFunction = function () {
|
||
|
return _this.update();
|
||
|
};
|
||
|
_this.ticker.add(_this.tickerFunction);
|
||
|
return _this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* removes all event listeners from viewport
|
||
|
* (useful for cleanup of wheel and ticker events when removing viewport)
|
||
|
*/
|
||
|
|
||
|
|
||
|
_createClass(Viewport, [{
|
||
|
key: 'removeListeners',
|
||
|
value: function removeListeners() {
|
||
|
this.ticker.remove(this.tickerFunction);
|
||
|
this.div.removeEventListener('wheel', this.wheelFunction);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* overrides PIXI.Container's destroy to also remove the 'wheel' and PIXI.Ticker listeners
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'destroy',
|
||
|
value: function destroy(options) {
|
||
|
_get(Viewport.prototype.__proto__ || Object.getPrototypeOf(Viewport.prototype), 'destroy', this).call(this, options);
|
||
|
this.removeListeners();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* update animations
|
||
|
* @private
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'update',
|
||
|
value: function update() {
|
||
|
if (!this.pause) {
|
||
|
var _iteratorNormalCompletion = true;
|
||
|
var _didIteratorError = false;
|
||
|
var _iteratorError = undefined;
|
||
|
|
||
|
try {
|
||
|
for (var _iterator = this.pluginsList[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
||
|
var plugin = _step.value;
|
||
|
|
||
|
plugin.update(this.ticker.elapsedMS);
|
||
|
}
|
||
|
} catch (err) {
|
||
|
_didIteratorError = true;
|
||
|
_iteratorError = err;
|
||
|
} finally {
|
||
|
try {
|
||
|
if (!_iteratorNormalCompletion && _iterator.return) {
|
||
|
_iterator.return();
|
||
|
}
|
||
|
} finally {
|
||
|
if (_didIteratorError) {
|
||
|
throw _iteratorError;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if (!this.forceHitArea) {
|
||
|
this.hitArea.x = this.left;
|
||
|
this.hitArea.y = this.top;
|
||
|
this.hitArea.width = this.worldScreenWidth;
|
||
|
this.hitArea.height = this.worldScreenHeight;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* use this to set screen and world sizes--needed for pinch/wheel/clamp/bounce
|
||
|
* @param {number} screenWidth
|
||
|
* @param {number} screenHeight
|
||
|
* @param {number} [worldWidth]
|
||
|
* @param {number} [worldHeight]
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'resize',
|
||
|
value: function resize(screenWidth, screenHeight, worldWidth, worldHeight) {
|
||
|
this._screenWidth = screenWidth || window.innerWidth;
|
||
|
this._screenHeight = screenHeight || window.innerHeight;
|
||
|
this._worldWidth = worldWidth;
|
||
|
this._worldHeight = worldHeight;
|
||
|
this.resizePlugins();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* called after a worldWidth/Height change
|
||
|
* @private
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'resizePlugins',
|
||
|
value: function resizePlugins() {
|
||
|
var _iteratorNormalCompletion2 = true;
|
||
|
var _didIteratorError2 = false;
|
||
|
var _iteratorError2 = undefined;
|
||
|
|
||
|
try {
|
||
|
for (var _iterator2 = this.pluginsList[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
||
|
var plugin = _step2.value;
|
||
|
|
||
|
plugin.resize();
|
||
|
}
|
||
|
} catch (err) {
|
||
|
_didIteratorError2 = true;
|
||
|
_iteratorError2 = err;
|
||
|
} finally {
|
||
|
try {
|
||
|
if (!_iteratorNormalCompletion2 && _iterator2.return) {
|
||
|
_iterator2.return();
|
||
|
}
|
||
|
} finally {
|
||
|
if (_didIteratorError2) {
|
||
|
throw _iteratorError2;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* screen width in screen pixels
|
||
|
* @type {number}
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'listeners',
|
||
|
|
||
|
|
||
|
/**
|
||
|
* add input listeners
|
||
|
* @private
|
||
|
*/
|
||
|
value: function listeners(div) {
|
||
|
var _this2 = this;
|
||
|
|
||
|
this.interactive = true;
|
||
|
if (!this.forceHitArea) {
|
||
|
this.hitArea = new PIXI.Rectangle(0, 0, this.worldWidth, this.worldHeight);
|
||
|
}
|
||
|
this.on('pointerdown', this.down);
|
||
|
this.on('pointermove', this.move);
|
||
|
this.on('pointerup', this.up);
|
||
|
this.on('pointerupoutside', this.up);
|
||
|
this.on('pointercancel', this.up);
|
||
|
this.on('pointerout', this.up);
|
||
|
this.wheelFunction = function (e) {
|
||
|
return _this2.handleWheel(e);
|
||
|
};
|
||
|
div.addEventListener('wheel', this.wheelFunction);
|
||
|
this.leftDown = false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* handle down events
|
||
|
* @private
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'down',
|
||
|
value: function down(e) {
|
||
|
if (this.pause) {
|
||
|
return;
|
||
|
}
|
||
|
if (e.data.pointerType === 'mouse') {
|
||
|
if (e.data.originalEvent.button == 0) {
|
||
|
this.leftDown = true;
|
||
|
}
|
||
|
} else {
|
||
|
this.touches.push(e.data.pointerId);
|
||
|
}
|
||
|
|
||
|
if (this.countDownPointers() === 1) {
|
||
|
this.last = { x: e.data.global.x, y: e.data.global.y
|
||
|
|
||
|
// clicked event does not fire if viewport is decelerating or bouncing
|
||
|
};var decelerate = this.plugins['decelerate'];
|
||
|
var bounce = this.plugins['bounce'];
|
||
|
if ((!decelerate || !decelerate.x && !decelerate.y) && (!bounce || !bounce.toX && !bounce.toY)) {
|
||
|
this.clickedAvailable = true;
|
||
|
}
|
||
|
} else {
|
||
|
this.clickedAvailable = false;
|
||
|
}
|
||
|
|
||
|
var _iteratorNormalCompletion3 = true;
|
||
|
var _didIteratorError3 = false;
|
||
|
var _iteratorError3 = undefined;
|
||
|
|
||
|
try {
|
||
|
for (var _iterator3 = this.pluginsList[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
|
||
|
var plugin = _step3.value;
|
||
|
|
||
|
plugin.down(e);
|
||
|
}
|
||
|
} catch (err) {
|
||
|
_didIteratorError3 = true;
|
||
|
_iteratorError3 = err;
|
||
|
} finally {
|
||
|
try {
|
||
|
if (!_iteratorNormalCompletion3 && _iterator3.return) {
|
||
|
_iterator3.return();
|
||
|
}
|
||
|
} finally {
|
||
|
if (_didIteratorError3) {
|
||
|
throw _iteratorError3;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* whether change exceeds threshold
|
||
|
* @private
|
||
|
* @param {number} change
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'checkThreshold',
|
||
|
value: function checkThreshold(change) {
|
||
|
if (Math.abs(change) >= this.threshold) {
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* handle move events
|
||
|
* @private
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'move',
|
||
|
value: function move(e) {
|
||
|
if (this.pause) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var _iteratorNormalCompletion4 = true;
|
||
|
var _didIteratorError4 = false;
|
||
|
var _iteratorError4 = undefined;
|
||
|
|
||
|
try {
|
||
|
for (var _iterator4 = this.pluginsList[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
|
||
|
var plugin = _step4.value;
|
||
|
|
||
|
plugin.move(e);
|
||
|
}
|
||
|
} catch (err) {
|
||
|
_didIteratorError4 = true;
|
||
|
_iteratorError4 = err;
|
||
|
} finally {
|
||
|
try {
|
||
|
if (!_iteratorNormalCompletion4 && _iterator4.return) {
|
||
|
_iterator4.return();
|
||
|
}
|
||
|
} finally {
|
||
|
if (_didIteratorError4) {
|
||
|
throw _iteratorError4;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (this.clickedAvailable) {
|
||
|
var distX = e.data.global.x - this.last.x;
|
||
|
var distY = e.data.global.y - this.last.y;
|
||
|
if (this.checkThreshold(distX) || this.checkThreshold(distY)) {
|
||
|
this.clickedAvailable = false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* handle up events
|
||
|
* @private
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'up',
|
||
|
value: function up(e) {
|
||
|
if (this.pause) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (e.data.originalEvent instanceof MouseEvent && e.data.originalEvent.button == 0) {
|
||
|
this.leftDown = false;
|
||
|
}
|
||
|
|
||
|
if (e.data.pointerType !== 'mouse') {
|
||
|
for (var i = 0; i < this.touches.length; i++) {
|
||
|
if (this.touches[i] === e.data.pointerId) {
|
||
|
this.touches.splice(i, 1);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var _iteratorNormalCompletion5 = true;
|
||
|
var _didIteratorError5 = false;
|
||
|
var _iteratorError5 = undefined;
|
||
|
|
||
|
try {
|
||
|
for (var _iterator5 = this.pluginsList[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
|
||
|
var plugin = _step5.value;
|
||
|
|
||
|
plugin.up(e);
|
||
|
}
|
||
|
} catch (err) {
|
||
|
_didIteratorError5 = true;
|
||
|
_iteratorError5 = err;
|
||
|
} finally {
|
||
|
try {
|
||
|
if (!_iteratorNormalCompletion5 && _iterator5.return) {
|
||
|
_iterator5.return();
|
||
|
}
|
||
|
} finally {
|
||
|
if (_didIteratorError5) {
|
||
|
throw _iteratorError5;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (this.clickedAvailable && this.countDownPointers() === 0) {
|
||
|
this.emit('clicked', { screen: this.last, world: this.toWorld(this.last), viewport: this });
|
||
|
this.clickedAvailable = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* gets pointer position if this.interaction is set
|
||
|
* @param {UIEvent} evt
|
||
|
* @private
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'getPointerPosition',
|
||
|
value: function getPointerPosition(evt) {
|
||
|
var point = new PIXI.Point();
|
||
|
if (this.interaction) {
|
||
|
this.interaction.mapPositionToPoint(point, evt.clientX, evt.clientY);
|
||
|
} else {
|
||
|
point.x = evt.clientX;
|
||
|
point.y = evt.clientY;
|
||
|
}
|
||
|
return point;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* handle wheel events
|
||
|
* @private
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'handleWheel',
|
||
|
value: function handleWheel(e) {
|
||
|
if (this.pause) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// only handle wheel events where the mouse is over the viewport
|
||
|
var point = this.toLocal(this.getPointerPosition(e));
|
||
|
if (this.left <= point.x && point.x <= this.right && this.top <= point.y && point.y <= this.bottom) {
|
||
|
var result = void 0;
|
||
|
var _iteratorNormalCompletion6 = true;
|
||
|
var _didIteratorError6 = false;
|
||
|
var _iteratorError6 = undefined;
|
||
|
|
||
|
try {
|
||
|
for (var _iterator6 = this.pluginsList[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
|
||
|
var plugin = _step6.value;
|
||
|
|
||
|
if (plugin.wheel(e)) {
|
||
|
result = true;
|
||
|
}
|
||
|
}
|
||
|
} catch (err) {
|
||
|
_didIteratorError6 = true;
|
||
|
_iteratorError6 = err;
|
||
|
} finally {
|
||
|
try {
|
||
|
if (!_iteratorNormalCompletion6 && _iterator6.return) {
|
||
|
_iterator6.return();
|
||
|
}
|
||
|
} finally {
|
||
|
if (_didIteratorError6) {
|
||
|
throw _iteratorError6;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return result;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* change coordinates from screen to world
|
||
|
* @param {number|PIXI.Point} x
|
||
|
* @param {number} [y]
|
||
|
* @returns {PIXI.Point}
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'toWorld',
|
||
|
value: function toWorld() {
|
||
|
if (arguments.length === 2) {
|
||
|
var x = arguments[0];
|
||
|
var y = arguments[1];
|
||
|
return this.toLocal({ x: x, y: y });
|
||
|
} else {
|
||
|
return this.toLocal(arguments[0]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* change coordinates from world to screen
|
||
|
* @param {number|PIXI.Point} x
|
||
|
* @param {number} [y]
|
||
|
* @returns {PIXI.Point}
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'toScreen',
|
||
|
value: function toScreen() {
|
||
|
if (arguments.length === 2) {
|
||
|
var x = arguments[0];
|
||
|
var y = arguments[1];
|
||
|
return this.toGlobal({ x: x, y: y });
|
||
|
} else {
|
||
|
var point = arguments[0];
|
||
|
return this.toGlobal(point);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* screen width in world coordinates
|
||
|
* @type {number}
|
||
|
* @readonly
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'moveCenter',
|
||
|
|
||
|
|
||
|
/**
|
||
|
* move center of viewport to point
|
||
|
* @param {(number|PIXI.PointLike)} x or point
|
||
|
* @param {number} [y]
|
||
|
* @return {Viewport} this
|
||
|
*/
|
||
|
value: function moveCenter() /*x, y | PIXI.Point*/{
|
||
|
var x = void 0,
|
||
|
y = void 0;
|
||
|
if (!isNaN(arguments[0])) {
|
||
|
x = arguments[0];
|
||
|
y = arguments[1];
|
||
|
} else {
|
||
|
x = arguments[0].x;
|
||
|
y = arguments[0].y;
|
||
|
}
|
||
|
this.position.set((this.worldScreenWidth / 2 - x) * this.scale.x, (this.worldScreenHeight / 2 - y) * this.scale.y);
|
||
|
this._reset();
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* top-left corner
|
||
|
* @type {PIXI.PointLike}
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'moveCorner',
|
||
|
|
||
|
|
||
|
/**
|
||
|
* move viewport's top-left corner; also clamps and resets decelerate and bounce (as needed)
|
||
|
* @param {number|PIXI.Point} x|point
|
||
|
* @param {number} y
|
||
|
* @return {Viewport} this
|
||
|
*/
|
||
|
value: function moveCorner() /*x, y | point*/{
|
||
|
if (arguments.length === 1) {
|
||
|
this.position.set(-arguments[0].x * this.scale.x, -arguments[0].y * this.scale.y);
|
||
|
} else {
|
||
|
this.position.set(-arguments[0] * this.scale.x, -arguments[1] * this.scale.y);
|
||
|
}
|
||
|
this._reset();
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* change zoom so the width fits in the viewport
|
||
|
* @param {number} [width=this._worldWidth] in world coordinates
|
||
|
* @param {boolean} [center] maintain the same center
|
||
|
* @return {Viewport} this
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'fitWidth',
|
||
|
value: function fitWidth(width, center) {
|
||
|
var save = void 0;
|
||
|
if (center) {
|
||
|
save = this.center;
|
||
|
}
|
||
|
width = width || this.worldWidth;
|
||
|
this.scale.x = this.screenWidth / width;
|
||
|
this.scale.y = this.scale.x;
|
||
|
if (center) {
|
||
|
this.moveCenter(save);
|
||
|
}
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* change zoom so the height fits in the viewport
|
||
|
* @param {number} [height=this._worldHeight] in world coordinates
|
||
|
* @param {boolean} [center] maintain the same center of the screen after zoom
|
||
|
* @return {Viewport} this
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'fitHeight',
|
||
|
value: function fitHeight(height, center) {
|
||
|
var save = void 0;
|
||
|
if (center) {
|
||
|
save = this.center;
|
||
|
}
|
||
|
height = height || this.worldHeight;
|
||
|
this.scale.y = this.screenHeight / height;
|
||
|
this.scale.x = this.scale.y;
|
||
|
if (center) {
|
||
|
this.moveCenter(save);
|
||
|
}
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* change zoom so it fits the entire world in the viewport
|
||
|
* @param {boolean} [center] maintain the same center of the screen after zoom
|
||
|
* @return {Viewport} this
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'fitWorld',
|
||
|
value: function fitWorld(center) {
|
||
|
var save = void 0;
|
||
|
if (center) {
|
||
|
save = this.center;
|
||
|
}
|
||
|
this.scale.x = this._screenWidth / this._worldWidth;
|
||
|
this.scale.y = this._screenHeight / this._worldHeight;
|
||
|
if (this.scale.x < this.scale.y) {
|
||
|
this.scale.y = this.scale.x;
|
||
|
} else {
|
||
|
this.scale.x = this.scale.y;
|
||
|
}
|
||
|
if (center) {
|
||
|
this.moveCenter(save);
|
||
|
}
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* change zoom so it fits the size or the entire world in the viewport
|
||
|
* @param {boolean} [center] maintain the same center of the screen after zoom
|
||
|
* @param {number} [width] desired width
|
||
|
* @param {number} [height] desired height
|
||
|
* @return {Viewport} this
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'fit',
|
||
|
value: function fit(center, width, height) {
|
||
|
var save = void 0;
|
||
|
if (center) {
|
||
|
save = this.center;
|
||
|
}
|
||
|
width = width || this.worldWidth;
|
||
|
height = height || this.worldHeight;
|
||
|
this.scale.x = this.screenWidth / width;
|
||
|
this.scale.y = this.screenHeight / height;
|
||
|
if (this.scale.x < this.scale.y) {
|
||
|
this.scale.y = this.scale.x;
|
||
|
} else {
|
||
|
this.scale.x = this.scale.y;
|
||
|
}
|
||
|
if (center) {
|
||
|
this.moveCenter(save);
|
||
|
}
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* zoom viewport by a certain percent (in both x and y direction)
|
||
|
* @param {number} percent change (e.g., 0.25 would increase a starting scale of 1.0 to 1.25)
|
||
|
* @param {boolean} [center] maintain the same center of the screen after zoom
|
||
|
* @return {Viewport} the viewport
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'zoomPercent',
|
||
|
value: function zoomPercent(percent, center) {
|
||
|
var save = void 0;
|
||
|
if (center) {
|
||
|
save = this.center;
|
||
|
}
|
||
|
var scale = this.scale.x + this.scale.x * percent;
|
||
|
this.scale.set(scale);
|
||
|
if (center) {
|
||
|
this.moveCenter(save);
|
||
|
}
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* zoom viewport by increasing/decreasing width by a certain number of pixels
|
||
|
* @param {number} change in pixels
|
||
|
* @param {boolean} [center] maintain the same center of the screen after zoom
|
||
|
* @return {Viewport} the viewport
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'zoom',
|
||
|
value: function zoom(change, center) {
|
||
|
this.fitWidth(change + this.worldScreenWidth, center);
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param {object} [options]
|
||
|
* @param {number} [options.width] the desired width to snap (to maintain aspect ratio, choose only width or height)
|
||
|
* @param {number} [options.height] the desired height to snap (to maintain aspect ratio, choose only width or height)
|
||
|
* @param {number} [options.time=1000]
|
||
|
* @param {string|function} [options.ease=easeInOutSine] ease function or name (see http://easings.net/ for supported names)
|
||
|
* @param {PIXI.Point} [options.center] place this point at center during zoom instead of center of the viewport
|
||
|
* @param {boolean} [options.interrupt=true] pause snapping with any user input on the viewport
|
||
|
* @param {boolean} [options.removeOnComplete] removes this plugin after snapping is complete
|
||
|
* @param {boolean} [options.removeOnInterrupt] removes this plugin if interrupted by any user input
|
||
|
* @param {boolean} [options.forceStart] starts the snap immediately regardless of whether the viewport is at the desired zoom
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'snapZoom',
|
||
|
value: function snapZoom(options) {
|
||
|
this.plugins['snap-zoom'] = new SnapZoom(this, options);
|
||
|
this.pluginsSort();
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @private
|
||
|
* @typedef OutOfBounds
|
||
|
* @type {object}
|
||
|
* @property {boolean} left
|
||
|
* @property {boolean} right
|
||
|
* @property {boolean} top
|
||
|
* @property {boolean} bottom
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* is container out of world bounds
|
||
|
* @return {OutOfBounds}
|
||
|
* @private
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'OOB',
|
||
|
value: function OOB() {
|
||
|
var result = {};
|
||
|
result.left = this.left < 0;
|
||
|
result.right = this.right > this._worldWidth;
|
||
|
result.top = this.top < 0;
|
||
|
result.bottom = this.bottom > this._worldHeight;
|
||
|
result.cornerPoint = {
|
||
|
x: this._worldWidth * this.scale.x - this._screenWidth,
|
||
|
y: this._worldHeight * this.scale.y - this._screenHeight
|
||
|
};
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* world coordinates of the right edge of the screen
|
||
|
* @type {number}
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'countDownPointers',
|
||
|
|
||
|
|
||
|
/**
|
||
|
* count of mouse/touch pointers that are down on the viewport
|
||
|
* @private
|
||
|
* @return {number}
|
||
|
*/
|
||
|
value: function countDownPointers() {
|
||
|
return (this.leftDown ? 1 : 0) + this.touches.length;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* array of touch pointers that are down on the viewport
|
||
|
* @private
|
||
|
* @return {PIXI.InteractionTrackingData[]}
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'getTouchPointers',
|
||
|
value: function getTouchPointers() {
|
||
|
var results = [];
|
||
|
var pointers = this.trackedPointers;
|
||
|
for (var key in pointers) {
|
||
|
var pointer = pointers[key];
|
||
|
if (this.touches.indexOf(pointer.pointerId) !== -1) {
|
||
|
results.push(pointer);
|
||
|
}
|
||
|
}
|
||
|
return results;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* array of pointers that are down on the viewport
|
||
|
* @private
|
||
|
* @return {PIXI.InteractionTrackingData[]}
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'getPointers',
|
||
|
value: function getPointers() {
|
||
|
var results = [];
|
||
|
var pointers = this.trackedPointers;
|
||
|
for (var key in pointers) {
|
||
|
results.push(pointers[key]);
|
||
|
}
|
||
|
return results;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* clamps and resets bounce and decelerate (as needed) after manually moving viewport
|
||
|
* @private
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: '_reset',
|
||
|
value: function _reset() {
|
||
|
if (this.plugins['bounce']) {
|
||
|
this.plugins['bounce'].reset();
|
||
|
this.plugins['bounce'].bounce();
|
||
|
}
|
||
|
if (this.plugins['decelerate']) {
|
||
|
this.plugins['decelerate'].reset();
|
||
|
}
|
||
|
if (this.plugins['snap']) {
|
||
|
this.plugins['snap'].reset();
|
||
|
}
|
||
|
if (this.plugins['clamp']) {
|
||
|
this.plugins['clamp'].update();
|
||
|
}
|
||
|
if (this.plugins['clamp-zoom']) {
|
||
|
this.plugins['clamp-zoom'].clamp();
|
||
|
}
|
||
|
this.dirty = true;
|
||
|
}
|
||
|
|
||
|
// PLUGINS
|
||
|
|
||
|
/**
|
||
|
* removes installed plugin
|
||
|
* @param {string} type of plugin (e.g., 'drag', 'pinch')
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'removePlugin',
|
||
|
value: function removePlugin(type) {
|
||
|
if (this.plugins[type]) {
|
||
|
this.plugins[type] = null;
|
||
|
this.emit(type + '-remove');
|
||
|
this.pluginsSort();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* pause plugin
|
||
|
* @param {string} type of plugin (e.g., 'drag', 'pinch')
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'pausePlugin',
|
||
|
value: function pausePlugin(type) {
|
||
|
if (this.plugins[type]) {
|
||
|
this.plugins[type].pause();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* resume plugin
|
||
|
* @param {string} type of plugin (e.g., 'drag', 'pinch')
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'resumePlugin',
|
||
|
value: function resumePlugin(type) {
|
||
|
if (this.plugins[type]) {
|
||
|
this.plugins[type].resume();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* sort plugins for updates
|
||
|
* @private
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'pluginsSort',
|
||
|
value: function pluginsSort() {
|
||
|
this.pluginsList = [];
|
||
|
var _iteratorNormalCompletion7 = true;
|
||
|
var _didIteratorError7 = false;
|
||
|
var _iteratorError7 = undefined;
|
||
|
|
||
|
try {
|
||
|
for (var _iterator7 = PLUGIN_ORDER[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {
|
||
|
var plugin = _step7.value;
|
||
|
|
||
|
if (this.plugins[plugin]) {
|
||
|
this.pluginsList.push(this.plugins[plugin]);
|
||
|
}
|
||
|
}
|
||
|
} catch (err) {
|
||
|
_didIteratorError7 = true;
|
||
|
_iteratorError7 = err;
|
||
|
} finally {
|
||
|
try {
|
||
|
if (!_iteratorNormalCompletion7 && _iterator7.return) {
|
||
|
_iterator7.return();
|
||
|
}
|
||
|
} finally {
|
||
|
if (_didIteratorError7) {
|
||
|
throw _iteratorError7;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* enable one-finger touch to drag
|
||
|
* @param {object} [options]
|
||
|
* @param {string} [options.direction=all] direction to drag (all, x, or y)
|
||
|
* @param {boolean} [options.wheel=true] use wheel to scroll in y direction (unless wheel plugin is active)
|
||
|
* @param {number} [options.wheelScroll=10] number of pixels to scroll with each wheel spin
|
||
|
* @param {boolean} [options.reverse] reverse the direction of the wheel scroll
|
||
|
* @param {string} [options.underflow=center] (top/bottom/center and left/right/center, or center) where to place world if too small for screen
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'drag',
|
||
|
value: function drag(options) {
|
||
|
this.plugins['drag'] = new Drag(this, options);
|
||
|
this.pluginsSort();
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* clamp to world boundaries or other provided boundaries
|
||
|
* NOTES:
|
||
|
* clamp is disabled if called with no options; use { direction: 'all' } for all edge clamping
|
||
|
* screenWidth, screenHeight, worldWidth, and worldHeight needs to be set for this to work properly
|
||
|
* @param {object} [options]
|
||
|
* @param {(number|boolean)} [options.left] clamp left; true=0
|
||
|
* @param {(number|boolean)} [options.right] clamp right; true=viewport.worldWidth
|
||
|
* @param {(number|boolean)} [options.top] clamp top; true=0
|
||
|
* @param {(number|boolean)} [options.bottom] clamp bottom; true=viewport.worldHeight
|
||
|
* @param {string} [options.direction] (all, x, or y) using clamps of [0, viewport.worldWidth/viewport.worldHeight]; replaces left/right/top/bottom if set
|
||
|
* @param {string} [options.underflow=center] (top/bottom/center and left/right/center, or center) where to place world if too small for screen
|
||
|
* @return {Viewport} this
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'clamp',
|
||
|
value: function clamp(options) {
|
||
|
this.plugins['clamp'] = new Clamp(this, options);
|
||
|
this.pluginsSort();
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* decelerate after a move
|
||
|
* @param {object} [options]
|
||
|
* @param {number} [options.friction=0.95] percent to decelerate after movement
|
||
|
* @param {number} [options.bounce=0.8] percent to decelerate when past boundaries (only applicable when viewport.bounce() is active)
|
||
|
* @param {number} [options.minSpeed=0.01] minimum velocity before stopping/reversing acceleration
|
||
|
* @return {Viewport} this
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'decelerate',
|
||
|
value: function decelerate(options) {
|
||
|
this.plugins['decelerate'] = new Decelerate(this, options);
|
||
|
this.pluginsSort();
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* bounce on borders
|
||
|
* NOTE: screenWidth, screenHeight, worldWidth, and worldHeight needs to be set for this to work properly
|
||
|
* @param {object} [options]
|
||
|
* @param {string} [options.sides=all] all, horizontal, vertical, or combination of top, bottom, right, left (e.g., 'top-bottom-right')
|
||
|
* @param {number} [options.friction=0.5] friction to apply to decelerate if active
|
||
|
* @param {number} [options.time=150] time in ms to finish bounce
|
||
|
* @param {string|function} [options.ease=easeInOutSine] ease function or name (see http://easings.net/ for supported names)
|
||
|
* @param {string} [options.underflow=center] (top/bottom/center and left/right/center, or center) where to place world if too small for screen
|
||
|
* @return {Viewport} this
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'bounce',
|
||
|
value: function bounce(options) {
|
||
|
this.plugins['bounce'] = new Bounce(this, options);
|
||
|
this.pluginsSort();
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* enable pinch to zoom and two-finger touch to drag
|
||
|
* NOTE: screenWidth, screenHeight, worldWidth, and worldHeight needs to be set for this to work properly
|
||
|
* @param {number} [options.percent=1.0] percent to modify pinch speed
|
||
|
* @param {boolean} [options.noDrag] disable two-finger dragging
|
||
|
* @param {PIXI.Point} [options.center] place this point at center during zoom instead of center of two fingers
|
||
|
* @return {Viewport} this
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'pinch',
|
||
|
value: function pinch(options) {
|
||
|
this.plugins['pinch'] = new Pinch(this, options);
|
||
|
this.pluginsSort();
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* snap to a point
|
||
|
* @param {number} x
|
||
|
* @param {number} y
|
||
|
* @param {object} [options]
|
||
|
* @param {boolean} [options.topLeft] snap to the top-left of viewport instead of center
|
||
|
* @param {number} [options.friction=0.8] friction/frame to apply if decelerate is active
|
||
|
* @param {number} [options.time=1000]
|
||
|
* @param {string|function} [options.ease=easeInOutSine] ease function or name (see http://easings.net/ for supported names)
|
||
|
* @param {boolean} [options.interrupt=true] pause snapping with any user input on the viewport
|
||
|
* @param {boolean} [options.removeOnComplete] removes this plugin after snapping is complete
|
||
|
* @param {boolean} [options.removeOnInterrupt] removes this plugin if interrupted by any user input
|
||
|
* @param {boolean} [options.forceStart] starts the snap immediately regardless of whether the viewport is at the desired location
|
||
|
* @return {Viewport} this
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'snap',
|
||
|
value: function snap(x, y, options) {
|
||
|
this.plugins['snap'] = new Snap(this, x, y, options);
|
||
|
this.pluginsSort();
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* follow a target
|
||
|
* @param {PIXI.DisplayObject} target to follow (object must include {x: x-coordinate, y: y-coordinate})
|
||
|
* @param {object} [options]
|
||
|
* @param {number} [options.speed=0] to follow in pixels/frame (0=teleport to location)
|
||
|
* @param {number} [options.radius] radius (in world coordinates) of center circle where movement is allowed without moving the viewport
|
||
|
* @return {Viewport} this
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'follow',
|
||
|
value: function follow(target, options) {
|
||
|
this.plugins['follow'] = new Follow(this, target, options);
|
||
|
this.pluginsSort();
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* zoom using mouse wheel
|
||
|
* @param {object} [options]
|
||
|
* @param {number} [options.percent=0.1] percent to scroll with each spin
|
||
|
* @param {boolean} [options.reverse] reverse the direction of the scroll
|
||
|
* @param {PIXI.Point} [options.center] place this point at center during zoom instead of current mouse position
|
||
|
* @return {Viewport} this
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'wheel',
|
||
|
value: function wheel(options) {
|
||
|
this.plugins['wheel'] = new Wheel(this, options);
|
||
|
this.pluginsSort();
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* enable clamping of zoom to constraints
|
||
|
* NOTE: screenWidth, screenHeight, worldWidth, and worldHeight needs to be set for this to work properly
|
||
|
* @param {object} [options]
|
||
|
* @param {number} [options.minWidth] minimum width
|
||
|
* @param {number} [options.minHeight] minimum height
|
||
|
* @param {number} [options.maxWidth] maximum width
|
||
|
* @param {number} [options.maxHeight] maximum height
|
||
|
* @return {Viewport} this
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'clampZoom',
|
||
|
value: function clampZoom(options) {
|
||
|
this.plugins['clamp-zoom'] = new ClampZoom(this, options);
|
||
|
this.pluginsSort();
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Scroll viewport when mouse hovers near one of the edges or radius-distance from center of screen.
|
||
|
* @param {object} [options]
|
||
|
* @param {number} [options.radius] distance from center of screen in screen pixels
|
||
|
* @param {number} [options.distance] distance from all sides in screen pixels
|
||
|
* @param {number} [options.top] alternatively, set top distance (leave unset for no top scroll)
|
||
|
* @param {number} [options.bottom] alternatively, set bottom distance (leave unset for no top scroll)
|
||
|
* @param {number} [options.left] alternatively, set left distance (leave unset for no top scroll)
|
||
|
* @param {number} [options.right] alternatively, set right distance (leave unset for no top scroll)
|
||
|
* @param {number} [options.speed=8] speed in pixels/frame to scroll viewport
|
||
|
* @param {boolean} [options.reverse] reverse direction of scroll
|
||
|
* @param {boolean} [options.noDecelerate] don't use decelerate plugin even if it's installed
|
||
|
* @param {boolean} [options.linear] if using radius, use linear movement (+/- 1, +/- 1) instead of angled movement (Math.cos(angle from center), Math.sin(angle from center))
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'mouseEdges',
|
||
|
value: function mouseEdges(options) {
|
||
|
this.plugins['mouse-edges'] = new MouseEdges(this, options);
|
||
|
this.pluginsSort();
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* pause viewport (including animation updates such as decelerate)
|
||
|
* NOTE: when setting pause=true, all touches and mouse actions are cleared (i.e., if mousedown was active, it becomes inactive for purposes of the viewport)
|
||
|
* @type {boolean}
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'screenWidth',
|
||
|
get: function get() {
|
||
|
return this._screenWidth;
|
||
|
},
|
||
|
set: function set(value) {
|
||
|
this._screenWidth = value;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* screen height in screen pixels
|
||
|
* @type {number}
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'screenHeight',
|
||
|
get: function get() {
|
||
|
return this._screenHeight;
|
||
|
},
|
||
|
set: function set(value) {
|
||
|
this._screenHeight = value;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* world width in pixels
|
||
|
* @type {number}
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'worldWidth',
|
||
|
get: function get() {
|
||
|
if (this._worldWidth) {
|
||
|
return this._worldWidth;
|
||
|
} else {
|
||
|
return this.width;
|
||
|
}
|
||
|
},
|
||
|
set: function set(value) {
|
||
|
this._worldWidth = value;
|
||
|
this.resizePlugins();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* world height in pixels
|
||
|
* @type {number}
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'worldHeight',
|
||
|
get: function get() {
|
||
|
if (this._worldHeight) {
|
||
|
return this._worldHeight;
|
||
|
} else {
|
||
|
return this.height;
|
||
|
}
|
||
|
},
|
||
|
set: function set(value) {
|
||
|
this._worldHeight = value;
|
||
|
this.resizePlugins();
|
||
|
}
|
||
|
}, {
|
||
|
key: 'worldScreenWidth',
|
||
|
get: function get() {
|
||
|
return this._screenWidth / this.scale.x;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* screen height in world coordinates
|
||
|
* @type {number}
|
||
|
* @readonly
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'worldScreenHeight',
|
||
|
get: function get() {
|
||
|
return this._screenHeight / this.scale.y;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* world width in screen coordinates
|
||
|
* @type {number}
|
||
|
* @readonly
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'screenWorldWidth',
|
||
|
get: function get() {
|
||
|
return this._worldWidth * this.scale.x;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* world height in screen coordinates
|
||
|
* @type {number}
|
||
|
* @readonly
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'screenWorldHeight',
|
||
|
get: function get() {
|
||
|
return this._worldHeight * this.scale.y;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* get center of screen in world coordinates
|
||
|
* @type {PIXI.PointLike}
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'center',
|
||
|
get: function get() {
|
||
|
return { x: this.worldScreenWidth / 2 - this.x / this.scale.x, y: this.worldScreenHeight / 2 - this.y / this.scale.y };
|
||
|
},
|
||
|
set: function set(value) {
|
||
|
this.moveCenter(value);
|
||
|
}
|
||
|
}, {
|
||
|
key: 'corner',
|
||
|
get: function get() {
|
||
|
return { x: -this.x / this.scale.x, y: -this.y / this.scale.y };
|
||
|
},
|
||
|
set: function set(value) {
|
||
|
this.moveCorner(value);
|
||
|
}
|
||
|
}, {
|
||
|
key: 'right',
|
||
|
get: function get() {
|
||
|
return -this.x / this.scale.x + this.worldScreenWidth;
|
||
|
},
|
||
|
set: function set(value) {
|
||
|
this.x = -value * this.scale.x + this.screenWidth;
|
||
|
this._reset();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* world coordinates of the left edge of the screen
|
||
|
* @type {number}
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'left',
|
||
|
get: function get() {
|
||
|
return -this.x / this.scale.x;
|
||
|
},
|
||
|
set: function set(value) {
|
||
|
this.x = -value * this.scale.x;
|
||
|
this._reset();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* world coordinates of the top edge of the screen
|
||
|
* @type {number}
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'top',
|
||
|
get: function get() {
|
||
|
return -this.y / this.scale.y;
|
||
|
},
|
||
|
set: function set(value) {
|
||
|
this.y = -value * this.scale.y;
|
||
|
this._reset();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* world coordinates of the bottom edge of the screen
|
||
|
* @type {number}
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'bottom',
|
||
|
get: function get() {
|
||
|
return -this.y / this.scale.y + this.worldScreenHeight;
|
||
|
},
|
||
|
set: function set(value) {
|
||
|
this.y = -value * this.scale.y + this.screenHeight;
|
||
|
this._reset();
|
||
|
}
|
||
|
/**
|
||
|
* determines whether the viewport is dirty (i.e., needs to be renderered to the screen because of a change)
|
||
|
* @type {boolean}
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'dirty',
|
||
|
get: function get() {
|
||
|
return this._dirty;
|
||
|
},
|
||
|
set: function set(value) {
|
||
|
this._dirty = value;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* permanently changes the Viewport's hitArea
|
||
|
* <p>NOTE: normally the hitArea = PIXI.Rectangle(Viewport.left, Viewport.top, Viewport.worldScreenWidth, Viewport.worldScreenHeight)</p>
|
||
|
* @type {(PIXI.Rectangle|PIXI.Circle|PIXI.Ellipse|PIXI.Polygon|PIXI.RoundedRectangle)}
|
||
|
*/
|
||
|
|
||
|
}, {
|
||
|
key: 'forceHitArea',
|
||
|
get: function get() {
|
||
|
return this._forceHitArea;
|
||
|
},
|
||
|
set: function set(value) {
|
||
|
if (value) {
|
||
|
this._forceHitArea = value;
|
||
|
this.hitArea = value;
|
||
|
} else {
|
||
|
this._forceHitArea = false;
|
||
|
this.hitArea = new PIXI.Rectangle(0, 0, this.worldWidth, this.worldHeight);
|
||
|
}
|
||
|
}
|
||
|
}, {
|
||
|
key: 'pause',
|
||
|
get: function get() {
|
||
|
return this._pause;
|
||
|
},
|
||
|
set: function set(value) {
|
||
|
this._pause = value;
|
||
|
if (value) {
|
||
|
this.touches = [];
|
||
|
this.leftDown = false;
|
||
|
}
|
||
|
}
|
||
|
}]);
|
||
|
|
||
|
return Viewport;
|
||
|
}(PIXI.Container);
|
||
|
|
||
|
/**
|
||
|
* fires after a mouse or touch click
|
||
|
* @event Viewport#clicked
|
||
|
* @type {object}
|
||
|
* @property {PIXI.PointLike} screen
|
||
|
* @property {PIXI.PointLike} world
|
||
|
* @property {Viewport} viewport
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* fires when a drag starts
|
||
|
* @event Viewport#drag-start
|
||
|
* @type {object}
|
||
|
* @property {PIXI.PointLike} screen
|
||
|
* @property {PIXI.PointLike} world
|
||
|
* @property {Viewport} viewport
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* fires when a drag ends
|
||
|
* @event Viewport#drag-end
|
||
|
* @type {object}
|
||
|
* @property {PIXI.PointLike} screen
|
||
|
* @property {PIXI.PointLike} world
|
||
|
* @property {Viewport} viewport
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* fires when a pinch starts
|
||
|
* @event Viewport#pinch-start
|
||
|
* @type {Viewport}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* fires when a pinch end
|
||
|
* @event Viewport#pinch-end
|
||
|
* @type {Viewport}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* fires when a snap starts
|
||
|
* @event Viewport#snap-start
|
||
|
* @type {Viewport}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* fires when a snap ends
|
||
|
* @event Viewport#snap-end
|
||
|
* @type {Viewport}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* fires when a snap-zoom starts
|
||
|
* @event Viewport#snap-zoom-start
|
||
|
* @type {Viewport}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* fires when a snap-zoom ends
|
||
|
* @event Viewport#snap-zoom-end
|
||
|
* @type {Viewport}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* fires when a bounce starts in the x direction
|
||
|
* @event Viewport#bounce-x-start
|
||
|
* @type {Viewport}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* fires when a bounce ends in the x direction
|
||
|
* @event Viewport#bounce-x-end
|
||
|
* @type {Viewport}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* fires when a bounce starts in the y direction
|
||
|
* @event Viewport#bounce-y-start
|
||
|
* @type {Viewport}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* fires when a bounce ends in the y direction
|
||
|
* @event Viewport#bounce-y-end
|
||
|
* @type {Viewport}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* fires when for a mouse wheel event
|
||
|
* @event Viewport#wheel
|
||
|
* @type {object}
|
||
|
* @property {object} wheel
|
||
|
* @property {number} wheel.dx
|
||
|
* @property {number} wheel.dy
|
||
|
* @property {number} wheel.dz
|
||
|
* @property {Viewport} viewport
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* fires when a wheel-scroll occurs
|
||
|
* @event Viewport#wheel-scroll
|
||
|
* @type {Viewport}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* fires when a mouse-edge starts to scroll
|
||
|
* @event Viewport#mouse-edge-start
|
||
|
* @type {Viewport}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* fires when the mouse-edge scrolling ends
|
||
|
* @event Viewport#mouse-edge-end
|
||
|
* @type {Viewport}
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* fires when viewport moves through UI interaction, deceleration, or follow
|
||
|
* @event Viewport#moved
|
||
|
* @type {object}
|
||
|
* @property {Viewport} viewport
|
||
|
* @property {string} type (drag, snap, pinch, follow, bounce-x, bounce-y, clamp-x, clamp-y, decelerate, mouse-edges, wheel)
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* fires when viewport moves through UI interaction, deceleration, or follow
|
||
|
* @event Viewport#zoomed
|
||
|
* @type {object}
|
||
|
* @property {Viewport} viewport
|
||
|
* @property {string} type (drag-zoom, pinch, wheel, clamp-zoom)
|
||
|
*/
|
||
|
|
||
|
PIXI.extras.Viewport = Viewport;
|
||
|
|
||
|
module.exports = Viewport;
|
||
|
|
||
|
},{"./bounce":1,"./clamp":3,"./clamp-zoom":2,"./decelerate":4,"./drag":5,"./follow":6,"./mouse-edges":7,"./pinch":8,"./snap":11,"./snap-zoom":10,"./utils":12,"./wheel":14}],14:[function(require,module,exports){
|
||
|
'use strict';
|
||
|
|
||
|
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
||
|
|
||
|
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; }
|
||
|
|
||
|
var Plugin = require('./plugin');
|
||
|
|
||
|
module.exports = function (_Plugin) {
|
||
|
_inherits(Wheel, _Plugin);
|
||
|
|
||
|
/**
|
||
|
* @private
|
||
|
* @param {Viewport} parent
|
||
|
* @param {object} [options]
|
||
|
* @param {number} [options.percent=0.1] percent to scroll with each spin
|
||
|
* @param {boolean} [options.reverse] reverse the direction of the scroll
|
||
|
* @param {PIXI.Point} [options.center] place this point at center during zoom instead of current mouse position
|
||
|
*
|
||
|
* @event wheel({wheel: {dx, dy, dz}, event, viewport})
|
||
|
*/
|
||
|
function Wheel(parent, options) {
|
||
|
_classCallCheck(this, Wheel);
|
||
|
|
||
|
var _this = _possibleConstructorReturn(this, (Wheel.__proto__ || Object.getPrototypeOf(Wheel)).call(this, parent));
|
||
|
|
||
|
options = options || {};
|
||
|
_this.percent = options.percent || 0.1;
|
||
|
_this.center = options.center;
|
||
|
_this.reverse = options.reverse;
|
||
|
return _this;
|
||
|
}
|
||
|
|
||
|
_createClass(Wheel, [{
|
||
|
key: 'wheel',
|
||
|
value: function wheel(e) {
|
||
|
if (this.paused) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var change = void 0;
|
||
|
if (this.reverse) {
|
||
|
change = e.deltaY > 0 ? 1 + this.percent : 1 - this.percent;
|
||
|
} else {
|
||
|
change = e.deltaY > 0 ? 1 - this.percent : 1 + this.percent;
|
||
|
}
|
||
|
var point = this.parent.getPointerPosition(e);
|
||
|
|
||
|
var oldPoint = void 0;
|
||
|
if (!this.center) {
|
||
|
oldPoint = this.parent.toLocal(point);
|
||
|
}
|
||
|
this.parent.scale.x *= change;
|
||
|
this.parent.scale.y *= change;
|
||
|
this.parent.emit('zoomed', { viewport: this.parent, type: 'wheel' });
|
||
|
var clamp = this.parent.plugins['clamp-zoom'];
|
||
|
if (clamp) {
|
||
|
clamp.clamp();
|
||
|
}
|
||
|
|
||
|
if (this.center) {
|
||
|
this.parent.moveCenter(this.center);
|
||
|
} else {
|
||
|
var newPoint = this.parent.toGlobal(oldPoint);
|
||
|
this.parent.x += point.x - newPoint.x;
|
||
|
this.parent.y += point.y - newPoint.y;
|
||
|
}
|
||
|
this.parent.emit('moved', { viewport: this.parent, type: 'wheel' });
|
||
|
this.parent.emit('wheel', { wheel: { dx: e.deltaX, dy: e.deltaY, dz: e.deltaZ }, event: e, viewport: this.parent });
|
||
|
e.preventDefault();
|
||
|
}
|
||
|
}]);
|
||
|
|
||
|
return Wheel;
|
||
|
}(Plugin);
|
||
|
|
||
|
},{"./plugin":9}],15:[function(require,module,exports){
|
||
|
|
||
|
/*
|
||
|
Copyright © 2001 Robert Penner
|
||
|
All rights reserved.
|
||
|
|
||
|
Redistribution and use in source and binary forms, with or without modification,
|
||
|
are permitted provided that the following conditions are met:
|
||
|
|
||
|
Redistributions of source code must retain the above copyright notice, this list of
|
||
|
conditions and the following disclaimer.
|
||
|
Redistributions in binary form must reproduce the above copyright notice, this list
|
||
|
of conditions and the following disclaimer in the documentation and/or other materials
|
||
|
provided with the distribution.
|
||
|
|
||
|
Neither the name of the author nor the names of contributors may be used to endorse
|
||
|
or promote products derived from this software without specific prior written permission.
|
||
|
|
||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||
|
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||
|
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||
|
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||
|
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||
|
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||
|
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||
|
OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
*/
|
||
|
|
||
|
(function() {
|
||
|
var penner, umd;
|
||
|
|
||
|
umd = function(factory) {
|
||
|
if (typeof exports === 'object') {
|
||
|
return module.exports = factory;
|
||
|
} else if (typeof define === 'function' && define.amd) {
|
||
|
return define([], factory);
|
||
|
} else {
|
||
|
return this.penner = factory;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
penner = {
|
||
|
linear: function(t, b, c, d) {
|
||
|
return c * t / d + b;
|
||
|
},
|
||
|
easeInQuad: function(t, b, c, d) {
|
||
|
return c * (t /= d) * t + b;
|
||
|
},
|
||
|
easeOutQuad: function(t, b, c, d) {
|
||
|
return -c * (t /= d) * (t - 2) + b;
|
||
|
},
|
||
|
easeInOutQuad: function(t, b, c, d) {
|
||
|
if ((t /= d / 2) < 1) {
|
||
|
return c / 2 * t * t + b;
|
||
|
} else {
|
||
|
return -c / 2 * ((--t) * (t - 2) - 1) + b;
|
||
|
}
|
||
|
},
|
||
|
easeInCubic: function(t, b, c, d) {
|
||
|
return c * (t /= d) * t * t + b;
|
||
|
},
|
||
|
easeOutCubic: function(t, b, c, d) {
|
||
|
return c * ((t = t / d - 1) * t * t + 1) + b;
|
||
|
},
|
||
|
easeInOutCubic: function(t, b, c, d) {
|
||
|
if ((t /= d / 2) < 1) {
|
||
|
return c / 2 * t * t * t + b;
|
||
|
} else {
|
||
|
return c / 2 * ((t -= 2) * t * t + 2) + b;
|
||
|
}
|
||
|
},
|
||
|
easeInQuart: function(t, b, c, d) {
|
||
|
return c * (t /= d) * t * t * t + b;
|
||
|
},
|
||
|
easeOutQuart: function(t, b, c, d) {
|
||
|
return -c * ((t = t / d - 1) * t * t * t - 1) + b;
|
||
|
},
|
||
|
easeInOutQuart: function(t, b, c, d) {
|
||
|
if ((t /= d / 2) < 1) {
|
||
|
return c / 2 * t * t * t * t + b;
|
||
|
} else {
|
||
|
return -c / 2 * ((t -= 2) * t * t * t - 2) + b;
|
||
|
}
|
||
|
},
|
||
|
easeInQuint: function(t, b, c, d) {
|
||
|
return c * (t /= d) * t * t * t * t + b;
|
||
|
},
|
||
|
easeOutQuint: function(t, b, c, d) {
|
||
|
return c * ((t = t / d - 1) * t * t * t * t + 1) + b;
|
||
|
},
|
||
|
easeInOutQuint: function(t, b, c, d) {
|
||
|
if ((t /= d / 2) < 1) {
|
||
|
return c / 2 * t * t * t * t * t + b;
|
||
|
} else {
|
||
|
return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;
|
||
|
}
|
||
|
},
|
||
|
easeInSine: function(t, b, c, d) {
|
||
|
return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;
|
||
|
},
|
||
|
easeOutSine: function(t, b, c, d) {
|
||
|
return c * Math.sin(t / d * (Math.PI / 2)) + b;
|
||
|
},
|
||
|
easeInOutSine: function(t, b, c, d) {
|
||
|
return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;
|
||
|
},
|
||
|
easeInExpo: function(t, b, c, d) {
|
||
|
if (t === 0) {
|
||
|
return b;
|
||
|
} else {
|
||
|
return c * Math.pow(2, 10 * (t / d - 1)) + b;
|
||
|
}
|
||
|
},
|
||
|
easeOutExpo: function(t, b, c, d) {
|
||
|
if (t === d) {
|
||
|
return b + c;
|
||
|
} else {
|
||
|
return c * (-Math.pow(2, -10 * t / d) + 1) + b;
|
||
|
}
|
||
|
},
|
||
|
easeInOutExpo: function(t, b, c, d) {
|
||
|
if (t === 0) {
|
||
|
b;
|
||
|
}
|
||
|
if (t === d) {
|
||
|
b + c;
|
||
|
}
|
||
|
if ((t /= d / 2) < 1) {
|
||
|
return c / 2 * Math.pow(2, 10 * (t - 1)) + b;
|
||
|
} else {
|
||
|
return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;
|
||
|
}
|
||
|
},
|
||
|
easeInCirc: function(t, b, c, d) {
|
||
|
return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;
|
||
|
},
|
||
|
easeOutCirc: function(t, b, c, d) {
|
||
|
return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;
|
||
|
},
|
||
|
easeInOutCirc: function(t, b, c, d) {
|
||
|
if ((t /= d / 2) < 1) {
|
||
|
return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;
|
||
|
} else {
|
||
|
return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;
|
||
|
}
|
||
|
},
|
||
|
easeInElastic: function(t, b, c, d) {
|
||
|
var a, p, s;
|
||
|
s = 1.70158;
|
||
|
p = 0;
|
||
|
a = c;
|
||
|
if (t === 0) {
|
||
|
b;
|
||
|
} else if ((t /= d) === 1) {
|
||
|
b + c;
|
||
|
}
|
||
|
if (!p) {
|
||
|
p = d * .3;
|
||
|
}
|
||
|
if (a < Math.abs(c)) {
|
||
|
a = c;
|
||
|
s = p / 4;
|
||
|
} else {
|
||
|
s = p / (2 * Math.PI) * Math.asin(c / a);
|
||
|
}
|
||
|
return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
|
||
|
},
|
||
|
easeOutElastic: function(t, b, c, d) {
|
||
|
var a, p, s;
|
||
|
s = 1.70158;
|
||
|
p = 0;
|
||
|
a = c;
|
||
|
if (t === 0) {
|
||
|
b;
|
||
|
} else if ((t /= d) === 1) {
|
||
|
b + c;
|
||
|
}
|
||
|
if (!p) {
|
||
|
p = d * .3;
|
||
|
}
|
||
|
if (a < Math.abs(c)) {
|
||
|
a = c;
|
||
|
s = p / 4;
|
||
|
} else {
|
||
|
s = p / (2 * Math.PI) * Math.asin(c / a);
|
||
|
}
|
||
|
return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;
|
||
|
},
|
||
|
easeInOutElastic: function(t, b, c, d) {
|
||
|
var a, p, s;
|
||
|
s = 1.70158;
|
||
|
p = 0;
|
||
|
a = c;
|
||
|
if (t === 0) {
|
||
|
b;
|
||
|
} else if ((t /= d / 2) === 2) {
|
||
|
b + c;
|
||
|
}
|
||
|
if (!p) {
|
||
|
p = d * (.3 * 1.5);
|
||
|
}
|
||
|
if (a < Math.abs(c)) {
|
||
|
a = c;
|
||
|
s = p / 4;
|
||
|
} else {
|
||
|
s = p / (2 * Math.PI) * Math.asin(c / a);
|
||
|
}
|
||
|
if (t < 1) {
|
||
|
return -.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b;
|
||
|
} else {
|
||
|
return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b;
|
||
|
}
|
||
|
},
|
||
|
easeInBack: function(t, b, c, d, s) {
|
||
|
if (s === void 0) {
|
||
|
s = 1.70158;
|
||
|
}
|
||
|
return c * (t /= d) * t * ((s + 1) * t - s) + b;
|
||
|
},
|
||
|
easeOutBack: function(t, b, c, d, s) {
|
||
|
if (s === void 0) {
|
||
|
s = 1.70158;
|
||
|
}
|
||
|
return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;
|
||
|
},
|
||
|
easeInOutBack: function(t, b, c, d, s) {
|
||
|
if (s === void 0) {
|
||
|
s = 1.70158;
|
||
|
}
|
||
|
if ((t /= d / 2) < 1) {
|
||
|
return c / 2 * (t * t * (((s *= 1.525) + 1) * t - s)) + b;
|
||
|
} else {
|
||
|
return c / 2 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2) + b;
|
||
|
}
|
||
|
},
|
||
|
easeInBounce: function(t, b, c, d) {
|
||
|
var v;
|
||
|
v = penner.easeOutBounce(d - t, 0, c, d);
|
||
|
return c - v + b;
|
||
|
},
|
||
|
easeOutBounce: function(t, b, c, d) {
|
||
|
if ((t /= d) < 1 / 2.75) {
|
||
|
return c * (7.5625 * t * t) + b;
|
||
|
} else if (t < 2 / 2.75) {
|
||
|
return c * (7.5625 * (t -= 1.5 / 2.75) * t + .75) + b;
|
||
|
} else if (t < 2.5 / 2.75) {
|
||
|
return c * (7.5625 * (t -= 2.25 / 2.75) * t + .9375) + b;
|
||
|
} else {
|
||
|
return c * (7.5625 * (t -= 2.625 / 2.75) * t + .984375) + b;
|
||
|
}
|
||
|
},
|
||
|
easeInOutBounce: function(t, b, c, d) {
|
||
|
var v;
|
||
|
if (t < d / 2) {
|
||
|
v = penner.easeInBounce(t * 2, 0, c, d);
|
||
|
return v * .5 + b;
|
||
|
} else {
|
||
|
v = penner.easeOutBounce(t * 2 - d, 0, c, d);
|
||
|
return v * .5 + c * .5 + b;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
umd(penner);
|
||
|
|
||
|
}).call(this);
|
||
|
|
||
|
},{}]},{},[13]);
|