/******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports; /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ exports: {}, /******/ id: moduleId, /******/ loaded: false /******/ }; /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ // Load entry module and return exports /******/ return __webpack_require__(0); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; var _lodash = __webpack_require__(1); var _lodash2 = _interopRequireDefault(_lodash); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } if (typeof AFRAME === 'undefined') { throw 'mouse-cursor Component attempted to register before AFRAME was available.'; } var IS_VR_AVAILABLE = AFRAME.utils.device.isMobile() || window.hasNonPolyfillWebVRSupport; /** * Mouse Cursor Component for A-Frame. */ AFRAME.registerComponent('mouse-cursor', { schema: {}, /** * Called once when component is attached. Generally for initial setup. * @protected */ init: function init() { this._raycaster = new THREE.Raycaster(); this._mouse = new THREE.Vector2(); this._isMobile = this.el.sceneEl.isMobile; this._isStereo = false; this._active = false; this._isDown = false; this._intersectedEl = null; this._attachEventListeners(); this._canvasSize = false; /* bind functions */ this.__getCanvasPos = this._getCanvasPos.bind(this); this.__getCanvasPos = this._getCanvasPos.bind(this); this.__onEnterVR = this._onEnterVR.bind(this); this.__onExitVR = this._onExitVR.bind(this); this.__onDown = this._onDown.bind(this); this.__onClick = this._onClick.bind(this); this.__onMouseMove = this._onMouseMove.bind(this); this.__onRelease = this._onRelease.bind(this); this.__onTouchMove = this._onTouchMove.bind(this); this.__onComponentChanged = this._onComponentChanged.bind(this); }, /** * Called when component is attached and when component data changes. * Generally modifies the entity based on the data. * @protected */ update: function update(oldData) {}, /** * Called when a component is removed (e.g., via removeAttribute). * Generally undoes all modifications to the entity. * @protected */ remove: function remove() { this._removeEventListeners(); this._raycaster = null; }, /** * Called on each scene tick. * @protected */ // tick (t) { }, /** * Called when entity pauses. * Use to stop or remove any dynamic or background behavior such as events. * @protected */ pause: function pause() { this._active = false; }, /** * Called when entity resumes. * Use to continue or add any dynamic or background behavior such as events. * @protected */ play: function play() { this._active = true; }, /*============================== = events = ==============================*/ /** * @private */ _attachEventListeners: function _attachEventListeners() { var el = this.el; var sceneEl = el.sceneEl; var canvas = sceneEl.canvas; /* if canvas doesn't exist, listen for canvas to load. */ if (!canvas) { el.sceneEl.addEventListener('render-target-loaded', this._attachEventListeners.bind(this)); return; } window.addEventListener('resize', this.__getCanvasPos); document.addEventListener('scroll', this.__getCanvasPos); /* update _canvas in case scene is embedded */ this._getCanvasPos(); /* scene */ sceneEl.addEventListener('enter-vr', this.__onEnterVR); sceneEl.addEventListener('exit-vr', this.__onExitVR); /* Mouse events */ canvas.addEventListener('mousedown', this.__onDown); canvas.addEventListener('mousemove', this.__onMouseMove); canvas.addEventListener('mouseup', this.__onRelease); canvas.addEventListener('mouseout', this.__onRelease); /* Touch events */ canvas.addEventListener('touchstart', this.__onDown); canvas.addEventListener('touchmove', this.__onTouchMove); canvas.addEventListener('touchend', this.__onRelease); /* Click event */ canvas.addEventListener('click', this.__onClick); /* Element component change */ el.addEventListener('componentchanged', this.__onComponentChanged); }, /** * @private */ _removeEventListeners: function _removeEventListeners() { var el = this.el; var sceneEl = el.sceneEl; var canvas = sceneEl.canvas; if (!canvas) { return; } window.removeEventListener('resize', this.__getCanvasPos); document.removeEventListener('scroll', this.__getCanvasPos); /* scene */ sceneEl.removeEventListener('enter-vr', this.__onEnterVR); sceneEl.removeEventListener('exit-vr', this.__onExitVR); /* Mouse events */ canvas.removeEventListener('mousedown', this.__onDown); canvas.removeEventListener('mousemove', this.__onMouseMove); canvas.removeEventListener('mouseup', this.__onRelease); canvas.removeEventListener('mouseout', this.__onRelease); /* Touch events */ canvas.removeEventListener('touchstart', this.__onDown); canvas.removeEventListener('touchmove', this.__onTouchMove); canvas.removeEventListener('touchend', this.__onRelease); /* Click event */ canvas.removeEventListener('click', this.__onClick); /* Element component change */ el.removeEventListener('componentchanged', this.__onComponentChanged); }, /** * Check if the mouse cursor is active * @private */ _isActive: function _isActive() { return !!(this._active || this._raycaster); }, /** * @private */ _onDown: function _onDown(evt) { if (!this._isActive()) { return; } this._isDown = true; this._updateMouse(evt); this._updateIntersectObject(); if (!this._isMobile) { this._setInitMousePosition(evt); } if (this._intersectedEl) { this._emit('mousedown'); } }, /** * @private */ _onClick: function _onClick(evt) { if (!this._isActive()) { return; } this._updateMouse(evt); this._updateIntersectObject(); if (this._intersectedEl) { this._emit('click'); } }, /** * @private */ _onRelease: function _onRelease() { if (!this._isActive()) { return; } /* check if mouse position has updated */ if (this._defMousePosition) { var defX = Math.abs(this._initMousePosition.x - this._defMousePosition.x); var defY = Math.abs(this._initMousePosition.y - this._defMousePosition.y); var def = Math.max(defX, defY); if (def > 0.04) { /* mouse has moved too much to recognize as click. */ this._isDown = false; } } if (this._isDown && this._intersectedEl) { this._emit('mouseup'); } this._isDown = false; this._resetMousePosition(); }, /** * @private */ _onMouseMove: function _onMouseMove(evt) { if (!this._isActive()) { return; } this._updateMouse(evt); this._updateIntersectObject(); if (this._isDown) { this._setMousePosition(evt); } }, /** * @private */ _onTouchMove: function _onTouchMove(evt) { if (!this._isActive()) { return; } this._isDown = false; }, /** * @private */ _onEnterVR: function _onEnterVR() { if (IS_VR_AVAILABLE) { this._isStereo = true; } this._getCanvasPos(); }, /** * @private */ _onExitVR: function _onExitVR() { this._isStereo = false; this._getCanvasPos(); }, /** * @private */ _onComponentChanged: function _onComponentChanged(evt) { if (evt.detail.name === 'position') { this._updateIntersectObject(); } }, /*============================= = mouse = =============================*/ /** * Get mouse position from size of canvas element * @private */ _getPosition: function _getPosition(evt) { var _canvasSize = this._canvasSize, w = _canvasSize.width, h = _canvasSize.height, offsetW = _canvasSize.left, offsetH = _canvasSize.top; var cx = void 0, cy = void 0; if (this._isMobile) { var touches = evt.touches; if (!touches || touches.length !== 1) { return; } var touch = touches[0]; cx = touch.clientX; cy = touch.clientY; } else { cx = evt.clientX; cy = evt.clientY; } /* account for the offset if scene is embedded */ cx = cx - offsetW; cy = cy - offsetH; if (this._isStereo) { cx = cx % (w / 2) * 2; } var x = cx / w * 2 - 1; var y = -(cy / h) * 2 + 1; return { x: x, y: y }; }, /** * Update mouse * @private */ _updateMouse: function _updateMouse(evt) { var pos = this._getPosition(evt); if (!pos) { return; } this._mouse.x = pos.x; this._mouse.y = pos.y; }, /** * Update mouse position * @private */ _setMousePosition: function _setMousePosition(evt) { this._defMousePosition = this._getPosition(evt); }, /** * Update initial mouse position * @private */ _setInitMousePosition: function _setInitMousePosition(evt) { this._initMousePosition = this._getPosition(evt); }, _resetMousePosition: function _resetMousePosition() { this._initMousePosition = this._defMousePosition = null; }, /*====================================== = scene children = ======================================*/ /** * @private */ _getCanvasPos: function _getCanvasPos() { this._canvasSize = this.el.sceneEl.canvas.getBoundingClientRect(); // update _canvas in case scene is embedded }, /** * Get non group object3D * @private */ _getChildren: function _getChildren(object3D) { var _this = this; return object3D.children.map(function (obj) { return obj.type === 'Group' ? _this._getChildren(obj) : obj; }); }, /** * Get all non group object3D * @private */ _getAllChildren: function _getAllChildren() { var children = this._getChildren(this.el.sceneEl.object3D); return (0, _lodash2.default)(children); }, /*==================================== = intersection = ====================================*/ /** * Update intersect element with cursor * @private */ _updateIntersectObject: function _updateIntersectObject() { var _raycaster = this._raycaster, el = this.el, _mouse = this._mouse; var scene = el.sceneEl.object3D; var camera = this.el.getObject3D('camera'); this._getAllChildren(); /* find intersections */ // _raycaster.setFromCamera(_mouse, camera) /* this somehow gets error so did the below */ _raycaster.ray.origin.setFromMatrixPosition(camera.matrixWorld); _raycaster.ray.direction.set(_mouse.x, _mouse.y, 0.5).unproject(camera).sub(_raycaster.ray.origin).normalize(); /* get objects intersected between mouse and camera */ var children = this._getAllChildren(); var intersects = _raycaster.intersectObjects(children); if (intersects.length > 0) { /* get the closest three obj */ var obj = void 0; intersects.every(function (item) { if (item.object.parent.visible === true) { obj = item.object; return false; } else { return true; } }); if (!obj) { this._clearIntersectObject(); return; } /* get the entity */ var _el = obj.parent.el; /* only updates if the object is not the activated object */ if (this._intersectedEl === _el) { return; } this._clearIntersectObject(); /* apply new object as intersected */ this._setIntersectObject(_el); } else { this._clearIntersectObject(); } }, /** * Set intersect element * @private * @param {AEntity} el `a-entity` element */ _setIntersectObject: function _setIntersectObject(el) { this._intersectedEl = el; if (this._isMobile) { return; } el.addState('hovered'); el.emit('mouseenter'); this.el.addState('hovering'); }, /** * Clear intersect element * @private */ _clearIntersectObject: function _clearIntersectObject() { var el = this._intersectedEl; if (el && !this._isMobile) { el.removeState('hovered'); el.emit('mouseleave'); this.el.removeState('hovering'); } this._intersectedEl = null; }, /*=============================== = emitter = ===============================*/ /** * @private */ _emit: function _emit(evt) { var _intersectedEl = this._intersectedEl; this.el.emit(evt, { target: _intersectedEl }); if (_intersectedEl) { _intersectedEl.emit(evt); } } }); /***/ }), /* 1 */ /***/ (function(module, exports) { /* WEBPACK VAR INJECTION */(function(global) {/** * lodash (Custom Build) <https://lodash.com/> * Build: `lodash modularize exports="npm" -o ./` * Copyright jQuery Foundation and other contributors <https://jquery.org/> * Released under MIT license <https://lodash.com/license> * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors */ /** Used as references for various `Number` constants. */ var INFINITY = 1 / 0, MAX_SAFE_INTEGER = 9007199254740991; /** `Object#toString` result references. */ var argsTag = '[object Arguments]', funcTag = '[object Function]', genTag = '[object GeneratorFunction]'; /** Detect free variable `global` from Node.js. */ var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; /** Detect free variable `self`. */ var freeSelf = typeof self == 'object' && self && self.Object === Object && self; /** Used as a reference to the global object. */ var root = freeGlobal || freeSelf || Function('return this')(); /** * Appends the elements of `values` to `array`. * * @private * @param {Array} array The array to modify. * @param {Array} values The values to append. * @returns {Array} Returns `array`. */ function arrayPush(array, values) { var index = -1, length = values.length, offset = array.length; while (++index < length) { array[offset + index] = values[index]; } return array; } /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var objectToString = objectProto.toString; /** Built-in value references. */ var Symbol = root.Symbol, propertyIsEnumerable = objectProto.propertyIsEnumerable, spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined; /** * The base implementation of `_.flatten` with support for restricting flattening. * * @private * @param {Array} array The array to flatten. * @param {number} depth The maximum recursion depth. * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. * @param {Array} [result=[]] The initial result value. * @returns {Array} Returns the new flattened array. */ function baseFlatten(array, depth, predicate, isStrict, result) { var index = -1, length = array.length; predicate || (predicate = isFlattenable); result || (result = []); while (++index < length) { var value = array[index]; if (depth > 0 && predicate(value)) { if (depth > 1) { // Recursively flatten arrays (susceptible to call stack limits). baseFlatten(value, depth - 1, predicate, isStrict, result); } else { arrayPush(result, value); } } else if (!isStrict) { result[result.length] = value; } } return result; } /** * Checks if `value` is a flattenable `arguments` object or array. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. */ function isFlattenable(value) { return isArray(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]); } /** * Recursively flattens `array`. * * @static * @memberOf _ * @since 3.0.0 * @category Array * @param {Array} array The array to flatten. * @returns {Array} Returns the new flattened array. * @example * * _.flattenDeep([1, [2, [3, [4]], 5]]); * // => [1, 2, 3, 4, 5] */ function flattenDeep(array) { var length = array ? array.length : 0; return length ? baseFlatten(array, INFINITY) : []; } /** * Checks if `value` is likely an `arguments` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, * else `false`. * @example * * _.isArguments(function() { return arguments; }()); * // => true * * _.isArguments([1, 2, 3]); * // => false */ function isArguments(value) { // Safari 8.1 makes `arguments.callee` enumerable in strict mode. return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') && (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag); } /** * Checks if `value` is classified as an `Array` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array, else `false`. * @example * * _.isArray([1, 2, 3]); * // => true * * _.isArray(document.body.children); * // => false * * _.isArray('abc'); * // => false * * _.isArray(_.noop); * // => false */ var isArray = Array.isArray; /** * Checks if `value` is array-like. A value is considered array-like if it's * not a function and has a `value.length` that's an integer greater than or * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is array-like, else `false`. * @example * * _.isArrayLike([1, 2, 3]); * // => true * * _.isArrayLike(document.body.children); * // => true * * _.isArrayLike('abc'); * // => true * * _.isArrayLike(_.noop); * // => false */ function isArrayLike(value) { return value != null && isLength(value.length) && !isFunction(value); } /** * This method is like `_.isArrayLike` except that it also checks if `value` * is an object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array-like object, * else `false`. * @example * * _.isArrayLikeObject([1, 2, 3]); * // => true * * _.isArrayLikeObject(document.body.children); * // => true * * _.isArrayLikeObject('abc'); * // => false * * _.isArrayLikeObject(_.noop); * // => false */ function isArrayLikeObject(value) { return isObjectLike(value) && isArrayLike(value); } /** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */ function isFunction(value) { // The use of `Object#toString` avoids issues with the `typeof` operator // in Safari 8-9 which returns 'object' for typed array and other constructors. var tag = isObject(value) ? objectToString.call(value) : ''; return tag == funcTag || tag == genTag; } /** * Checks if `value` is a valid array-like length. * * **Note:** This method is loosely based on * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. * @example * * _.isLength(3); * // => true * * _.isLength(Number.MIN_VALUE); * // => false * * _.isLength(Infinity); * // => false * * _.isLength('3'); * // => false */ function isLength(value) { return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; } /** * Checks if `value` is the * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(_.noop); * // => true * * _.isObject(null); * // => false */ function isObject(value) { var type = typeof value; return !!value && (type == 'object' || type == 'function'); } /** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. * @example * * _.isObjectLike({}); * // => true * * _.isObjectLike([1, 2, 3]); * // => true * * _.isObjectLike(_.noop); * // => false * * _.isObjectLike(null); * // => false */ function isObjectLike(value) { return !!value && typeof value == 'object'; } module.exports = flattenDeep; /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }) /******/ ]);