diff --git a/build/three.interaction.js b/build/three.interaction.js index 42fa511..7300cae 100644 --- a/build/three.interaction.js +++ b/build/three.interaction.js @@ -716,6 +716,8 @@ var InteractionManager = function (_EventDispatcher) { options = options || {}; + _this.objects = null; + /** * The renderer this interaction manager works for. * @@ -2345,11 +2347,27 @@ var InteractionManager = function (_EventDispatcher) { interactionData.originalEvent = pointerEvent; interactionEvent._reset(); - interactionEvent.intersects = this.raycaster.intersectObjects(this.scene.children, true); - + if (this.objectsToRaycast) { + interactionEvent.intersects = this.raycaster.intersectObjects(this.objectsToRaycast, true); + } else { + interactionEvent.intersects = this.raycaster.intersectObjects(this.scene.children, true); + } return interactionEvent; } + /** + * set objects to raycast + * + * @param {Object3D} objects + * @memberof InteractionManager + */ + + }, { + key: 'setObjectsToRaycast', + value: function setObjectsToRaycast(objects) { + this.objectsToRaycast = objects; + } + /** * Ensures that the original event object contains all data that a regular pointer event would have * diff --git a/build/three.interaction.js.map b/build/three.interaction.js.map index a34605f..52c9627 100644 --- a/build/three.interaction.js.map +++ b/build/three.interaction.js.map @@ -1 +1 @@ -{"version":3,"file":"three.interaction.js","sources":["../src/utils/Utils.js","../src/patch/EventDispatcher.js","../src/patch/Object3D.js","../src/interaction/InteractionData.js","../src/interaction/InteractionEvent.js","../src/interaction/InteractionTrackingData.js","../src/interaction/InteractionManager.js","../src/interaction/InteractionLayer.js","../src/utils/Raf.js","../src/utils/Ticker.js","../src/interaction/Interaction.js"],"sourcesContent":["/**\n * get variable type\n * @param {*} val a variable which you want to get the type\n * @return {String} variable-type\n */\nfunction _rt(val) {\n return Object.prototype.toString.call(val);\n}\n\n/**\n * Utils tool box\n *\n * @namespace Utils\n */\nexport const Utils = {\n /**\n * determine whether it is a `Function`\n *\n * @static\n * @method\n * @memberof Utils\n * @param {*} variable a variable which you want to determine\n * @return {Boolean} type result\n */\n isFunction: (function() {\n const ks = _rt(function() {});\n return function(variable) {\n return _rt(variable) === ks;\n };\n })(),\n\n\n /**\n * determine whether it is a `undefined`\n *\n * @static\n * @method\n * @memberof Utils\n * @param {*} variable a variable which you want to determine\n * @return {Boolean} type result\n */\n isUndefined(variable) {\n return typeof variable === 'undefined';\n },\n};\n","import { EventDispatcher, Object3D } from 'three';\nimport { Utils } from '../utils/Utils.js';\n\n/**\n * proxy `addEventListener` function\n *\n * @param {String} type event type, evnet name\n * @param {Function} fn callback\n * @return {this} this\n */\nEventDispatcher.prototype.on = function(type, fn) {\n if (!Utils.isFunction(fn)) return;\n if (this instanceof Object3D) this.interactive = true;\n this.addEventListener(type, fn);\n return this;\n};\n\n/**\n * proxy `removeEventListener` function\n *\n * @param {String} type event type, evnet name\n * @param {Function} fn callback, which you had bind before\n * @return {this} this\n */\nEventDispatcher.prototype.off = function(type, fn) {\n this.removeEventListener(type, fn);\n return this;\n};\n\n/**\n * binding a once event, just emit once time\n *\n * @param {String} type event type, evnet name\n * @param {Function} fn callback\n * @return {this} this\n */\nEventDispatcher.prototype.once = function(type, fn) {\n if (!Utils.isFunction(fn)) return;\n const cb = (ev) => {\n fn(ev);\n this.off(type, cb);\n };\n this.on(type, cb);\n return this;\n};\n\n/**\n * emit a event\n *\n * @param {String} type event type, evnet name\n * @return {this} this\n */\nEventDispatcher.prototype.emit = function(type, ...argument) {\n if (this._listeners === undefined || Utils.isUndefined(this._listeners[type])) return;\n const cbs = this._listeners[type] || [];\n const cache = cbs.slice(0);\n\n for (let i = 0; i < cache.length; i++) {\n cache[i].apply(this, argument);\n }\n return this;\n};\n\n","import { Object3D } from 'three';\n\n/**\n * whether displayObject is interactively\n */\nObject3D.prototype.interactive = false;\n\n/**\n * whether displayObject's children is interactively\n */\nObject3D.prototype.interactiveChildren = true;\n\n/**\n * whether displayObject had touchstart\n * @private\n */\nObject3D.prototype.started = false;\n\n/**\n * tracked event cache, like: touchend、mouseout、pointerout which decided by primary-event\n */\nObject.defineProperty(Object3D.prototype, 'trackedPointers', {\n get() {\n if (!this._trackedPointers) this._trackedPointers = {};\n return this._trackedPointers;\n },\n});\n\n/**\n * dispatch a raycast\n *\n * @param {Raycaster} raycaster Raycaster object, get from THREE.Raycaster\n * @return {Object|Boolean} had pass hit-test\n */\nObject3D.prototype.raycastTest = function(raycaster) {\n const result = [];\n this.raycast(raycaster, result);\n\n if (result.length > 0) {\n return result[0];\n }\n\n return false;\n};\n","import { Vector2 } from 'three';\n\n/**\n * Holds all information related to an Interaction event\n *\n * @class\n */\nclass InteractionData {\n /**\n * InteractionData constructor\n */\n constructor() {\n /**\n * This point stores the global coords of where the touch/mouse event happened\n *\n * @member {Vector2}\n */\n this.global = new Vector2();\n\n /**\n * The target DisplayObject that was interacted with\n *\n * @member {Object3D}\n */\n this.target = null;\n\n /**\n * When passed to an event handler, this will be the original DOM Event that was captured\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent\n * @see https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent\n * @member {MouseEvent|TouchEvent|PointerEvent}\n */\n this.originalEvent = null;\n\n /**\n * Unique identifier for this interaction\n *\n * @member {number}\n */\n this.identifier = null;\n\n /**\n * Indicates whether or not the pointer device that created the event is the primary pointer.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/isPrimary\n * @type {Boolean}\n */\n this.isPrimary = false;\n\n /**\n * Indicates which button was pressed on the mouse or pointer device to trigger the event.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button\n * @type {number}\n */\n this.button = 0;\n\n /**\n * Indicates which buttons are pressed on the mouse or pointer device when the event is triggered.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons\n * @type {number}\n */\n this.buttons = 0;\n\n /**\n * The width of the pointer's contact along the x-axis, measured in CSS pixels.\n * radiusX of TouchEvents will be represented by this value.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/width\n * @type {number}\n */\n this.width = 0;\n\n /**\n * The height of the pointer's contact along the y-axis, measured in CSS pixels.\n * radiusY of TouchEvents will be represented by this value.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/height\n * @type {number}\n */\n this.height = 0;\n\n /**\n * The angle, in degrees, between the pointer device and the screen.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/tiltX\n * @type {number}\n */\n this.tiltX = 0;\n\n /**\n * The angle, in degrees, between the pointer device and the screen.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/tiltY\n * @type {number}\n */\n this.tiltY = 0;\n\n /**\n * The type of pointer that triggered the event.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/pointerType\n * @type {string}\n */\n this.pointerType = null;\n\n /**\n * Pressure applied by the pointing device during the event. A Touch's force property\n * will be represented by this value.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/pressure\n * @type {number}\n */\n this.pressure = 0;\n\n /**\n * From TouchEvents (not PointerEvents triggered by touches), the rotationAngle of the Touch.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Touch/rotationAngle\n * @type {number}\n */\n this.rotationAngle = 0;\n\n /**\n * Twist of a stylus pointer.\n * @see https://w3c.github.io/pointerevents/#pointerevent-interface\n * @type {number}\n */\n this.twist = 0;\n\n /**\n * Barrel pressure on a stylus pointer.\n * @see https://w3c.github.io/pointerevents/#pointerevent-interface\n * @type {number}\n */\n this.tangentialPressure = 0;\n }\n\n /**\n * The unique identifier of the pointer. It will be the same as `identifier`.\n * @readonly\n * @member {number}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/pointerId\n */\n get pointerId() {\n return this.identifier;\n }\n\n /**\n * Copies properties from normalized event data.\n *\n * @param {Touch|MouseEvent|PointerEvent} event The normalized event data\n * @private\n */\n _copyEvent(event) {\n // isPrimary should only change on touchstart/pointerdown, so we don't want to overwrite\n // it with \"false\" on later events when our shim for it on touch events might not be\n // accurate\n if (event.isPrimary) {\n this.isPrimary = true;\n }\n this.button = event.button;\n this.buttons = event.buttons;\n this.width = event.width;\n this.height = event.height;\n this.tiltX = event.tiltX;\n this.tiltY = event.tiltY;\n this.pointerType = event.pointerType;\n this.pressure = event.pressure;\n this.rotationAngle = event.rotationAngle;\n this.twist = event.twist || 0;\n this.tangentialPressure = event.tangentialPressure || 0;\n }\n\n /**\n * Resets the data for pooling.\n *\n * @private\n */\n _reset() {\n // isPrimary is the only property that we really need to reset - everything else is\n // guaranteed to be overwritten\n this.isPrimary = false;\n }\n}\n\nexport default InteractionData;\n","/**\n * Event class that mimics native DOM events.\n *\n * @class\n */\nclass InteractionEvent {\n /**\n * InteractionEvent constructor\n */\n constructor() {\n /**\n * Whether this event will continue propagating in the tree\n *\n * @member {boolean}\n */\n this.stopped = false;\n\n /**\n * The object which caused this event to be dispatched.\n *\n * @member {Object3D}\n */\n this.target = null;\n\n /**\n * The object whose event listener’s callback is currently being invoked.\n *\n * @member {Object3D}\n */\n this.currentTarget = null;\n\n /**\n * Type of the event\n *\n * @member {string}\n */\n this.type = null;\n\n /**\n * InteractionData related to this event\n *\n * @member {InteractionData}\n */\n this.data = null;\n\n /**\n * ray caster detial from 3d-mesh\n *\n * @member {Intersects}\n */\n this.intersects = [];\n }\n\n /**\n * Prevents event from reaching any objects other than the current object.\n *\n */\n stopPropagation() {\n this.stopped = true;\n }\n\n /**\n * Resets the event.\n *\n * @private\n */\n _reset() {\n this.stopped = false;\n this.currentTarget = null;\n this.target = null;\n this.intersects = [];\n }\n}\n\nexport default InteractionEvent;\n","/**\n * DisplayObjects with the `trackedPointers` property use this class to track interactions\n *\n * @class\n * @private\n */\nexport default class InteractionTrackingData {\n /**\n * @param {number} pointerId - Unique pointer id of the event\n */\n constructor(pointerId) {\n this._pointerId = pointerId;\n this._flags = InteractionTrackingData.FLAGS.NONE;\n }\n\n /**\n *\n * @private\n * @param {number} flag - The interaction flag to set\n * @param {boolean} yn - Should the flag be set or unset\n */\n _doSet(flag, yn) {\n if (yn) {\n this._flags = this._flags | flag;\n } else {\n this._flags = this._flags & (~flag);\n }\n }\n\n /**\n * Unique pointer id of the event\n *\n * @readonly\n * @member {number}\n */\n get pointerId() {\n return this._pointerId;\n }\n\n /**\n * State of the tracking data, expressed as bit flags\n *\n * @member {number}\n */\n get flags() {\n return this._flags;\n }\n\n /**\n * Set the flags for the tracking data\n *\n * @param {number} flags - Flags to set\n */\n set flags(flags) {\n this._flags = flags;\n }\n\n /**\n * Is the tracked event inactive (not over or down)?\n *\n * @member {number}\n */\n get none() {\n return this._flags === this.constructor.FLAGS.NONE;\n }\n\n /**\n * Is the tracked event over the DisplayObject?\n *\n * @member {boolean}\n */\n get over() {\n return (this._flags & this.constructor.FLAGS.OVER) !== 0;\n }\n\n /**\n * Set the over flag\n *\n * @param {boolean} yn - Is the event over?\n */\n set over(yn) {\n this._doSet(this.constructor.FLAGS.OVER, yn);\n }\n\n /**\n * Did the right mouse button come down in the DisplayObject?\n *\n * @member {boolean}\n */\n get rightDown() {\n return (this._flags & this.constructor.FLAGS.RIGHT_DOWN) !== 0;\n }\n\n /**\n * Set the right down flag\n *\n * @param {boolean} yn - Is the right mouse button down?\n */\n set rightDown(yn) {\n this._doSet(this.constructor.FLAGS.RIGHT_DOWN, yn);\n }\n\n /**\n * Did the left mouse button come down in the DisplayObject?\n *\n * @member {boolean}\n */\n get leftDown() {\n return (this._flags & this.constructor.FLAGS.LEFT_DOWN) !== 0;\n }\n\n /**\n * Set the left down flag\n *\n * @param {boolean} yn - Is the left mouse button down?\n */\n set leftDown(yn) {\n this._doSet(this.constructor.FLAGS.LEFT_DOWN, yn);\n }\n}\n\nInteractionTrackingData.FLAGS = Object.freeze({\n NONE: 0,\n OVER: 1 << 0,\n LEFT_DOWN: 1 << 1,\n RIGHT_DOWN: 1 << 2,\n});\n","import '../patch/EventDispatcher';\nimport '../patch/Object3D';\n\nimport { EventDispatcher, Raycaster } from 'three';\nimport InteractionData from './InteractionData';\nimport InteractionEvent from './InteractionEvent';\nimport InteractionTrackingData from './InteractionTrackingData';\n\nconst MOUSE_POINTER_ID = 'MOUSE';\n\n// helpers for hitTest() - only used inside hitTest()\nconst hitTestEvent = {\n target: null,\n data: {\n global: null,\n },\n};\n\n/**\n * The interaction manager deals with mouse, touch and pointer events. Any DisplayObject can be interactive\n * if its interactive parameter is set to true\n * This manager also supports multitouch.\n *\n * reference to [pixi.js](http://www.pixijs.com/) impl\n *\n * @private\n * @class\n * @extends EventDispatcher\n */\nclass InteractionManager extends EventDispatcher {\n /**\n * @param {WebGLRenderer} renderer - A reference to the current renderer\n * @param {Scene} scene - A reference to the current scene\n * @param {Camera} camera - A reference to the current camera\n * @param {Object} [options] - The options for the manager.\n * @param {Boolean} [options.autoPreventDefault=false] - Should the manager automatically prevent default browser actions.\n * @param {Boolean} [options.autoAttach=true] - Should the manager automatically attach target element.\n * @param {Number} [options.interactionFrequency=10] - Frequency increases the interaction events will be checked.\n */\n constructor(renderer, scene, camera, options) {\n super();\n\n options = options || {};\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {WebGLRenderer}\n */\n this.renderer = renderer;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {Scene}\n */\n this.scene = scene;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {Camera}\n */\n this.camera = camera;\n\n /**\n * Should default browser actions automatically be prevented.\n * Does not apply to pointer events for backwards compatibility\n * preventDefault on pointer events stops mouse events from firing\n * Thus, for every pointer event, there will always be either a mouse of touch event alongside it.\n *\n * @member {boolean}\n * @default false\n */\n this.autoPreventDefault = options.autoPreventDefault || false;\n\n /**\n * Frequency in milliseconds that the mousemove, moveover & mouseout interaction events will be checked.\n *\n * @member {number}\n * @default 10\n */\n this.interactionFrequency = options.interactionFrequency || 10;\n\n /**\n * The mouse data\n *\n * @member {InteractionData}\n */\n this.mouse = new InteractionData();\n this.mouse.identifier = MOUSE_POINTER_ID;\n\n // setting the mouse to start off far off screen will mean that mouse over does\n // not get called before we even move the mouse.\n this.mouse.global.set(-999999);\n\n /**\n * Actively tracked InteractionData\n *\n * @private\n * @member {Object.}\n */\n this.activeInteractionData = {};\n this.activeInteractionData[MOUSE_POINTER_ID] = this.mouse;\n\n /**\n * Pool of unused InteractionData\n *\n * @private\n * @member {InteractionData[]}\n */\n this.interactionDataPool = [];\n\n /**\n * An event data object to handle all the event tracking/dispatching\n *\n * @member {object}\n */\n this.eventData = new InteractionEvent();\n\n /**\n * The DOM element to bind to.\n *\n * @private\n * @member {HTMLElement}\n */\n this.interactionDOMElement = null;\n\n /**\n * This property determines if mousemove and touchmove events are fired only when the cursor\n * is over the object.\n * Setting to true will make things work more in line with how the DOM verison works.\n * Setting to false can make things easier for things like dragging\n * It is currently set to false as this is how three.js used to work.\n *\n * @member {boolean}\n * @default true\n */\n this.moveWhenInside = true;\n\n /**\n * Have events been attached to the dom element?\n *\n * @private\n * @member {boolean}\n */\n this.eventsAdded = false;\n\n /**\n * Is the mouse hovering over the renderer?\n *\n * @private\n * @member {boolean}\n */\n this.mouseOverRenderer = false;\n\n /**\n * Does the device support touch events\n * https://www.w3.org/TR/touch-events/\n *\n * @readonly\n * @member {boolean}\n */\n this.supportsTouchEvents = 'ontouchstart' in window;\n\n /**\n * Does the device support pointer events\n * https://www.w3.org/Submission/pointer-events/\n *\n * @readonly\n * @member {boolean}\n */\n this.supportsPointerEvents = !!window.PointerEvent;\n\n // this will make it so that you don't have to call bind all the time\n\n /**\n * @private\n * @member {Function}\n */\n this.onClick = this.onClick.bind(this);\n this.processClick = this.processClick.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerUp = this.onPointerUp.bind(this);\n this.processPointerUp = this.processPointerUp.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerCancel = this.onPointerCancel.bind(this);\n this.processPointerCancel = this.processPointerCancel.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerDown = this.onPointerDown.bind(this);\n this.processPointerDown = this.processPointerDown.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerMove = this.onPointerMove.bind(this);\n this.processPointerMove = this.processPointerMove.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerOut = this.onPointerOut.bind(this);\n this.processPointerOverOut = this.processPointerOverOut.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerOver = this.onPointerOver.bind(this);\n\n /**\n * Dictionary of how different cursor modes are handled. Strings are handled as CSS cursor\n * values, objects are handled as dictionaries of CSS values for interactionDOMElement,\n * and functions are called instead of changing the CSS.\n * Default CSS cursor values are provided for 'default' and 'pointer' modes.\n * @member {Object.)>}\n */\n this.cursorStyles = {\n default: 'inherit',\n pointer: 'pointer',\n };\n\n /**\n * The mode of the cursor that is being used.\n * The value of this is a key from the cursorStyles dictionary.\n *\n * @member {string}\n */\n this.currentCursorMode = null;\n\n /**\n * Internal cached let.\n *\n * @private\n * @member {string}\n */\n this.cursor = null;\n\n /**\n * ray caster, for survey intersects from 3d-scene\n *\n * @private\n * @member {Raycaster}\n */\n this.raycaster = new Raycaster();\n\n /**\n * snippet time\n *\n * @private\n * @member {Number}\n */\n this._deltaTime = 0;\n\n this.setTargetElement(this.renderer.domElement);\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed on the display\n * object.\n *\n * @event InteractionManager#mousedown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * on the display object.\n *\n * @event InteractionManager#rightdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released over the display\n * object.\n *\n * @event InteractionManager#mouseup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * over the display object.\n *\n * @event InteractionManager#rightup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed and released on\n * the display object.\n *\n * @event InteractionManager#click\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * and released on the display object.\n *\n * @event InteractionManager#rightclick\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released outside the\n * display object that initially registered a\n * [mousedown]{@link InteractionManager#event:mousedown}.\n *\n * @event InteractionManager#mouseupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * outside the display object that initially registered a\n * [rightdown]{@link InteractionManager#event:rightdown}.\n *\n * @event InteractionManager#rightupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved while over the display object\n *\n * @event InteractionManager#mousemove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved onto the display object\n *\n * @event InteractionManager#mouseover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved off the display object\n *\n * @event InteractionManager#mouseout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed on the display object.\n *\n * @event InteractionManager#pointerdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released over the display object.\n *\n * @event InteractionManager#pointerup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a pointer event\n *\n * @event InteractionManager#pointercancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed and released on the display object.\n *\n * @event InteractionManager#pointertap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released outside the display object that initially\n * registered a [pointerdown]{@link InteractionManager#event:pointerdown}.\n *\n * @event InteractionManager#pointerupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved while over the display object\n *\n * @event InteractionManager#pointermove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved onto the display object\n *\n * @event InteractionManager#pointerover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved off the display object\n *\n * @event InteractionManager#pointerout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed on the display object.\n *\n * @event InteractionManager#touchstart\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed from the display object.\n *\n * @event InteractionManager#touchend\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a touch\n *\n * @event InteractionManager#touchcancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed and removed from the display object.\n *\n * @event InteractionManager#tap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed outside of the display object that initially\n * registered a [touchstart]{@link InteractionManager#event:touchstart}.\n *\n * @event InteractionManager#touchendoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is moved along the display object.\n *\n * @event InteractionManager#touchmove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed on the display.\n * object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mousedown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * on the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released over the display\n * object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * over the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed and released on\n * the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#click\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * and released on the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightclick\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released outside the\n * display object that initially registered a\n * [mousedown]{@link Object3D#event:mousedown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * outside the display object that initially registered a\n * [rightdown]{@link Object3D#event:rightdown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved while over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mousemove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved onto the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved off the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a pointer event.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointercancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed and released on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointertap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released outside the display object that initially\n * registered a [pointerdown]{@link Object3D#event:pointerdown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved while over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointermove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved onto the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved off the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchstart\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed from the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchend\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a touch.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchcancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed and removed from the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#tap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed outside of the display object that initially\n * registered a [touchstart]{@link Object3D#event:touchstart}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchendoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is moved along the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchmove\n * @param {InteractionEvent} event - Interaction event\n */\n }\n\n /**\n * Hit tests a point against the display tree, returning the first interactive object that is hit.\n *\n * @param {Point} globalPoint - A point to hit test with, in global space.\n * @param {Object3D} [root] - The root display object to start from. If omitted, defaults\n * to the last rendered root of the associated renderer.\n * @return {Object3D} The hit display object, if any.\n */\n hitTest(globalPoint, root) {\n // clear the target for our hit test\n hitTestEvent.target = null;\n // assign the global point\n hitTestEvent.data.global = globalPoint;\n // ensure safety of the root\n if (!root) {\n root = this.scene;\n }\n // run the hit test\n this.processInteractive(hitTestEvent, root, null, true);\n // return our found object - it'll be null if we didn't hit anything\n\n return hitTestEvent.target;\n }\n\n /**\n * Sets the DOM element which will receive mouse/touch events. This is useful for when you have\n * other DOM elements on top of the renderers Canvas element. With this you'll be bale to deletegate\n * another DOM element to receive those events.\n *\n * @param {HTMLCanvasElement} element - the DOM element which will receive mouse and touch events.\n */\n setTargetElement(element) {\n this.removeEvents();\n\n this.interactionDOMElement = element;\n\n this.addEvents();\n }\n\n /**\n * Registers all the DOM events\n *\n * @private\n */\n addEvents() {\n if (!this.interactionDOMElement || this.eventsAdded) {\n return;\n }\n\n this.emit('addevents');\n\n this.interactionDOMElement.addEventListener('click', this.onClick, true);\n\n if (window.navigator.msPointerEnabled) {\n this.interactionDOMElement.style['-ms-content-zooming'] = 'none';\n this.interactionDOMElement.style['-ms-touch-action'] = 'none';\n } else if (this.supportsPointerEvents) {\n this.interactionDOMElement.style['touch-action'] = 'none';\n }\n\n /**\n * These events are added first, so that if pointer events are normalised, they are fired\n * in the same order as non-normalised events. ie. pointer event 1st, mouse / touch 2nd\n */\n if (this.supportsPointerEvents) {\n window.document.addEventListener('pointermove', this.onPointerMove, true);\n this.interactionDOMElement.addEventListener('pointerdown', this.onPointerDown, true);\n // pointerout is fired in addition to pointerup (for touch events) and pointercancel\n // we already handle those, so for the purposes of what we do in onPointerOut, we only\n // care about the pointerleave event\n this.interactionDOMElement.addEventListener('pointerleave', this.onPointerOut, true);\n this.interactionDOMElement.addEventListener('pointerover', this.onPointerOver, true);\n window.addEventListener('pointercancel', this.onPointerCancel, true);\n window.addEventListener('pointerup', this.onPointerUp, true);\n } else {\n window.document.addEventListener('mousemove', this.onPointerMove, true);\n this.interactionDOMElement.addEventListener('mousedown', this.onPointerDown, true);\n this.interactionDOMElement.addEventListener('mouseout', this.onPointerOut, true);\n this.interactionDOMElement.addEventListener('mouseover', this.onPointerOver, true);\n window.addEventListener('mouseup', this.onPointerUp, true);\n }\n\n // always look directly for touch events so that we can provide original data\n // In a future version we should change this to being just a fallback and rely solely on\n // PointerEvents whenever available\n if (this.supportsTouchEvents) {\n this.interactionDOMElement.addEventListener('touchstart', this.onPointerDown, true);\n this.interactionDOMElement.addEventListener('touchcancel', this.onPointerCancel, true);\n this.interactionDOMElement.addEventListener('touchend', this.onPointerUp, true);\n this.interactionDOMElement.addEventListener('touchmove', this.onPointerMove, true);\n }\n\n this.eventsAdded = true;\n }\n\n /**\n * Removes all the DOM events that were previously registered\n *\n * @private\n */\n removeEvents() {\n if (!this.interactionDOMElement) {\n return;\n }\n\n this.emit('removeevents');\n\n this.interactionDOMElement.removeEventListener('click', this.onClick, true);\n\n if (window.navigator.msPointerEnabled) {\n this.interactionDOMElement.style['-ms-content-zooming'] = '';\n this.interactionDOMElement.style['-ms-touch-action'] = '';\n } else if (this.supportsPointerEvents) {\n this.interactionDOMElement.style['touch-action'] = '';\n }\n\n if (this.supportsPointerEvents) {\n window.document.removeEventListener('pointermove', this.onPointerMove, true);\n this.interactionDOMElement.removeEventListener('pointerdown', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('pointerleave', this.onPointerOut, true);\n this.interactionDOMElement.removeEventListener('pointerover', this.onPointerOver, true);\n window.removeEventListener('pointercancel', this.onPointerCancel, true);\n window.removeEventListener('pointerup', this.onPointerUp, true);\n } else {\n window.document.removeEventListener('mousemove', this.onPointerMove, true);\n this.interactionDOMElement.removeEventListener('mousedown', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('mouseout', this.onPointerOut, true);\n this.interactionDOMElement.removeEventListener('mouseover', this.onPointerOver, true);\n window.removeEventListener('mouseup', this.onPointerUp, true);\n }\n\n if (this.supportsTouchEvents) {\n this.interactionDOMElement.removeEventListener('touchstart', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('touchcancel', this.onPointerCancel, true);\n this.interactionDOMElement.removeEventListener('touchend', this.onPointerUp, true);\n this.interactionDOMElement.removeEventListener('touchmove', this.onPointerMove, true);\n }\n\n this.interactionDOMElement = null;\n\n this.eventsAdded = false;\n }\n\n /**\n * Updates the state of interactive objects.\n * Invoked by a throttled ticker.\n *\n * @param {number} deltaTime - time delta since last tick\n */\n update({ snippet }) {\n this._deltaTime += snippet;\n\n if (this._deltaTime < this.interactionFrequency) {\n return;\n }\n\n this._deltaTime = 0;\n\n if (!this.interactionDOMElement) {\n return;\n }\n\n // if the user move the mouse this check has already been done using the mouse move!\n if (this.didMove) {\n this.didMove = false;\n\n return;\n }\n\n this.cursor = null;\n\n // Resets the flag as set by a stopPropagation call. This flag is usually reset by a user interaction of any kind,\n // but there was a scenario of a display object moving under a static mouse cursor.\n // In this case, mouseover and mouseevents would not pass the flag test in triggerEvent function\n for (const k in this.activeInteractionData) {\n // eslint-disable-next-line no-prototype-builtins\n if (this.activeInteractionData.hasOwnProperty(k)) {\n const interactionData = this.activeInteractionData[k];\n\n if (interactionData.originalEvent && interactionData.pointerType !== 'touch') {\n const interactionEvent = this.configureInteractionEventForDOMEvent(\n this.eventData,\n interactionData.originalEvent,\n interactionData\n );\n\n this.processInteractive(\n interactionEvent,\n this.scene,\n this.processPointerOverOut,\n true\n );\n }\n }\n }\n\n this.setCursorMode(this.cursor);\n\n // TODO\n }\n\n /**\n * Sets the current cursor mode, handling any callbacks or CSS style changes.\n *\n * @param {string} mode - cursor mode, a key from the cursorStyles dictionary\n */\n setCursorMode(mode) {\n mode = mode || 'default';\n // if the mode didn't actually change, bail early\n if (this.currentCursorMode === mode) {\n return;\n }\n this.currentCursorMode = mode;\n const style = this.cursorStyles[mode];\n\n // only do things if there is a cursor style for it\n if (style) {\n switch (typeof style) {\n case 'string':\n // string styles are handled as cursor CSS\n this.interactionDOMElement.style.cursor = style;\n break;\n case 'function':\n // functions are just called, and passed the cursor mode\n style(mode);\n break;\n case 'object':\n // if it is an object, assume that it is a dictionary of CSS styles,\n // apply it to the interactionDOMElement\n Object.assign(this.interactionDOMElement.style, style);\n break;\n default:\n break;\n }\n } else if (typeof mode === 'string' && !Object.prototype.hasOwnProperty.call(this.cursorStyles, mode)) {\n // if it mode is a string (not a Symbol) and cursorStyles doesn't have any entry\n // for the mode, then assume that the dev wants it to be CSS for the cursor.\n this.interactionDOMElement.style.cursor = mode;\n }\n }\n\n /**\n * Dispatches an event on the display object that was interacted with\n *\n * @param {Object3D} displayObject - the display object in question\n * @param {string} eventString - the name of the event (e.g, mousedown)\n * @param {object} eventData - the event data object\n * @private\n */\n triggerEvent(displayObject, eventString, eventData) {\n if (!eventData.stopped) {\n eventData.currentTarget = displayObject;\n eventData.type = eventString;\n\n displayObject.emit(eventString, eventData);\n\n if (displayObject[eventString]) {\n displayObject[eventString](eventData);\n }\n }\n }\n\n /**\n * This function is provides a neat way of crawling through the scene graph and running a\n * specified function on all interactive objects it finds. It will also take care of hit\n * testing the interactive objects and passes the hit across in the function.\n *\n * @private\n * @param {InteractionEvent} interactionEvent - event containing the point that\n * is tested for collision\n * @param {Object3D} displayObject - the displayObject\n * that will be hit test (recursively crawls its children)\n * @param {Function} [func] - the function that will be called on each interactive object. The\n * interactionEvent, displayObject and hit will be passed to the function\n * @param {boolean} [hitTest] - this indicates if the objects inside should be hit test against the point\n * @param {boolean} [interactive] - Whether the displayObject is interactive\n * @return {boolean} returns true if the displayObject hit the point\n */\n processInteractive(interactionEvent, displayObject, func, hitTest, interactive) {\n if (!displayObject || !displayObject.visible) {\n return false;\n }\n\n // Took a little while to rework this function correctly! But now it is done and nice and optimised. ^_^\n //\n // This function will now loop through all objects and then only hit test the objects it HAS\n // to, not all of them. MUCH faster..\n // An object will be hit test if the following is true:\n //\n // 1: It is interactive.\n // 2: It belongs to a parent that is interactive AND one of the parents children have not already been hit.\n //\n // As another little optimisation once an interactive object has been hit we can carry on\n // through the scenegraph, but we know that there will be no more hits! So we can avoid extra hit tests\n // A final optimisation is that an object is not hit test directly if a child has already been hit.\n\n interactive = displayObject.interactive || interactive;\n\n let hit = false;\n let interactiveParent = interactive;\n\n if (displayObject.interactiveChildren && displayObject.children) {\n const children = displayObject.children;\n\n for (let i = children.length - 1; i >= 0; i--) {\n const child = children[i];\n\n // time to get recursive.. if this function will return if something is hit..\n const childHit = this.processInteractive(interactionEvent, child, func, hitTest, interactiveParent);\n\n if (childHit) {\n // its a good idea to check if a child has lost its parent.\n // this means it has been removed whilst looping so its best\n if (!child.parent) {\n continue;\n }\n\n // we no longer need to hit test any more objects in this container as we we\n // now know the parent has been hit\n interactiveParent = false;\n\n // If the child is interactive , that means that the object hit was actually\n // interactive and not just the child of an interactive object.\n // This means we no longer need to hit test anything else. We still need to run\n // through all objects, but we don't need to perform any hit tests.\n\n if (childHit) {\n if (interactionEvent.target) {\n hitTest = false;\n }\n hit = true;\n }\n }\n }\n }\n\n // no point running this if the item is not interactive or does not have an interactive parent.\n if (interactive) {\n // if we are hit testing (as in we have no hit any objects yet)\n // We also don't need to worry about hit testing if once of the displayObjects children\n // has already been hit - but only if it was interactive, otherwise we need to keep\n // looking for an interactive child, just in case we hit one\n if (hitTest && !interactionEvent.target) {\n if (interactionEvent.intersects[0] && interactionEvent.intersects[0].object === displayObject) {\n hit = true;\n }\n }\n\n if (displayObject.interactive) {\n if (hit && !interactionEvent.target) {\n interactionEvent.data.target = interactionEvent.target = displayObject;\n }\n\n if (func) {\n func(interactionEvent, displayObject, !!hit);\n }\n }\n }\n\n return hit;\n }\n\n\n /**\n * Is called when the click is pressed down on the renderer element\n *\n * @private\n * @param {MouseEvent} originalEvent - The DOM event of a click being pressed down\n */\n onClick(originalEvent) {\n if (originalEvent.type !== 'click') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n if (this.autoPreventDefault && events[0].isNormalized) {\n originalEvent.preventDefault();\n }\n\n const interactionData = this.getInteractionDataForPointerId(events[0]);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, events[0], interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n this.processInteractive(interactionEvent, this.scene, this.processClick, true);\n\n this.emit('click', interactionEvent);\n }\n\n /**\n * Processes the result of the click check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processClick(interactionEvent, displayObject, hit) {\n if (hit) {\n this.triggerEvent(displayObject, 'click', interactionEvent);\n }\n }\n\n /**\n * Is called when the pointer button is pressed down on the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being pressed down\n */\n onPointerDown(originalEvent) {\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n /**\n * No need to prevent default on natural pointer events, as there are no side effects\n * Normalized events, however, may have the double mousedown/touchstart issue on the native android browser,\n * so still need to be prevented.\n */\n\n // Guaranteed that there will be at least one event in events, and all events must have the same pointer type\n\n if (this.autoPreventDefault && events[0].isNormalized) {\n originalEvent.preventDefault();\n }\n\n const eventLen = events.length;\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n this.processInteractive(interactionEvent, this.scene, this.processPointerDown, true);\n\n this.emit('pointerdown', interactionEvent);\n if (event.pointerType === 'touch') {\n this.emit('touchstart', interactionEvent);\n } else if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n const isRightButton = event.button === 2;\n\n this.emit(isRightButton ? 'rightdown' : 'mousedown', this.eventData);\n }\n }\n }\n\n /**\n * Processes the result of the pointer down check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerDown(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n const id = interactionEvent.data.identifier;\n\n if (hit) {\n if (!displayObject.trackedPointers[id]) {\n displayObject.trackedPointers[id] = new InteractionTrackingData(id);\n }\n this.triggerEvent(displayObject, 'pointerdown', interactionEvent);\n\n if (data.pointerType === 'touch') {\n displayObject.started = true;\n this.triggerEvent(displayObject, 'touchstart', interactionEvent);\n } else if (data.pointerType === 'mouse' || data.pointerType === 'pen') {\n const isRightButton = data.button === 2;\n\n if (isRightButton) {\n displayObject.trackedPointers[id].rightDown = true;\n } else {\n displayObject.trackedPointers[id].leftDown = true;\n }\n\n this.triggerEvent(displayObject, isRightButton ? 'rightdown' : 'mousedown', interactionEvent);\n }\n }\n }\n\n /**\n * Is called when the pointer button is released on the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being released\n * @param {boolean} cancelled - true if the pointer is cancelled\n * @param {Function} func - Function passed to {@link processInteractive}\n */\n onPointerComplete(originalEvent, cancelled, func) {\n const events = this.normalizeToPointerData(originalEvent);\n\n const eventLen = events.length;\n\n // if the event wasn't targeting our canvas, then consider it to be pointerupoutside\n // in all cases (unless it was a pointercancel)\n const eventAppend = originalEvent.target !== this.interactionDOMElement ? 'outside' : '';\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n // perform hit testing for events targeting our canvas or cancel events\n this.processInteractive(interactionEvent, this.scene, func, cancelled || !eventAppend);\n\n this.emit(cancelled ? 'pointercancel' : `pointerup${eventAppend}`, interactionEvent);\n\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n const isRightButton = event.button === 2;\n\n this.emit(isRightButton ? `rightup${eventAppend}` : `mouseup${eventAppend}`, interactionEvent);\n } else if (event.pointerType === 'touch') {\n this.emit(cancelled ? 'touchcancel' : `touchend${eventAppend}`, interactionEvent);\n this.releaseInteractionDataForPointerId(event.pointerId, interactionData);\n }\n }\n }\n\n /**\n * Is called when the pointer button is cancelled\n *\n * @private\n * @param {PointerEvent} event - The DOM event of a pointer button being released\n */\n onPointerCancel(event) {\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && event.pointerType === 'touch') return;\n\n this.onPointerComplete(event, true, this.processPointerCancel);\n }\n\n /**\n * Processes the result of the pointer cancel check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n */\n processPointerCancel(interactionEvent, displayObject) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n if (displayObject.trackedPointers[id] !== undefined) {\n delete displayObject.trackedPointers[id];\n this.triggerEvent(displayObject, 'pointercancel', interactionEvent);\n\n if (data.pointerType === 'touch') {\n this.triggerEvent(displayObject, 'touchcancel', interactionEvent);\n }\n }\n }\n\n /**\n * Is called when the pointer button is released on the renderer element\n *\n * @private\n * @param {PointerEvent} event - The DOM event of a pointer button being released\n */\n onPointerUp(event) {\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && event.pointerType === 'touch') return;\n\n this.onPointerComplete(event, false, this.processPointerUp);\n }\n\n /**\n * Processes the result of the pointer up check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerUp(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n const trackingData = displayObject.trackedPointers[id];\n\n const isTouch = data.pointerType === 'touch';\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n // Mouse only\n if (isMouse) {\n const isRightButton = data.button === 2;\n\n const flags = InteractionTrackingData.FLAGS;\n\n const test = isRightButton ? flags.RIGHT_DOWN : flags.LEFT_DOWN;\n\n const isDown = trackingData !== undefined && (trackingData.flags & test);\n\n if (hit) {\n this.triggerEvent(displayObject, isRightButton ? 'rightup' : 'mouseup', interactionEvent);\n\n if (isDown) {\n this.triggerEvent(displayObject, isRightButton ? 'rightclick' : 'leftclick', interactionEvent);\n }\n } else if (isDown) {\n this.triggerEvent(displayObject, isRightButton ? 'rightupoutside' : 'mouseupoutside', interactionEvent);\n }\n // update the down state of the tracking data\n if (trackingData) {\n if (isRightButton) {\n trackingData.rightDown = false;\n } else {\n trackingData.leftDown = false;\n }\n }\n }\n\n // Pointers and Touches, and Mouse\n if (isTouch && displayObject.started) {\n displayObject.started = false;\n this.triggerEvent(displayObject, 'touchend', interactionEvent);\n }\n if (hit) {\n this.triggerEvent(displayObject, 'pointerup', interactionEvent);\n\n if (trackingData) {\n this.triggerEvent(displayObject, 'pointertap', interactionEvent);\n if (isTouch) {\n this.triggerEvent(displayObject, 'tap', interactionEvent);\n // touches are no longer over (if they ever were) when we get the touchend\n // so we should ensure that we don't keep pretending that they are\n trackingData.over = false;\n }\n }\n } else if (trackingData) {\n this.triggerEvent(displayObject, 'pointerupoutside', interactionEvent);\n if (isTouch) this.triggerEvent(displayObject, 'touchendoutside', interactionEvent);\n }\n // Only remove the tracking data if there is no over/down state still associated with it\n if (trackingData && trackingData.none) {\n delete displayObject.trackedPointers[id];\n }\n }\n\n /**\n * Is called when the pointer moves across the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer moving\n */\n onPointerMove(originalEvent) {\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n if (events[0].pointerType === 'mouse') {\n this.didMove = true;\n\n this.cursor = null;\n }\n\n const eventLen = events.length;\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n const interactive = event.pointerType === 'touch' ? this.moveWhenInside : true;\n\n this.processInteractive(\n interactionEvent,\n this.scene,\n this.processPointerMove,\n interactive\n );\n this.emit('pointermove', interactionEvent);\n if (event.pointerType === 'touch') this.emit('touchmove', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') this.emit('mousemove', interactionEvent);\n }\n\n if (events[0].pointerType === 'mouse') {\n this.setCursorMode(this.cursor);\n\n // TODO BUG for parents interactive object (border order issue)\n }\n }\n\n /**\n * Processes the result of the pointer move check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerMove(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const isTouch = data.pointerType === 'touch';\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n if (isMouse) {\n this.processPointerOverOut(interactionEvent, displayObject, hit);\n }\n\n if (isTouch && displayObject.started) this.triggerEvent(displayObject, 'touchmove', interactionEvent);\n if (!this.moveWhenInside || hit) {\n this.triggerEvent(displayObject, 'pointermove', interactionEvent);\n if (isMouse) this.triggerEvent(displayObject, 'mousemove', interactionEvent);\n }\n }\n\n /**\n * Is called when the pointer is moved out of the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer being moved out\n */\n onPointerOut(originalEvent) {\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n // Only mouse and pointer can call onPointerOut, so events will always be length 1\n const event = events[0];\n\n if (event.pointerType === 'mouse') {\n this.mouseOverRenderer = false;\n this.setCursorMode(null);\n }\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = event;\n\n this.processInteractive(interactionEvent, this.scene, this.processPointerOverOut, false);\n\n this.emit('pointerout', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n this.emit('mouseout', interactionEvent);\n } else {\n // we can get touchleave events after touchend, so we want to make sure we don't\n // introduce memory leaks\n this.releaseInteractionDataForPointerId(interactionData.identifier);\n }\n }\n\n /**\n * Processes the result of the pointer over/out check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerOverOut(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n let trackingData = displayObject.trackedPointers[id];\n\n // if we just moused over the display object, then we need to track that state\n if (hit && !trackingData) {\n trackingData = displayObject.trackedPointers[id] = new InteractionTrackingData(id);\n }\n\n if (trackingData === undefined) return;\n\n if (hit && this.mouseOverRenderer) {\n if (!trackingData.over) {\n trackingData.over = true;\n this.triggerEvent(displayObject, 'pointerover', interactionEvent);\n if (isMouse) {\n this.triggerEvent(displayObject, 'mouseover', interactionEvent);\n }\n }\n\n // only change the cursor if it has not already been changed (by something deeper in the\n // display tree)\n if (isMouse && this.cursor === null) {\n this.cursor = displayObject.cursor;\n }\n } else if (trackingData.over) {\n trackingData.over = false;\n this.triggerEvent(displayObject, 'pointerout', this.eventData);\n if (isMouse) {\n this.triggerEvent(displayObject, 'mouseout', interactionEvent);\n }\n // if there is no mouse down information for the pointer, then it is safe to delete\n if (trackingData.none) {\n delete displayObject.trackedPointers[id];\n }\n }\n }\n\n /**\n * Is called when the pointer is moved into the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being moved into the renderer view\n */\n onPointerOver(originalEvent) {\n const events = this.normalizeToPointerData(originalEvent);\n\n // Only mouse and pointer can call onPointerOver, so events will always be length 1\n const event = events[0];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = event;\n\n if (event.pointerType === 'mouse') {\n this.mouseOverRenderer = true;\n }\n\n this.emit('pointerover', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n this.emit('mouseover', interactionEvent);\n }\n }\n\n /**\n * Get InteractionData for a given pointerId. Store that data as well\n *\n * @private\n * @param {PointerEvent} event - Normalized pointer event, output from normalizeToPointerData\n * @return {InteractionData} - Interaction data for the given pointer identifier\n */\n getInteractionDataForPointerId(event) {\n const pointerId = event.pointerId;\n\n let interactionData;\n\n if (pointerId === MOUSE_POINTER_ID || event.pointerType === 'mouse') {\n interactionData = this.mouse;\n } else if (this.activeInteractionData[pointerId]) {\n interactionData = this.activeInteractionData[pointerId];\n } else {\n interactionData = this.interactionDataPool.pop() || new InteractionData();\n interactionData.identifier = pointerId;\n this.activeInteractionData[pointerId] = interactionData;\n }\n // copy properties from the event, so that we can make sure that touch/pointer specific\n // data is available\n interactionData._copyEvent(event);\n\n return interactionData;\n }\n\n /**\n * Return unused InteractionData to the pool, for a given pointerId\n *\n * @private\n * @param {number} pointerId - Identifier from a pointer event\n */\n releaseInteractionDataForPointerId(pointerId) {\n const interactionData = this.activeInteractionData[pointerId];\n\n if (interactionData) {\n delete this.activeInteractionData[pointerId];\n interactionData._reset();\n this.interactionDataPool.push(interactionData);\n }\n }\n\n /**\n * Maps x and y coords from a DOM object and maps them correctly to the three.js view. The\n * resulting value is stored in the point. This takes into account the fact that the DOM\n * element could be scaled and positioned anywhere on the screen.\n *\n * @param {Vector2} point - the point that the result will be stored in\n * @param {number} x - the x coord of the position to map\n * @param {number} y - the y coord of the position to map\n */\n mapPositionToPoint(point, x, y) {\n let rect;\n\n // IE 11 fix\n if (!this.interactionDOMElement.parentElement) {\n rect = {\n x: 0,\n y: 0,\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n };\n } else {\n rect = this.interactionDOMElement.getBoundingClientRect();\n }\n\n point.x = ((x - rect.left) / rect.width) * 2 - 1;\n point.y = -((y - rect.top) / rect.height) * 2 + 1;\n }\n\n /**\n * Configure an InteractionEvent to wrap a DOM PointerEvent and InteractionData\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The event to be configured\n * @param {PointerEvent} pointerEvent - The DOM event that will be paired with the InteractionEvent\n * @param {InteractionData} interactionData - The InteractionData that will be paired\n * with the InteractionEvent\n * @return {InteractionEvent} the interaction event that was passed in\n */\n configureInteractionEventForDOMEvent(interactionEvent, pointerEvent, interactionData) {\n interactionEvent.data = interactionData;\n\n this.mapPositionToPoint(interactionData.global, pointerEvent.clientX, pointerEvent.clientY);\n\n this.raycaster.setFromCamera(interactionData.global, this.camera);\n\n // Not really sure why this is happening, but it's how a previous version handled things TODO: there should be remove\n if (pointerEvent.pointerType === 'touch') {\n pointerEvent.globalX = interactionData.global.x;\n pointerEvent.globalY = interactionData.global.y;\n }\n\n interactionData.originalEvent = pointerEvent;\n interactionEvent._reset();\n interactionEvent.intersects = this.raycaster.intersectObjects(this.scene.children, true);\n\n return interactionEvent;\n }\n\n /**\n * Ensures that the original event object contains all data that a regular pointer event would have\n *\n * @private\n * @param {TouchEvent|MouseEvent|PointerEvent} event - The original event data from a touch or mouse event\n * @return {PointerEvent[]} An array containing a single normalized pointer event, in the case of a pointer\n * or mouse event, or a multiple normalized pointer events if there are multiple changed touches\n */\n normalizeToPointerData(event) {\n const normalizedEvents = [];\n\n if (this.supportsTouchEvents && event instanceof TouchEvent) {\n for (let i = 0, li = event.changedTouches.length; i < li; i++) {\n const touch = event.changedTouches[i];\n\n if (typeof touch.button === 'undefined') touch.button = event.touches.length ? 1 : 0;\n if (typeof touch.buttons === 'undefined') touch.buttons = event.touches.length ? 1 : 0;\n if (typeof touch.isPrimary === 'undefined') {\n touch.isPrimary = event.touches.length === 1 && event.type === 'touchstart';\n }\n if (typeof touch.width === 'undefined') touch.width = touch.radiusX || 1;\n if (typeof touch.height === 'undefined') touch.height = touch.radiusY || 1;\n if (typeof touch.tiltX === 'undefined') touch.tiltX = 0;\n if (typeof touch.tiltY === 'undefined') touch.tiltY = 0;\n if (typeof touch.pointerType === 'undefined') touch.pointerType = 'touch';\n if (typeof touch.pointerId === 'undefined') touch.pointerId = touch.identifier || 0;\n if (typeof touch.pressure === 'undefined') touch.pressure = touch.force || 0.5;\n touch.twist = 0;\n touch.tangentialPressure = 0;\n // TODO: Remove these, as layerX/Y is not a standard, is deprecated, has uneven\n // support, and the fill ins are not quite the same\n // offsetX/Y might be okay, but is not the same as clientX/Y when the canvas's top\n // left is not 0,0 on the page\n if (typeof touch.layerX === 'undefined') touch.layerX = touch.offsetX = touch.clientX;\n if (typeof touch.layerY === 'undefined') touch.layerY = touch.offsetY = touch.clientY;\n\n // mark the touch as normalized, just so that we know we did it\n touch.isNormalized = true;\n\n normalizedEvents.push(touch);\n }\n } else if (event instanceof MouseEvent && (!this.supportsPointerEvents || !(event instanceof window.PointerEvent))) {\n if (typeof event.isPrimary === 'undefined') event.isPrimary = true;\n if (typeof event.width === 'undefined') event.width = 1;\n if (typeof event.height === 'undefined') event.height = 1;\n if (typeof event.tiltX === 'undefined') event.tiltX = 0;\n if (typeof event.tiltY === 'undefined') event.tiltY = 0;\n if (typeof event.pointerType === 'undefined') event.pointerType = 'mouse';\n if (typeof event.pointerId === 'undefined') event.pointerId = MOUSE_POINTER_ID;\n if (typeof event.pressure === 'undefined') event.pressure = 0.5;\n event.twist = 0;\n event.tangentialPressure = 0;\n\n // mark the mouse event as normalized, just so that we know we did it\n event.isNormalized = true;\n\n normalizedEvents.push(event);\n } else {\n normalizedEvents.push(event);\n }\n\n return normalizedEvents;\n }\n\n /**\n * Destroys the interaction manager\n *\n */\n destroy() {\n this.removeEvents();\n\n this.removeAllListeners();\n\n this.renderer = null;\n\n this.mouse = null;\n\n this.eventData = null;\n\n this.interactionDOMElement = null;\n\n this.onPointerDown = null;\n this.processPointerDown = null;\n\n this.onPointerUp = null;\n this.processPointerUp = null;\n\n this.onPointerCancel = null;\n this.processPointerCancel = null;\n\n this.onPointerMove = null;\n this.processPointerMove = null;\n\n this.onPointerOut = null;\n this.processPointerOverOut = null;\n\n this.onPointerOver = null;\n\n this._tempPoint = null;\n }\n}\n\nexport default InteractionManager;\n","import '../patch/EventDispatcher';\nimport '../patch/Object3D';\n\nimport { EventDispatcher, Raycaster } from 'three';\nimport InteractionData from './InteractionData';\nimport InteractionEvent from './InteractionEvent';\nimport InteractionTrackingData from './InteractionTrackingData';\n\nconst MOUSE_POINTER_ID = 'MOUSE';\n\n// helpers for hitTest() - only used inside hitTest()\nconst hitTestEvent = {\n target: null,\n data: {\n global: null,\n },\n};\n\n/**\n * The interaction manager deals with mouse, touch and pointer events. Any DisplayObject can be interactive\n * if its interactive parameter is set to true\n * This manager also supports multitouch.\n *\n * reference to [pixi.js](http://www.pixijs.com/) impl\n *\n * @private\n * @class\n * @extends EventDispatcher\n */\nclass InteractionLayer extends EventDispatcher {\n /**\n * @param {WebGLRenderer} renderer - A reference to the current renderer\n * @param {Object} [options] - The options for the manager.\n * @param {Boolean} [options.autoPreventDefault=false] - Should the manager automatically prevent default browser actions.\n * @param {Boolean} [options.autoAttach=true] - Should the manager automatically attach target element.\n * @param {Number} [options.interactionFrequency=10] - Frequency increases the interaction events will be checked.\n */\n constructor(renderer, options) {\n super();\n\n options = options || {};\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {WebGLRenderer}\n */\n this.renderer = renderer;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {Layer}\n */\n this.layer = null;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {Scene}\n */\n // this.scene = scene;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {Camera}\n */\n // this.camera = camera;\n\n /**\n * Should default browser actions automatically be prevented.\n * Does not apply to pointer events for backwards compatibility\n * preventDefault on pointer events stops mouse events from firing\n * Thus, for every pointer event, there will always be either a mouse of touch event alongside it.\n *\n * @member {boolean}\n * @default false\n */\n this.autoPreventDefault = options.autoPreventDefault || false;\n\n /**\n * Frequency in milliseconds that the mousemove, moveover & mouseout interaction events will be checked.\n *\n * @member {number}\n * @default 10\n */\n this.interactionFrequency = options.interactionFrequency || 10;\n\n /**\n * The mouse data\n *\n * @member {InteractionData}\n */\n this.mouse = new InteractionData();\n this.mouse.identifier = MOUSE_POINTER_ID;\n\n // setting the mouse to start off far off screen will mean that mouse over does\n // not get called before we even move the mouse.\n this.mouse.global.set(-999999);\n\n /**\n * Actively tracked InteractionData\n *\n * @private\n * @member {Object.}\n */\n this.activeInteractionData = {};\n this.activeInteractionData[MOUSE_POINTER_ID] = this.mouse;\n\n /**\n * Pool of unused InteractionData\n *\n * @private\n * @member {InteractionData[]}\n */\n this.interactionDataPool = [];\n\n /**\n * An event data object to handle all the event tracking/dispatching\n *\n * @member {object}\n */\n this.eventData = new InteractionEvent();\n\n /**\n * The DOM element to bind to.\n *\n * @private\n * @member {HTMLElement}\n */\n this.interactionDOMElement = null;\n\n /**\n * This property determines if mousemove and touchmove events are fired only when the cursor\n * is over the object.\n * Setting to true will make things work more in line with how the DOM verison works.\n * Setting to false can make things easier for things like dragging\n * It is currently set to false as this is how three.js used to work.\n *\n * @member {boolean}\n * @default true\n */\n this.moveWhenInside = true;\n\n /**\n * Have events been attached to the dom element?\n *\n * @private\n * @member {boolean}\n */\n this.eventsAdded = false;\n\n /**\n * Is the mouse hovering over the renderer?\n *\n * @private\n * @member {boolean}\n */\n this.mouseOverRenderer = false;\n\n /**\n * Does the device support touch events\n * https://www.w3.org/TR/touch-events/\n *\n * @readonly\n * @member {boolean}\n */\n this.supportsTouchEvents = 'ontouchstart' in window;\n\n /**\n * Does the device support pointer events\n * https://www.w3.org/Submission/pointer-events/\n *\n * @readonly\n * @member {boolean}\n */\n this.supportsPointerEvents = !!window.PointerEvent;\n\n // this will make it so that you don't have to call bind all the time\n\n /**\n * @private\n * @member {Function}\n */\n this.onClick = this.onClick.bind(this);\n this.processClick = this.processClick.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerUp = this.onPointerUp.bind(this);\n this.processPointerUp = this.processPointerUp.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerCancel = this.onPointerCancel.bind(this);\n this.processPointerCancel = this.processPointerCancel.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerDown = this.onPointerDown.bind(this);\n this.processPointerDown = this.processPointerDown.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerMove = this.onPointerMove.bind(this);\n this.processPointerMove = this.processPointerMove.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerOut = this.onPointerOut.bind(this);\n this.processPointerOverOut = this.processPointerOverOut.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerOver = this.onPointerOver.bind(this);\n\n /**\n * Dictionary of how different cursor modes are handled. Strings are handled as CSS cursor\n * values, objects are handled as dictionaries of CSS values for interactionDOMElement,\n * and functions are called instead of changing the CSS.\n * Default CSS cursor values are provided for 'default' and 'pointer' modes.\n * @member {Object.)>}\n */\n this.cursorStyles = {\n default: 'inherit',\n pointer: 'pointer',\n };\n\n /**\n * The mode of the cursor that is being used.\n * The value of this is a key from the cursorStyles dictionary.\n *\n * @member {string}\n */\n this.currentCursorMode = null;\n\n /**\n * Internal cached let.\n *\n * @private\n * @member {string}\n */\n this.cursor = null;\n\n /**\n * ray caster, for survey intersects from 3d-scene\n *\n * @private\n * @member {Raycaster}\n */\n this.raycaster = new Raycaster();\n\n /**\n * snippet time\n *\n * @private\n * @member {Number}\n */\n this._deltaTime = 0;\n\n this.setTargetElement(this.renderer.domElement);\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed on the display\n * object.\n *\n * @event InteractionLayer#mousedown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * on the display object.\n *\n * @event InteractionLayer#rightdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released over the display\n * object.\n *\n * @event InteractionLayer#mouseup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * over the display object.\n *\n * @event InteractionLayer#rightup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed and released on\n * the display object.\n *\n * @event InteractionLayer#click\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * and released on the display object.\n *\n * @event InteractionLayer#rightclick\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released outside the\n * display object that initially registered a\n * [mousedown]{@link InteractionLayer#event:mousedown}.\n *\n * @event InteractionLayer#mouseupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * outside the display object that initially registered a\n * [rightdown]{@link InteractionLayer#event:rightdown}.\n *\n * @event InteractionLayer#rightupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved while over the display object\n *\n * @event InteractionLayer#mousemove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved onto the display object\n *\n * @event InteractionLayer#mouseover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved off the display object\n *\n * @event InteractionLayer#mouseout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed on the display object.\n *\n * @event InteractionLayer#pointerdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released over the display object.\n *\n * @event InteractionLayer#pointerup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a pointer event\n *\n * @event InteractionLayer#pointercancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed and released on the display object.\n *\n * @event InteractionLayer#pointertap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released outside the display object that initially\n * registered a [pointerdown]{@link InteractionLayer#event:pointerdown}.\n *\n * @event InteractionLayer#pointerupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved while over the display object\n *\n * @event InteractionLayer#pointermove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved onto the display object\n *\n * @event InteractionLayer#pointerover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved off the display object\n *\n * @event InteractionLayer#pointerout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed on the display object.\n *\n * @event InteractionLayer#touchstart\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed from the display object.\n *\n * @event InteractionLayer#touchend\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a touch\n *\n * @event InteractionLayer#touchcancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed and removed from the display object.\n *\n * @event InteractionLayer#tap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed outside of the display object that initially\n * registered a [touchstart]{@link InteractionLayer#event:touchstart}.\n *\n * @event InteractionLayer#touchendoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is moved along the display object.\n *\n * @event InteractionLayer#touchmove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed on the display.\n * object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mousedown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * on the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released over the display\n * object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * over the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed and released on\n * the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#click\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * and released on the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightclick\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released outside the\n * display object that initially registered a\n * [mousedown]{@link Object3D#event:mousedown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * outside the display object that initially registered a\n * [rightdown]{@link Object3D#event:rightdown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved while over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mousemove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved onto the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved off the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a pointer event.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointercancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed and released on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointertap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released outside the display object that initially\n * registered a [pointerdown]{@link Object3D#event:pointerdown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved while over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointermove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved onto the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved off the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchstart\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed from the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchend\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a touch.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchcancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed and removed from the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#tap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed outside of the display object that initially\n * registered a [touchstart]{@link Object3D#event:touchstart}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchendoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is moved along the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchmove\n * @param {InteractionEvent} event - Interaction event\n */\n }\n\n /**\n * @return {boolean}\n */\n isAble() {\n return this.layer && this.layer.interactive;\n }\n\n /**\n * set layer\n * @param {Layer} layer layer\n */\n setLayer(layer) {\n this.layer = layer;\n }\n\n /**\n * Hit tests a point against the display tree, returning the first interactive object that is hit.\n *\n * @param {Point} globalPoint - A point to hit test with, in global space.\n * @param {Object3D} [root] - The root display object to start from. If omitted, defaults\n * to the last rendered root of the associated renderer.\n * @return {Object3D} The hit display object, if any.\n */\n hitTest(globalPoint, root) {\n if (!this.isAble()) return null;\n // clear the target for our hit test\n hitTestEvent.target = null;\n // assign the global point\n hitTestEvent.data.global = globalPoint;\n // ensure safety of the root\n if (!root) {\n root = this.layer.scene;\n }\n // run the hit test\n this.processInteractive(hitTestEvent, root, null, true);\n // return our found object - it'll be null if we didn't hit anything\n\n return hitTestEvent.target;\n }\n\n /**\n * Sets the DOM element which will receive mouse/touch events. This is useful for when you have\n * other DOM elements on top of the renderers Canvas element. With this you'll be bale to deletegate\n * another DOM element to receive those events.\n *\n * @param {HTMLCanvasElement} element - the DOM element which will receive mouse and touch events.\n */\n setTargetElement(element) {\n this.removeEvents();\n\n this.interactionDOMElement = element;\n\n this.addEvents();\n }\n\n /**\n * Registers all the DOM events\n *\n * @private\n */\n addEvents() {\n if (!this.interactionDOMElement || this.eventsAdded) {\n return;\n }\n\n this.emit('addevents');\n\n this.interactionDOMElement.addEventListener('click', this.onClick, true);\n\n if (window.navigator.msPointerEnabled) {\n this.interactionDOMElement.style['-ms-content-zooming'] = 'none';\n this.interactionDOMElement.style['-ms-touch-action'] = 'none';\n } else if (this.supportsPointerEvents) {\n this.interactionDOMElement.style['touch-action'] = 'none';\n }\n\n /**\n * These events are added first, so that if pointer events are normalised, they are fired\n * in the same order as non-normalised events. ie. pointer event 1st, mouse / touch 2nd\n */\n if (this.supportsPointerEvents) {\n window.document.addEventListener('pointermove', this.onPointerMove, true);\n this.interactionDOMElement.addEventListener('pointerdown', this.onPointerDown, true);\n // pointerout is fired in addition to pointerup (for touch events) and pointercancel\n // we already handle those, so for the purposes of what we do in onPointerOut, we only\n // care about the pointerleave event\n this.interactionDOMElement.addEventListener('pointerleave', this.onPointerOut, true);\n this.interactionDOMElement.addEventListener('pointerover', this.onPointerOver, true);\n window.addEventListener('pointercancel', this.onPointerCancel, true);\n window.addEventListener('pointerup', this.onPointerUp, true);\n } else {\n window.document.addEventListener('mousemove', this.onPointerMove, true);\n this.interactionDOMElement.addEventListener('mousedown', this.onPointerDown, true);\n this.interactionDOMElement.addEventListener('mouseout', this.onPointerOut, true);\n this.interactionDOMElement.addEventListener('mouseover', this.onPointerOver, true);\n window.addEventListener('mouseup', this.onPointerUp, true);\n }\n\n // always look directly for touch events so that we can provide original data\n // In a future version we should change this to being just a fallback and rely solely on\n // PointerEvents whenever available\n if (this.supportsTouchEvents) {\n this.interactionDOMElement.addEventListener('touchstart', this.onPointerDown, true);\n this.interactionDOMElement.addEventListener('touchcancel', this.onPointerCancel, true);\n this.interactionDOMElement.addEventListener('touchend', this.onPointerUp, true);\n this.interactionDOMElement.addEventListener('touchmove', this.onPointerMove, true);\n }\n\n this.eventsAdded = true;\n }\n\n /**\n * Removes all the DOM events that were previously registered\n *\n * @private\n */\n removeEvents() {\n if (!this.interactionDOMElement) {\n return;\n }\n\n this.emit('removeevents');\n\n this.interactionDOMElement.removeEventListener('click', this.onClick, true);\n\n if (window.navigator.msPointerEnabled) {\n this.interactionDOMElement.style['-ms-content-zooming'] = '';\n this.interactionDOMElement.style['-ms-touch-action'] = '';\n } else if (this.supportsPointerEvents) {\n this.interactionDOMElement.style['touch-action'] = '';\n }\n\n if (this.supportsPointerEvents) {\n window.document.removeEventListener('pointermove', this.onPointerMove, true);\n this.interactionDOMElement.removeEventListener('pointerdown', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('pointerleave', this.onPointerOut, true);\n this.interactionDOMElement.removeEventListener('pointerover', this.onPointerOver, true);\n window.removeEventListener('pointercancel', this.onPointerCancel, true);\n window.removeEventListener('pointerup', this.onPointerUp, true);\n } else {\n window.document.removeEventListener('mousemove', this.onPointerMove, true);\n this.interactionDOMElement.removeEventListener('mousedown', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('mouseout', this.onPointerOut, true);\n this.interactionDOMElement.removeEventListener('mouseover', this.onPointerOver, true);\n window.removeEventListener('mouseup', this.onPointerUp, true);\n }\n\n if (this.supportsTouchEvents) {\n this.interactionDOMElement.removeEventListener('touchstart', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('touchcancel', this.onPointerCancel, true);\n this.interactionDOMElement.removeEventListener('touchend', this.onPointerUp, true);\n this.interactionDOMElement.removeEventListener('touchmove', this.onPointerMove, true);\n }\n\n this.interactionDOMElement = null;\n\n this.eventsAdded = false;\n }\n\n /**\n * Updates the state of interactive objects.\n * Invoked by a throttled ticker.\n *\n * @param {number} deltaTime - time delta since last tick\n */\n update({ snippet }) {\n if (!this.isAble()) return;\n this._deltaTime += snippet;\n\n if (this._deltaTime < this.interactionFrequency) {\n return;\n }\n\n this._deltaTime = 0;\n\n if (!this.interactionDOMElement) {\n return;\n }\n\n // if the user move the mouse this check has already been done using the mouse move!\n if (this.didMove) {\n this.didMove = false;\n\n return;\n }\n\n this.cursor = null;\n\n // Resets the flag as set by a stopPropagation call. This flag is usually reset by a user interaction of any kind,\n // but there was a scenario of a display object moving under a static mouse cursor.\n // In this case, mouseover and mouseevents would not pass the flag test in triggerEvent function\n for (const k in this.activeInteractionData) {\n // eslint-disable-next-line no-prototype-builtins\n if (this.activeInteractionData.hasOwnProperty(k)) {\n const interactionData = this.activeInteractionData[k];\n\n if (interactionData.originalEvent && interactionData.pointerType !== 'touch') {\n const interactionEvent = this.configureInteractionEventForDOMEvent(\n this.eventData,\n interactionData.originalEvent,\n interactionData\n );\n\n this.processInteractive(\n interactionEvent,\n this.layer.scene,\n this.processPointerOverOut,\n true\n );\n }\n }\n }\n\n this.setCursorMode(this.cursor);\n\n // TODO\n }\n\n /**\n * Sets the current cursor mode, handling any callbacks or CSS style changes.\n *\n * @param {string} mode - cursor mode, a key from the cursorStyles dictionary\n */\n setCursorMode(mode) {\n mode = mode || 'default';\n // if the mode didn't actually change, bail early\n if (this.currentCursorMode === mode) {\n return;\n }\n this.currentCursorMode = mode;\n const style = this.cursorStyles[mode];\n\n // only do things if there is a cursor style for it\n if (style) {\n switch (typeof style) {\n case 'string':\n // string styles are handled as cursor CSS\n this.interactionDOMElement.style.cursor = style;\n break;\n case 'function':\n // functions are just called, and passed the cursor mode\n style(mode);\n break;\n case 'object':\n // if it is an object, assume that it is a dictionary of CSS styles,\n // apply it to the interactionDOMElement\n Object.assign(this.interactionDOMElement.style, style);\n break;\n default:\n break;\n }\n } else if (typeof mode === 'string' && !Object.prototype.hasOwnProperty.call(this.cursorStyles, mode)) {\n // if it mode is a string (not a Symbol) and cursorStyles doesn't have any entry\n // for the mode, then assume that the dev wants it to be CSS for the cursor.\n this.interactionDOMElement.style.cursor = mode;\n }\n }\n\n /**\n * Dispatches an event on the display object that was interacted with\n *\n * @param {Object3D} displayObject - the display object in question\n * @param {string} eventString - the name of the event (e.g, mousedown)\n * @param {object} eventData - the event data object\n * @private\n */\n triggerEvent(displayObject, eventString, eventData) {\n if (!eventData.stopped) {\n eventData.currentTarget = displayObject;\n eventData.type = eventString;\n\n displayObject.emit(eventString, eventData);\n\n if (displayObject[eventString]) {\n displayObject[eventString](eventData);\n }\n }\n }\n\n /**\n * This function is provides a neat way of crawling through the scene graph and running a\n * specified function on all interactive objects it finds. It will also take care of hit\n * testing the interactive objects and passes the hit across in the function.\n *\n * @private\n * @param {InteractionEvent} interactionEvent - event containing the point that\n * is tested for collision\n * @param {Object3D} displayObject - the displayObject\n * that will be hit test (recursively crawls its children)\n * @param {Function} [func] - the function that will be called on each interactive object. The\n * interactionEvent, displayObject and hit will be passed to the function\n * @param {boolean} [hitTest] - this indicates if the objects inside should be hit test against the point\n * @param {boolean} [interactive] - Whether the displayObject is interactive\n * @return {boolean} returns true if the displayObject hit the point\n */\n processInteractive(interactionEvent, displayObject, func, hitTest, interactive) {\n if (!displayObject || !displayObject.visible) {\n return false;\n }\n\n // Took a little while to rework this function correctly! But now it is done and nice and optimised. ^_^\n //\n // This function will now loop through all objects and then only hit test the objects it HAS\n // to, not all of them. MUCH faster..\n // An object will be hit test if the following is true:\n //\n // 1: It is interactive.\n // 2: It belongs to a parent that is interactive AND one of the parents children have not already been hit.\n //\n // As another little optimisation once an interactive object has been hit we can carry on\n // through the scenegraph, but we know that there will be no more hits! So we can avoid extra hit tests\n // A final optimisation is that an object is not hit test directly if a child has already been hit.\n\n interactive = displayObject.interactive || interactive;\n\n let hit = false;\n let interactiveParent = interactive;\n\n if (displayObject.interactiveChildren && displayObject.children) {\n const children = displayObject.children;\n\n for (let i = children.length - 1; i >= 0; i--) {\n const child = children[i];\n\n // time to get recursive.. if this function will return if something is hit..\n const childHit = this.processInteractive(interactionEvent, child, func, hitTest, interactiveParent);\n\n if (childHit) {\n // its a good idea to check if a child has lost its parent.\n // this means it has been removed whilst looping so its best\n if (!child.parent) {\n continue;\n }\n\n // we no longer need to hit test any more objects in this container as we we\n // now know the parent has been hit\n interactiveParent = false;\n\n // If the child is interactive , that means that the object hit was actually\n // interactive and not just the child of an interactive object.\n // This means we no longer need to hit test anything else. We still need to run\n // through all objects, but we don't need to perform any hit tests.\n\n if (childHit) {\n if (interactionEvent.target) {\n hitTest = false;\n }\n hit = true;\n }\n }\n }\n }\n\n // no point running this if the item is not interactive or does not have an interactive parent.\n if (interactive) {\n // if we are hit testing (as in we have no hit any objects yet)\n // We also don't need to worry about hit testing if once of the displayObjects children\n // has already been hit - but only if it was interactive, otherwise we need to keep\n // looking for an interactive child, just in case we hit one\n if (hitTest && !interactionEvent.target) {\n if (interactionEvent.intersects[0] && interactionEvent.intersects[0].object === displayObject) {\n hit = true;\n }\n }\n\n if (displayObject.interactive) {\n if (hit && !interactionEvent.target) {\n interactionEvent.data.target = interactionEvent.target = displayObject;\n }\n\n if (func) {\n func(interactionEvent, displayObject, !!hit);\n }\n }\n }\n\n return hit;\n }\n\n\n /**\n * Is called when the click is pressed down on the renderer element\n *\n * @private\n * @param {MouseEvent} originalEvent - The DOM event of a click being pressed down\n */\n onClick(originalEvent) {\n if (!this.isAble()) return;\n if (originalEvent.type !== 'click') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n if (this.autoPreventDefault && events[0].isNormalized) {\n originalEvent.preventDefault();\n }\n\n const interactionData = this.getInteractionDataForPointerId(events[0]);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, events[0], interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n this.processInteractive(interactionEvent, this.layer.scene, this.processClick, true);\n\n this.emit('click', interactionEvent);\n }\n\n /**\n * Processes the result of the click check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processClick(interactionEvent, displayObject, hit) {\n if (hit) {\n this.triggerEvent(displayObject, 'click', interactionEvent);\n }\n }\n\n /**\n * Is called when the pointer button is pressed down on the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being pressed down\n */\n onPointerDown(originalEvent) {\n if (!this.isAble()) return;\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n /**\n * No need to prevent default on natural pointer events, as there are no side effects\n * Normalized events, however, may have the double mousedown/touchstart issue on the native android browser,\n * so still need to be prevented.\n */\n\n // Guaranteed that there will be at least one event in events, and all events must have the same pointer type\n\n if (this.autoPreventDefault && events[0].isNormalized) {\n originalEvent.preventDefault();\n }\n\n const eventLen = events.length;\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n this.processInteractive(interactionEvent, this.layer.scene, this.processPointerDown, true);\n\n this.emit('pointerdown', interactionEvent);\n if (event.pointerType === 'touch') {\n this.emit('touchstart', interactionEvent);\n } else if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n const isRightButton = event.button === 2;\n\n this.emit(isRightButton ? 'rightdown' : 'mousedown', this.eventData);\n }\n }\n }\n\n /**\n * Processes the result of the pointer down check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerDown(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n const id = interactionEvent.data.identifier;\n\n if (hit) {\n if (!displayObject.trackedPointers[id]) {\n displayObject.trackedPointers[id] = new InteractionTrackingData(id);\n }\n this.triggerEvent(displayObject, 'pointerdown', interactionEvent);\n\n if (data.pointerType === 'touch') {\n displayObject.started = true;\n this.triggerEvent(displayObject, 'touchstart', interactionEvent);\n } else if (data.pointerType === 'mouse' || data.pointerType === 'pen') {\n const isRightButton = data.button === 2;\n\n if (isRightButton) {\n displayObject.trackedPointers[id].rightDown = true;\n } else {\n displayObject.trackedPointers[id].leftDown = true;\n }\n\n this.triggerEvent(displayObject, isRightButton ? 'rightdown' : 'mousedown', interactionEvent);\n }\n }\n }\n\n /**\n * Is called when the pointer button is released on the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being released\n * @param {boolean} cancelled - true if the pointer is cancelled\n * @param {Function} func - Function passed to {@link processInteractive}\n */\n onPointerComplete(originalEvent, cancelled, func) {\n const events = this.normalizeToPointerData(originalEvent);\n\n const eventLen = events.length;\n\n // if the event wasn't targeting our canvas, then consider it to be pointerupoutside\n // in all cases (unless it was a pointercancel)\n const eventAppend = originalEvent.target !== this.interactionDOMElement ? 'outside' : '';\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n // perform hit testing for events targeting our canvas or cancel events\n this.processInteractive(interactionEvent, this.layer.scene, func, cancelled || !eventAppend);\n\n this.emit(cancelled ? 'pointercancel' : `pointerup${eventAppend}`, interactionEvent);\n\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n const isRightButton = event.button === 2;\n\n this.emit(isRightButton ? `rightup${eventAppend}` : `mouseup${eventAppend}`, interactionEvent);\n } else if (event.pointerType === 'touch') {\n this.emit(cancelled ? 'touchcancel' : `touchend${eventAppend}`, interactionEvent);\n this.releaseInteractionDataForPointerId(event.pointerId, interactionData);\n }\n }\n }\n\n /**\n * Is called when the pointer button is cancelled\n *\n * @private\n * @param {PointerEvent} event - The DOM event of a pointer button being released\n */\n onPointerCancel(event) {\n if (!this.isAble()) return;\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && event.pointerType === 'touch') return;\n\n this.onPointerComplete(event, true, this.processPointerCancel);\n }\n\n /**\n * Processes the result of the pointer cancel check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n */\n processPointerCancel(interactionEvent, displayObject) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n if (displayObject.trackedPointers[id] !== undefined) {\n delete displayObject.trackedPointers[id];\n this.triggerEvent(displayObject, 'pointercancel', interactionEvent);\n\n if (data.pointerType === 'touch') {\n this.triggerEvent(displayObject, 'touchcancel', interactionEvent);\n }\n }\n }\n\n /**\n * Is called when the pointer button is released on the renderer element\n *\n * @private\n * @param {PointerEvent} event - The DOM event of a pointer button being released\n */\n onPointerUp(event) {\n if (!this.isAble()) return;\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && event.pointerType === 'touch') return;\n\n this.onPointerComplete(event, false, this.processPointerUp);\n }\n\n /**\n * Processes the result of the pointer up check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerUp(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n const trackingData = displayObject.trackedPointers[id];\n\n const isTouch = data.pointerType === 'touch';\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n // Mouse only\n if (isMouse) {\n const isRightButton = data.button === 2;\n\n const flags = InteractionTrackingData.FLAGS;\n\n const test = isRightButton ? flags.RIGHT_DOWN : flags.LEFT_DOWN;\n\n const isDown = trackingData !== undefined && (trackingData.flags & test);\n\n if (hit) {\n this.triggerEvent(displayObject, isRightButton ? 'rightup' : 'mouseup', interactionEvent);\n\n if (isDown) {\n this.triggerEvent(displayObject, isRightButton ? 'rightclick' : 'leftclick', interactionEvent);\n }\n } else if (isDown) {\n this.triggerEvent(displayObject, isRightButton ? 'rightupoutside' : 'mouseupoutside', interactionEvent);\n }\n // update the down state of the tracking data\n if (trackingData) {\n if (isRightButton) {\n trackingData.rightDown = false;\n } else {\n trackingData.leftDown = false;\n }\n }\n }\n\n // Pointers and Touches, and Mouse\n if (isTouch && displayObject.started) {\n displayObject.started = false;\n this.triggerEvent(displayObject, 'touchend', interactionEvent);\n }\n if (hit) {\n this.triggerEvent(displayObject, 'pointerup', interactionEvent);\n\n if (trackingData) {\n this.triggerEvent(displayObject, 'pointertap', interactionEvent);\n if (isTouch) {\n this.triggerEvent(displayObject, 'tap', interactionEvent);\n // touches are no longer over (if they ever were) when we get the touchend\n // so we should ensure that we don't keep pretending that they are\n trackingData.over = false;\n }\n }\n } else if (trackingData) {\n this.triggerEvent(displayObject, 'pointerupoutside', interactionEvent);\n if (isTouch) this.triggerEvent(displayObject, 'touchendoutside', interactionEvent);\n }\n // Only remove the tracking data if there is no over/down state still associated with it\n if (trackingData && trackingData.none) {\n delete displayObject.trackedPointers[id];\n }\n }\n\n /**\n * Is called when the pointer moves across the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer moving\n */\n onPointerMove(originalEvent) {\n if (!this.isAble()) return;\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n if (events[0].pointerType === 'mouse') {\n this.didMove = true;\n\n this.cursor = null;\n }\n\n const eventLen = events.length;\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n const interactive = event.pointerType === 'touch' ? this.moveWhenInside : true;\n\n this.processInteractive(\n interactionEvent,\n this.layer.scene,\n this.processPointerMove,\n interactive\n );\n this.emit('pointermove', interactionEvent);\n if (event.pointerType === 'touch') this.emit('touchmove', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') this.emit('mousemove', interactionEvent);\n }\n\n if (events[0].pointerType === 'mouse') {\n this.setCursorMode(this.cursor);\n\n // TODO BUG for parents interactive object (border order issue)\n }\n }\n\n /**\n * Processes the result of the pointer move check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerMove(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const isTouch = data.pointerType === 'touch';\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n if (isMouse) {\n this.processPointerOverOut(interactionEvent, displayObject, hit);\n }\n\n if (isTouch && displayObject.started) this.triggerEvent(displayObject, 'touchmove', interactionEvent);\n if (!this.moveWhenInside || hit) {\n this.triggerEvent(displayObject, 'pointermove', interactionEvent);\n if (isMouse) this.triggerEvent(displayObject, 'mousemove', interactionEvent);\n }\n }\n\n /**\n * Is called when the pointer is moved out of the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer being moved out\n */\n onPointerOut(originalEvent) {\n if (!this.isAble()) return;\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n // Only mouse and pointer can call onPointerOut, so events will always be length 1\n const event = events[0];\n\n if (event.pointerType === 'mouse') {\n this.mouseOverRenderer = false;\n this.setCursorMode(null);\n }\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = event;\n\n this.processInteractive(interactionEvent, this.layer.scene, this.processPointerOverOut, false);\n\n this.emit('pointerout', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n this.emit('mouseout', interactionEvent);\n } else {\n // we can get touchleave events after touchend, so we want to make sure we don't\n // introduce memory leaks\n this.releaseInteractionDataForPointerId(interactionData.identifier);\n }\n }\n\n /**\n * Processes the result of the pointer over/out check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerOverOut(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n let trackingData = displayObject.trackedPointers[id];\n\n // if we just moused over the display object, then we need to track that state\n if (hit && !trackingData) {\n trackingData = displayObject.trackedPointers[id] = new InteractionTrackingData(id);\n }\n\n if (trackingData === undefined) return;\n\n if (hit && this.mouseOverRenderer) {\n if (!trackingData.over) {\n trackingData.over = true;\n this.triggerEvent(displayObject, 'pointerover', interactionEvent);\n if (isMouse) {\n this.triggerEvent(displayObject, 'mouseover', interactionEvent);\n }\n }\n\n // only change the cursor if it has not already been changed (by something deeper in the\n // display tree)\n if (isMouse && this.cursor === null) {\n this.cursor = displayObject.cursor;\n }\n } else if (trackingData.over) {\n trackingData.over = false;\n this.triggerEvent(displayObject, 'pointerout', this.eventData);\n if (isMouse) {\n this.triggerEvent(displayObject, 'mouseout', interactionEvent);\n }\n // if there is no mouse down information for the pointer, then it is safe to delete\n if (trackingData.none) {\n delete displayObject.trackedPointers[id];\n }\n }\n }\n\n /**\n * Is called when the pointer is moved into the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being moved into the renderer view\n */\n onPointerOver(originalEvent) {\n if (!this.isAble()) return;\n const events = this.normalizeToPointerData(originalEvent);\n\n // Only mouse and pointer can call onPointerOver, so events will always be length 1\n const event = events[0];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = event;\n\n if (event.pointerType === 'mouse') {\n this.mouseOverRenderer = true;\n }\n\n this.emit('pointerover', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n this.emit('mouseover', interactionEvent);\n }\n }\n\n /**\n * Get InteractionData for a given pointerId. Store that data as well\n *\n * @private\n * @param {PointerEvent} event - Normalized pointer event, output from normalizeToPointerData\n * @return {InteractionData} - Interaction data for the given pointer identifier\n */\n getInteractionDataForPointerId(event) {\n const pointerId = event.pointerId;\n\n let interactionData;\n\n if (pointerId === MOUSE_POINTER_ID || event.pointerType === 'mouse') {\n interactionData = this.mouse;\n } else if (this.activeInteractionData[pointerId]) {\n interactionData = this.activeInteractionData[pointerId];\n } else {\n interactionData = this.interactionDataPool.pop() || new InteractionData();\n interactionData.identifier = pointerId;\n this.activeInteractionData[pointerId] = interactionData;\n }\n // copy properties from the event, so that we can make sure that touch/pointer specific\n // data is available\n interactionData._copyEvent(event);\n\n return interactionData;\n }\n\n /**\n * Return unused InteractionData to the pool, for a given pointerId\n *\n * @private\n * @param {number} pointerId - Identifier from a pointer event\n */\n releaseInteractionDataForPointerId(pointerId) {\n const interactionData = this.activeInteractionData[pointerId];\n\n if (interactionData) {\n delete this.activeInteractionData[pointerId];\n interactionData._reset();\n this.interactionDataPool.push(interactionData);\n }\n }\n\n /**\n * Maps x and y coords from a DOM object and maps them correctly to the three.js view. The\n * resulting value is stored in the point. This takes into account the fact that the DOM\n * element could be scaled and positioned anywhere on the screen.\n *\n * @param {Vector2} point - the point that the result will be stored in\n * @param {number} x - the x coord of the position to map\n * @param {number} y - the y coord of the position to map\n */\n mapPositionToPoint(point, x, y) {\n let rect;\n\n // IE 11 fix\n if (!this.interactionDOMElement.parentElement) {\n rect = {\n x: 0,\n y: 0,\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n };\n } else {\n rect = this.interactionDOMElement.getBoundingClientRect();\n }\n\n point.x = ((x - rect.left) / rect.width) * 2 - 1;\n point.y = -((y - rect.top) / rect.height) * 2 + 1;\n }\n\n /**\n * Configure an InteractionEvent to wrap a DOM PointerEvent and InteractionData\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The event to be configured\n * @param {PointerEvent} pointerEvent - The DOM event that will be paired with the InteractionEvent\n * @param {InteractionData} interactionData - The InteractionData that will be paired\n * with the InteractionEvent\n * @return {InteractionEvent} the interaction event that was passed in\n */\n configureInteractionEventForDOMEvent(interactionEvent, pointerEvent, interactionData) {\n interactionEvent.data = interactionData;\n\n this.mapPositionToPoint(interactionData.global, pointerEvent.clientX, pointerEvent.clientY);\n\n if (this.layer && this.layer.interactive) this.raycaster.setFromCamera(interactionData.global, this.layer.camera);\n\n // Not really sure why this is happening, but it's how a previous version handled things TODO: there should be remove\n if (pointerEvent.pointerType === 'touch') {\n pointerEvent.globalX = interactionData.global.x;\n pointerEvent.globalY = interactionData.global.y;\n }\n\n interactionData.originalEvent = pointerEvent;\n interactionEvent._reset();\n interactionEvent.intersects = this.raycaster.intersectObjects(this.scene.children, true);\n\n return interactionEvent;\n }\n\n /**\n * Ensures that the original event object contains all data that a regular pointer event would have\n *\n * @private\n * @param {TouchEvent|MouseEvent|PointerEvent} event - The original event data from a touch or mouse event\n * @return {PointerEvent[]} An array containing a single normalized pointer event, in the case of a pointer\n * or mouse event, or a multiple normalized pointer events if there are multiple changed touches\n */\n normalizeToPointerData(event) {\n const normalizedEvents = [];\n\n if (this.supportsTouchEvents && event instanceof TouchEvent) {\n for (let i = 0, li = event.changedTouches.length; i < li; i++) {\n const touch = event.changedTouches[i];\n\n if (typeof touch.button === 'undefined') touch.button = event.touches.length ? 1 : 0;\n if (typeof touch.buttons === 'undefined') touch.buttons = event.touches.length ? 1 : 0;\n if (typeof touch.isPrimary === 'undefined') {\n touch.isPrimary = event.touches.length === 1 && event.type === 'touchstart';\n }\n if (typeof touch.width === 'undefined') touch.width = touch.radiusX || 1;\n if (typeof touch.height === 'undefined') touch.height = touch.radiusY || 1;\n if (typeof touch.tiltX === 'undefined') touch.tiltX = 0;\n if (typeof touch.tiltY === 'undefined') touch.tiltY = 0;\n if (typeof touch.pointerType === 'undefined') touch.pointerType = 'touch';\n if (typeof touch.pointerId === 'undefined') touch.pointerId = touch.identifier || 0;\n if (typeof touch.pressure === 'undefined') touch.pressure = touch.force || 0.5;\n touch.twist = 0;\n touch.tangentialPressure = 0;\n // TODO: Remove these, as layerX/Y is not a standard, is deprecated, has uneven\n // support, and the fill ins are not quite the same\n // offsetX/Y might be okay, but is not the same as clientX/Y when the canvas's top\n // left is not 0,0 on the page\n if (typeof touch.layerX === 'undefined') touch.layerX = touch.offsetX = touch.clientX;\n if (typeof touch.layerY === 'undefined') touch.layerY = touch.offsetY = touch.clientY;\n\n // mark the touch as normalized, just so that we know we did it\n touch.isNormalized = true;\n\n normalizedEvents.push(touch);\n }\n } else if (event instanceof MouseEvent && (!this.supportsPointerEvents || !(event instanceof window.PointerEvent))) {\n if (typeof event.isPrimary === 'undefined') event.isPrimary = true;\n if (typeof event.width === 'undefined') event.width = 1;\n if (typeof event.height === 'undefined') event.height = 1;\n if (typeof event.tiltX === 'undefined') event.tiltX = 0;\n if (typeof event.tiltY === 'undefined') event.tiltY = 0;\n if (typeof event.pointerType === 'undefined') event.pointerType = 'mouse';\n if (typeof event.pointerId === 'undefined') event.pointerId = MOUSE_POINTER_ID;\n if (typeof event.pressure === 'undefined') event.pressure = 0.5;\n event.twist = 0;\n event.tangentialPressure = 0;\n\n // mark the mouse event as normalized, just so that we know we did it\n event.isNormalized = true;\n\n normalizedEvents.push(event);\n } else {\n normalizedEvents.push(event);\n }\n\n return normalizedEvents;\n }\n\n /**\n * Destroys the interaction manager\n *\n */\n destroy() {\n this.removeEvents();\n\n this.removeAllListeners();\n\n this.renderer = null;\n\n this.mouse = null;\n\n this.eventData = null;\n\n this.interactionDOMElement = null;\n\n this.onPointerDown = null;\n this.processPointerDown = null;\n\n this.onPointerUp = null;\n this.processPointerUp = null;\n\n this.onPointerCancel = null;\n this.processPointerCancel = null;\n\n this.onPointerMove = null;\n this.processPointerMove = null;\n\n this.onPointerOut = null;\n this.processPointerOverOut = null;\n\n this.onPointerOver = null;\n\n this._tempPoint = null;\n }\n}\n\nexport default InteractionLayer;\n","(function() {\n let lastTime = 0;\n let vendors = ['ms', 'moz', 'webkit', 'o'];\n for (let x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\n window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];\n window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] ||\n window[vendors[x] + 'CancelRequestAnimationFrame'];\n }\n\n if (!window.requestAnimationFrame) {\n window.requestAnimationFrame = function(callback) {\n let currTime = new Date().getTime();\n let timeToCall = Math.max(0, 16 - (currTime - lastTime));\n let id = window.setTimeout(function() {\n callback(currTime + timeToCall);\n }, timeToCall);\n lastTime = currTime + timeToCall;\n return id;\n };\n }\n\n if (!window.cancelAnimationFrame) {\n window.cancelAnimationFrame = function(id) {\n clearTimeout(id);\n };\n }\n\n window.RAF = window.requestAnimationFrame;\n window.CAF = window.cancelAnimationFrame;\n})();\n","import './Raf';\nimport { EventDispatcher } from 'three';\n\n/**\n * @extends EventDispatcher\n */\nclass Ticker extends EventDispatcher {\n /**\n *\n */\n constructor() {\n super();\n this.timer = null;\n this.started = false;\n\n /**\n * pre-time cache\n *\n * @member {Number}\n * @private\n */\n this.pt = 0;\n\n /**\n * how long the time through, at this tick\n *\n * @member {Number}\n * @private\n */\n this.snippet = 0;\n\n this.start();\n }\n\n /**\n * start tick loop\n */\n start() {\n if (this.started) return;\n const loop = () => {\n this.timeline();\n this.emit('tick', { snippet: this.snippet });\n this.timer = RAF(loop);\n };\n loop();\n }\n\n /**\n * stop tick loop\n */\n stop() {\n CAF(this.timer);\n this.started = false;\n }\n\n /**\n * get timeline snippet\n *\n * @private\n */\n timeline() {\n this.snippet = Date.now() - this.pt;\n if (this.pt === 0 || this.snippet > 200) {\n this.pt = Date.now();\n this.snippet = Date.now() - this.pt;\n }\n\n this.pt += this.snippet;\n }\n}\n\nexport default Ticker;\n","import Ticker from '../utils/Ticker';\nimport InteractionManager from './InteractionManager';\n\n/**\n * The interaction manager deals with mouse, touch and pointer events. Any DisplayObject can be interactive\n * if its interactive parameter is set to true\n * This manager also supports multitouch.\n *\n * reference to [pixi.js](http://www.pixijs.com/) impl\n *\n * @example\n * import { Scene, PerspectiveCamera, WebGLRenderer, Mesh, BoxGeometry, MeshBasicMaterial } from 'three';\n * import { Interaction } from 'three.interaction';\n * const renderer = new WebGLRenderer({ canvas: canvasElement });\n * const scene = new Scene();\n * const camera = new PerspectiveCamera(60, width / height, 0.1, 100);\n *\n * const interaction = new Interaction(renderer, scene, camera);\n * // then you can bind every interaction event with any mesh which you had `add` into `scene` before\n * const cube = new Mesh(\n * new BoxGeometry(1, 1, 1),\n * new MeshBasicMaterial({ color: 0xffffff }),\n * );\n * scene.add(cube);\n * cube.on('touchstart', ev => {\n * console.log(ev);\n * });\n *\n * cube.on('mousedown', ev => {\n * console.log(ev);\n * });\n *\n * cube.on('pointerdown', ev => {\n * console.log(ev);\n * });\n * // and so on ...\n *\n * // you can also listen on parent-node or any display-tree node,\n * // source event will bubble up along with display-tree.\n * // you can stop the bubble-up by invoke ev.stopPropagation function.\n * scene.on('touchstart', ev => {\n * console.log(ev);\n * })\n *\n * @class\n * @extends InteractionManager\n */\nclass Interaction extends InteractionManager {\n /**\n * @param {WebGLRenderer} renderer - A reference to the current renderer\n * @param {Scene} scene - A reference to the current scene\n * @param {Camera} camera - A reference to the current camera\n * @param {Object} [options] - The options for the manager.\n * @param {Boolean} [options.autoPreventDefault=false] - Should the manager automatically prevent default browser actions.\n * @param {Boolean} [options.autoAttach=false] - Should the manager automatically attach target element.\n * @param {Number} [options.interactionFrequency=10] - Frequency increases the interaction events will be checked.\n */\n constructor(renderer, scene, camera, options) {\n options = Object.assign({ autoAttach: false }, options);\n super(renderer, scene, camera, options);\n\n /**\n * a ticker\n *\n * @private\n * @member {Ticker}\n */\n this.ticker = new Ticker();\n\n /**\n * update for some over event\n *\n * @private\n */\n this.update = this.update.bind(this);\n\n this.on('addevents', () => {\n this.ticker.on('tick', this.update);\n });\n\n this.on('removeevents', () => {\n this.ticker.off('tick', this.update);\n });\n\n this.setTargetElement(this.renderer.domElement);\n }\n}\n\nexport default Interaction;\n"],"names":["_rt","val","Object","prototype","toString","call","Utils","ks","variable","EventDispatcher","on","type","fn","isFunction","Object3D","interactive","addEventListener","off","removeEventListener","once","cb","ev","emit","_listeners","undefined","isUndefined","cbs","cache","slice","argument","i","length","apply","interactiveChildren","started","defineProperty","_trackedPointers","raycastTest","raycaster","result","raycast","InteractionData","global","Vector2","target","originalEvent","identifier","isPrimary","button","buttons","width","height","tiltX","tiltY","pointerType","pressure","rotationAngle","twist","tangentialPressure","event","InteractionEvent","stopped","currentTarget","data","intersects","InteractionTrackingData","pointerId","_pointerId","_flags","FLAGS","NONE","flag","yn","flags","constructor","OVER","_doSet","RIGHT_DOWN","LEFT_DOWN","freeze","MOUSE_POINTER_ID","hitTestEvent","InteractionManager","renderer","scene","camera","options","autoPreventDefault","interactionFrequency","mouse","set","activeInteractionData","interactionDataPool","eventData","interactionDOMElement","moveWhenInside","eventsAdded","mouseOverRenderer","supportsTouchEvents","window","supportsPointerEvents","PointerEvent","onClick","bind","processClick","onPointerUp","processPointerUp","onPointerCancel","processPointerCancel","onPointerDown","processPointerDown","onPointerMove","processPointerMove","onPointerOut","processPointerOverOut","onPointerOver","cursorStyles","currentCursorMode","cursor","Raycaster","_deltaTime","setTargetElement","domElement","globalPoint","root","processInteractive","element","removeEvents","addEvents","navigator","msPointerEnabled","style","document","snippet","didMove","k","hasOwnProperty","interactionData","interactionEvent","configureInteractionEventForDOMEvent","setCursorMode","mode","assign","displayObject","eventString","func","hitTest","visible","hit","interactiveParent","children","child","childHit","parent","object","events","normalizeToPointerData","isNormalized","preventDefault","getInteractionDataForPointerId","triggerEvent","eventLen","isRightButton","id","trackedPointers","rightDown","leftDown","cancelled","eventAppend","releaseInteractionDataForPointerId","onPointerComplete","trackingData","isTouch","isMouse","test","isDown","over","none","pop","_copyEvent","_reset","push","point","x","y","rect","parentElement","getBoundingClientRect","left","top","pointerEvent","mapPositionToPoint","clientX","clientY","setFromCamera","globalX","globalY","intersectObjects","normalizedEvents","TouchEvent","li","changedTouches","touch","touches","radiusX","radiusY","force","layerX","offsetX","layerY","offsetY","MouseEvent","removeAllListeners","_tempPoint","InteractionLayer","layer","isAble","lastTime","vendors","requestAnimationFrame","cancelAnimationFrame","callback","currTime","Date","getTime","timeToCall","Math","max","setTimeout","RAF","CAF","Ticker","timer","pt","start","loop","timeline","now","Interaction","autoAttach","ticker","update"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"three.interaction.js","sources":["../src/utils/Utils.js","../src/patch/EventDispatcher.js","../src/patch/Object3D.js","../src/interaction/InteractionData.js","../src/interaction/InteractionEvent.js","../src/interaction/InteractionTrackingData.js","../src/interaction/InteractionManager.js","../src/interaction/InteractionLayer.js","../src/utils/Raf.js","../src/utils/Ticker.js","../src/interaction/Interaction.js"],"sourcesContent":["/**\n * get variable type\n * @param {*} val a variable which you want to get the type\n * @return {String} variable-type\n */\nfunction _rt(val) {\n return Object.prototype.toString.call(val);\n}\n\n/**\n * Utils tool box\n *\n * @namespace Utils\n */\nexport const Utils = {\n /**\n * determine whether it is a `Function`\n *\n * @static\n * @method\n * @memberof Utils\n * @param {*} variable a variable which you want to determine\n * @return {Boolean} type result\n */\n isFunction: (function() {\n const ks = _rt(function() {});\n return function(variable) {\n return _rt(variable) === ks;\n };\n })(),\n\n\n /**\n * determine whether it is a `undefined`\n *\n * @static\n * @method\n * @memberof Utils\n * @param {*} variable a variable which you want to determine\n * @return {Boolean} type result\n */\n isUndefined(variable) {\n return typeof variable === 'undefined';\n },\n};\n","import { EventDispatcher, Object3D } from 'three';\nimport { Utils } from '../utils/Utils.js';\n\n/**\n * proxy `addEventListener` function\n *\n * @param {String} type event type, evnet name\n * @param {Function} fn callback\n * @return {this} this\n */\nEventDispatcher.prototype.on = function(type, fn) {\n if (!Utils.isFunction(fn)) return;\n if (this instanceof Object3D) this.interactive = true;\n this.addEventListener(type, fn);\n return this;\n};\n\n/**\n * proxy `removeEventListener` function\n *\n * @param {String} type event type, evnet name\n * @param {Function} fn callback, which you had bind before\n * @return {this} this\n */\nEventDispatcher.prototype.off = function(type, fn) {\n this.removeEventListener(type, fn);\n return this;\n};\n\n/**\n * binding a once event, just emit once time\n *\n * @param {String} type event type, evnet name\n * @param {Function} fn callback\n * @return {this} this\n */\nEventDispatcher.prototype.once = function(type, fn) {\n if (!Utils.isFunction(fn)) return;\n const cb = (ev) => {\n fn(ev);\n this.off(type, cb);\n };\n this.on(type, cb);\n return this;\n};\n\n/**\n * emit a event\n *\n * @param {String} type event type, evnet name\n * @return {this} this\n */\nEventDispatcher.prototype.emit = function(type, ...argument) {\n if (this._listeners === undefined || Utils.isUndefined(this._listeners[type])) return;\n const cbs = this._listeners[type] || [];\n const cache = cbs.slice(0);\n\n for (let i = 0; i < cache.length; i++) {\n cache[i].apply(this, argument);\n }\n return this;\n};\n\n","import { Object3D } from 'three';\n\n/**\n * whether displayObject is interactively\n */\nObject3D.prototype.interactive = false;\n\n/**\n * whether displayObject's children is interactively\n */\nObject3D.prototype.interactiveChildren = true;\n\n/**\n * whether displayObject had touchstart\n * @private\n */\nObject3D.prototype.started = false;\n\n/**\n * tracked event cache, like: touchend、mouseout、pointerout which decided by primary-event\n */\nObject.defineProperty(Object3D.prototype, 'trackedPointers', {\n get() {\n if (!this._trackedPointers) this._trackedPointers = {};\n return this._trackedPointers;\n },\n});\n\n/**\n * dispatch a raycast\n *\n * @param {Raycaster} raycaster Raycaster object, get from THREE.Raycaster\n * @return {Object|Boolean} had pass hit-test\n */\nObject3D.prototype.raycastTest = function(raycaster) {\n const result = [];\n this.raycast(raycaster, result);\n\n if (result.length > 0) {\n return result[0];\n }\n\n return false;\n};\n","import { Vector2 } from 'three';\n\n/**\n * Holds all information related to an Interaction event\n *\n * @class\n */\nclass InteractionData {\n /**\n * InteractionData constructor\n */\n constructor() {\n /**\n * This point stores the global coords of where the touch/mouse event happened\n *\n * @member {Vector2}\n */\n this.global = new Vector2();\n\n /**\n * The target DisplayObject that was interacted with\n *\n * @member {Object3D}\n */\n this.target = null;\n\n /**\n * When passed to an event handler, this will be the original DOM Event that was captured\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent\n * @see https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent\n * @member {MouseEvent|TouchEvent|PointerEvent}\n */\n this.originalEvent = null;\n\n /**\n * Unique identifier for this interaction\n *\n * @member {number}\n */\n this.identifier = null;\n\n /**\n * Indicates whether or not the pointer device that created the event is the primary pointer.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/isPrimary\n * @type {Boolean}\n */\n this.isPrimary = false;\n\n /**\n * Indicates which button was pressed on the mouse or pointer device to trigger the event.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button\n * @type {number}\n */\n this.button = 0;\n\n /**\n * Indicates which buttons are pressed on the mouse or pointer device when the event is triggered.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons\n * @type {number}\n */\n this.buttons = 0;\n\n /**\n * The width of the pointer's contact along the x-axis, measured in CSS pixels.\n * radiusX of TouchEvents will be represented by this value.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/width\n * @type {number}\n */\n this.width = 0;\n\n /**\n * The height of the pointer's contact along the y-axis, measured in CSS pixels.\n * radiusY of TouchEvents will be represented by this value.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/height\n * @type {number}\n */\n this.height = 0;\n\n /**\n * The angle, in degrees, between the pointer device and the screen.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/tiltX\n * @type {number}\n */\n this.tiltX = 0;\n\n /**\n * The angle, in degrees, between the pointer device and the screen.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/tiltY\n * @type {number}\n */\n this.tiltY = 0;\n\n /**\n * The type of pointer that triggered the event.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/pointerType\n * @type {string}\n */\n this.pointerType = null;\n\n /**\n * Pressure applied by the pointing device during the event. A Touch's force property\n * will be represented by this value.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/pressure\n * @type {number}\n */\n this.pressure = 0;\n\n /**\n * From TouchEvents (not PointerEvents triggered by touches), the rotationAngle of the Touch.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Touch/rotationAngle\n * @type {number}\n */\n this.rotationAngle = 0;\n\n /**\n * Twist of a stylus pointer.\n * @see https://w3c.github.io/pointerevents/#pointerevent-interface\n * @type {number}\n */\n this.twist = 0;\n\n /**\n * Barrel pressure on a stylus pointer.\n * @see https://w3c.github.io/pointerevents/#pointerevent-interface\n * @type {number}\n */\n this.tangentialPressure = 0;\n }\n\n /**\n * The unique identifier of the pointer. It will be the same as `identifier`.\n * @readonly\n * @member {number}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/pointerId\n */\n get pointerId() {\n return this.identifier;\n }\n\n /**\n * Copies properties from normalized event data.\n *\n * @param {Touch|MouseEvent|PointerEvent} event The normalized event data\n * @private\n */\n _copyEvent(event) {\n // isPrimary should only change on touchstart/pointerdown, so we don't want to overwrite\n // it with \"false\" on later events when our shim for it on touch events might not be\n // accurate\n if (event.isPrimary) {\n this.isPrimary = true;\n }\n this.button = event.button;\n this.buttons = event.buttons;\n this.width = event.width;\n this.height = event.height;\n this.tiltX = event.tiltX;\n this.tiltY = event.tiltY;\n this.pointerType = event.pointerType;\n this.pressure = event.pressure;\n this.rotationAngle = event.rotationAngle;\n this.twist = event.twist || 0;\n this.tangentialPressure = event.tangentialPressure || 0;\n }\n\n /**\n * Resets the data for pooling.\n *\n * @private\n */\n _reset() {\n // isPrimary is the only property that we really need to reset - everything else is\n // guaranteed to be overwritten\n this.isPrimary = false;\n }\n}\n\nexport default InteractionData;\n","/**\n * Event class that mimics native DOM events.\n *\n * @class\n */\nclass InteractionEvent {\n /**\n * InteractionEvent constructor\n */\n constructor() {\n /**\n * Whether this event will continue propagating in the tree\n *\n * @member {boolean}\n */\n this.stopped = false;\n\n /**\n * The object which caused this event to be dispatched.\n *\n * @member {Object3D}\n */\n this.target = null;\n\n /**\n * The object whose event listener’s callback is currently being invoked.\n *\n * @member {Object3D}\n */\n this.currentTarget = null;\n\n /**\n * Type of the event\n *\n * @member {string}\n */\n this.type = null;\n\n /**\n * InteractionData related to this event\n *\n * @member {InteractionData}\n */\n this.data = null;\n\n /**\n * ray caster detial from 3d-mesh\n *\n * @member {Intersects}\n */\n this.intersects = [];\n }\n\n /**\n * Prevents event from reaching any objects other than the current object.\n *\n */\n stopPropagation() {\n this.stopped = true;\n }\n\n /**\n * Resets the event.\n *\n * @private\n */\n _reset() {\n this.stopped = false;\n this.currentTarget = null;\n this.target = null;\n this.intersects = [];\n }\n}\n\nexport default InteractionEvent;\n","/**\n * DisplayObjects with the `trackedPointers` property use this class to track interactions\n *\n * @class\n * @private\n */\nexport default class InteractionTrackingData {\n /**\n * @param {number} pointerId - Unique pointer id of the event\n */\n constructor(pointerId) {\n this._pointerId = pointerId;\n this._flags = InteractionTrackingData.FLAGS.NONE;\n }\n\n /**\n *\n * @private\n * @param {number} flag - The interaction flag to set\n * @param {boolean} yn - Should the flag be set or unset\n */\n _doSet(flag, yn) {\n if (yn) {\n this._flags = this._flags | flag;\n } else {\n this._flags = this._flags & (~flag);\n }\n }\n\n /**\n * Unique pointer id of the event\n *\n * @readonly\n * @member {number}\n */\n get pointerId() {\n return this._pointerId;\n }\n\n /**\n * State of the tracking data, expressed as bit flags\n *\n * @member {number}\n */\n get flags() {\n return this._flags;\n }\n\n /**\n * Set the flags for the tracking data\n *\n * @param {number} flags - Flags to set\n */\n set flags(flags) {\n this._flags = flags;\n }\n\n /**\n * Is the tracked event inactive (not over or down)?\n *\n * @member {number}\n */\n get none() {\n return this._flags === this.constructor.FLAGS.NONE;\n }\n\n /**\n * Is the tracked event over the DisplayObject?\n *\n * @member {boolean}\n */\n get over() {\n return (this._flags & this.constructor.FLAGS.OVER) !== 0;\n }\n\n /**\n * Set the over flag\n *\n * @param {boolean} yn - Is the event over?\n */\n set over(yn) {\n this._doSet(this.constructor.FLAGS.OVER, yn);\n }\n\n /**\n * Did the right mouse button come down in the DisplayObject?\n *\n * @member {boolean}\n */\n get rightDown() {\n return (this._flags & this.constructor.FLAGS.RIGHT_DOWN) !== 0;\n }\n\n /**\n * Set the right down flag\n *\n * @param {boolean} yn - Is the right mouse button down?\n */\n set rightDown(yn) {\n this._doSet(this.constructor.FLAGS.RIGHT_DOWN, yn);\n }\n\n /**\n * Did the left mouse button come down in the DisplayObject?\n *\n * @member {boolean}\n */\n get leftDown() {\n return (this._flags & this.constructor.FLAGS.LEFT_DOWN) !== 0;\n }\n\n /**\n * Set the left down flag\n *\n * @param {boolean} yn - Is the left mouse button down?\n */\n set leftDown(yn) {\n this._doSet(this.constructor.FLAGS.LEFT_DOWN, yn);\n }\n}\n\nInteractionTrackingData.FLAGS = Object.freeze({\n NONE: 0,\n OVER: 1 << 0,\n LEFT_DOWN: 1 << 1,\n RIGHT_DOWN: 1 << 2,\n});\n","import '../patch/EventDispatcher';\nimport '../patch/Object3D';\n\nimport { EventDispatcher, Raycaster } from 'three';\nimport InteractionData from './InteractionData';\nimport InteractionEvent from './InteractionEvent';\nimport InteractionTrackingData from './InteractionTrackingData';\n\nconst MOUSE_POINTER_ID = 'MOUSE';\n\n// helpers for hitTest() - only used inside hitTest()\nconst hitTestEvent = {\n target: null,\n data: {\n global: null,\n },\n};\n\n/**\n * The interaction manager deals with mouse, touch and pointer events. Any DisplayObject can be interactive\n * if its interactive parameter is set to true\n * This manager also supports multitouch.\n *\n * reference to [pixi.js](http://www.pixijs.com/) impl\n *\n * @private\n * @class\n * @extends EventDispatcher\n */\nclass InteractionManager extends EventDispatcher {\n /**\n * @param {WebGLRenderer} renderer - A reference to the current renderer\n * @param {Scene} scene - A reference to the current scene\n * @param {Camera} camera - A reference to the current camera\n * @param {Object} [options] - The options for the manager.\n * @param {Boolean} [options.autoPreventDefault=false] - Should the manager automatically prevent default browser actions.\n * @param {Boolean} [options.autoAttach=true] - Should the manager automatically attach target element.\n * @param {Number} [options.interactionFrequency=10] - Frequency increases the interaction events will be checked.\n */\n constructor(renderer, scene, camera, options) {\n super();\n\n options = options || {};\n\n this.objects = null;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {WebGLRenderer}\n */\n this.renderer = renderer;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {Scene}\n */\n this.scene = scene;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {Camera}\n */\n this.camera = camera;\n\n /**\n * Should default browser actions automatically be prevented.\n * Does not apply to pointer events for backwards compatibility\n * preventDefault on pointer events stops mouse events from firing\n * Thus, for every pointer event, there will always be either a mouse of touch event alongside it.\n *\n * @member {boolean}\n * @default false\n */\n this.autoPreventDefault = options.autoPreventDefault || false;\n\n /**\n * Frequency in milliseconds that the mousemove, moveover & mouseout interaction events will be checked.\n *\n * @member {number}\n * @default 10\n */\n this.interactionFrequency = options.interactionFrequency || 10;\n\n /**\n * The mouse data\n *\n * @member {InteractionData}\n */\n this.mouse = new InteractionData();\n this.mouse.identifier = MOUSE_POINTER_ID;\n\n // setting the mouse to start off far off screen will mean that mouse over does\n // not get called before we even move the mouse.\n this.mouse.global.set(-999999);\n\n /**\n * Actively tracked InteractionData\n *\n * @private\n * @member {Object.}\n */\n this.activeInteractionData = {};\n this.activeInteractionData[MOUSE_POINTER_ID] = this.mouse;\n\n /**\n * Pool of unused InteractionData\n *\n * @private\n * @member {InteractionData[]}\n */\n this.interactionDataPool = [];\n\n /**\n * An event data object to handle all the event tracking/dispatching\n *\n * @member {object}\n */\n this.eventData = new InteractionEvent();\n\n /**\n * The DOM element to bind to.\n *\n * @private\n * @member {HTMLElement}\n */\n this.interactionDOMElement = null;\n\n /**\n * This property determines if mousemove and touchmove events are fired only when the cursor\n * is over the object.\n * Setting to true will make things work more in line with how the DOM verison works.\n * Setting to false can make things easier for things like dragging\n * It is currently set to false as this is how three.js used to work.\n *\n * @member {boolean}\n * @default true\n */\n this.moveWhenInside = true;\n\n /**\n * Have events been attached to the dom element?\n *\n * @private\n * @member {boolean}\n */\n this.eventsAdded = false;\n\n /**\n * Is the mouse hovering over the renderer?\n *\n * @private\n * @member {boolean}\n */\n this.mouseOverRenderer = false;\n\n /**\n * Does the device support touch events\n * https://www.w3.org/TR/touch-events/\n *\n * @readonly\n * @member {boolean}\n */\n this.supportsTouchEvents = 'ontouchstart' in window;\n\n /**\n * Does the device support pointer events\n * https://www.w3.org/Submission/pointer-events/\n *\n * @readonly\n * @member {boolean}\n */\n this.supportsPointerEvents = !!window.PointerEvent;\n\n // this will make it so that you don't have to call bind all the time\n\n /**\n * @private\n * @member {Function}\n */\n this.onClick = this.onClick.bind(this);\n this.processClick = this.processClick.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerUp = this.onPointerUp.bind(this);\n this.processPointerUp = this.processPointerUp.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerCancel = this.onPointerCancel.bind(this);\n this.processPointerCancel = this.processPointerCancel.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerDown = this.onPointerDown.bind(this);\n this.processPointerDown = this.processPointerDown.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerMove = this.onPointerMove.bind(this);\n this.processPointerMove = this.processPointerMove.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerOut = this.onPointerOut.bind(this);\n this.processPointerOverOut = this.processPointerOverOut.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerOver = this.onPointerOver.bind(this);\n\n /**\n * Dictionary of how different cursor modes are handled. Strings are handled as CSS cursor\n * values, objects are handled as dictionaries of CSS values for interactionDOMElement,\n * and functions are called instead of changing the CSS.\n * Default CSS cursor values are provided for 'default' and 'pointer' modes.\n * @member {Object.)>}\n */\n this.cursorStyles = {\n default: 'inherit',\n pointer: 'pointer',\n };\n\n /**\n * The mode of the cursor that is being used.\n * The value of this is a key from the cursorStyles dictionary.\n *\n * @member {string}\n */\n this.currentCursorMode = null;\n\n /**\n * Internal cached let.\n *\n * @private\n * @member {string}\n */\n this.cursor = null;\n\n /**\n * ray caster, for survey intersects from 3d-scene\n *\n * @private\n * @member {Raycaster}\n */\n this.raycaster = new Raycaster();\n\n /**\n * snippet time\n *\n * @private\n * @member {Number}\n */\n this._deltaTime = 0;\n\n this.setTargetElement(this.renderer.domElement);\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed on the display\n * object.\n *\n * @event InteractionManager#mousedown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * on the display object.\n *\n * @event InteractionManager#rightdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released over the display\n * object.\n *\n * @event InteractionManager#mouseup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * over the display object.\n *\n * @event InteractionManager#rightup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed and released on\n * the display object.\n *\n * @event InteractionManager#click\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * and released on the display object.\n *\n * @event InteractionManager#rightclick\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released outside the\n * display object that initially registered a\n * [mousedown]{@link InteractionManager#event:mousedown}.\n *\n * @event InteractionManager#mouseupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * outside the display object that initially registered a\n * [rightdown]{@link InteractionManager#event:rightdown}.\n *\n * @event InteractionManager#rightupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved while over the display object\n *\n * @event InteractionManager#mousemove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved onto the display object\n *\n * @event InteractionManager#mouseover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved off the display object\n *\n * @event InteractionManager#mouseout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed on the display object.\n *\n * @event InteractionManager#pointerdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released over the display object.\n *\n * @event InteractionManager#pointerup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a pointer event\n *\n * @event InteractionManager#pointercancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed and released on the display object.\n *\n * @event InteractionManager#pointertap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released outside the display object that initially\n * registered a [pointerdown]{@link InteractionManager#event:pointerdown}.\n *\n * @event InteractionManager#pointerupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved while over the display object\n *\n * @event InteractionManager#pointermove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved onto the display object\n *\n * @event InteractionManager#pointerover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved off the display object\n *\n * @event InteractionManager#pointerout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed on the display object.\n *\n * @event InteractionManager#touchstart\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed from the display object.\n *\n * @event InteractionManager#touchend\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a touch\n *\n * @event InteractionManager#touchcancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed and removed from the display object.\n *\n * @event InteractionManager#tap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed outside of the display object that initially\n * registered a [touchstart]{@link InteractionManager#event:touchstart}.\n *\n * @event InteractionManager#touchendoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is moved along the display object.\n *\n * @event InteractionManager#touchmove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed on the display.\n * object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mousedown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * on the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released over the display\n * object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * over the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed and released on\n * the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#click\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * and released on the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightclick\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released outside the\n * display object that initially registered a\n * [mousedown]{@link Object3D#event:mousedown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * outside the display object that initially registered a\n * [rightdown]{@link Object3D#event:rightdown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved while over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mousemove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved onto the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved off the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a pointer event.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointercancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed and released on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointertap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released outside the display object that initially\n * registered a [pointerdown]{@link Object3D#event:pointerdown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved while over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointermove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved onto the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved off the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchstart\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed from the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchend\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a touch.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchcancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed and removed from the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#tap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed outside of the display object that initially\n * registered a [touchstart]{@link Object3D#event:touchstart}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchendoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is moved along the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchmove\n * @param {InteractionEvent} event - Interaction event\n */\n }\n\n /**\n * Hit tests a point against the display tree, returning the first interactive object that is hit.\n *\n * @param {Point} globalPoint - A point to hit test with, in global space.\n * @param {Object3D} [root] - The root display object to start from. If omitted, defaults\n * to the last rendered root of the associated renderer.\n * @return {Object3D} The hit display object, if any.\n */\n hitTest(globalPoint, root) {\n // clear the target for our hit test\n hitTestEvent.target = null;\n // assign the global point\n hitTestEvent.data.global = globalPoint;\n // ensure safety of the root\n if (!root) {\n root = this.scene;\n }\n // run the hit test\n this.processInteractive(hitTestEvent, root, null, true);\n // return our found object - it'll be null if we didn't hit anything\n\n return hitTestEvent.target;\n }\n\n /**\n * Sets the DOM element which will receive mouse/touch events. This is useful for when you have\n * other DOM elements on top of the renderers Canvas element. With this you'll be bale to deletegate\n * another DOM element to receive those events.\n *\n * @param {HTMLCanvasElement} element - the DOM element which will receive mouse and touch events.\n */\n setTargetElement(element) {\n this.removeEvents();\n\n this.interactionDOMElement = element;\n\n this.addEvents();\n }\n\n /**\n * Registers all the DOM events\n *\n * @private\n */\n addEvents() {\n if (!this.interactionDOMElement || this.eventsAdded) {\n return;\n }\n\n this.emit('addevents');\n\n this.interactionDOMElement.addEventListener('click', this.onClick, true);\n\n if (window.navigator.msPointerEnabled) {\n this.interactionDOMElement.style['-ms-content-zooming'] = 'none';\n this.interactionDOMElement.style['-ms-touch-action'] = 'none';\n } else if (this.supportsPointerEvents) {\n this.interactionDOMElement.style['touch-action'] = 'none';\n }\n\n /**\n * These events are added first, so that if pointer events are normalised, they are fired\n * in the same order as non-normalised events. ie. pointer event 1st, mouse / touch 2nd\n */\n if (this.supportsPointerEvents) {\n window.document.addEventListener('pointermove', this.onPointerMove, true);\n this.interactionDOMElement.addEventListener('pointerdown', this.onPointerDown, true);\n // pointerout is fired in addition to pointerup (for touch events) and pointercancel\n // we already handle those, so for the purposes of what we do in onPointerOut, we only\n // care about the pointerleave event\n this.interactionDOMElement.addEventListener('pointerleave', this.onPointerOut, true);\n this.interactionDOMElement.addEventListener('pointerover', this.onPointerOver, true);\n window.addEventListener('pointercancel', this.onPointerCancel, true);\n window.addEventListener('pointerup', this.onPointerUp, true);\n } else {\n window.document.addEventListener('mousemove', this.onPointerMove, true);\n this.interactionDOMElement.addEventListener('mousedown', this.onPointerDown, true);\n this.interactionDOMElement.addEventListener('mouseout', this.onPointerOut, true);\n this.interactionDOMElement.addEventListener('mouseover', this.onPointerOver, true);\n window.addEventListener('mouseup', this.onPointerUp, true);\n }\n\n // always look directly for touch events so that we can provide original data\n // In a future version we should change this to being just a fallback and rely solely on\n // PointerEvents whenever available\n if (this.supportsTouchEvents) {\n this.interactionDOMElement.addEventListener('touchstart', this.onPointerDown, true);\n this.interactionDOMElement.addEventListener('touchcancel', this.onPointerCancel, true);\n this.interactionDOMElement.addEventListener('touchend', this.onPointerUp, true);\n this.interactionDOMElement.addEventListener('touchmove', this.onPointerMove, true);\n }\n\n this.eventsAdded = true;\n }\n\n /**\n * Removes all the DOM events that were previously registered\n *\n * @private\n */\n removeEvents() {\n if (!this.interactionDOMElement) {\n return;\n }\n\n this.emit('removeevents');\n\n this.interactionDOMElement.removeEventListener('click', this.onClick, true);\n\n if (window.navigator.msPointerEnabled) {\n this.interactionDOMElement.style['-ms-content-zooming'] = '';\n this.interactionDOMElement.style['-ms-touch-action'] = '';\n } else if (this.supportsPointerEvents) {\n this.interactionDOMElement.style['touch-action'] = '';\n }\n\n if (this.supportsPointerEvents) {\n window.document.removeEventListener('pointermove', this.onPointerMove, true);\n this.interactionDOMElement.removeEventListener('pointerdown', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('pointerleave', this.onPointerOut, true);\n this.interactionDOMElement.removeEventListener('pointerover', this.onPointerOver, true);\n window.removeEventListener('pointercancel', this.onPointerCancel, true);\n window.removeEventListener('pointerup', this.onPointerUp, true);\n } else {\n window.document.removeEventListener('mousemove', this.onPointerMove, true);\n this.interactionDOMElement.removeEventListener('mousedown', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('mouseout', this.onPointerOut, true);\n this.interactionDOMElement.removeEventListener('mouseover', this.onPointerOver, true);\n window.removeEventListener('mouseup', this.onPointerUp, true);\n }\n\n if (this.supportsTouchEvents) {\n this.interactionDOMElement.removeEventListener('touchstart', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('touchcancel', this.onPointerCancel, true);\n this.interactionDOMElement.removeEventListener('touchend', this.onPointerUp, true);\n this.interactionDOMElement.removeEventListener('touchmove', this.onPointerMove, true);\n }\n\n this.interactionDOMElement = null;\n\n this.eventsAdded = false;\n }\n\n /**\n * Updates the state of interactive objects.\n * Invoked by a throttled ticker.\n *\n * @param {number} deltaTime - time delta since last tick\n */\n update({ snippet }) {\n this._deltaTime += snippet;\n\n if (this._deltaTime < this.interactionFrequency) {\n return;\n }\n\n this._deltaTime = 0;\n\n if (!this.interactionDOMElement) {\n return;\n }\n\n // if the user move the mouse this check has already been done using the mouse move!\n if (this.didMove) {\n this.didMove = false;\n\n return;\n }\n\n this.cursor = null;\n\n // Resets the flag as set by a stopPropagation call. This flag is usually reset by a user interaction of any kind,\n // but there was a scenario of a display object moving under a static mouse cursor.\n // In this case, mouseover and mouseevents would not pass the flag test in triggerEvent function\n for (const k in this.activeInteractionData) {\n // eslint-disable-next-line no-prototype-builtins\n if (this.activeInteractionData.hasOwnProperty(k)) {\n const interactionData = this.activeInteractionData[k];\n\n if (interactionData.originalEvent && interactionData.pointerType !== 'touch') {\n const interactionEvent = this.configureInteractionEventForDOMEvent(\n this.eventData,\n interactionData.originalEvent,\n interactionData\n );\n\n this.processInteractive(\n interactionEvent,\n this.scene,\n this.processPointerOverOut,\n true\n );\n }\n }\n }\n\n this.setCursorMode(this.cursor);\n\n // TODO\n }\n\n /**\n * Sets the current cursor mode, handling any callbacks or CSS style changes.\n *\n * @param {string} mode - cursor mode, a key from the cursorStyles dictionary\n */\n setCursorMode(mode) {\n mode = mode || 'default';\n // if the mode didn't actually change, bail early\n if (this.currentCursorMode === mode) {\n return;\n }\n this.currentCursorMode = mode;\n const style = this.cursorStyles[mode];\n\n // only do things if there is a cursor style for it\n if (style) {\n switch (typeof style) {\n case 'string':\n // string styles are handled as cursor CSS\n this.interactionDOMElement.style.cursor = style;\n break;\n case 'function':\n // functions are just called, and passed the cursor mode\n style(mode);\n break;\n case 'object':\n // if it is an object, assume that it is a dictionary of CSS styles,\n // apply it to the interactionDOMElement\n Object.assign(this.interactionDOMElement.style, style);\n break;\n default:\n break;\n }\n } else if (typeof mode === 'string' && !Object.prototype.hasOwnProperty.call(this.cursorStyles, mode)) {\n // if it mode is a string (not a Symbol) and cursorStyles doesn't have any entry\n // for the mode, then assume that the dev wants it to be CSS for the cursor.\n this.interactionDOMElement.style.cursor = mode;\n }\n }\n\n /**\n * Dispatches an event on the display object that was interacted with\n *\n * @param {Object3D} displayObject - the display object in question\n * @param {string} eventString - the name of the event (e.g, mousedown)\n * @param {object} eventData - the event data object\n * @private\n */\n triggerEvent(displayObject, eventString, eventData) {\n if (!eventData.stopped) {\n eventData.currentTarget = displayObject;\n eventData.type = eventString;\n\n displayObject.emit(eventString, eventData);\n\n if (displayObject[eventString]) {\n displayObject[eventString](eventData);\n }\n }\n }\n\n /**\n * This function is provides a neat way of crawling through the scene graph and running a\n * specified function on all interactive objects it finds. It will also take care of hit\n * testing the interactive objects and passes the hit across in the function.\n *\n * @private\n * @param {InteractionEvent} interactionEvent - event containing the point that\n * is tested for collision\n * @param {Object3D} displayObject - the displayObject\n * that will be hit test (recursively crawls its children)\n * @param {Function} [func] - the function that will be called on each interactive object. The\n * interactionEvent, displayObject and hit will be passed to the function\n * @param {boolean} [hitTest] - this indicates if the objects inside should be hit test against the point\n * @param {boolean} [interactive] - Whether the displayObject is interactive\n * @return {boolean} returns true if the displayObject hit the point\n */\n processInteractive(interactionEvent, displayObject, func, hitTest, interactive) {\n if (!displayObject || !displayObject.visible) {\n return false;\n }\n\n // Took a little while to rework this function correctly! But now it is done and nice and optimised. ^_^\n //\n // This function will now loop through all objects and then only hit test the objects it HAS\n // to, not all of them. MUCH faster..\n // An object will be hit test if the following is true:\n //\n // 1: It is interactive.\n // 2: It belongs to a parent that is interactive AND one of the parents children have not already been hit.\n //\n // As another little optimisation once an interactive object has been hit we can carry on\n // through the scenegraph, but we know that there will be no more hits! So we can avoid extra hit tests\n // A final optimisation is that an object is not hit test directly if a child has already been hit.\n\n interactive = displayObject.interactive || interactive;\n\n let hit = false;\n let interactiveParent = interactive;\n\n if (displayObject.interactiveChildren && displayObject.children) {\n const children = displayObject.children;\n\n for (let i = children.length - 1; i >= 0; i--) {\n const child = children[i];\n\n // time to get recursive.. if this function will return if something is hit..\n const childHit = this.processInteractive(interactionEvent, child, func, hitTest, interactiveParent);\n\n if (childHit) {\n // its a good idea to check if a child has lost its parent.\n // this means it has been removed whilst looping so its best\n if (!child.parent) {\n continue;\n }\n\n // we no longer need to hit test any more objects in this container as we we\n // now know the parent has been hit\n interactiveParent = false;\n\n // If the child is interactive , that means that the object hit was actually\n // interactive and not just the child of an interactive object.\n // This means we no longer need to hit test anything else. We still need to run\n // through all objects, but we don't need to perform any hit tests.\n\n if (childHit) {\n if (interactionEvent.target) {\n hitTest = false;\n }\n hit = true;\n }\n }\n }\n }\n\n // no point running this if the item is not interactive or does not have an interactive parent.\n if (interactive) {\n // if we are hit testing (as in we have no hit any objects yet)\n // We also don't need to worry about hit testing if once of the displayObjects children\n // has already been hit - but only if it was interactive, otherwise we need to keep\n // looking for an interactive child, just in case we hit one\n if (hitTest && !interactionEvent.target) {\n if (interactionEvent.intersects[0] && interactionEvent.intersects[0].object === displayObject) {\n hit = true;\n }\n }\n\n if (displayObject.interactive) {\n if (hit && !interactionEvent.target) {\n interactionEvent.data.target = interactionEvent.target = displayObject;\n }\n\n if (func) {\n func(interactionEvent, displayObject, !!hit);\n }\n }\n }\n\n return hit;\n }\n\n\n /**\n * Is called when the click is pressed down on the renderer element\n *\n * @private\n * @param {MouseEvent} originalEvent - The DOM event of a click being pressed down\n */\n onClick(originalEvent) {\n if (originalEvent.type !== 'click') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n if (this.autoPreventDefault && events[0].isNormalized) {\n originalEvent.preventDefault();\n }\n\n const interactionData = this.getInteractionDataForPointerId(events[0]);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, events[0], interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n this.processInteractive(interactionEvent, this.scene, this.processClick, true);\n\n this.emit('click', interactionEvent);\n }\n\n /**\n * Processes the result of the click check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processClick(interactionEvent, displayObject, hit) {\n if (hit) {\n this.triggerEvent(displayObject, 'click', interactionEvent);\n }\n }\n\n /**\n * Is called when the pointer button is pressed down on the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being pressed down\n */\n onPointerDown(originalEvent) {\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n /**\n * No need to prevent default on natural pointer events, as there are no side effects\n * Normalized events, however, may have the double mousedown/touchstart issue on the native android browser,\n * so still need to be prevented.\n */\n\n // Guaranteed that there will be at least one event in events, and all events must have the same pointer type\n\n if (this.autoPreventDefault && events[0].isNormalized) {\n originalEvent.preventDefault();\n }\n\n const eventLen = events.length;\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n this.processInteractive(interactionEvent, this.scene, this.processPointerDown, true);\n\n this.emit('pointerdown', interactionEvent);\n if (event.pointerType === 'touch') {\n this.emit('touchstart', interactionEvent);\n } else if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n const isRightButton = event.button === 2;\n\n this.emit(isRightButton ? 'rightdown' : 'mousedown', this.eventData);\n }\n }\n }\n\n /**\n * Processes the result of the pointer down check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerDown(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n const id = interactionEvent.data.identifier;\n\n if (hit) {\n if (!displayObject.trackedPointers[id]) {\n displayObject.trackedPointers[id] = new InteractionTrackingData(id);\n }\n this.triggerEvent(displayObject, 'pointerdown', interactionEvent);\n\n if (data.pointerType === 'touch') {\n displayObject.started = true;\n this.triggerEvent(displayObject, 'touchstart', interactionEvent);\n } else if (data.pointerType === 'mouse' || data.pointerType === 'pen') {\n const isRightButton = data.button === 2;\n\n if (isRightButton) {\n displayObject.trackedPointers[id].rightDown = true;\n } else {\n displayObject.trackedPointers[id].leftDown = true;\n }\n\n this.triggerEvent(displayObject, isRightButton ? 'rightdown' : 'mousedown', interactionEvent);\n }\n }\n }\n\n /**\n * Is called when the pointer button is released on the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being released\n * @param {boolean} cancelled - true if the pointer is cancelled\n * @param {Function} func - Function passed to {@link processInteractive}\n */\n onPointerComplete(originalEvent, cancelled, func) {\n const events = this.normalizeToPointerData(originalEvent);\n\n const eventLen = events.length;\n\n // if the event wasn't targeting our canvas, then consider it to be pointerupoutside\n // in all cases (unless it was a pointercancel)\n const eventAppend = originalEvent.target !== this.interactionDOMElement ? 'outside' : '';\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n // perform hit testing for events targeting our canvas or cancel events\n this.processInteractive(interactionEvent, this.scene, func, cancelled || !eventAppend);\n\n this.emit(cancelled ? 'pointercancel' : `pointerup${eventAppend}`, interactionEvent);\n\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n const isRightButton = event.button === 2;\n\n this.emit(isRightButton ? `rightup${eventAppend}` : `mouseup${eventAppend}`, interactionEvent);\n } else if (event.pointerType === 'touch') {\n this.emit(cancelled ? 'touchcancel' : `touchend${eventAppend}`, interactionEvent);\n this.releaseInteractionDataForPointerId(event.pointerId, interactionData);\n }\n }\n }\n\n /**\n * Is called when the pointer button is cancelled\n *\n * @private\n * @param {PointerEvent} event - The DOM event of a pointer button being released\n */\n onPointerCancel(event) {\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && event.pointerType === 'touch') return;\n\n this.onPointerComplete(event, true, this.processPointerCancel);\n }\n\n /**\n * Processes the result of the pointer cancel check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n */\n processPointerCancel(interactionEvent, displayObject) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n if (displayObject.trackedPointers[id] !== undefined) {\n delete displayObject.trackedPointers[id];\n this.triggerEvent(displayObject, 'pointercancel', interactionEvent);\n\n if (data.pointerType === 'touch') {\n this.triggerEvent(displayObject, 'touchcancel', interactionEvent);\n }\n }\n }\n\n /**\n * Is called when the pointer button is released on the renderer element\n *\n * @private\n * @param {PointerEvent} event - The DOM event of a pointer button being released\n */\n onPointerUp(event) {\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && event.pointerType === 'touch') return;\n\n this.onPointerComplete(event, false, this.processPointerUp);\n }\n\n /**\n * Processes the result of the pointer up check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerUp(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n const trackingData = displayObject.trackedPointers[id];\n\n const isTouch = data.pointerType === 'touch';\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n // Mouse only\n if (isMouse) {\n const isRightButton = data.button === 2;\n\n const flags = InteractionTrackingData.FLAGS;\n\n const test = isRightButton ? flags.RIGHT_DOWN : flags.LEFT_DOWN;\n\n const isDown = trackingData !== undefined && (trackingData.flags & test);\n\n if (hit) {\n this.triggerEvent(displayObject, isRightButton ? 'rightup' : 'mouseup', interactionEvent);\n\n if (isDown) {\n this.triggerEvent(displayObject, isRightButton ? 'rightclick' : 'leftclick', interactionEvent);\n }\n } else if (isDown) {\n this.triggerEvent(displayObject, isRightButton ? 'rightupoutside' : 'mouseupoutside', interactionEvent);\n }\n // update the down state of the tracking data\n if (trackingData) {\n if (isRightButton) {\n trackingData.rightDown = false;\n } else {\n trackingData.leftDown = false;\n }\n }\n }\n\n // Pointers and Touches, and Mouse\n if (isTouch && displayObject.started) {\n displayObject.started = false;\n this.triggerEvent(displayObject, 'touchend', interactionEvent);\n }\n if (hit) {\n this.triggerEvent(displayObject, 'pointerup', interactionEvent);\n\n if (trackingData) {\n this.triggerEvent(displayObject, 'pointertap', interactionEvent);\n if (isTouch) {\n this.triggerEvent(displayObject, 'tap', interactionEvent);\n // touches are no longer over (if they ever were) when we get the touchend\n // so we should ensure that we don't keep pretending that they are\n trackingData.over = false;\n }\n }\n } else if (trackingData) {\n this.triggerEvent(displayObject, 'pointerupoutside', interactionEvent);\n if (isTouch) this.triggerEvent(displayObject, 'touchendoutside', interactionEvent);\n }\n // Only remove the tracking data if there is no over/down state still associated with it\n if (trackingData && trackingData.none) {\n delete displayObject.trackedPointers[id];\n }\n }\n\n /**\n * Is called when the pointer moves across the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer moving\n */\n onPointerMove(originalEvent) {\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n if (events[0].pointerType === 'mouse') {\n this.didMove = true;\n\n this.cursor = null;\n }\n\n const eventLen = events.length;\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n const interactive = event.pointerType === 'touch' ? this.moveWhenInside : true;\n\n this.processInteractive(\n interactionEvent,\n this.scene,\n this.processPointerMove,\n interactive\n );\n this.emit('pointermove', interactionEvent);\n if (event.pointerType === 'touch') this.emit('touchmove', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') this.emit('mousemove', interactionEvent);\n }\n\n if (events[0].pointerType === 'mouse') {\n this.setCursorMode(this.cursor);\n\n // TODO BUG for parents interactive object (border order issue)\n }\n }\n\n /**\n * Processes the result of the pointer move check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerMove(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const isTouch = data.pointerType === 'touch';\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n if (isMouse) {\n this.processPointerOverOut(interactionEvent, displayObject, hit);\n }\n\n if (isTouch && displayObject.started) this.triggerEvent(displayObject, 'touchmove', interactionEvent);\n if (!this.moveWhenInside || hit) {\n this.triggerEvent(displayObject, 'pointermove', interactionEvent);\n if (isMouse) this.triggerEvent(displayObject, 'mousemove', interactionEvent);\n }\n }\n\n /**\n * Is called when the pointer is moved out of the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer being moved out\n */\n onPointerOut(originalEvent) {\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n // Only mouse and pointer can call onPointerOut, so events will always be length 1\n const event = events[0];\n\n if (event.pointerType === 'mouse') {\n this.mouseOverRenderer = false;\n this.setCursorMode(null);\n }\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = event;\n\n this.processInteractive(interactionEvent, this.scene, this.processPointerOverOut, false);\n\n this.emit('pointerout', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n this.emit('mouseout', interactionEvent);\n } else {\n // we can get touchleave events after touchend, so we want to make sure we don't\n // introduce memory leaks\n this.releaseInteractionDataForPointerId(interactionData.identifier);\n }\n }\n\n /**\n * Processes the result of the pointer over/out check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerOverOut(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n let trackingData = displayObject.trackedPointers[id];\n\n // if we just moused over the display object, then we need to track that state\n if (hit && !trackingData) {\n trackingData = displayObject.trackedPointers[id] = new InteractionTrackingData(id);\n }\n\n if (trackingData === undefined) return;\n\n if (hit && this.mouseOverRenderer) {\n if (!trackingData.over) {\n trackingData.over = true;\n this.triggerEvent(displayObject, 'pointerover', interactionEvent);\n if (isMouse) {\n this.triggerEvent(displayObject, 'mouseover', interactionEvent);\n }\n }\n\n // only change the cursor if it has not already been changed (by something deeper in the\n // display tree)\n if (isMouse && this.cursor === null) {\n this.cursor = displayObject.cursor;\n }\n } else if (trackingData.over) {\n trackingData.over = false;\n this.triggerEvent(displayObject, 'pointerout', this.eventData);\n if (isMouse) {\n this.triggerEvent(displayObject, 'mouseout', interactionEvent);\n }\n // if there is no mouse down information for the pointer, then it is safe to delete\n if (trackingData.none) {\n delete displayObject.trackedPointers[id];\n }\n }\n }\n\n /**\n * Is called when the pointer is moved into the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being moved into the renderer view\n */\n onPointerOver(originalEvent) {\n const events = this.normalizeToPointerData(originalEvent);\n\n // Only mouse and pointer can call onPointerOver, so events will always be length 1\n const event = events[0];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = event;\n\n if (event.pointerType === 'mouse') {\n this.mouseOverRenderer = true;\n }\n\n this.emit('pointerover', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n this.emit('mouseover', interactionEvent);\n }\n }\n\n /**\n * Get InteractionData for a given pointerId. Store that data as well\n *\n * @private\n * @param {PointerEvent} event - Normalized pointer event, output from normalizeToPointerData\n * @return {InteractionData} - Interaction data for the given pointer identifier\n */\n getInteractionDataForPointerId(event) {\n const pointerId = event.pointerId;\n\n let interactionData;\n\n if (pointerId === MOUSE_POINTER_ID || event.pointerType === 'mouse') {\n interactionData = this.mouse;\n } else if (this.activeInteractionData[pointerId]) {\n interactionData = this.activeInteractionData[pointerId];\n } else {\n interactionData = this.interactionDataPool.pop() || new InteractionData();\n interactionData.identifier = pointerId;\n this.activeInteractionData[pointerId] = interactionData;\n }\n // copy properties from the event, so that we can make sure that touch/pointer specific\n // data is available\n interactionData._copyEvent(event);\n\n return interactionData;\n }\n\n /**\n * Return unused InteractionData to the pool, for a given pointerId\n *\n * @private\n * @param {number} pointerId - Identifier from a pointer event\n */\n releaseInteractionDataForPointerId(pointerId) {\n const interactionData = this.activeInteractionData[pointerId];\n\n if (interactionData) {\n delete this.activeInteractionData[pointerId];\n interactionData._reset();\n this.interactionDataPool.push(interactionData);\n }\n }\n\n /**\n * Maps x and y coords from a DOM object and maps them correctly to the three.js view. The\n * resulting value is stored in the point. This takes into account the fact that the DOM\n * element could be scaled and positioned anywhere on the screen.\n *\n * @param {Vector2} point - the point that the result will be stored in\n * @param {number} x - the x coord of the position to map\n * @param {number} y - the y coord of the position to map\n */\n mapPositionToPoint(point, x, y) {\n let rect;\n\n // IE 11 fix\n if (!this.interactionDOMElement.parentElement) {\n rect = {\n x: 0,\n y: 0,\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n };\n } else {\n rect = this.interactionDOMElement.getBoundingClientRect();\n }\n\n point.x = ((x - rect.left) / rect.width) * 2 - 1;\n point.y = -((y - rect.top) / rect.height) * 2 + 1;\n }\n\n /**\n * Configure an InteractionEvent to wrap a DOM PointerEvent and InteractionData\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The event to be configured\n * @param {PointerEvent} pointerEvent - The DOM event that will be paired with the InteractionEvent\n * @param {InteractionData} interactionData - The InteractionData that will be paired\n * with the InteractionEvent\n * @return {InteractionEvent} the interaction event that was passed in\n */\n configureInteractionEventForDOMEvent(interactionEvent, pointerEvent, interactionData) {\n interactionEvent.data = interactionData;\n\n this.mapPositionToPoint(interactionData.global, pointerEvent.clientX, pointerEvent.clientY);\n\n this.raycaster.setFromCamera(interactionData.global, this.camera);\n\n // Not really sure why this is happening, but it's how a previous version handled things TODO: there should be remove\n if (pointerEvent.pointerType === 'touch') {\n pointerEvent.globalX = interactionData.global.x;\n pointerEvent.globalY = interactionData.global.y;\n }\n\n interactionData.originalEvent = pointerEvent;\n interactionEvent._reset();\n if (this.objectsToRaycast) {\n interactionEvent.intersects = this.raycaster.intersectObjects(this.objectsToRaycast, true);\n } else {\n interactionEvent.intersects = this.raycaster.intersectObjects(this.scene.children, true);\n }\n return interactionEvent;\n }\n\n /**\n * set objects to raycast\n *\n * @param {Object3D} objects\n * @memberof InteractionManager\n */\n setObjectsToRaycast(objects) {\n this.objectsToRaycast = objects;\n }\n\n /**\n * Ensures that the original event object contains all data that a regular pointer event would have\n *\n * @private\n * @param {TouchEvent|MouseEvent|PointerEvent} event - The original event data from a touch or mouse event\n * @return {PointerEvent[]} An array containing a single normalized pointer event, in the case of a pointer\n * or mouse event, or a multiple normalized pointer events if there are multiple changed touches\n */\n normalizeToPointerData(event) {\n const normalizedEvents = [];\n\n if (this.supportsTouchEvents && event instanceof TouchEvent) {\n for (let i = 0, li = event.changedTouches.length; i < li; i++) {\n const touch = event.changedTouches[i];\n\n if (typeof touch.button === 'undefined') touch.button = event.touches.length ? 1 : 0;\n if (typeof touch.buttons === 'undefined') touch.buttons = event.touches.length ? 1 : 0;\n if (typeof touch.isPrimary === 'undefined') {\n touch.isPrimary = event.touches.length === 1 && event.type === 'touchstart';\n }\n if (typeof touch.width === 'undefined') touch.width = touch.radiusX || 1;\n if (typeof touch.height === 'undefined') touch.height = touch.radiusY || 1;\n if (typeof touch.tiltX === 'undefined') touch.tiltX = 0;\n if (typeof touch.tiltY === 'undefined') touch.tiltY = 0;\n if (typeof touch.pointerType === 'undefined') touch.pointerType = 'touch';\n if (typeof touch.pointerId === 'undefined') touch.pointerId = touch.identifier || 0;\n if (typeof touch.pressure === 'undefined') touch.pressure = touch.force || 0.5;\n touch.twist = 0;\n touch.tangentialPressure = 0;\n // TODO: Remove these, as layerX/Y is not a standard, is deprecated, has uneven\n // support, and the fill ins are not quite the same\n // offsetX/Y might be okay, but is not the same as clientX/Y when the canvas's top\n // left is not 0,0 on the page\n if (typeof touch.layerX === 'undefined') touch.layerX = touch.offsetX = touch.clientX;\n if (typeof touch.layerY === 'undefined') touch.layerY = touch.offsetY = touch.clientY;\n\n // mark the touch as normalized, just so that we know we did it\n touch.isNormalized = true;\n\n normalizedEvents.push(touch);\n }\n } else if (event instanceof MouseEvent && (!this.supportsPointerEvents || !(event instanceof window.PointerEvent))) {\n if (typeof event.isPrimary === 'undefined') event.isPrimary = true;\n if (typeof event.width === 'undefined') event.width = 1;\n if (typeof event.height === 'undefined') event.height = 1;\n if (typeof event.tiltX === 'undefined') event.tiltX = 0;\n if (typeof event.tiltY === 'undefined') event.tiltY = 0;\n if (typeof event.pointerType === 'undefined') event.pointerType = 'mouse';\n if (typeof event.pointerId === 'undefined') event.pointerId = MOUSE_POINTER_ID;\n if (typeof event.pressure === 'undefined') event.pressure = 0.5;\n event.twist = 0;\n event.tangentialPressure = 0;\n\n // mark the mouse event as normalized, just so that we know we did it\n event.isNormalized = true;\n\n normalizedEvents.push(event);\n } else {\n normalizedEvents.push(event);\n }\n\n return normalizedEvents;\n }\n\n /**\n * Destroys the interaction manager\n *\n */\n destroy() {\n this.removeEvents();\n\n this.removeAllListeners();\n\n this.renderer = null;\n\n this.mouse = null;\n\n this.eventData = null;\n\n this.interactionDOMElement = null;\n\n this.onPointerDown = null;\n this.processPointerDown = null;\n\n this.onPointerUp = null;\n this.processPointerUp = null;\n\n this.onPointerCancel = null;\n this.processPointerCancel = null;\n\n this.onPointerMove = null;\n this.processPointerMove = null;\n\n this.onPointerOut = null;\n this.processPointerOverOut = null;\n\n this.onPointerOver = null;\n\n this._tempPoint = null;\n }\n}\n\nexport default InteractionManager;\n","import '../patch/EventDispatcher';\nimport '../patch/Object3D';\n\nimport { EventDispatcher, Raycaster } from 'three';\nimport InteractionData from './InteractionData';\nimport InteractionEvent from './InteractionEvent';\nimport InteractionTrackingData from './InteractionTrackingData';\n\nconst MOUSE_POINTER_ID = 'MOUSE';\n\n// helpers for hitTest() - only used inside hitTest()\nconst hitTestEvent = {\n target: null,\n data: {\n global: null,\n },\n};\n\n/**\n * The interaction manager deals with mouse, touch and pointer events. Any DisplayObject can be interactive\n * if its interactive parameter is set to true\n * This manager also supports multitouch.\n *\n * reference to [pixi.js](http://www.pixijs.com/) impl\n *\n * @private\n * @class\n * @extends EventDispatcher\n */\nclass InteractionLayer extends EventDispatcher {\n /**\n * @param {WebGLRenderer} renderer - A reference to the current renderer\n * @param {Object} [options] - The options for the manager.\n * @param {Boolean} [options.autoPreventDefault=false] - Should the manager automatically prevent default browser actions.\n * @param {Boolean} [options.autoAttach=true] - Should the manager automatically attach target element.\n * @param {Number} [options.interactionFrequency=10] - Frequency increases the interaction events will be checked.\n */\n constructor(renderer, options) {\n super();\n\n options = options || {};\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {WebGLRenderer}\n */\n this.renderer = renderer;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {Layer}\n */\n this.layer = null;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {Scene}\n */\n // this.scene = scene;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {Camera}\n */\n // this.camera = camera;\n\n /**\n * Should default browser actions automatically be prevented.\n * Does not apply to pointer events for backwards compatibility\n * preventDefault on pointer events stops mouse events from firing\n * Thus, for every pointer event, there will always be either a mouse of touch event alongside it.\n *\n * @member {boolean}\n * @default false\n */\n this.autoPreventDefault = options.autoPreventDefault || false;\n\n /**\n * Frequency in milliseconds that the mousemove, moveover & mouseout interaction events will be checked.\n *\n * @member {number}\n * @default 10\n */\n this.interactionFrequency = options.interactionFrequency || 10;\n\n /**\n * The mouse data\n *\n * @member {InteractionData}\n */\n this.mouse = new InteractionData();\n this.mouse.identifier = MOUSE_POINTER_ID;\n\n // setting the mouse to start off far off screen will mean that mouse over does\n // not get called before we even move the mouse.\n this.mouse.global.set(-999999);\n\n /**\n * Actively tracked InteractionData\n *\n * @private\n * @member {Object.}\n */\n this.activeInteractionData = {};\n this.activeInteractionData[MOUSE_POINTER_ID] = this.mouse;\n\n /**\n * Pool of unused InteractionData\n *\n * @private\n * @member {InteractionData[]}\n */\n this.interactionDataPool = [];\n\n /**\n * An event data object to handle all the event tracking/dispatching\n *\n * @member {object}\n */\n this.eventData = new InteractionEvent();\n\n /**\n * The DOM element to bind to.\n *\n * @private\n * @member {HTMLElement}\n */\n this.interactionDOMElement = null;\n\n /**\n * This property determines if mousemove and touchmove events are fired only when the cursor\n * is over the object.\n * Setting to true will make things work more in line with how the DOM verison works.\n * Setting to false can make things easier for things like dragging\n * It is currently set to false as this is how three.js used to work.\n *\n * @member {boolean}\n * @default true\n */\n this.moveWhenInside = true;\n\n /**\n * Have events been attached to the dom element?\n *\n * @private\n * @member {boolean}\n */\n this.eventsAdded = false;\n\n /**\n * Is the mouse hovering over the renderer?\n *\n * @private\n * @member {boolean}\n */\n this.mouseOverRenderer = false;\n\n /**\n * Does the device support touch events\n * https://www.w3.org/TR/touch-events/\n *\n * @readonly\n * @member {boolean}\n */\n this.supportsTouchEvents = 'ontouchstart' in window;\n\n /**\n * Does the device support pointer events\n * https://www.w3.org/Submission/pointer-events/\n *\n * @readonly\n * @member {boolean}\n */\n this.supportsPointerEvents = !!window.PointerEvent;\n\n // this will make it so that you don't have to call bind all the time\n\n /**\n * @private\n * @member {Function}\n */\n this.onClick = this.onClick.bind(this);\n this.processClick = this.processClick.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerUp = this.onPointerUp.bind(this);\n this.processPointerUp = this.processPointerUp.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerCancel = this.onPointerCancel.bind(this);\n this.processPointerCancel = this.processPointerCancel.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerDown = this.onPointerDown.bind(this);\n this.processPointerDown = this.processPointerDown.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerMove = this.onPointerMove.bind(this);\n this.processPointerMove = this.processPointerMove.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerOut = this.onPointerOut.bind(this);\n this.processPointerOverOut = this.processPointerOverOut.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerOver = this.onPointerOver.bind(this);\n\n /**\n * Dictionary of how different cursor modes are handled. Strings are handled as CSS cursor\n * values, objects are handled as dictionaries of CSS values for interactionDOMElement,\n * and functions are called instead of changing the CSS.\n * Default CSS cursor values are provided for 'default' and 'pointer' modes.\n * @member {Object.)>}\n */\n this.cursorStyles = {\n default: 'inherit',\n pointer: 'pointer',\n };\n\n /**\n * The mode of the cursor that is being used.\n * The value of this is a key from the cursorStyles dictionary.\n *\n * @member {string}\n */\n this.currentCursorMode = null;\n\n /**\n * Internal cached let.\n *\n * @private\n * @member {string}\n */\n this.cursor = null;\n\n /**\n * ray caster, for survey intersects from 3d-scene\n *\n * @private\n * @member {Raycaster}\n */\n this.raycaster = new Raycaster();\n\n /**\n * snippet time\n *\n * @private\n * @member {Number}\n */\n this._deltaTime = 0;\n\n this.setTargetElement(this.renderer.domElement);\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed on the display\n * object.\n *\n * @event InteractionLayer#mousedown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * on the display object.\n *\n * @event InteractionLayer#rightdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released over the display\n * object.\n *\n * @event InteractionLayer#mouseup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * over the display object.\n *\n * @event InteractionLayer#rightup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed and released on\n * the display object.\n *\n * @event InteractionLayer#click\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * and released on the display object.\n *\n * @event InteractionLayer#rightclick\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released outside the\n * display object that initially registered a\n * [mousedown]{@link InteractionLayer#event:mousedown}.\n *\n * @event InteractionLayer#mouseupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * outside the display object that initially registered a\n * [rightdown]{@link InteractionLayer#event:rightdown}.\n *\n * @event InteractionLayer#rightupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved while over the display object\n *\n * @event InteractionLayer#mousemove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved onto the display object\n *\n * @event InteractionLayer#mouseover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved off the display object\n *\n * @event InteractionLayer#mouseout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed on the display object.\n *\n * @event InteractionLayer#pointerdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released over the display object.\n *\n * @event InteractionLayer#pointerup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a pointer event\n *\n * @event InteractionLayer#pointercancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed and released on the display object.\n *\n * @event InteractionLayer#pointertap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released outside the display object that initially\n * registered a [pointerdown]{@link InteractionLayer#event:pointerdown}.\n *\n * @event InteractionLayer#pointerupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved while over the display object\n *\n * @event InteractionLayer#pointermove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved onto the display object\n *\n * @event InteractionLayer#pointerover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved off the display object\n *\n * @event InteractionLayer#pointerout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed on the display object.\n *\n * @event InteractionLayer#touchstart\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed from the display object.\n *\n * @event InteractionLayer#touchend\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a touch\n *\n * @event InteractionLayer#touchcancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed and removed from the display object.\n *\n * @event InteractionLayer#tap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed outside of the display object that initially\n * registered a [touchstart]{@link InteractionLayer#event:touchstart}.\n *\n * @event InteractionLayer#touchendoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is moved along the display object.\n *\n * @event InteractionLayer#touchmove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed on the display.\n * object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mousedown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * on the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released over the display\n * object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * over the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed and released on\n * the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#click\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * and released on the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightclick\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released outside the\n * display object that initially registered a\n * [mousedown]{@link Object3D#event:mousedown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * outside the display object that initially registered a\n * [rightdown]{@link Object3D#event:rightdown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved while over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mousemove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved onto the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved off the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a pointer event.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointercancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed and released on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointertap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released outside the display object that initially\n * registered a [pointerdown]{@link Object3D#event:pointerdown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved while over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointermove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved onto the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved off the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchstart\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed from the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchend\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a touch.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchcancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed and removed from the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#tap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed outside of the display object that initially\n * registered a [touchstart]{@link Object3D#event:touchstart}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchendoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is moved along the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchmove\n * @param {InteractionEvent} event - Interaction event\n */\n }\n\n /**\n * @return {boolean}\n */\n isAble() {\n return this.layer && this.layer.interactive;\n }\n\n /**\n * set layer\n * @param {Layer} layer layer\n */\n setLayer(layer) {\n this.layer = layer;\n }\n\n /**\n * Hit tests a point against the display tree, returning the first interactive object that is hit.\n *\n * @param {Point} globalPoint - A point to hit test with, in global space.\n * @param {Object3D} [root] - The root display object to start from. If omitted, defaults\n * to the last rendered root of the associated renderer.\n * @return {Object3D} The hit display object, if any.\n */\n hitTest(globalPoint, root) {\n if (!this.isAble()) return null;\n // clear the target for our hit test\n hitTestEvent.target = null;\n // assign the global point\n hitTestEvent.data.global = globalPoint;\n // ensure safety of the root\n if (!root) {\n root = this.layer.scene;\n }\n // run the hit test\n this.processInteractive(hitTestEvent, root, null, true);\n // return our found object - it'll be null if we didn't hit anything\n\n return hitTestEvent.target;\n }\n\n /**\n * Sets the DOM element which will receive mouse/touch events. This is useful for when you have\n * other DOM elements on top of the renderers Canvas element. With this you'll be bale to deletegate\n * another DOM element to receive those events.\n *\n * @param {HTMLCanvasElement} element - the DOM element which will receive mouse and touch events.\n */\n setTargetElement(element) {\n this.removeEvents();\n\n this.interactionDOMElement = element;\n\n this.addEvents();\n }\n\n /**\n * Registers all the DOM events\n *\n * @private\n */\n addEvents() {\n if (!this.interactionDOMElement || this.eventsAdded) {\n return;\n }\n\n this.emit('addevents');\n\n this.interactionDOMElement.addEventListener('click', this.onClick, true);\n\n if (window.navigator.msPointerEnabled) {\n this.interactionDOMElement.style['-ms-content-zooming'] = 'none';\n this.interactionDOMElement.style['-ms-touch-action'] = 'none';\n } else if (this.supportsPointerEvents) {\n this.interactionDOMElement.style['touch-action'] = 'none';\n }\n\n /**\n * These events are added first, so that if pointer events are normalised, they are fired\n * in the same order as non-normalised events. ie. pointer event 1st, mouse / touch 2nd\n */\n if (this.supportsPointerEvents) {\n window.document.addEventListener('pointermove', this.onPointerMove, true);\n this.interactionDOMElement.addEventListener('pointerdown', this.onPointerDown, true);\n // pointerout is fired in addition to pointerup (for touch events) and pointercancel\n // we already handle those, so for the purposes of what we do in onPointerOut, we only\n // care about the pointerleave event\n this.interactionDOMElement.addEventListener('pointerleave', this.onPointerOut, true);\n this.interactionDOMElement.addEventListener('pointerover', this.onPointerOver, true);\n window.addEventListener('pointercancel', this.onPointerCancel, true);\n window.addEventListener('pointerup', this.onPointerUp, true);\n } else {\n window.document.addEventListener('mousemove', this.onPointerMove, true);\n this.interactionDOMElement.addEventListener('mousedown', this.onPointerDown, true);\n this.interactionDOMElement.addEventListener('mouseout', this.onPointerOut, true);\n this.interactionDOMElement.addEventListener('mouseover', this.onPointerOver, true);\n window.addEventListener('mouseup', this.onPointerUp, true);\n }\n\n // always look directly for touch events so that we can provide original data\n // In a future version we should change this to being just a fallback and rely solely on\n // PointerEvents whenever available\n if (this.supportsTouchEvents) {\n this.interactionDOMElement.addEventListener('touchstart', this.onPointerDown, true);\n this.interactionDOMElement.addEventListener('touchcancel', this.onPointerCancel, true);\n this.interactionDOMElement.addEventListener('touchend', this.onPointerUp, true);\n this.interactionDOMElement.addEventListener('touchmove', this.onPointerMove, true);\n }\n\n this.eventsAdded = true;\n }\n\n /**\n * Removes all the DOM events that were previously registered\n *\n * @private\n */\n removeEvents() {\n if (!this.interactionDOMElement) {\n return;\n }\n\n this.emit('removeevents');\n\n this.interactionDOMElement.removeEventListener('click', this.onClick, true);\n\n if (window.navigator.msPointerEnabled) {\n this.interactionDOMElement.style['-ms-content-zooming'] = '';\n this.interactionDOMElement.style['-ms-touch-action'] = '';\n } else if (this.supportsPointerEvents) {\n this.interactionDOMElement.style['touch-action'] = '';\n }\n\n if (this.supportsPointerEvents) {\n window.document.removeEventListener('pointermove', this.onPointerMove, true);\n this.interactionDOMElement.removeEventListener('pointerdown', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('pointerleave', this.onPointerOut, true);\n this.interactionDOMElement.removeEventListener('pointerover', this.onPointerOver, true);\n window.removeEventListener('pointercancel', this.onPointerCancel, true);\n window.removeEventListener('pointerup', this.onPointerUp, true);\n } else {\n window.document.removeEventListener('mousemove', this.onPointerMove, true);\n this.interactionDOMElement.removeEventListener('mousedown', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('mouseout', this.onPointerOut, true);\n this.interactionDOMElement.removeEventListener('mouseover', this.onPointerOver, true);\n window.removeEventListener('mouseup', this.onPointerUp, true);\n }\n\n if (this.supportsTouchEvents) {\n this.interactionDOMElement.removeEventListener('touchstart', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('touchcancel', this.onPointerCancel, true);\n this.interactionDOMElement.removeEventListener('touchend', this.onPointerUp, true);\n this.interactionDOMElement.removeEventListener('touchmove', this.onPointerMove, true);\n }\n\n this.interactionDOMElement = null;\n\n this.eventsAdded = false;\n }\n\n /**\n * Updates the state of interactive objects.\n * Invoked by a throttled ticker.\n *\n * @param {number} deltaTime - time delta since last tick\n */\n update({ snippet }) {\n if (!this.isAble()) return;\n this._deltaTime += snippet;\n\n if (this._deltaTime < this.interactionFrequency) {\n return;\n }\n\n this._deltaTime = 0;\n\n if (!this.interactionDOMElement) {\n return;\n }\n\n // if the user move the mouse this check has already been done using the mouse move!\n if (this.didMove) {\n this.didMove = false;\n\n return;\n }\n\n this.cursor = null;\n\n // Resets the flag as set by a stopPropagation call. This flag is usually reset by a user interaction of any kind,\n // but there was a scenario of a display object moving under a static mouse cursor.\n // In this case, mouseover and mouseevents would not pass the flag test in triggerEvent function\n for (const k in this.activeInteractionData) {\n // eslint-disable-next-line no-prototype-builtins\n if (this.activeInteractionData.hasOwnProperty(k)) {\n const interactionData = this.activeInteractionData[k];\n\n if (interactionData.originalEvent && interactionData.pointerType !== 'touch') {\n const interactionEvent = this.configureInteractionEventForDOMEvent(\n this.eventData,\n interactionData.originalEvent,\n interactionData\n );\n\n this.processInteractive(\n interactionEvent,\n this.layer.scene,\n this.processPointerOverOut,\n true\n );\n }\n }\n }\n\n this.setCursorMode(this.cursor);\n\n // TODO\n }\n\n /**\n * Sets the current cursor mode, handling any callbacks or CSS style changes.\n *\n * @param {string} mode - cursor mode, a key from the cursorStyles dictionary\n */\n setCursorMode(mode) {\n mode = mode || 'default';\n // if the mode didn't actually change, bail early\n if (this.currentCursorMode === mode) {\n return;\n }\n this.currentCursorMode = mode;\n const style = this.cursorStyles[mode];\n\n // only do things if there is a cursor style for it\n if (style) {\n switch (typeof style) {\n case 'string':\n // string styles are handled as cursor CSS\n this.interactionDOMElement.style.cursor = style;\n break;\n case 'function':\n // functions are just called, and passed the cursor mode\n style(mode);\n break;\n case 'object':\n // if it is an object, assume that it is a dictionary of CSS styles,\n // apply it to the interactionDOMElement\n Object.assign(this.interactionDOMElement.style, style);\n break;\n default:\n break;\n }\n } else if (typeof mode === 'string' && !Object.prototype.hasOwnProperty.call(this.cursorStyles, mode)) {\n // if it mode is a string (not a Symbol) and cursorStyles doesn't have any entry\n // for the mode, then assume that the dev wants it to be CSS for the cursor.\n this.interactionDOMElement.style.cursor = mode;\n }\n }\n\n /**\n * Dispatches an event on the display object that was interacted with\n *\n * @param {Object3D} displayObject - the display object in question\n * @param {string} eventString - the name of the event (e.g, mousedown)\n * @param {object} eventData - the event data object\n * @private\n */\n triggerEvent(displayObject, eventString, eventData) {\n if (!eventData.stopped) {\n eventData.currentTarget = displayObject;\n eventData.type = eventString;\n\n displayObject.emit(eventString, eventData);\n\n if (displayObject[eventString]) {\n displayObject[eventString](eventData);\n }\n }\n }\n\n /**\n * This function is provides a neat way of crawling through the scene graph and running a\n * specified function on all interactive objects it finds. It will also take care of hit\n * testing the interactive objects and passes the hit across in the function.\n *\n * @private\n * @param {InteractionEvent} interactionEvent - event containing the point that\n * is tested for collision\n * @param {Object3D} displayObject - the displayObject\n * that will be hit test (recursively crawls its children)\n * @param {Function} [func] - the function that will be called on each interactive object. The\n * interactionEvent, displayObject and hit will be passed to the function\n * @param {boolean} [hitTest] - this indicates if the objects inside should be hit test against the point\n * @param {boolean} [interactive] - Whether the displayObject is interactive\n * @return {boolean} returns true if the displayObject hit the point\n */\n processInteractive(interactionEvent, displayObject, func, hitTest, interactive) {\n if (!displayObject || !displayObject.visible) {\n return false;\n }\n\n // Took a little while to rework this function correctly! But now it is done and nice and optimised. ^_^\n //\n // This function will now loop through all objects and then only hit test the objects it HAS\n // to, not all of them. MUCH faster..\n // An object will be hit test if the following is true:\n //\n // 1: It is interactive.\n // 2: It belongs to a parent that is interactive AND one of the parents children have not already been hit.\n //\n // As another little optimisation once an interactive object has been hit we can carry on\n // through the scenegraph, but we know that there will be no more hits! So we can avoid extra hit tests\n // A final optimisation is that an object is not hit test directly if a child has already been hit.\n\n interactive = displayObject.interactive || interactive;\n\n let hit = false;\n let interactiveParent = interactive;\n\n if (displayObject.interactiveChildren && displayObject.children) {\n const children = displayObject.children;\n\n for (let i = children.length - 1; i >= 0; i--) {\n const child = children[i];\n\n // time to get recursive.. if this function will return if something is hit..\n const childHit = this.processInteractive(interactionEvent, child, func, hitTest, interactiveParent);\n\n if (childHit) {\n // its a good idea to check if a child has lost its parent.\n // this means it has been removed whilst looping so its best\n if (!child.parent) {\n continue;\n }\n\n // we no longer need to hit test any more objects in this container as we we\n // now know the parent has been hit\n interactiveParent = false;\n\n // If the child is interactive , that means that the object hit was actually\n // interactive and not just the child of an interactive object.\n // This means we no longer need to hit test anything else. We still need to run\n // through all objects, but we don't need to perform any hit tests.\n\n if (childHit) {\n if (interactionEvent.target) {\n hitTest = false;\n }\n hit = true;\n }\n }\n }\n }\n\n // no point running this if the item is not interactive or does not have an interactive parent.\n if (interactive) {\n // if we are hit testing (as in we have no hit any objects yet)\n // We also don't need to worry about hit testing if once of the displayObjects children\n // has already been hit - but only if it was interactive, otherwise we need to keep\n // looking for an interactive child, just in case we hit one\n if (hitTest && !interactionEvent.target) {\n if (interactionEvent.intersects[0] && interactionEvent.intersects[0].object === displayObject) {\n hit = true;\n }\n }\n\n if (displayObject.interactive) {\n if (hit && !interactionEvent.target) {\n interactionEvent.data.target = interactionEvent.target = displayObject;\n }\n\n if (func) {\n func(interactionEvent, displayObject, !!hit);\n }\n }\n }\n\n return hit;\n }\n\n\n /**\n * Is called when the click is pressed down on the renderer element\n *\n * @private\n * @param {MouseEvent} originalEvent - The DOM event of a click being pressed down\n */\n onClick(originalEvent) {\n if (!this.isAble()) return;\n if (originalEvent.type !== 'click') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n if (this.autoPreventDefault && events[0].isNormalized) {\n originalEvent.preventDefault();\n }\n\n const interactionData = this.getInteractionDataForPointerId(events[0]);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, events[0], interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n this.processInteractive(interactionEvent, this.layer.scene, this.processClick, true);\n\n this.emit('click', interactionEvent);\n }\n\n /**\n * Processes the result of the click check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processClick(interactionEvent, displayObject, hit) {\n if (hit) {\n this.triggerEvent(displayObject, 'click', interactionEvent);\n }\n }\n\n /**\n * Is called when the pointer button is pressed down on the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being pressed down\n */\n onPointerDown(originalEvent) {\n if (!this.isAble()) return;\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n /**\n * No need to prevent default on natural pointer events, as there are no side effects\n * Normalized events, however, may have the double mousedown/touchstart issue on the native android browser,\n * so still need to be prevented.\n */\n\n // Guaranteed that there will be at least one event in events, and all events must have the same pointer type\n\n if (this.autoPreventDefault && events[0].isNormalized) {\n originalEvent.preventDefault();\n }\n\n const eventLen = events.length;\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n this.processInteractive(interactionEvent, this.layer.scene, this.processPointerDown, true);\n\n this.emit('pointerdown', interactionEvent);\n if (event.pointerType === 'touch') {\n this.emit('touchstart', interactionEvent);\n } else if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n const isRightButton = event.button === 2;\n\n this.emit(isRightButton ? 'rightdown' : 'mousedown', this.eventData);\n }\n }\n }\n\n /**\n * Processes the result of the pointer down check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerDown(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n const id = interactionEvent.data.identifier;\n\n if (hit) {\n if (!displayObject.trackedPointers[id]) {\n displayObject.trackedPointers[id] = new InteractionTrackingData(id);\n }\n this.triggerEvent(displayObject, 'pointerdown', interactionEvent);\n\n if (data.pointerType === 'touch') {\n displayObject.started = true;\n this.triggerEvent(displayObject, 'touchstart', interactionEvent);\n } else if (data.pointerType === 'mouse' || data.pointerType === 'pen') {\n const isRightButton = data.button === 2;\n\n if (isRightButton) {\n displayObject.trackedPointers[id].rightDown = true;\n } else {\n displayObject.trackedPointers[id].leftDown = true;\n }\n\n this.triggerEvent(displayObject, isRightButton ? 'rightdown' : 'mousedown', interactionEvent);\n }\n }\n }\n\n /**\n * Is called when the pointer button is released on the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being released\n * @param {boolean} cancelled - true if the pointer is cancelled\n * @param {Function} func - Function passed to {@link processInteractive}\n */\n onPointerComplete(originalEvent, cancelled, func) {\n const events = this.normalizeToPointerData(originalEvent);\n\n const eventLen = events.length;\n\n // if the event wasn't targeting our canvas, then consider it to be pointerupoutside\n // in all cases (unless it was a pointercancel)\n const eventAppend = originalEvent.target !== this.interactionDOMElement ? 'outside' : '';\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n // perform hit testing for events targeting our canvas or cancel events\n this.processInteractive(interactionEvent, this.layer.scene, func, cancelled || !eventAppend);\n\n this.emit(cancelled ? 'pointercancel' : `pointerup${eventAppend}`, interactionEvent);\n\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n const isRightButton = event.button === 2;\n\n this.emit(isRightButton ? `rightup${eventAppend}` : `mouseup${eventAppend}`, interactionEvent);\n } else if (event.pointerType === 'touch') {\n this.emit(cancelled ? 'touchcancel' : `touchend${eventAppend}`, interactionEvent);\n this.releaseInteractionDataForPointerId(event.pointerId, interactionData);\n }\n }\n }\n\n /**\n * Is called when the pointer button is cancelled\n *\n * @private\n * @param {PointerEvent} event - The DOM event of a pointer button being released\n */\n onPointerCancel(event) {\n if (!this.isAble()) return;\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && event.pointerType === 'touch') return;\n\n this.onPointerComplete(event, true, this.processPointerCancel);\n }\n\n /**\n * Processes the result of the pointer cancel check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n */\n processPointerCancel(interactionEvent, displayObject) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n if (displayObject.trackedPointers[id] !== undefined) {\n delete displayObject.trackedPointers[id];\n this.triggerEvent(displayObject, 'pointercancel', interactionEvent);\n\n if (data.pointerType === 'touch') {\n this.triggerEvent(displayObject, 'touchcancel', interactionEvent);\n }\n }\n }\n\n /**\n * Is called when the pointer button is released on the renderer element\n *\n * @private\n * @param {PointerEvent} event - The DOM event of a pointer button being released\n */\n onPointerUp(event) {\n if (!this.isAble()) return;\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && event.pointerType === 'touch') return;\n\n this.onPointerComplete(event, false, this.processPointerUp);\n }\n\n /**\n * Processes the result of the pointer up check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerUp(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n const trackingData = displayObject.trackedPointers[id];\n\n const isTouch = data.pointerType === 'touch';\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n // Mouse only\n if (isMouse) {\n const isRightButton = data.button === 2;\n\n const flags = InteractionTrackingData.FLAGS;\n\n const test = isRightButton ? flags.RIGHT_DOWN : flags.LEFT_DOWN;\n\n const isDown = trackingData !== undefined && (trackingData.flags & test);\n\n if (hit) {\n this.triggerEvent(displayObject, isRightButton ? 'rightup' : 'mouseup', interactionEvent);\n\n if (isDown) {\n this.triggerEvent(displayObject, isRightButton ? 'rightclick' : 'leftclick', interactionEvent);\n }\n } else if (isDown) {\n this.triggerEvent(displayObject, isRightButton ? 'rightupoutside' : 'mouseupoutside', interactionEvent);\n }\n // update the down state of the tracking data\n if (trackingData) {\n if (isRightButton) {\n trackingData.rightDown = false;\n } else {\n trackingData.leftDown = false;\n }\n }\n }\n\n // Pointers and Touches, and Mouse\n if (isTouch && displayObject.started) {\n displayObject.started = false;\n this.triggerEvent(displayObject, 'touchend', interactionEvent);\n }\n if (hit) {\n this.triggerEvent(displayObject, 'pointerup', interactionEvent);\n\n if (trackingData) {\n this.triggerEvent(displayObject, 'pointertap', interactionEvent);\n if (isTouch) {\n this.triggerEvent(displayObject, 'tap', interactionEvent);\n // touches are no longer over (if they ever were) when we get the touchend\n // so we should ensure that we don't keep pretending that they are\n trackingData.over = false;\n }\n }\n } else if (trackingData) {\n this.triggerEvent(displayObject, 'pointerupoutside', interactionEvent);\n if (isTouch) this.triggerEvent(displayObject, 'touchendoutside', interactionEvent);\n }\n // Only remove the tracking data if there is no over/down state still associated with it\n if (trackingData && trackingData.none) {\n delete displayObject.trackedPointers[id];\n }\n }\n\n /**\n * Is called when the pointer moves across the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer moving\n */\n onPointerMove(originalEvent) {\n if (!this.isAble()) return;\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n if (events[0].pointerType === 'mouse') {\n this.didMove = true;\n\n this.cursor = null;\n }\n\n const eventLen = events.length;\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n const interactive = event.pointerType === 'touch' ? this.moveWhenInside : true;\n\n this.processInteractive(\n interactionEvent,\n this.layer.scene,\n this.processPointerMove,\n interactive\n );\n this.emit('pointermove', interactionEvent);\n if (event.pointerType === 'touch') this.emit('touchmove', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') this.emit('mousemove', interactionEvent);\n }\n\n if (events[0].pointerType === 'mouse') {\n this.setCursorMode(this.cursor);\n\n // TODO BUG for parents interactive object (border order issue)\n }\n }\n\n /**\n * Processes the result of the pointer move check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerMove(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const isTouch = data.pointerType === 'touch';\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n if (isMouse) {\n this.processPointerOverOut(interactionEvent, displayObject, hit);\n }\n\n if (isTouch && displayObject.started) this.triggerEvent(displayObject, 'touchmove', interactionEvent);\n if (!this.moveWhenInside || hit) {\n this.triggerEvent(displayObject, 'pointermove', interactionEvent);\n if (isMouse) this.triggerEvent(displayObject, 'mousemove', interactionEvent);\n }\n }\n\n /**\n * Is called when the pointer is moved out of the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer being moved out\n */\n onPointerOut(originalEvent) {\n if (!this.isAble()) return;\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n // Only mouse and pointer can call onPointerOut, so events will always be length 1\n const event = events[0];\n\n if (event.pointerType === 'mouse') {\n this.mouseOverRenderer = false;\n this.setCursorMode(null);\n }\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = event;\n\n this.processInteractive(interactionEvent, this.layer.scene, this.processPointerOverOut, false);\n\n this.emit('pointerout', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n this.emit('mouseout', interactionEvent);\n } else {\n // we can get touchleave events after touchend, so we want to make sure we don't\n // introduce memory leaks\n this.releaseInteractionDataForPointerId(interactionData.identifier);\n }\n }\n\n /**\n * Processes the result of the pointer over/out check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerOverOut(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n let trackingData = displayObject.trackedPointers[id];\n\n // if we just moused over the display object, then we need to track that state\n if (hit && !trackingData) {\n trackingData = displayObject.trackedPointers[id] = new InteractionTrackingData(id);\n }\n\n if (trackingData === undefined) return;\n\n if (hit && this.mouseOverRenderer) {\n if (!trackingData.over) {\n trackingData.over = true;\n this.triggerEvent(displayObject, 'pointerover', interactionEvent);\n if (isMouse) {\n this.triggerEvent(displayObject, 'mouseover', interactionEvent);\n }\n }\n\n // only change the cursor if it has not already been changed (by something deeper in the\n // display tree)\n if (isMouse && this.cursor === null) {\n this.cursor = displayObject.cursor;\n }\n } else if (trackingData.over) {\n trackingData.over = false;\n this.triggerEvent(displayObject, 'pointerout', this.eventData);\n if (isMouse) {\n this.triggerEvent(displayObject, 'mouseout', interactionEvent);\n }\n // if there is no mouse down information for the pointer, then it is safe to delete\n if (trackingData.none) {\n delete displayObject.trackedPointers[id];\n }\n }\n }\n\n /**\n * Is called when the pointer is moved into the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being moved into the renderer view\n */\n onPointerOver(originalEvent) {\n if (!this.isAble()) return;\n const events = this.normalizeToPointerData(originalEvent);\n\n // Only mouse and pointer can call onPointerOver, so events will always be length 1\n const event = events[0];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = event;\n\n if (event.pointerType === 'mouse') {\n this.mouseOverRenderer = true;\n }\n\n this.emit('pointerover', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n this.emit('mouseover', interactionEvent);\n }\n }\n\n /**\n * Get InteractionData for a given pointerId. Store that data as well\n *\n * @private\n * @param {PointerEvent} event - Normalized pointer event, output from normalizeToPointerData\n * @return {InteractionData} - Interaction data for the given pointer identifier\n */\n getInteractionDataForPointerId(event) {\n const pointerId = event.pointerId;\n\n let interactionData;\n\n if (pointerId === MOUSE_POINTER_ID || event.pointerType === 'mouse') {\n interactionData = this.mouse;\n } else if (this.activeInteractionData[pointerId]) {\n interactionData = this.activeInteractionData[pointerId];\n } else {\n interactionData = this.interactionDataPool.pop() || new InteractionData();\n interactionData.identifier = pointerId;\n this.activeInteractionData[pointerId] = interactionData;\n }\n // copy properties from the event, so that we can make sure that touch/pointer specific\n // data is available\n interactionData._copyEvent(event);\n\n return interactionData;\n }\n\n /**\n * Return unused InteractionData to the pool, for a given pointerId\n *\n * @private\n * @param {number} pointerId - Identifier from a pointer event\n */\n releaseInteractionDataForPointerId(pointerId) {\n const interactionData = this.activeInteractionData[pointerId];\n\n if (interactionData) {\n delete this.activeInteractionData[pointerId];\n interactionData._reset();\n this.interactionDataPool.push(interactionData);\n }\n }\n\n /**\n * Maps x and y coords from a DOM object and maps them correctly to the three.js view. The\n * resulting value is stored in the point. This takes into account the fact that the DOM\n * element could be scaled and positioned anywhere on the screen.\n *\n * @param {Vector2} point - the point that the result will be stored in\n * @param {number} x - the x coord of the position to map\n * @param {number} y - the y coord of the position to map\n */\n mapPositionToPoint(point, x, y) {\n let rect;\n\n // IE 11 fix\n if (!this.interactionDOMElement.parentElement) {\n rect = {\n x: 0,\n y: 0,\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n };\n } else {\n rect = this.interactionDOMElement.getBoundingClientRect();\n }\n\n point.x = ((x - rect.left) / rect.width) * 2 - 1;\n point.y = -((y - rect.top) / rect.height) * 2 + 1;\n }\n\n /**\n * Configure an InteractionEvent to wrap a DOM PointerEvent and InteractionData\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The event to be configured\n * @param {PointerEvent} pointerEvent - The DOM event that will be paired with the InteractionEvent\n * @param {InteractionData} interactionData - The InteractionData that will be paired\n * with the InteractionEvent\n * @return {InteractionEvent} the interaction event that was passed in\n */\n configureInteractionEventForDOMEvent(interactionEvent, pointerEvent, interactionData) {\n interactionEvent.data = interactionData;\n\n this.mapPositionToPoint(interactionData.global, pointerEvent.clientX, pointerEvent.clientY);\n\n if (this.layer && this.layer.interactive) this.raycaster.setFromCamera(interactionData.global, this.layer.camera);\n\n // Not really sure why this is happening, but it's how a previous version handled things TODO: there should be remove\n if (pointerEvent.pointerType === 'touch') {\n pointerEvent.globalX = interactionData.global.x;\n pointerEvent.globalY = interactionData.global.y;\n }\n\n interactionData.originalEvent = pointerEvent;\n interactionEvent._reset();\n interactionEvent.intersects = this.raycaster.intersectObjects(this.scene.children, true);\n\n return interactionEvent;\n }\n\n /**\n * Ensures that the original event object contains all data that a regular pointer event would have\n *\n * @private\n * @param {TouchEvent|MouseEvent|PointerEvent} event - The original event data from a touch or mouse event\n * @return {PointerEvent[]} An array containing a single normalized pointer event, in the case of a pointer\n * or mouse event, or a multiple normalized pointer events if there are multiple changed touches\n */\n normalizeToPointerData(event) {\n const normalizedEvents = [];\n\n if (this.supportsTouchEvents && event instanceof TouchEvent) {\n for (let i = 0, li = event.changedTouches.length; i < li; i++) {\n const touch = event.changedTouches[i];\n\n if (typeof touch.button === 'undefined') touch.button = event.touches.length ? 1 : 0;\n if (typeof touch.buttons === 'undefined') touch.buttons = event.touches.length ? 1 : 0;\n if (typeof touch.isPrimary === 'undefined') {\n touch.isPrimary = event.touches.length === 1 && event.type === 'touchstart';\n }\n if (typeof touch.width === 'undefined') touch.width = touch.radiusX || 1;\n if (typeof touch.height === 'undefined') touch.height = touch.radiusY || 1;\n if (typeof touch.tiltX === 'undefined') touch.tiltX = 0;\n if (typeof touch.tiltY === 'undefined') touch.tiltY = 0;\n if (typeof touch.pointerType === 'undefined') touch.pointerType = 'touch';\n if (typeof touch.pointerId === 'undefined') touch.pointerId = touch.identifier || 0;\n if (typeof touch.pressure === 'undefined') touch.pressure = touch.force || 0.5;\n touch.twist = 0;\n touch.tangentialPressure = 0;\n // TODO: Remove these, as layerX/Y is not a standard, is deprecated, has uneven\n // support, and the fill ins are not quite the same\n // offsetX/Y might be okay, but is not the same as clientX/Y when the canvas's top\n // left is not 0,0 on the page\n if (typeof touch.layerX === 'undefined') touch.layerX = touch.offsetX = touch.clientX;\n if (typeof touch.layerY === 'undefined') touch.layerY = touch.offsetY = touch.clientY;\n\n // mark the touch as normalized, just so that we know we did it\n touch.isNormalized = true;\n\n normalizedEvents.push(touch);\n }\n } else if (event instanceof MouseEvent && (!this.supportsPointerEvents || !(event instanceof window.PointerEvent))) {\n if (typeof event.isPrimary === 'undefined') event.isPrimary = true;\n if (typeof event.width === 'undefined') event.width = 1;\n if (typeof event.height === 'undefined') event.height = 1;\n if (typeof event.tiltX === 'undefined') event.tiltX = 0;\n if (typeof event.tiltY === 'undefined') event.tiltY = 0;\n if (typeof event.pointerType === 'undefined') event.pointerType = 'mouse';\n if (typeof event.pointerId === 'undefined') event.pointerId = MOUSE_POINTER_ID;\n if (typeof event.pressure === 'undefined') event.pressure = 0.5;\n event.twist = 0;\n event.tangentialPressure = 0;\n\n // mark the mouse event as normalized, just so that we know we did it\n event.isNormalized = true;\n\n normalizedEvents.push(event);\n } else {\n normalizedEvents.push(event);\n }\n\n return normalizedEvents;\n }\n\n /**\n * Destroys the interaction manager\n *\n */\n destroy() {\n this.removeEvents();\n\n this.removeAllListeners();\n\n this.renderer = null;\n\n this.mouse = null;\n\n this.eventData = null;\n\n this.interactionDOMElement = null;\n\n this.onPointerDown = null;\n this.processPointerDown = null;\n\n this.onPointerUp = null;\n this.processPointerUp = null;\n\n this.onPointerCancel = null;\n this.processPointerCancel = null;\n\n this.onPointerMove = null;\n this.processPointerMove = null;\n\n this.onPointerOut = null;\n this.processPointerOverOut = null;\n\n this.onPointerOver = null;\n\n this._tempPoint = null;\n }\n}\n\nexport default InteractionLayer;\n","(function() {\n let lastTime = 0;\n let vendors = ['ms', 'moz', 'webkit', 'o'];\n for (let x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\n window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];\n window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] ||\n window[vendors[x] + 'CancelRequestAnimationFrame'];\n }\n\n if (!window.requestAnimationFrame) {\n window.requestAnimationFrame = function(callback) {\n let currTime = new Date().getTime();\n let timeToCall = Math.max(0, 16 - (currTime - lastTime));\n let id = window.setTimeout(function() {\n callback(currTime + timeToCall);\n }, timeToCall);\n lastTime = currTime + timeToCall;\n return id;\n };\n }\n\n if (!window.cancelAnimationFrame) {\n window.cancelAnimationFrame = function(id) {\n clearTimeout(id);\n };\n }\n\n window.RAF = window.requestAnimationFrame;\n window.CAF = window.cancelAnimationFrame;\n})();\n","import './Raf';\nimport { EventDispatcher } from 'three';\n\n/**\n * @extends EventDispatcher\n */\nclass Ticker extends EventDispatcher {\n /**\n *\n */\n constructor() {\n super();\n this.timer = null;\n this.started = false;\n\n /**\n * pre-time cache\n *\n * @member {Number}\n * @private\n */\n this.pt = 0;\n\n /**\n * how long the time through, at this tick\n *\n * @member {Number}\n * @private\n */\n this.snippet = 0;\n\n this.start();\n }\n\n /**\n * start tick loop\n */\n start() {\n if (this.started) return;\n const loop = () => {\n this.timeline();\n this.emit('tick', { snippet: this.snippet });\n this.timer = RAF(loop);\n };\n loop();\n }\n\n /**\n * stop tick loop\n */\n stop() {\n CAF(this.timer);\n this.started = false;\n }\n\n /**\n * get timeline snippet\n *\n * @private\n */\n timeline() {\n this.snippet = Date.now() - this.pt;\n if (this.pt === 0 || this.snippet > 200) {\n this.pt = Date.now();\n this.snippet = Date.now() - this.pt;\n }\n\n this.pt += this.snippet;\n }\n}\n\nexport default Ticker;\n","import Ticker from '../utils/Ticker';\nimport InteractionManager from './InteractionManager';\n\n/**\n * The interaction manager deals with mouse, touch and pointer events. Any DisplayObject can be interactive\n * if its interactive parameter is set to true\n * This manager also supports multitouch.\n *\n * reference to [pixi.js](http://www.pixijs.com/) impl\n *\n * @example\n * import { Scene, PerspectiveCamera, WebGLRenderer, Mesh, BoxGeometry, MeshBasicMaterial } from 'three';\n * import { Interaction } from 'three.interaction';\n * const renderer = new WebGLRenderer({ canvas: canvasElement });\n * const scene = new Scene();\n * const camera = new PerspectiveCamera(60, width / height, 0.1, 100);\n *\n * const interaction = new Interaction(renderer, scene, camera);\n * // then you can bind every interaction event with any mesh which you had `add` into `scene` before\n * const cube = new Mesh(\n * new BoxGeometry(1, 1, 1),\n * new MeshBasicMaterial({ color: 0xffffff }),\n * );\n * scene.add(cube);\n * cube.on('touchstart', ev => {\n * console.log(ev);\n * });\n *\n * cube.on('mousedown', ev => {\n * console.log(ev);\n * });\n *\n * cube.on('pointerdown', ev => {\n * console.log(ev);\n * });\n * // and so on ...\n *\n * // you can also listen on parent-node or any display-tree node,\n * // source event will bubble up along with display-tree.\n * // you can stop the bubble-up by invoke ev.stopPropagation function.\n * scene.on('touchstart', ev => {\n * console.log(ev);\n * })\n *\n * @class\n * @extends InteractionManager\n */\nclass Interaction extends InteractionManager {\n /**\n * @param {WebGLRenderer} renderer - A reference to the current renderer\n * @param {Scene} scene - A reference to the current scene\n * @param {Camera} camera - A reference to the current camera\n * @param {Object} [options] - The options for the manager.\n * @param {Boolean} [options.autoPreventDefault=false] - Should the manager automatically prevent default browser actions.\n * @param {Boolean} [options.autoAttach=false] - Should the manager automatically attach target element.\n * @param {Number} [options.interactionFrequency=10] - Frequency increases the interaction events will be checked.\n */\n constructor(renderer, scene, camera, options) {\n options = Object.assign({ autoAttach: false }, options);\n super(renderer, scene, camera, options);\n\n /**\n * a ticker\n *\n * @private\n * @member {Ticker}\n */\n this.ticker = new Ticker();\n\n /**\n * update for some over event\n *\n * @private\n */\n this.update = this.update.bind(this);\n\n this.on('addevents', () => {\n this.ticker.on('tick', this.update);\n });\n\n this.on('removeevents', () => {\n this.ticker.off('tick', this.update);\n });\n\n this.setTargetElement(this.renderer.domElement);\n }\n}\n\nexport default Interaction;\n"],"names":["_rt","val","Object","prototype","toString","call","Utils","ks","variable","EventDispatcher","on","type","fn","isFunction","Object3D","interactive","addEventListener","off","removeEventListener","once","cb","ev","emit","_listeners","undefined","isUndefined","cbs","cache","slice","argument","i","length","apply","interactiveChildren","started","defineProperty","_trackedPointers","raycastTest","raycaster","result","raycast","InteractionData","global","Vector2","target","originalEvent","identifier","isPrimary","button","buttons","width","height","tiltX","tiltY","pointerType","pressure","rotationAngle","twist","tangentialPressure","event","InteractionEvent","stopped","currentTarget","data","intersects","InteractionTrackingData","pointerId","_pointerId","_flags","FLAGS","NONE","flag","yn","flags","constructor","OVER","_doSet","RIGHT_DOWN","LEFT_DOWN","freeze","MOUSE_POINTER_ID","hitTestEvent","InteractionManager","renderer","scene","camera","options","objects","autoPreventDefault","interactionFrequency","mouse","set","activeInteractionData","interactionDataPool","eventData","interactionDOMElement","moveWhenInside","eventsAdded","mouseOverRenderer","supportsTouchEvents","window","supportsPointerEvents","PointerEvent","onClick","bind","processClick","onPointerUp","processPointerUp","onPointerCancel","processPointerCancel","onPointerDown","processPointerDown","onPointerMove","processPointerMove","onPointerOut","processPointerOverOut","onPointerOver","cursorStyles","currentCursorMode","cursor","Raycaster","_deltaTime","setTargetElement","domElement","globalPoint","root","processInteractive","element","removeEvents","addEvents","navigator","msPointerEnabled","style","document","snippet","didMove","k","hasOwnProperty","interactionData","interactionEvent","configureInteractionEventForDOMEvent","setCursorMode","mode","assign","displayObject","eventString","func","hitTest","visible","hit","interactiveParent","children","child","childHit","parent","object","events","normalizeToPointerData","isNormalized","preventDefault","getInteractionDataForPointerId","triggerEvent","eventLen","isRightButton","id","trackedPointers","rightDown","leftDown","cancelled","eventAppend","releaseInteractionDataForPointerId","onPointerComplete","trackingData","isTouch","isMouse","test","isDown","over","none","pop","_copyEvent","_reset","push","point","x","y","rect","parentElement","getBoundingClientRect","left","top","pointerEvent","mapPositionToPoint","clientX","clientY","setFromCamera","globalX","globalY","objectsToRaycast","intersectObjects","normalizedEvents","TouchEvent","li","changedTouches","touch","touches","radiusX","radiusY","force","layerX","offsetX","layerY","offsetY","MouseEvent","removeAllListeners","_tempPoint","InteractionLayer","layer","isAble","lastTime","vendors","requestAnimationFrame","cancelAnimationFrame","callback","currTime","Date","getTime","timeToCall","Math","max","setTimeout","RAF","CAF","Ticker","timer","pt","start","loop","timeline","now","Interaction","autoAttach","ticker","update"],"mappings":"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"} \ No newline at end of file diff --git a/build/three.interaction.module.js b/build/three.interaction.module.js index a686d00..8aca43d 100644 --- a/build/three.interaction.module.js +++ b/build/three.interaction.module.js @@ -712,6 +712,8 @@ var InteractionManager = function (_EventDispatcher) { options = options || {}; + _this.objects = null; + /** * The renderer this interaction manager works for. * @@ -2341,11 +2343,27 @@ var InteractionManager = function (_EventDispatcher) { interactionData.originalEvent = pointerEvent; interactionEvent._reset(); - interactionEvent.intersects = this.raycaster.intersectObjects(this.scene.children, true); - + if (this.objectsToRaycast) { + interactionEvent.intersects = this.raycaster.intersectObjects(this.objectsToRaycast, true); + } else { + interactionEvent.intersects = this.raycaster.intersectObjects(this.scene.children, true); + } return interactionEvent; } + /** + * set objects to raycast + * + * @param {Object3D} objects + * @memberof InteractionManager + */ + + }, { + key: 'setObjectsToRaycast', + value: function setObjectsToRaycast(objects) { + this.objectsToRaycast = objects; + } + /** * Ensures that the original event object contains all data that a regular pointer event would have * diff --git a/build/three.interaction.module.js.map b/build/three.interaction.module.js.map index fdf5a74..5babe4a 100644 --- a/build/three.interaction.module.js.map +++ b/build/three.interaction.module.js.map @@ -1 +1 @@ -{"version":3,"file":"three.interaction.module.js","sources":["../src/utils/Utils.js","../src/patch/EventDispatcher.js","../src/patch/Object3D.js","../src/interaction/InteractionData.js","../src/interaction/InteractionEvent.js","../src/interaction/InteractionTrackingData.js","../src/interaction/InteractionManager.js","../src/interaction/InteractionLayer.js","../src/utils/Raf.js","../src/utils/Ticker.js","../src/interaction/Interaction.js"],"sourcesContent":["/**\n * get variable type\n * @param {*} val a variable which you want to get the type\n * @return {String} variable-type\n */\nfunction _rt(val) {\n return Object.prototype.toString.call(val);\n}\n\n/**\n * Utils tool box\n *\n * @namespace Utils\n */\nexport const Utils = {\n /**\n * determine whether it is a `Function`\n *\n * @static\n * @method\n * @memberof Utils\n * @param {*} variable a variable which you want to determine\n * @return {Boolean} type result\n */\n isFunction: (function() {\n const ks = _rt(function() {});\n return function(variable) {\n return _rt(variable) === ks;\n };\n })(),\n\n\n /**\n * determine whether it is a `undefined`\n *\n * @static\n * @method\n * @memberof Utils\n * @param {*} variable a variable which you want to determine\n * @return {Boolean} type result\n */\n isUndefined(variable) {\n return typeof variable === 'undefined';\n },\n};\n","import { EventDispatcher, Object3D } from 'three';\nimport { Utils } from '../utils/Utils.js';\n\n/**\n * proxy `addEventListener` function\n *\n * @param {String} type event type, evnet name\n * @param {Function} fn callback\n * @return {this} this\n */\nEventDispatcher.prototype.on = function(type, fn) {\n if (!Utils.isFunction(fn)) return;\n if (this instanceof Object3D) this.interactive = true;\n this.addEventListener(type, fn);\n return this;\n};\n\n/**\n * proxy `removeEventListener` function\n *\n * @param {String} type event type, evnet name\n * @param {Function} fn callback, which you had bind before\n * @return {this} this\n */\nEventDispatcher.prototype.off = function(type, fn) {\n this.removeEventListener(type, fn);\n return this;\n};\n\n/**\n * binding a once event, just emit once time\n *\n * @param {String} type event type, evnet name\n * @param {Function} fn callback\n * @return {this} this\n */\nEventDispatcher.prototype.once = function(type, fn) {\n if (!Utils.isFunction(fn)) return;\n const cb = (ev) => {\n fn(ev);\n this.off(type, cb);\n };\n this.on(type, cb);\n return this;\n};\n\n/**\n * emit a event\n *\n * @param {String} type event type, evnet name\n * @return {this} this\n */\nEventDispatcher.prototype.emit = function(type, ...argument) {\n if (this._listeners === undefined || Utils.isUndefined(this._listeners[type])) return;\n const cbs = this._listeners[type] || [];\n const cache = cbs.slice(0);\n\n for (let i = 0; i < cache.length; i++) {\n cache[i].apply(this, argument);\n }\n return this;\n};\n\n","import { Object3D } from 'three';\n\n/**\n * whether displayObject is interactively\n */\nObject3D.prototype.interactive = false;\n\n/**\n * whether displayObject's children is interactively\n */\nObject3D.prototype.interactiveChildren = true;\n\n/**\n * whether displayObject had touchstart\n * @private\n */\nObject3D.prototype.started = false;\n\n/**\n * tracked event cache, like: touchend、mouseout、pointerout which decided by primary-event\n */\nObject.defineProperty(Object3D.prototype, 'trackedPointers', {\n get() {\n if (!this._trackedPointers) this._trackedPointers = {};\n return this._trackedPointers;\n },\n});\n\n/**\n * dispatch a raycast\n *\n * @param {Raycaster} raycaster Raycaster object, get from THREE.Raycaster\n * @return {Object|Boolean} had pass hit-test\n */\nObject3D.prototype.raycastTest = function(raycaster) {\n const result = [];\n this.raycast(raycaster, result);\n\n if (result.length > 0) {\n return result[0];\n }\n\n return false;\n};\n","import { Vector2 } from 'three';\n\n/**\n * Holds all information related to an Interaction event\n *\n * @class\n */\nclass InteractionData {\n /**\n * InteractionData constructor\n */\n constructor() {\n /**\n * This point stores the global coords of where the touch/mouse event happened\n *\n * @member {Vector2}\n */\n this.global = new Vector2();\n\n /**\n * The target DisplayObject that was interacted with\n *\n * @member {Object3D}\n */\n this.target = null;\n\n /**\n * When passed to an event handler, this will be the original DOM Event that was captured\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent\n * @see https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent\n * @member {MouseEvent|TouchEvent|PointerEvent}\n */\n this.originalEvent = null;\n\n /**\n * Unique identifier for this interaction\n *\n * @member {number}\n */\n this.identifier = null;\n\n /**\n * Indicates whether or not the pointer device that created the event is the primary pointer.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/isPrimary\n * @type {Boolean}\n */\n this.isPrimary = false;\n\n /**\n * Indicates which button was pressed on the mouse or pointer device to trigger the event.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button\n * @type {number}\n */\n this.button = 0;\n\n /**\n * Indicates which buttons are pressed on the mouse or pointer device when the event is triggered.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons\n * @type {number}\n */\n this.buttons = 0;\n\n /**\n * The width of the pointer's contact along the x-axis, measured in CSS pixels.\n * radiusX of TouchEvents will be represented by this value.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/width\n * @type {number}\n */\n this.width = 0;\n\n /**\n * The height of the pointer's contact along the y-axis, measured in CSS pixels.\n * radiusY of TouchEvents will be represented by this value.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/height\n * @type {number}\n */\n this.height = 0;\n\n /**\n * The angle, in degrees, between the pointer device and the screen.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/tiltX\n * @type {number}\n */\n this.tiltX = 0;\n\n /**\n * The angle, in degrees, between the pointer device and the screen.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/tiltY\n * @type {number}\n */\n this.tiltY = 0;\n\n /**\n * The type of pointer that triggered the event.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/pointerType\n * @type {string}\n */\n this.pointerType = null;\n\n /**\n * Pressure applied by the pointing device during the event. A Touch's force property\n * will be represented by this value.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/pressure\n * @type {number}\n */\n this.pressure = 0;\n\n /**\n * From TouchEvents (not PointerEvents triggered by touches), the rotationAngle of the Touch.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Touch/rotationAngle\n * @type {number}\n */\n this.rotationAngle = 0;\n\n /**\n * Twist of a stylus pointer.\n * @see https://w3c.github.io/pointerevents/#pointerevent-interface\n * @type {number}\n */\n this.twist = 0;\n\n /**\n * Barrel pressure on a stylus pointer.\n * @see https://w3c.github.io/pointerevents/#pointerevent-interface\n * @type {number}\n */\n this.tangentialPressure = 0;\n }\n\n /**\n * The unique identifier of the pointer. It will be the same as `identifier`.\n * @readonly\n * @member {number}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/pointerId\n */\n get pointerId() {\n return this.identifier;\n }\n\n /**\n * Copies properties from normalized event data.\n *\n * @param {Touch|MouseEvent|PointerEvent} event The normalized event data\n * @private\n */\n _copyEvent(event) {\n // isPrimary should only change on touchstart/pointerdown, so we don't want to overwrite\n // it with \"false\" on later events when our shim for it on touch events might not be\n // accurate\n if (event.isPrimary) {\n this.isPrimary = true;\n }\n this.button = event.button;\n this.buttons = event.buttons;\n this.width = event.width;\n this.height = event.height;\n this.tiltX = event.tiltX;\n this.tiltY = event.tiltY;\n this.pointerType = event.pointerType;\n this.pressure = event.pressure;\n this.rotationAngle = event.rotationAngle;\n this.twist = event.twist || 0;\n this.tangentialPressure = event.tangentialPressure || 0;\n }\n\n /**\n * Resets the data for pooling.\n *\n * @private\n */\n _reset() {\n // isPrimary is the only property that we really need to reset - everything else is\n // guaranteed to be overwritten\n this.isPrimary = false;\n }\n}\n\nexport default InteractionData;\n","/**\n * Event class that mimics native DOM events.\n *\n * @class\n */\nclass InteractionEvent {\n /**\n * InteractionEvent constructor\n */\n constructor() {\n /**\n * Whether this event will continue propagating in the tree\n *\n * @member {boolean}\n */\n this.stopped = false;\n\n /**\n * The object which caused this event to be dispatched.\n *\n * @member {Object3D}\n */\n this.target = null;\n\n /**\n * The object whose event listener’s callback is currently being invoked.\n *\n * @member {Object3D}\n */\n this.currentTarget = null;\n\n /**\n * Type of the event\n *\n * @member {string}\n */\n this.type = null;\n\n /**\n * InteractionData related to this event\n *\n * @member {InteractionData}\n */\n this.data = null;\n\n /**\n * ray caster detial from 3d-mesh\n *\n * @member {Intersects}\n */\n this.intersects = [];\n }\n\n /**\n * Prevents event from reaching any objects other than the current object.\n *\n */\n stopPropagation() {\n this.stopped = true;\n }\n\n /**\n * Resets the event.\n *\n * @private\n */\n _reset() {\n this.stopped = false;\n this.currentTarget = null;\n this.target = null;\n this.intersects = [];\n }\n}\n\nexport default InteractionEvent;\n","/**\n * DisplayObjects with the `trackedPointers` property use this class to track interactions\n *\n * @class\n * @private\n */\nexport default class InteractionTrackingData {\n /**\n * @param {number} pointerId - Unique pointer id of the event\n */\n constructor(pointerId) {\n this._pointerId = pointerId;\n this._flags = InteractionTrackingData.FLAGS.NONE;\n }\n\n /**\n *\n * @private\n * @param {number} flag - The interaction flag to set\n * @param {boolean} yn - Should the flag be set or unset\n */\n _doSet(flag, yn) {\n if (yn) {\n this._flags = this._flags | flag;\n } else {\n this._flags = this._flags & (~flag);\n }\n }\n\n /**\n * Unique pointer id of the event\n *\n * @readonly\n * @member {number}\n */\n get pointerId() {\n return this._pointerId;\n }\n\n /**\n * State of the tracking data, expressed as bit flags\n *\n * @member {number}\n */\n get flags() {\n return this._flags;\n }\n\n /**\n * Set the flags for the tracking data\n *\n * @param {number} flags - Flags to set\n */\n set flags(flags) {\n this._flags = flags;\n }\n\n /**\n * Is the tracked event inactive (not over or down)?\n *\n * @member {number}\n */\n get none() {\n return this._flags === this.constructor.FLAGS.NONE;\n }\n\n /**\n * Is the tracked event over the DisplayObject?\n *\n * @member {boolean}\n */\n get over() {\n return (this._flags & this.constructor.FLAGS.OVER) !== 0;\n }\n\n /**\n * Set the over flag\n *\n * @param {boolean} yn - Is the event over?\n */\n set over(yn) {\n this._doSet(this.constructor.FLAGS.OVER, yn);\n }\n\n /**\n * Did the right mouse button come down in the DisplayObject?\n *\n * @member {boolean}\n */\n get rightDown() {\n return (this._flags & this.constructor.FLAGS.RIGHT_DOWN) !== 0;\n }\n\n /**\n * Set the right down flag\n *\n * @param {boolean} yn - Is the right mouse button down?\n */\n set rightDown(yn) {\n this._doSet(this.constructor.FLAGS.RIGHT_DOWN, yn);\n }\n\n /**\n * Did the left mouse button come down in the DisplayObject?\n *\n * @member {boolean}\n */\n get leftDown() {\n return (this._flags & this.constructor.FLAGS.LEFT_DOWN) !== 0;\n }\n\n /**\n * Set the left down flag\n *\n * @param {boolean} yn - Is the left mouse button down?\n */\n set leftDown(yn) {\n this._doSet(this.constructor.FLAGS.LEFT_DOWN, yn);\n }\n}\n\nInteractionTrackingData.FLAGS = Object.freeze({\n NONE: 0,\n OVER: 1 << 0,\n LEFT_DOWN: 1 << 1,\n RIGHT_DOWN: 1 << 2,\n});\n","import '../patch/EventDispatcher';\nimport '../patch/Object3D';\n\nimport { EventDispatcher, Raycaster } from 'three';\nimport InteractionData from './InteractionData';\nimport InteractionEvent from './InteractionEvent';\nimport InteractionTrackingData from './InteractionTrackingData';\n\nconst MOUSE_POINTER_ID = 'MOUSE';\n\n// helpers for hitTest() - only used inside hitTest()\nconst hitTestEvent = {\n target: null,\n data: {\n global: null,\n },\n};\n\n/**\n * The interaction manager deals with mouse, touch and pointer events. Any DisplayObject can be interactive\n * if its interactive parameter is set to true\n * This manager also supports multitouch.\n *\n * reference to [pixi.js](http://www.pixijs.com/) impl\n *\n * @private\n * @class\n * @extends EventDispatcher\n */\nclass InteractionManager extends EventDispatcher {\n /**\n * @param {WebGLRenderer} renderer - A reference to the current renderer\n * @param {Scene} scene - A reference to the current scene\n * @param {Camera} camera - A reference to the current camera\n * @param {Object} [options] - The options for the manager.\n * @param {Boolean} [options.autoPreventDefault=false] - Should the manager automatically prevent default browser actions.\n * @param {Boolean} [options.autoAttach=true] - Should the manager automatically attach target element.\n * @param {Number} [options.interactionFrequency=10] - Frequency increases the interaction events will be checked.\n */\n constructor(renderer, scene, camera, options) {\n super();\n\n options = options || {};\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {WebGLRenderer}\n */\n this.renderer = renderer;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {Scene}\n */\n this.scene = scene;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {Camera}\n */\n this.camera = camera;\n\n /**\n * Should default browser actions automatically be prevented.\n * Does not apply to pointer events for backwards compatibility\n * preventDefault on pointer events stops mouse events from firing\n * Thus, for every pointer event, there will always be either a mouse of touch event alongside it.\n *\n * @member {boolean}\n * @default false\n */\n this.autoPreventDefault = options.autoPreventDefault || false;\n\n /**\n * Frequency in milliseconds that the mousemove, moveover & mouseout interaction events will be checked.\n *\n * @member {number}\n * @default 10\n */\n this.interactionFrequency = options.interactionFrequency || 10;\n\n /**\n * The mouse data\n *\n * @member {InteractionData}\n */\n this.mouse = new InteractionData();\n this.mouse.identifier = MOUSE_POINTER_ID;\n\n // setting the mouse to start off far off screen will mean that mouse over does\n // not get called before we even move the mouse.\n this.mouse.global.set(-999999);\n\n /**\n * Actively tracked InteractionData\n *\n * @private\n * @member {Object.}\n */\n this.activeInteractionData = {};\n this.activeInteractionData[MOUSE_POINTER_ID] = this.mouse;\n\n /**\n * Pool of unused InteractionData\n *\n * @private\n * @member {InteractionData[]}\n */\n this.interactionDataPool = [];\n\n /**\n * An event data object to handle all the event tracking/dispatching\n *\n * @member {object}\n */\n this.eventData = new InteractionEvent();\n\n /**\n * The DOM element to bind to.\n *\n * @private\n * @member {HTMLElement}\n */\n this.interactionDOMElement = null;\n\n /**\n * This property determines if mousemove and touchmove events are fired only when the cursor\n * is over the object.\n * Setting to true will make things work more in line with how the DOM verison works.\n * Setting to false can make things easier for things like dragging\n * It is currently set to false as this is how three.js used to work.\n *\n * @member {boolean}\n * @default true\n */\n this.moveWhenInside = true;\n\n /**\n * Have events been attached to the dom element?\n *\n * @private\n * @member {boolean}\n */\n this.eventsAdded = false;\n\n /**\n * Is the mouse hovering over the renderer?\n *\n * @private\n * @member {boolean}\n */\n this.mouseOverRenderer = false;\n\n /**\n * Does the device support touch events\n * https://www.w3.org/TR/touch-events/\n *\n * @readonly\n * @member {boolean}\n */\n this.supportsTouchEvents = 'ontouchstart' in window;\n\n /**\n * Does the device support pointer events\n * https://www.w3.org/Submission/pointer-events/\n *\n * @readonly\n * @member {boolean}\n */\n this.supportsPointerEvents = !!window.PointerEvent;\n\n // this will make it so that you don't have to call bind all the time\n\n /**\n * @private\n * @member {Function}\n */\n this.onClick = this.onClick.bind(this);\n this.processClick = this.processClick.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerUp = this.onPointerUp.bind(this);\n this.processPointerUp = this.processPointerUp.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerCancel = this.onPointerCancel.bind(this);\n this.processPointerCancel = this.processPointerCancel.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerDown = this.onPointerDown.bind(this);\n this.processPointerDown = this.processPointerDown.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerMove = this.onPointerMove.bind(this);\n this.processPointerMove = this.processPointerMove.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerOut = this.onPointerOut.bind(this);\n this.processPointerOverOut = this.processPointerOverOut.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerOver = this.onPointerOver.bind(this);\n\n /**\n * Dictionary of how different cursor modes are handled. Strings are handled as CSS cursor\n * values, objects are handled as dictionaries of CSS values for interactionDOMElement,\n * and functions are called instead of changing the CSS.\n * Default CSS cursor values are provided for 'default' and 'pointer' modes.\n * @member {Object.)>}\n */\n this.cursorStyles = {\n default: 'inherit',\n pointer: 'pointer',\n };\n\n /**\n * The mode of the cursor that is being used.\n * The value of this is a key from the cursorStyles dictionary.\n *\n * @member {string}\n */\n this.currentCursorMode = null;\n\n /**\n * Internal cached let.\n *\n * @private\n * @member {string}\n */\n this.cursor = null;\n\n /**\n * ray caster, for survey intersects from 3d-scene\n *\n * @private\n * @member {Raycaster}\n */\n this.raycaster = new Raycaster();\n\n /**\n * snippet time\n *\n * @private\n * @member {Number}\n */\n this._deltaTime = 0;\n\n this.setTargetElement(this.renderer.domElement);\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed on the display\n * object.\n *\n * @event InteractionManager#mousedown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * on the display object.\n *\n * @event InteractionManager#rightdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released over the display\n * object.\n *\n * @event InteractionManager#mouseup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * over the display object.\n *\n * @event InteractionManager#rightup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed and released on\n * the display object.\n *\n * @event InteractionManager#click\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * and released on the display object.\n *\n * @event InteractionManager#rightclick\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released outside the\n * display object that initially registered a\n * [mousedown]{@link InteractionManager#event:mousedown}.\n *\n * @event InteractionManager#mouseupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * outside the display object that initially registered a\n * [rightdown]{@link InteractionManager#event:rightdown}.\n *\n * @event InteractionManager#rightupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved while over the display object\n *\n * @event InteractionManager#mousemove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved onto the display object\n *\n * @event InteractionManager#mouseover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved off the display object\n *\n * @event InteractionManager#mouseout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed on the display object.\n *\n * @event InteractionManager#pointerdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released over the display object.\n *\n * @event InteractionManager#pointerup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a pointer event\n *\n * @event InteractionManager#pointercancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed and released on the display object.\n *\n * @event InteractionManager#pointertap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released outside the display object that initially\n * registered a [pointerdown]{@link InteractionManager#event:pointerdown}.\n *\n * @event InteractionManager#pointerupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved while over the display object\n *\n * @event InteractionManager#pointermove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved onto the display object\n *\n * @event InteractionManager#pointerover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved off the display object\n *\n * @event InteractionManager#pointerout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed on the display object.\n *\n * @event InteractionManager#touchstart\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed from the display object.\n *\n * @event InteractionManager#touchend\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a touch\n *\n * @event InteractionManager#touchcancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed and removed from the display object.\n *\n * @event InteractionManager#tap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed outside of the display object that initially\n * registered a [touchstart]{@link InteractionManager#event:touchstart}.\n *\n * @event InteractionManager#touchendoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is moved along the display object.\n *\n * @event InteractionManager#touchmove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed on the display.\n * object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mousedown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * on the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released over the display\n * object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * over the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed and released on\n * the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#click\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * and released on the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightclick\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released outside the\n * display object that initially registered a\n * [mousedown]{@link Object3D#event:mousedown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * outside the display object that initially registered a\n * [rightdown]{@link Object3D#event:rightdown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved while over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mousemove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved onto the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved off the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a pointer event.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointercancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed and released on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointertap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released outside the display object that initially\n * registered a [pointerdown]{@link Object3D#event:pointerdown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved while over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointermove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved onto the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved off the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchstart\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed from the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchend\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a touch.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchcancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed and removed from the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#tap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed outside of the display object that initially\n * registered a [touchstart]{@link Object3D#event:touchstart}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchendoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is moved along the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchmove\n * @param {InteractionEvent} event - Interaction event\n */\n }\n\n /**\n * Hit tests a point against the display tree, returning the first interactive object that is hit.\n *\n * @param {Point} globalPoint - A point to hit test with, in global space.\n * @param {Object3D} [root] - The root display object to start from. If omitted, defaults\n * to the last rendered root of the associated renderer.\n * @return {Object3D} The hit display object, if any.\n */\n hitTest(globalPoint, root) {\n // clear the target for our hit test\n hitTestEvent.target = null;\n // assign the global point\n hitTestEvent.data.global = globalPoint;\n // ensure safety of the root\n if (!root) {\n root = this.scene;\n }\n // run the hit test\n this.processInteractive(hitTestEvent, root, null, true);\n // return our found object - it'll be null if we didn't hit anything\n\n return hitTestEvent.target;\n }\n\n /**\n * Sets the DOM element which will receive mouse/touch events. This is useful for when you have\n * other DOM elements on top of the renderers Canvas element. With this you'll be bale to deletegate\n * another DOM element to receive those events.\n *\n * @param {HTMLCanvasElement} element - the DOM element which will receive mouse and touch events.\n */\n setTargetElement(element) {\n this.removeEvents();\n\n this.interactionDOMElement = element;\n\n this.addEvents();\n }\n\n /**\n * Registers all the DOM events\n *\n * @private\n */\n addEvents() {\n if (!this.interactionDOMElement || this.eventsAdded) {\n return;\n }\n\n this.emit('addevents');\n\n this.interactionDOMElement.addEventListener('click', this.onClick, true);\n\n if (window.navigator.msPointerEnabled) {\n this.interactionDOMElement.style['-ms-content-zooming'] = 'none';\n this.interactionDOMElement.style['-ms-touch-action'] = 'none';\n } else if (this.supportsPointerEvents) {\n this.interactionDOMElement.style['touch-action'] = 'none';\n }\n\n /**\n * These events are added first, so that if pointer events are normalised, they are fired\n * in the same order as non-normalised events. ie. pointer event 1st, mouse / touch 2nd\n */\n if (this.supportsPointerEvents) {\n window.document.addEventListener('pointermove', this.onPointerMove, true);\n this.interactionDOMElement.addEventListener('pointerdown', this.onPointerDown, true);\n // pointerout is fired in addition to pointerup (for touch events) and pointercancel\n // we already handle those, so for the purposes of what we do in onPointerOut, we only\n // care about the pointerleave event\n this.interactionDOMElement.addEventListener('pointerleave', this.onPointerOut, true);\n this.interactionDOMElement.addEventListener('pointerover', this.onPointerOver, true);\n window.addEventListener('pointercancel', this.onPointerCancel, true);\n window.addEventListener('pointerup', this.onPointerUp, true);\n } else {\n window.document.addEventListener('mousemove', this.onPointerMove, true);\n this.interactionDOMElement.addEventListener('mousedown', this.onPointerDown, true);\n this.interactionDOMElement.addEventListener('mouseout', this.onPointerOut, true);\n this.interactionDOMElement.addEventListener('mouseover', this.onPointerOver, true);\n window.addEventListener('mouseup', this.onPointerUp, true);\n }\n\n // always look directly for touch events so that we can provide original data\n // In a future version we should change this to being just a fallback and rely solely on\n // PointerEvents whenever available\n if (this.supportsTouchEvents) {\n this.interactionDOMElement.addEventListener('touchstart', this.onPointerDown, true);\n this.interactionDOMElement.addEventListener('touchcancel', this.onPointerCancel, true);\n this.interactionDOMElement.addEventListener('touchend', this.onPointerUp, true);\n this.interactionDOMElement.addEventListener('touchmove', this.onPointerMove, true);\n }\n\n this.eventsAdded = true;\n }\n\n /**\n * Removes all the DOM events that were previously registered\n *\n * @private\n */\n removeEvents() {\n if (!this.interactionDOMElement) {\n return;\n }\n\n this.emit('removeevents');\n\n this.interactionDOMElement.removeEventListener('click', this.onClick, true);\n\n if (window.navigator.msPointerEnabled) {\n this.interactionDOMElement.style['-ms-content-zooming'] = '';\n this.interactionDOMElement.style['-ms-touch-action'] = '';\n } else if (this.supportsPointerEvents) {\n this.interactionDOMElement.style['touch-action'] = '';\n }\n\n if (this.supportsPointerEvents) {\n window.document.removeEventListener('pointermove', this.onPointerMove, true);\n this.interactionDOMElement.removeEventListener('pointerdown', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('pointerleave', this.onPointerOut, true);\n this.interactionDOMElement.removeEventListener('pointerover', this.onPointerOver, true);\n window.removeEventListener('pointercancel', this.onPointerCancel, true);\n window.removeEventListener('pointerup', this.onPointerUp, true);\n } else {\n window.document.removeEventListener('mousemove', this.onPointerMove, true);\n this.interactionDOMElement.removeEventListener('mousedown', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('mouseout', this.onPointerOut, true);\n this.interactionDOMElement.removeEventListener('mouseover', this.onPointerOver, true);\n window.removeEventListener('mouseup', this.onPointerUp, true);\n }\n\n if (this.supportsTouchEvents) {\n this.interactionDOMElement.removeEventListener('touchstart', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('touchcancel', this.onPointerCancel, true);\n this.interactionDOMElement.removeEventListener('touchend', this.onPointerUp, true);\n this.interactionDOMElement.removeEventListener('touchmove', this.onPointerMove, true);\n }\n\n this.interactionDOMElement = null;\n\n this.eventsAdded = false;\n }\n\n /**\n * Updates the state of interactive objects.\n * Invoked by a throttled ticker.\n *\n * @param {number} deltaTime - time delta since last tick\n */\n update({ snippet }) {\n this._deltaTime += snippet;\n\n if (this._deltaTime < this.interactionFrequency) {\n return;\n }\n\n this._deltaTime = 0;\n\n if (!this.interactionDOMElement) {\n return;\n }\n\n // if the user move the mouse this check has already been done using the mouse move!\n if (this.didMove) {\n this.didMove = false;\n\n return;\n }\n\n this.cursor = null;\n\n // Resets the flag as set by a stopPropagation call. This flag is usually reset by a user interaction of any kind,\n // but there was a scenario of a display object moving under a static mouse cursor.\n // In this case, mouseover and mouseevents would not pass the flag test in triggerEvent function\n for (const k in this.activeInteractionData) {\n // eslint-disable-next-line no-prototype-builtins\n if (this.activeInteractionData.hasOwnProperty(k)) {\n const interactionData = this.activeInteractionData[k];\n\n if (interactionData.originalEvent && interactionData.pointerType !== 'touch') {\n const interactionEvent = this.configureInteractionEventForDOMEvent(\n this.eventData,\n interactionData.originalEvent,\n interactionData\n );\n\n this.processInteractive(\n interactionEvent,\n this.scene,\n this.processPointerOverOut,\n true\n );\n }\n }\n }\n\n this.setCursorMode(this.cursor);\n\n // TODO\n }\n\n /**\n * Sets the current cursor mode, handling any callbacks or CSS style changes.\n *\n * @param {string} mode - cursor mode, a key from the cursorStyles dictionary\n */\n setCursorMode(mode) {\n mode = mode || 'default';\n // if the mode didn't actually change, bail early\n if (this.currentCursorMode === mode) {\n return;\n }\n this.currentCursorMode = mode;\n const style = this.cursorStyles[mode];\n\n // only do things if there is a cursor style for it\n if (style) {\n switch (typeof style) {\n case 'string':\n // string styles are handled as cursor CSS\n this.interactionDOMElement.style.cursor = style;\n break;\n case 'function':\n // functions are just called, and passed the cursor mode\n style(mode);\n break;\n case 'object':\n // if it is an object, assume that it is a dictionary of CSS styles,\n // apply it to the interactionDOMElement\n Object.assign(this.interactionDOMElement.style, style);\n break;\n default:\n break;\n }\n } else if (typeof mode === 'string' && !Object.prototype.hasOwnProperty.call(this.cursorStyles, mode)) {\n // if it mode is a string (not a Symbol) and cursorStyles doesn't have any entry\n // for the mode, then assume that the dev wants it to be CSS for the cursor.\n this.interactionDOMElement.style.cursor = mode;\n }\n }\n\n /**\n * Dispatches an event on the display object that was interacted with\n *\n * @param {Object3D} displayObject - the display object in question\n * @param {string} eventString - the name of the event (e.g, mousedown)\n * @param {object} eventData - the event data object\n * @private\n */\n triggerEvent(displayObject, eventString, eventData) {\n if (!eventData.stopped) {\n eventData.currentTarget = displayObject;\n eventData.type = eventString;\n\n displayObject.emit(eventString, eventData);\n\n if (displayObject[eventString]) {\n displayObject[eventString](eventData);\n }\n }\n }\n\n /**\n * This function is provides a neat way of crawling through the scene graph and running a\n * specified function on all interactive objects it finds. It will also take care of hit\n * testing the interactive objects and passes the hit across in the function.\n *\n * @private\n * @param {InteractionEvent} interactionEvent - event containing the point that\n * is tested for collision\n * @param {Object3D} displayObject - the displayObject\n * that will be hit test (recursively crawls its children)\n * @param {Function} [func] - the function that will be called on each interactive object. The\n * interactionEvent, displayObject and hit will be passed to the function\n * @param {boolean} [hitTest] - this indicates if the objects inside should be hit test against the point\n * @param {boolean} [interactive] - Whether the displayObject is interactive\n * @return {boolean} returns true if the displayObject hit the point\n */\n processInteractive(interactionEvent, displayObject, func, hitTest, interactive) {\n if (!displayObject || !displayObject.visible) {\n return false;\n }\n\n // Took a little while to rework this function correctly! But now it is done and nice and optimised. ^_^\n //\n // This function will now loop through all objects and then only hit test the objects it HAS\n // to, not all of them. MUCH faster..\n // An object will be hit test if the following is true:\n //\n // 1: It is interactive.\n // 2: It belongs to a parent that is interactive AND one of the parents children have not already been hit.\n //\n // As another little optimisation once an interactive object has been hit we can carry on\n // through the scenegraph, but we know that there will be no more hits! So we can avoid extra hit tests\n // A final optimisation is that an object is not hit test directly if a child has already been hit.\n\n interactive = displayObject.interactive || interactive;\n\n let hit = false;\n let interactiveParent = interactive;\n\n if (displayObject.interactiveChildren && displayObject.children) {\n const children = displayObject.children;\n\n for (let i = children.length - 1; i >= 0; i--) {\n const child = children[i];\n\n // time to get recursive.. if this function will return if something is hit..\n const childHit = this.processInteractive(interactionEvent, child, func, hitTest, interactiveParent);\n\n if (childHit) {\n // its a good idea to check if a child has lost its parent.\n // this means it has been removed whilst looping so its best\n if (!child.parent) {\n continue;\n }\n\n // we no longer need to hit test any more objects in this container as we we\n // now know the parent has been hit\n interactiveParent = false;\n\n // If the child is interactive , that means that the object hit was actually\n // interactive and not just the child of an interactive object.\n // This means we no longer need to hit test anything else. We still need to run\n // through all objects, but we don't need to perform any hit tests.\n\n if (childHit) {\n if (interactionEvent.target) {\n hitTest = false;\n }\n hit = true;\n }\n }\n }\n }\n\n // no point running this if the item is not interactive or does not have an interactive parent.\n if (interactive) {\n // if we are hit testing (as in we have no hit any objects yet)\n // We also don't need to worry about hit testing if once of the displayObjects children\n // has already been hit - but only if it was interactive, otherwise we need to keep\n // looking for an interactive child, just in case we hit one\n if (hitTest && !interactionEvent.target) {\n if (interactionEvent.intersects[0] && interactionEvent.intersects[0].object === displayObject) {\n hit = true;\n }\n }\n\n if (displayObject.interactive) {\n if (hit && !interactionEvent.target) {\n interactionEvent.data.target = interactionEvent.target = displayObject;\n }\n\n if (func) {\n func(interactionEvent, displayObject, !!hit);\n }\n }\n }\n\n return hit;\n }\n\n\n /**\n * Is called when the click is pressed down on the renderer element\n *\n * @private\n * @param {MouseEvent} originalEvent - The DOM event of a click being pressed down\n */\n onClick(originalEvent) {\n if (originalEvent.type !== 'click') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n if (this.autoPreventDefault && events[0].isNormalized) {\n originalEvent.preventDefault();\n }\n\n const interactionData = this.getInteractionDataForPointerId(events[0]);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, events[0], interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n this.processInteractive(interactionEvent, this.scene, this.processClick, true);\n\n this.emit('click', interactionEvent);\n }\n\n /**\n * Processes the result of the click check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processClick(interactionEvent, displayObject, hit) {\n if (hit) {\n this.triggerEvent(displayObject, 'click', interactionEvent);\n }\n }\n\n /**\n * Is called when the pointer button is pressed down on the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being pressed down\n */\n onPointerDown(originalEvent) {\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n /**\n * No need to prevent default on natural pointer events, as there are no side effects\n * Normalized events, however, may have the double mousedown/touchstart issue on the native android browser,\n * so still need to be prevented.\n */\n\n // Guaranteed that there will be at least one event in events, and all events must have the same pointer type\n\n if (this.autoPreventDefault && events[0].isNormalized) {\n originalEvent.preventDefault();\n }\n\n const eventLen = events.length;\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n this.processInteractive(interactionEvent, this.scene, this.processPointerDown, true);\n\n this.emit('pointerdown', interactionEvent);\n if (event.pointerType === 'touch') {\n this.emit('touchstart', interactionEvent);\n } else if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n const isRightButton = event.button === 2;\n\n this.emit(isRightButton ? 'rightdown' : 'mousedown', this.eventData);\n }\n }\n }\n\n /**\n * Processes the result of the pointer down check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerDown(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n const id = interactionEvent.data.identifier;\n\n if (hit) {\n if (!displayObject.trackedPointers[id]) {\n displayObject.trackedPointers[id] = new InteractionTrackingData(id);\n }\n this.triggerEvent(displayObject, 'pointerdown', interactionEvent);\n\n if (data.pointerType === 'touch') {\n displayObject.started = true;\n this.triggerEvent(displayObject, 'touchstart', interactionEvent);\n } else if (data.pointerType === 'mouse' || data.pointerType === 'pen') {\n const isRightButton = data.button === 2;\n\n if (isRightButton) {\n displayObject.trackedPointers[id].rightDown = true;\n } else {\n displayObject.trackedPointers[id].leftDown = true;\n }\n\n this.triggerEvent(displayObject, isRightButton ? 'rightdown' : 'mousedown', interactionEvent);\n }\n }\n }\n\n /**\n * Is called when the pointer button is released on the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being released\n * @param {boolean} cancelled - true if the pointer is cancelled\n * @param {Function} func - Function passed to {@link processInteractive}\n */\n onPointerComplete(originalEvent, cancelled, func) {\n const events = this.normalizeToPointerData(originalEvent);\n\n const eventLen = events.length;\n\n // if the event wasn't targeting our canvas, then consider it to be pointerupoutside\n // in all cases (unless it was a pointercancel)\n const eventAppend = originalEvent.target !== this.interactionDOMElement ? 'outside' : '';\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n // perform hit testing for events targeting our canvas or cancel events\n this.processInteractive(interactionEvent, this.scene, func, cancelled || !eventAppend);\n\n this.emit(cancelled ? 'pointercancel' : `pointerup${eventAppend}`, interactionEvent);\n\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n const isRightButton = event.button === 2;\n\n this.emit(isRightButton ? `rightup${eventAppend}` : `mouseup${eventAppend}`, interactionEvent);\n } else if (event.pointerType === 'touch') {\n this.emit(cancelled ? 'touchcancel' : `touchend${eventAppend}`, interactionEvent);\n this.releaseInteractionDataForPointerId(event.pointerId, interactionData);\n }\n }\n }\n\n /**\n * Is called when the pointer button is cancelled\n *\n * @private\n * @param {PointerEvent} event - The DOM event of a pointer button being released\n */\n onPointerCancel(event) {\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && event.pointerType === 'touch') return;\n\n this.onPointerComplete(event, true, this.processPointerCancel);\n }\n\n /**\n * Processes the result of the pointer cancel check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n */\n processPointerCancel(interactionEvent, displayObject) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n if (displayObject.trackedPointers[id] !== undefined) {\n delete displayObject.trackedPointers[id];\n this.triggerEvent(displayObject, 'pointercancel', interactionEvent);\n\n if (data.pointerType === 'touch') {\n this.triggerEvent(displayObject, 'touchcancel', interactionEvent);\n }\n }\n }\n\n /**\n * Is called when the pointer button is released on the renderer element\n *\n * @private\n * @param {PointerEvent} event - The DOM event of a pointer button being released\n */\n onPointerUp(event) {\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && event.pointerType === 'touch') return;\n\n this.onPointerComplete(event, false, this.processPointerUp);\n }\n\n /**\n * Processes the result of the pointer up check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerUp(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n const trackingData = displayObject.trackedPointers[id];\n\n const isTouch = data.pointerType === 'touch';\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n // Mouse only\n if (isMouse) {\n const isRightButton = data.button === 2;\n\n const flags = InteractionTrackingData.FLAGS;\n\n const test = isRightButton ? flags.RIGHT_DOWN : flags.LEFT_DOWN;\n\n const isDown = trackingData !== undefined && (trackingData.flags & test);\n\n if (hit) {\n this.triggerEvent(displayObject, isRightButton ? 'rightup' : 'mouseup', interactionEvent);\n\n if (isDown) {\n this.triggerEvent(displayObject, isRightButton ? 'rightclick' : 'leftclick', interactionEvent);\n }\n } else if (isDown) {\n this.triggerEvent(displayObject, isRightButton ? 'rightupoutside' : 'mouseupoutside', interactionEvent);\n }\n // update the down state of the tracking data\n if (trackingData) {\n if (isRightButton) {\n trackingData.rightDown = false;\n } else {\n trackingData.leftDown = false;\n }\n }\n }\n\n // Pointers and Touches, and Mouse\n if (isTouch && displayObject.started) {\n displayObject.started = false;\n this.triggerEvent(displayObject, 'touchend', interactionEvent);\n }\n if (hit) {\n this.triggerEvent(displayObject, 'pointerup', interactionEvent);\n\n if (trackingData) {\n this.triggerEvent(displayObject, 'pointertap', interactionEvent);\n if (isTouch) {\n this.triggerEvent(displayObject, 'tap', interactionEvent);\n // touches are no longer over (if they ever were) when we get the touchend\n // so we should ensure that we don't keep pretending that they are\n trackingData.over = false;\n }\n }\n } else if (trackingData) {\n this.triggerEvent(displayObject, 'pointerupoutside', interactionEvent);\n if (isTouch) this.triggerEvent(displayObject, 'touchendoutside', interactionEvent);\n }\n // Only remove the tracking data if there is no over/down state still associated with it\n if (trackingData && trackingData.none) {\n delete displayObject.trackedPointers[id];\n }\n }\n\n /**\n * Is called when the pointer moves across the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer moving\n */\n onPointerMove(originalEvent) {\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n if (events[0].pointerType === 'mouse') {\n this.didMove = true;\n\n this.cursor = null;\n }\n\n const eventLen = events.length;\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n const interactive = event.pointerType === 'touch' ? this.moveWhenInside : true;\n\n this.processInteractive(\n interactionEvent,\n this.scene,\n this.processPointerMove,\n interactive\n );\n this.emit('pointermove', interactionEvent);\n if (event.pointerType === 'touch') this.emit('touchmove', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') this.emit('mousemove', interactionEvent);\n }\n\n if (events[0].pointerType === 'mouse') {\n this.setCursorMode(this.cursor);\n\n // TODO BUG for parents interactive object (border order issue)\n }\n }\n\n /**\n * Processes the result of the pointer move check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerMove(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const isTouch = data.pointerType === 'touch';\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n if (isMouse) {\n this.processPointerOverOut(interactionEvent, displayObject, hit);\n }\n\n if (isTouch && displayObject.started) this.triggerEvent(displayObject, 'touchmove', interactionEvent);\n if (!this.moveWhenInside || hit) {\n this.triggerEvent(displayObject, 'pointermove', interactionEvent);\n if (isMouse) this.triggerEvent(displayObject, 'mousemove', interactionEvent);\n }\n }\n\n /**\n * Is called when the pointer is moved out of the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer being moved out\n */\n onPointerOut(originalEvent) {\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n // Only mouse and pointer can call onPointerOut, so events will always be length 1\n const event = events[0];\n\n if (event.pointerType === 'mouse') {\n this.mouseOverRenderer = false;\n this.setCursorMode(null);\n }\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = event;\n\n this.processInteractive(interactionEvent, this.scene, this.processPointerOverOut, false);\n\n this.emit('pointerout', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n this.emit('mouseout', interactionEvent);\n } else {\n // we can get touchleave events after touchend, so we want to make sure we don't\n // introduce memory leaks\n this.releaseInteractionDataForPointerId(interactionData.identifier);\n }\n }\n\n /**\n * Processes the result of the pointer over/out check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerOverOut(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n let trackingData = displayObject.trackedPointers[id];\n\n // if we just moused over the display object, then we need to track that state\n if (hit && !trackingData) {\n trackingData = displayObject.trackedPointers[id] = new InteractionTrackingData(id);\n }\n\n if (trackingData === undefined) return;\n\n if (hit && this.mouseOverRenderer) {\n if (!trackingData.over) {\n trackingData.over = true;\n this.triggerEvent(displayObject, 'pointerover', interactionEvent);\n if (isMouse) {\n this.triggerEvent(displayObject, 'mouseover', interactionEvent);\n }\n }\n\n // only change the cursor if it has not already been changed (by something deeper in the\n // display tree)\n if (isMouse && this.cursor === null) {\n this.cursor = displayObject.cursor;\n }\n } else if (trackingData.over) {\n trackingData.over = false;\n this.triggerEvent(displayObject, 'pointerout', this.eventData);\n if (isMouse) {\n this.triggerEvent(displayObject, 'mouseout', interactionEvent);\n }\n // if there is no mouse down information for the pointer, then it is safe to delete\n if (trackingData.none) {\n delete displayObject.trackedPointers[id];\n }\n }\n }\n\n /**\n * Is called when the pointer is moved into the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being moved into the renderer view\n */\n onPointerOver(originalEvent) {\n const events = this.normalizeToPointerData(originalEvent);\n\n // Only mouse and pointer can call onPointerOver, so events will always be length 1\n const event = events[0];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = event;\n\n if (event.pointerType === 'mouse') {\n this.mouseOverRenderer = true;\n }\n\n this.emit('pointerover', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n this.emit('mouseover', interactionEvent);\n }\n }\n\n /**\n * Get InteractionData for a given pointerId. Store that data as well\n *\n * @private\n * @param {PointerEvent} event - Normalized pointer event, output from normalizeToPointerData\n * @return {InteractionData} - Interaction data for the given pointer identifier\n */\n getInteractionDataForPointerId(event) {\n const pointerId = event.pointerId;\n\n let interactionData;\n\n if (pointerId === MOUSE_POINTER_ID || event.pointerType === 'mouse') {\n interactionData = this.mouse;\n } else if (this.activeInteractionData[pointerId]) {\n interactionData = this.activeInteractionData[pointerId];\n } else {\n interactionData = this.interactionDataPool.pop() || new InteractionData();\n interactionData.identifier = pointerId;\n this.activeInteractionData[pointerId] = interactionData;\n }\n // copy properties from the event, so that we can make sure that touch/pointer specific\n // data is available\n interactionData._copyEvent(event);\n\n return interactionData;\n }\n\n /**\n * Return unused InteractionData to the pool, for a given pointerId\n *\n * @private\n * @param {number} pointerId - Identifier from a pointer event\n */\n releaseInteractionDataForPointerId(pointerId) {\n const interactionData = this.activeInteractionData[pointerId];\n\n if (interactionData) {\n delete this.activeInteractionData[pointerId];\n interactionData._reset();\n this.interactionDataPool.push(interactionData);\n }\n }\n\n /**\n * Maps x and y coords from a DOM object and maps them correctly to the three.js view. The\n * resulting value is stored in the point. This takes into account the fact that the DOM\n * element could be scaled and positioned anywhere on the screen.\n *\n * @param {Vector2} point - the point that the result will be stored in\n * @param {number} x - the x coord of the position to map\n * @param {number} y - the y coord of the position to map\n */\n mapPositionToPoint(point, x, y) {\n let rect;\n\n // IE 11 fix\n if (!this.interactionDOMElement.parentElement) {\n rect = {\n x: 0,\n y: 0,\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n };\n } else {\n rect = this.interactionDOMElement.getBoundingClientRect();\n }\n\n point.x = ((x - rect.left) / rect.width) * 2 - 1;\n point.y = -((y - rect.top) / rect.height) * 2 + 1;\n }\n\n /**\n * Configure an InteractionEvent to wrap a DOM PointerEvent and InteractionData\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The event to be configured\n * @param {PointerEvent} pointerEvent - The DOM event that will be paired with the InteractionEvent\n * @param {InteractionData} interactionData - The InteractionData that will be paired\n * with the InteractionEvent\n * @return {InteractionEvent} the interaction event that was passed in\n */\n configureInteractionEventForDOMEvent(interactionEvent, pointerEvent, interactionData) {\n interactionEvent.data = interactionData;\n\n this.mapPositionToPoint(interactionData.global, pointerEvent.clientX, pointerEvent.clientY);\n\n this.raycaster.setFromCamera(interactionData.global, this.camera);\n\n // Not really sure why this is happening, but it's how a previous version handled things TODO: there should be remove\n if (pointerEvent.pointerType === 'touch') {\n pointerEvent.globalX = interactionData.global.x;\n pointerEvent.globalY = interactionData.global.y;\n }\n\n interactionData.originalEvent = pointerEvent;\n interactionEvent._reset();\n interactionEvent.intersects = this.raycaster.intersectObjects(this.scene.children, true);\n\n return interactionEvent;\n }\n\n /**\n * Ensures that the original event object contains all data that a regular pointer event would have\n *\n * @private\n * @param {TouchEvent|MouseEvent|PointerEvent} event - The original event data from a touch or mouse event\n * @return {PointerEvent[]} An array containing a single normalized pointer event, in the case of a pointer\n * or mouse event, or a multiple normalized pointer events if there are multiple changed touches\n */\n normalizeToPointerData(event) {\n const normalizedEvents = [];\n\n if (this.supportsTouchEvents && event instanceof TouchEvent) {\n for (let i = 0, li = event.changedTouches.length; i < li; i++) {\n const touch = event.changedTouches[i];\n\n if (typeof touch.button === 'undefined') touch.button = event.touches.length ? 1 : 0;\n if (typeof touch.buttons === 'undefined') touch.buttons = event.touches.length ? 1 : 0;\n if (typeof touch.isPrimary === 'undefined') {\n touch.isPrimary = event.touches.length === 1 && event.type === 'touchstart';\n }\n if (typeof touch.width === 'undefined') touch.width = touch.radiusX || 1;\n if (typeof touch.height === 'undefined') touch.height = touch.radiusY || 1;\n if (typeof touch.tiltX === 'undefined') touch.tiltX = 0;\n if (typeof touch.tiltY === 'undefined') touch.tiltY = 0;\n if (typeof touch.pointerType === 'undefined') touch.pointerType = 'touch';\n if (typeof touch.pointerId === 'undefined') touch.pointerId = touch.identifier || 0;\n if (typeof touch.pressure === 'undefined') touch.pressure = touch.force || 0.5;\n touch.twist = 0;\n touch.tangentialPressure = 0;\n // TODO: Remove these, as layerX/Y is not a standard, is deprecated, has uneven\n // support, and the fill ins are not quite the same\n // offsetX/Y might be okay, but is not the same as clientX/Y when the canvas's top\n // left is not 0,0 on the page\n if (typeof touch.layerX === 'undefined') touch.layerX = touch.offsetX = touch.clientX;\n if (typeof touch.layerY === 'undefined') touch.layerY = touch.offsetY = touch.clientY;\n\n // mark the touch as normalized, just so that we know we did it\n touch.isNormalized = true;\n\n normalizedEvents.push(touch);\n }\n } else if (event instanceof MouseEvent && (!this.supportsPointerEvents || !(event instanceof window.PointerEvent))) {\n if (typeof event.isPrimary === 'undefined') event.isPrimary = true;\n if (typeof event.width === 'undefined') event.width = 1;\n if (typeof event.height === 'undefined') event.height = 1;\n if (typeof event.tiltX === 'undefined') event.tiltX = 0;\n if (typeof event.tiltY === 'undefined') event.tiltY = 0;\n if (typeof event.pointerType === 'undefined') event.pointerType = 'mouse';\n if (typeof event.pointerId === 'undefined') event.pointerId = MOUSE_POINTER_ID;\n if (typeof event.pressure === 'undefined') event.pressure = 0.5;\n event.twist = 0;\n event.tangentialPressure = 0;\n\n // mark the mouse event as normalized, just so that we know we did it\n event.isNormalized = true;\n\n normalizedEvents.push(event);\n } else {\n normalizedEvents.push(event);\n }\n\n return normalizedEvents;\n }\n\n /**\n * Destroys the interaction manager\n *\n */\n destroy() {\n this.removeEvents();\n\n this.removeAllListeners();\n\n this.renderer = null;\n\n this.mouse = null;\n\n this.eventData = null;\n\n this.interactionDOMElement = null;\n\n this.onPointerDown = null;\n this.processPointerDown = null;\n\n this.onPointerUp = null;\n this.processPointerUp = null;\n\n this.onPointerCancel = null;\n this.processPointerCancel = null;\n\n this.onPointerMove = null;\n this.processPointerMove = null;\n\n this.onPointerOut = null;\n this.processPointerOverOut = null;\n\n this.onPointerOver = null;\n\n this._tempPoint = null;\n }\n}\n\nexport default InteractionManager;\n","import '../patch/EventDispatcher';\nimport '../patch/Object3D';\n\nimport { EventDispatcher, Raycaster } from 'three';\nimport InteractionData from './InteractionData';\nimport InteractionEvent from './InteractionEvent';\nimport InteractionTrackingData from './InteractionTrackingData';\n\nconst MOUSE_POINTER_ID = 'MOUSE';\n\n// helpers for hitTest() - only used inside hitTest()\nconst hitTestEvent = {\n target: null,\n data: {\n global: null,\n },\n};\n\n/**\n * The interaction manager deals with mouse, touch and pointer events. Any DisplayObject can be interactive\n * if its interactive parameter is set to true\n * This manager also supports multitouch.\n *\n * reference to [pixi.js](http://www.pixijs.com/) impl\n *\n * @private\n * @class\n * @extends EventDispatcher\n */\nclass InteractionLayer extends EventDispatcher {\n /**\n * @param {WebGLRenderer} renderer - A reference to the current renderer\n * @param {Object} [options] - The options for the manager.\n * @param {Boolean} [options.autoPreventDefault=false] - Should the manager automatically prevent default browser actions.\n * @param {Boolean} [options.autoAttach=true] - Should the manager automatically attach target element.\n * @param {Number} [options.interactionFrequency=10] - Frequency increases the interaction events will be checked.\n */\n constructor(renderer, options) {\n super();\n\n options = options || {};\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {WebGLRenderer}\n */\n this.renderer = renderer;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {Layer}\n */\n this.layer = null;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {Scene}\n */\n // this.scene = scene;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {Camera}\n */\n // this.camera = camera;\n\n /**\n * Should default browser actions automatically be prevented.\n * Does not apply to pointer events for backwards compatibility\n * preventDefault on pointer events stops mouse events from firing\n * Thus, for every pointer event, there will always be either a mouse of touch event alongside it.\n *\n * @member {boolean}\n * @default false\n */\n this.autoPreventDefault = options.autoPreventDefault || false;\n\n /**\n * Frequency in milliseconds that the mousemove, moveover & mouseout interaction events will be checked.\n *\n * @member {number}\n * @default 10\n */\n this.interactionFrequency = options.interactionFrequency || 10;\n\n /**\n * The mouse data\n *\n * @member {InteractionData}\n */\n this.mouse = new InteractionData();\n this.mouse.identifier = MOUSE_POINTER_ID;\n\n // setting the mouse to start off far off screen will mean that mouse over does\n // not get called before we even move the mouse.\n this.mouse.global.set(-999999);\n\n /**\n * Actively tracked InteractionData\n *\n * @private\n * @member {Object.}\n */\n this.activeInteractionData = {};\n this.activeInteractionData[MOUSE_POINTER_ID] = this.mouse;\n\n /**\n * Pool of unused InteractionData\n *\n * @private\n * @member {InteractionData[]}\n */\n this.interactionDataPool = [];\n\n /**\n * An event data object to handle all the event tracking/dispatching\n *\n * @member {object}\n */\n this.eventData = new InteractionEvent();\n\n /**\n * The DOM element to bind to.\n *\n * @private\n * @member {HTMLElement}\n */\n this.interactionDOMElement = null;\n\n /**\n * This property determines if mousemove and touchmove events are fired only when the cursor\n * is over the object.\n * Setting to true will make things work more in line with how the DOM verison works.\n * Setting to false can make things easier for things like dragging\n * It is currently set to false as this is how three.js used to work.\n *\n * @member {boolean}\n * @default true\n */\n this.moveWhenInside = true;\n\n /**\n * Have events been attached to the dom element?\n *\n * @private\n * @member {boolean}\n */\n this.eventsAdded = false;\n\n /**\n * Is the mouse hovering over the renderer?\n *\n * @private\n * @member {boolean}\n */\n this.mouseOverRenderer = false;\n\n /**\n * Does the device support touch events\n * https://www.w3.org/TR/touch-events/\n *\n * @readonly\n * @member {boolean}\n */\n this.supportsTouchEvents = 'ontouchstart' in window;\n\n /**\n * Does the device support pointer events\n * https://www.w3.org/Submission/pointer-events/\n *\n * @readonly\n * @member {boolean}\n */\n this.supportsPointerEvents = !!window.PointerEvent;\n\n // this will make it so that you don't have to call bind all the time\n\n /**\n * @private\n * @member {Function}\n */\n this.onClick = this.onClick.bind(this);\n this.processClick = this.processClick.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerUp = this.onPointerUp.bind(this);\n this.processPointerUp = this.processPointerUp.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerCancel = this.onPointerCancel.bind(this);\n this.processPointerCancel = this.processPointerCancel.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerDown = this.onPointerDown.bind(this);\n this.processPointerDown = this.processPointerDown.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerMove = this.onPointerMove.bind(this);\n this.processPointerMove = this.processPointerMove.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerOut = this.onPointerOut.bind(this);\n this.processPointerOverOut = this.processPointerOverOut.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerOver = this.onPointerOver.bind(this);\n\n /**\n * Dictionary of how different cursor modes are handled. Strings are handled as CSS cursor\n * values, objects are handled as dictionaries of CSS values for interactionDOMElement,\n * and functions are called instead of changing the CSS.\n * Default CSS cursor values are provided for 'default' and 'pointer' modes.\n * @member {Object.)>}\n */\n this.cursorStyles = {\n default: 'inherit',\n pointer: 'pointer',\n };\n\n /**\n * The mode of the cursor that is being used.\n * The value of this is a key from the cursorStyles dictionary.\n *\n * @member {string}\n */\n this.currentCursorMode = null;\n\n /**\n * Internal cached let.\n *\n * @private\n * @member {string}\n */\n this.cursor = null;\n\n /**\n * ray caster, for survey intersects from 3d-scene\n *\n * @private\n * @member {Raycaster}\n */\n this.raycaster = new Raycaster();\n\n /**\n * snippet time\n *\n * @private\n * @member {Number}\n */\n this._deltaTime = 0;\n\n this.setTargetElement(this.renderer.domElement);\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed on the display\n * object.\n *\n * @event InteractionLayer#mousedown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * on the display object.\n *\n * @event InteractionLayer#rightdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released over the display\n * object.\n *\n * @event InteractionLayer#mouseup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * over the display object.\n *\n * @event InteractionLayer#rightup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed and released on\n * the display object.\n *\n * @event InteractionLayer#click\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * and released on the display object.\n *\n * @event InteractionLayer#rightclick\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released outside the\n * display object that initially registered a\n * [mousedown]{@link InteractionLayer#event:mousedown}.\n *\n * @event InteractionLayer#mouseupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * outside the display object that initially registered a\n * [rightdown]{@link InteractionLayer#event:rightdown}.\n *\n * @event InteractionLayer#rightupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved while over the display object\n *\n * @event InteractionLayer#mousemove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved onto the display object\n *\n * @event InteractionLayer#mouseover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved off the display object\n *\n * @event InteractionLayer#mouseout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed on the display object.\n *\n * @event InteractionLayer#pointerdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released over the display object.\n *\n * @event InteractionLayer#pointerup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a pointer event\n *\n * @event InteractionLayer#pointercancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed and released on the display object.\n *\n * @event InteractionLayer#pointertap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released outside the display object that initially\n * registered a [pointerdown]{@link InteractionLayer#event:pointerdown}.\n *\n * @event InteractionLayer#pointerupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved while over the display object\n *\n * @event InteractionLayer#pointermove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved onto the display object\n *\n * @event InteractionLayer#pointerover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved off the display object\n *\n * @event InteractionLayer#pointerout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed on the display object.\n *\n * @event InteractionLayer#touchstart\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed from the display object.\n *\n * @event InteractionLayer#touchend\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a touch\n *\n * @event InteractionLayer#touchcancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed and removed from the display object.\n *\n * @event InteractionLayer#tap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed outside of the display object that initially\n * registered a [touchstart]{@link InteractionLayer#event:touchstart}.\n *\n * @event InteractionLayer#touchendoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is moved along the display object.\n *\n * @event InteractionLayer#touchmove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed on the display.\n * object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mousedown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * on the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released over the display\n * object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * over the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed and released on\n * the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#click\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * and released on the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightclick\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released outside the\n * display object that initially registered a\n * [mousedown]{@link Object3D#event:mousedown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * outside the display object that initially registered a\n * [rightdown]{@link Object3D#event:rightdown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved while over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mousemove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved onto the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved off the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a pointer event.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointercancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed and released on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointertap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released outside the display object that initially\n * registered a [pointerdown]{@link Object3D#event:pointerdown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved while over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointermove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved onto the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved off the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchstart\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed from the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchend\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a touch.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchcancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed and removed from the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#tap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed outside of the display object that initially\n * registered a [touchstart]{@link Object3D#event:touchstart}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchendoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is moved along the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchmove\n * @param {InteractionEvent} event - Interaction event\n */\n }\n\n /**\n * @return {boolean}\n */\n isAble() {\n return this.layer && this.layer.interactive;\n }\n\n /**\n * set layer\n * @param {Layer} layer layer\n */\n setLayer(layer) {\n this.layer = layer;\n }\n\n /**\n * Hit tests a point against the display tree, returning the first interactive object that is hit.\n *\n * @param {Point} globalPoint - A point to hit test with, in global space.\n * @param {Object3D} [root] - The root display object to start from. If omitted, defaults\n * to the last rendered root of the associated renderer.\n * @return {Object3D} The hit display object, if any.\n */\n hitTest(globalPoint, root) {\n if (!this.isAble()) return null;\n // clear the target for our hit test\n hitTestEvent.target = null;\n // assign the global point\n hitTestEvent.data.global = globalPoint;\n // ensure safety of the root\n if (!root) {\n root = this.layer.scene;\n }\n // run the hit test\n this.processInteractive(hitTestEvent, root, null, true);\n // return our found object - it'll be null if we didn't hit anything\n\n return hitTestEvent.target;\n }\n\n /**\n * Sets the DOM element which will receive mouse/touch events. This is useful for when you have\n * other DOM elements on top of the renderers Canvas element. With this you'll be bale to deletegate\n * another DOM element to receive those events.\n *\n * @param {HTMLCanvasElement} element - the DOM element which will receive mouse and touch events.\n */\n setTargetElement(element) {\n this.removeEvents();\n\n this.interactionDOMElement = element;\n\n this.addEvents();\n }\n\n /**\n * Registers all the DOM events\n *\n * @private\n */\n addEvents() {\n if (!this.interactionDOMElement || this.eventsAdded) {\n return;\n }\n\n this.emit('addevents');\n\n this.interactionDOMElement.addEventListener('click', this.onClick, true);\n\n if (window.navigator.msPointerEnabled) {\n this.interactionDOMElement.style['-ms-content-zooming'] = 'none';\n this.interactionDOMElement.style['-ms-touch-action'] = 'none';\n } else if (this.supportsPointerEvents) {\n this.interactionDOMElement.style['touch-action'] = 'none';\n }\n\n /**\n * These events are added first, so that if pointer events are normalised, they are fired\n * in the same order as non-normalised events. ie. pointer event 1st, mouse / touch 2nd\n */\n if (this.supportsPointerEvents) {\n window.document.addEventListener('pointermove', this.onPointerMove, true);\n this.interactionDOMElement.addEventListener('pointerdown', this.onPointerDown, true);\n // pointerout is fired in addition to pointerup (for touch events) and pointercancel\n // we already handle those, so for the purposes of what we do in onPointerOut, we only\n // care about the pointerleave event\n this.interactionDOMElement.addEventListener('pointerleave', this.onPointerOut, true);\n this.interactionDOMElement.addEventListener('pointerover', this.onPointerOver, true);\n window.addEventListener('pointercancel', this.onPointerCancel, true);\n window.addEventListener('pointerup', this.onPointerUp, true);\n } else {\n window.document.addEventListener('mousemove', this.onPointerMove, true);\n this.interactionDOMElement.addEventListener('mousedown', this.onPointerDown, true);\n this.interactionDOMElement.addEventListener('mouseout', this.onPointerOut, true);\n this.interactionDOMElement.addEventListener('mouseover', this.onPointerOver, true);\n window.addEventListener('mouseup', this.onPointerUp, true);\n }\n\n // always look directly for touch events so that we can provide original data\n // In a future version we should change this to being just a fallback and rely solely on\n // PointerEvents whenever available\n if (this.supportsTouchEvents) {\n this.interactionDOMElement.addEventListener('touchstart', this.onPointerDown, true);\n this.interactionDOMElement.addEventListener('touchcancel', this.onPointerCancel, true);\n this.interactionDOMElement.addEventListener('touchend', this.onPointerUp, true);\n this.interactionDOMElement.addEventListener('touchmove', this.onPointerMove, true);\n }\n\n this.eventsAdded = true;\n }\n\n /**\n * Removes all the DOM events that were previously registered\n *\n * @private\n */\n removeEvents() {\n if (!this.interactionDOMElement) {\n return;\n }\n\n this.emit('removeevents');\n\n this.interactionDOMElement.removeEventListener('click', this.onClick, true);\n\n if (window.navigator.msPointerEnabled) {\n this.interactionDOMElement.style['-ms-content-zooming'] = '';\n this.interactionDOMElement.style['-ms-touch-action'] = '';\n } else if (this.supportsPointerEvents) {\n this.interactionDOMElement.style['touch-action'] = '';\n }\n\n if (this.supportsPointerEvents) {\n window.document.removeEventListener('pointermove', this.onPointerMove, true);\n this.interactionDOMElement.removeEventListener('pointerdown', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('pointerleave', this.onPointerOut, true);\n this.interactionDOMElement.removeEventListener('pointerover', this.onPointerOver, true);\n window.removeEventListener('pointercancel', this.onPointerCancel, true);\n window.removeEventListener('pointerup', this.onPointerUp, true);\n } else {\n window.document.removeEventListener('mousemove', this.onPointerMove, true);\n this.interactionDOMElement.removeEventListener('mousedown', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('mouseout', this.onPointerOut, true);\n this.interactionDOMElement.removeEventListener('mouseover', this.onPointerOver, true);\n window.removeEventListener('mouseup', this.onPointerUp, true);\n }\n\n if (this.supportsTouchEvents) {\n this.interactionDOMElement.removeEventListener('touchstart', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('touchcancel', this.onPointerCancel, true);\n this.interactionDOMElement.removeEventListener('touchend', this.onPointerUp, true);\n this.interactionDOMElement.removeEventListener('touchmove', this.onPointerMove, true);\n }\n\n this.interactionDOMElement = null;\n\n this.eventsAdded = false;\n }\n\n /**\n * Updates the state of interactive objects.\n * Invoked by a throttled ticker.\n *\n * @param {number} deltaTime - time delta since last tick\n */\n update({ snippet }) {\n if (!this.isAble()) return;\n this._deltaTime += snippet;\n\n if (this._deltaTime < this.interactionFrequency) {\n return;\n }\n\n this._deltaTime = 0;\n\n if (!this.interactionDOMElement) {\n return;\n }\n\n // if the user move the mouse this check has already been done using the mouse move!\n if (this.didMove) {\n this.didMove = false;\n\n return;\n }\n\n this.cursor = null;\n\n // Resets the flag as set by a stopPropagation call. This flag is usually reset by a user interaction of any kind,\n // but there was a scenario of a display object moving under a static mouse cursor.\n // In this case, mouseover and mouseevents would not pass the flag test in triggerEvent function\n for (const k in this.activeInteractionData) {\n // eslint-disable-next-line no-prototype-builtins\n if (this.activeInteractionData.hasOwnProperty(k)) {\n const interactionData = this.activeInteractionData[k];\n\n if (interactionData.originalEvent && interactionData.pointerType !== 'touch') {\n const interactionEvent = this.configureInteractionEventForDOMEvent(\n this.eventData,\n interactionData.originalEvent,\n interactionData\n );\n\n this.processInteractive(\n interactionEvent,\n this.layer.scene,\n this.processPointerOverOut,\n true\n );\n }\n }\n }\n\n this.setCursorMode(this.cursor);\n\n // TODO\n }\n\n /**\n * Sets the current cursor mode, handling any callbacks or CSS style changes.\n *\n * @param {string} mode - cursor mode, a key from the cursorStyles dictionary\n */\n setCursorMode(mode) {\n mode = mode || 'default';\n // if the mode didn't actually change, bail early\n if (this.currentCursorMode === mode) {\n return;\n }\n this.currentCursorMode = mode;\n const style = this.cursorStyles[mode];\n\n // only do things if there is a cursor style for it\n if (style) {\n switch (typeof style) {\n case 'string':\n // string styles are handled as cursor CSS\n this.interactionDOMElement.style.cursor = style;\n break;\n case 'function':\n // functions are just called, and passed the cursor mode\n style(mode);\n break;\n case 'object':\n // if it is an object, assume that it is a dictionary of CSS styles,\n // apply it to the interactionDOMElement\n Object.assign(this.interactionDOMElement.style, style);\n break;\n default:\n break;\n }\n } else if (typeof mode === 'string' && !Object.prototype.hasOwnProperty.call(this.cursorStyles, mode)) {\n // if it mode is a string (not a Symbol) and cursorStyles doesn't have any entry\n // for the mode, then assume that the dev wants it to be CSS for the cursor.\n this.interactionDOMElement.style.cursor = mode;\n }\n }\n\n /**\n * Dispatches an event on the display object that was interacted with\n *\n * @param {Object3D} displayObject - the display object in question\n * @param {string} eventString - the name of the event (e.g, mousedown)\n * @param {object} eventData - the event data object\n * @private\n */\n triggerEvent(displayObject, eventString, eventData) {\n if (!eventData.stopped) {\n eventData.currentTarget = displayObject;\n eventData.type = eventString;\n\n displayObject.emit(eventString, eventData);\n\n if (displayObject[eventString]) {\n displayObject[eventString](eventData);\n }\n }\n }\n\n /**\n * This function is provides a neat way of crawling through the scene graph and running a\n * specified function on all interactive objects it finds. It will also take care of hit\n * testing the interactive objects and passes the hit across in the function.\n *\n * @private\n * @param {InteractionEvent} interactionEvent - event containing the point that\n * is tested for collision\n * @param {Object3D} displayObject - the displayObject\n * that will be hit test (recursively crawls its children)\n * @param {Function} [func] - the function that will be called on each interactive object. The\n * interactionEvent, displayObject and hit will be passed to the function\n * @param {boolean} [hitTest] - this indicates if the objects inside should be hit test against the point\n * @param {boolean} [interactive] - Whether the displayObject is interactive\n * @return {boolean} returns true if the displayObject hit the point\n */\n processInteractive(interactionEvent, displayObject, func, hitTest, interactive) {\n if (!displayObject || !displayObject.visible) {\n return false;\n }\n\n // Took a little while to rework this function correctly! But now it is done and nice and optimised. ^_^\n //\n // This function will now loop through all objects and then only hit test the objects it HAS\n // to, not all of them. MUCH faster..\n // An object will be hit test if the following is true:\n //\n // 1: It is interactive.\n // 2: It belongs to a parent that is interactive AND one of the parents children have not already been hit.\n //\n // As another little optimisation once an interactive object has been hit we can carry on\n // through the scenegraph, but we know that there will be no more hits! So we can avoid extra hit tests\n // A final optimisation is that an object is not hit test directly if a child has already been hit.\n\n interactive = displayObject.interactive || interactive;\n\n let hit = false;\n let interactiveParent = interactive;\n\n if (displayObject.interactiveChildren && displayObject.children) {\n const children = displayObject.children;\n\n for (let i = children.length - 1; i >= 0; i--) {\n const child = children[i];\n\n // time to get recursive.. if this function will return if something is hit..\n const childHit = this.processInteractive(interactionEvent, child, func, hitTest, interactiveParent);\n\n if (childHit) {\n // its a good idea to check if a child has lost its parent.\n // this means it has been removed whilst looping so its best\n if (!child.parent) {\n continue;\n }\n\n // we no longer need to hit test any more objects in this container as we we\n // now know the parent has been hit\n interactiveParent = false;\n\n // If the child is interactive , that means that the object hit was actually\n // interactive and not just the child of an interactive object.\n // This means we no longer need to hit test anything else. We still need to run\n // through all objects, but we don't need to perform any hit tests.\n\n if (childHit) {\n if (interactionEvent.target) {\n hitTest = false;\n }\n hit = true;\n }\n }\n }\n }\n\n // no point running this if the item is not interactive or does not have an interactive parent.\n if (interactive) {\n // if we are hit testing (as in we have no hit any objects yet)\n // We also don't need to worry about hit testing if once of the displayObjects children\n // has already been hit - but only if it was interactive, otherwise we need to keep\n // looking for an interactive child, just in case we hit one\n if (hitTest && !interactionEvent.target) {\n if (interactionEvent.intersects[0] && interactionEvent.intersects[0].object === displayObject) {\n hit = true;\n }\n }\n\n if (displayObject.interactive) {\n if (hit && !interactionEvent.target) {\n interactionEvent.data.target = interactionEvent.target = displayObject;\n }\n\n if (func) {\n func(interactionEvent, displayObject, !!hit);\n }\n }\n }\n\n return hit;\n }\n\n\n /**\n * Is called when the click is pressed down on the renderer element\n *\n * @private\n * @param {MouseEvent} originalEvent - The DOM event of a click being pressed down\n */\n onClick(originalEvent) {\n if (!this.isAble()) return;\n if (originalEvent.type !== 'click') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n if (this.autoPreventDefault && events[0].isNormalized) {\n originalEvent.preventDefault();\n }\n\n const interactionData = this.getInteractionDataForPointerId(events[0]);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, events[0], interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n this.processInteractive(interactionEvent, this.layer.scene, this.processClick, true);\n\n this.emit('click', interactionEvent);\n }\n\n /**\n * Processes the result of the click check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processClick(interactionEvent, displayObject, hit) {\n if (hit) {\n this.triggerEvent(displayObject, 'click', interactionEvent);\n }\n }\n\n /**\n * Is called when the pointer button is pressed down on the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being pressed down\n */\n onPointerDown(originalEvent) {\n if (!this.isAble()) return;\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n /**\n * No need to prevent default on natural pointer events, as there are no side effects\n * Normalized events, however, may have the double mousedown/touchstart issue on the native android browser,\n * so still need to be prevented.\n */\n\n // Guaranteed that there will be at least one event in events, and all events must have the same pointer type\n\n if (this.autoPreventDefault && events[0].isNormalized) {\n originalEvent.preventDefault();\n }\n\n const eventLen = events.length;\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n this.processInteractive(interactionEvent, this.layer.scene, this.processPointerDown, true);\n\n this.emit('pointerdown', interactionEvent);\n if (event.pointerType === 'touch') {\n this.emit('touchstart', interactionEvent);\n } else if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n const isRightButton = event.button === 2;\n\n this.emit(isRightButton ? 'rightdown' : 'mousedown', this.eventData);\n }\n }\n }\n\n /**\n * Processes the result of the pointer down check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerDown(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n const id = interactionEvent.data.identifier;\n\n if (hit) {\n if (!displayObject.trackedPointers[id]) {\n displayObject.trackedPointers[id] = new InteractionTrackingData(id);\n }\n this.triggerEvent(displayObject, 'pointerdown', interactionEvent);\n\n if (data.pointerType === 'touch') {\n displayObject.started = true;\n this.triggerEvent(displayObject, 'touchstart', interactionEvent);\n } else if (data.pointerType === 'mouse' || data.pointerType === 'pen') {\n const isRightButton = data.button === 2;\n\n if (isRightButton) {\n displayObject.trackedPointers[id].rightDown = true;\n } else {\n displayObject.trackedPointers[id].leftDown = true;\n }\n\n this.triggerEvent(displayObject, isRightButton ? 'rightdown' : 'mousedown', interactionEvent);\n }\n }\n }\n\n /**\n * Is called when the pointer button is released on the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being released\n * @param {boolean} cancelled - true if the pointer is cancelled\n * @param {Function} func - Function passed to {@link processInteractive}\n */\n onPointerComplete(originalEvent, cancelled, func) {\n const events = this.normalizeToPointerData(originalEvent);\n\n const eventLen = events.length;\n\n // if the event wasn't targeting our canvas, then consider it to be pointerupoutside\n // in all cases (unless it was a pointercancel)\n const eventAppend = originalEvent.target !== this.interactionDOMElement ? 'outside' : '';\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n // perform hit testing for events targeting our canvas or cancel events\n this.processInteractive(interactionEvent, this.layer.scene, func, cancelled || !eventAppend);\n\n this.emit(cancelled ? 'pointercancel' : `pointerup${eventAppend}`, interactionEvent);\n\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n const isRightButton = event.button === 2;\n\n this.emit(isRightButton ? `rightup${eventAppend}` : `mouseup${eventAppend}`, interactionEvent);\n } else if (event.pointerType === 'touch') {\n this.emit(cancelled ? 'touchcancel' : `touchend${eventAppend}`, interactionEvent);\n this.releaseInteractionDataForPointerId(event.pointerId, interactionData);\n }\n }\n }\n\n /**\n * Is called when the pointer button is cancelled\n *\n * @private\n * @param {PointerEvent} event - The DOM event of a pointer button being released\n */\n onPointerCancel(event) {\n if (!this.isAble()) return;\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && event.pointerType === 'touch') return;\n\n this.onPointerComplete(event, true, this.processPointerCancel);\n }\n\n /**\n * Processes the result of the pointer cancel check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n */\n processPointerCancel(interactionEvent, displayObject) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n if (displayObject.trackedPointers[id] !== undefined) {\n delete displayObject.trackedPointers[id];\n this.triggerEvent(displayObject, 'pointercancel', interactionEvent);\n\n if (data.pointerType === 'touch') {\n this.triggerEvent(displayObject, 'touchcancel', interactionEvent);\n }\n }\n }\n\n /**\n * Is called when the pointer button is released on the renderer element\n *\n * @private\n * @param {PointerEvent} event - The DOM event of a pointer button being released\n */\n onPointerUp(event) {\n if (!this.isAble()) return;\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && event.pointerType === 'touch') return;\n\n this.onPointerComplete(event, false, this.processPointerUp);\n }\n\n /**\n * Processes the result of the pointer up check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerUp(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n const trackingData = displayObject.trackedPointers[id];\n\n const isTouch = data.pointerType === 'touch';\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n // Mouse only\n if (isMouse) {\n const isRightButton = data.button === 2;\n\n const flags = InteractionTrackingData.FLAGS;\n\n const test = isRightButton ? flags.RIGHT_DOWN : flags.LEFT_DOWN;\n\n const isDown = trackingData !== undefined && (trackingData.flags & test);\n\n if (hit) {\n this.triggerEvent(displayObject, isRightButton ? 'rightup' : 'mouseup', interactionEvent);\n\n if (isDown) {\n this.triggerEvent(displayObject, isRightButton ? 'rightclick' : 'leftclick', interactionEvent);\n }\n } else if (isDown) {\n this.triggerEvent(displayObject, isRightButton ? 'rightupoutside' : 'mouseupoutside', interactionEvent);\n }\n // update the down state of the tracking data\n if (trackingData) {\n if (isRightButton) {\n trackingData.rightDown = false;\n } else {\n trackingData.leftDown = false;\n }\n }\n }\n\n // Pointers and Touches, and Mouse\n if (isTouch && displayObject.started) {\n displayObject.started = false;\n this.triggerEvent(displayObject, 'touchend', interactionEvent);\n }\n if (hit) {\n this.triggerEvent(displayObject, 'pointerup', interactionEvent);\n\n if (trackingData) {\n this.triggerEvent(displayObject, 'pointertap', interactionEvent);\n if (isTouch) {\n this.triggerEvent(displayObject, 'tap', interactionEvent);\n // touches are no longer over (if they ever were) when we get the touchend\n // so we should ensure that we don't keep pretending that they are\n trackingData.over = false;\n }\n }\n } else if (trackingData) {\n this.triggerEvent(displayObject, 'pointerupoutside', interactionEvent);\n if (isTouch) this.triggerEvent(displayObject, 'touchendoutside', interactionEvent);\n }\n // Only remove the tracking data if there is no over/down state still associated with it\n if (trackingData && trackingData.none) {\n delete displayObject.trackedPointers[id];\n }\n }\n\n /**\n * Is called when the pointer moves across the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer moving\n */\n onPointerMove(originalEvent) {\n if (!this.isAble()) return;\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n if (events[0].pointerType === 'mouse') {\n this.didMove = true;\n\n this.cursor = null;\n }\n\n const eventLen = events.length;\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n const interactive = event.pointerType === 'touch' ? this.moveWhenInside : true;\n\n this.processInteractive(\n interactionEvent,\n this.layer.scene,\n this.processPointerMove,\n interactive\n );\n this.emit('pointermove', interactionEvent);\n if (event.pointerType === 'touch') this.emit('touchmove', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') this.emit('mousemove', interactionEvent);\n }\n\n if (events[0].pointerType === 'mouse') {\n this.setCursorMode(this.cursor);\n\n // TODO BUG for parents interactive object (border order issue)\n }\n }\n\n /**\n * Processes the result of the pointer move check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerMove(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const isTouch = data.pointerType === 'touch';\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n if (isMouse) {\n this.processPointerOverOut(interactionEvent, displayObject, hit);\n }\n\n if (isTouch && displayObject.started) this.triggerEvent(displayObject, 'touchmove', interactionEvent);\n if (!this.moveWhenInside || hit) {\n this.triggerEvent(displayObject, 'pointermove', interactionEvent);\n if (isMouse) this.triggerEvent(displayObject, 'mousemove', interactionEvent);\n }\n }\n\n /**\n * Is called when the pointer is moved out of the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer being moved out\n */\n onPointerOut(originalEvent) {\n if (!this.isAble()) return;\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n // Only mouse and pointer can call onPointerOut, so events will always be length 1\n const event = events[0];\n\n if (event.pointerType === 'mouse') {\n this.mouseOverRenderer = false;\n this.setCursorMode(null);\n }\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = event;\n\n this.processInteractive(interactionEvent, this.layer.scene, this.processPointerOverOut, false);\n\n this.emit('pointerout', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n this.emit('mouseout', interactionEvent);\n } else {\n // we can get touchleave events after touchend, so we want to make sure we don't\n // introduce memory leaks\n this.releaseInteractionDataForPointerId(interactionData.identifier);\n }\n }\n\n /**\n * Processes the result of the pointer over/out check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerOverOut(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n let trackingData = displayObject.trackedPointers[id];\n\n // if we just moused over the display object, then we need to track that state\n if (hit && !trackingData) {\n trackingData = displayObject.trackedPointers[id] = new InteractionTrackingData(id);\n }\n\n if (trackingData === undefined) return;\n\n if (hit && this.mouseOverRenderer) {\n if (!trackingData.over) {\n trackingData.over = true;\n this.triggerEvent(displayObject, 'pointerover', interactionEvent);\n if (isMouse) {\n this.triggerEvent(displayObject, 'mouseover', interactionEvent);\n }\n }\n\n // only change the cursor if it has not already been changed (by something deeper in the\n // display tree)\n if (isMouse && this.cursor === null) {\n this.cursor = displayObject.cursor;\n }\n } else if (trackingData.over) {\n trackingData.over = false;\n this.triggerEvent(displayObject, 'pointerout', this.eventData);\n if (isMouse) {\n this.triggerEvent(displayObject, 'mouseout', interactionEvent);\n }\n // if there is no mouse down information for the pointer, then it is safe to delete\n if (trackingData.none) {\n delete displayObject.trackedPointers[id];\n }\n }\n }\n\n /**\n * Is called when the pointer is moved into the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being moved into the renderer view\n */\n onPointerOver(originalEvent) {\n if (!this.isAble()) return;\n const events = this.normalizeToPointerData(originalEvent);\n\n // Only mouse and pointer can call onPointerOver, so events will always be length 1\n const event = events[0];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = event;\n\n if (event.pointerType === 'mouse') {\n this.mouseOverRenderer = true;\n }\n\n this.emit('pointerover', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n this.emit('mouseover', interactionEvent);\n }\n }\n\n /**\n * Get InteractionData for a given pointerId. Store that data as well\n *\n * @private\n * @param {PointerEvent} event - Normalized pointer event, output from normalizeToPointerData\n * @return {InteractionData} - Interaction data for the given pointer identifier\n */\n getInteractionDataForPointerId(event) {\n const pointerId = event.pointerId;\n\n let interactionData;\n\n if (pointerId === MOUSE_POINTER_ID || event.pointerType === 'mouse') {\n interactionData = this.mouse;\n } else if (this.activeInteractionData[pointerId]) {\n interactionData = this.activeInteractionData[pointerId];\n } else {\n interactionData = this.interactionDataPool.pop() || new InteractionData();\n interactionData.identifier = pointerId;\n this.activeInteractionData[pointerId] = interactionData;\n }\n // copy properties from the event, so that we can make sure that touch/pointer specific\n // data is available\n interactionData._copyEvent(event);\n\n return interactionData;\n }\n\n /**\n * Return unused InteractionData to the pool, for a given pointerId\n *\n * @private\n * @param {number} pointerId - Identifier from a pointer event\n */\n releaseInteractionDataForPointerId(pointerId) {\n const interactionData = this.activeInteractionData[pointerId];\n\n if (interactionData) {\n delete this.activeInteractionData[pointerId];\n interactionData._reset();\n this.interactionDataPool.push(interactionData);\n }\n }\n\n /**\n * Maps x and y coords from a DOM object and maps them correctly to the three.js view. The\n * resulting value is stored in the point. This takes into account the fact that the DOM\n * element could be scaled and positioned anywhere on the screen.\n *\n * @param {Vector2} point - the point that the result will be stored in\n * @param {number} x - the x coord of the position to map\n * @param {number} y - the y coord of the position to map\n */\n mapPositionToPoint(point, x, y) {\n let rect;\n\n // IE 11 fix\n if (!this.interactionDOMElement.parentElement) {\n rect = {\n x: 0,\n y: 0,\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n };\n } else {\n rect = this.interactionDOMElement.getBoundingClientRect();\n }\n\n point.x = ((x - rect.left) / rect.width) * 2 - 1;\n point.y = -((y - rect.top) / rect.height) * 2 + 1;\n }\n\n /**\n * Configure an InteractionEvent to wrap a DOM PointerEvent and InteractionData\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The event to be configured\n * @param {PointerEvent} pointerEvent - The DOM event that will be paired with the InteractionEvent\n * @param {InteractionData} interactionData - The InteractionData that will be paired\n * with the InteractionEvent\n * @return {InteractionEvent} the interaction event that was passed in\n */\n configureInteractionEventForDOMEvent(interactionEvent, pointerEvent, interactionData) {\n interactionEvent.data = interactionData;\n\n this.mapPositionToPoint(interactionData.global, pointerEvent.clientX, pointerEvent.clientY);\n\n if (this.layer && this.layer.interactive) this.raycaster.setFromCamera(interactionData.global, this.layer.camera);\n\n // Not really sure why this is happening, but it's how a previous version handled things TODO: there should be remove\n if (pointerEvent.pointerType === 'touch') {\n pointerEvent.globalX = interactionData.global.x;\n pointerEvent.globalY = interactionData.global.y;\n }\n\n interactionData.originalEvent = pointerEvent;\n interactionEvent._reset();\n interactionEvent.intersects = this.raycaster.intersectObjects(this.scene.children, true);\n\n return interactionEvent;\n }\n\n /**\n * Ensures that the original event object contains all data that a regular pointer event would have\n *\n * @private\n * @param {TouchEvent|MouseEvent|PointerEvent} event - The original event data from a touch or mouse event\n * @return {PointerEvent[]} An array containing a single normalized pointer event, in the case of a pointer\n * or mouse event, or a multiple normalized pointer events if there are multiple changed touches\n */\n normalizeToPointerData(event) {\n const normalizedEvents = [];\n\n if (this.supportsTouchEvents && event instanceof TouchEvent) {\n for (let i = 0, li = event.changedTouches.length; i < li; i++) {\n const touch = event.changedTouches[i];\n\n if (typeof touch.button === 'undefined') touch.button = event.touches.length ? 1 : 0;\n if (typeof touch.buttons === 'undefined') touch.buttons = event.touches.length ? 1 : 0;\n if (typeof touch.isPrimary === 'undefined') {\n touch.isPrimary = event.touches.length === 1 && event.type === 'touchstart';\n }\n if (typeof touch.width === 'undefined') touch.width = touch.radiusX || 1;\n if (typeof touch.height === 'undefined') touch.height = touch.radiusY || 1;\n if (typeof touch.tiltX === 'undefined') touch.tiltX = 0;\n if (typeof touch.tiltY === 'undefined') touch.tiltY = 0;\n if (typeof touch.pointerType === 'undefined') touch.pointerType = 'touch';\n if (typeof touch.pointerId === 'undefined') touch.pointerId = touch.identifier || 0;\n if (typeof touch.pressure === 'undefined') touch.pressure = touch.force || 0.5;\n touch.twist = 0;\n touch.tangentialPressure = 0;\n // TODO: Remove these, as layerX/Y is not a standard, is deprecated, has uneven\n // support, and the fill ins are not quite the same\n // offsetX/Y might be okay, but is not the same as clientX/Y when the canvas's top\n // left is not 0,0 on the page\n if (typeof touch.layerX === 'undefined') touch.layerX = touch.offsetX = touch.clientX;\n if (typeof touch.layerY === 'undefined') touch.layerY = touch.offsetY = touch.clientY;\n\n // mark the touch as normalized, just so that we know we did it\n touch.isNormalized = true;\n\n normalizedEvents.push(touch);\n }\n } else if (event instanceof MouseEvent && (!this.supportsPointerEvents || !(event instanceof window.PointerEvent))) {\n if (typeof event.isPrimary === 'undefined') event.isPrimary = true;\n if (typeof event.width === 'undefined') event.width = 1;\n if (typeof event.height === 'undefined') event.height = 1;\n if (typeof event.tiltX === 'undefined') event.tiltX = 0;\n if (typeof event.tiltY === 'undefined') event.tiltY = 0;\n if (typeof event.pointerType === 'undefined') event.pointerType = 'mouse';\n if (typeof event.pointerId === 'undefined') event.pointerId = MOUSE_POINTER_ID;\n if (typeof event.pressure === 'undefined') event.pressure = 0.5;\n event.twist = 0;\n event.tangentialPressure = 0;\n\n // mark the mouse event as normalized, just so that we know we did it\n event.isNormalized = true;\n\n normalizedEvents.push(event);\n } else {\n normalizedEvents.push(event);\n }\n\n return normalizedEvents;\n }\n\n /**\n * Destroys the interaction manager\n *\n */\n destroy() {\n this.removeEvents();\n\n this.removeAllListeners();\n\n this.renderer = null;\n\n this.mouse = null;\n\n this.eventData = null;\n\n this.interactionDOMElement = null;\n\n this.onPointerDown = null;\n this.processPointerDown = null;\n\n this.onPointerUp = null;\n this.processPointerUp = null;\n\n this.onPointerCancel = null;\n this.processPointerCancel = null;\n\n this.onPointerMove = null;\n this.processPointerMove = null;\n\n this.onPointerOut = null;\n this.processPointerOverOut = null;\n\n this.onPointerOver = null;\n\n this._tempPoint = null;\n }\n}\n\nexport default InteractionLayer;\n","(function() {\n let lastTime = 0;\n let vendors = ['ms', 'moz', 'webkit', 'o'];\n for (let x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\n window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];\n window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] ||\n window[vendors[x] + 'CancelRequestAnimationFrame'];\n }\n\n if (!window.requestAnimationFrame) {\n window.requestAnimationFrame = function(callback) {\n let currTime = new Date().getTime();\n let timeToCall = Math.max(0, 16 - (currTime - lastTime));\n let id = window.setTimeout(function() {\n callback(currTime + timeToCall);\n }, timeToCall);\n lastTime = currTime + timeToCall;\n return id;\n };\n }\n\n if (!window.cancelAnimationFrame) {\n window.cancelAnimationFrame = function(id) {\n clearTimeout(id);\n };\n }\n\n window.RAF = window.requestAnimationFrame;\n window.CAF = window.cancelAnimationFrame;\n})();\n","import './Raf';\nimport { EventDispatcher } from 'three';\n\n/**\n * @extends EventDispatcher\n */\nclass Ticker extends EventDispatcher {\n /**\n *\n */\n constructor() {\n super();\n this.timer = null;\n this.started = false;\n\n /**\n * pre-time cache\n *\n * @member {Number}\n * @private\n */\n this.pt = 0;\n\n /**\n * how long the time through, at this tick\n *\n * @member {Number}\n * @private\n */\n this.snippet = 0;\n\n this.start();\n }\n\n /**\n * start tick loop\n */\n start() {\n if (this.started) return;\n const loop = () => {\n this.timeline();\n this.emit('tick', { snippet: this.snippet });\n this.timer = RAF(loop);\n };\n loop();\n }\n\n /**\n * stop tick loop\n */\n stop() {\n CAF(this.timer);\n this.started = false;\n }\n\n /**\n * get timeline snippet\n *\n * @private\n */\n timeline() {\n this.snippet = Date.now() - this.pt;\n if (this.pt === 0 || this.snippet > 200) {\n this.pt = Date.now();\n this.snippet = Date.now() - this.pt;\n }\n\n this.pt += this.snippet;\n }\n}\n\nexport default Ticker;\n","import Ticker from '../utils/Ticker';\nimport InteractionManager from './InteractionManager';\n\n/**\n * The interaction manager deals with mouse, touch and pointer events. Any DisplayObject can be interactive\n * if its interactive parameter is set to true\n * This manager also supports multitouch.\n *\n * reference to [pixi.js](http://www.pixijs.com/) impl\n *\n * @example\n * import { Scene, PerspectiveCamera, WebGLRenderer, Mesh, BoxGeometry, MeshBasicMaterial } from 'three';\n * import { Interaction } from 'three.interaction';\n * const renderer = new WebGLRenderer({ canvas: canvasElement });\n * const scene = new Scene();\n * const camera = new PerspectiveCamera(60, width / height, 0.1, 100);\n *\n * const interaction = new Interaction(renderer, scene, camera);\n * // then you can bind every interaction event with any mesh which you had `add` into `scene` before\n * const cube = new Mesh(\n * new BoxGeometry(1, 1, 1),\n * new MeshBasicMaterial({ color: 0xffffff }),\n * );\n * scene.add(cube);\n * cube.on('touchstart', ev => {\n * console.log(ev);\n * });\n *\n * cube.on('mousedown', ev => {\n * console.log(ev);\n * });\n *\n * cube.on('pointerdown', ev => {\n * console.log(ev);\n * });\n * // and so on ...\n *\n * // you can also listen on parent-node or any display-tree node,\n * // source event will bubble up along with display-tree.\n * // you can stop the bubble-up by invoke ev.stopPropagation function.\n * scene.on('touchstart', ev => {\n * console.log(ev);\n * })\n *\n * @class\n * @extends InteractionManager\n */\nclass Interaction extends InteractionManager {\n /**\n * @param {WebGLRenderer} renderer - A reference to the current renderer\n * @param {Scene} scene - A reference to the current scene\n * @param {Camera} camera - A reference to the current camera\n * @param {Object} [options] - The options for the manager.\n * @param {Boolean} [options.autoPreventDefault=false] - Should the manager automatically prevent default browser actions.\n * @param {Boolean} [options.autoAttach=false] - Should the manager automatically attach target element.\n * @param {Number} [options.interactionFrequency=10] - Frequency increases the interaction events will be checked.\n */\n constructor(renderer, scene, camera, options) {\n options = Object.assign({ autoAttach: false }, options);\n super(renderer, scene, camera, options);\n\n /**\n * a ticker\n *\n * @private\n * @member {Ticker}\n */\n this.ticker = new Ticker();\n\n /**\n * update for some over event\n *\n * @private\n */\n this.update = this.update.bind(this);\n\n this.on('addevents', () => {\n this.ticker.on('tick', this.update);\n });\n\n this.on('removeevents', () => {\n this.ticker.off('tick', this.update);\n });\n\n this.setTargetElement(this.renderer.domElement);\n }\n}\n\nexport default Interaction;\n"],"names":["_rt","val","Object","prototype","toString","call","Utils","ks","variable","EventDispatcher","on","type","fn","isFunction","Object3D","interactive","addEventListener","off","removeEventListener","once","cb","ev","emit","_listeners","undefined","isUndefined","cbs","cache","slice","argument","i","length","apply","interactiveChildren","started","defineProperty","_trackedPointers","raycastTest","raycaster","result","raycast","InteractionData","global","Vector2","target","originalEvent","identifier","isPrimary","button","buttons","width","height","tiltX","tiltY","pointerType","pressure","rotationAngle","twist","tangentialPressure","event","InteractionEvent","stopped","currentTarget","data","intersects","InteractionTrackingData","pointerId","_pointerId","_flags","FLAGS","NONE","flag","yn","flags","constructor","OVER","_doSet","RIGHT_DOWN","LEFT_DOWN","freeze","MOUSE_POINTER_ID","hitTestEvent","InteractionManager","renderer","scene","camera","options","autoPreventDefault","interactionFrequency","mouse","set","activeInteractionData","interactionDataPool","eventData","interactionDOMElement","moveWhenInside","eventsAdded","mouseOverRenderer","supportsTouchEvents","window","supportsPointerEvents","PointerEvent","onClick","bind","processClick","onPointerUp","processPointerUp","onPointerCancel","processPointerCancel","onPointerDown","processPointerDown","onPointerMove","processPointerMove","onPointerOut","processPointerOverOut","onPointerOver","cursorStyles","currentCursorMode","cursor","Raycaster","_deltaTime","setTargetElement","domElement","globalPoint","root","processInteractive","element","removeEvents","addEvents","navigator","msPointerEnabled","style","document","snippet","didMove","k","hasOwnProperty","interactionData","interactionEvent","configureInteractionEventForDOMEvent","setCursorMode","mode","assign","displayObject","eventString","func","hitTest","visible","hit","interactiveParent","children","child","childHit","parent","object","events","normalizeToPointerData","isNormalized","preventDefault","getInteractionDataForPointerId","triggerEvent","eventLen","isRightButton","id","trackedPointers","rightDown","leftDown","cancelled","eventAppend","releaseInteractionDataForPointerId","onPointerComplete","trackingData","isTouch","isMouse","test","isDown","over","none","pop","_copyEvent","_reset","push","point","x","y","rect","parentElement","getBoundingClientRect","left","top","pointerEvent","mapPositionToPoint","clientX","clientY","setFromCamera","globalX","globalY","intersectObjects","normalizedEvents","TouchEvent","li","changedTouches","touch","touches","radiusX","radiusY","force","layerX","offsetX","layerY","offsetY","MouseEvent","removeAllListeners","_tempPoint","InteractionLayer","layer","isAble","lastTime","vendors","requestAnimationFrame","cancelAnimationFrame","callback","currTime","Date","getTime","timeToCall","Math","max","setTimeout","RAF","CAF","Ticker","timer","pt","start","loop","timeline","now","Interaction","autoAttach","ticker","update"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"three.interaction.module.js","sources":["../src/utils/Utils.js","../src/patch/EventDispatcher.js","../src/patch/Object3D.js","../src/interaction/InteractionData.js","../src/interaction/InteractionEvent.js","../src/interaction/InteractionTrackingData.js","../src/interaction/InteractionManager.js","../src/interaction/InteractionLayer.js","../src/utils/Raf.js","../src/utils/Ticker.js","../src/interaction/Interaction.js"],"sourcesContent":["/**\n * get variable type\n * @param {*} val a variable which you want to get the type\n * @return {String} variable-type\n */\nfunction _rt(val) {\n return Object.prototype.toString.call(val);\n}\n\n/**\n * Utils tool box\n *\n * @namespace Utils\n */\nexport const Utils = {\n /**\n * determine whether it is a `Function`\n *\n * @static\n * @method\n * @memberof Utils\n * @param {*} variable a variable which you want to determine\n * @return {Boolean} type result\n */\n isFunction: (function() {\n const ks = _rt(function() {});\n return function(variable) {\n return _rt(variable) === ks;\n };\n })(),\n\n\n /**\n * determine whether it is a `undefined`\n *\n * @static\n * @method\n * @memberof Utils\n * @param {*} variable a variable which you want to determine\n * @return {Boolean} type result\n */\n isUndefined(variable) {\n return typeof variable === 'undefined';\n },\n};\n","import { EventDispatcher, Object3D } from 'three';\nimport { Utils } from '../utils/Utils.js';\n\n/**\n * proxy `addEventListener` function\n *\n * @param {String} type event type, evnet name\n * @param {Function} fn callback\n * @return {this} this\n */\nEventDispatcher.prototype.on = function(type, fn) {\n if (!Utils.isFunction(fn)) return;\n if (this instanceof Object3D) this.interactive = true;\n this.addEventListener(type, fn);\n return this;\n};\n\n/**\n * proxy `removeEventListener` function\n *\n * @param {String} type event type, evnet name\n * @param {Function} fn callback, which you had bind before\n * @return {this} this\n */\nEventDispatcher.prototype.off = function(type, fn) {\n this.removeEventListener(type, fn);\n return this;\n};\n\n/**\n * binding a once event, just emit once time\n *\n * @param {String} type event type, evnet name\n * @param {Function} fn callback\n * @return {this} this\n */\nEventDispatcher.prototype.once = function(type, fn) {\n if (!Utils.isFunction(fn)) return;\n const cb = (ev) => {\n fn(ev);\n this.off(type, cb);\n };\n this.on(type, cb);\n return this;\n};\n\n/**\n * emit a event\n *\n * @param {String} type event type, evnet name\n * @return {this} this\n */\nEventDispatcher.prototype.emit = function(type, ...argument) {\n if (this._listeners === undefined || Utils.isUndefined(this._listeners[type])) return;\n const cbs = this._listeners[type] || [];\n const cache = cbs.slice(0);\n\n for (let i = 0; i < cache.length; i++) {\n cache[i].apply(this, argument);\n }\n return this;\n};\n\n","import { Object3D } from 'three';\n\n/**\n * whether displayObject is interactively\n */\nObject3D.prototype.interactive = false;\n\n/**\n * whether displayObject's children is interactively\n */\nObject3D.prototype.interactiveChildren = true;\n\n/**\n * whether displayObject had touchstart\n * @private\n */\nObject3D.prototype.started = false;\n\n/**\n * tracked event cache, like: touchend、mouseout、pointerout which decided by primary-event\n */\nObject.defineProperty(Object3D.prototype, 'trackedPointers', {\n get() {\n if (!this._trackedPointers) this._trackedPointers = {};\n return this._trackedPointers;\n },\n});\n\n/**\n * dispatch a raycast\n *\n * @param {Raycaster} raycaster Raycaster object, get from THREE.Raycaster\n * @return {Object|Boolean} had pass hit-test\n */\nObject3D.prototype.raycastTest = function(raycaster) {\n const result = [];\n this.raycast(raycaster, result);\n\n if (result.length > 0) {\n return result[0];\n }\n\n return false;\n};\n","import { Vector2 } from 'three';\n\n/**\n * Holds all information related to an Interaction event\n *\n * @class\n */\nclass InteractionData {\n /**\n * InteractionData constructor\n */\n constructor() {\n /**\n * This point stores the global coords of where the touch/mouse event happened\n *\n * @member {Vector2}\n */\n this.global = new Vector2();\n\n /**\n * The target DisplayObject that was interacted with\n *\n * @member {Object3D}\n */\n this.target = null;\n\n /**\n * When passed to an event handler, this will be the original DOM Event that was captured\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent\n * @see https://developer.mozilla.org/en-US/docs/Web/API/TouchEvent\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent\n * @member {MouseEvent|TouchEvent|PointerEvent}\n */\n this.originalEvent = null;\n\n /**\n * Unique identifier for this interaction\n *\n * @member {number}\n */\n this.identifier = null;\n\n /**\n * Indicates whether or not the pointer device that created the event is the primary pointer.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/isPrimary\n * @type {Boolean}\n */\n this.isPrimary = false;\n\n /**\n * Indicates which button was pressed on the mouse or pointer device to trigger the event.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button\n * @type {number}\n */\n this.button = 0;\n\n /**\n * Indicates which buttons are pressed on the mouse or pointer device when the event is triggered.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/buttons\n * @type {number}\n */\n this.buttons = 0;\n\n /**\n * The width of the pointer's contact along the x-axis, measured in CSS pixels.\n * radiusX of TouchEvents will be represented by this value.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/width\n * @type {number}\n */\n this.width = 0;\n\n /**\n * The height of the pointer's contact along the y-axis, measured in CSS pixels.\n * radiusY of TouchEvents will be represented by this value.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/height\n * @type {number}\n */\n this.height = 0;\n\n /**\n * The angle, in degrees, between the pointer device and the screen.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/tiltX\n * @type {number}\n */\n this.tiltX = 0;\n\n /**\n * The angle, in degrees, between the pointer device and the screen.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/tiltY\n * @type {number}\n */\n this.tiltY = 0;\n\n /**\n * The type of pointer that triggered the event.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/pointerType\n * @type {string}\n */\n this.pointerType = null;\n\n /**\n * Pressure applied by the pointing device during the event. A Touch's force property\n * will be represented by this value.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/pressure\n * @type {number}\n */\n this.pressure = 0;\n\n /**\n * From TouchEvents (not PointerEvents triggered by touches), the rotationAngle of the Touch.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Touch/rotationAngle\n * @type {number}\n */\n this.rotationAngle = 0;\n\n /**\n * Twist of a stylus pointer.\n * @see https://w3c.github.io/pointerevents/#pointerevent-interface\n * @type {number}\n */\n this.twist = 0;\n\n /**\n * Barrel pressure on a stylus pointer.\n * @see https://w3c.github.io/pointerevents/#pointerevent-interface\n * @type {number}\n */\n this.tangentialPressure = 0;\n }\n\n /**\n * The unique identifier of the pointer. It will be the same as `identifier`.\n * @readonly\n * @member {number}\n * @see https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/pointerId\n */\n get pointerId() {\n return this.identifier;\n }\n\n /**\n * Copies properties from normalized event data.\n *\n * @param {Touch|MouseEvent|PointerEvent} event The normalized event data\n * @private\n */\n _copyEvent(event) {\n // isPrimary should only change on touchstart/pointerdown, so we don't want to overwrite\n // it with \"false\" on later events when our shim for it on touch events might not be\n // accurate\n if (event.isPrimary) {\n this.isPrimary = true;\n }\n this.button = event.button;\n this.buttons = event.buttons;\n this.width = event.width;\n this.height = event.height;\n this.tiltX = event.tiltX;\n this.tiltY = event.tiltY;\n this.pointerType = event.pointerType;\n this.pressure = event.pressure;\n this.rotationAngle = event.rotationAngle;\n this.twist = event.twist || 0;\n this.tangentialPressure = event.tangentialPressure || 0;\n }\n\n /**\n * Resets the data for pooling.\n *\n * @private\n */\n _reset() {\n // isPrimary is the only property that we really need to reset - everything else is\n // guaranteed to be overwritten\n this.isPrimary = false;\n }\n}\n\nexport default InteractionData;\n","/**\n * Event class that mimics native DOM events.\n *\n * @class\n */\nclass InteractionEvent {\n /**\n * InteractionEvent constructor\n */\n constructor() {\n /**\n * Whether this event will continue propagating in the tree\n *\n * @member {boolean}\n */\n this.stopped = false;\n\n /**\n * The object which caused this event to be dispatched.\n *\n * @member {Object3D}\n */\n this.target = null;\n\n /**\n * The object whose event listener’s callback is currently being invoked.\n *\n * @member {Object3D}\n */\n this.currentTarget = null;\n\n /**\n * Type of the event\n *\n * @member {string}\n */\n this.type = null;\n\n /**\n * InteractionData related to this event\n *\n * @member {InteractionData}\n */\n this.data = null;\n\n /**\n * ray caster detial from 3d-mesh\n *\n * @member {Intersects}\n */\n this.intersects = [];\n }\n\n /**\n * Prevents event from reaching any objects other than the current object.\n *\n */\n stopPropagation() {\n this.stopped = true;\n }\n\n /**\n * Resets the event.\n *\n * @private\n */\n _reset() {\n this.stopped = false;\n this.currentTarget = null;\n this.target = null;\n this.intersects = [];\n }\n}\n\nexport default InteractionEvent;\n","/**\n * DisplayObjects with the `trackedPointers` property use this class to track interactions\n *\n * @class\n * @private\n */\nexport default class InteractionTrackingData {\n /**\n * @param {number} pointerId - Unique pointer id of the event\n */\n constructor(pointerId) {\n this._pointerId = pointerId;\n this._flags = InteractionTrackingData.FLAGS.NONE;\n }\n\n /**\n *\n * @private\n * @param {number} flag - The interaction flag to set\n * @param {boolean} yn - Should the flag be set or unset\n */\n _doSet(flag, yn) {\n if (yn) {\n this._flags = this._flags | flag;\n } else {\n this._flags = this._flags & (~flag);\n }\n }\n\n /**\n * Unique pointer id of the event\n *\n * @readonly\n * @member {number}\n */\n get pointerId() {\n return this._pointerId;\n }\n\n /**\n * State of the tracking data, expressed as bit flags\n *\n * @member {number}\n */\n get flags() {\n return this._flags;\n }\n\n /**\n * Set the flags for the tracking data\n *\n * @param {number} flags - Flags to set\n */\n set flags(flags) {\n this._flags = flags;\n }\n\n /**\n * Is the tracked event inactive (not over or down)?\n *\n * @member {number}\n */\n get none() {\n return this._flags === this.constructor.FLAGS.NONE;\n }\n\n /**\n * Is the tracked event over the DisplayObject?\n *\n * @member {boolean}\n */\n get over() {\n return (this._flags & this.constructor.FLAGS.OVER) !== 0;\n }\n\n /**\n * Set the over flag\n *\n * @param {boolean} yn - Is the event over?\n */\n set over(yn) {\n this._doSet(this.constructor.FLAGS.OVER, yn);\n }\n\n /**\n * Did the right mouse button come down in the DisplayObject?\n *\n * @member {boolean}\n */\n get rightDown() {\n return (this._flags & this.constructor.FLAGS.RIGHT_DOWN) !== 0;\n }\n\n /**\n * Set the right down flag\n *\n * @param {boolean} yn - Is the right mouse button down?\n */\n set rightDown(yn) {\n this._doSet(this.constructor.FLAGS.RIGHT_DOWN, yn);\n }\n\n /**\n * Did the left mouse button come down in the DisplayObject?\n *\n * @member {boolean}\n */\n get leftDown() {\n return (this._flags & this.constructor.FLAGS.LEFT_DOWN) !== 0;\n }\n\n /**\n * Set the left down flag\n *\n * @param {boolean} yn - Is the left mouse button down?\n */\n set leftDown(yn) {\n this._doSet(this.constructor.FLAGS.LEFT_DOWN, yn);\n }\n}\n\nInteractionTrackingData.FLAGS = Object.freeze({\n NONE: 0,\n OVER: 1 << 0,\n LEFT_DOWN: 1 << 1,\n RIGHT_DOWN: 1 << 2,\n});\n","import '../patch/EventDispatcher';\nimport '../patch/Object3D';\n\nimport { EventDispatcher, Raycaster } from 'three';\nimport InteractionData from './InteractionData';\nimport InteractionEvent from './InteractionEvent';\nimport InteractionTrackingData from './InteractionTrackingData';\n\nconst MOUSE_POINTER_ID = 'MOUSE';\n\n// helpers for hitTest() - only used inside hitTest()\nconst hitTestEvent = {\n target: null,\n data: {\n global: null,\n },\n};\n\n/**\n * The interaction manager deals with mouse, touch and pointer events. Any DisplayObject can be interactive\n * if its interactive parameter is set to true\n * This manager also supports multitouch.\n *\n * reference to [pixi.js](http://www.pixijs.com/) impl\n *\n * @private\n * @class\n * @extends EventDispatcher\n */\nclass InteractionManager extends EventDispatcher {\n /**\n * @param {WebGLRenderer} renderer - A reference to the current renderer\n * @param {Scene} scene - A reference to the current scene\n * @param {Camera} camera - A reference to the current camera\n * @param {Object} [options] - The options for the manager.\n * @param {Boolean} [options.autoPreventDefault=false] - Should the manager automatically prevent default browser actions.\n * @param {Boolean} [options.autoAttach=true] - Should the manager automatically attach target element.\n * @param {Number} [options.interactionFrequency=10] - Frequency increases the interaction events will be checked.\n */\n constructor(renderer, scene, camera, options) {\n super();\n\n options = options || {};\n\n this.objects = null;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {WebGLRenderer}\n */\n this.renderer = renderer;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {Scene}\n */\n this.scene = scene;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {Camera}\n */\n this.camera = camera;\n\n /**\n * Should default browser actions automatically be prevented.\n * Does not apply to pointer events for backwards compatibility\n * preventDefault on pointer events stops mouse events from firing\n * Thus, for every pointer event, there will always be either a mouse of touch event alongside it.\n *\n * @member {boolean}\n * @default false\n */\n this.autoPreventDefault = options.autoPreventDefault || false;\n\n /**\n * Frequency in milliseconds that the mousemove, moveover & mouseout interaction events will be checked.\n *\n * @member {number}\n * @default 10\n */\n this.interactionFrequency = options.interactionFrequency || 10;\n\n /**\n * The mouse data\n *\n * @member {InteractionData}\n */\n this.mouse = new InteractionData();\n this.mouse.identifier = MOUSE_POINTER_ID;\n\n // setting the mouse to start off far off screen will mean that mouse over does\n // not get called before we even move the mouse.\n this.mouse.global.set(-999999);\n\n /**\n * Actively tracked InteractionData\n *\n * @private\n * @member {Object.}\n */\n this.activeInteractionData = {};\n this.activeInteractionData[MOUSE_POINTER_ID] = this.mouse;\n\n /**\n * Pool of unused InteractionData\n *\n * @private\n * @member {InteractionData[]}\n */\n this.interactionDataPool = [];\n\n /**\n * An event data object to handle all the event tracking/dispatching\n *\n * @member {object}\n */\n this.eventData = new InteractionEvent();\n\n /**\n * The DOM element to bind to.\n *\n * @private\n * @member {HTMLElement}\n */\n this.interactionDOMElement = null;\n\n /**\n * This property determines if mousemove and touchmove events are fired only when the cursor\n * is over the object.\n * Setting to true will make things work more in line with how the DOM verison works.\n * Setting to false can make things easier for things like dragging\n * It is currently set to false as this is how three.js used to work.\n *\n * @member {boolean}\n * @default true\n */\n this.moveWhenInside = true;\n\n /**\n * Have events been attached to the dom element?\n *\n * @private\n * @member {boolean}\n */\n this.eventsAdded = false;\n\n /**\n * Is the mouse hovering over the renderer?\n *\n * @private\n * @member {boolean}\n */\n this.mouseOverRenderer = false;\n\n /**\n * Does the device support touch events\n * https://www.w3.org/TR/touch-events/\n *\n * @readonly\n * @member {boolean}\n */\n this.supportsTouchEvents = 'ontouchstart' in window;\n\n /**\n * Does the device support pointer events\n * https://www.w3.org/Submission/pointer-events/\n *\n * @readonly\n * @member {boolean}\n */\n this.supportsPointerEvents = !!window.PointerEvent;\n\n // this will make it so that you don't have to call bind all the time\n\n /**\n * @private\n * @member {Function}\n */\n this.onClick = this.onClick.bind(this);\n this.processClick = this.processClick.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerUp = this.onPointerUp.bind(this);\n this.processPointerUp = this.processPointerUp.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerCancel = this.onPointerCancel.bind(this);\n this.processPointerCancel = this.processPointerCancel.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerDown = this.onPointerDown.bind(this);\n this.processPointerDown = this.processPointerDown.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerMove = this.onPointerMove.bind(this);\n this.processPointerMove = this.processPointerMove.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerOut = this.onPointerOut.bind(this);\n this.processPointerOverOut = this.processPointerOverOut.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerOver = this.onPointerOver.bind(this);\n\n /**\n * Dictionary of how different cursor modes are handled. Strings are handled as CSS cursor\n * values, objects are handled as dictionaries of CSS values for interactionDOMElement,\n * and functions are called instead of changing the CSS.\n * Default CSS cursor values are provided for 'default' and 'pointer' modes.\n * @member {Object.)>}\n */\n this.cursorStyles = {\n default: 'inherit',\n pointer: 'pointer',\n };\n\n /**\n * The mode of the cursor that is being used.\n * The value of this is a key from the cursorStyles dictionary.\n *\n * @member {string}\n */\n this.currentCursorMode = null;\n\n /**\n * Internal cached let.\n *\n * @private\n * @member {string}\n */\n this.cursor = null;\n\n /**\n * ray caster, for survey intersects from 3d-scene\n *\n * @private\n * @member {Raycaster}\n */\n this.raycaster = new Raycaster();\n\n /**\n * snippet time\n *\n * @private\n * @member {Number}\n */\n this._deltaTime = 0;\n\n this.setTargetElement(this.renderer.domElement);\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed on the display\n * object.\n *\n * @event InteractionManager#mousedown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * on the display object.\n *\n * @event InteractionManager#rightdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released over the display\n * object.\n *\n * @event InteractionManager#mouseup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * over the display object.\n *\n * @event InteractionManager#rightup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed and released on\n * the display object.\n *\n * @event InteractionManager#click\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * and released on the display object.\n *\n * @event InteractionManager#rightclick\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released outside the\n * display object that initially registered a\n * [mousedown]{@link InteractionManager#event:mousedown}.\n *\n * @event InteractionManager#mouseupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * outside the display object that initially registered a\n * [rightdown]{@link InteractionManager#event:rightdown}.\n *\n * @event InteractionManager#rightupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved while over the display object\n *\n * @event InteractionManager#mousemove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved onto the display object\n *\n * @event InteractionManager#mouseover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved off the display object\n *\n * @event InteractionManager#mouseout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed on the display object.\n *\n * @event InteractionManager#pointerdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released over the display object.\n *\n * @event InteractionManager#pointerup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a pointer event\n *\n * @event InteractionManager#pointercancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed and released on the display object.\n *\n * @event InteractionManager#pointertap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released outside the display object that initially\n * registered a [pointerdown]{@link InteractionManager#event:pointerdown}.\n *\n * @event InteractionManager#pointerupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved while over the display object\n *\n * @event InteractionManager#pointermove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved onto the display object\n *\n * @event InteractionManager#pointerover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved off the display object\n *\n * @event InteractionManager#pointerout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed on the display object.\n *\n * @event InteractionManager#touchstart\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed from the display object.\n *\n * @event InteractionManager#touchend\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a touch\n *\n * @event InteractionManager#touchcancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed and removed from the display object.\n *\n * @event InteractionManager#tap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed outside of the display object that initially\n * registered a [touchstart]{@link InteractionManager#event:touchstart}.\n *\n * @event InteractionManager#touchendoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is moved along the display object.\n *\n * @event InteractionManager#touchmove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed on the display.\n * object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mousedown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * on the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released over the display\n * object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * over the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed and released on\n * the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#click\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * and released on the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightclick\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released outside the\n * display object that initially registered a\n * [mousedown]{@link Object3D#event:mousedown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * outside the display object that initially registered a\n * [rightdown]{@link Object3D#event:rightdown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved while over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mousemove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved onto the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved off the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a pointer event.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointercancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed and released on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointertap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released outside the display object that initially\n * registered a [pointerdown]{@link Object3D#event:pointerdown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved while over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointermove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved onto the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved off the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchstart\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed from the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchend\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a touch.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchcancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed and removed from the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#tap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed outside of the display object that initially\n * registered a [touchstart]{@link Object3D#event:touchstart}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchendoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is moved along the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchmove\n * @param {InteractionEvent} event - Interaction event\n */\n }\n\n /**\n * Hit tests a point against the display tree, returning the first interactive object that is hit.\n *\n * @param {Point} globalPoint - A point to hit test with, in global space.\n * @param {Object3D} [root] - The root display object to start from. If omitted, defaults\n * to the last rendered root of the associated renderer.\n * @return {Object3D} The hit display object, if any.\n */\n hitTest(globalPoint, root) {\n // clear the target for our hit test\n hitTestEvent.target = null;\n // assign the global point\n hitTestEvent.data.global = globalPoint;\n // ensure safety of the root\n if (!root) {\n root = this.scene;\n }\n // run the hit test\n this.processInteractive(hitTestEvent, root, null, true);\n // return our found object - it'll be null if we didn't hit anything\n\n return hitTestEvent.target;\n }\n\n /**\n * Sets the DOM element which will receive mouse/touch events. This is useful for when you have\n * other DOM elements on top of the renderers Canvas element. With this you'll be bale to deletegate\n * another DOM element to receive those events.\n *\n * @param {HTMLCanvasElement} element - the DOM element which will receive mouse and touch events.\n */\n setTargetElement(element) {\n this.removeEvents();\n\n this.interactionDOMElement = element;\n\n this.addEvents();\n }\n\n /**\n * Registers all the DOM events\n *\n * @private\n */\n addEvents() {\n if (!this.interactionDOMElement || this.eventsAdded) {\n return;\n }\n\n this.emit('addevents');\n\n this.interactionDOMElement.addEventListener('click', this.onClick, true);\n\n if (window.navigator.msPointerEnabled) {\n this.interactionDOMElement.style['-ms-content-zooming'] = 'none';\n this.interactionDOMElement.style['-ms-touch-action'] = 'none';\n } else if (this.supportsPointerEvents) {\n this.interactionDOMElement.style['touch-action'] = 'none';\n }\n\n /**\n * These events are added first, so that if pointer events are normalised, they are fired\n * in the same order as non-normalised events. ie. pointer event 1st, mouse / touch 2nd\n */\n if (this.supportsPointerEvents) {\n window.document.addEventListener('pointermove', this.onPointerMove, true);\n this.interactionDOMElement.addEventListener('pointerdown', this.onPointerDown, true);\n // pointerout is fired in addition to pointerup (for touch events) and pointercancel\n // we already handle those, so for the purposes of what we do in onPointerOut, we only\n // care about the pointerleave event\n this.interactionDOMElement.addEventListener('pointerleave', this.onPointerOut, true);\n this.interactionDOMElement.addEventListener('pointerover', this.onPointerOver, true);\n window.addEventListener('pointercancel', this.onPointerCancel, true);\n window.addEventListener('pointerup', this.onPointerUp, true);\n } else {\n window.document.addEventListener('mousemove', this.onPointerMove, true);\n this.interactionDOMElement.addEventListener('mousedown', this.onPointerDown, true);\n this.interactionDOMElement.addEventListener('mouseout', this.onPointerOut, true);\n this.interactionDOMElement.addEventListener('mouseover', this.onPointerOver, true);\n window.addEventListener('mouseup', this.onPointerUp, true);\n }\n\n // always look directly for touch events so that we can provide original data\n // In a future version we should change this to being just a fallback and rely solely on\n // PointerEvents whenever available\n if (this.supportsTouchEvents) {\n this.interactionDOMElement.addEventListener('touchstart', this.onPointerDown, true);\n this.interactionDOMElement.addEventListener('touchcancel', this.onPointerCancel, true);\n this.interactionDOMElement.addEventListener('touchend', this.onPointerUp, true);\n this.interactionDOMElement.addEventListener('touchmove', this.onPointerMove, true);\n }\n\n this.eventsAdded = true;\n }\n\n /**\n * Removes all the DOM events that were previously registered\n *\n * @private\n */\n removeEvents() {\n if (!this.interactionDOMElement) {\n return;\n }\n\n this.emit('removeevents');\n\n this.interactionDOMElement.removeEventListener('click', this.onClick, true);\n\n if (window.navigator.msPointerEnabled) {\n this.interactionDOMElement.style['-ms-content-zooming'] = '';\n this.interactionDOMElement.style['-ms-touch-action'] = '';\n } else if (this.supportsPointerEvents) {\n this.interactionDOMElement.style['touch-action'] = '';\n }\n\n if (this.supportsPointerEvents) {\n window.document.removeEventListener('pointermove', this.onPointerMove, true);\n this.interactionDOMElement.removeEventListener('pointerdown', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('pointerleave', this.onPointerOut, true);\n this.interactionDOMElement.removeEventListener('pointerover', this.onPointerOver, true);\n window.removeEventListener('pointercancel', this.onPointerCancel, true);\n window.removeEventListener('pointerup', this.onPointerUp, true);\n } else {\n window.document.removeEventListener('mousemove', this.onPointerMove, true);\n this.interactionDOMElement.removeEventListener('mousedown', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('mouseout', this.onPointerOut, true);\n this.interactionDOMElement.removeEventListener('mouseover', this.onPointerOver, true);\n window.removeEventListener('mouseup', this.onPointerUp, true);\n }\n\n if (this.supportsTouchEvents) {\n this.interactionDOMElement.removeEventListener('touchstart', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('touchcancel', this.onPointerCancel, true);\n this.interactionDOMElement.removeEventListener('touchend', this.onPointerUp, true);\n this.interactionDOMElement.removeEventListener('touchmove', this.onPointerMove, true);\n }\n\n this.interactionDOMElement = null;\n\n this.eventsAdded = false;\n }\n\n /**\n * Updates the state of interactive objects.\n * Invoked by a throttled ticker.\n *\n * @param {number} deltaTime - time delta since last tick\n */\n update({ snippet }) {\n this._deltaTime += snippet;\n\n if (this._deltaTime < this.interactionFrequency) {\n return;\n }\n\n this._deltaTime = 0;\n\n if (!this.interactionDOMElement) {\n return;\n }\n\n // if the user move the mouse this check has already been done using the mouse move!\n if (this.didMove) {\n this.didMove = false;\n\n return;\n }\n\n this.cursor = null;\n\n // Resets the flag as set by a stopPropagation call. This flag is usually reset by a user interaction of any kind,\n // but there was a scenario of a display object moving under a static mouse cursor.\n // In this case, mouseover and mouseevents would not pass the flag test in triggerEvent function\n for (const k in this.activeInteractionData) {\n // eslint-disable-next-line no-prototype-builtins\n if (this.activeInteractionData.hasOwnProperty(k)) {\n const interactionData = this.activeInteractionData[k];\n\n if (interactionData.originalEvent && interactionData.pointerType !== 'touch') {\n const interactionEvent = this.configureInteractionEventForDOMEvent(\n this.eventData,\n interactionData.originalEvent,\n interactionData\n );\n\n this.processInteractive(\n interactionEvent,\n this.scene,\n this.processPointerOverOut,\n true\n );\n }\n }\n }\n\n this.setCursorMode(this.cursor);\n\n // TODO\n }\n\n /**\n * Sets the current cursor mode, handling any callbacks or CSS style changes.\n *\n * @param {string} mode - cursor mode, a key from the cursorStyles dictionary\n */\n setCursorMode(mode) {\n mode = mode || 'default';\n // if the mode didn't actually change, bail early\n if (this.currentCursorMode === mode) {\n return;\n }\n this.currentCursorMode = mode;\n const style = this.cursorStyles[mode];\n\n // only do things if there is a cursor style for it\n if (style) {\n switch (typeof style) {\n case 'string':\n // string styles are handled as cursor CSS\n this.interactionDOMElement.style.cursor = style;\n break;\n case 'function':\n // functions are just called, and passed the cursor mode\n style(mode);\n break;\n case 'object':\n // if it is an object, assume that it is a dictionary of CSS styles,\n // apply it to the interactionDOMElement\n Object.assign(this.interactionDOMElement.style, style);\n break;\n default:\n break;\n }\n } else if (typeof mode === 'string' && !Object.prototype.hasOwnProperty.call(this.cursorStyles, mode)) {\n // if it mode is a string (not a Symbol) and cursorStyles doesn't have any entry\n // for the mode, then assume that the dev wants it to be CSS for the cursor.\n this.interactionDOMElement.style.cursor = mode;\n }\n }\n\n /**\n * Dispatches an event on the display object that was interacted with\n *\n * @param {Object3D} displayObject - the display object in question\n * @param {string} eventString - the name of the event (e.g, mousedown)\n * @param {object} eventData - the event data object\n * @private\n */\n triggerEvent(displayObject, eventString, eventData) {\n if (!eventData.stopped) {\n eventData.currentTarget = displayObject;\n eventData.type = eventString;\n\n displayObject.emit(eventString, eventData);\n\n if (displayObject[eventString]) {\n displayObject[eventString](eventData);\n }\n }\n }\n\n /**\n * This function is provides a neat way of crawling through the scene graph and running a\n * specified function on all interactive objects it finds. It will also take care of hit\n * testing the interactive objects and passes the hit across in the function.\n *\n * @private\n * @param {InteractionEvent} interactionEvent - event containing the point that\n * is tested for collision\n * @param {Object3D} displayObject - the displayObject\n * that will be hit test (recursively crawls its children)\n * @param {Function} [func] - the function that will be called on each interactive object. The\n * interactionEvent, displayObject and hit will be passed to the function\n * @param {boolean} [hitTest] - this indicates if the objects inside should be hit test against the point\n * @param {boolean} [interactive] - Whether the displayObject is interactive\n * @return {boolean} returns true if the displayObject hit the point\n */\n processInteractive(interactionEvent, displayObject, func, hitTest, interactive) {\n if (!displayObject || !displayObject.visible) {\n return false;\n }\n\n // Took a little while to rework this function correctly! But now it is done and nice and optimised. ^_^\n //\n // This function will now loop through all objects and then only hit test the objects it HAS\n // to, not all of them. MUCH faster..\n // An object will be hit test if the following is true:\n //\n // 1: It is interactive.\n // 2: It belongs to a parent that is interactive AND one of the parents children have not already been hit.\n //\n // As another little optimisation once an interactive object has been hit we can carry on\n // through the scenegraph, but we know that there will be no more hits! So we can avoid extra hit tests\n // A final optimisation is that an object is not hit test directly if a child has already been hit.\n\n interactive = displayObject.interactive || interactive;\n\n let hit = false;\n let interactiveParent = interactive;\n\n if (displayObject.interactiveChildren && displayObject.children) {\n const children = displayObject.children;\n\n for (let i = children.length - 1; i >= 0; i--) {\n const child = children[i];\n\n // time to get recursive.. if this function will return if something is hit..\n const childHit = this.processInteractive(interactionEvent, child, func, hitTest, interactiveParent);\n\n if (childHit) {\n // its a good idea to check if a child has lost its parent.\n // this means it has been removed whilst looping so its best\n if (!child.parent) {\n continue;\n }\n\n // we no longer need to hit test any more objects in this container as we we\n // now know the parent has been hit\n interactiveParent = false;\n\n // If the child is interactive , that means that the object hit was actually\n // interactive and not just the child of an interactive object.\n // This means we no longer need to hit test anything else. We still need to run\n // through all objects, but we don't need to perform any hit tests.\n\n if (childHit) {\n if (interactionEvent.target) {\n hitTest = false;\n }\n hit = true;\n }\n }\n }\n }\n\n // no point running this if the item is not interactive or does not have an interactive parent.\n if (interactive) {\n // if we are hit testing (as in we have no hit any objects yet)\n // We also don't need to worry about hit testing if once of the displayObjects children\n // has already been hit - but only if it was interactive, otherwise we need to keep\n // looking for an interactive child, just in case we hit one\n if (hitTest && !interactionEvent.target) {\n if (interactionEvent.intersects[0] && interactionEvent.intersects[0].object === displayObject) {\n hit = true;\n }\n }\n\n if (displayObject.interactive) {\n if (hit && !interactionEvent.target) {\n interactionEvent.data.target = interactionEvent.target = displayObject;\n }\n\n if (func) {\n func(interactionEvent, displayObject, !!hit);\n }\n }\n }\n\n return hit;\n }\n\n\n /**\n * Is called when the click is pressed down on the renderer element\n *\n * @private\n * @param {MouseEvent} originalEvent - The DOM event of a click being pressed down\n */\n onClick(originalEvent) {\n if (originalEvent.type !== 'click') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n if (this.autoPreventDefault && events[0].isNormalized) {\n originalEvent.preventDefault();\n }\n\n const interactionData = this.getInteractionDataForPointerId(events[0]);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, events[0], interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n this.processInteractive(interactionEvent, this.scene, this.processClick, true);\n\n this.emit('click', interactionEvent);\n }\n\n /**\n * Processes the result of the click check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processClick(interactionEvent, displayObject, hit) {\n if (hit) {\n this.triggerEvent(displayObject, 'click', interactionEvent);\n }\n }\n\n /**\n * Is called when the pointer button is pressed down on the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being pressed down\n */\n onPointerDown(originalEvent) {\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n /**\n * No need to prevent default on natural pointer events, as there are no side effects\n * Normalized events, however, may have the double mousedown/touchstart issue on the native android browser,\n * so still need to be prevented.\n */\n\n // Guaranteed that there will be at least one event in events, and all events must have the same pointer type\n\n if (this.autoPreventDefault && events[0].isNormalized) {\n originalEvent.preventDefault();\n }\n\n const eventLen = events.length;\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n this.processInteractive(interactionEvent, this.scene, this.processPointerDown, true);\n\n this.emit('pointerdown', interactionEvent);\n if (event.pointerType === 'touch') {\n this.emit('touchstart', interactionEvent);\n } else if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n const isRightButton = event.button === 2;\n\n this.emit(isRightButton ? 'rightdown' : 'mousedown', this.eventData);\n }\n }\n }\n\n /**\n * Processes the result of the pointer down check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerDown(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n const id = interactionEvent.data.identifier;\n\n if (hit) {\n if (!displayObject.trackedPointers[id]) {\n displayObject.trackedPointers[id] = new InteractionTrackingData(id);\n }\n this.triggerEvent(displayObject, 'pointerdown', interactionEvent);\n\n if (data.pointerType === 'touch') {\n displayObject.started = true;\n this.triggerEvent(displayObject, 'touchstart', interactionEvent);\n } else if (data.pointerType === 'mouse' || data.pointerType === 'pen') {\n const isRightButton = data.button === 2;\n\n if (isRightButton) {\n displayObject.trackedPointers[id].rightDown = true;\n } else {\n displayObject.trackedPointers[id].leftDown = true;\n }\n\n this.triggerEvent(displayObject, isRightButton ? 'rightdown' : 'mousedown', interactionEvent);\n }\n }\n }\n\n /**\n * Is called when the pointer button is released on the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being released\n * @param {boolean} cancelled - true if the pointer is cancelled\n * @param {Function} func - Function passed to {@link processInteractive}\n */\n onPointerComplete(originalEvent, cancelled, func) {\n const events = this.normalizeToPointerData(originalEvent);\n\n const eventLen = events.length;\n\n // if the event wasn't targeting our canvas, then consider it to be pointerupoutside\n // in all cases (unless it was a pointercancel)\n const eventAppend = originalEvent.target !== this.interactionDOMElement ? 'outside' : '';\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n // perform hit testing for events targeting our canvas or cancel events\n this.processInteractive(interactionEvent, this.scene, func, cancelled || !eventAppend);\n\n this.emit(cancelled ? 'pointercancel' : `pointerup${eventAppend}`, interactionEvent);\n\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n const isRightButton = event.button === 2;\n\n this.emit(isRightButton ? `rightup${eventAppend}` : `mouseup${eventAppend}`, interactionEvent);\n } else if (event.pointerType === 'touch') {\n this.emit(cancelled ? 'touchcancel' : `touchend${eventAppend}`, interactionEvent);\n this.releaseInteractionDataForPointerId(event.pointerId, interactionData);\n }\n }\n }\n\n /**\n * Is called when the pointer button is cancelled\n *\n * @private\n * @param {PointerEvent} event - The DOM event of a pointer button being released\n */\n onPointerCancel(event) {\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && event.pointerType === 'touch') return;\n\n this.onPointerComplete(event, true, this.processPointerCancel);\n }\n\n /**\n * Processes the result of the pointer cancel check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n */\n processPointerCancel(interactionEvent, displayObject) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n if (displayObject.trackedPointers[id] !== undefined) {\n delete displayObject.trackedPointers[id];\n this.triggerEvent(displayObject, 'pointercancel', interactionEvent);\n\n if (data.pointerType === 'touch') {\n this.triggerEvent(displayObject, 'touchcancel', interactionEvent);\n }\n }\n }\n\n /**\n * Is called when the pointer button is released on the renderer element\n *\n * @private\n * @param {PointerEvent} event - The DOM event of a pointer button being released\n */\n onPointerUp(event) {\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && event.pointerType === 'touch') return;\n\n this.onPointerComplete(event, false, this.processPointerUp);\n }\n\n /**\n * Processes the result of the pointer up check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerUp(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n const trackingData = displayObject.trackedPointers[id];\n\n const isTouch = data.pointerType === 'touch';\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n // Mouse only\n if (isMouse) {\n const isRightButton = data.button === 2;\n\n const flags = InteractionTrackingData.FLAGS;\n\n const test = isRightButton ? flags.RIGHT_DOWN : flags.LEFT_DOWN;\n\n const isDown = trackingData !== undefined && (trackingData.flags & test);\n\n if (hit) {\n this.triggerEvent(displayObject, isRightButton ? 'rightup' : 'mouseup', interactionEvent);\n\n if (isDown) {\n this.triggerEvent(displayObject, isRightButton ? 'rightclick' : 'leftclick', interactionEvent);\n }\n } else if (isDown) {\n this.triggerEvent(displayObject, isRightButton ? 'rightupoutside' : 'mouseupoutside', interactionEvent);\n }\n // update the down state of the tracking data\n if (trackingData) {\n if (isRightButton) {\n trackingData.rightDown = false;\n } else {\n trackingData.leftDown = false;\n }\n }\n }\n\n // Pointers and Touches, and Mouse\n if (isTouch && displayObject.started) {\n displayObject.started = false;\n this.triggerEvent(displayObject, 'touchend', interactionEvent);\n }\n if (hit) {\n this.triggerEvent(displayObject, 'pointerup', interactionEvent);\n\n if (trackingData) {\n this.triggerEvent(displayObject, 'pointertap', interactionEvent);\n if (isTouch) {\n this.triggerEvent(displayObject, 'tap', interactionEvent);\n // touches are no longer over (if they ever were) when we get the touchend\n // so we should ensure that we don't keep pretending that they are\n trackingData.over = false;\n }\n }\n } else if (trackingData) {\n this.triggerEvent(displayObject, 'pointerupoutside', interactionEvent);\n if (isTouch) this.triggerEvent(displayObject, 'touchendoutside', interactionEvent);\n }\n // Only remove the tracking data if there is no over/down state still associated with it\n if (trackingData && trackingData.none) {\n delete displayObject.trackedPointers[id];\n }\n }\n\n /**\n * Is called when the pointer moves across the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer moving\n */\n onPointerMove(originalEvent) {\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n if (events[0].pointerType === 'mouse') {\n this.didMove = true;\n\n this.cursor = null;\n }\n\n const eventLen = events.length;\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n const interactive = event.pointerType === 'touch' ? this.moveWhenInside : true;\n\n this.processInteractive(\n interactionEvent,\n this.scene,\n this.processPointerMove,\n interactive\n );\n this.emit('pointermove', interactionEvent);\n if (event.pointerType === 'touch') this.emit('touchmove', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') this.emit('mousemove', interactionEvent);\n }\n\n if (events[0].pointerType === 'mouse') {\n this.setCursorMode(this.cursor);\n\n // TODO BUG for parents interactive object (border order issue)\n }\n }\n\n /**\n * Processes the result of the pointer move check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerMove(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const isTouch = data.pointerType === 'touch';\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n if (isMouse) {\n this.processPointerOverOut(interactionEvent, displayObject, hit);\n }\n\n if (isTouch && displayObject.started) this.triggerEvent(displayObject, 'touchmove', interactionEvent);\n if (!this.moveWhenInside || hit) {\n this.triggerEvent(displayObject, 'pointermove', interactionEvent);\n if (isMouse) this.triggerEvent(displayObject, 'mousemove', interactionEvent);\n }\n }\n\n /**\n * Is called when the pointer is moved out of the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer being moved out\n */\n onPointerOut(originalEvent) {\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n // Only mouse and pointer can call onPointerOut, so events will always be length 1\n const event = events[0];\n\n if (event.pointerType === 'mouse') {\n this.mouseOverRenderer = false;\n this.setCursorMode(null);\n }\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = event;\n\n this.processInteractive(interactionEvent, this.scene, this.processPointerOverOut, false);\n\n this.emit('pointerout', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n this.emit('mouseout', interactionEvent);\n } else {\n // we can get touchleave events after touchend, so we want to make sure we don't\n // introduce memory leaks\n this.releaseInteractionDataForPointerId(interactionData.identifier);\n }\n }\n\n /**\n * Processes the result of the pointer over/out check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerOverOut(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n let trackingData = displayObject.trackedPointers[id];\n\n // if we just moused over the display object, then we need to track that state\n if (hit && !trackingData) {\n trackingData = displayObject.trackedPointers[id] = new InteractionTrackingData(id);\n }\n\n if (trackingData === undefined) return;\n\n if (hit && this.mouseOverRenderer) {\n if (!trackingData.over) {\n trackingData.over = true;\n this.triggerEvent(displayObject, 'pointerover', interactionEvent);\n if (isMouse) {\n this.triggerEvent(displayObject, 'mouseover', interactionEvent);\n }\n }\n\n // only change the cursor if it has not already been changed (by something deeper in the\n // display tree)\n if (isMouse && this.cursor === null) {\n this.cursor = displayObject.cursor;\n }\n } else if (trackingData.over) {\n trackingData.over = false;\n this.triggerEvent(displayObject, 'pointerout', this.eventData);\n if (isMouse) {\n this.triggerEvent(displayObject, 'mouseout', interactionEvent);\n }\n // if there is no mouse down information for the pointer, then it is safe to delete\n if (trackingData.none) {\n delete displayObject.trackedPointers[id];\n }\n }\n }\n\n /**\n * Is called when the pointer is moved into the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being moved into the renderer view\n */\n onPointerOver(originalEvent) {\n const events = this.normalizeToPointerData(originalEvent);\n\n // Only mouse and pointer can call onPointerOver, so events will always be length 1\n const event = events[0];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = event;\n\n if (event.pointerType === 'mouse') {\n this.mouseOverRenderer = true;\n }\n\n this.emit('pointerover', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n this.emit('mouseover', interactionEvent);\n }\n }\n\n /**\n * Get InteractionData for a given pointerId. Store that data as well\n *\n * @private\n * @param {PointerEvent} event - Normalized pointer event, output from normalizeToPointerData\n * @return {InteractionData} - Interaction data for the given pointer identifier\n */\n getInteractionDataForPointerId(event) {\n const pointerId = event.pointerId;\n\n let interactionData;\n\n if (pointerId === MOUSE_POINTER_ID || event.pointerType === 'mouse') {\n interactionData = this.mouse;\n } else if (this.activeInteractionData[pointerId]) {\n interactionData = this.activeInteractionData[pointerId];\n } else {\n interactionData = this.interactionDataPool.pop() || new InteractionData();\n interactionData.identifier = pointerId;\n this.activeInteractionData[pointerId] = interactionData;\n }\n // copy properties from the event, so that we can make sure that touch/pointer specific\n // data is available\n interactionData._copyEvent(event);\n\n return interactionData;\n }\n\n /**\n * Return unused InteractionData to the pool, for a given pointerId\n *\n * @private\n * @param {number} pointerId - Identifier from a pointer event\n */\n releaseInteractionDataForPointerId(pointerId) {\n const interactionData = this.activeInteractionData[pointerId];\n\n if (interactionData) {\n delete this.activeInteractionData[pointerId];\n interactionData._reset();\n this.interactionDataPool.push(interactionData);\n }\n }\n\n /**\n * Maps x and y coords from a DOM object and maps them correctly to the three.js view. The\n * resulting value is stored in the point. This takes into account the fact that the DOM\n * element could be scaled and positioned anywhere on the screen.\n *\n * @param {Vector2} point - the point that the result will be stored in\n * @param {number} x - the x coord of the position to map\n * @param {number} y - the y coord of the position to map\n */\n mapPositionToPoint(point, x, y) {\n let rect;\n\n // IE 11 fix\n if (!this.interactionDOMElement.parentElement) {\n rect = {\n x: 0,\n y: 0,\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n };\n } else {\n rect = this.interactionDOMElement.getBoundingClientRect();\n }\n\n point.x = ((x - rect.left) / rect.width) * 2 - 1;\n point.y = -((y - rect.top) / rect.height) * 2 + 1;\n }\n\n /**\n * Configure an InteractionEvent to wrap a DOM PointerEvent and InteractionData\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The event to be configured\n * @param {PointerEvent} pointerEvent - The DOM event that will be paired with the InteractionEvent\n * @param {InteractionData} interactionData - The InteractionData that will be paired\n * with the InteractionEvent\n * @return {InteractionEvent} the interaction event that was passed in\n */\n configureInteractionEventForDOMEvent(interactionEvent, pointerEvent, interactionData) {\n interactionEvent.data = interactionData;\n\n this.mapPositionToPoint(interactionData.global, pointerEvent.clientX, pointerEvent.clientY);\n\n this.raycaster.setFromCamera(interactionData.global, this.camera);\n\n // Not really sure why this is happening, but it's how a previous version handled things TODO: there should be remove\n if (pointerEvent.pointerType === 'touch') {\n pointerEvent.globalX = interactionData.global.x;\n pointerEvent.globalY = interactionData.global.y;\n }\n\n interactionData.originalEvent = pointerEvent;\n interactionEvent._reset();\n if (this.objectsToRaycast) {\n interactionEvent.intersects = this.raycaster.intersectObjects(this.objectsToRaycast, true);\n } else {\n interactionEvent.intersects = this.raycaster.intersectObjects(this.scene.children, true);\n }\n return interactionEvent;\n }\n\n /**\n * set objects to raycast\n *\n * @param {Object3D} objects\n * @memberof InteractionManager\n */\n setObjectsToRaycast(objects) {\n this.objectsToRaycast = objects;\n }\n\n /**\n * Ensures that the original event object contains all data that a regular pointer event would have\n *\n * @private\n * @param {TouchEvent|MouseEvent|PointerEvent} event - The original event data from a touch or mouse event\n * @return {PointerEvent[]} An array containing a single normalized pointer event, in the case of a pointer\n * or mouse event, or a multiple normalized pointer events if there are multiple changed touches\n */\n normalizeToPointerData(event) {\n const normalizedEvents = [];\n\n if (this.supportsTouchEvents && event instanceof TouchEvent) {\n for (let i = 0, li = event.changedTouches.length; i < li; i++) {\n const touch = event.changedTouches[i];\n\n if (typeof touch.button === 'undefined') touch.button = event.touches.length ? 1 : 0;\n if (typeof touch.buttons === 'undefined') touch.buttons = event.touches.length ? 1 : 0;\n if (typeof touch.isPrimary === 'undefined') {\n touch.isPrimary = event.touches.length === 1 && event.type === 'touchstart';\n }\n if (typeof touch.width === 'undefined') touch.width = touch.radiusX || 1;\n if (typeof touch.height === 'undefined') touch.height = touch.radiusY || 1;\n if (typeof touch.tiltX === 'undefined') touch.tiltX = 0;\n if (typeof touch.tiltY === 'undefined') touch.tiltY = 0;\n if (typeof touch.pointerType === 'undefined') touch.pointerType = 'touch';\n if (typeof touch.pointerId === 'undefined') touch.pointerId = touch.identifier || 0;\n if (typeof touch.pressure === 'undefined') touch.pressure = touch.force || 0.5;\n touch.twist = 0;\n touch.tangentialPressure = 0;\n // TODO: Remove these, as layerX/Y is not a standard, is deprecated, has uneven\n // support, and the fill ins are not quite the same\n // offsetX/Y might be okay, but is not the same as clientX/Y when the canvas's top\n // left is not 0,0 on the page\n if (typeof touch.layerX === 'undefined') touch.layerX = touch.offsetX = touch.clientX;\n if (typeof touch.layerY === 'undefined') touch.layerY = touch.offsetY = touch.clientY;\n\n // mark the touch as normalized, just so that we know we did it\n touch.isNormalized = true;\n\n normalizedEvents.push(touch);\n }\n } else if (event instanceof MouseEvent && (!this.supportsPointerEvents || !(event instanceof window.PointerEvent))) {\n if (typeof event.isPrimary === 'undefined') event.isPrimary = true;\n if (typeof event.width === 'undefined') event.width = 1;\n if (typeof event.height === 'undefined') event.height = 1;\n if (typeof event.tiltX === 'undefined') event.tiltX = 0;\n if (typeof event.tiltY === 'undefined') event.tiltY = 0;\n if (typeof event.pointerType === 'undefined') event.pointerType = 'mouse';\n if (typeof event.pointerId === 'undefined') event.pointerId = MOUSE_POINTER_ID;\n if (typeof event.pressure === 'undefined') event.pressure = 0.5;\n event.twist = 0;\n event.tangentialPressure = 0;\n\n // mark the mouse event as normalized, just so that we know we did it\n event.isNormalized = true;\n\n normalizedEvents.push(event);\n } else {\n normalizedEvents.push(event);\n }\n\n return normalizedEvents;\n }\n\n /**\n * Destroys the interaction manager\n *\n */\n destroy() {\n this.removeEvents();\n\n this.removeAllListeners();\n\n this.renderer = null;\n\n this.mouse = null;\n\n this.eventData = null;\n\n this.interactionDOMElement = null;\n\n this.onPointerDown = null;\n this.processPointerDown = null;\n\n this.onPointerUp = null;\n this.processPointerUp = null;\n\n this.onPointerCancel = null;\n this.processPointerCancel = null;\n\n this.onPointerMove = null;\n this.processPointerMove = null;\n\n this.onPointerOut = null;\n this.processPointerOverOut = null;\n\n this.onPointerOver = null;\n\n this._tempPoint = null;\n }\n}\n\nexport default InteractionManager;\n","import '../patch/EventDispatcher';\nimport '../patch/Object3D';\n\nimport { EventDispatcher, Raycaster } from 'three';\nimport InteractionData from './InteractionData';\nimport InteractionEvent from './InteractionEvent';\nimport InteractionTrackingData from './InteractionTrackingData';\n\nconst MOUSE_POINTER_ID = 'MOUSE';\n\n// helpers for hitTest() - only used inside hitTest()\nconst hitTestEvent = {\n target: null,\n data: {\n global: null,\n },\n};\n\n/**\n * The interaction manager deals with mouse, touch and pointer events. Any DisplayObject can be interactive\n * if its interactive parameter is set to true\n * This manager also supports multitouch.\n *\n * reference to [pixi.js](http://www.pixijs.com/) impl\n *\n * @private\n * @class\n * @extends EventDispatcher\n */\nclass InteractionLayer extends EventDispatcher {\n /**\n * @param {WebGLRenderer} renderer - A reference to the current renderer\n * @param {Object} [options] - The options for the manager.\n * @param {Boolean} [options.autoPreventDefault=false] - Should the manager automatically prevent default browser actions.\n * @param {Boolean} [options.autoAttach=true] - Should the manager automatically attach target element.\n * @param {Number} [options.interactionFrequency=10] - Frequency increases the interaction events will be checked.\n */\n constructor(renderer, options) {\n super();\n\n options = options || {};\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {WebGLRenderer}\n */\n this.renderer = renderer;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {Layer}\n */\n this.layer = null;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {Scene}\n */\n // this.scene = scene;\n\n /**\n * The renderer this interaction manager works for.\n *\n * @member {Camera}\n */\n // this.camera = camera;\n\n /**\n * Should default browser actions automatically be prevented.\n * Does not apply to pointer events for backwards compatibility\n * preventDefault on pointer events stops mouse events from firing\n * Thus, for every pointer event, there will always be either a mouse of touch event alongside it.\n *\n * @member {boolean}\n * @default false\n */\n this.autoPreventDefault = options.autoPreventDefault || false;\n\n /**\n * Frequency in milliseconds that the mousemove, moveover & mouseout interaction events will be checked.\n *\n * @member {number}\n * @default 10\n */\n this.interactionFrequency = options.interactionFrequency || 10;\n\n /**\n * The mouse data\n *\n * @member {InteractionData}\n */\n this.mouse = new InteractionData();\n this.mouse.identifier = MOUSE_POINTER_ID;\n\n // setting the mouse to start off far off screen will mean that mouse over does\n // not get called before we even move the mouse.\n this.mouse.global.set(-999999);\n\n /**\n * Actively tracked InteractionData\n *\n * @private\n * @member {Object.}\n */\n this.activeInteractionData = {};\n this.activeInteractionData[MOUSE_POINTER_ID] = this.mouse;\n\n /**\n * Pool of unused InteractionData\n *\n * @private\n * @member {InteractionData[]}\n */\n this.interactionDataPool = [];\n\n /**\n * An event data object to handle all the event tracking/dispatching\n *\n * @member {object}\n */\n this.eventData = new InteractionEvent();\n\n /**\n * The DOM element to bind to.\n *\n * @private\n * @member {HTMLElement}\n */\n this.interactionDOMElement = null;\n\n /**\n * This property determines if mousemove and touchmove events are fired only when the cursor\n * is over the object.\n * Setting to true will make things work more in line with how the DOM verison works.\n * Setting to false can make things easier for things like dragging\n * It is currently set to false as this is how three.js used to work.\n *\n * @member {boolean}\n * @default true\n */\n this.moveWhenInside = true;\n\n /**\n * Have events been attached to the dom element?\n *\n * @private\n * @member {boolean}\n */\n this.eventsAdded = false;\n\n /**\n * Is the mouse hovering over the renderer?\n *\n * @private\n * @member {boolean}\n */\n this.mouseOverRenderer = false;\n\n /**\n * Does the device support touch events\n * https://www.w3.org/TR/touch-events/\n *\n * @readonly\n * @member {boolean}\n */\n this.supportsTouchEvents = 'ontouchstart' in window;\n\n /**\n * Does the device support pointer events\n * https://www.w3.org/Submission/pointer-events/\n *\n * @readonly\n * @member {boolean}\n */\n this.supportsPointerEvents = !!window.PointerEvent;\n\n // this will make it so that you don't have to call bind all the time\n\n /**\n * @private\n * @member {Function}\n */\n this.onClick = this.onClick.bind(this);\n this.processClick = this.processClick.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerUp = this.onPointerUp.bind(this);\n this.processPointerUp = this.processPointerUp.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerCancel = this.onPointerCancel.bind(this);\n this.processPointerCancel = this.processPointerCancel.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerDown = this.onPointerDown.bind(this);\n this.processPointerDown = this.processPointerDown.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerMove = this.onPointerMove.bind(this);\n this.processPointerMove = this.processPointerMove.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerOut = this.onPointerOut.bind(this);\n this.processPointerOverOut = this.processPointerOverOut.bind(this);\n\n /**\n * @private\n * @member {Function}\n */\n this.onPointerOver = this.onPointerOver.bind(this);\n\n /**\n * Dictionary of how different cursor modes are handled. Strings are handled as CSS cursor\n * values, objects are handled as dictionaries of CSS values for interactionDOMElement,\n * and functions are called instead of changing the CSS.\n * Default CSS cursor values are provided for 'default' and 'pointer' modes.\n * @member {Object.)>}\n */\n this.cursorStyles = {\n default: 'inherit',\n pointer: 'pointer',\n };\n\n /**\n * The mode of the cursor that is being used.\n * The value of this is a key from the cursorStyles dictionary.\n *\n * @member {string}\n */\n this.currentCursorMode = null;\n\n /**\n * Internal cached let.\n *\n * @private\n * @member {string}\n */\n this.cursor = null;\n\n /**\n * ray caster, for survey intersects from 3d-scene\n *\n * @private\n * @member {Raycaster}\n */\n this.raycaster = new Raycaster();\n\n /**\n * snippet time\n *\n * @private\n * @member {Number}\n */\n this._deltaTime = 0;\n\n this.setTargetElement(this.renderer.domElement);\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed on the display\n * object.\n *\n * @event InteractionLayer#mousedown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * on the display object.\n *\n * @event InteractionLayer#rightdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released over the display\n * object.\n *\n * @event InteractionLayer#mouseup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * over the display object.\n *\n * @event InteractionLayer#rightup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed and released on\n * the display object.\n *\n * @event InteractionLayer#click\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * and released on the display object.\n *\n * @event InteractionLayer#rightclick\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released outside the\n * display object that initially registered a\n * [mousedown]{@link InteractionLayer#event:mousedown}.\n *\n * @event InteractionLayer#mouseupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * outside the display object that initially registered a\n * [rightdown]{@link InteractionLayer#event:rightdown}.\n *\n * @event InteractionLayer#rightupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved while over the display object\n *\n * @event InteractionLayer#mousemove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved onto the display object\n *\n * @event InteractionLayer#mouseover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved off the display object\n *\n * @event InteractionLayer#mouseout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed on the display object.\n *\n * @event InteractionLayer#pointerdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released over the display object.\n *\n * @event InteractionLayer#pointerup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a pointer event\n *\n * @event InteractionLayer#pointercancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed and released on the display object.\n *\n * @event InteractionLayer#pointertap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released outside the display object that initially\n * registered a [pointerdown]{@link InteractionLayer#event:pointerdown}.\n *\n * @event InteractionLayer#pointerupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved while over the display object\n *\n * @event InteractionLayer#pointermove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved onto the display object\n *\n * @event InteractionLayer#pointerover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved off the display object\n *\n * @event InteractionLayer#pointerout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed on the display object.\n *\n * @event InteractionLayer#touchstart\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed from the display object.\n *\n * @event InteractionLayer#touchend\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a touch\n *\n * @event InteractionLayer#touchcancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed and removed from the display object.\n *\n * @event InteractionLayer#tap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed outside of the display object that initially\n * registered a [touchstart]{@link InteractionLayer#event:touchstart}.\n *\n * @event InteractionLayer#touchendoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is moved along the display object.\n *\n * @event InteractionLayer#touchmove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed on the display.\n * object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mousedown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * on the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released over the display\n * object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * over the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is pressed and released on\n * the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#click\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is pressed\n * and released on the display object. DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightclick\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button (usually a mouse left-button) is released outside the\n * display object that initially registered a\n * [mousedown]{@link Object3D#event:mousedown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device secondary button (usually a mouse right-button) is released\n * outside the display object that initially registered a\n * [rightdown]{@link Object3D#event:rightdown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#rightupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved while over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mousemove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved onto the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device (usually a mouse) is moved off the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#mouseout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerdown\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerup\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a pointer event.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointercancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is pressed and released on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointertap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device button is released outside the display object that initially\n * registered a [pointerdown]{@link Object3D#event:pointerdown}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerupoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved while over the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointermove\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved onto the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerover\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a pointer device is moved off the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#pointerout\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed on the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchstart\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed from the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchend\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when the operating system cancels a touch.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchcancel\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is placed and removed from the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#tap\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is removed outside of the display object that initially\n * registered a [touchstart]{@link Object3D#event:touchstart}.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchendoutside\n * @param {InteractionEvent} event - Interaction event\n */\n\n /**\n * Fired when a touch point is moved along the display object.\n * DisplayObject's `interactive` property must be set to `true` to fire event.\n *\n * @event Object3D#touchmove\n * @param {InteractionEvent} event - Interaction event\n */\n }\n\n /**\n * @return {boolean}\n */\n isAble() {\n return this.layer && this.layer.interactive;\n }\n\n /**\n * set layer\n * @param {Layer} layer layer\n */\n setLayer(layer) {\n this.layer = layer;\n }\n\n /**\n * Hit tests a point against the display tree, returning the first interactive object that is hit.\n *\n * @param {Point} globalPoint - A point to hit test with, in global space.\n * @param {Object3D} [root] - The root display object to start from. If omitted, defaults\n * to the last rendered root of the associated renderer.\n * @return {Object3D} The hit display object, if any.\n */\n hitTest(globalPoint, root) {\n if (!this.isAble()) return null;\n // clear the target for our hit test\n hitTestEvent.target = null;\n // assign the global point\n hitTestEvent.data.global = globalPoint;\n // ensure safety of the root\n if (!root) {\n root = this.layer.scene;\n }\n // run the hit test\n this.processInteractive(hitTestEvent, root, null, true);\n // return our found object - it'll be null if we didn't hit anything\n\n return hitTestEvent.target;\n }\n\n /**\n * Sets the DOM element which will receive mouse/touch events. This is useful for when you have\n * other DOM elements on top of the renderers Canvas element. With this you'll be bale to deletegate\n * another DOM element to receive those events.\n *\n * @param {HTMLCanvasElement} element - the DOM element which will receive mouse and touch events.\n */\n setTargetElement(element) {\n this.removeEvents();\n\n this.interactionDOMElement = element;\n\n this.addEvents();\n }\n\n /**\n * Registers all the DOM events\n *\n * @private\n */\n addEvents() {\n if (!this.interactionDOMElement || this.eventsAdded) {\n return;\n }\n\n this.emit('addevents');\n\n this.interactionDOMElement.addEventListener('click', this.onClick, true);\n\n if (window.navigator.msPointerEnabled) {\n this.interactionDOMElement.style['-ms-content-zooming'] = 'none';\n this.interactionDOMElement.style['-ms-touch-action'] = 'none';\n } else if (this.supportsPointerEvents) {\n this.interactionDOMElement.style['touch-action'] = 'none';\n }\n\n /**\n * These events are added first, so that if pointer events are normalised, they are fired\n * in the same order as non-normalised events. ie. pointer event 1st, mouse / touch 2nd\n */\n if (this.supportsPointerEvents) {\n window.document.addEventListener('pointermove', this.onPointerMove, true);\n this.interactionDOMElement.addEventListener('pointerdown', this.onPointerDown, true);\n // pointerout is fired in addition to pointerup (for touch events) and pointercancel\n // we already handle those, so for the purposes of what we do in onPointerOut, we only\n // care about the pointerleave event\n this.interactionDOMElement.addEventListener('pointerleave', this.onPointerOut, true);\n this.interactionDOMElement.addEventListener('pointerover', this.onPointerOver, true);\n window.addEventListener('pointercancel', this.onPointerCancel, true);\n window.addEventListener('pointerup', this.onPointerUp, true);\n } else {\n window.document.addEventListener('mousemove', this.onPointerMove, true);\n this.interactionDOMElement.addEventListener('mousedown', this.onPointerDown, true);\n this.interactionDOMElement.addEventListener('mouseout', this.onPointerOut, true);\n this.interactionDOMElement.addEventListener('mouseover', this.onPointerOver, true);\n window.addEventListener('mouseup', this.onPointerUp, true);\n }\n\n // always look directly for touch events so that we can provide original data\n // In a future version we should change this to being just a fallback and rely solely on\n // PointerEvents whenever available\n if (this.supportsTouchEvents) {\n this.interactionDOMElement.addEventListener('touchstart', this.onPointerDown, true);\n this.interactionDOMElement.addEventListener('touchcancel', this.onPointerCancel, true);\n this.interactionDOMElement.addEventListener('touchend', this.onPointerUp, true);\n this.interactionDOMElement.addEventListener('touchmove', this.onPointerMove, true);\n }\n\n this.eventsAdded = true;\n }\n\n /**\n * Removes all the DOM events that were previously registered\n *\n * @private\n */\n removeEvents() {\n if (!this.interactionDOMElement) {\n return;\n }\n\n this.emit('removeevents');\n\n this.interactionDOMElement.removeEventListener('click', this.onClick, true);\n\n if (window.navigator.msPointerEnabled) {\n this.interactionDOMElement.style['-ms-content-zooming'] = '';\n this.interactionDOMElement.style['-ms-touch-action'] = '';\n } else if (this.supportsPointerEvents) {\n this.interactionDOMElement.style['touch-action'] = '';\n }\n\n if (this.supportsPointerEvents) {\n window.document.removeEventListener('pointermove', this.onPointerMove, true);\n this.interactionDOMElement.removeEventListener('pointerdown', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('pointerleave', this.onPointerOut, true);\n this.interactionDOMElement.removeEventListener('pointerover', this.onPointerOver, true);\n window.removeEventListener('pointercancel', this.onPointerCancel, true);\n window.removeEventListener('pointerup', this.onPointerUp, true);\n } else {\n window.document.removeEventListener('mousemove', this.onPointerMove, true);\n this.interactionDOMElement.removeEventListener('mousedown', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('mouseout', this.onPointerOut, true);\n this.interactionDOMElement.removeEventListener('mouseover', this.onPointerOver, true);\n window.removeEventListener('mouseup', this.onPointerUp, true);\n }\n\n if (this.supportsTouchEvents) {\n this.interactionDOMElement.removeEventListener('touchstart', this.onPointerDown, true);\n this.interactionDOMElement.removeEventListener('touchcancel', this.onPointerCancel, true);\n this.interactionDOMElement.removeEventListener('touchend', this.onPointerUp, true);\n this.interactionDOMElement.removeEventListener('touchmove', this.onPointerMove, true);\n }\n\n this.interactionDOMElement = null;\n\n this.eventsAdded = false;\n }\n\n /**\n * Updates the state of interactive objects.\n * Invoked by a throttled ticker.\n *\n * @param {number} deltaTime - time delta since last tick\n */\n update({ snippet }) {\n if (!this.isAble()) return;\n this._deltaTime += snippet;\n\n if (this._deltaTime < this.interactionFrequency) {\n return;\n }\n\n this._deltaTime = 0;\n\n if (!this.interactionDOMElement) {\n return;\n }\n\n // if the user move the mouse this check has already been done using the mouse move!\n if (this.didMove) {\n this.didMove = false;\n\n return;\n }\n\n this.cursor = null;\n\n // Resets the flag as set by a stopPropagation call. This flag is usually reset by a user interaction of any kind,\n // but there was a scenario of a display object moving under a static mouse cursor.\n // In this case, mouseover and mouseevents would not pass the flag test in triggerEvent function\n for (const k in this.activeInteractionData) {\n // eslint-disable-next-line no-prototype-builtins\n if (this.activeInteractionData.hasOwnProperty(k)) {\n const interactionData = this.activeInteractionData[k];\n\n if (interactionData.originalEvent && interactionData.pointerType !== 'touch') {\n const interactionEvent = this.configureInteractionEventForDOMEvent(\n this.eventData,\n interactionData.originalEvent,\n interactionData\n );\n\n this.processInteractive(\n interactionEvent,\n this.layer.scene,\n this.processPointerOverOut,\n true\n );\n }\n }\n }\n\n this.setCursorMode(this.cursor);\n\n // TODO\n }\n\n /**\n * Sets the current cursor mode, handling any callbacks or CSS style changes.\n *\n * @param {string} mode - cursor mode, a key from the cursorStyles dictionary\n */\n setCursorMode(mode) {\n mode = mode || 'default';\n // if the mode didn't actually change, bail early\n if (this.currentCursorMode === mode) {\n return;\n }\n this.currentCursorMode = mode;\n const style = this.cursorStyles[mode];\n\n // only do things if there is a cursor style for it\n if (style) {\n switch (typeof style) {\n case 'string':\n // string styles are handled as cursor CSS\n this.interactionDOMElement.style.cursor = style;\n break;\n case 'function':\n // functions are just called, and passed the cursor mode\n style(mode);\n break;\n case 'object':\n // if it is an object, assume that it is a dictionary of CSS styles,\n // apply it to the interactionDOMElement\n Object.assign(this.interactionDOMElement.style, style);\n break;\n default:\n break;\n }\n } else if (typeof mode === 'string' && !Object.prototype.hasOwnProperty.call(this.cursorStyles, mode)) {\n // if it mode is a string (not a Symbol) and cursorStyles doesn't have any entry\n // for the mode, then assume that the dev wants it to be CSS for the cursor.\n this.interactionDOMElement.style.cursor = mode;\n }\n }\n\n /**\n * Dispatches an event on the display object that was interacted with\n *\n * @param {Object3D} displayObject - the display object in question\n * @param {string} eventString - the name of the event (e.g, mousedown)\n * @param {object} eventData - the event data object\n * @private\n */\n triggerEvent(displayObject, eventString, eventData) {\n if (!eventData.stopped) {\n eventData.currentTarget = displayObject;\n eventData.type = eventString;\n\n displayObject.emit(eventString, eventData);\n\n if (displayObject[eventString]) {\n displayObject[eventString](eventData);\n }\n }\n }\n\n /**\n * This function is provides a neat way of crawling through the scene graph and running a\n * specified function on all interactive objects it finds. It will also take care of hit\n * testing the interactive objects and passes the hit across in the function.\n *\n * @private\n * @param {InteractionEvent} interactionEvent - event containing the point that\n * is tested for collision\n * @param {Object3D} displayObject - the displayObject\n * that will be hit test (recursively crawls its children)\n * @param {Function} [func] - the function that will be called on each interactive object. The\n * interactionEvent, displayObject and hit will be passed to the function\n * @param {boolean} [hitTest] - this indicates if the objects inside should be hit test against the point\n * @param {boolean} [interactive] - Whether the displayObject is interactive\n * @return {boolean} returns true if the displayObject hit the point\n */\n processInteractive(interactionEvent, displayObject, func, hitTest, interactive) {\n if (!displayObject || !displayObject.visible) {\n return false;\n }\n\n // Took a little while to rework this function correctly! But now it is done and nice and optimised. ^_^\n //\n // This function will now loop through all objects and then only hit test the objects it HAS\n // to, not all of them. MUCH faster..\n // An object will be hit test if the following is true:\n //\n // 1: It is interactive.\n // 2: It belongs to a parent that is interactive AND one of the parents children have not already been hit.\n //\n // As another little optimisation once an interactive object has been hit we can carry on\n // through the scenegraph, but we know that there will be no more hits! So we can avoid extra hit tests\n // A final optimisation is that an object is not hit test directly if a child has already been hit.\n\n interactive = displayObject.interactive || interactive;\n\n let hit = false;\n let interactiveParent = interactive;\n\n if (displayObject.interactiveChildren && displayObject.children) {\n const children = displayObject.children;\n\n for (let i = children.length - 1; i >= 0; i--) {\n const child = children[i];\n\n // time to get recursive.. if this function will return if something is hit..\n const childHit = this.processInteractive(interactionEvent, child, func, hitTest, interactiveParent);\n\n if (childHit) {\n // its a good idea to check if a child has lost its parent.\n // this means it has been removed whilst looping so its best\n if (!child.parent) {\n continue;\n }\n\n // we no longer need to hit test any more objects in this container as we we\n // now know the parent has been hit\n interactiveParent = false;\n\n // If the child is interactive , that means that the object hit was actually\n // interactive and not just the child of an interactive object.\n // This means we no longer need to hit test anything else. We still need to run\n // through all objects, but we don't need to perform any hit tests.\n\n if (childHit) {\n if (interactionEvent.target) {\n hitTest = false;\n }\n hit = true;\n }\n }\n }\n }\n\n // no point running this if the item is not interactive or does not have an interactive parent.\n if (interactive) {\n // if we are hit testing (as in we have no hit any objects yet)\n // We also don't need to worry about hit testing if once of the displayObjects children\n // has already been hit - but only if it was interactive, otherwise we need to keep\n // looking for an interactive child, just in case we hit one\n if (hitTest && !interactionEvent.target) {\n if (interactionEvent.intersects[0] && interactionEvent.intersects[0].object === displayObject) {\n hit = true;\n }\n }\n\n if (displayObject.interactive) {\n if (hit && !interactionEvent.target) {\n interactionEvent.data.target = interactionEvent.target = displayObject;\n }\n\n if (func) {\n func(interactionEvent, displayObject, !!hit);\n }\n }\n }\n\n return hit;\n }\n\n\n /**\n * Is called when the click is pressed down on the renderer element\n *\n * @private\n * @param {MouseEvent} originalEvent - The DOM event of a click being pressed down\n */\n onClick(originalEvent) {\n if (!this.isAble()) return;\n if (originalEvent.type !== 'click') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n if (this.autoPreventDefault && events[0].isNormalized) {\n originalEvent.preventDefault();\n }\n\n const interactionData = this.getInteractionDataForPointerId(events[0]);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, events[0], interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n this.processInteractive(interactionEvent, this.layer.scene, this.processClick, true);\n\n this.emit('click', interactionEvent);\n }\n\n /**\n * Processes the result of the click check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processClick(interactionEvent, displayObject, hit) {\n if (hit) {\n this.triggerEvent(displayObject, 'click', interactionEvent);\n }\n }\n\n /**\n * Is called when the pointer button is pressed down on the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being pressed down\n */\n onPointerDown(originalEvent) {\n if (!this.isAble()) return;\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n /**\n * No need to prevent default on natural pointer events, as there are no side effects\n * Normalized events, however, may have the double mousedown/touchstart issue on the native android browser,\n * so still need to be prevented.\n */\n\n // Guaranteed that there will be at least one event in events, and all events must have the same pointer type\n\n if (this.autoPreventDefault && events[0].isNormalized) {\n originalEvent.preventDefault();\n }\n\n const eventLen = events.length;\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n this.processInteractive(interactionEvent, this.layer.scene, this.processPointerDown, true);\n\n this.emit('pointerdown', interactionEvent);\n if (event.pointerType === 'touch') {\n this.emit('touchstart', interactionEvent);\n } else if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n const isRightButton = event.button === 2;\n\n this.emit(isRightButton ? 'rightdown' : 'mousedown', this.eventData);\n }\n }\n }\n\n /**\n * Processes the result of the pointer down check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerDown(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n const id = interactionEvent.data.identifier;\n\n if (hit) {\n if (!displayObject.trackedPointers[id]) {\n displayObject.trackedPointers[id] = new InteractionTrackingData(id);\n }\n this.triggerEvent(displayObject, 'pointerdown', interactionEvent);\n\n if (data.pointerType === 'touch') {\n displayObject.started = true;\n this.triggerEvent(displayObject, 'touchstart', interactionEvent);\n } else if (data.pointerType === 'mouse' || data.pointerType === 'pen') {\n const isRightButton = data.button === 2;\n\n if (isRightButton) {\n displayObject.trackedPointers[id].rightDown = true;\n } else {\n displayObject.trackedPointers[id].leftDown = true;\n }\n\n this.triggerEvent(displayObject, isRightButton ? 'rightdown' : 'mousedown', interactionEvent);\n }\n }\n }\n\n /**\n * Is called when the pointer button is released on the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being released\n * @param {boolean} cancelled - true if the pointer is cancelled\n * @param {Function} func - Function passed to {@link processInteractive}\n */\n onPointerComplete(originalEvent, cancelled, func) {\n const events = this.normalizeToPointerData(originalEvent);\n\n const eventLen = events.length;\n\n // if the event wasn't targeting our canvas, then consider it to be pointerupoutside\n // in all cases (unless it was a pointercancel)\n const eventAppend = originalEvent.target !== this.interactionDOMElement ? 'outside' : '';\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n // perform hit testing for events targeting our canvas or cancel events\n this.processInteractive(interactionEvent, this.layer.scene, func, cancelled || !eventAppend);\n\n this.emit(cancelled ? 'pointercancel' : `pointerup${eventAppend}`, interactionEvent);\n\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n const isRightButton = event.button === 2;\n\n this.emit(isRightButton ? `rightup${eventAppend}` : `mouseup${eventAppend}`, interactionEvent);\n } else if (event.pointerType === 'touch') {\n this.emit(cancelled ? 'touchcancel' : `touchend${eventAppend}`, interactionEvent);\n this.releaseInteractionDataForPointerId(event.pointerId, interactionData);\n }\n }\n }\n\n /**\n * Is called when the pointer button is cancelled\n *\n * @private\n * @param {PointerEvent} event - The DOM event of a pointer button being released\n */\n onPointerCancel(event) {\n if (!this.isAble()) return;\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && event.pointerType === 'touch') return;\n\n this.onPointerComplete(event, true, this.processPointerCancel);\n }\n\n /**\n * Processes the result of the pointer cancel check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n */\n processPointerCancel(interactionEvent, displayObject) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n if (displayObject.trackedPointers[id] !== undefined) {\n delete displayObject.trackedPointers[id];\n this.triggerEvent(displayObject, 'pointercancel', interactionEvent);\n\n if (data.pointerType === 'touch') {\n this.triggerEvent(displayObject, 'touchcancel', interactionEvent);\n }\n }\n }\n\n /**\n * Is called when the pointer button is released on the renderer element\n *\n * @private\n * @param {PointerEvent} event - The DOM event of a pointer button being released\n */\n onPointerUp(event) {\n if (!this.isAble()) return;\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && event.pointerType === 'touch') return;\n\n this.onPointerComplete(event, false, this.processPointerUp);\n }\n\n /**\n * Processes the result of the pointer up check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerUp(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n const trackingData = displayObject.trackedPointers[id];\n\n const isTouch = data.pointerType === 'touch';\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n // Mouse only\n if (isMouse) {\n const isRightButton = data.button === 2;\n\n const flags = InteractionTrackingData.FLAGS;\n\n const test = isRightButton ? flags.RIGHT_DOWN : flags.LEFT_DOWN;\n\n const isDown = trackingData !== undefined && (trackingData.flags & test);\n\n if (hit) {\n this.triggerEvent(displayObject, isRightButton ? 'rightup' : 'mouseup', interactionEvent);\n\n if (isDown) {\n this.triggerEvent(displayObject, isRightButton ? 'rightclick' : 'leftclick', interactionEvent);\n }\n } else if (isDown) {\n this.triggerEvent(displayObject, isRightButton ? 'rightupoutside' : 'mouseupoutside', interactionEvent);\n }\n // update the down state of the tracking data\n if (trackingData) {\n if (isRightButton) {\n trackingData.rightDown = false;\n } else {\n trackingData.leftDown = false;\n }\n }\n }\n\n // Pointers and Touches, and Mouse\n if (isTouch && displayObject.started) {\n displayObject.started = false;\n this.triggerEvent(displayObject, 'touchend', interactionEvent);\n }\n if (hit) {\n this.triggerEvent(displayObject, 'pointerup', interactionEvent);\n\n if (trackingData) {\n this.triggerEvent(displayObject, 'pointertap', interactionEvent);\n if (isTouch) {\n this.triggerEvent(displayObject, 'tap', interactionEvent);\n // touches are no longer over (if they ever were) when we get the touchend\n // so we should ensure that we don't keep pretending that they are\n trackingData.over = false;\n }\n }\n } else if (trackingData) {\n this.triggerEvent(displayObject, 'pointerupoutside', interactionEvent);\n if (isTouch) this.triggerEvent(displayObject, 'touchendoutside', interactionEvent);\n }\n // Only remove the tracking data if there is no over/down state still associated with it\n if (trackingData && trackingData.none) {\n delete displayObject.trackedPointers[id];\n }\n }\n\n /**\n * Is called when the pointer moves across the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer moving\n */\n onPointerMove(originalEvent) {\n if (!this.isAble()) return;\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n if (events[0].pointerType === 'mouse') {\n this.didMove = true;\n\n this.cursor = null;\n }\n\n const eventLen = events.length;\n\n for (let i = 0; i < eventLen; i++) {\n const event = events[i];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = originalEvent;\n\n const interactive = event.pointerType === 'touch' ? this.moveWhenInside : true;\n\n this.processInteractive(\n interactionEvent,\n this.layer.scene,\n this.processPointerMove,\n interactive\n );\n this.emit('pointermove', interactionEvent);\n if (event.pointerType === 'touch') this.emit('touchmove', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') this.emit('mousemove', interactionEvent);\n }\n\n if (events[0].pointerType === 'mouse') {\n this.setCursorMode(this.cursor);\n\n // TODO BUG for parents interactive object (border order issue)\n }\n }\n\n /**\n * Processes the result of the pointer move check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerMove(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const isTouch = data.pointerType === 'touch';\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n if (isMouse) {\n this.processPointerOverOut(interactionEvent, displayObject, hit);\n }\n\n if (isTouch && displayObject.started) this.triggerEvent(displayObject, 'touchmove', interactionEvent);\n if (!this.moveWhenInside || hit) {\n this.triggerEvent(displayObject, 'pointermove', interactionEvent);\n if (isMouse) this.triggerEvent(displayObject, 'mousemove', interactionEvent);\n }\n }\n\n /**\n * Is called when the pointer is moved out of the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer being moved out\n */\n onPointerOut(originalEvent) {\n if (!this.isAble()) return;\n // if we support touch events, then only use those for touch events, not pointer events\n if (this.supportsTouchEvents && originalEvent.pointerType === 'touch') return;\n\n const events = this.normalizeToPointerData(originalEvent);\n\n // Only mouse and pointer can call onPointerOut, so events will always be length 1\n const event = events[0];\n\n if (event.pointerType === 'mouse') {\n this.mouseOverRenderer = false;\n this.setCursorMode(null);\n }\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = event;\n\n this.processInteractive(interactionEvent, this.layer.scene, this.processPointerOverOut, false);\n\n this.emit('pointerout', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n this.emit('mouseout', interactionEvent);\n } else {\n // we can get touchleave events after touchend, so we want to make sure we don't\n // introduce memory leaks\n this.releaseInteractionDataForPointerId(interactionData.identifier);\n }\n }\n\n /**\n * Processes the result of the pointer over/out check and dispatches the event if need be\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The interaction event wrapping the DOM event\n * @param {Object3D} displayObject - The display object that was tested\n * @param {boolean} hit - the result of the hit test on the display object\n */\n processPointerOverOut(interactionEvent, displayObject, hit) {\n const data = interactionEvent.data;\n\n const id = interactionEvent.data.identifier;\n\n const isMouse = (data.pointerType === 'mouse' || data.pointerType === 'pen');\n\n let trackingData = displayObject.trackedPointers[id];\n\n // if we just moused over the display object, then we need to track that state\n if (hit && !trackingData) {\n trackingData = displayObject.trackedPointers[id] = new InteractionTrackingData(id);\n }\n\n if (trackingData === undefined) return;\n\n if (hit && this.mouseOverRenderer) {\n if (!trackingData.over) {\n trackingData.over = true;\n this.triggerEvent(displayObject, 'pointerover', interactionEvent);\n if (isMouse) {\n this.triggerEvent(displayObject, 'mouseover', interactionEvent);\n }\n }\n\n // only change the cursor if it has not already been changed (by something deeper in the\n // display tree)\n if (isMouse && this.cursor === null) {\n this.cursor = displayObject.cursor;\n }\n } else if (trackingData.over) {\n trackingData.over = false;\n this.triggerEvent(displayObject, 'pointerout', this.eventData);\n if (isMouse) {\n this.triggerEvent(displayObject, 'mouseout', interactionEvent);\n }\n // if there is no mouse down information for the pointer, then it is safe to delete\n if (trackingData.none) {\n delete displayObject.trackedPointers[id];\n }\n }\n }\n\n /**\n * Is called when the pointer is moved into the renderer element\n *\n * @private\n * @param {PointerEvent} originalEvent - The DOM event of a pointer button being moved into the renderer view\n */\n onPointerOver(originalEvent) {\n if (!this.isAble()) return;\n const events = this.normalizeToPointerData(originalEvent);\n\n // Only mouse and pointer can call onPointerOver, so events will always be length 1\n const event = events[0];\n\n const interactionData = this.getInteractionDataForPointerId(event);\n\n const interactionEvent = this.configureInteractionEventForDOMEvent(this.eventData, event, interactionData);\n\n interactionEvent.data.originalEvent = event;\n\n if (event.pointerType === 'mouse') {\n this.mouseOverRenderer = true;\n }\n\n this.emit('pointerover', interactionEvent);\n if (event.pointerType === 'mouse' || event.pointerType === 'pen') {\n this.emit('mouseover', interactionEvent);\n }\n }\n\n /**\n * Get InteractionData for a given pointerId. Store that data as well\n *\n * @private\n * @param {PointerEvent} event - Normalized pointer event, output from normalizeToPointerData\n * @return {InteractionData} - Interaction data for the given pointer identifier\n */\n getInteractionDataForPointerId(event) {\n const pointerId = event.pointerId;\n\n let interactionData;\n\n if (pointerId === MOUSE_POINTER_ID || event.pointerType === 'mouse') {\n interactionData = this.mouse;\n } else if (this.activeInteractionData[pointerId]) {\n interactionData = this.activeInteractionData[pointerId];\n } else {\n interactionData = this.interactionDataPool.pop() || new InteractionData();\n interactionData.identifier = pointerId;\n this.activeInteractionData[pointerId] = interactionData;\n }\n // copy properties from the event, so that we can make sure that touch/pointer specific\n // data is available\n interactionData._copyEvent(event);\n\n return interactionData;\n }\n\n /**\n * Return unused InteractionData to the pool, for a given pointerId\n *\n * @private\n * @param {number} pointerId - Identifier from a pointer event\n */\n releaseInteractionDataForPointerId(pointerId) {\n const interactionData = this.activeInteractionData[pointerId];\n\n if (interactionData) {\n delete this.activeInteractionData[pointerId];\n interactionData._reset();\n this.interactionDataPool.push(interactionData);\n }\n }\n\n /**\n * Maps x and y coords from a DOM object and maps them correctly to the three.js view. The\n * resulting value is stored in the point. This takes into account the fact that the DOM\n * element could be scaled and positioned anywhere on the screen.\n *\n * @param {Vector2} point - the point that the result will be stored in\n * @param {number} x - the x coord of the position to map\n * @param {number} y - the y coord of the position to map\n */\n mapPositionToPoint(point, x, y) {\n let rect;\n\n // IE 11 fix\n if (!this.interactionDOMElement.parentElement) {\n rect = {\n x: 0,\n y: 0,\n left: 0,\n top: 0,\n width: 0,\n height: 0,\n };\n } else {\n rect = this.interactionDOMElement.getBoundingClientRect();\n }\n\n point.x = ((x - rect.left) / rect.width) * 2 - 1;\n point.y = -((y - rect.top) / rect.height) * 2 + 1;\n }\n\n /**\n * Configure an InteractionEvent to wrap a DOM PointerEvent and InteractionData\n *\n * @private\n * @param {InteractionEvent} interactionEvent - The event to be configured\n * @param {PointerEvent} pointerEvent - The DOM event that will be paired with the InteractionEvent\n * @param {InteractionData} interactionData - The InteractionData that will be paired\n * with the InteractionEvent\n * @return {InteractionEvent} the interaction event that was passed in\n */\n configureInteractionEventForDOMEvent(interactionEvent, pointerEvent, interactionData) {\n interactionEvent.data = interactionData;\n\n this.mapPositionToPoint(interactionData.global, pointerEvent.clientX, pointerEvent.clientY);\n\n if (this.layer && this.layer.interactive) this.raycaster.setFromCamera(interactionData.global, this.layer.camera);\n\n // Not really sure why this is happening, but it's how a previous version handled things TODO: there should be remove\n if (pointerEvent.pointerType === 'touch') {\n pointerEvent.globalX = interactionData.global.x;\n pointerEvent.globalY = interactionData.global.y;\n }\n\n interactionData.originalEvent = pointerEvent;\n interactionEvent._reset();\n interactionEvent.intersects = this.raycaster.intersectObjects(this.scene.children, true);\n\n return interactionEvent;\n }\n\n /**\n * Ensures that the original event object contains all data that a regular pointer event would have\n *\n * @private\n * @param {TouchEvent|MouseEvent|PointerEvent} event - The original event data from a touch or mouse event\n * @return {PointerEvent[]} An array containing a single normalized pointer event, in the case of a pointer\n * or mouse event, or a multiple normalized pointer events if there are multiple changed touches\n */\n normalizeToPointerData(event) {\n const normalizedEvents = [];\n\n if (this.supportsTouchEvents && event instanceof TouchEvent) {\n for (let i = 0, li = event.changedTouches.length; i < li; i++) {\n const touch = event.changedTouches[i];\n\n if (typeof touch.button === 'undefined') touch.button = event.touches.length ? 1 : 0;\n if (typeof touch.buttons === 'undefined') touch.buttons = event.touches.length ? 1 : 0;\n if (typeof touch.isPrimary === 'undefined') {\n touch.isPrimary = event.touches.length === 1 && event.type === 'touchstart';\n }\n if (typeof touch.width === 'undefined') touch.width = touch.radiusX || 1;\n if (typeof touch.height === 'undefined') touch.height = touch.radiusY || 1;\n if (typeof touch.tiltX === 'undefined') touch.tiltX = 0;\n if (typeof touch.tiltY === 'undefined') touch.tiltY = 0;\n if (typeof touch.pointerType === 'undefined') touch.pointerType = 'touch';\n if (typeof touch.pointerId === 'undefined') touch.pointerId = touch.identifier || 0;\n if (typeof touch.pressure === 'undefined') touch.pressure = touch.force || 0.5;\n touch.twist = 0;\n touch.tangentialPressure = 0;\n // TODO: Remove these, as layerX/Y is not a standard, is deprecated, has uneven\n // support, and the fill ins are not quite the same\n // offsetX/Y might be okay, but is not the same as clientX/Y when the canvas's top\n // left is not 0,0 on the page\n if (typeof touch.layerX === 'undefined') touch.layerX = touch.offsetX = touch.clientX;\n if (typeof touch.layerY === 'undefined') touch.layerY = touch.offsetY = touch.clientY;\n\n // mark the touch as normalized, just so that we know we did it\n touch.isNormalized = true;\n\n normalizedEvents.push(touch);\n }\n } else if (event instanceof MouseEvent && (!this.supportsPointerEvents || !(event instanceof window.PointerEvent))) {\n if (typeof event.isPrimary === 'undefined') event.isPrimary = true;\n if (typeof event.width === 'undefined') event.width = 1;\n if (typeof event.height === 'undefined') event.height = 1;\n if (typeof event.tiltX === 'undefined') event.tiltX = 0;\n if (typeof event.tiltY === 'undefined') event.tiltY = 0;\n if (typeof event.pointerType === 'undefined') event.pointerType = 'mouse';\n if (typeof event.pointerId === 'undefined') event.pointerId = MOUSE_POINTER_ID;\n if (typeof event.pressure === 'undefined') event.pressure = 0.5;\n event.twist = 0;\n event.tangentialPressure = 0;\n\n // mark the mouse event as normalized, just so that we know we did it\n event.isNormalized = true;\n\n normalizedEvents.push(event);\n } else {\n normalizedEvents.push(event);\n }\n\n return normalizedEvents;\n }\n\n /**\n * Destroys the interaction manager\n *\n */\n destroy() {\n this.removeEvents();\n\n this.removeAllListeners();\n\n this.renderer = null;\n\n this.mouse = null;\n\n this.eventData = null;\n\n this.interactionDOMElement = null;\n\n this.onPointerDown = null;\n this.processPointerDown = null;\n\n this.onPointerUp = null;\n this.processPointerUp = null;\n\n this.onPointerCancel = null;\n this.processPointerCancel = null;\n\n this.onPointerMove = null;\n this.processPointerMove = null;\n\n this.onPointerOut = null;\n this.processPointerOverOut = null;\n\n this.onPointerOver = null;\n\n this._tempPoint = null;\n }\n}\n\nexport default InteractionLayer;\n","(function() {\n let lastTime = 0;\n let vendors = ['ms', 'moz', 'webkit', 'o'];\n for (let x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\n window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];\n window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] ||\n window[vendors[x] + 'CancelRequestAnimationFrame'];\n }\n\n if (!window.requestAnimationFrame) {\n window.requestAnimationFrame = function(callback) {\n let currTime = new Date().getTime();\n let timeToCall = Math.max(0, 16 - (currTime - lastTime));\n let id = window.setTimeout(function() {\n callback(currTime + timeToCall);\n }, timeToCall);\n lastTime = currTime + timeToCall;\n return id;\n };\n }\n\n if (!window.cancelAnimationFrame) {\n window.cancelAnimationFrame = function(id) {\n clearTimeout(id);\n };\n }\n\n window.RAF = window.requestAnimationFrame;\n window.CAF = window.cancelAnimationFrame;\n})();\n","import './Raf';\nimport { EventDispatcher } from 'three';\n\n/**\n * @extends EventDispatcher\n */\nclass Ticker extends EventDispatcher {\n /**\n *\n */\n constructor() {\n super();\n this.timer = null;\n this.started = false;\n\n /**\n * pre-time cache\n *\n * @member {Number}\n * @private\n */\n this.pt = 0;\n\n /**\n * how long the time through, at this tick\n *\n * @member {Number}\n * @private\n */\n this.snippet = 0;\n\n this.start();\n }\n\n /**\n * start tick loop\n */\n start() {\n if (this.started) return;\n const loop = () => {\n this.timeline();\n this.emit('tick', { snippet: this.snippet });\n this.timer = RAF(loop);\n };\n loop();\n }\n\n /**\n * stop tick loop\n */\n stop() {\n CAF(this.timer);\n this.started = false;\n }\n\n /**\n * get timeline snippet\n *\n * @private\n */\n timeline() {\n this.snippet = Date.now() - this.pt;\n if (this.pt === 0 || this.snippet > 200) {\n this.pt = Date.now();\n this.snippet = Date.now() - this.pt;\n }\n\n this.pt += this.snippet;\n }\n}\n\nexport default Ticker;\n","import Ticker from '../utils/Ticker';\nimport InteractionManager from './InteractionManager';\n\n/**\n * The interaction manager deals with mouse, touch and pointer events. Any DisplayObject can be interactive\n * if its interactive parameter is set to true\n * This manager also supports multitouch.\n *\n * reference to [pixi.js](http://www.pixijs.com/) impl\n *\n * @example\n * import { Scene, PerspectiveCamera, WebGLRenderer, Mesh, BoxGeometry, MeshBasicMaterial } from 'three';\n * import { Interaction } from 'three.interaction';\n * const renderer = new WebGLRenderer({ canvas: canvasElement });\n * const scene = new Scene();\n * const camera = new PerspectiveCamera(60, width / height, 0.1, 100);\n *\n * const interaction = new Interaction(renderer, scene, camera);\n * // then you can bind every interaction event with any mesh which you had `add` into `scene` before\n * const cube = new Mesh(\n * new BoxGeometry(1, 1, 1),\n * new MeshBasicMaterial({ color: 0xffffff }),\n * );\n * scene.add(cube);\n * cube.on('touchstart', ev => {\n * console.log(ev);\n * });\n *\n * cube.on('mousedown', ev => {\n * console.log(ev);\n * });\n *\n * cube.on('pointerdown', ev => {\n * console.log(ev);\n * });\n * // and so on ...\n *\n * // you can also listen on parent-node or any display-tree node,\n * // source event will bubble up along with display-tree.\n * // you can stop the bubble-up by invoke ev.stopPropagation function.\n * scene.on('touchstart', ev => {\n * console.log(ev);\n * })\n *\n * @class\n * @extends InteractionManager\n */\nclass Interaction extends InteractionManager {\n /**\n * @param {WebGLRenderer} renderer - A reference to the current renderer\n * @param {Scene} scene - A reference to the current scene\n * @param {Camera} camera - A reference to the current camera\n * @param {Object} [options] - The options for the manager.\n * @param {Boolean} [options.autoPreventDefault=false] - Should the manager automatically prevent default browser actions.\n * @param {Boolean} [options.autoAttach=false] - Should the manager automatically attach target element.\n * @param {Number} [options.interactionFrequency=10] - Frequency increases the interaction events will be checked.\n */\n constructor(renderer, scene, camera, options) {\n options = Object.assign({ autoAttach: false }, options);\n super(renderer, scene, camera, options);\n\n /**\n * a ticker\n *\n * @private\n * @member {Ticker}\n */\n this.ticker = new Ticker();\n\n /**\n * update for some over event\n *\n * @private\n */\n this.update = this.update.bind(this);\n\n this.on('addevents', () => {\n this.ticker.on('tick', this.update);\n });\n\n this.on('removeevents', () => {\n this.ticker.off('tick', this.update);\n });\n\n this.setTargetElement(this.renderer.domElement);\n }\n}\n\nexport default Interaction;\n"],"names":["_rt","val","Object","prototype","toString","call","Utils","ks","variable","EventDispatcher","on","type","fn","isFunction","Object3D","interactive","addEventListener","off","removeEventListener","once","cb","ev","emit","_listeners","undefined","isUndefined","cbs","cache","slice","argument","i","length","apply","interactiveChildren","started","defineProperty","_trackedPointers","raycastTest","raycaster","result","raycast","InteractionData","global","Vector2","target","originalEvent","identifier","isPrimary","button","buttons","width","height","tiltX","tiltY","pointerType","pressure","rotationAngle","twist","tangentialPressure","event","InteractionEvent","stopped","currentTarget","data","intersects","InteractionTrackingData","pointerId","_pointerId","_flags","FLAGS","NONE","flag","yn","flags","constructor","OVER","_doSet","RIGHT_DOWN","LEFT_DOWN","freeze","MOUSE_POINTER_ID","hitTestEvent","InteractionManager","renderer","scene","camera","options","objects","autoPreventDefault","interactionFrequency","mouse","set","activeInteractionData","interactionDataPool","eventData","interactionDOMElement","moveWhenInside","eventsAdded","mouseOverRenderer","supportsTouchEvents","window","supportsPointerEvents","PointerEvent","onClick","bind","processClick","onPointerUp","processPointerUp","onPointerCancel","processPointerCancel","onPointerDown","processPointerDown","onPointerMove","processPointerMove","onPointerOut","processPointerOverOut","onPointerOver","cursorStyles","currentCursorMode","cursor","Raycaster","_deltaTime","setTargetElement","domElement","globalPoint","root","processInteractive","element","removeEvents","addEvents","navigator","msPointerEnabled","style","document","snippet","didMove","k","hasOwnProperty","interactionData","interactionEvent","configureInteractionEventForDOMEvent","setCursorMode","mode","assign","displayObject","eventString","func","hitTest","visible","hit","interactiveParent","children","child","childHit","parent","object","events","normalizeToPointerData","isNormalized","preventDefault","getInteractionDataForPointerId","triggerEvent","eventLen","isRightButton","id","trackedPointers","rightDown","leftDown","cancelled","eventAppend","releaseInteractionDataForPointerId","onPointerComplete","trackingData","isTouch","isMouse","test","isDown","over","none","pop","_copyEvent","_reset","push","point","x","y","rect","parentElement","getBoundingClientRect","left","top","pointerEvent","mapPositionToPoint","clientX","clientY","setFromCamera","globalX","globalY","objectsToRaycast","intersectObjects","normalizedEvents","TouchEvent","li","changedTouches","touch","touches","radiusX","radiusY","force","layerX","offsetX","layerY","offsetY","MouseEvent","removeAllListeners","_tempPoint","InteractionLayer","layer","isAble","lastTime","vendors","requestAnimationFrame","cancelAnimationFrame","callback","currTime","Date","getTime","timeToCall","Math","max","setTimeout","RAF","CAF","Ticker","timer","pt","start","loop","timeline","now","Interaction","autoAttach","ticker","update"],"mappings":"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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index fa53636..1989eb6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "integrity": "sha1-YFSfUlincplxuBtrTHP3V8tqozw=", "dev": true, "requires": { - "taffydb": "2.7.3", - "underscore": "1.8.3" + "taffydb": "^2.7.2", + "underscore": "^1.7.0" } }, "JSONStream": { @@ -20,8 +20,8 @@ "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", "dev": true, "requires": { - "jsonparse": "1.3.1", - "through": "2.3.8" + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" } }, "accepts": { @@ -30,7 +30,7 @@ "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", "dev": true, "requires": { - "mime-types": "2.1.17", + "mime-types": "~2.1.11", "negotiator": "0.6.1" } }, @@ -46,7 +46,7 @@ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { - "acorn": "3.3.0" + "acorn": "^3.0.4" }, "dependencies": { "acorn": { @@ -69,10 +69,10 @@ "integrity": "sha1-s4u4h22ehr7plJVqBOch6IskjrI=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "ajv-keywords": { @@ -86,10 +86,11 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, + "optional": true, "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" } }, "amdefine": { @@ -104,7 +105,7 @@ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "dev": true, "requires": { - "string-width": "2.1.1" + "string-width": "^2.0.0" } }, "ansi-escapes": { @@ -131,8 +132,8 @@ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" } }, "argparse": { @@ -141,7 +142,7 @@ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "arr-diff": { @@ -150,7 +151,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "arr-flatten": { @@ -183,7 +184,7 @@ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -264,9 +265,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" }, "dependencies": { "chalk": { @@ -275,11 +276,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "strip-ansi": { @@ -288,7 +289,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -299,25 +300,25 @@ "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.0", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.0", + "debug": "^2.6.8", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.7", + "slash": "^1.0.0", + "source-map": "^0.5.6" }, "dependencies": { "debug": { @@ -337,14 +338,14 @@ "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", "dev": true, "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.6", + "trim-right": "^1.0.1" } }, "babel-helper-builder-binary-assignment-operator-visitor": { @@ -353,9 +354,9 @@ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "dev": true, "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-call-delegate": { @@ -364,10 +365,10 @@ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-define-map": { @@ -376,10 +377,10 @@ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-explode-assignable-expression": { @@ -388,9 +389,9 @@ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-function-name": { @@ -399,11 +400,11 @@ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "dev": true, "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-get-function-arity": { @@ -412,8 +413,8 @@ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-hoist-variables": { @@ -422,8 +423,8 @@ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-optimise-call-expression": { @@ -432,8 +433,8 @@ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-regex": { @@ -442,9 +443,9 @@ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-remap-async-to-generator": { @@ -453,11 +454,11 @@ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-replace-supers": { @@ -466,12 +467,12 @@ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "dev": true, "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helpers": { @@ -480,8 +481,8 @@ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-messages": { @@ -490,7 +491,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-check-es2015-constants": { @@ -499,7 +500,7 @@ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-external-helpers": { @@ -508,7 +509,7 @@ "integrity": "sha1-IoX0iwK9Xe3oUXXK+MYuhq3M76E=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-syntax-async-functions": { @@ -535,9 +536,9 @@ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-arrow-functions": { @@ -546,7 +547,7 @@ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { @@ -555,7 +556,7 @@ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -564,11 +565,11 @@ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-plugin-transform-es2015-classes": { @@ -577,15 +578,15 @@ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "dev": true, "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-computed-properties": { @@ -594,8 +595,8 @@ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-destructuring": { @@ -604,7 +605,7 @@ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { @@ -613,8 +614,8 @@ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-for-of": { @@ -623,7 +624,7 @@ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -632,9 +633,9 @@ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-literals": { @@ -643,7 +644,7 @@ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-modules-amd": { @@ -652,9 +653,9 @@ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-commonjs": { @@ -663,10 +664,10 @@ "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", "dev": true, "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { @@ -675,9 +676,9 @@ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-umd": { @@ -686,9 +687,9 @@ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-object-super": { @@ -697,8 +698,8 @@ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "dev": true, "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -707,12 +708,12 @@ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "dev": true, "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -721,8 +722,8 @@ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-spread": { @@ -731,7 +732,7 @@ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -740,9 +741,9 @@ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-template-literals": { @@ -751,7 +752,7 @@ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { @@ -760,7 +761,7 @@ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -769,9 +770,9 @@ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" } }, "babel-plugin-transform-exponentiation-operator": { @@ -780,9 +781,9 @@ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "dev": true, "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-regenerator": { @@ -791,7 +792,7 @@ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "dev": true, "requires": { - "regenerator-transform": "0.10.1" + "regenerator-transform": "^0.10.0" } }, "babel-plugin-transform-strict-mode": { @@ -800,8 +801,8 @@ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-preset-env": { @@ -810,36 +811,36 @@ "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", "dev": true, "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0", - "browserslist": "2.9.1", - "invariant": "2.2.2", - "semver": "5.4.1" + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^2.1.2", + "invariant": "^2.2.2", + "semver": "^5.3.0" } }, "babel-register": { @@ -848,13 +849,13 @@ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.1", - "home-or-tmp": "2.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" } }, "babel-runtime": { @@ -863,8 +864,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "babel-template": { @@ -873,11 +874,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.4" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, "babel-traverse": { @@ -886,15 +887,15 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" }, "dependencies": { "debug": { @@ -920,10 +921,10 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, "babylon": { @@ -963,7 +964,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "better-assert": { @@ -1000,15 +1001,15 @@ "dev": true, "requires": { "bytes": "3.0.0", - "content-type": "1.0.4", + "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "1.1.1", - "http-errors": "1.6.2", + "depd": "~1.1.1", + "http-errors": "~1.6.2", "iconv-lite": "0.4.19", - "on-finished": "2.3.0", + "on-finished": "~2.3.0", "qs": "6.5.1", "raw-body": "2.3.2", - "type-is": "1.6.15" + "type-is": "~1.6.15" }, "dependencies": { "debug": { @@ -1028,7 +1029,7 @@ "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "dev": true, "requires": { - "hoek": "4.2.0" + "hoek": "4.x.x" } }, "boxen": { @@ -1037,13 +1038,13 @@ "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", "dev": true, "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.3.0", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "2.0.0" + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" }, "dependencies": { "camelcase": { @@ -1060,7 +1061,7 @@ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -1070,9 +1071,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "browser-stdout": { @@ -1087,8 +1088,8 @@ "integrity": "sha512-3n3nPdbUqn3nWmsy4PeSQthz2ja1ndpoXta+dwFFNhveGjMg6FXpWYe12vsTpNoXJbzx3j7GZXdtoVIdvh3JbA==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000778", - "electron-to-chromium": "1.3.27" + "caniuse-lite": "^1.0.30000770", + "electron-to-chromium": "^1.3.27" } }, "builtin-modules": { @@ -1109,7 +1110,7 @@ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "callsites": "0.2.0" + "callsites": "^0.2.0" } }, "callsite": { @@ -1136,8 +1137,8 @@ "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", "dev": true, "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" } }, "caniuse-lite": { @@ -1164,7 +1165,7 @@ "integrity": "sha1-mMyJDKZS3S7w5ws3klMQ/56Q/Is=", "dev": true, "requires": { - "underscore-contrib": "0.3.0" + "underscore-contrib": "~0.3.0" } }, "center-align": { @@ -1174,8 +1175,8 @@ "dev": true, "optional": true, "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, "chai": { @@ -1184,12 +1185,12 @@ "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", "dev": true, "requires": { - "assertion-error": "1.0.2", - "check-error": "1.0.2", - "deep-eql": "3.0.1", - "get-func-name": "2.0.0", - "pathval": "1.1.0", - "type-detect": "4.0.5" + "assertion-error": "^1.0.1", + "check-error": "^1.0.1", + "deep-eql": "^3.0.0", + "get-func-name": "^2.0.0", + "pathval": "^1.0.0", + "type-detect": "^4.0.0" } }, "chalk": { @@ -1198,9 +1199,9 @@ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" }, "dependencies": { "ansi-styles": { @@ -1209,7 +1210,7 @@ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "supports-color": { @@ -1218,7 +1219,7 @@ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } } } @@ -1241,15 +1242,15 @@ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "dev": true, "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.1.3", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" } }, "ci-info": { @@ -1276,7 +1277,7 @@ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "2.0.0" + "restore-cursor": "^2.0.0" } }, "cli-width": { @@ -1292,8 +1293,8 @@ "dev": true, "optional": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", + "center-align": "^0.1.1", + "right-align": "^0.1.1", "wordwrap": "0.0.2" }, "dependencies": { @@ -1324,7 +1325,7 @@ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "^1.1.1" } }, "color-name": { @@ -1345,7 +1346,7 @@ "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", "dev": true, "requires": { - "lodash": "4.17.4" + "lodash": "^4.5.0" } }, "combined-stream": { @@ -1354,7 +1355,7 @@ "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "dev": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -1369,8 +1370,8 @@ "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", "dev": true, "requires": { - "array-ify": "1.0.0", - "dot-prop": "3.0.0" + "array-ify": "^1.0.0", + "dot-prop": "^3.0.0" } }, "component-bind": { @@ -1403,9 +1404,9 @@ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "configstore": { @@ -1414,12 +1415,12 @@ "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", "dev": true, "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.2.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.3.0", - "xdg-basedir": "3.0.0" + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" }, "dependencies": { "dot-prop": { @@ -1428,7 +1429,7 @@ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "dev": true, "requires": { - "is-obj": "1.0.1" + "is-obj": "^1.0.0" } } } @@ -1441,7 +1442,7 @@ "requires": { "debug": "2.6.9", "finalhandler": "1.0.6", - "parseurl": "1.3.2", + "parseurl": "~1.3.2", "utils-merge": "1.0.1" }, "dependencies": { @@ -1468,16 +1469,16 @@ "integrity": "sha1-kVGmKx2O2y2CcR2r9bfPcQQfgrE=", "dev": true, "requires": { - "conventional-changelog-angular": "1.5.2", - "conventional-changelog-atom": "0.1.2", - "conventional-changelog-codemirror": "0.2.1", - "conventional-changelog-core": "1.9.3", - "conventional-changelog-ember": "0.2.9", - "conventional-changelog-eslint": "0.2.1", - "conventional-changelog-express": "0.2.1", - "conventional-changelog-jquery": "0.1.0", - "conventional-changelog-jscs": "0.1.0", - "conventional-changelog-jshint": "0.2.1" + "conventional-changelog-angular": "^1.5.2", + "conventional-changelog-atom": "^0.1.2", + "conventional-changelog-codemirror": "^0.2.1", + "conventional-changelog-core": "^1.9.3", + "conventional-changelog-ember": "^0.2.9", + "conventional-changelog-eslint": "^0.2.1", + "conventional-changelog-express": "^0.2.1", + "conventional-changelog-jquery": "^0.1.0", + "conventional-changelog-jscs": "^0.1.0", + "conventional-changelog-jshint": "^0.2.1" } }, "conventional-changelog-angular": { @@ -1486,8 +1487,8 @@ "integrity": "sha1-Kzj2Zf6cWSCvGi+C9Uf0ur5t5Xw=", "dev": true, "requires": { - "compare-func": "1.3.2", - "q": "1.5.1" + "compare-func": "^1.3.1", + "q": "^1.4.1" } }, "conventional-changelog-atom": { @@ -1496,7 +1497,7 @@ "integrity": "sha1-Ella1SZ6aTfDTPkAKBscZRmKTGM=", "dev": true, "requires": { - "q": "1.5.1" + "q": "^1.4.1" } }, "conventional-changelog-codemirror": { @@ -1505,7 +1506,7 @@ "integrity": "sha1-KZpPcUe681DmyBWPxUlUopHFzAk=", "dev": true, "requires": { - "q": "1.5.1" + "q": "^1.4.1" } }, "conventional-changelog-core": { @@ -1514,19 +1515,19 @@ "integrity": "sha1-KJn+d5OJoynw7EsnRsNt3vuY2i0=", "dev": true, "requires": { - "conventional-changelog-writer": "2.0.2", - "conventional-commits-parser": "2.0.1", - "dateformat": "1.0.12", - "get-pkg-repo": "1.4.0", - "git-raw-commits": "1.3.0", - "git-remote-origin-url": "2.0.0", - "git-semver-tags": "1.2.3", - "lodash": "4.17.4", - "normalize-package-data": "2.4.0", - "q": "1.5.1", - "read-pkg": "1.1.0", - "read-pkg-up": "1.0.1", - "through2": "2.0.3" + "conventional-changelog-writer": "^2.0.2", + "conventional-commits-parser": "^2.0.1", + "dateformat": "^1.0.12", + "get-pkg-repo": "^1.0.0", + "git-raw-commits": "^1.3.0", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^1.2.3", + "lodash": "^4.0.0", + "normalize-package-data": "^2.3.5", + "q": "^1.4.1", + "read-pkg": "^1.1.0", + "read-pkg-up": "^1.0.1", + "through2": "^2.0.0" }, "dependencies": { "load-json-file": { @@ -1535,11 +1536,11 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "path-type": { @@ -1548,9 +1549,9 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "read-pkg": { @@ -1559,9 +1560,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -1570,8 +1571,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "strip-bom": { @@ -1580,7 +1581,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } } } @@ -1591,7 +1592,7 @@ "integrity": "sha1-jsc8wFTjqwZGZ/sf61L+jvGxZDg=", "dev": true, "requires": { - "q": "1.5.1" + "q": "^1.4.1" } }, "conventional-changelog-eslint": { @@ -1600,7 +1601,7 @@ "integrity": "sha1-LCoRvrIW+AZJunKDQYApO2h8BmI=", "dev": true, "requires": { - "q": "1.5.1" + "q": "^1.4.1" } }, "conventional-changelog-express": { @@ -1609,7 +1610,7 @@ "integrity": "sha1-g42eHmyQmXA7FQucGaoteBdCvWw=", "dev": true, "requires": { - "q": "1.5.1" + "q": "^1.4.1" } }, "conventional-changelog-jquery": { @@ -1618,7 +1619,7 @@ "integrity": "sha1-Agg5cWLjhGmG5xJztsecW1+A9RA=", "dev": true, "requires": { - "q": "1.5.1" + "q": "^1.4.1" } }, "conventional-changelog-jscs": { @@ -1627,7 +1628,7 @@ "integrity": "sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw=", "dev": true, "requires": { - "q": "1.5.1" + "q": "^1.4.1" } }, "conventional-changelog-jshint": { @@ -1636,8 +1637,8 @@ "integrity": "sha1-hhObs6yZiZ8rF36WF+CbN9mbzzo=", "dev": true, "requires": { - "compare-func": "1.3.2", - "q": "1.5.1" + "compare-func": "^1.3.1", + "q": "^1.4.1" } }, "conventional-changelog-writer": { @@ -1646,16 +1647,16 @@ "integrity": "sha1-tYV97RsAHa+aeLnNQJJvRcE0lJs=", "dev": true, "requires": { - "compare-func": "1.3.2", - "conventional-commits-filter": "1.1.0", - "dateformat": "1.0.12", - "handlebars": "4.0.11", - "json-stringify-safe": "5.0.1", - "lodash": "4.17.4", - "meow": "3.7.0", - "semver": "5.4.1", - "split": "1.0.1", - "through2": "2.0.3" + "compare-func": "^1.3.1", + "conventional-commits-filter": "^1.1.0", + "dateformat": "^1.0.11", + "handlebars": "^4.0.2", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.0.0", + "meow": "^3.3.0", + "semver": "^5.0.1", + "split": "^1.0.0", + "through2": "^2.0.0" } }, "conventional-commit-types": { @@ -1670,8 +1671,8 @@ "integrity": "sha1-H8Ka8wte2rdvVOIpxBGwxmPQ+es=", "dev": true, "requires": { - "is-subset": "0.1.1", - "modify-values": "1.0.0" + "is-subset": "^0.1.1", + "modify-values": "^1.0.0" } }, "conventional-commits-parser": { @@ -1680,13 +1681,13 @@ "integrity": "sha1-HxXOa4RPfKQUlcgZDAgzwwuLFpM=", "dev": true, "requires": { - "JSONStream": "1.3.1", - "is-text-path": "1.0.1", - "lodash": "4.17.4", - "meow": "3.7.0", - "split2": "2.2.0", - "through2": "2.0.3", - "trim-off-newlines": "1.0.1" + "JSONStream": "^1.0.4", + "is-text-path": "^1.0.0", + "lodash": "^4.2.1", + "meow": "^3.3.0", + "split2": "^2.0.0", + "through2": "^2.0.0", + "trim-off-newlines": "^1.0.0" } }, "conventional-recommended-bump": { @@ -1695,13 +1696,13 @@ "integrity": "sha1-RytpsbjwnFxO1A/iikHmPMBL1zY=", "dev": true, "requires": { - "concat-stream": "1.6.0", - "conventional-commits-filter": "1.1.0", - "conventional-commits-parser": "2.0.1", - "git-raw-commits": "1.3.0", - "git-semver-tags": "1.2.3", - "meow": "3.7.0", - "object-assign": "4.1.1" + "concat-stream": "^1.4.10", + "conventional-commits-filter": "^1.1.0", + "conventional-commits-parser": "^2.0.1", + "git-raw-commits": "^1.3.0", + "git-semver-tags": "^1.2.3", + "meow": "^3.3.0", + "object-assign": "^4.0.1" } }, "convert-source-map": { @@ -1740,7 +1741,7 @@ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "dev": true, "requires": { - "capture-stack-trace": "1.0.0" + "capture-stack-trace": "^1.0.0" } }, "cross-spawn": { @@ -1749,9 +1750,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "cryptiles": { @@ -1760,7 +1761,7 @@ "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "dev": true, "requires": { - "boom": "5.2.0" + "boom": "5.x.x" }, "dependencies": { "boom": { @@ -1769,7 +1770,7 @@ "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", "dev": true, "requires": { - "hoek": "4.2.0" + "hoek": "4.x.x" } } } @@ -1786,7 +1787,7 @@ "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { - "array-find-index": "1.0.2" + "array-find-index": "^1.0.1" } }, "custom-event": { @@ -1801,7 +1802,7 @@ "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "dashdash": { @@ -1810,7 +1811,7 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "dateformat": { @@ -1819,8 +1820,8 @@ "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", "dev": true, "requires": { - "get-stdin": "4.0.1", - "meow": "3.7.0" + "get-stdin": "^4.0.1", + "meow": "^3.3.0" } }, "debug": { @@ -1844,7 +1845,7 @@ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { - "type-detect": "4.0.5" + "type-detect": "^4.0.0" } }, "deep-extend": { @@ -1865,13 +1866,13 @@ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" } }, "delayed-stream": { @@ -1892,7 +1893,7 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "di": { @@ -1913,7 +1914,7 @@ "integrity": "sha512-y0tm5Pq6ywp3qSTZ1vPgVdAnbDEoeoc5wlOHXoY1c4Wug/a7JvqHIl7BTvwodaHmejWkK/9dSb3sCYfyo/om8A==", "dev": true, "requires": { - "esutils": "2.0.2" + "esutils": "^2.0.2" } }, "dom-serialize": { @@ -1922,10 +1923,10 @@ "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", "dev": true, "requires": { - "custom-event": "1.0.1", - "ent": "2.2.0", - "extend": "3.0.1", - "void-elements": "2.0.1" + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" } }, "dot-prop": { @@ -1934,7 +1935,7 @@ "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", "dev": true, "requires": { - "is-obj": "1.0.1" + "is-obj": "^1.0.0" } }, "duplexer3": { @@ -1950,7 +1951,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "ecstatic": { @@ -1959,10 +1960,10 @@ "integrity": "sha512-ztE4WqheoWLh3wv+HQwy7dACnvNY620coWpa+XqY6R2cVWgaAT2lUISU1Uf7JpdLLJCURktJOaA9av2AOzsyYQ==", "dev": true, "requires": { - "he": "1.1.1", - "mime": "1.6.0", - "minimist": "1.2.0", - "url-join": "2.0.2" + "he": "^1.1.1", + "mime": "^1.2.11", + "minimist": "^1.1.0", + "url-join": "^2.0.2" }, "dependencies": { "minimist": { @@ -2091,7 +2092,7 @@ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "es6-promise": { @@ -2118,43 +2119,43 @@ "integrity": "sha512-28hOYej+NZ/R5H1yMvyKa1+bPlu+fnsIAQffK6hxXgvmXnImos2bA5XfCn5dYv2k2mrKj+/U/Z4L5ICWxC7TQw==", "dev": true, "requires": { - "ajv": "5.5.1", - "babel-code-frame": "6.26.0", - "chalk": "2.3.0", - "concat-stream": "1.6.0", - "cross-spawn": "5.1.0", - "debug": "3.1.0", - "doctrine": "2.0.2", - "eslint-scope": "3.7.1", - "espree": "3.5.2", - "esquery": "1.0.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.2", - "globals": "11.0.1", - "ignore": "3.3.7", - "imurmurhash": "0.1.4", - "inquirer": "3.3.0", - "is-resolvable": "1.0.0", - "js-yaml": "3.10.0", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "7.0.0", - "progress": "2.0.0", - "require-uncached": "1.0.3", - "semver": "5.4.1", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", - "table": "4.0.2", - "text-table": "0.2.0" + "ajv": "^5.3.0", + "babel-code-frame": "^6.22.0", + "chalk": "^2.1.0", + "concat-stream": "^1.6.0", + "cross-spawn": "^5.1.0", + "debug": "^3.0.1", + "doctrine": "^2.0.2", + "eslint-scope": "^3.7.1", + "espree": "^3.5.2", + "esquery": "^1.0.0", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "functional-red-black-tree": "^1.0.1", + "glob": "^7.1.2", + "globals": "^11.0.1", + "ignore": "^3.3.3", + "imurmurhash": "^0.1.4", + "inquirer": "^3.0.6", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.9.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.2", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.2", + "pluralize": "^7.0.0", + "progress": "^2.0.0", + "require-uncached": "^1.0.3", + "semver": "^5.3.0", + "strip-ansi": "^4.0.0", + "strip-json-comments": "~2.0.1", + "table": "^4.0.1", + "text-table": "~0.2.0" } }, "eslint-config-google": { @@ -2169,8 +2170,8 @@ "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", "dev": true, "requires": { - "esrecurse": "4.2.0", - "estraverse": "4.2.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "espree": { @@ -2179,8 +2180,8 @@ "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", "dev": true, "requires": { - "acorn": "5.2.1", - "acorn-jsx": "3.0.1" + "acorn": "^5.2.1", + "acorn-jsx": "^3.0.0" } }, "esprima": { @@ -2195,7 +2196,7 @@ "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.0.0" } }, "esrecurse": { @@ -2204,8 +2205,8 @@ "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", "dev": true, "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" + "estraverse": "^4.1.0", + "object-assign": "^4.0.1" } }, "estraverse": { @@ -2238,13 +2239,13 @@ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "expand-braces": { @@ -2253,9 +2254,9 @@ "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", "dev": true, "requires": { - "array-slice": "0.2.3", - "array-unique": "0.2.1", - "braces": "0.1.5" + "array-slice": "^0.2.3", + "array-unique": "^0.2.1", + "braces": "^0.1.2" }, "dependencies": { "braces": { @@ -2264,7 +2265,7 @@ "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", "dev": true, "requires": { - "expand-range": "0.1.1" + "expand-range": "^0.1.0" } }, "expand-range": { @@ -2273,8 +2274,8 @@ "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", "dev": true, "requires": { - "is-number": "0.1.1", - "repeat-string": "0.2.2" + "is-number": "^0.1.1", + "repeat-string": "^0.2.2" } }, "is-number": { @@ -2297,7 +2298,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "expand-range": { @@ -2306,7 +2307,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.3" + "fill-range": "^2.1.0" } }, "extend": { @@ -2321,9 +2322,9 @@ "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", "dev": true, "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.19", - "tmp": "0.0.33" + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" } }, "extglob": { @@ -2332,7 +2333,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "extract-zip": { @@ -2397,7 +2398,7 @@ "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", "dev": true, "requires": { - "pend": "1.2.0" + "pend": "~1.2.0" } }, "figures": { @@ -2406,7 +2407,7 @@ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5" + "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { @@ -2415,8 +2416,8 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, "filename-regex": { @@ -2431,11 +2432,11 @@ "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "finalhandler": { @@ -2445,12 +2446,12 @@ "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.3.1", - "unpipe": "1.0.0" + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" }, "dependencies": { "debug": { @@ -2482,8 +2483,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "findup": { @@ -2492,8 +2493,8 @@ "integrity": "sha1-itkpozk7rGJ5V6fl3kYjsGsOLOs=", "dev": true, "requires": { - "colors": "0.6.2", - "commander": "2.1.0" + "colors": "~0.6.0-1", + "commander": "~2.1.0" }, "dependencies": { "colors": { @@ -2516,10 +2517,10 @@ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" } }, "for-in": { @@ -2534,7 +2535,7 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "forever-agent": { @@ -2549,9 +2550,9 @@ "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", "dev": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" } }, "fs-access": { @@ -2560,7 +2561,7 @@ "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", "dev": true, "requires": { - "null-check": "1.0.0" + "null-check": "^1.0.0" } }, "fs-extra": { @@ -2569,9 +2570,9 @@ "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1" + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" }, "dependencies": { "klaw": { @@ -2580,7 +2581,7 @@ "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.9" } } } @@ -2598,8 +2599,8 @@ "dev": true, "optional": true, "requires": { - "nan": "2.8.0", - "node-pre-gyp": "0.6.39" + "nan": "^2.3.0", + "node-pre-gyp": "^0.6.39" }, "dependencies": { "abbrev": { @@ -2614,14 +2615,15 @@ "dev": true, "optional": true, "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" } }, "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.1.1", @@ -2635,8 +2637,8 @@ "dev": true, "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "asn1": { @@ -2672,7 +2674,8 @@ "balanced-match": { "version": "0.4.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "bcrypt-pbkdf": { "version": "1.0.1", @@ -2680,38 +2683,42 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "block-stream": { "version": "0.0.9", "bundled": true, "dev": true, + "optional": true, "requires": { - "inherits": "2.0.3" + "inherits": "~2.0.0" } }, "boom": { "version": "2.10.1", "bundled": true, "dev": true, + "optional": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "brace-expansion": { "version": "1.1.7", "bundled": true, "dev": true, + "optional": true, "requires": { - "balanced-match": "0.4.2", + "balanced-match": "^0.4.1", "concat-map": "0.0.1" } }, "buffer-shims": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "caseless": { "version": "0.12.0", @@ -2728,37 +2735,43 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "combined-stream": { "version": "1.0.5", "bundled": true, "dev": true, + "optional": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "cryptiles": { "version": "2.0.5", "bundled": true, "dev": true, + "optional": true, "requires": { - "boom": "2.10.1" + "boom": "2.x.x" } }, "dashdash": { @@ -2767,7 +2780,7 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -2796,7 +2809,8 @@ "delayed-stream": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "delegates": { "version": "1.0.0", @@ -2816,7 +2830,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "extend": { @@ -2828,7 +2842,8 @@ "extsprintf": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "forever-agent": { "version": "0.6.1", @@ -2842,25 +2857,27 @@ "dev": true, "optional": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" } }, "fs.realpath": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "fstream": { "version": "1.0.11", "bundled": true, "dev": true, + "optional": true, "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" } }, "fstream-ignore": { @@ -2869,9 +2886,9 @@ "dev": true, "optional": true, "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" } }, "gauge": { @@ -2880,14 +2897,14 @@ "dev": true, "optional": true, "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "getpass": { @@ -2896,7 +2913,7 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -2911,19 +2928,21 @@ "version": "7.1.2", "bundled": true, "dev": true, + "optional": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "graceful-fs": { "version": "4.1.11", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "har-schema": { "version": "1.0.5", @@ -2937,8 +2956,8 @@ "dev": true, "optional": true, "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" + "ajv": "^4.9.1", + "har-schema": "^1.0.5" } }, "has-unicode": { @@ -2951,17 +2970,19 @@ "version": "3.1.3", "bundled": true, "dev": true, + "optional": true, "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" } }, "hoek": { "version": "2.16.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "http-signature": { "version": "1.1.1", @@ -2969,24 +2990,26 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "inflight": { "version": "1.0.6", "bundled": true, "dev": true, + "optional": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.4", @@ -2998,8 +3021,9 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-typedarray": { @@ -3011,7 +3035,8 @@ "isarray": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "isstream": { "version": "0.1.2", @@ -3025,7 +3050,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "jsbn": { @@ -3046,7 +3071,7 @@ "dev": true, "optional": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stringify-safe": { @@ -3084,33 +3109,38 @@ "mime-db": { "version": "1.27.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "mime-types": { "version": "2.1.15", "bundled": true, "dev": true, + "optional": true, "requires": { - "mime-db": "1.27.0" + "mime-db": "~1.27.0" } }, "minimatch": { "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { - "brace-expansion": "1.1.7" + "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "mkdirp": { "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -3127,17 +3157,17 @@ "dev": true, "optional": true, "requires": { - "detect-libc": "1.0.2", + "detect-libc": "^1.0.2", "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.0.2", + "rc": "^1.1.7", "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^2.2.1", + "tar-pack": "^3.4.0" } }, "nopt": { @@ -3146,8 +3176,8 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npmlog": { @@ -3156,16 +3186,17 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "oauth-sign": { "version": "0.8.2", @@ -3183,8 +3214,9 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -3205,14 +3237,15 @@ "dev": true, "optional": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "path-is-absolute": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "performance-now": { "version": "0.2.0", @@ -3223,7 +3256,8 @@ "process-nextick-args": { "version": "1.0.7", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "punycode": { "version": "1.4.1", @@ -3243,10 +3277,10 @@ "dev": true, "optional": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -3261,14 +3295,15 @@ "version": "2.2.9", "bundled": true, "dev": true, + "optional": true, "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" } }, "request": { @@ -3277,42 +3312,44 @@ "dev": true, "optional": true, "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" } }, "rimraf": { "version": "2.6.1", "bundled": true, "dev": true, + "optional": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "safe-buffer": { "version": "5.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "semver": { "version": "5.3.0", @@ -3336,8 +3373,9 @@ "version": "1.0.9", "bundled": true, "dev": true, + "optional": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "sshpk": { @@ -3346,15 +3384,15 @@ "dev": true, "optional": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" }, "dependencies": { "assert-plus": { @@ -3369,18 +3407,20 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { "version": "1.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "^5.0.1" } }, "stringstream": { @@ -3393,8 +3433,9 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -3407,10 +3448,11 @@ "version": "2.2.1", "bundled": true, "dev": true, + "optional": true, "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" } }, "tar-pack": { @@ -3419,14 +3461,14 @@ "dev": true, "optional": true, "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" + "debug": "^2.2.0", + "fstream": "^1.0.10", + "fstream-ignore": "^1.0.5", + "once": "^1.3.3", + "readable-stream": "^2.1.4", + "rimraf": "^2.5.1", + "tar": "^2.2.1", + "uid-number": "^0.0.6" } }, "tough-cookie": { @@ -3435,7 +3477,7 @@ "dev": true, "optional": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tunnel-agent": { @@ -3444,7 +3486,7 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -3462,7 +3504,8 @@ "util-deprecate": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "uuid": { "version": "3.0.1", @@ -3485,13 +3528,14 @@ "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -3519,11 +3563,11 @@ "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", "dev": true, "requires": { - "hosted-git-info": "2.5.0", - "meow": "3.7.0", - "normalize-package-data": "2.4.0", - "parse-github-repo-url": "1.4.1", - "through2": "2.0.3" + "hosted-git-info": "^2.1.4", + "meow": "^3.3.0", + "normalize-package-data": "^2.3.0", + "parse-github-repo-url": "^1.3.0", + "through2": "^2.0.0" } }, "get-stdin": { @@ -3544,7 +3588,7 @@ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "git-raw-commits": { @@ -3553,11 +3597,11 @@ "integrity": "sha1-C8hZbpDV/+c29/VUa9LRL3OrqsY=", "dev": true, "requires": { - "dargs": "4.1.0", - "lodash.template": "4.4.0", - "meow": "3.7.0", - "split2": "2.2.0", - "through2": "2.0.3" + "dargs": "^4.0.1", + "lodash.template": "^4.0.2", + "meow": "^3.3.0", + "split2": "^2.0.0", + "through2": "^2.0.0" } }, "git-remote-origin-url": { @@ -3566,8 +3610,8 @@ "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", "dev": true, "requires": { - "gitconfiglocal": "1.0.0", - "pify": "2.3.0" + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" } }, "git-semver-tags": { @@ -3576,8 +3620,8 @@ "integrity": "sha1-GItFOIK/nXojr9Mbq6U32rc4jV0=", "dev": true, "requires": { - "meow": "3.7.0", - "semver": "5.4.1" + "meow": "^3.3.0", + "semver": "^5.0.1" } }, "gitconfiglocal": { @@ -3586,7 +3630,7 @@ "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", "dev": true, "requires": { - "ini": "1.3.5" + "ini": "^1.3.2" } }, "glob": { @@ -3595,12 +3639,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-base": { @@ -3609,8 +3653,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" } }, "glob-parent": { @@ -3619,7 +3663,7 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" } }, "global-dirs": { @@ -3628,7 +3672,7 @@ "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "dev": true, "requires": { - "ini": "1.3.5" + "ini": "^1.3.4" } }, "globals": { @@ -3643,12 +3687,12 @@ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "got": { @@ -3657,17 +3701,17 @@ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.1", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" } }, "graceful-fs": { @@ -3688,10 +3732,10 @@ "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "dev": true, "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" }, "dependencies": { "source-map": { @@ -3700,7 +3744,7 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -3717,8 +3761,8 @@ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "dev": true, "requires": { - "ajv": "5.5.1", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" } }, "has-ansi": { @@ -3727,7 +3771,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-binary": { @@ -3765,8 +3809,8 @@ "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", "dev": true, "requires": { - "is-stream": "1.1.0", - "pinkie-promise": "2.0.1" + "is-stream": "^1.0.1", + "pinkie-promise": "^2.0.0" } }, "hawk": { @@ -3775,10 +3819,10 @@ "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", "dev": true, "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.0", - "sntp": "2.1.0" + "boom": "4.x.x", + "cryptiles": "3.x.x", + "hoek": "4.x.x", + "sntp": "2.x.x" } }, "he": { @@ -3799,8 +3843,8 @@ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, "hosted-git-info": { @@ -3818,7 +3862,7 @@ "depd": "1.1.1", "inherits": "2.0.3", "setprototypeof": "1.0.3", - "statuses": "1.4.0" + "statuses": ">= 1.3.1 < 2" } }, "http-proxy": { @@ -3827,8 +3871,8 @@ "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", "dev": true, "requires": { - "eventemitter3": "1.2.0", - "requires-port": "1.0.0" + "eventemitter3": "1.x.x", + "requires-port": "1.x.x" } }, "http-server": { @@ -3838,13 +3882,13 @@ "dev": true, "requires": { "colors": "1.0.3", - "corser": "2.0.1", - "ecstatic": "2.2.1", - "http-proxy": "1.16.2", - "opener": "1.4.3", - "optimist": "0.6.1", - "portfinder": "1.0.13", - "union": "0.4.6" + "corser": "~2.0.0", + "ecstatic": "^2.0.0", + "http-proxy": "^1.8.1", + "opener": "~1.4.0", + "optimist": "0.6.x", + "portfinder": "^1.0.13", + "union": "~0.4.3" }, "dependencies": { "colors": { @@ -3861,9 +3905,9 @@ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "iconv-lite": { @@ -3896,7 +3940,7 @@ "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "indexof": { @@ -3911,8 +3955,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -3933,20 +3977,20 @@ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "dev": true, "requires": { - "ansi-escapes": "3.0.0", - "chalk": "2.3.0", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.1.0", - "figures": "2.0.0", - "lodash": "4.17.4", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" } }, "invariant": { @@ -3955,7 +3999,7 @@ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", "dev": true, "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } }, "invert-kv": { @@ -3976,7 +4020,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.11.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -3991,7 +4035,7 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-ci": { @@ -4000,7 +4044,7 @@ "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", "dev": true, "requires": { - "ci-info": "1.1.3" + "ci-info": "^1.0.0" } }, "is-dotfile": { @@ -4015,7 +4059,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -4036,7 +4080,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -4051,7 +4095,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-installed-globally": { @@ -4060,8 +4104,8 @@ "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", "dev": true, "requires": { - "global-dirs": "0.1.1", - "is-path-inside": "1.0.1" + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" } }, "is-npm": { @@ -4076,7 +4120,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-obj": { @@ -4097,7 +4141,7 @@ "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", "dev": true, "requires": { - "is-path-inside": "1.0.1" + "is-path-inside": "^1.0.0" } }, "is-path-inside": { @@ -4106,7 +4150,7 @@ "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" } }, "is-posix-bracket": { @@ -4139,7 +4183,7 @@ "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", "dev": true, "requires": { - "tryit": "1.0.3" + "tryit": "^1.0.1" } }, "is-retry-allowed": { @@ -4166,7 +4210,7 @@ "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", "dev": true, "requires": { - "text-extensions": "1.7.0" + "text-extensions": "^1.0.0" } }, "is-typedarray": { @@ -4226,8 +4270,8 @@ "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", "dev": true, "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "js2xmlparser": { @@ -4236,7 +4280,7 @@ "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=", "dev": true, "requires": { - "xmlcreate": "1.0.2" + "xmlcreate": "^1.0.1" } }, "jsbn": { @@ -4253,17 +4297,17 @@ "dev": true, "requires": { "babylon": "7.0.0-beta.19", - "bluebird": "3.5.1", - "catharsis": "0.8.9", - "escape-string-regexp": "1.0.5", - "js2xmlparser": "3.0.0", - "klaw": "2.0.0", - "marked": "0.3.7", - "mkdirp": "0.5.1", - "requizzle": "0.2.1", - "strip-json-comments": "2.0.1", + "bluebird": "~3.5.0", + "catharsis": "~0.8.9", + "escape-string-regexp": "~1.0.5", + "js2xmlparser": "~3.0.0", + "klaw": "~2.0.0", + "marked": "~0.3.6", + "mkdirp": "~0.5.1", + "requizzle": "~0.2.1", + "strip-json-comments": "~2.0.1", "taffydb": "2.6.2", - "underscore": "1.8.3" + "underscore": "~1.8.3" }, "dependencies": { "babylon": { @@ -4328,7 +4372,7 @@ "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "jsonparse": { @@ -4355,33 +4399,33 @@ "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==", "dev": true, "requires": { - "bluebird": "3.5.1", - "body-parser": "1.18.2", - "chokidar": "1.7.0", - "colors": "1.1.2", - "combine-lists": "1.0.1", - "connect": "3.6.5", - "core-js": "2.5.1", - "di": "0.0.1", - "dom-serialize": "2.2.1", - "expand-braces": "0.1.2", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "http-proxy": "1.16.2", - "isbinaryfile": "3.0.2", - "lodash": "3.10.1", - "log4js": "0.6.38", - "mime": "1.6.0", - "minimatch": "3.0.4", - "optimist": "0.6.1", - "qjobs": "1.1.5", - "range-parser": "1.2.0", - "rimraf": "2.6.2", - "safe-buffer": "5.1.1", + "bluebird": "^3.3.0", + "body-parser": "^1.16.1", + "chokidar": "^1.4.1", + "colors": "^1.1.0", + "combine-lists": "^1.0.0", + "connect": "^3.6.0", + "core-js": "^2.2.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.0", + "expand-braces": "^0.1.1", + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "http-proxy": "^1.13.0", + "isbinaryfile": "^3.0.0", + "lodash": "^3.8.0", + "log4js": "^0.6.31", + "mime": "^1.3.4", + "minimatch": "^3.0.2", + "optimist": "^0.6.1", + "qjobs": "^1.1.4", + "range-parser": "^1.2.0", + "rimraf": "^2.6.0", + "safe-buffer": "^5.0.1", "socket.io": "1.7.3", - "source-map": "0.5.7", + "source-map": "^0.5.3", "tmp": "0.0.31", - "useragent": "2.2.1" + "useragent": "^2.1.12" }, "dependencies": { "lodash": { @@ -4396,7 +4440,7 @@ "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.1" } } } @@ -4430,8 +4474,8 @@ "integrity": "sha1-0jyjSAG9qYY60xjju0vUBisTrNI=", "dev": true, "requires": { - "lodash": "4.17.4", - "phantomjs-prebuilt": "2.1.16" + "lodash": "^4.0.1", + "phantomjs-prebuilt": "^2.1.7" } }, "kew": { @@ -4446,7 +4490,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "klaw": { @@ -4455,7 +4499,7 @@ "integrity": "sha1-WcEo4Nxc5BAgEVEZTuucv4WGUPY=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.9" } }, "latest-version": { @@ -4464,7 +4508,7 @@ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "dev": true, "requires": { - "package-json": "4.0.1" + "package-json": "^4.0.0" } }, "lazy-cache": { @@ -4480,7 +4524,7 @@ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "levn": { @@ -4489,8 +4533,8 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "load-json-file": { @@ -4499,10 +4543,10 @@ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, "locate-path": { @@ -4511,8 +4555,8 @@ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "dependencies": { "path-exists": { @@ -4541,8 +4585,8 @@ "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", "dev": true, "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.templatesettings": "4.1.0" + "lodash._reinterpolate": "~3.0.0", + "lodash.templatesettings": "^4.0.0" } }, "lodash.templatesettings": { @@ -4551,7 +4595,7 @@ "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", "dev": true, "requires": { - "lodash._reinterpolate": "3.0.0" + "lodash._reinterpolate": "~3.0.0" } }, "log4js": { @@ -4560,8 +4604,8 @@ "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", "dev": true, "requires": { - "readable-stream": "1.0.34", - "semver": "4.3.6" + "readable-stream": "~1.0.2", + "semver": "~4.3.3" }, "dependencies": { "isarray": { @@ -4576,10 +4620,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, "semver": { @@ -4600,7 +4644,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true + "dev": true, + "optional": true }, "loose-envify": { "version": "1.3.1", @@ -4608,7 +4653,7 @@ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "dev": true, "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0" } }, "loud-rejection": { @@ -4617,8 +4662,8 @@ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" } }, "lowercase-keys": { @@ -4633,8 +4678,8 @@ "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "make-dir": { @@ -4643,7 +4688,7 @@ "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" }, "dependencies": { "pify": { @@ -4678,7 +4723,7 @@ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "^1.0.0" } }, "meow": { @@ -4687,16 +4732,16 @@ "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" }, "dependencies": { "load-json-file": { @@ -4705,11 +4750,11 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "minimist": { @@ -4724,9 +4769,9 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "read-pkg": { @@ -4735,9 +4780,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -4746,8 +4791,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "strip-bom": { @@ -4756,7 +4801,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } } } @@ -4767,19 +4812,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "mime": { @@ -4800,7 +4845,7 @@ "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", "dev": true, "requires": { - "mime-db": "1.30.0" + "mime-db": "~1.30.0" } }, "mimic-fn": { @@ -4815,7 +4860,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -4857,7 +4902,7 @@ "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } } } @@ -4905,10 +4950,10 @@ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -4917,7 +4962,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "npm-run-path": { @@ -4926,7 +4971,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "npmsrcify": { @@ -4935,10 +4980,10 @@ "integrity": "sha512-hHh0CdqohDaJlzsRTXPXYYFbIM5bKA0+cE32kix2VNnPCgG6KRvYsgCH71INKACBZaHhly0eiNlQmCtBQnJZKQ==", "dev": true, "requires": { - "chalk": "2.3.2", - "fs-extra": "5.0.0", - "update-notifier": "2.4.0", - "yargs": "11.0.0" + "chalk": "^2.3.2", + "fs-extra": "^5.0.0", + "update-notifier": "^2.3.0", + "yargs": "^11.0.0" }, "dependencies": { "ansi-styles": { @@ -4947,7 +4992,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "camelcase": { @@ -4962,9 +5007,9 @@ "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "cliui": { @@ -4973,9 +5018,9 @@ "integrity": "sha512-nY3W5Gu2racvdDk//ELReY+dHjb9PlIcVDFXP72nVIhq2Gy3LuVXYwJoPVudwQnv1shtohpgkdCKT2YaKY0CKw==", "dev": true, "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" } }, "find-up": { @@ -4984,7 +5029,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } }, "fs-extra": { @@ -4993,9 +5038,9 @@ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.1" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, "has-flag": { @@ -5010,7 +5055,7 @@ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "supports-color": { @@ -5019,7 +5064,7 @@ "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } }, "yargs": { @@ -5028,18 +5073,18 @@ "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==", "dev": true, "requires": { - "cliui": "4.0.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "9.0.2" + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" } }, "yargs-parser": { @@ -5048,7 +5093,7 @@ "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" } } } @@ -5089,8 +5134,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "on-finished": { @@ -5108,7 +5153,7 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -5117,7 +5162,7 @@ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "^1.0.0" } }, "opener": { @@ -5132,8 +5177,8 @@ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" }, "dependencies": { "wordwrap": { @@ -5150,12 +5195,12 @@ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" } }, "options": { @@ -5176,9 +5221,9 @@ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "os-tmpdir": { @@ -5205,7 +5250,7 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.1.0" + "p-limit": "^1.1.0" } }, "package-json": { @@ -5214,10 +5259,10 @@ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", "dev": true, "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.2", - "registry-url": "3.1.0", - "semver": "5.4.1" + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" } }, "parse-github-repo-url": { @@ -5232,10 +5277,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" } }, "parse-json": { @@ -5244,7 +5289,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "parsejson": { @@ -5253,7 +5298,7 @@ "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", "dev": true, "requires": { - "better-assert": "1.0.2" + "better-assert": "~1.0.0" } }, "parseqs": { @@ -5262,7 +5307,7 @@ "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", "dev": true, "requires": { - "better-assert": "1.0.2" + "better-assert": "~1.0.0" } }, "parseuri": { @@ -5271,7 +5316,7 @@ "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", "dev": true, "requires": { - "better-assert": "1.0.2" + "better-assert": "~1.0.0" } }, "parseurl": { @@ -5286,7 +5331,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { @@ -5313,7 +5358,7 @@ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "pify": "2.3.0" + "pify": "^2.0.0" } }, "pathval": { @@ -5340,15 +5385,15 @@ "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", "dev": true, "requires": { - "es6-promise": "4.1.1", - "extract-zip": "1.6.6", - "fs-extra": "1.0.0", - "hasha": "2.2.0", - "kew": "0.7.0", - "progress": "1.1.8", - "request": "2.83.0", - "request-progress": "2.0.1", - "which": "1.3.0" + "es6-promise": "^4.0.3", + "extract-zip": "^1.6.5", + "fs-extra": "^1.0.0", + "hasha": "^2.2.0", + "kew": "^0.7.0", + "progress": "^1.1.8", + "request": "^2.81.0", + "request-progress": "^2.0.1", + "which": "^1.2.10" }, "dependencies": { "progress": { @@ -5377,7 +5422,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pluralize": { @@ -5392,9 +5437,9 @@ "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", "dev": true, "requires": { - "async": "1.5.2", - "debug": "2.6.9", - "mkdirp": "0.5.1" + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" }, "dependencies": { "debug": { @@ -5480,8 +5525,8 @@ "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-number": { @@ -5490,7 +5535,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -5499,7 +5544,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -5510,7 +5555,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -5539,10 +5584,10 @@ "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", "dev": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -5559,9 +5604,9 @@ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } }, "read-pkg-up": { @@ -5570,8 +5615,8 @@ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" }, "dependencies": { "find-up": { @@ -5580,7 +5625,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } } } @@ -5591,13 +5636,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "readdirp": { @@ -5606,10 +5651,10 @@ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" } }, "redent": { @@ -5618,8 +5663,8 @@ "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "dev": true, "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" } }, "regenerate": { @@ -5640,9 +5685,9 @@ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" } }, "regex-cache": { @@ -5651,7 +5696,7 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "regexpu-core": { @@ -5660,9 +5705,9 @@ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "registry-auth-token": { @@ -5671,8 +5716,8 @@ "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", "dev": true, "requires": { - "rc": "1.2.6", - "safe-buffer": "5.1.1" + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" } }, "registry-url": { @@ -5681,7 +5726,7 @@ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "dev": true, "requires": { - "rc": "1.2.6" + "rc": "^1.0.1" } }, "regjsgen": { @@ -5696,7 +5741,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { @@ -5731,7 +5776,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "request": { @@ -5740,28 +5785,28 @@ "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", "dev": true, "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.1", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "hawk": "~6.0.2", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "stringstream": "~0.0.5", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" } }, "request-progress": { @@ -5770,7 +5815,7 @@ "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", "dev": true, "requires": { - "throttleit": "1.0.0" + "throttleit": "^1.0.0" } }, "require-directory": { @@ -5791,8 +5836,8 @@ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" } }, "requires-port": { @@ -5807,7 +5852,7 @@ "integrity": "sha1-aUPDUwxNmn5G8c3dUcFY/GcM294=", "dev": true, "requires": { - "underscore": "1.6.0" + "underscore": "~1.6.0" }, "dependencies": { "underscore": { @@ -5830,8 +5875,8 @@ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" } }, "right-align": { @@ -5841,7 +5886,7 @@ "dev": true, "optional": true, "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "rimraf": { @@ -5850,7 +5895,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "rollup": { @@ -5865,7 +5910,7 @@ "integrity": "sha512-ALGPBFtwJZcYHsNPM6RGJlEncTzAARPvZOGjNPZgDe5hS5t6sJGjiOWibEFVEz5LQN7S7spvCBILaS4N1Cql2w==", "dev": true, "requires": { - "rollup-pluginutils": "1.5.2" + "rollup-pluginutils": "^1.5.0" } }, "rollup-pluginutils": { @@ -5874,8 +5919,8 @@ "integrity": "sha1-HhVud4+UtyVb+hs9AXi+j1xVJAg=", "dev": true, "requires": { - "estree-walker": "0.2.1", - "minimatch": "3.0.4" + "estree-walker": "^0.2.1", + "minimatch": "^3.0.2" } }, "run-async": { @@ -5884,7 +5929,7 @@ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { - "is-promise": "2.1.0" + "is-promise": "^2.1.0" } }, "rx-lite": { @@ -5899,7 +5944,7 @@ "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", "dev": true, "requires": { - "rx-lite": "4.0.8" + "rx-lite": "*" } }, "safe-buffer": { @@ -5920,7 +5965,7 @@ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "dev": true, "requires": { - "semver": "5.4.1" + "semver": "^5.0.3" } }, "semver-regex": { @@ -5953,7 +5998,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -5980,7 +6025,7 @@ "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0" + "is-fullwidth-code-point": "^2.0.0" } }, "sntp": { @@ -5989,7 +6034,7 @@ "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "dev": true, "requires": { - "hoek": "4.2.0" + "hoek": "4.x.x" } }, "socket.io": { @@ -6146,7 +6191,7 @@ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "source-map": "0.5.7" + "source-map": "^0.5.6" } }, "spdx-correct": { @@ -6155,7 +6200,7 @@ "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", "dev": true, "requires": { - "spdx-license-ids": "1.2.2" + "spdx-license-ids": "^1.0.2" } }, "spdx-expression-parse": { @@ -6176,7 +6221,7 @@ "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", "dev": true, "requires": { - "through": "2.3.8" + "through": "2" } }, "split2": { @@ -6185,7 +6230,7 @@ "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", "dev": true, "requires": { - "through2": "2.0.3" + "through2": "^2.0.2" } }, "sprintf-js": { @@ -6200,14 +6245,14 @@ "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", "dev": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" } }, "standard-version": { @@ -6216,13 +6261,13 @@ "integrity": "sha1-MBfoxc7SqS23UBeQJVw7qFFXN10=", "dev": true, "requires": { - "chalk": "1.1.3", - "conventional-changelog": "1.1.7", - "conventional-recommended-bump": "1.0.3", - "figures": "1.7.0", - "fs-access": "1.0.1", - "semver": "5.4.1", - "yargs": "8.0.2" + "chalk": "^1.1.3", + "conventional-changelog": "^1.1.0", + "conventional-recommended-bump": "^1.0.0", + "figures": "^1.5.0", + "fs-access": "^1.0.0", + "semver": "^5.1.0", + "yargs": "^8.0.1" }, "dependencies": { "chalk": { @@ -6231,11 +6276,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "figures": { @@ -6244,8 +6289,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "strip-ansi": { @@ -6254,7 +6299,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -6271,8 +6316,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "string_decoder": { @@ -6281,7 +6326,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "stringstream": { @@ -6296,7 +6341,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" }, "dependencies": { "ansi-regex": { @@ -6325,7 +6370,7 @@ "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", "dev": true, "requires": { - "get-stdin": "4.0.1" + "get-stdin": "^4.0.1" } }, "strip-json-comments": { @@ -6346,12 +6391,12 @@ "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", "dev": true, "requires": { - "ajv": "5.5.1", - "ajv-keywords": "2.1.1", - "chalk": "2.3.0", - "lodash": "4.17.4", + "ajv": "^5.2.3", + "ajv-keywords": "^2.1.0", + "chalk": "^2.1.0", + "lodash": "^4.17.4", "slice-ansi": "1.0.0", - "string-width": "2.1.1" + "string-width": "^2.1.1" } }, "taffydb": { @@ -6366,7 +6411,7 @@ "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", "dev": true, "requires": { - "execa": "0.7.0" + "execa": "^0.7.0" } }, "text-extensions": { @@ -6381,12 +6426,6 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "three": { - "version": "0.91.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.91.0.tgz", - "integrity": "sha512-dzikzdcddNROFZi3vkbV8YonBmqnonbJv2FxlQBEE2wKzZutddnjiS8qBZG2+EB40l505Xw8OMClQm+GmbwI/g==", - "dev": true - }, "throttleit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", @@ -6405,8 +6444,8 @@ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" } }, "timed-out": { @@ -6421,7 +6460,7 @@ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, "to-array": { @@ -6442,7 +6481,7 @@ "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", "dev": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "trim-newlines": { @@ -6475,7 +6514,7 @@ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -6491,7 +6530,7 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, "type-detect": { @@ -6507,7 +6546,7 @@ "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.17" + "mime-types": "~2.1.15" } }, "typedarray": { @@ -6523,9 +6562,9 @@ "dev": true, "optional": true, "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "camelcase": { @@ -6542,9 +6581,9 @@ "dev": true, "optional": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -6592,7 +6631,7 @@ "integrity": "sha1-GY+9rrolTniLDvy2MLwR8kopWeA=", "dev": true, "requires": { - "qs": "2.3.3" + "qs": "~2.3.3" }, "dependencies": { "qs": { @@ -6609,7 +6648,7 @@ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "dev": true, "requires": { - "crypto-random-string": "1.0.0" + "crypto-random-string": "^1.0.0" } }, "universalify": { @@ -6636,16 +6675,16 @@ "integrity": "sha1-+bTHAPv9TsEsgRWHJYd31WPYyGY=", "dev": true, "requires": { - "boxen": "1.3.0", - "chalk": "2.3.0", - "configstore": "3.1.2", - "import-lazy": "2.1.0", - "is-ci": "1.1.0", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" } }, "url-join": { @@ -6660,7 +6699,7 @@ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "dev": true, "requires": { - "prepend-http": "1.0.4" + "prepend-http": "^1.0.1" } }, "useragent": { @@ -6669,8 +6708,8 @@ "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", "dev": true, "requires": { - "lru-cache": "2.2.4", - "tmp": "0.0.33" + "lru-cache": "2.2.x", + "tmp": "0.0.x" }, "dependencies": { "lru-cache": { @@ -6705,8 +6744,8 @@ "integrity": "sha1-5Tg2kQEsuycNzAvCpO/+vhSJDqw=", "dev": true, "requires": { - "conventional-commit-types": "2.2.0", - "find-parent-dir": "0.3.0", + "conventional-commit-types": "^2.0.0", + "find-parent-dir": "^0.3.0", "findup": "0.1.5", "semver-regex": "1.0.0" } @@ -6717,8 +6756,8 @@ "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", "dev": true, "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" } }, "verror": { @@ -6727,9 +6766,9 @@ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "void-elements": { @@ -6744,7 +6783,7 @@ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -6759,7 +6798,7 @@ "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", "dev": true, "requires": { - "string-width": "2.1.1" + "string-width": "^2.1.1" } }, "window-size": { @@ -6781,8 +6820,8 @@ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "dependencies": { "is-fullwidth-code-point": { @@ -6791,7 +6830,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "string-width": { @@ -6800,9 +6839,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "strip-ansi": { @@ -6811,7 +6850,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -6828,7 +6867,7 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" } }, "write-file-atomic": { @@ -6837,9 +6876,9 @@ "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, "ws": { @@ -6848,8 +6887,8 @@ "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", "dev": true, "requires": { - "options": "0.0.6", - "ultron": "1.0.2" + "options": ">=0.0.5", + "ultron": "1.0.x" } }, "wtf-8": { @@ -6900,19 +6939,19 @@ "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", "dev": true, "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" }, "dependencies": { "camelcase": { @@ -6927,9 +6966,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" }, "dependencies": { "string-width": { @@ -6938,9 +6977,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -6951,7 +6990,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "strip-ansi": { @@ -6960,7 +6999,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -6971,7 +7010,7 @@ "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" }, "dependencies": { "camelcase": { @@ -6988,7 +7027,7 @@ "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", "dev": true, "requires": { - "fd-slicer": "1.0.1" + "fd-slicer": "~1.0.1" } }, "yeast": { diff --git a/package.json b/package.json index 7e564b6..8315ace 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ }, "homepage": "https://github.com/jasonChen1982/three.interaction.js#readme", "peerDependencies": { - "three": "^0.89.0" + "three": "^0.110.0" }, "devDependencies": { "@pixi/jsdoc-template": "^2.2.0", @@ -69,7 +69,6 @@ "rollup": "^0.52.0", "rollup-plugin-babel": "^3.0.2", "standard-version": "^4.2.0", - "three": "^0.91.0", "validate-commit-msg": "^2.14.0" }, "config": { diff --git a/src/interaction/InteractionManager.js b/src/interaction/InteractionManager.js index d39d6ea..5240bc4 100644 --- a/src/interaction/InteractionManager.js +++ b/src/interaction/InteractionManager.js @@ -42,6 +42,8 @@ class InteractionManager extends EventDispatcher { options = options || {}; + this.objects = null; + /** * The renderer this interaction manager works for. * @@ -1604,11 +1606,24 @@ class InteractionManager extends EventDispatcher { interactionData.originalEvent = pointerEvent; interactionEvent._reset(); - interactionEvent.intersects = this.raycaster.intersectObjects(this.scene.children, true); - + if (this.objectsToRaycast) { + interactionEvent.intersects = this.raycaster.intersectObjects(this.objectsToRaycast, true); + } else { + interactionEvent.intersects = this.raycaster.intersectObjects(this.scene.children, true); + } return interactionEvent; } + /** + * set objects to raycast + * + * @param {Object3D} objects + * @memberof InteractionManager + */ + setObjectsToRaycast(objects) { + this.objectsToRaycast = objects; + } + /** * Ensures that the original event object contains all data that a regular pointer event would have *