UNPKG

aframe-extras

Version:

Add-ons and examples for A-Frame VR.

135 lines (121 loc) 4.56 kB
(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else { var a = factory(); for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; } })(self, () => { return /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "./src/misc/grab.js": /*!**************************!*\ !*** ./src/misc/grab.js ***! \**************************/ /***/ ((module) => { /* global CANNON */ /** * Based on aframe/examples/showcase/tracked-controls. * * Handles events coming from the hand-controls. * Determines if the entity is grabbed or released. * Updates its position to move along the controller. */ module.exports = AFRAME.registerComponent('grab', { init: function () { this.system = this.el.sceneEl.systems.physics; this.GRABBED_STATE = 'grabbed'; this.grabbing = false; this.hitEl = /** @type {AFRAME.Element} */ null; this.physics = /** @type {AFRAME.System} */ this.el.sceneEl.systems.physics; this.constraint = /** @type {CANNON.Constraint} */ null; // Bind event handlers this.onHit = this.onHit.bind(this); this.onGripOpen = this.onGripOpen.bind(this); this.onGripClose = this.onGripClose.bind(this); }, play: function () { const el = this.el; el.addEventListener('hit', this.onHit); el.addEventListener('gripdown', this.onGripClose); el.addEventListener('gripup', this.onGripOpen); el.addEventListener('trackpaddown', this.onGripClose); el.addEventListener('trackpadup', this.onGripOpen); el.addEventListener('triggerdown', this.onGripClose); el.addEventListener('triggerup', this.onGripOpen); }, pause: function () { const el = this.el; el.removeEventListener('hit', this.onHit); el.removeEventListener('gripdown', this.onGripClose); el.removeEventListener('gripup', this.onGripOpen); el.removeEventListener('trackpaddown', this.onGripClose); el.removeEventListener('trackpadup', this.onGripOpen); el.removeEventListener('triggerdown', this.onGripClose); el.removeEventListener('triggerup', this.onGripOpen); }, onGripClose: function () { this.grabbing = true; }, onGripOpen: function () { const hitEl = this.hitEl; this.grabbing = false; if (!hitEl) { return; } hitEl.removeState(this.GRABBED_STATE); this.hitEl = undefined; this.system.removeConstraint(this.constraint); this.constraint = null; }, onHit: function (evt) { const hitEl = evt.detail.el; // If the element is already grabbed (it could be grabbed by another controller). // If the hand is not grabbing the element does not stick. // If we're already grabbing something you can't grab again. if (hitEl.is(this.GRABBED_STATE) || !this.grabbing || this.hitEl) { return; } hitEl.addState(this.GRABBED_STATE); this.hitEl = hitEl; this.constraint = new CANNON.LockConstraint(this.el.body, hitEl.body); this.system.addConstraint(this.constraint); } }); /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module is referenced by other modules so it can't be inlined /******/ var __webpack_exports__ = __webpack_require__("./src/misc/grab.js"); /******/ /******/ return __webpack_exports__; /******/ })() ; }); //# sourceMappingURL=grab.js.map