{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/index.js","webpack:///./src/webxr-ar.js","webpack:///./src/mozilla-xr-ar.js","webpack:///./src/ar-planes.js","webpack:///./src/ar-anchors.js","webpack:///./src/ar-images.js","webpack:///./src/ar.js","webpack:///./src/ar-camera.js","webpack:///./src/ar-raycaster.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","transform","hitpoint","worldpos","AFRAME","registerComponent","schema","takeOverCamera","default","cameraUserHeight","worldSensing","init","this","posePosition","THREE","Vector3","poseQuaternion","Quaternion","poseEuler","Euler","poseRotation","projectionMatrix","Matrix4","onceSceneLoaded","el","sceneEl","hasLoaded","setTimeout","addEventListener","rawPlanes_","planes_","Map","anchors_","convertPolygonToVertices","polygon","newVertices","convertedPlane","rawPlane","pose","vertex","mins","maxs","verticesLength","length","Float32Array","j","x","y","z","position","set","id","center","extent","modelMatrix","matrix","alignment","orientation","vertices","rawPlaneRemoved","delete","rawPlaneUpdated","rawPlaneNotUpdated","rawPlaneCreated","Math","random","toString","substring","tick","dt","frame","arDisplay","worldInformation","world","forEach","plane","detectedPlanes","has","timestamp","time","planePose","getPose","planeSpace","refSpace","lastChangedTime","camera","arCamera","isARPerspectiveCamera","vrDisplay","setAttribute","self","window","checkForARDisplay","navigator","xr","isSessionSupported","type","then","supported","ourRequiredFeatures","ourOptionalFeatures","data","push","existingFeatures","getAttribute","optionalFeatures","feature","filter","index","arr","requiredFeatures","concat","join","xrHitTestSource","viewerSpace","renderer","ev","session","getSession","canvas","e","pageX","inputSource","gamepad","axes","pageY","event","TouchEvent","view","bubbles","cancelable","targetTouches","dispatchEvent","MouseEvent","clientX","clientY","requestReferenceSpace","space","requestHitTestSource","hitTestSource","updateWorldTrackingState","planeDetectionState","enabled","getPosition","getFrameData","getOrientation","getRotation","getProjectionMatrix","hitAR","raycasterEl","hitsToReturn","is","xrViewerPose","getViewerPose","hitTestResults","getHitTestResults","fromArray","setFromMatrixPosition","object3D","getWorldPosition","distance","distanceTo","point","clone","addImage","url","physicalWidth","removeImage","getAnchors","Array","from","values","getPlanes","convertVertices","hitquat","hitscale","onInit","onWatch","forceResize","poseMatrix","viewMatrix","webkit","messageHandlers","initAR","userAgent","indexOf","options","ui","browser","points","focus","rec","rec_time","mic","build","warnings","anchors","debug","statistics","callback","nativeTime","eventName","console","log","stopAR","postMessage","components","enterAREl","classList","remove","vrmodeui","newarbutton","cloneNode","parentNode","replaceChild","onclick","scene","scenes","addState","orientationModalEl","style","emit","target","wakelock","release","sz","Vector2","pixelRatio","getPixelRatio","getSize","width","height","userGrantedWorldSensingData","screen","devicePixelRatio","sx","sy","sc","maxSize","maxCanvasSize","aspectRatio","round","forceResizeX","forceResizeY","aspect","copy","setSize","watchAR","location","objects","light_intensity","deviceId","frameData","handleFrame","element","camera_transform","decompose","setFromQuaternion","RAD2DEG","projection_camera","camera_view","userHeight","poseLost","newObjects","plane_center","uuid","plane_extent","plane_alignment","geometry","anchorData","removedObjects","anchor","aImg","aCanvas","document","createElement","aContext","getContext","crossOrigin","src","body","appendChild","complete","naturalHeight","drawImage","b64ImageData","buffer","base64","encodings","bytes","ArrayBuffer","Uint8Array","arrayBuffer","ImageData","chunk","byteLength","byteRemainder","mainLength","encode","getImageData","callbackForCreateImageAnchorCounter","callbackName","imageName","undefined","created","activateDetectionImage","uid","error","activated","createImageAnchor","imageWidth","imageHeight","callbackForRemoveImageAnchorCounter","deactivated","destroyDetectionImage","destroyed","deactivateDetectionImage","hitTestNoAnchor","VRHit","rayToPlane","hitVars","rayStart","rayEnd","cameraPosition","cameraQuaternion","projViewMatrix","worldRayStart","worldRayEnd","worldRayDir","planeMatrix","planeMatrixInverse","planeExtent","planePosition","planeCenter","planeNormal","planeIntersection","planeIntersectionLocal","planeHit","planeQuaternion","rayIntersectsPlane","rayOrigin","rayDirection","denom","dot","subVectors","sortFunction","a","b","distA","Error","hits","planes","multiplyMatrices","getInverse","applyMatrix4","normalize","planeAlignment","multiplyScalar","addVectors","abs","setFromRotationMatrix","makeRotationFromQuaternion","setPosition","hit","elements","sort","tempScale","tempMat4","tempPosition","tempQuaternion","getPlaneSource","whichar","planeSource","getSource","anchorsAdded","anchorsAddedDetail","anchorsUpdated","anchorsUpdatedDetail","anchorsRemoved","anchorsRemovedDetail","addedThese","updatedThese","removedThese","seenThese","planespec","identifier","adding","hasTimestamp","compose","slice","utils","deepEqual","keys","source","hideUI","dependencies","sys","head","insertAdjacentHTML","lookControls","wasLookControlsEnabled","update","oldData","checkWhichAR","pos","rot","raycaster","raycasterIntersectObjects","intersectObjects","recursive","rawIntersections","results","hitARResults","arguments"],"mappings":"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","file":"aframe-ar.min.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","require('./webxr-ar');\r\n//require('./three-ar');\r\nrequire('./mozilla-xr-ar');\r\nrequire('./ar-planes');\r\nrequire('./ar-anchors');\r\nrequire('./ar-images');\r\nrequire('./ar');\r\nrequire('./ar-camera');\r\nrequire('./ar-raycaster');\r\n\r\n","/* global AFRAME, THREE, VRFrameData */\r\n\r\nAFRAME.registerComponent('webxr-ar', {\r\n schema: {\r\n takeOverCamera: {default: true},\r\n cameraUserHeight: {default: false},\r\n worldSensing: {default: false} // currently unused\r\n },\r\n\r\n init: function () {\r\n this.posePosition = new THREE.Vector3();\r\n this.poseQuaternion = new THREE.Quaternion();\r\n this.poseEuler = new THREE.Euler(0, 0, 0, 'YXZ');\r\n this.poseRotation = new THREE.Vector3();\r\n this.projectionMatrix = new THREE.Matrix4();\r\n\r\n this.onceSceneLoaded = this.onceSceneLoaded.bind(this);\r\n if (this.el.sceneEl.hasLoaded) {\r\n setTimeout(this.onceSceneLoaded);\r\n } else {\r\n this.el.sceneEl.addEventListener('loaded', this.onceSceneLoaded);\r\n }\r\n\r\n // Add planes handling, so we can do synchronous hit test.\r\n\r\n this.rawPlanes_ = null;\r\n this.planes_ = new Map();\r\n this.anchors_ = new Map();\r\n },\r\n\r\n convertPolygonToVertices: function(polygon) {\r\n return newVertices;\r\n },\r\n\r\n convertedPlane: function(rawPlane, pose) {\r\n var mins = [0, 0];\r\n var maxs = [0, 0];\r\n var verticesLength = rawPlane.polygon.length;\r\n var newVertices = new Float32Array(verticesLength * 3);\r\n var i = 0;\r\n var j = 0;\r\n var vertex;\r\n for (i = 0; i < verticesLength; i++) {\r\n vertex = rawPlane.polygon[i];\r\n newVertices[j] = vertex.x;\r\n newVertices[j + 1] = vertex.y;\r\n newVertices[j + 2] = vertex.z;\r\n j += 3;\r\n if (i == 0) {\r\n mins[0] = maxs[0] = vertex.x;\r\n mins[1] = maxs[1] = vertex.z;\r\n } else {\r\n if (mins[0] > vertex.x) { mins[0] = vertex.x; }\r\n if (maxs[0] < vertex.x) { maxs[0] = vertex.x; }\r\n if (mins[1] > vertex.z) { mins[1] = vertex.z; }\r\n if (maxs[1] < vertex.z) { maxs[1] = vertex.z; }\r\n }\r\n }\r\n var position = pose.transform.position;\r\n rawPlane.position.set(position.x, position.y, position.z);\r\n var converted = {\r\n id: rawPlane.id,\r\n center: rawPlane.position,\r\n extent: [maxs[0] - mins[0], maxs[1] - mins[1]],\r\n modelMatrix: pose.transform.matrix,\r\n alignment: rawPlane.orientation != 'Horizontal' ? 1 : 0,\r\n vertices: newVertices\r\n };\r\n return converted;\r\n },\r\n\r\n rawPlaneRemoved: function(rawPlane) {\r\n // remove the converted plane\r\n this.planes_.delete(rawPlane.id);\r\n },\r\n\r\n rawPlaneUpdated: function(rawPlane, pose) {\r\n // convert the updated plane\r\n this.planes_.set(rawPlane.id, this.convertedPlane(rawPlane, pose));\r\n },\r\n\r\n rawPlaneNotUpdated: function(rawPlane, pose) {\r\n // FIXME: check is broken so update anyway\r\n this.rawPlaneUpdated(rawPlane, pose);\r\n // do nothing\r\n },\r\n\r\n rawPlaneCreated: function(rawPlane, pose) {\r\n // assign and attach an id... for now, use Math.random()\r\n rawPlane.id = Math.random().toString().substring(2);\r\n rawPlane.position = new THREE.Vector3();\r\n // convert the plane\r\n this.planes_[rawPlane.id] = this.convertedPlane(rawPlane, pose);\r\n },\r\n\r\n tick: function (t, dt) {\r\n let frame = this.el.sceneEl.frame;\r\n if (!this.arDisplay\r\n || !frame\r\n || !frame.worldInformation) { return; }\r\n\r\n // use the planes information\r\n let world = frame.worldInformation;\r\n\r\n // check for removed planes\r\n this.rawPlanes_ && this.rawPlanes_.forEach(plane => {\r\n if(!world.detectedPlanes || !world.detectedPlanes.has(plane)) {\r\n // Handle removed plane - `plane` was present in previous frame but is no longer tracked.\r\n this.rawPlaneRemoved(plane);\r\n }\r\n });\r\n\r\n // check for changed planes\r\n let timestamp = this.el.sceneEl.time;\r\n world.detectedPlanes && world.detectedPlanes.forEach(plane => {\r\n let planePose = frame.getPose(plane.planeSpace, this.refSpace);\r\n if (this.rawPlanes_.has(plane)) {\r\n if(plane.lastChangedTime == timestamp) {\r\n // Handle previously seen plane that was updated in current frame.\r\n this.rawPlaneUpdated(plane, planePose);\r\n } else {\r\n // Handle previously seen plane that was not updated in current frame.\r\n // Depending on the application, this could be a no-op.\r\n this.rawPlaneNotUpdated(plane, planePose);\r\n }\r\n } else {\r\n // Handle new plane.\r\n this.rawPlaneCreated(plane, planePose);\r\n }\r\n });\r\n \r\n this.rawPlanes_ = world.detectedPlanes;\r\n },\r\n\r\n takeOverCamera: function (camera) {\r\n this.arCamera = camera;\r\n camera.isARPerspectiveCamera = true; // HACK - is this necessary?\r\n camera.vrDisplay = this.arDisplay; // HACK - is this necessary?\r\n camera.el.setAttribute('ar-camera', 'enabled', true);\r\n },\r\n\r\n onceSceneLoaded: function () {\r\n var self = this;\r\n window.addEventListener('ardisplayconnect', function () {\r\n if (!self.arDisplay) { self.checkForARDisplay(); }\r\n });\r\n\r\n // Check now for AR display.\r\n this.checkForARDisplay();\r\n },\r\n\r\n checkForARDisplay: function () {\r\n // check to see if webxr ar mode is supported\r\n if (!navigator.xr || !navigator.xr.isSessionSupported) { return; }\r\n\r\n var self = this;\r\n self.arDisplay = {type: 'webxr-ar'};\r\n\r\n navigator.xr.isSessionSupported('immersive-ar').then(function(supported) {\r\n if (supported) {\r\n let ourRequiredFeatures = ['local-floor'];\r\n let ourOptionalFeatures = [];\r\n (self.data.worldSensing ? ourRequiredFeatures : ourOptionalFeatures).push('hit-test');\r\n let existingFeatures = self.el.sceneEl.getAttribute('webxr');\r\n if (!existingFeatures) {\r\n // here, we assume we can set as map and not String (?) \r\n self.el.sceneEl.setAttribute('webxr', { \r\n requiredFeatures: ourRequiredFeatures.join(','), \r\n optionalFeatures: ourOptionalFeatures.join(',') \r\n });\r\n } else {\r\n // here, we assume we get and set as map and not String (?)\r\n // remove existing optional features from our optional\r\n existingFeatures.optionalFeatures.forEach(function (feature) {\r\n ourOptionalFeatures = ourOptionalFeatures.filter(function(value, index, arr){ return value != feature;});\r\n });\r\n // remove existing required features from our required\r\n existingFeatures.requiredFeatures.forEach(function (feature) {\r\n ourRequiredFeatures = ourRequiredFeatures.filter(function(value, index, arr){ return value != feature;});\r\n });\r\n // remove our required features from existing optional\r\n ourRequiredFeatures.forEach(function (feature) {\r\n existingFeatures.optionalFeatures = existingFeatures.optionalFeatures.filter(function(value, index, arr){ return value != feature;});\r\n });\r\n // add our required and optional features to the existing\r\n existingFeatures.requiredFeatures = existingFeatures.requiredFeatures.concat(ourRequiredFeatures);\r\n existingFeatures.optionalFeatures = existingFeatures.optionalFeatures.concat(ourOptionalFeatures);\r\n\r\n self.el.sceneEl.setAttribute('webxr', existingFeatures);\r\n }\r\n\r\n self.el.sceneEl.setAttribute('vr-mode-ui', \"enabled\", \"true\");\r\n // auto-entering AR doesn't work.\r\n\r\n self.xrHitTestSource = null;\r\n self.viewerSpace = null;\r\n self.refSpace = null;\r\n\r\n self.el.sceneEl.renderer.xr.addEventListener('sessionend', (ev) => {\r\n self.viewerSpace = null;\r\n self.refSpace = null;\r\n self.xrHitTestSource = null;\r\n });\r\n self.el.sceneEl.renderer.xr.addEventListener('sessionstart', (ev) => {\r\n let session = self.el.sceneEl.renderer.xr.getSession();\r\n let el = self.el.sceneEl.canvas;\r\n\r\n session.addEventListener('selectstart', function (e) {\r\n // dispatch touchstart\r\n var pageX = e.inputSource.gamepad.axes[0];\r\n var pageY = e.inputSource.gamepad.axes[1];\r\n setTimeout(() => {\r\n var event = new TouchEvent('touchstart', {\r\n view: window,\r\n bubbles: true,\r\n cancelable: true\r\n });\r\n event.targetTouches = [{ pageX: pageX, pageY: pageY }];\r\n el.dispatchEvent(event);\r\n });\r\n });\r\n\r\n session.addEventListener('selectend', function (e) {\r\n // dispatch touchend\r\n var pageX = e.inputSource.gamepad.axes[0];\r\n var pageY = e.inputSource.gamepad.axes[1];\r\n setTimeout(() => {\r\n var event = new TouchEvent('touchend', {\r\n view: window,\r\n bubbles: true,\r\n cancelable: true\r\n });\r\n event.targetTouches = [{ pageX: pageX, pageY: pageY }];\r\n el.dispatchEvent(event);\r\n });\r\n });\r\n\r\n session.addEventListener('select', function (e) {\r\n // dispatch click\r\n var pageX = e.inputSource.gamepad.axes[0];\r\n var pageY = e.inputSource.gamepad.axes[1];\r\n setTimeout(() => {\r\n var event = new MouseEvent('click', { \r\n clientX: pageX, \r\n clientY: pageY, \r\n bubbles: true,\r\n cancelable: true\r\n });\r\n el.dispatchEvent(event);\r\n });\r\n });\r\n\r\n session.requestReferenceSpace('viewer').then((space) => {\r\n self.viewerSpace = space;\r\n if (self.data.worldSensing) {\r\n session.requestHitTestSource({space: self.viewerSpace})\r\n .then((hitTestSource) => {\r\n self.xrHitTestSource = hitTestSource;\r\n })\r\n }\r\n });\r\n\r\n session.requestReferenceSpace('local-floor').then((space) => {\r\n self.refSpace = space;\r\n });\r\n\r\n // Ask for planes, if we should.\r\n if (self.data.worldSensing) {\r\n session.updateWorldTrackingState({planeDetectionState : {enabled : true}});\r\n }\r\n });\r\n }\r\n });\r\n },\r\n\r\n getPosition: function () {\r\n if (!this.arDisplay || !this.arDisplay.getFrameData) { return null; }\r\n return this.posePosition;\r\n },\r\n\r\n getOrientation: function () {\r\n if (!this.arDisplay || !this.arDisplay.getFrameData) { return null; }\r\n return this.poseQuaternion;\r\n },\r\n\r\n getRotation: function () {\r\n if (!this.arDisplay || !this.arDisplay.getFrameData) { return null; }\r\n return this.poseRotation;\r\n },\r\n\r\n getProjectionMatrix: function () {\r\n if (!this.arDisplay || !this.arDisplay.getFrameData) { return null; }\r\n return this.projectionMatrix;\r\n },\r\n\r\n hitAR: (function () { \r\n // Temporary variables, only within closure scope.\r\n var transform = new THREE.Matrix4();\r\n var hitpoint = new THREE.Vector3();\r\n var hitquat = new THREE.Quaternion();\r\n var hitscale = new THREE.Vector3();\r\n var worldpos = new THREE.Vector3();\r\n \r\n // The desired function, which this returns.\r\n return function (x, y, el, raycasterEl) {\r\n if (!this.arDisplay) { return []; }\r\n var hitsToReturn = [];\r\n\r\n if (this.el.sceneEl.is('ar-mode')) {\r\n if (!this.viewerSpace) return;\r\n\r\n let frame = this.el.sceneEl.frame;\r\n let xrViewerPose = frame.getViewerPose(this.refSpace);\r\n\r\n if (this.xrHitTestSource && xrViewerPose) {\r\n let hitTestResults = frame.getHitTestResults(this.xrHitTestSource);\r\n\r\n // Process AR hits.\r\n var hitsToReturn = [];\r\n for (var i = 0; hitTestResults && i < hitTestResults.length; i++) {\r\n let pose = hitTestResults[i].getPose(this.refSpace);\r\n transform.fromArray(pose.transform.matrix);\r\n hitpoint.setFromMatrixPosition(transform); //transform.decompose(hitpoint, hitquat, hitscale);\r\n raycasterEl.object3D.getWorldPosition(worldpos);\r\n\r\n hitsToReturn.push({\r\n distance: hitpoint.distanceTo(worldpos),\r\n point: hitpoint.clone(), // Vector3\r\n object: (el && el.object3D) || this.el.sceneEl.object3D\r\n/*\r\n // We don't have any of these properties...\r\n face: undefined, // Face3\r\n faceIndex: undefined,\r\n index: undefined,\r\n uv: undefined // Vector2\r\n*/\r\n });\r\n }\r\n }\r\n }\r\n\r\n return hitsToReturn;\r\n }\r\n })(),\r\n\r\n // Link to image marker and anchor support.\r\n\r\n addImage: function (name, url, physicalWidth) {\r\n if (!this.arDisplay) { return null; }\r\n\r\n return null;\r\n },\r\n\r\n removeImage: function (name) {\r\n if (!this.arDisplay) { return null; }\r\n\r\n return null;\r\n },\r\n\r\n getAnchors: function () {\r\n return Array.from(this.anchors_.values());\r\n },\r\n\r\n // Use planes to do synchronous hit test.\r\n\r\n getPlanes: function () {\r\n return Array.from(this.planes_.values());\r\n }\r\n});\r\n","/* global AFRAME, THREE */\r\n\r\nfunction convertVertices(vertices) {\r\n var verticesLength = vertices.length;\r\n var newVertices = new Float32Array(verticesLength * 3);\r\n var i = 0;\r\n var j = 0;\r\n var vertex;\r\n for (i = 0; i < verticesLength; i++) {\r\n vertex = vertices[i];\r\n newVertices[j] = vertex.x;\r\n newVertices[j + 1] = vertex.y;\r\n newVertices[j + 2] = vertex.z;\r\n j += 3;\r\n }\r\n return newVertices;\r\n}\r\n\r\n\r\nfunction encode(buffer) {\r\nvar base64 = ''\r\nvar encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\r\n\r\nvar bytes = buffer; // assume it's a typedArrayBuffer \r\n \r\nif (buffer instanceof ArrayBuffer) {\r\nbytes = new Uint8Array(arrayBuffer)\r\n} else if (buffer instanceof ImageData) {\r\nbytes = buffer.data\r\n}\r\n\r\nvar byteLength = buffer.length\r\nvar byteRemainder = byteLength % 3\r\nvar mainLength = byteLength - byteRemainder\r\n\r\nvar a, b, c, d\r\nvar chunk\r\n\r\n// Main loop deals with bytes in chunks of 3\r\nfor (var i = 0; i < mainLength; i = i + 3) {\r\n// Combine the three bytes into a single integer\r\nchunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2]\r\n\r\n// Use bitmasks to extract 6-bit segments from the triplet\r\na = (chunk & 16515072) >> 18 // 16515072 = (2^6 - 1) << 18\r\nb = (chunk & 258048) >> 12 // 258048 = (2^6 - 1) << 12\r\nc = (chunk & 4032) >> 6 // 4032 = (2^6 - 1) << 6\r\nd = chunk & 63 // 63 = 2^6 - 1\r\n\r\n// Convert the raw binary segments to the appropriate ASCII encoding\r\nbase64 += encodings[a] + encodings[b] + encodings[c] + encodings[d]\r\n}\r\n\r\n// Deal with the remaining bytes and padding\r\nif (byteRemainder == 1) {\r\nchunk = bytes[mainLength]\r\n\r\na = (chunk & 252) >> 2 // 252 = (2^6 - 1) << 2\r\n\r\n// Set the 4 least significant bits to zero\r\nb = (chunk & 3) << 4 // 3 = 2^2 - 1\r\n\r\nbase64 += encodings[a] + encodings[b] + '=='\r\n} else if (byteRemainder == 2) {\r\nchunk = (bytes[mainLength] << 8) | bytes[mainLength + 1]\r\n\r\na = (chunk & 64512) >> 10 // 64512 = (2^6 - 1) << 10\r\nb = (chunk & 1008) >> 4 // 1008 = (2^6 - 1) << 4\r\n\r\n// Set the 2 least significant bits to zero\r\nc = (chunk & 15) << 2 // 15 = 2^4 - 1\r\n\r\nbase64 += encodings[a] + encodings[b] + encodings[c] + '='\r\n}\r\n\r\nreturn base64\r\n}\r\n\r\n\r\n\r\nAFRAME.registerComponent('mozilla-xr-ar', {\r\n schema: {\r\n takeOverCamera: {default: true},\r\n cameraUserHeight: {default: false},\r\n worldSensing: {default: true}\r\n },\r\n\r\n init: function () {\r\n this.onInit = this.onInit.bind(this);\r\n this.onWatch = this.onWatch.bind(this);\r\n\r\n this.forceResize = this.forceResize.bind(this);\r\n\r\n this.poseMatrix = new THREE.Matrix4();\r\n this.posePosition = new THREE.Vector3();\r\n this.poseQuaternion = new THREE.Quaternion();\r\n this.poseEuler = new THREE.Euler(0, 0, 0, 'YXZ');\r\n this.poseRotation = new THREE.Vector3();\r\n this.projectionMatrix = new THREE.Matrix4();\r\n this.viewMatrix = new THREE.Matrix4();\r\n\r\n this.onceSceneLoaded = this.onceSceneLoaded.bind(this);\r\n if (this.el.sceneEl.hasLoaded) {\r\n setTimeout(this.onceSceneLoaded);\r\n } else {\r\n this.el.sceneEl.addEventListener('loaded', this.onceSceneLoaded);\r\n }\r\n\r\n // Add planes handling, so we can do synchronous hit test.\r\n // From google-ar/WebARonARKit; also see webxr-polyfill/ARKitWrapper.js\r\n\r\n this.planes_ = new Map();\r\n this.anchors_ = new Map();\r\n },\r\n\r\n // For WebXR Viewer, we are currently directly hooking the callback\r\n // used to provide frame data, so we don't need to do anything in tick!\r\n\r\n takeOverCamera: function (camera) {\r\n this.arCamera = camera;\r\n camera.el.setAttribute('ar-camera', 'enabled', true);\r\n },\r\n\r\n onceSceneLoaded: function () {\r\n // Check if the low-level WebXR Viewer interfaces are there.\r\n if (!window.webkit || !window.webkit.messageHandlers) { return; }\r\n if (!window.webkit.messageHandlers.initAR) { return; }\r\n\r\n // If we are the new version 2.0, don't use this!\r\n if (navigator.userAgent.indexOf('Mobile WebXRViewer/v1.') < 0) {\r\n/*\r\n // FIXME: sure but we do need a wakelock, and camera position is wrong with the new version\r\n // sigh, we do still need the wakelock killer\r\n var scene = this.el.sceneEl;\r\n scene.addEventListener('enter-vr', function (data) {\r\n // Kill broken wakelock, but wait a tick for it to be created!\r\n setTimeout(function () { if (scene.wakelock) { scene.wakelock.release(); }});\r\n });\r\n*/\r\n return;\r\n }\r\n\r\n window['arkitCallback' + 0] = this.onInit;\r\n window['arkitCallback' + 1] = this.onWatch;\r\n\r\n // Compose data to use with initAR.\r\n var data = {\r\n options: {\r\n ui: {\r\n browser: true,\r\n points: true,\r\n focus: false,\r\n rec: true,\r\n rec_time: true,\r\n mic: false,\r\n build: false,\r\n plane: true,\r\n warnings: true,\r\n anchors: false,\r\n debug: true,\r\n statistics: false\r\n }\r\n },\r\n callback: 'arkitCallback0' // this.onInit as window callback\r\n };\r\n\r\n // Need these because WebXR Viewer...\r\n //if (window['setNativeTime']) {\r\n // console.log('window handler already defined for ', 'setNativeTime');\r\n //} else\r\n window['setNativeTime'] = function (data) {\r\n window.nativeTime = data.nativeTime;\r\n };\r\n [\r\n 'arkitStartRecording',\r\n 'arkitStopRecording',\r\n 'arkitDidMoveBackground',\r\n 'arkitWillEnterForeground',\r\n 'arkitInterrupted',\r\n 'arkitInterruptionEnded',\r\n 'arkitShowDebug',\r\n // elsewhere... 'arkitWindowResize',\r\n 'onError',\r\n 'arTrackingChanged',\r\n 'ios_did_receive_memory_warning',\r\n 'onComputerVisionData',\r\n // above... 'setNativeTime',\r\n 'userGrantedComputerVisionData',\r\n 'userGrantedWorldSensingData', // Needed for world sensing.\r\n ].forEach(function (eventName) {\r\n //if (window[eventName]) {\r\n // console.log('window handler already defined for ', eventName);\r\n //} else\r\n window[eventName] = function (data) {\r\n console.log(eventName + ':', data);\r\n };\r\n });\r\n\r\n var self = this;\r\n\r\n self.el.addEventListener('exit-vr', function (data) {\r\n // tell WebXR Viewer to stop\r\n // FIXME: well, no, that's too much, camera tracking stops.\r\n window.webkit.messageHandlers.stopAR.postMessage({});\r\n // release ar-camera\r\n if (self.data.takeOverCamera && self.arCamera) {\r\n self.arCamera.el.setAttribute('ar-camera', 'enabled', false);\r\n }\r\n // turn AR button back on\r\n setTimeout(function () {\r\n var vrmodeui = self.el.sceneEl.components['vr-mode-ui'];\r\n vrmodeui.enterAREl.classList.remove('a-hidden');\r\n });\r\n });\r\n\r\n // act like Chrome WebXR by forcibly showing AR button and making it work\r\n var vrmodeui = this.el.sceneEl.components['vr-mode-ui'];\r\n var newarbutton = vrmodeui.enterAREl.cloneNode(true);\r\n vrmodeui.enterAREl.parentNode.replaceChild(newarbutton, vrmodeui.enterAREl);\r\n vrmodeui.enterAREl = newarbutton;\r\n vrmodeui.enterAREl.classList.remove('a-hidden');\r\n vrmodeui.enterAREl.onclick = function() {\r\n var scene = AFRAME.scenes[0];\r\n\r\n // Note we're in AR mode (the way WebXR handling does).\r\n scene.addState('ar-mode');\r\n\r\n // Kill the Cardboard display that gets in our way.\r\n scene.components['vr-mode-ui'].orientationModalEl.style='display:none!important';\r\n\r\n // Fake VR mode from enterVRSuccess.\r\n scene.addState('vr-mode');\r\n scene.emit('enter-vr', {target: scene});\r\n\r\n // Call initAR.\r\n window.webkit.messageHandlers.initAR.postMessage(data);\r\n \r\n // Kill broken wakelock!\r\n scene.wakelock.release();\r\n\r\n // Take over the scene camera, if so directed.\r\n // But wait a tick, because otherwise injected camera will not be present.\r\n if (self.data.takeOverCamera) {\r\n setTimeout(function () { self.takeOverCamera(scene.camera); });\r\n }\r\n\r\n let sz = new THREE.Vector2();\r\n let pixelRatio = scene.renderer.getPixelRatio();\r\n scene.renderer.getSize(sz);\r\n console.log(\"pixelRatio \", pixelRatio, \" size \", sz);\r\n\r\n // Ugly hack to get around WebXR Viewer resizing issue.\r\n scene.canvas.style.position = \"absolute !important\";\r\n scene.canvas.style.width = \"100% !important\";\r\n scene.canvas.style.height = \"100% !important\";\r\n\r\n // Force resize after we have access to data (?!)\r\n window.userGrantedWorldSensingData = function(data) {\r\n console.log('userGrantedWorldSensingData:', data);\r\n setTimeout(function () {\r\n self.forceResize(\r\n screen.width * window.devicePixelRatio,\r\n screen.height * window.devicePixelRatio);\r\n }, 100); // 1000 seems to be long enough initially\r\n };\r\n };\r\n },\r\n\r\n forceResize: function (sx, sy) {\r\n var sc = this.el.sceneEl, self = this;\r\n console.log('forceResize ', sx, sy,\r\n ' was ', \r\n sc.canvas.width, sc.canvas.height, \r\n screen.width, screen.height,\r\n window.devicePixelRatio, sc.renderer.getPixelRatio());\r\n\r\n var pixelRatio = sc.renderer.getPixelRatio();\r\n var maxSize = sc.maxCanvasSize;\r\n if (sx * pixelRatio > maxSize.width ||\r\n sy * pixelRatio > maxSize.height) {\r\n\r\n console.log('applying maxSize constraints ', maxSize);\r\n\r\n aspectRatio = sx / sy;\r\n\r\n if ((sx * pixelRatio) > maxSize.width && maxSize.width !== -1) {\r\n sx = Math.round(maxSize.width / pixelRatio);\r\n sy = Math.round(maxSize.width / aspectRatio / pixelRatio);\r\n }\r\n\r\n if ((sy * pixelRatio) > maxSize.height && maxSize.height !== -1) {\r\n sy = Math.round(maxSize.height / pixelRatio);\r\n sx = Math.round(maxSize.height * aspectRatio / pixelRatio);\r\n }\r\n\r\n console.log('applied maxSize constraints ', sx, sy, maxSize);\r\n }\r\n\r\n sx = sx || this.forceResizeX; this.forceResizeX = sx;\r\n sy = sy || this.forceResizeY; this.forceResizeY = sy;\r\n sc.canvas.setAttribute('width', sx);\r\n sc.canvas.setAttribute('height', sy);\r\n sc.camera.aspect = sx / sy;\r\n sc.camera.projectionMatrix.copy(self.projectionMatrix);\r\n sc.renderer.setSize(sx, sy, false);\r\n sc.emit('rendererresize', null, false);\r\n },\r\n\r\n checkForARDisplay: function () {\r\n // Check if the low-level WebXR Viewer interfaces are there.\r\n if (!window.webkit || !window.webkit.messageHandlers) { return; }\r\n if (!window.webkit.messageHandlers.watchAR) { return; }\r\n\r\n // If we are the new version 2.0, don't use this!\r\n if (navigator.userAgent.indexOf('Mobile WebXRViewer/v1.') < 0) { return; }\r\n\r\n // Mozilla WebXR Viewer detected.\r\n var self = this;\r\n self.arDisplay = true;\r\n\r\n\r\n // Compose data to use with watchAR.\r\n var data = {\r\n options: {\r\n location: true,\r\n camera: true,\r\n objects: true,\r\n light_intensity: true,\r\n worldSensing: this.data.worldSensing\r\n },\r\n callback: 'arkitCallback1' // this.onWatch as window callback\r\n };\r\n\r\n // Add resize handling.\r\n window['arkitWindowResize'] = function (data) {\r\n console.log('arkitWindowResize' + ':', data);\r\n\r\n // we're faking being in vr-mode anyway so resize will exit.\r\n //window.emit('resize', {target: window});\r\n\r\n // on iOS, AFRAME waits 100ms... \r\n setTimeout(function () {\r\n self.forceResize(\r\n data.width * window.devicePixelRatio,\r\n data.height * window.devicePixelRatio);\r\n }, 150); // 250 seems to be long enough\r\n };\r\n\r\n // Start watching AR.\r\n window.webkit.messageHandlers.watchAR.postMessage(data);\r\n },\r\n\r\n onInit: function (deviceId) {\r\n this.checkForARDisplay();\r\n },\r\n\r\n onWatch: function (data) {\r\n this.frameData = data;\r\n this.handleFrame(data);\r\n },\r\n\r\n handleFrame: function (data) {\r\n // Decompose to get camera pose.\r\n this.poseMatrix.fromArray(data.camera_transform);\r\n this.poseMatrix.decompose(this.posePosition, this.poseQuaternion, this.poseRotation); // poseRotation is really scale, we redo below\r\n this.poseEuler.setFromQuaternion(this.poseQuaternion);\r\n this.poseRotation.set(\r\n THREE.Math.RAD2DEG * this.poseEuler.x,\r\n THREE.Math.RAD2DEG * this.poseEuler.y,\r\n THREE.Math.RAD2DEG * this.poseEuler.z);\r\n\r\n this.projectionMatrix.fromArray(data.projection_camera);\r\n this.viewMatrix.fromArray(data.camera_view);\r\n\r\n // If we control a camera, and should apply user height, do it.\r\n if (this.arCamera && this.data.cameraUserHeight) {\r\n this.posePosition.y += this.arCamera.el.components.camera.data.userHeight;\r\n }\r\n\r\n // For A-Painter, detect bogus pose and fire poseFound / poseLost.\r\n var poseValid = this.posePosition.x || this.posePosition.y || this.posePosition.z || this.poseQuaternion.x || this.poseQuaternion.y || this.poseQuaternion.z;\r\n if (poseValid) {\r\n if (this.poseLost !== false) {\r\n this.poseLost = false;\r\n this.el.emit('poseFound');\r\n }\r\n } else {\r\n if (this.poseLost !== true) {\r\n this.poseLost = true;\r\n this.el.emit('poseLost', false);\r\n }\r\n }\r\n\r\n // Add planes handling, so we can do synchronous hit test.\r\n // From google-ar/WebARonARKit; also see webxr-polyfill/ARKitWrapper.js\r\n\r\n var i;\r\n var element;\r\n\r\n // WebXR Viewer returns geometry.vertices as an array of {x: number, y: number, y: number}\r\n // https://github.com/mozilla-mobile/webxr-ios/blob/c77b12c235e3960e2cd51538e086a38c83d8ec7c/XRViewer/ARKController/ARKController.m#L845\r\n // We transform this to a flatten array of number, like WebARonARCore.\r\n\r\n if(data.newObjects && data.newObjects.length){\r\n for (i = 0; i < data.newObjects.length; i++) {\r\n element = data.newObjects[i];\r\n if(element.plane_center){\r\n this.planes_.set(element.uuid, {\r\n id: element.uuid,\r\n center: element.plane_center,\r\n extent: [element.plane_extent.x, element.plane_extent.z],\r\n modelMatrix: element.transform,\r\n alignment: element.plane_alignment,\r\n vertices: convertVertices(element.geometry.vertices)\r\n });\r\n }else{\r\n var anchorData = {\r\n id: element.uuid,\r\n modelMatrix: element.transform\r\n };\r\n if (element.type === 'image') {\r\n anchorData.name = element.uuid;\r\n }\r\n this.anchors_.set(element.uuid, anchorData);\r\n }\r\n }\r\n }\r\n\r\n if(data.removedObjects && data.removedObjects.length){\r\n for (i = 0; i < data.removedObjects.length; i++) {\r\n element = data.removedObjects[i];\r\n if(this.planes_.get(element)){\r\n this.planes_.delete(element);\r\n }else{\r\n this.anchors_.delete(element);\r\n }\r\n }\r\n }\r\n\r\n if(data.objects && data.objects.length){\r\n for (i = 0; i < data.objects.length; i++) {\r\n element = data.objects[i];\r\n if(element.plane_center){\r\n var plane = this.planes_.get(element.uuid);\r\n if(!plane){\r\n this.planes_.set(element.uuid, {\r\n id: element.uuid,\r\n center: element.plane_center,\r\n extent: [element.plane_extent.x, element.plane_extent.z],\r\n modelMatrix: element.transform,\r\n alignment: element.plane_alignment,\r\n vertices: convertVertices(element.geometry.vertices)\r\n });\r\n } else {\r\n plane.center = element.plane_center;\r\n plane.extent = [element.plane_extent.x, element.plane_extent.z];\r\n plane.modelMatrix = element.transform;\r\n plane.alignment = element.plane_alignment;\r\n plane.vertices = convertVertices(element.geometry.vertices);\r\n }\r\n }else{\r\n var anchor = this.anchors_.get(element.uuid);\r\n if(!anchor){\r\n this.anchors_.set(element.uuid, {\r\n id: element.uuid,\r\n modelMatrix: element.transform\r\n });\r\n }else{\r\n anchor.modelMatrix = element.transform;\r\n }\r\n }\r\n }\r\n }\r\n },\r\n\r\n getPosition: function () {\r\n if (!this.arDisplay) { return null; }\r\n return this.posePosition;\r\n },\r\n\r\n getOrientation: function () {\r\n if (!this.arDisplay) { return null; }\r\n return this.poseQuaternion;\r\n },\r\n\r\n getRotation: function () {\r\n if (!this.arDisplay) { return null; }\r\n return this.poseRotation;\r\n },\r\n\r\n getProjectionMatrix: function () {\r\n if (!this.arDisplay) { return null; }\r\n return this.projectionMatrix;\r\n },\r\n\r\n // Link to new ARKit image marker and anchor support.\r\n\r\n addImage: function (name, url, physicalWidth) {\r\n if (!this.arDisplay) { return null; }\r\n/*\r\nNSDictionary *imageAnchorInfoDictionary = [message body];\r\nNSString *createDetectionImageCallback = [[message body] objectForKey:WEB_AR_CALLBACK_OPTION];\r\n// callback\r\n\r\nCGFloat physicalWidth = [referenceImageDictionary[@\"physicalWidth\"] doubleValue];\r\nNSString* b64String = referenceImageDictionary[@\"buffer\"];\r\nsize_t width = (size_t) [referenceImageDictionary[@\"imageWidth\"] intValue];\r\nsize_t height = (size_t) [referenceImageDictionary[@\"imageHeight\"] intValue];\r\n...\r\nresult.name = referenceImageDictionary[@\"uid\"];\r\n*/\r\n // NOTE: looks like WebXR Viewer won't load from URL,\r\n // so we need to convert from img element\r\n var aCanvas = document.createElement('canvas');\r\n var aContext = aCanvas.getContext('2d');\r\n var aImg; // Don't use element; chance of changed width/height.\r\n if (!aImg) {\r\n aImg = document.createElement('img');\r\n aImg.crossOrigin = 'anonymous';\r\n aImg.src = url;\r\n document.body.appendChild(aImg);\r\n }\r\n\r\n // The image needs to be loaded...\r\n if (!aImg.complete || !aImg.naturalHeight) {\r\n console.log('!!! addImage: !aImg.complete || !aImg.naturalHeight, aborting');\r\n return;\r\n } \r\n \r\n // The image needs to be have nonzero size...\r\n if (!aImg.width || !aImg.height) {\r\n console.log('!!! addImage: !aImg.width || !aImg.height, aborting');\r\n return;\r\n } \r\n\r\n aCanvas.width = aImg.width;\r\n aCanvas.height = aImg.height;\r\n aContext.drawImage(aImg, 0, 0);\r\n var aImageData = aContext.getImageData(0, 0, aImg.width, aImg.height);\r\n var b64ImageData = encode(aImageData.data);\r\n if (!b64ImageData) {\r\n console.log('!!! addImage: !b64ImageData, aborting');\r\n return;\r\n }\r\n\r\n // NOTE: also, WebXR Viewer doesn't pass back which image/name,\r\n // so we need a per-image/name callback\r\n window.callbackForCreateImageAnchorCounter = (window.callbackForCreateImageAnchorCounter || 0) + 1;\r\n var callbackName = 'callbackForCreateImageAnchor_' + window.callbackForCreateImageAnchorCounter;\r\n var imageName = name;\r\n //console.log('creating ', callbackName, ' for ', imageName);\r\n window[callbackName] = function (data) {\r\n //console.log(callbackName);\r\n //console.log(data);\r\n //var name = callbackName.substring(29);\r\n if (data.created !== undefined) {\r\n if (!data.created) {\r\n // we failed to create the image, for whatever reason.\r\n console.log('addImage: !created; ', data.error);\r\n delete window[callbackName];\r\n } else {\r\n //console.log('addImage: created, activating ', imageName);\r\n window.webkit.messageHandlers.activateDetectionImage.postMessage({\r\n callback: callbackName,\r\n uid: imageName\r\n });\r\n }\r\n } else\r\n if (data.activated !== undefined) {\r\n if (!data.activated) {\r\n // we failed to activate the image, for whatever reason.\r\n console.log('addImage: !activated; ', data.error);\r\n } else {\r\n //console.log('addImage: activated ', imageName);\r\n }\r\n delete window[callbackName];\r\n }\r\n };\r\n\r\n window.webkit.messageHandlers.createImageAnchor.postMessage({\r\n callback: callbackName,\r\n uid: name,\r\n buffer: b64ImageData,\r\n imageWidth: aImg.width,\r\n imageHeight: aImg.height,\r\n physicalWidth: physicalWidth // in meters\r\n });\r\n },\r\n\r\n removeImage: function (name) {\r\n if (!this.arDisplay) { return null; }\r\n/*\r\nNSDictionary *imageAnchorInfoDictionary = [message body];\r\nNSString *imageName = imageAnchorInfoDictionary[WEB_AR_DETECTION_IMAGE_NAME_OPTION];\r\n// detectionImageName\r\nNSString *deactivateDetectionImageCallback = [[message body] objectForKey:WEB_AR_CALLBACK_OPTION];\r\n// callback\r\n*/\r\n window.callbackForRemoveImageAnchorCounter = (window.callbackForRemoveImageAnchorCounter || 0) + 1;\r\n var callbackName = 'callbackForRemoveImageAnchor_' + window.callbackForRemoveImageAnchorCounter;\r\n var imageName = name;\r\n //console.log('creating ', callbackName, ' for ', imageName);\r\n window[callbackName] = function (data) {\r\n //console.log(callbackName);\r\n //console.log(data);\r\n\r\n if (data.deactivated !== undefined) {\r\n if (!data.deactivated) {\r\n console.log('!!! ' + callbackName + ': !deactivated', data.error);\r\n delete window[callbackName];\r\n } else {\r\n //console.log(callbackName + ': deactivated, destroying', imageName);\r\n }\r\n window.webkit.messageHandlers.destroyDetectionImage.postMessage({\r\n callback: callbackName,\r\n uid: imageName\r\n });\r\n }\r\n if (data.destroyed !== undefined) {\r\n if (!data.destroyed) {\r\n console.log('!!! ' + callbackName + ': !destroyed, ', data.error);\r\n } else {\r\n //console.log(callbackName + ': destroyed', imageName);\r\n }\r\n delete window[callbackName];\r\n }\r\n };\r\n\r\n window.webkit.messageHandlers.deactivateDetectionImage.postMessage({\r\n callback: callbackName,\r\n uid: imageName\r\n });\r\n },\r\n\r\n getAnchors: function () {\r\n return Array.from(this.anchors_.values());\r\n },\r\n\r\n // Use planes to do synchronous hit test.\r\n // From google-ar/WebARonARKit; also see webxr-polyfill/ARKitWrapper.js\r\n\r\n getPlanes: function () {\r\n return Array.from(this.planes_.values());\r\n },\r\n\r\n hitTestNoAnchor: (function () {\r\n // Temporary variables, only within closure scope.\r\n\r\n /**\r\n * The result of a raycast into the AR world encoded as a transform matrix.\r\n * This structure has a single property - modelMatrix - which encodes the\r\n * translation of the intersection of the hit in the form of a 4x4 matrix.\r\n * @constructor\r\n */\r\n function VRHit() {\r\n this.modelMatrix = new Float32Array(16);\r\n return this;\r\n };\r\n\r\n /**\r\n * Cached vec3, mat4, and quat structures needed for the hit testing to\r\n * avoid generating garbage.\r\n * @type {Object}\r\n */\r\n var hitVars = {\r\n rayStart: new THREE.Vector3(), //vec3.create(),\r\n rayEnd: new THREE.Vector3(), //vec3.create(),\r\n cameraPosition: new THREE.Vector3(), //vec3.create(),\r\n cameraQuaternion: new THREE.Quaternion(), //quat.create(),\t\r\n //modelViewMatrix: new THREE.Matrix4(), //mat4.create(),\r\n //projectionMatrix: new THREE.Matrix4(), //mat4.create(),\r\n projViewMatrix: new THREE.Matrix4(), //mat4.create(),\r\n worldRayStart: new THREE.Vector3(), //vec3.create(),\r\n worldRayEnd: new THREE.Vector3(), //vec3.create(),\r\n worldRayDir: new THREE.Vector3(), //vec3.create(),\r\n planeMatrix: new THREE.Matrix4(), //mat4.create(),\r\n planeMatrixInverse: new THREE.Matrix4(), //mat4.create(),\r\n planeExtent: new THREE.Vector3(), //vec3.create(),\r\n planePosition: new THREE.Vector3(), //vec3.create(),\r\n planeCenter: new THREE.Vector3(), //vec3.create(),\r\n planeNormal: new THREE.Vector3(), //vec3.create(),\r\n planeIntersection: new THREE.Vector3(), //vec3.create(),\r\n planeIntersectionLocal: new THREE.Vector3(), //vec3.create(),\r\n planeHit: new THREE.Matrix4(), //mat4.create()\r\n planeQuaternion: new THREE.Quaternion() // quat.create()\r\n };\r\n \r\n /**\r\n * Tests whether the given ray intersects the given plane.\r\n *\r\n * @param {!vec3} planeNormal The normal of the plane.\r\n * @param {!vec3} planePosition Any point on the plane.\r\n * @param {!vec3} rayOrigin The origin of the ray.\r\n * @param {!vec3} rayDirection The direction of the ray (normalized).\r\n * @return {number} The t-value of the intersection (-1 for none).\r\n */\r\n var rayIntersectsPlane = (function() {\r\n var rayToPlane = new THREE.Vector3();\r\n return function(planeNormal, planePosition, rayOrigin, rayDirection) {\r\n // assuming vectors are all normalized\r\n var denom = planeNormal.dot(rayDirection);\r\n rayToPlane.subVectors(planePosition, rayOrigin);\r\n return rayToPlane.dot(planeNormal) / denom;\r\n };\r\n })();\r\n \r\n /**\r\n * Sorts based on the distance from the VRHits to the camera.\r\n *\r\n * @param {!VRHit} a The first hit to compare.\r\n * @param {!VRHit} b The second hit item to compare.\r\n * @returns {number} -1 if a is closer than b, otherwise 1.\r\n */\r\n var sortFunction = function(a, b) {\r\n // Get the matrix of hit a.\r\n hitVars.planeMatrix.fromArray(a.modelMatrix);\r\n // Get the translation component of a's matrix.\r\n hitVars.planeIntersection.setFromMatrixPosition(hitVars.planeMatrix);\r\n // Get the distance from the intersection point to the camera.\r\n var distA = hitVars.planeIntersection.distanceTo(hitVars.cameraPosition);\r\n \r\n // Get the matrix of hit b.\r\n hitVars.planeMatrix.fromArray(b.modelMatrix);\r\n // Get the translation component of b's matrix.\r\n hitVars.planeIntersection.setFromMatrixPosition(hitVars.planeMatrix);\r\n // Get the distance from the intersection point to the camera.\r\n var distB = hitVars.planeIntersection.distanceTo(hitVars.cameraPosition);\r\n \r\n // Return comparison of distance from camera to a and b.\r\n return distA < distB ? -1 : 1;\r\n };\r\n \r\n return function(x, y) {\r\n // Coordinates must be in normalized screen space.\r\n if (x < 0 || x > 1 || y < 0 || y > 1) {\r\n throw new Error(\r\n \"hitTest - x and y values must be normalized [0,1]!\")\r\n ;\r\n }\r\n \r\n var hits = [];\r\n // If there are no anchors detected, there will be no hits.\r\n var planes = this.getPlanes();\r\n if (!planes || planes.length === 0) {\r\n return hits;\r\n }\r\n\r\n // Create a ray in screen space for the hit test ([-1, 1] with y flip).\r\n hitVars.rayStart.set(2 * x - 1, 2 * (1 - y) - 1, 0);\r\n hitVars.rayEnd.set(2 * x - 1, 2 * (1 - y) - 1, 1);\r\n\r\n // Set the projection matrix.\r\n //hitVars.projectionMatrix.fromArray(this.projectionMatrix);\r\n \r\n // Set the model view matrix.\r\n //hitVars.modelViewMatrix.fromArray(this.viewMatrix);\r\n \r\n // Combine the projection and model view matrices.\r\n hitVars.planeMatrix.multiplyMatrices(\r\n this.projectionMatrix, //hitVars.projectionMatrix,\r\n this.viewMatrix //hitVars.modelViewMatrix\r\n );\r\n // Invert the combined matrix because we need to go from screen -> world.\r\n hitVars.projViewMatrix.getInverse(hitVars.planeMatrix);\r\n \r\n // Transform the screen-space ray start and end to world-space.\r\n hitVars.worldRayStart.copy(hitVars.rayStart)\r\n .applyMatrix4(hitVars.projViewMatrix);\r\n hitVars.worldRayEnd.copy(hitVars.rayEnd)\r\n .applyMatrix4(hitVars.projViewMatrix);\r\n \r\n // Subtract start from end to get the ray direction and then normalize.\r\n hitVars.worldRayDir.subVectors(\r\n hitVars.worldRayEnd,\r\n hitVars.worldRayStart\r\n ).normalize();\r\n\r\n // Go through all the anchors and test for intersections with the ray.\r\n for (var i = 0; i < planes.length; i++) {\r\n var plane = planes[i];\r\n // Get the anchor transform.\r\n hitVars.planeMatrix.fromArray(plane.modelMatrix);\r\n \r\n // Get the position of the anchor in world-space.\r\n hitVars.planeCenter.set(plane.center.x, plane.center.y, plane.center.z);\r\n hitVars.planePosition.copy(hitVars.planeCenter)\r\n .applyMatrix4(hitVars.planeMatrix)\r\n\r\n hitVars.planeAlignment = plane.alignment\r\n \r\n // Get the plane normal.\r\n if (hitVars.planeAlignment === 0) {\r\n hitVars.planeNormal.set(0, 1, 0);\r\n } else {\r\n hitVars.planeNormal.set(hitVars.planeMatrix[4], hitVars.planeMatrix[5], hitVars.planeMatrix[6]);\r\n }\r\n \r\n // Check if the ray intersects the plane.\r\n var t = rayIntersectsPlane(\r\n hitVars.planeNormal,\r\n hitVars.planePosition,\r\n hitVars.worldRayStart,\r\n hitVars.worldRayDir\r\n );\r\n\r\n // if t < 0, there is no intersection.\r\n if (t < 0) {\r\n continue;\r\n }\r\n \r\n // Calculate the actual intersection point.\r\n hitVars.planeIntersectionLocal.copy(hitVars.worldRayDir).multiplyScalar(t);\r\n hitVars.planeIntersection.addVectors(\r\n hitVars.worldRayStart,\r\n hitVars.planeIntersectionLocal\r\n );\r\n // Get the plane extents (extents are in plane local space).\r\n hitVars.planeExtent.set(plane.extent[0], 0, plane.extent[1]);\r\n /*\r\n ///////////////////////////////////////////////\r\n // Test by converting extents to world-space.\r\n // TODO: get this working to avoid matrix inversion in method below.\r\n \r\n // Get the rotation component of the anchor transform.\r\n mat4.getRotation(hitVars.planeQuaternion, hitVars.planeMatrix);\r\n \r\n // Convert the extent into world space.\r\n vec3.transformQuat(\r\n hitVars.planeExtent, hitVars.planeExtent, hitVars.planeQuaternion);\r\n \r\n // Check if intersection is outside of the extent of the anchor.\r\n if (Math.abs(hitVars.planeIntersection[0] - hitVars.planePosition[0]) > hitVars.planeExtent[0] / 2) {\r\n continue;\r\n }\r\n if (Math.abs(hitVars.planeIntersection[2] - hitVars.planePosition[2]) > hitVars.planeExtent[2] / 2) {\r\n continue;\r\n }\r\n ////////////////////////////////////////////////\r\n */\r\n \r\n ////////////////////////////////////////////////\r\n // Test by converting intersection into plane-space.\r\n hitVars.planeMatrixInverse.getInverse(hitVars.planeMatrix);\r\n hitVars.planeIntersectionLocal.copy(hitVars.planeIntersection)\r\n .applyMatrix4(hitVars.planeMatrixInverse);\r\n \r\n // Check if intersection is outside of the extent of the anchor.\r\n // Tolerance is added to match the behavior of the native hitTest call.\r\n var tolerance = 0.0075;\r\n if (\r\n Math.abs(hitVars.planeIntersectionLocal.x) >\r\n hitVars.planeExtent.x / 2 + tolerance\r\n ) {\r\n continue;\r\n }\r\n if (\r\n Math.abs(hitVars.planeIntersectionLocal.z) >\r\n hitVars.planeExtent.z / 2 + tolerance\r\n ) {\r\n continue;\r\n }\r\n \r\n ////////////////////////////////////////////////\r\n \r\n // The intersection is valid - create a matrix from hit position.\r\n hitVars.planeQuaternion.setFromRotationMatrix(hitVars.planeMatrix);\r\n hitVars.planeHit.makeRotationFromQuaternion(hitVars.planeQuaternion).setPosition(hitVars.planeIntersection);\r\n var hit = new VRHit();\r\n for (var j = 0; j < 16; j++) {\r\n hit.modelMatrix[j] = hitVars.planeHit.elements[j];\r\n }\r\n hit.i = i;\r\n hits.push(hit);\r\n }\r\n \r\n\r\n // Sort the hits by distance.\r\n hits.sort(sortFunction);\r\n return hits;\r\n };\r\n })(),\r\n\r\n hitAR: (function () {\r\n // Temporary variables, only within closure scope.\r\n var transform = new THREE.Matrix4();\r\n var hitpoint = new THREE.Vector3();\r\n var hitquat = new THREE.Quaternion();\r\n var hitscale = new THREE.Vector3();\r\n var worldpos = new THREE.Vector3();\r\n\r\n // The desired function, which this returns.\r\n return function (x, y, el, raycasterEl) {\r\n if (!this.arDisplay) { return []; }\r\n\r\n var hit = this.hitTestNoAnchor(x, y);\r\n\r\n // Process AR hits.\r\n var hitsToReturn = [];\r\n for (var i = 0; hit && i < hit.length; i++) {\r\n transform.fromArray(hit[i].modelMatrix);\r\n transform.decompose(hitpoint, hitquat, hitscale);\r\n raycasterEl.object3D.getWorldPosition(worldpos);\r\n\r\n hitsToReturn.push({\r\n distance: hitpoint.distanceTo(worldpos),\r\n point: hitpoint.clone(), // Vector3\r\n object: (el && el.object3D) || this.el.sceneEl.object3D\r\n/*\r\n // We don't have any of these properties...\r\n face: undefined, // Face3\r\n faceIndex: undefined,\r\n index: undefined,\r\n uv: undefined // Vector2\r\n*/\r\n });\r\n }\r\n return hitsToReturn;\r\n } \r\n })()\r\n});\r\n","/* global AFRAME, THREE */\r\n\r\nAFRAME.registerComponent('ar-planes', {\r\n\r\n getPlaneSource: function () {\r\n var whichar;\r\n if (!this.planeSource) {\r\n whichar = this.el.sceneEl.components['ar'];\r\n if (whichar) {\r\n this.planeSource = whichar.getSource();\r\n }\r\n }\r\n return this.planeSource;\r\n },\r\n\r\n getPlanes: function () {\r\n var planeSource = this.getPlaneSource();\r\n if (!planeSource || !planeSource.getPlanes) return undefined;\r\n return planeSource.getPlanes();\r\n },\r\n\r\n init: function () {\r\n // Remember planes when we see them.\r\n this.planes = {};\r\n this.anchorsAdded = [];\r\n this.anchorsAddedDetail = {type:'added', anchors: this.anchorsAdded};\r\n this.anchorsUpdated = [];\r\n this.anchorsUpdatedDetail = {type:'updated', anchors: this.anchorsUpdated};\r\n this.anchorsRemoved = [];\r\n this.anchorsRemovedDetail = {type:'removed', anchors: this.anchorsRemoved};\r\n },\r\n\r\n tick: (function (t, dt) {\r\n // Create the temporary variables we will reuse, if needed.\r\n var tempScale = new THREE.Vector3(1, 1, 1);\r\n var tempMat4 = new THREE.Matrix4();\r\n var tempPosition = new THREE.Vector3();\r\n var tempQuaternion = new THREE.Quaternion();\r\n\r\n // The actual function, which we return.\r\n return function (t, dt) {\r\n // Get the list of planes.\r\n var planes = this.getPlanes();\r\n if (!planes) { return; }\r\n\r\n // Ideally we would have either events, or separate lists for added / updated / removed.\r\n var addedThese = [];\r\n var updatedThese = [];\r\n var removedThese = [];\r\n\r\n // Because we don't have an indication of added / updated / removed,\r\n // try to keep track ourselves.\r\n var seenThese = {};\r\n var i;\r\n\r\n // Iterate over the available planes.\r\n for (i=0; planes && i 0) {\r\n // Reuse the same event detail to avoid making garbage.\r\n // TODO: Reuse same CustomEvent?\r\n this.anchorsAddedDetail.anchors = addedThese;\r\n this.el.emit('anchorsadded', this.anchorsAddedDetail);\r\n }\r\n\r\n // Replace the old list.\r\n this.anchorsUpdated = updatedThese;\r\n // Emit event if list isn't empty.\r\n if (updatedThese.length > 0) {\r\n // Reuse the same event detail to avoid making garbage.\r\n // TODO: Reuse same CustomEvent?\r\n this.anchorsUpdatedDetail.anchors = updatedThese;\r\n this.el.emit('anchorsupdated', this.anchorsUpdatedDetail);\r\n }\r\n\r\n // Replace the old list.\r\n this.anchorsRemoved = removedThese;\r\n // Emit event if list isn't empty.\r\n if (removedThese.length > 0) {\r\n // Reuse the same event detail to avoid making garbage.\r\n // TODO: Reuse same CustomEvent?\r\n this.anchorsRemovedDetail.anchors = removedThese;\r\n this.el.emit('anchorsremoved', this.anchorsRemovedDetail);\r\n }\r\n }; \r\n })()\r\n});\r\n","/* global AFRAME, THREE */\r\n\r\nAFRAME.registerComponent('ar-anchors', {\r\n\r\n getSource: function () {\r\n var whichar;\r\n if (!this.source) {\r\n whichar = this.el.sceneEl.components['ar'];\r\n if (whichar) {\r\n this.source = whichar.getSource();\r\n }\r\n }\r\n return this.source;\r\n },\r\n\r\n getAnchors: function () {\r\n var source = this.getSource();\r\n if (!source || !source.getAnchors) return undefined;\r\n return source.getAnchors();\r\n }\r\n});\r\n","/* global AFRAME, THREE */\r\n\r\nAFRAME.registerComponent('ar-images', {\r\n\r\n getSource: function () {\r\n var whichar;\r\n if (!this.source) {\r\n whichar = this.el.sceneEl.components['ar'];\r\n if (whichar) {\r\n this.source = whichar.getSource();\r\n }\r\n }\r\n return this.source;\r\n },\r\n\r\n addImage: function (name, url, physicalWidth) {\r\n var source = this.getSource();\r\n if (!source || !source.addImage) return undefined;\r\n return source.addImage(name, url, physicalWidth);\r\n },\r\n\r\n removeImage: function (name) {\r\n var source = this.getSource();\r\n if (!source || !source.removeImage) return undefined;\r\n return source.removeImage(name);\r\n },\r\n\r\n});\r\n","/* global AFRAME */\r\n\r\nAFRAME.registerComponent('ar', {\r\n schema: {\r\n takeOverCamera: {default: true},\r\n cameraUserHeight: {default: false},\r\n worldSensing: {default: true},\r\n hideUI: {default: false}\r\n },\r\n dependencies: ['webxr-ar', 'mozilla-xr-ar', 'ar-planes', 'ar-anchors'],\r\n getSource: function () {\r\n var whichar;\r\n if (!this.source) {\r\n var self = this;\r\n self.dependencies.forEach(function(sys) {\r\n whichar = self.el.sceneEl.components[sys];\r\n if (whichar && whichar.arDisplay) {\r\n self.source = whichar;\r\n }\r\n });\t\r\n }\r\n return this.source;\r\n },\r\n getPlanes: function () {\r\n return this.source ? this.source.getPlanes() : undefined;\r\n },\r\n getAnchors: function () {\r\n return this.source ? this.source.getAnchors() : undefined;\r\n },\r\n addImage: function (name, url, physicalWidth) {\r\n return this.source.addImage(name, url, physicalWidth);\r\n },\r\n removeImage: function (name) {\r\n return this.source.removeImage(name);\r\n },\r\n init: function () {\r\n var options = {\r\n takeOverCamera: this.data.takeOverCamera,\r\n cameraUserHeight: this.data.cameraUserHeight,\r\n worldSensing: this.data.worldSensing\r\n };\r\n\r\n var self = this;\r\n this.dependencies.forEach(function(sys) {\r\n self.el.setAttribute(sys, options);\r\n });\r\n\r\n if (this.data.hideUI) {\r\n this.el.sceneEl.setAttribute('vr-mode-ui', {enabled: false});\r\n }\r\n\r\n // Ensure passthrough is visible, make sure A-Frame styles don't interfere.\r\n document.head.insertAdjacentHTML('beforeend', \r\n '');\r\n }\r\n});\r\n","/* global AFRAME */\r\n\r\nAFRAME.registerComponent('ar-camera', {\r\n schema: {\r\n enabled: {default:true}\r\n },\r\n\r\n init: function () {\r\n var lookControls = this.el.getAttribute('look-controls');\r\n this.wasLookControlsEnabled = lookControls ? lookControls.enabled : false;\r\n },\r\n\r\n update: function (oldData) {\r\n if (!oldData || oldData.enabled !== this.data.enabled) {\r\n // Value changed, so react accordingly.\r\n if (this.data.enabled) {\r\n // Save camera look-controls enabled, and turn off for AR.\r\n var lookControls = this.el.getAttribute('look-controls');\r\n this.wasLookControlsEnabled = lookControls ? lookControls.enabled : false;\r\n if (this.wasLookControlsEnabled) {\r\n this.el.setAttribute('look-controls', 'enabled', false);\r\n }\r\n } else {\r\n // Restore camera look-controls enabled.\r\n if (this.wasLookControlsEnabled) {\r\n this.el.setAttribute('look-controls', 'enabled', true);\r\n }\r\n }\r\n }\r\n },\r\n \r\n tick: function (t, dt) {\r\n if (!this.data.enabled) { return; }\r\n \r\n var whichar = this.checkWhichAR();\r\n if (!whichar) { return; }\r\n \r\n // Apply the pose position via setAttribute,\r\n // so that other A-Frame components can see the values.\r\n var pos = whichar.getPosition();\r\n if (pos) { this.el.setAttribute('position', pos); }\r\n\r\n // Apply the pose rotation via setAttribute,\r\n // so that other A-Frame components can see the values.\r\n var rot = whichar.getRotation();\r\n if (rot) { this.el.setAttribute('rotation', rot); }\r\n\r\n // Apply the projection matrix, if we're not in VR.\r\n if (!this.el.sceneEl.is('vr-mode')) {\r\n var matrix = whichar.getProjectionMatrix();\r\n if (matrix) { this.el.components.camera.camera.projectionMatrix = matrix; }\r\n } \r\n },\r\n \r\n checkWhichAR: function () {\r\n if (!this.whichar) {\r\n var whichar = this.el.sceneEl.components['ar'].getSource();\r\n if (!whichar || !whichar.arDisplay) { return; }\r\n this.whichar = whichar;\r\n }\r\n return this.whichar;\r\n } \r\n});\r\n","/* global AFRAME */\r\n\r\n// ar-raycaster modifies raycaster to append AR hit, if any.\r\n// But note that current AR hit API does not support orientation as input.\r\nAFRAME.registerComponent('ar-raycaster', { \r\n dependencies: ['raycaster'],\r\n \r\n schema: {\r\n x: {default: 0.5},\r\n y: {default: 0.5},\r\n el: {type: 'selector'}\r\n },\r\n \r\n init: function () {\r\n // HACK: monkey-patch raycaster to append AR hit result\r\n this.raycaster = this.el.components['raycaster'].raycaster;\r\n this.raycasterIntersectObjects = this.raycaster.intersectObjects.bind(this.raycaster);\r\n this.raycaster.intersectObjects = this.intersectObjects.bind(this);\r\n },\r\n \r\n update: function (oldData) {\r\n if (!this.data.el) {\r\n // If not given some other element, return hit against the scene.\r\n // HACK: But that means we need its object3D to have an el.\r\n if (!this.el.sceneEl.object3D.el) {\r\n this.el.sceneEl.object3D.el = this.el.sceneEl;\r\n }\r\n }\r\n },\r\n \r\n intersectObjects: function (objects, recursive, rawIntersections) {\r\n // it appears that intersectObjects is now returning in rawIntersections\r\n var results = this.raycasterIntersectObjects(objects, recursive, rawIntersections);\r\n // Tack on AR hit result, if any.\r\n var hitARResults = this.hitAR();\r\n if (hitARResults && hitARResults.length) {\r\n if (rawIntersections) {\r\n hitARResults.forEach((hit) => rawIntersections.push(hit));\r\n results = rawIntersections;\r\n } else {\r\n hitARResults.forEach((hit) => results.push(hit));\r\n }\r\n }\r\n return results;\r\n }, \r\n \r\n hitAR: function () {\r\n var whichar = this.checkWhichAR();\r\n if (!whichar || !whichar.arDisplay) { return []; }\r\n var x = this.data.x;\r\n var y = this.data.y;\r\n if (arguments.length >= 2) {\r\n x = arguments[0];\r\n y = arguments[1];\r\n }\r\n return whichar.hitAR(x, y, this.data.el, this.el);\r\n },\r\n\r\n checkWhichAR: function () {\r\n if (!this.whichar) {\r\n var whichar = this.el.sceneEl.components['ar'];\r\n if (whichar) { whichar = whichar.getSource ? whichar.getSource() : undefined; }\r\n if (!whichar || !whichar.arDisplay) { return; }\r\n this.whichar = whichar;\r\n }\r\n return this.whichar;\r\n } \r\n});\r\n\r\n"],"sourceRoot":""}