{"version":3,"sources":["jsdelivr-header.js","/npm/aframe-laser-manipulation@0.3.0/index.js"],"names":[],"mappings":"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","file":"/npm/aframe-laser-manipulation@0.3.0/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/aframe-laser-manipulation@0.3.0/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","if (!AFRAME.components['object-parent']) require('aframe-object-parent')\r\nif (!AFRAME.components['thumbstick-states']) require('aframe-thumbstick-states')\r\n\r\n/* Used in laser-manipulation */\r\nconst _xRotationAxis = new THREE.Vector3()\r\nconst _yRotationAxis = new THREE.Vector3()\r\nconst _zRotationAxis = new THREE.Vector3()\r\nconst _localAxis = new THREE.Vector3()\r\nconst _unused = new THREE.Vector3()\r\nconst _worldQuaternion = new THREE.Quaternion()\r\n\r\n/* Used in debug-axis */\r\nconst _worldPosition = new THREE.Vector3()\r\nconst _start = new THREE.Vector3()\r\nconst _end = new THREE.Vector3()\r\n\r\nAFRAME.registerComponent('laser-manipulation', {\r\n\r\n    schema: {\r\n      rotateRate: {type: 'number', default: 45},\r\n      center: {type: 'string', default: 'center', oneOf: ['center','contact']},\r\n      grabEvents: {type: 'boolean', default: false},\r\n      grabEvent: {type: 'string', default: 'laserGrab'},\r\n      releaseEvent: {type: 'string', default: 'laserRelease'},\r\n      controlMethod: {type: 'string', default: 'parent', oneOf: ['parent', 'transform']}\r\n    },\r\n  \r\n    update() {\r\n  \r\n      // internally store rotation rate as radians per event\r\n      this.rotateRate = this.data.rotateRate * Math.PI / 180;\r\n\r\n      if (this.data.debug && !this.debugAxes) {\r\n        this.debugAxes = document.createElement('a-entity')\r\n        this.debugAxes.setAttribute('debug-axes', '')\r\n        this.contactPoint.appendChild(this.debugAxes)\r\n        \r\n      }\r\n      else {\r\n        if (this.debugAxes) {\r\n          this.debugAxes.parentNode.removeChild(this.debugAxes)\r\n          this.debugAxes = null\r\n        }\r\n      }\r\n      \r\n    },\r\n  \r\n    init() {\r\n      // controller must have an ID so that\r\n      console.assert(this.el.id)\r\n  \r\n      // This is a rate per second.  We scale distance by this factor per second.\r\n      // Take a root of this to get a scaling factor.\r\n      this.moveSpeed = 3;\r\n  \r\n      // set up listeners\r\n      this.triggerUp = this.triggerUp.bind(this)\r\n      this.triggerDown = this.triggerDown.bind(this)\r\n      this.el.addEventListener('triggerup', this.triggerUp)\r\n      this.el.addEventListener('triggerdown', this.triggerDown)\r\n  \r\n      // variable to track any grabbed element\r\n      this.grabbedEl = null;\r\n  \r\n      // child object used as container for any entity that can be grabbed.\r\n      // (this helps with scaling, rotation etc. of grabbed entity)\r\n      this.contactPoint = document.createElement('a-entity')\r\n      this.contactPoint.setAttribute('id', `${this.el.id}-contact-point`)\r\n      this.el.appendChild(this.contactPoint)\r\n\r\n      this.lastContactPointTransform = new THREE.Object3D()\r\n    },\r\n\r\n    /* Code below is duplicated from mouse-manipulation - should be commonized */\r\n\r\n    // Ensure an element has a usable ID.\r\n    // If it has no ID, add one.\r\n    // If it has an ID but it's not usable to identify the element...\r\n    // ...log an error (preferable to creating confusion by modifying existing IDs)\r\n    assureUsableId(el) {\r\n\r\n        if (!el.id) {\r\n            // No ID, just set one\r\n            el.setAttribute(\"id\", Math.random().toString(36).slice(10))\r\n        }\r\n        else {\r\n            const reference = document.getElementById(el.id)\r\n            if (reference !== el) {\r\n                console.error(`Element ID for ${el.id} does not unambiguously identify it.  Check for duplicate IDs.`)\r\n            }\r\n        }\r\n    },\r\n\r\n    // Get scene graph parent element of an element.\r\n    // Includes the case where the parent is the a-scene.\r\n    getParentEl(el) {\r\n\r\n        const parentObject = el.object3D.parent\r\n\r\n        if (parentObject.type === 'Scene') {\r\n            return(this.el.sceneEl)\r\n        }\r\n        else {\r\n            return parentObject.el\r\n        }\r\n    },\r\n\r\n    /* Code above is duplicated from mouse-manipulation - should be commonized */\r\n\r\n    triggerDown(evt) {\r\n  \r\n      console.assert(!this.grabbedEl)\r\n  \r\n      const intersections = this.getIntersections(evt.target)\r\n  \r\n      if (intersections.length === 0)  return;\r\n  \r\n      const element = this.getRaycastTarget(intersections[0])\r\n  \r\n      const intersectionData = this.el.components.raycaster.getIntersection(intersections[0])\r\n  \r\n      // Save record of original parent, and make sure it has a usable ID.\r\n      if (!this.originalParentEl) {\r\n        this.originalParentEl = this.getParentEl(element)\r\n      }\r\n      this.assureUsableId(this.originalParentEl)\r\n\r\n      // set up a contact point at the position of the grabbed entity\r\n      if (this.data.center === \"center\") {\r\n        // attach to entity center\r\n        const pos = this.contactPoint.object3D.position\r\n        element.object3D.getWorldPosition(pos)\r\n        this.contactPoint.object3D.parent.worldToLocal(pos)\r\n      }\r\n      else {\r\n        // attach to ray's contact point with entity\r\n        const contactPoint = this.el.object3D.worldToLocal(intersectionData.point)\r\n        this.contactPoint.object3D.position.copy(contactPoint)\r\n        \r\n      }\r\n      \r\n      this.getAxesFromRay(_xRotationAxis, _yRotationAxis, _zRotationAxis)\r\n\r\n\r\n      // reparent element to this controller.\r\n      if (this.data.controlMethod === 'parent') {\r\n        this.activeControlMethod = 'parent'\r\n        element.setAttribute('object-parent', 'parent', `#${this.el.id}-contact-point`)\r\n      }\r\n      else {\r\n        this.activeControlMethod = 'transform'\r\n        this.saveContactPointTransform()\r\n      }\r\n\r\n      // store reference to grabbed element\r\n      this.grabbedEl = element\r\n\r\n      if (this.data.grabEvents) {\r\n        this.grabbedEl.emit(this.data.grabEvent)\r\n      }\r\n    },\r\n\r\n    getAxesFromRay(xAxis, yAxis, zAxis) {\r\n      zAxis.copy(this.el.components.raycaster.raycaster.ray.direction)   \r\n      this.el.object3D.matrixWorld.extractBasis(_unused, yAxis, _unused)\r\n      yAxis.projectOnPlane(zAxis).normalize()\r\n\r\n      xAxis.crossVectors(zAxis, yAxis)\r\n    },\r\n  \r\n    triggerUp() {\r\n  \r\n      if (!this.grabbedEl) return\r\n  \r\n      if (this.activeControlMethod === 'parent') {\r\n        this.grabbedEl.setAttribute('object-parent', 'parent', `#${this.originalParentEl.id}`)\r\n      }\r\n      \r\n      if (this.data.grabEvents) {\r\n        // defer event to next schedule, to allow reparenting to have completed.\r\n        const releasedEl = this.grabbedEl\r\n        setTimeout(() => {\r\n          releasedEl.emit(this.data.releaseEvent)\r\n        })\r\n      }\r\n      this.grabbedEl = null\r\n      this.activeControlMethod = ''\r\n    },\r\n  \r\n    getIntersections(controllerEl) {\r\n  \r\n      const els = controllerEl.components.raycaster.intersectedEls\r\n      return els\r\n    },\r\n  \r\n    // Implements moving out or in (in = -ve)\r\n    moveOut(timeDelta) {\r\n      const scalar = Math.pow(this.moveSpeed, timeDelta/1000);\r\n      this.contactPoint.object3D.position.multiplyScalar(scalar)\r\n    },\r\n\r\n    getRaycastTarget(el) {\r\n      if (el.components['raycast-target']) {\r\n          return el.components['raycast-target'].target\r\n      }\r\n      else {\r\n          return el\r\n      }\r\n    },\r\n\r\n    saveContactPointTransform() {\r\n      const transform = this.lastContactPointTransform\r\n      transform.quaternion.identity()\r\n      transform.position.set(0, 0, 0)\r\n      transform.scale.set(1, 1, 1)\r\n      this.contactPoint.object3D.add(transform)\r\n      this.el.sceneEl.object3D.attach(transform)\r\n    },\r\n\r\n    followContactPoint() {\r\n      const object = this.grabbedEl.object3D\r\n      this.lastContactPointTransform.attach(object)\r\n      this.saveContactPointTransform()\r\n      this.originalParentEl.object3D.attach(object)\r\n    },\r\n    \r\n    tick: function(time, timeDelta) {\r\n\r\n      if (this.activeControlMethod === 'transform') {\r\n        this.followContactPoint()\r\n      }\r\n      \r\n      if (this.el.is(\"moving-in\")) {\r\n        this.moveOut(-timeDelta);\r\n      }\r\n      else if (this.el.is(\"moving-out\")) {\r\n        this.moveOut(timeDelta);\r\n      }\r\n  \r\n      const angle = timeDelta * this.rotateRate / 1000\r\n      const contactPoint = this.contactPoint.object3D\r\n      this.getAxesFromRay(_xRotationAxis, _yRotationAxis, _zRotationAxis)\r\n      if (this.el.is(\"rotating-y-plus\")) {\r\n        this.rotateOnWorldAxis(contactPoint, _yRotationAxis, angle)\r\n      }\r\n      else if (this.el.is(\"rotating-y-minus\")) {\r\n        this.rotateOnWorldAxis(contactPoint, _yRotationAxis, -angle)\r\n      }\r\n\r\n      if (this.el.is(\"rotating-x-plus\")) {\r\n        this.rotateOnWorldAxis(contactPoint, _xRotationAxis, angle)\r\n      }\r\n      else if (this.el.is(\"rotating-x-minus\")) {\r\n        this.rotateOnWorldAxis(contactPoint, _xRotationAxis, -angle)\r\n      }\r\n\r\n      if (this.data.debug) {\r\n        if (this.el.is(\"rotating-y-plus\") ||\r\n            this.el.is(\"rotating-y-minus\")) {\r\n          const y = _yRotationAxis\r\n          this.contactPoint.setAttribute('debug-axis__y', `direction: ${y.x}, ${y.y}, ${y.z}; color: green`)\r\n        }\r\n        else {\r\n          this.contactPoint.removeAttribute('debug-axis__y')\r\n        }\r\n        if (this.el.is(\"rotating-x-plus\") ||\r\n            this.el.is(\"rotating-x-minus\")) {\r\n          const x = _xRotationAxis\r\n          this.contactPoint.setAttribute('debug-axis__x', `direction: ${x.x}, ${x.y}, ${x.z}; color: red`)\r\n        }\r\n        else {\r\n          this.contactPoint.removeAttribute('debug-axis__x')\r\n        }\r\n      }\r\n    },\r\n\r\n    /* Alternative to THREE.Object3D.rotateOnWorldAxis(), which doesn't\r\n     * support the case where the parent (or indeed any ancestor) is\r\n     * rotated.\r\n     * https://threejs.org/docs/index.html?q=object3D#api/en/core/Object3D.rotateOnWorldAxis\r\n     */\r\n    rotateOnWorldAxis(object, axis, angle) {\r\n      object.getWorldQuaternion(_worldQuaternion)\r\n      _worldQuaternion.invert()\r\n      _localAxis.copy(axis)\r\n      _localAxis.applyQuaternion(_worldQuaternion)\r\n\r\n      object.rotateOnAxis(_localAxis, angle)\r\n    }\r\n  });\r\n\r\n  /* Set on an entity to show X, Y & Z axes */\r\n  AFRAME.registerComponent(\"debug-axes\", {\r\n\r\n    init() {\r\n  \r\n      this.addAxis('red', '0 0 0')\r\n      this.addAxis('green', '0 0 90')\r\n      this.addAxis('blue', '0 -90 0')\r\n    },\r\n  \r\n    addAxis(color, rotation) {\r\n  \r\n      const axisHtml = `\r\n      <a-entity rotation=\"${rotation}\"\r\n      line__adjustment-axis=\"start: -0.1 0 0;\r\n                              end: 0.1 0 0;\r\n                              color: ${color}\">\r\n        <a-cone radius-bottom=0.01;\r\n                radius-top=0;\r\n                height=0.02;\r\n                color=\"${color}\";\r\n                position=\"0.1 0 0\";\r\n                rotation=\"0 0 -90\">\r\n        </a-cone>\r\n      </a-entity>`\r\n  \r\n      this.el.insertAdjacentHTML('beforeend', axisHtml)\r\n    }\r\n  })\r\n\r\n  /* Set on an entity to a particular axis in world co-ordinates */\r\n  AFRAME.registerComponent(\"debug-axis\", {\r\n\r\n    schema: {\r\n      direction: { type: 'vec3'},\r\n      color: { type: 'color', default: 'green'}\r\n    },\r\n\r\n    multiple: true,\r\n\r\n    update() {\r\n\r\n      const object = this.el.object3D\r\n      object.getWorldPosition(_worldPosition)\r\n\r\n      _start.subVectors(_worldPosition, this.data.direction)\r\n      _end.addVectors(_worldPosition, this.data.direction)\r\n\r\n      object.worldToLocal(_start)\r\n      object.worldToLocal(_end)\r\n\r\n      this.el.setAttribute('line__axis', \r\n                           `start: ${_start.x} ${_start.y} ${_start.z};\r\n                            end: ${_end.x} ${_end.y} ${_end.z};\r\n                            color: ${this.data.color}`)\r\n    },\r\n\r\n    remove() {\r\n      this.el.removeAttribute('line__axis')\r\n    }\r\n  })\r\n"]}