From 8dbd174f35197b44f703126011bb53317fe13a74 Mon Sep 17 00:00:00 2001 From: Fernando Serrano Date: Tue, 10 Oct 2017 13:43:28 +0200 Subject: [PATCH] Added input mapping and update aframe --- index.html | 5 +- src/components/gun.js | 16 +- src/components/shoot-controls.js | 50 ----- src/components/weapon.js | 5 +- src/index.js | 1 + src/systems/ablast.js | 23 +++ vendor/aframe-input-mapping-component.min.js | 1 + vendor/aframe-master.min.js | 204 +++++++++---------- 8 files changed, 138 insertions(+), 167 deletions(-) create mode 100644 src/systems/ablast.js create mode 100644 vendor/aframe-input-mapping-component.min.js diff --git a/index.html b/index.html index 3e80496..0e03e6c 100644 --- a/index.html +++ b/index.html @@ -5,9 +5,10 @@ A-Blast - - + + + diff --git a/src/components/gun.js b/src/components/gun.js index de11994..ba7d4be 100644 --- a/src/components/gun.js +++ b/src/components/gun.js @@ -7,7 +7,8 @@ var WEAPONS = require('./weapon'); AFRAME.registerComponent('shoot', { schema: { direction: {type: 'vec3', default: {x: 0, y: -2, z: -1}}, // Event to fire bullet. - on: {default: 'triggerdown'}, // Event to fire bullet. + on: {default: 'shoot'}, // Event to fire bullet. + onFromScreen: {default: 'shootScreen'}, // Event to fire bullet from screen position (touch screens or desktop mouse) spaceKeyEnabled: {default: false}, // Keyboard support. weapon: {default: 'default'} // Weapon definition. }, @@ -21,15 +22,12 @@ AFRAME.registerComponent('shoot', { this.shoot = this.shoot.bind(this); this.weapon = null; + // Add keyboard listener. + if (data.spaceKeyEnabled) { el.sceneEl.addEventListener(data.onFromScreen, this.shoot); } + // Add event listener. - if (data.on) { el.addEventListener(data.on, this.shoot); } + el.sceneEl.addEventListener(data.on, self.shoot); - // Add keyboard listener. - if (data.spaceKeyEnabled) { - window.addEventListener('keydown', function (evt) { - if (evt.code === 'Space' || evt.keyCode === '32') { self.shoot(); } - }); - } /* if (AFRAME.utils.device.isMobile()) { @@ -102,7 +100,7 @@ AFRAME.registerComponent('shoot', { bulletEntity.play(); // Communicate the shoot. - el.emit('shoot', bulletEntity); + el.emit('shot', bulletEntity); // Set cooldown period. this.coolingDown = true; diff --git a/src/components/shoot-controls.js b/src/components/shoot-controls.js index 08d6ab3..7cf0705 100644 --- a/src/components/shoot-controls.js +++ b/src/components/shoot-controls.js @@ -5,56 +5,6 @@ AFRAME.registerComponent('shoot-controls', { hand: { default: 'left' } }, - init: function () { - var self = this; - - this.onButtonChanged = this.onButtonChanged.bind(this); - this.onButtonDown = function (evt) { self.onButtonEvent(evt.detail.id, 'down'); }; - this.onButtonUp = function (evt) { self.onButtonEvent(evt.detail.id, 'up'); }; - }, - - play: function () { - var el = this.el; - el.addEventListener('buttonchanged', this.onButtonChanged); - el.addEventListener('buttondown', this.onButtonDown); - el.addEventListener('buttonup', this.onButtonUp); - }, - - pause: function () { - var el = this.el; - el.removeEventListener('buttonchanged', this.onButtonChanged); - el.removeEventListener('buttondown', this.onButtonDown); - el.removeEventListener('buttonup', this.onButtonUp); - }, - - // buttonId - // 0 - trackpad - // 1 - trigger ( intensity value from 0.5 to 1 ) - // 2 - grip - // 3 - menu ( dispatch but better for menu options ) - // 4 - system ( never dispatched on this layer ) - mapping: { - axis0: 'trackpad', - axis1: 'trackpad', - button0: 'trackpad', - button1: 'trigger', - button2: 'grip', - button3: 'menu', - button4: 'system' - }, - - onButtonChanged: function (evt) { - var buttonName = this.mapping['button' + evt.detail.id]; - if (buttonName !== 'trigger') { return; } - var value = evt.detail.state.value; - this.el.components['weapon'].setTriggerPressure(value); - }, - - onButtonEvent: function (id, evtName) { - var buttonName = this.mapping['button' + id]; - this.el.emit(buttonName + evtName); - }, - update: function () { var data = this.data; var el = this.el; diff --git a/src/components/weapon.js b/src/components/weapon.js index 94e3d0b..c08be35 100644 --- a/src/components/weapon.js +++ b/src/components/weapon.js @@ -12,7 +12,6 @@ var WEAPONS = { } }; - /** * Tracked controls, gun model, firing animation, shooting effects. */ @@ -25,7 +24,6 @@ AFRAME.registerComponent('weapon', { }, updateWeapon: function () { - console.log(this.controllerModel); if (this.controllerModel === 'oculus-touch-controller') { this.model.applyMatrix(new THREE.Matrix4().makeRotationAxis(new THREE.Vector3(1, 0, 0), 0.8)); this.el.setAttribute('shoot', {direction: '0 -0.3 -1'}); @@ -56,7 +54,6 @@ AFRAME.registerComponent('weapon', { this.trigger = null; el.addEventListener('controllerconnected', function (evt) { - console.log(evt); self.controllerModel = evt.detail.name; if (self.model == null) { self.isGamepadConnected = true; @@ -89,7 +86,7 @@ AFRAME.registerComponent('weapon', { }.bind(this)); var self = this; - el.addEventListener('shoot', function (evt) { + el.addEventListener('shot', function (evt) { el.components['json-model'].playAnimation('default'); self.light.components.light.light.intensity = self.lightIntensity; for (var i in self.fires){ diff --git a/src/index.js b/src/index.js index 06fb2ec..c1b331c 100644 --- a/src/index.js +++ b/src/index.js @@ -6,6 +6,7 @@ require('./a-asset-image.js') require('./lib/utils.js'); // Systems. +require('./systems/ablast.js'); require('./systems/bullet.js'); require('./systems/enemy.js'); require('./systems/explosion.js'); diff --git a/src/systems/ablast.js b/src/systems/ablast.js new file mode 100644 index 0000000..7fa8fe5 --- /dev/null +++ b/src/systems/ablast.js @@ -0,0 +1,23 @@ +AFRAME.registerSystem('a-blast', { + schema: {}, + + init: function () { + var mappings = { + default: { + 'vive-controls': { + triggerdown: 'shoot' + }, + 'oculus-touch-controls': { + triggerdown: 'shoot' + }, + 'windows-motion-controls': { + triggerdown: 'shoot' + }, + keyboard: { + 'space_down': 'shootScreen' + } + } + }; + AFRAME.registerInputMappings(mappings); + } +}); diff --git a/vendor/aframe-input-mapping-component.min.js b/vendor/aframe-input-mapping-component.min.js new file mode 100644 index 0000000..11d12a8 --- /dev/null +++ b/vendor/aframe-input-mapping-component.min.js @@ -0,0 +1 @@ +!function(e){function n(t){if(r[t])return r[t].exports;var i=r[t]={exports:{},id:t,loaded:!1};return e[t].call(i.exports,i,i.exports,n),i.loaded=!0,i.exports}var r={};return n.m=e,n.c=r,n.p="",n(0)}([function(e,n){if("undefined"==typeof AFRAME)throw new Error("Component attempted to register before AFRAME was available.");AFRAME.inputMappings={},AFRAME.registerSystem("input-mapping",{schema:{},mappings:{},mappingsPerControllers:{},currentMapping:"default",_handlers:{},multiple:!1,init:function(){var e=this;this.keyboardHandler=this.keyboardHandler.bind(this),this.sceneEl.addEventListener("inputmappingregistered",function(){}),this.sceneEl.addEventListener("controllerconnected",function(n){if(!AFRAME.inputMappings)return void console.warn("controller-mapping: No mappings defined");for(var r in AFRAME.inputMappings){var t=AFRAME.inputMappings[r],i=n.detail.name;e.mappingsPerControllers[i]||(e.mappingsPerControllers[i]={});var a=e.mappingsPerControllers[i],p=t[i];if(!p)return void console.warn("controller-mapping: No mappings defined for controller type: ",i);for(var s in p)t=p[s],a[s]||(a[s]={}),a[s][r]=t}e.removeControllersListeners();for(var s in a){var o=i+"->"+s;if(!e._handlers[o]){var l=function(r){var t=a[r.type],i=t[e.currentMapping]?t[e.currentMapping]:t.default;i&&n.detail.target.emit(i,r.detail)};n.detail.target.addEventListener(s,l),e._handlers[o]=l}}}),document.addEventListener("keyup",this.keyboardHandler),document.addEventListener("keydown",this.keyboardHandler),document.addEventListener("keypress",this.keyboardHandler)},getActiveMapping:function(){return this.currentMapping},setActiveMapping:function(e){AFRAME.inputMappings[e]?this.currentMapping=e:console.warn("aframe-input-mapping-component: Trying to activate a mapping that doesn't exist:",e)},keyboardHandler:function(e){var n=AFRAME.inputMappings[this.currentMapping];if(n&&n.keyboard){n=n.keyboard;var r=32===e.keyCode?"space":e.key,t=n[r+"_"+e.type.substr(3)];t&&this.sceneEl.emit(t)}},removeControllersListeners:function(){for(var e in this.mappingsPerControllers){var n=this.mappingsPerControllers[e];for(var r in n){var t=e+"->"+r;this.sceneEl.removeEventListener(r,this._handlers[t])}}this._handlers={},this.mappingsPerControllers={}}}),AFRAME.registerInputMappings=function(e,n){if(n||0===Object.keys(AFRAME.inputMappings).length)AFRAME.inputMappings=e;else for(var r in e){var t=e[r];if(AFRAME.inputMappings[r])for(var i in t){var a=t[i];if(AFRAME.inputMappings[r][i])for(var p in a)AFRAME.inputMappings[r][i][p]=a[p];else AFRAME.inputMappings[r][i]=a}else AFRAME.inputMappings[r]=t}for(var s=0;s dist/aframe-master.js","dist:min":"npm run browserify -s -- --debug -p [minifyify --map aframe-master.min.js.map --output dist/aframe-master.min.js.map] -o dist/aframe-master.min.js","docs":"markserv --dir docs --port 9001","preghpages":"node ./scripts/preghpages.js","ghpages":"ghpages -p gh-pages/","lint":"semistandard -v | snazzy","lint:fix":"semistandard --fix","precommit":"npm run lint","prerelease":"node scripts/release.js 0.6.0 0.6.1","start":"npm run dev","test":"karma start ./tests/karma.conf.js","test:docs":"node scripts/docsLint.js","test:firefox":"npm test -- --browsers Firefox","test:chrome":"npm test -- --browsers Chrome","test:node":"mocha --ui tdd tests/node"},"repository":"aframevr/aframe","license":"MIT","dependencies":{"@tweenjs/tween.js":"^16.8.0","browserify-css":"^0.8.2","debug":"ngokevin/debug#noTimestamp","deep-assign":"^2.0.0","document-register-element":"dmarcos/document-register-element#8ccc532b7","envify":"^3.4.1","load-bmfont":"^1.2.3","object-assign":"^4.0.1","present":"0.0.6","promise-polyfill":"^3.1.0","style-attr":"^1.0.2","three":"^0.84.0","three-bmfont-text":"^2.1.0","webvr-polyfill":"^0.9.36"},"devDependencies":{"browserify":"^13.1.0","browserify-derequire":"^0.9.4","browserify-istanbul":"^2.0.0","budo":"^9.2.0","chai":"^3.5.0","chai-shallow-deep-equal":"^1.4.0","chalk":"^1.1.3","codecov":"^1.0.1","cross-env":"^5.0.1","exorcist":"^0.4.0","ghpages":"0.0.8","git-rev":"^0.2.1","glob":"^7.1.1","husky":"^0.11.7","istanbul":"^0.4.5","jsdom":"^9.11.0","karma":"1.4.1","karma-browserify":"^5.1.0","karma-chai-shallow-deep-equal":"0.0.4","karma-chrome-launcher":"^2.0.0","karma-coverage":"^1.1.1","karma-env-preprocessor":"^0.1.1","karma-firefox-launcher":"^1.0.0","karma-mocha":"^1.1.1","karma-mocha-reporter":"^2.1.0","karma-sinon-chai":"1.2.4","lolex":"^1.5.1","markserv":"0.0.20","minifyify":"^7.3.3","mocha":"^3.0.2","mozilla-download":"^1.1.1","replace-in-file":"^2.5.3","semistandard":"^9.0.0","shelljs":"^0.7.7","shx":"^0.2.2","sinon":"^1.17.5","sinon-chai":"2.8.0","snazzy":"^5.0.0","too-wordy":"ngokevin/too-wordy","uglifyjs":"^2.4.10","write-good":"^0.9.1"},"link":true,"browserify":{"transform":["browserify-css","envify"]},"semistandard":{"ignore":["build/**","dist/**","examples/**/shaders/*.js","**/vendor/**"]},"keywords":["3d","aframe","cardboard","components","oculus","three","three.js","rift","vive","vr","web-components","webvr"],"browserify-css":{"minify":true},"engines":{"node":">= 4.6.0","npm":"^2.15.9"}} +module.exports={"name":"aframe","version":"0.7.0","description":"A web framework for building virtual reality experiences.","homepage":"https://aframe.io/","main":"dist/aframe-master.js","scripts":{"browserify":"browserify src/index.js -s 'AFRAME' -p browserify-derequire","build":"shx mkdir -p build/ && npm run browserify -- --debug -t [envify --INSPECTOR_VERSION dev] -o build/aframe.js","codecov":"codecov","dev":"npm run build && cross-env INSPECTOR_VERSION=dev node ./scripts/budo -t envify","dist":"node scripts/updateVersionLog.js && npm run dist:min && npm run dist:max","dist:max":"npm run browserify -s -- --debug | exorcist dist/aframe-master.js.map > dist/aframe-master.js","dist:min":"npm run browserify -s -- --debug -p [minifyify --map aframe-master.min.js.map --output dist/aframe-master.min.js.map] -o dist/aframe-master.min.js","docs":"markserv --dir docs --port 9001","preghpages":"node ./scripts/preghpages.js","ghpages":"ghpages -p gh-pages/","lint":"semistandard -v | snazzy","lint:fix":"semistandard --fix","precommit":"npm run lint","prepush":"node scripts/testOnlyCheck.js","prerelease":"node scripts/release.js 0.6.1 0.7.0","start":"npm run dev","test":"karma start ./tests/karma.conf.js","test:docs":"node scripts/docsLint.js","test:firefox":"npm test -- --browsers Firefox","test:chrome":"npm test -- --browsers Chrome","test:node":"mocha --ui tdd tests/node"},"repository":"aframevr/aframe","license":"MIT","dependencies":{"@tweenjs/tween.js":"^16.8.0","browserify-css":"^0.8.2","debug":"ngokevin/debug#noTimestamp","deep-assign":"^2.0.0","document-register-element":"dmarcos/document-register-element#8ccc532b7","envify":"^3.4.1","load-bmfont":"^1.2.3","object-assign":"^4.0.1","present":"0.0.6","promise-polyfill":"^3.1.0","style-attr":"^1.0.2","three":"^0.87.0","three-bmfont-text":"^2.1.0","webvr-polyfill":"^0.9.36"},"devDependencies":{"browserify":"^13.1.0","browserify-derequire":"^0.9.4","browserify-istanbul":"^2.0.0","budo":"^9.2.0","chai":"^3.5.0","chai-shallow-deep-equal":"^1.4.0","chalk":"^1.1.3","codecov":"^1.0.1","cross-env":"^5.0.1","exorcist":"^0.4.0","ghpages":"0.0.8","git-rev":"^0.2.1","glob":"^7.1.1","husky":"^0.11.7","istanbul":"^0.4.5","jsdom":"^9.11.0","karma":"1.4.1","karma-browserify":"^5.1.0","karma-chai-shallow-deep-equal":"0.0.4","karma-chrome-launcher":"^2.0.0","karma-coverage":"^1.1.1","karma-env-preprocessor":"^0.1.1","karma-firefox-launcher":"^1.0.0","karma-mocha":"^1.1.1","karma-mocha-reporter":"^2.1.0","karma-sinon-chai":"1.2.4","lolex":"^1.5.1","markserv":"0.0.20","minifyify":"^7.3.3","mocha":"^3.0.2","mozilla-download":"^1.1.1","replace-in-file":"^2.5.3","semistandard":"^9.0.0","shelljs":"^0.7.7","shx":"^0.2.2","sinon":"^1.17.5","sinon-chai":"2.8.0","snazzy":"^5.0.0","too-wordy":"ngokevin/too-wordy","uglifyjs":"^2.4.10","write-good":"^0.9.1"},"link":true,"browserify":{"transform":["browserify-css","envify"]},"semistandard":{"ignore":["build/**","dist/**","examples/**/shaders/*.js","**/vendor/**"]},"keywords":["3d","aframe","cardboard","components","oculus","three","three.js","rift","vive","vr","web-components","webvr"],"browserify-css":{"minify":true},"engines":{"node":">= 4.6.0","npm":"^2.15.9"}} },{}],78:[function(_dereq_,module,exports){ var registerComponent=_dereq_("../core/component").registerComponent,THREE=_dereq_("../lib/three"),utils=_dereq_("../utils/"),bind=utils.bind,checkHasPositionalTracking=utils.device.checkHasPositionalTracking;module.exports.Component=registerComponent("camera",{schema:{active:{default:!0},far:{default:1e4},fov:{default:80,min:0},near:{default:.005,min:0},userHeight:{default:0,min:0},zoom:{default:1,min:0}},init:function(){var t,e=this.el,i=e.sceneEl;this.savedPose=null,t=this.camera=new THREE.PerspectiveCamera,e.setObject3D("camera",t),this.onEnterVR=bind(this.onEnterVR,this),this.onExitVR=bind(this.onExitVR,this),i.addEventListener("enter-vr",this.onEnterVR),i.addEventListener("exit-vr",this.onExitVR)},update:function(t){var e=this.el,i=this.data,s=this.camera,a=this.system;this.addHeightOffset(t.userHeight),s.aspect=i.aspect||window.innerWidth/window.innerHeight,s.far=i.far,s.fov=i.fov,s.near=i.near,s.zoom=i.zoom,s.updateProjectionMatrix(),t&&t.active===i.active||(i.active&&a.activeCameraEl!==e?a.setActiveCamera(e):i.active||a.activeCameraEl!==e||a.disableActiveCamera())},remove:function(){var t=this.el.sceneEl;this.el.removeObject3D("camera"),t.removeEventListener("enter-vr",this.onEnterVR),t.removeEventListener("exit-vr",this.onExitVR)},onEnterVR:function(){this.saveCameraPose(),this.removeHeightOffset()},onExitVR:function(){this.restoreCameraPose()},addHeightOffset:function(t){var e,i=this.el,s=this.data.userHeight;t=t||0,e=i.getAttribute("position")||{x:0,y:0,z:0},i.setAttribute("position",{x:e.x,y:e.y-t+s,z:e.z})},removeHeightOffset:function(){var t,e,i=this.el,s=this.data.userHeight;e=void 0!==this.hasPositionalTracking?this.hasPositionalTracking:checkHasPositionalTracking(),s&&e&&(t=i.getAttribute("position")||{x:0,y:0,z:0},i.setAttribute("position",{x:t.x,y:t.y-s,z:t.z}))},saveCameraPose:function(){var t=this.el,e=void 0!==this.hasPositionalTracking?this.hasPositionalTracking:checkHasPositionalTracking();!this.savedPose&&e&&(this.savedPose={position:t.getAttribute("position"),rotation:t.getAttribute("rotation")})},restoreCameraPose:function(){var t=this.el,e=this.savedPose,i=void 0!==this.hasPositionalTracking?this.hasPositionalTracking:checkHasPositionalTracking();e&&i&&(t.setAttribute("position",e.position),t.setAttribute("rotation",e.rotation),this.savedPose=null)}}); -},{"../core/component":126,"../lib/three":174,"../utils/":197}],79:[function(_dereq_,module,exports){ +},{"../core/component":126,"../lib/three":174,"../utils/":196}],79:[function(_dereq_,module,exports){ var registerComponent=_dereq_("../core/component").registerComponent,THREE=_dereq_("../lib/three");module.exports.Component=registerComponent("collada-model",{schema:{type:"asset"},init:function(){this.model=null,this.loader=new THREE.ColladaLoader,this.loader.options.convertUpAxis=!0},update:function(){var e=this,o=this.el,t=this.data;t&&(this.remove(),this.loader.load(t,function(t){e.model=t.scene,o.setObject3D("mesh",e.model),o.emit("model-loaded",{format:"collada",model:e.model})}))},remove:function(){this.model&&this.el.removeObject3D("mesh")}}); },{"../core/component":126,"../lib/three":174}],80:[function(_dereq_,module,exports){ -var registerComponent=_dereq_("../core/component").registerComponent,utils=_dereq_("../utils/"),bind=utils.bind,EVENTS={CLICK:"click",FUSING:"fusing",MOUSEENTER:"mouseenter",MOUSEDOWN:"mousedown",MOUSELEAVE:"mouseleave",MOUSEUP:"mouseup"},STATES={FUSING:"cursor-fusing",HOVERING:"cursor-hovering",HOVERED:"cursor-hovered"};module.exports.Component=registerComponent("cursor",{dependencies:["raycaster"],schema:{downEvents:{default:[]},fuse:{default:utils.device.isMobile()},fuseTimeout:{default:1500,min:0},upEvents:{default:[]},rayOrigin:{default:"entity",oneOf:["mouse","entity"]}},init:function(){var e=this;this.fuseTimeout=void 0,this.cursorDownEl=null,this.intersection=null,this.intersectedEl=null,this.canvasBounds=document.body.getBoundingClientRect(),this.updateCanvasBounds=utils.debounce(function(){e.canvasBounds=e.el.sceneEl.canvas.getBoundingClientRect()},200),this.onCursorDown=bind(this.onCursorDown,this),this.onCursorUp=bind(this.onCursorUp,this),this.onIntersection=bind(this.onIntersection,this),this.onIntersectionCleared=bind(this.onIntersectionCleared,this),this.onMouseMove=bind(this.onMouseMove,this)},update:function(e){this.data.rayOrigin!==e.rayOrigin&&this.updateMouseEventListeners()},play:function(){this.addEventListeners()},pause:function(){this.removeEventListeners()},remove:function(){var e=this.el;e.removeState(STATES.HOVERING),e.removeState(STATES.FUSING),clearTimeout(this.fuseTimeout),this.intersectedEl&&this.intersectedEl.removeState(STATES.HOVERED),this.removeEventListeners()},addEventListeners:function(){var e,t=this.data,n=this.el,s=this;e=n.sceneEl.canvas,e?(e.addEventListener("mousedown",this.onCursorDown),e.addEventListener("mouseup",this.onCursorUp)):n.sceneEl.addEventListener("render-target-loaded",function(){e=n.sceneEl.canvas,e.addEventListener("mousedown",s.onCursorDown),e.addEventListener("mouseup",s.onCursorUp)}),t.downEvents.forEach(function(e){n.addEventListener(e,s.onCursorDown)}),t.upEvents.forEach(function(e){n.addEventListener(e,s.onCursorUp)}),n.addEventListener("raycaster-intersection",this.onIntersection),n.addEventListener("raycaster-intersection-cleared",this.onIntersectionCleared),window.addEventListener("resize",this.updateCanvasBounds)},removeEventListeners:function(){var e,t=this.data,n=this.el,s=this;e=n.sceneEl.canvas,e&&(e.removeEventListener("mousedown",this.onCursorDown),e.removeEventListener("mouseup",this.onCursorUp)),t.downEvents.forEach(function(e){n.removeEventListener(e,s.onCursorDown)}),t.upEvents.forEach(function(e){n.removeEventListener(e,s.onCursorUp)}),n.removeEventListener("raycaster-intersection",this.onIntersection),n.removeEventListener("raycaster-intersection-cleared",this.onIntersectionCleared),window.removeEventListener("mousemove",this.onMouseMove),window.removeEventListener("resize",this.updateCanvasBounds)},updateMouseEventListeners:function(){var e=this.el;window.removeEventListener("mousemove",this.onMouseMove),e.setAttribute("raycaster","useWorldCoordinates",!1),"mouse"===this.data.rayOrigin&&(window.addEventListener("mousemove",this.onMouseMove,!1),e.setAttribute("raycaster","useWorldCoordinates",!0),this.updateCanvasBounds())},onMouseMove:function(){var e=new THREE.Vector2,t=new THREE.Vector3,n=new THREE.Vector3,s={origin:t,direction:n};return function(i){var o=this.el.sceneEl.camera;o.parent.updateMatrixWorld(),o.updateMatrixWorld();var r=this.canvasBounds,u=i.clientX-r.left,a=i.clientY-r.top;e.x=u/r.width*2-1,e.y=2*-(a/r.height)+1,t.setFromMatrixPosition(o.matrixWorld),n.set(e.x,e.y,.5).unproject(o).sub(t).normalize(),this.el.setAttribute("raycaster",s)}}(),onCursorDown:function(e){this.twoWayEmit(EVENTS.MOUSEDOWN),this.cursorDownEl=this.intersectedEl},onCursorUp:function(e){this.twoWayEmit(EVENTS.MOUSEUP),this.cursorDownEl&&this.cursorDownEl!==this.intersectedEl&&this.cursorDownEl.emit(EVENTS.MOUSEUP,{cursorEl:this.el,intersection:null}),!this.data.fuse&&this.intersectedEl&&this.cursorDownEl===this.intersectedEl&&this.twoWayEmit(EVENTS.CLICK),this.cursorDownEl=null},onIntersection:function(e){var t,n,s,i=this,o=this.el,r=this.data;if(t=e.detail.els[0]===o?1:0,s=e.detail.intersections[t],n=e.detail.els[t]){if(this.intersectedEl===n)return void(this.intersection=s);this.intersectedEl&&this.clearCurrentIntersection(),this.intersection=s,this.intersectedEl=n,o.addState(STATES.HOVERING),n.addState(STATES.HOVERED),i.twoWayEmit(EVENTS.MOUSEENTER),0!==r.fuseTimeout&&r.fuse&&(o.addState(STATES.FUSING),this.twoWayEmit(EVENTS.FUSING),this.fuseTimeout=setTimeout(function(){o.removeState(STATES.FUSING),i.twoWayEmit(EVENTS.CLICK)},r.fuseTimeout))}},onIntersectionCleared:function(e){var t=this.el,n=e.detail.el;t!==n&&n===this.intersectedEl&&this.clearCurrentIntersection()},clearCurrentIntersection:function(){var e=this.el;this.intersectedEl.removeState(STATES.HOVERED),e.removeState(STATES.HOVERING),e.removeState(STATES.FUSING),this.twoWayEmit(EVENTS.MOUSELEAVE),this.intersection=null,this.intersectedEl=null,clearTimeout(this.fuseTimeout)},twoWayEmit:function(e){var t=this.el,n=this.intersectedEl,s=this.intersection;t.emit(e,{intersectedEl:n,intersection:s}),n&&n.emit(e,{cursorEl:t,intersection:s})}}); -},{"../core/component":126,"../utils/":197}],81:[function(_dereq_,module,exports){ +var registerComponent=_dereq_("../core/component").registerComponent,utils=_dereq_("../utils/"),bind=utils.bind,EVENTS={CLICK:"click",FUSING:"fusing",MOUSEENTER:"mouseenter",MOUSEDOWN:"mousedown",MOUSELEAVE:"mouseleave",MOUSEUP:"mouseup"},STATES={FUSING:"cursor-fusing",HOVERING:"cursor-hovering",HOVERED:"cursor-hovered"},CANVAS_EVENTS={DOWN:["mousedown","touchstart"],UP:["mouseup","touchend"]};module.exports.Component=registerComponent("cursor",{dependencies:["raycaster"],schema:{downEvents:{default:[]},fuse:{default:utils.device.isMobile()},fuseTimeout:{default:1500,min:0},upEvents:{default:[]},rayOrigin:{default:"entity",oneOf:["mouse","entity"]}},init:function(){var e=this;this.fuseTimeout=void 0,this.cursorDownEl=null,this.intersection=null,this.intersectedEl=null,this.canvasBounds=document.body.getBoundingClientRect(),this.updateCanvasBounds=utils.debounce(function(){e.canvasBounds=e.el.sceneEl.canvas.getBoundingClientRect()},200),this.onCursorDown=bind(this.onCursorDown,this),this.onCursorUp=bind(this.onCursorUp,this),this.onIntersection=bind(this.onIntersection,this),this.onIntersectionCleared=bind(this.onIntersectionCleared,this),this.onMouseMove=bind(this.onMouseMove,this)},update:function(e){this.data.rayOrigin!==e.rayOrigin&&this.updateMouseEventListeners()},play:function(){this.addEventListeners()},pause:function(){this.removeEventListeners()},remove:function(){var e=this.el;e.removeState(STATES.HOVERING),e.removeState(STATES.FUSING),clearTimeout(this.fuseTimeout),this.intersectedEl&&this.intersectedEl.removeState(STATES.HOVERED),this.removeEventListeners()},addEventListeners:function(){function e(){t=i.sceneEl.canvas,CANVAS_EVENTS.DOWN.forEach(function(e){t.addEventListener(e,s.onCursorDown)}),CANVAS_EVENTS.UP.forEach(function(e){t.addEventListener(e,s.onCursorUp)})}var t,n=this.data,i=this.el,s=this;t=i.sceneEl.canvas,t?e():i.sceneEl.addEventListener("render-target-loaded",e),n.downEvents.forEach(function(e){i.addEventListener(e,s.onCursorDown)}),n.upEvents.forEach(function(e){i.addEventListener(e,s.onCursorUp)}),i.addEventListener("raycaster-intersection",this.onIntersection),i.addEventListener("raycaster-intersection-cleared",this.onIntersectionCleared),window.addEventListener("resize",this.updateCanvasBounds)},removeEventListeners:function(){var e,t=this.data,n=this.el,i=this;e=n.sceneEl.canvas,e&&(CANVAS_EVENTS.DOWN.forEach(function(t){e.removeEventListener(t,i.onCursorDown)}),CANVAS_EVENTS.UP.forEach(function(t){e.removeEventListener(t,i.onCursorUp)})),t.downEvents.forEach(function(e){n.removeEventListener(e,i.onCursorDown)}),t.upEvents.forEach(function(e){n.removeEventListener(e,i.onCursorUp)}),n.removeEventListener("raycaster-intersection",this.onIntersection),n.removeEventListener("raycaster-intersection-cleared",this.onIntersectionCleared),window.removeEventListener("mousemove",this.onMouseMove),window.removeEventListener("resize",this.updateCanvasBounds)},updateMouseEventListeners:function(){var e=this.el;window.removeEventListener("mousemove",this.onMouseMove),e.setAttribute("raycaster","useWorldCoordinates",!1),"mouse"===this.data.rayOrigin&&(window.addEventListener("mousemove",this.onMouseMove,!1),e.setAttribute("raycaster","useWorldCoordinates",!0),this.updateCanvasBounds())},onMouseMove:function(){var e=new THREE.Vector2,t=new THREE.Vector3,n=new THREE.Vector3,i={origin:t,direction:n};return function(s){var o=this.el.sceneEl.camera;o.parent.updateMatrixWorld(),o.updateMatrixWorld();var r=this.canvasBounds,u=s.clientX-r.left,a=s.clientY-r.top;e.x=u/r.width*2-1,e.y=2*-(a/r.height)+1,t.setFromMatrixPosition(o.matrixWorld),n.set(e.x,e.y,.5).unproject(o).sub(t).normalize(),this.el.setAttribute("raycaster",i)}}(),onCursorDown:function(e){this.twoWayEmit(EVENTS.MOUSEDOWN),this.cursorDownEl=this.intersectedEl},onCursorUp:function(e){this.twoWayEmit(EVENTS.MOUSEUP),this.cursorDownEl&&this.cursorDownEl!==this.intersectedEl&&this.cursorDownEl.emit(EVENTS.MOUSEUP,{cursorEl:this.el,intersection:null}),!this.data.fuse&&this.intersectedEl&&this.cursorDownEl===this.intersectedEl&&this.twoWayEmit(EVENTS.CLICK),this.cursorDownEl=null},onIntersection:function(e){var t,n,i,s=this,o=this.el,r=this.data;if(t=e.detail.els[0]===o?1:0,i=e.detail.intersections[t],n=e.detail.els[t]){if(this.intersectedEl===n)return void(this.intersection=i);this.intersectedEl&&this.clearCurrentIntersection(),this.intersection=i,this.intersectedEl=n,o.addState(STATES.HOVERING),n.addState(STATES.HOVERED),s.twoWayEmit(EVENTS.MOUSEENTER),0!==r.fuseTimeout&&r.fuse&&(o.addState(STATES.FUSING),this.twoWayEmit(EVENTS.FUSING),this.fuseTimeout=setTimeout(function(){o.removeState(STATES.FUSING),s.twoWayEmit(EVENTS.CLICK)},r.fuseTimeout))}},onIntersectionCleared:function(e){var t=this.el,n=e.detail.el;t!==n&&n===this.intersectedEl&&this.clearCurrentIntersection()},clearCurrentIntersection:function(){var e=this.el;this.intersectedEl.removeState(STATES.HOVERED),e.removeState(STATES.HOVERING),e.removeState(STATES.FUSING),this.twoWayEmit(EVENTS.MOUSELEAVE),this.intersection=null,this.intersectedEl=null,clearTimeout(this.fuseTimeout)},twoWayEmit:function(e){var t=this.el,n=this.intersectedEl,i=this.intersection;t.emit(e,{intersectedEl:n,intersection:i}),n&&n.emit(e,{cursorEl:t,intersection:i})}}); +},{"../core/component":126,"../utils/":196}],81:[function(_dereq_,module,exports){ var registerComponent=_dereq_("../core/component").registerComponent,bind=_dereq_("../utils/bind"),checkControllerPresentAndSetup=_dereq_("../utils/tracked-controls").checkControllerPresentAndSetup,emitIfAxesChanged=_dereq_("../utils/tracked-controls").emitIfAxesChanged,DAYDREAM_CONTROLLER_MODEL_BASE_URL="https://cdn.aframe.io/controllers/google/",DAYDREAM_CONTROLLER_MODEL_OBJ_URL=DAYDREAM_CONTROLLER_MODEL_BASE_URL+"vr_controller_daydream.obj",DAYDREAM_CONTROLLER_MODEL_OBJ_MTL=DAYDREAM_CONTROLLER_MODEL_BASE_URL+"vr_controller_daydream.mtl",GAMEPAD_ID_PREFIX="Daydream Controller";module.exports.Component=registerComponent("daydream-controls",{schema:{hand:{default:""},buttonColor:{type:"color",default:"#000000"},buttonTouchedColor:{type:"color",default:"#777777"},buttonHighlightColor:{type:"color",default:"#FFFFFF"},model:{default:!0},rotationOffset:{default:0},armModel:{default:!0}},mapping:{axes:{trackpad:[0,1]},buttons:["trackpad","menu","system"]},bindMethods:function(){this.onModelLoaded=bind(this.onModelLoaded,this),this.onControllersUpdate=bind(this.onControllersUpdate,this),this.checkIfControllerPresent=bind(this.checkIfControllerPresent,this),this.removeControllersUpdateListener=bind(this.removeControllersUpdateListener,this),this.onAxisMoved=bind(this.onAxisMoved,this),this.onGamepadConnectionEvent=bind(this.onGamepadConnectionEvent,this)},init:function(){var t=this;this.animationActive="pointing",this.onButtonChanged=bind(this.onButtonChanged,this),this.onButtonDown=function(e){t.onButtonEvent(e.detail.id,"down")},this.onButtonUp=function(e){t.onButtonEvent(e.detail.id,"up")},this.onButtonTouchStart=function(e){t.onButtonEvent(e.detail.id,"touchstart")},this.onButtonTouchEnd=function(e){t.onButtonEvent(e.detail.id,"touchend")},this.onAxisMoved=bind(this.onAxisMoved,this),this.controllerPresent=!1,this.everGotGamepadEvent=!1,this.lastControllerCheck=0,this.bindMethods(),this.checkControllerPresentAndSetup=checkControllerPresentAndSetup,this.emitIfAxesChanged=emitIfAxesChanged},addEventListeners:function(){var t=this.el;t.addEventListener("buttonchanged",this.onButtonChanged),t.addEventListener("buttondown",this.onButtonDown),t.addEventListener("buttonup",this.onButtonUp),t.addEventListener("touchstart",this.onButtonTouchStart),t.addEventListener("touchend",this.onButtonTouchEnd),t.addEventListener("model-loaded",this.onModelLoaded),t.addEventListener("axismove",this.onAxisMoved),this.controllerEventsActive=!0},removeEventListeners:function(){var t=this.el;t.removeEventListener("buttonchanged",this.onButtonChanged),t.removeEventListener("buttondown",this.onButtonDown),t.removeEventListener("buttonup",this.onButtonUp),t.removeEventListener("touchstart",this.onButtonTouchStart),t.removeEventListener("touchend",this.onButtonTouchEnd),t.removeEventListener("model-loaded",this.onModelLoaded),t.removeEventListener("axismove",this.onAxisMoved),this.controllerEventsActive=!1},checkIfControllerPresent:function(){this.checkControllerPresentAndSetup(this,GAMEPAD_ID_PREFIX,{hand:this.data.hand})},onGamepadConnectionEvent:function(t){this.everGotGamepadEvent=!0,this.checkIfControllerPresent()},play:function(){this.checkIfControllerPresent(),this.addControllersUpdateListener(),window.addEventListener("gamepadconnected",this.onGamepadConnectionEvent,!1),window.addEventListener("gamepaddisconnected",this.onGamepadConnectionEvent,!1)},pause:function(){this.removeEventListeners(),this.removeControllersUpdateListener(),window.removeEventListener("gamepadconnected",this.onGamepadConnectionEvent,!1),window.removeEventListener("gamepaddisconnected",this.onGamepadConnectionEvent,!1)},injectTrackedControls:function(){var t=this.el,e=this.data;t.setAttribute("tracked-controls",{armModel:e.armModel,hand:e.hand,idPrefix:GAMEPAD_ID_PREFIX,rotationOffset:e.rotationOffset}),this.data.model&&this.el.setAttribute("obj-model",{obj:DAYDREAM_CONTROLLER_MODEL_OBJ_URL,mtl:DAYDREAM_CONTROLLER_MODEL_OBJ_MTL})},addControllersUpdateListener:function(){this.el.sceneEl.addEventListener("controllersupdated",this.onControllersUpdate,!1)},removeControllersUpdateListener:function(){this.el.sceneEl.removeEventListener("controllersupdated",this.onControllersUpdate,!1)},onControllersUpdate:function(){this.everGotGamepadEvent||this.checkIfControllerPresent()},onModelLoaded:function(t){var e,n=t.detail.model;this.data.model&&(e=this.buttonMeshes={},e.menu=n.getObjectByName("AppButton_AppButton_Cylinder.004"),e.system=n.getObjectByName("HomeButton_HomeButton_Cylinder.005"),e.trackpad=n.getObjectByName("TouchPad_TouchPad_Cylinder.003"),n.position.set(0,0,-.04))},onAxisMoved:function(t){this.emitIfAxesChanged(this,this.mapping.axes,t)},onButtonChanged:function(t){var e=this.mapping.buttons[t.detail.id];e&&this.el.emit(e+"changed",t.detail.state)},onButtonEvent:function(t,e){var n,o=this.mapping.buttons[t];if(Array.isArray(o))for(n=0;n20)n.lookAt(t);else{if(o=this.calculateCameraPortalOrientation(),a<.5){if(this.semiSphereEl.getAttribute("visible")===!0)return;h.setAttribute("text","width",1.5),o<=0?(h.setAttribute("position","0 0 0.75"),h.setAttribute("rotation","0 180 0"),this.semiSphereEl.setAttribute("rotation","0 0 0")):(h.setAttribute("position","0 0 -0.75"),h.setAttribute("rotation","0 0 0"),this.semiSphereEl.setAttribute("rotation","0 180 0")),s.getObject3D("mesh").visible=!1,this.semiSphereEl.setAttribute("visible",!0),this.peekCameraPortalOrientation=o}else o<=0?h.setAttribute("rotation","0 180 0"):h.setAttribute("rotation","0 0 0"),h.setAttribute("text","width",5),h.setAttribute("position","0 1.5 0"),s.getObject3D("mesh").visible=!0,this.semiSphereEl.setAttribute("visible",!1),this.peekCameraPortalOrientation=void 0;this.previousQuaternion&&(n.quaternion.copy(this.previousQuaternion),this.previousQuaternion=void 0)}}}}(),hideAll:function(){var e=this.el,t=this.hiddenEls,i=this;t.length>0||e.sceneEl.object3D.traverse(function(r){r&&r.el&&r.el.hasAttribute("link-controls")||r.el&&r!==e.sceneEl.object3D&&r.el!==e&&r.el!==i.sphereEl&&r.el!==e.sceneEl.cameraEl&&r.el.getAttribute("visible")!==!1&&r.el!==i.textEl&&r.el!==i.semiSphereEl&&(r.el.setAttribute("visible",!1),t.push(r.el))})},showAll:function(){this.hiddenEls.forEach(function(e){e.setAttribute("visible",!0)}),this.hiddenEls=[]},calculateCameraPortalOrientation:function(){var e=new THREE.Matrix4,t=new THREE.Vector3,i=new THREE.Vector3(0,0,1),r=new THREE.Vector3(0,0,0);return function(){var o=this.el,a=o.sceneEl.camera;return t.set(0,0,0),i.set(0,0,1),r.set(0,0,0),o.object3D.matrixWorld.extractRotation(e),i.applyMatrix4(e),o.object3D.updateMatrixWorld(),o.object3D.localToWorld(r),a.parent.parent.updateMatrixWorld(),a.parent.updateMatrixWorld(),a.updateMatrixWorld(),a.localToWorld(t),t.sub(r).normalize(),i.normalize(),Math.sign(i.dot(t))}}(),remove:function(){this.removeEventListener()}}),registerShader("portal",{schema:{pano:{type:"map",is:"uniform"},borderEnabled:{default:1,type:"int",is:"uniform"},strokeColor:{default:"white",type:"color",is:"uniform"}},vertexShader:["vec3 portalPosition;","varying vec3 vWorldPosition;","varying float vDistanceToCenter;","varying float vDistance;","void main() {","vDistanceToCenter = clamp(length(position - vec3(0.0, 0.0, 0.0)), 0.0, 1.0);","portalPosition = (modelMatrix * vec4(0.0, 0.0, 0.0, 1.0)).xyz;","vDistance = length(portalPosition - cameraPosition);","vWorldPosition = (modelMatrix * vec4(position, 1.0)).xyz;","gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);","}"].join("\n"),fragmentShader:["#define RECIPROCAL_PI2 0.15915494","uniform sampler2D pano;","uniform vec3 strokeColor;","uniform float borderEnabled;","varying float vDistanceToCenter;","varying float vDistance;","varying vec3 vWorldPosition;","void main() {","vec3 direction = normalize(vWorldPosition - cameraPosition);","vec2 sampleUV;","float borderThickness = clamp(exp(-vDistance / 50.0), 0.6, 0.95);","sampleUV.y = saturate(direction.y * 0.5 + 0.5);","sampleUV.x = atan(direction.z, direction.x) * -RECIPROCAL_PI2 + 0.5;","if (vDistanceToCenter > borderThickness && borderEnabled == 1.0) {","gl_FragColor = vec4(strokeColor, 1.0);","} else {","gl_FragColor = mix(texture2D(pano, sampleUV), vec4(0.93, 0.17, 0.36, 1.0), clamp(pow((vDistance / 15.0), 2.0), 0.0, 1.0));","}","}"].join("\n")}); +var registerComponent=_dereq_("../core/component").registerComponent,registerShader=_dereq_("../core/shader").registerShader,THREE=_dereq_("../lib/three");module.exports.Component=registerComponent("link",{schema:{backgroundColor:{default:"red",type:"color"},borderColor:{default:"white",type:"color"},highlighted:{default:!1},highlightedColor:{default:"#24CAFF",type:"color"},href:{default:""},image:{type:"asset"},on:{default:"click"},peekMode:{default:!1},title:{default:""},titleColor:{default:"white",type:"color"},visualAspectEnabled:{default:!0}},init:function(){this.navigate=this.navigate.bind(this),this.previousQuaternion=void 0,this.hiddenEls=[],this.initVisualAspect()},update:function(e){var t,i,r=this.data,o=this.el;t=r.highlighted?r.highlightedColor:r.backgroundColor,i=r.highlighted?r.highlightedColor:r.borderColor,o.setAttribute("material","backgroundColor",t),o.setAttribute("material","strokeColor",i),r.on!==e.on&&this.updateEventListener(),r.visualAspectEnabled&&void 0!==e.peekMode&&r.peekMode!==e.peekMode&&this.updatePeekMode(),r.image&&e.image!==r.image&&o.setAttribute("material","pano","string"==typeof r.image?r.image:r.image.src)},updatePeekMode:function(){var e=this.el,t=this.sphereEl;this.data.peekMode?(this.hideAll(),e.getObject3D("mesh").visible=!1,t.setAttribute("visible",!0)):(this.showAll(),e.getObject3D("mesh").visible=!0,t.setAttribute("visible",!1))},play:function(){this.updateEventListener()},pause:function(){this.removeEventListener()},updateEventListener:function(){var e=this.el;e.isPlaying&&(this.removeEventListener(),e.addEventListener(this.data.on,this.navigate))},removeEventListener:function(){var e=this.data.on;e&&this.el.removeEventListener(e,this.navigate)},initVisualAspect:function(){var e,t,i,r=this.el;this.data.visualAspectEnabled&&(i=this.textEl=this.textEl||document.createElement("a-entity"),t=this.sphereEl=this.sphereEl||document.createElement("a-entity"),e=this.semiSphereEl=this.semiSphereEl||document.createElement("a-entity"),r.setAttribute("geometry",{primitive:"circle",radius:1,segments:64}),r.setAttribute("material",{shader:"portal",pano:this.data.image,side:"double"}),i.setAttribute("text",{color:this.data.titleColor,align:"center",font:"kelsonsans",value:this.data.title||this.data.href,width:4}),i.setAttribute("position","0 1.5 0"),r.appendChild(i),e.setAttribute("geometry",{primitive:"sphere",radius:1,phiStart:0,segmentsWidth:64,segmentsHeight:64,phiLength:180,thetaStart:0,thetaLength:360}),e.setAttribute("material",{shader:"portal",borderEnabled:0,pano:this.data.image,side:"back"}),e.setAttribute("rotation","0 180 0"),e.setAttribute("position","0 0 0"),e.setAttribute("visible",!1),r.appendChild(e),t.setAttribute("geometry",{primitive:"sphere",radius:10,segmentsWidth:64,segmentsHeight:64}),t.setAttribute("material",{shader:"portal",borderEnabled:0,pano:this.data.image,side:"back"}),t.setAttribute("visible",!1),r.appendChild(t))},navigate:function(){window.location=this.data.href},tick:function(){var e=new THREE.Vector3,t=new THREE.Vector3,i=new THREE.Quaternion,r=new THREE.Vector3;return function(){var o,a,s=this.el,n=s.object3D,l=s.sceneEl.camera,d=this.textEl;if(this.data.visualAspectEnabled)if(n.updateMatrixWorld(),l.parent.updateMatrixWorld(),l.updateMatrixWorld(),n.matrix.decompose(t,i,r),t.setFromMatrixPosition(n.matrixWorld),e.setFromMatrixPosition(l.matrixWorld),a=t.distanceTo(e),this.previousQuaternion=this.previousQuaternion||i.clone(),a>20)n.lookAt(e);else{if(o=this.calculateCameraPortalOrientation(),a<.5){if(this.semiSphereEl.getAttribute("visible")===!0)return;d.setAttribute("text","width",1.5),o<=0?(d.setAttribute("position","0 0 0.75"),d.setAttribute("rotation","0 180 0"),this.semiSphereEl.setAttribute("rotation","0 0 0")):(d.setAttribute("position","0 0 -0.75"),d.setAttribute("rotation","0 0 0"),this.semiSphereEl.setAttribute("rotation","0 180 0")),s.getObject3D("mesh").visible=!1,this.semiSphereEl.setAttribute("visible",!0),this.peekCameraPortalOrientation=o}else o<=0?d.setAttribute("rotation","0 180 0"):d.setAttribute("rotation","0 0 0"),d.setAttribute("text","width",5),d.setAttribute("position","0 1.5 0"),s.getObject3D("mesh").visible=!0,this.semiSphereEl.setAttribute("visible",!1),this.peekCameraPortalOrientation=void 0;this.previousQuaternion&&(n.quaternion.copy(this.previousQuaternion),this.previousQuaternion=void 0)}}}(),hideAll:function(){var e=this.el,t=this.hiddenEls,i=this;t.length>0||e.sceneEl.object3D.traverse(function(r){r&&r.el&&r.el.hasAttribute("link-controls")||r.el&&r!==e.sceneEl.object3D&&r.el!==e&&r.el!==i.sphereEl&&r.el!==e.sceneEl.cameraEl&&r.el.getAttribute("visible")!==!1&&r.el!==i.textEl&&r.el!==i.semiSphereEl&&(r.el.setAttribute("visible",!1),t.push(r.el))})},showAll:function(){this.hiddenEls.forEach(function(e){e.setAttribute("visible",!0)}),this.hiddenEls=[]},calculateCameraPortalOrientation:function(){var e=new THREE.Matrix4,t=new THREE.Vector3,i=new THREE.Vector3(0,0,1),r=new THREE.Vector3(0,0,0);return function(){var o=this.el,a=o.sceneEl.camera;return t.set(0,0,0),i.set(0,0,1),r.set(0,0,0),o.object3D.matrixWorld.extractRotation(e),i.applyMatrix4(e),o.object3D.updateMatrixWorld(),o.object3D.localToWorld(r),a.parent.parent.updateMatrixWorld(),a.parent.updateMatrixWorld(),a.updateMatrixWorld(),a.localToWorld(t),t.sub(r).normalize(),i.normalize(),Math.sign(i.dot(t))}}(),remove:function(){this.removeEventListener()}}),registerShader("portal",{schema:{borderEnabled:{default:1,type:"int",is:"uniform"},backgroundColor:{default:"red",type:"color",is:"uniform"},pano:{type:"map",is:"uniform"},strokeColor:{default:"white",type:"color",is:"uniform"}},vertexShader:["vec3 portalPosition;","varying vec3 vWorldPosition;","varying float vDistanceToCenter;","varying float vDistance;","void main() {","vDistanceToCenter = clamp(length(position - vec3(0.0, 0.0, 0.0)), 0.0, 1.0);","portalPosition = (modelMatrix * vec4(0.0, 0.0, 0.0, 1.0)).xyz;","vDistance = length(portalPosition - cameraPosition);","vWorldPosition = (modelMatrix * vec4(position, 1.0)).xyz;","gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);","}"].join("\n"),fragmentShader:["#define RECIPROCAL_PI2 0.15915494","uniform sampler2D pano;","uniform vec3 strokeColor;","uniform vec3 backgroundColor;","uniform float borderEnabled;","varying float vDistanceToCenter;","varying float vDistance;","varying vec3 vWorldPosition;","void main() {","vec3 direction = normalize(vWorldPosition - cameraPosition);","vec2 sampleUV;","float borderThickness = clamp(exp(-vDistance / 50.0), 0.6, 0.95);","sampleUV.y = saturate(direction.y * 0.5 + 0.5);","sampleUV.x = atan(direction.z, -direction.x) * -RECIPROCAL_PI2 + 0.5;","if (vDistanceToCenter > borderThickness && borderEnabled == 1.0) {","gl_FragColor = vec4(strokeColor, 1.0);","} else {","gl_FragColor = mix(texture2D(pano, sampleUV), vec4(backgroundColor, 1.0), clamp(pow((vDistance / 15.0), 2.0), 0.0, 1.0));","}","}"].join("\n")}); },{"../core/component":126,"../core/shader":135,"../lib/three":174}],91:[function(_dereq_,module,exports){ -function isNullVector(t){return 0===t.x&&0===t.y&&0===t.z}var registerComponent=_dereq_("../core/component").registerComponent,THREE=_dereq_("../lib/three"),bind=_dereq_("../utils/bind"),GRABBING_CLASS="a-grabbing",PI_2=Math.PI/2,radToDeg=THREE.Math.radToDeg;module.exports.Component=registerComponent("look-controls",{dependencies:["position","rotation"],schema:{enabled:{default:!0},hmdEnabled:{default:!0},reverseMouseDrag:{default:!1},standing:{default:!0}},init:function(){var t=this.el.sceneEl;this.previousHMDPosition=new THREE.Vector3,this.hmdQuaternion=new THREE.Quaternion,this.hmdEuler=new THREE.Euler,this.position={},this.rotation={},this.setupMouseControls(),this.setupHMDControls(),this.bindMethods(),t.addEventListener("exit-vr",this.onExitVR)},update:function(t){var e=this.data;e.enabled!==t.enabled&&this.updateGrabCursor(e.enabled),!t||e.hmdEnabled||t.hmdEnabled||(this.pitchObject.rotation.set(0,0,0),this.yawObject.rotation.set(0,0,0))},tick:function(t){var e=this.data;e.enabled&&(this.controls.standing=e.standing,this.controls.update(),this.updateOrientation(),this.updatePosition())},play:function(){this.addEventListeners()},pause:function(){this.removeEventListeners()},remove:function(){this.removeEventListeners()},bindMethods:function(){this.onMouseDown=bind(this.onMouseDown,this),this.onMouseMove=bind(this.onMouseMove,this),this.onMouseUp=bind(this.onMouseUp,this),this.onTouchStart=bind(this.onTouchStart,this),this.onTouchMove=bind(this.onTouchMove,this),this.onTouchEnd=bind(this.onTouchEnd,this),this.onExitVR=bind(this.onExitVR,this)},setupMouseControls:function(){this.mouseDown=!1,this.pitchObject=new THREE.Object3D,this.yawObject=new THREE.Object3D,this.yawObject.position.y=10,this.yawObject.add(this.pitchObject)},setupHMDControls:function(){this.dolly=new THREE.Object3D,this.euler=new THREE.Euler,this.controls=new THREE.VRControls(this.dolly),this.controls.userHeight=0},addEventListeners:function(){var t=this.el.sceneEl,e=t.canvas;return e?(e.addEventListener("mousedown",this.onMouseDown,!1),window.addEventListener("mousemove",this.onMouseMove,!1),window.addEventListener("mouseup",this.onMouseUp,!1),e.addEventListener("touchstart",this.onTouchStart),window.addEventListener("touchmove",this.onTouchMove),void window.addEventListener("touchend",this.onTouchEnd)):void t.addEventListener("render-target-loaded",bind(this.addEventListeners,this))},removeEventListeners:function(){var t=this.el.sceneEl,e=t&&t.canvas;e&&(e.removeEventListener("mousedown",this.onMouseDown),e.removeEventListener("mousemove",this.onMouseMove),e.removeEventListener("mouseup",this.onMouseUp),e.removeEventListener("mouseout",this.onMouseUp),e.removeEventListener("touchstart",this.onTouchStart),e.removeEventListener("touchmove",this.onTouchMove),e.removeEventListener("touchend",this.onTouchEnd))},updateOrientation:function(){var t,e,o=this.hmdEuler,n=this.hmdQuaternion,i=this.pitchObject,s=this.yawObject,r=this.el.sceneEl,a=this.rotation;n=n.copy(this.dolly.quaternion),o.setFromQuaternion(n,"YXZ"),r.isMobile?(a.x=radToDeg(o.x)+radToDeg(i.rotation.x),a.y=radToDeg(o.y)+radToDeg(s.rotation.y),a.z=radToDeg(o.z)):r.is("vr-mode")&&!isNullVector(o)&&this.data.hmdEnabled?(a.x=radToDeg(o.x),a.y=radToDeg(o.y),a.z=radToDeg(o.z)):(t=this.el.getAttribute("rotation"),e=this.calculateDeltaRotation(),this.data.reverseMouseDrag?(a.x=t.x-e.x,a.y=t.y-e.y,a.z=t.z):(a.x=t.x+e.x,a.y=t.y+e.y,a.z=t.z)),this.el.setAttribute("rotation",a)},calculateDeltaRotation:function(){var t,e=radToDeg(this.pitchObject.rotation.x),o=radToDeg(this.yawObject.rotation.y);return t={x:e-(this.previousRotationX||0),y:o-(this.previousRotationY||0)},this.previousRotationX=e,this.previousRotationY=o,t},updatePosition:function(){var t=new THREE.Vector3;return function(){var e,o,n=this.el,i=this.position,s=this.previousHMDPosition,r=this.el.sceneEl;r.is("vr-mode")&&(e=this.calculateHMDPosition(),t.copy(e).sub(s),isNullVector(t)||(s.copy(e),o=n.getAttribute("position"),i.x=o.x+t.x,i.y=o.y+t.y,i.z=o.z+t.z,n.setAttribute("position",i)))}}(),calculateHMDPosition:function(){var t=new THREE.Vector3;return function(){return this.dolly.updateMatrix(),t.setFromMatrixPosition(this.dolly.matrix),t}}(),onMouseMove:function(t){var e,o,n=this.pitchObject,i=this.yawObject,s=this.previousMouseEvent;this.mouseDown&&this.data.enabled&&(e=t.movementX||t.mozMovementX,o=t.movementY||t.mozMovementY,void 0!==e&&void 0!==o||(e=t.screenX-s.screenX,o=t.screenY-s.screenY),this.previousMouseEvent=t,i.rotation.y-=.002*e,n.rotation.x-=.002*o,n.rotation.x=Math.max(-PI_2,Math.min(PI_2,n.rotation.x)))},onMouseDown:function(t){this.data.enabled&&0===t.button&&(this.mouseDown=!0,this.previousMouseEvent=t,document.body.classList.add(GRABBING_CLASS))},onMouseUp:function(){this.mouseDown=!1,document.body.classList.remove(GRABBING_CLASS)},onTouchStart:function(t){1===t.touches.length&&(this.touchStart={x:t.touches[0].pageX,y:t.touches[0].pageY},this.touchStarted=!0)},onTouchMove:function(t){var e,o=this.el.sceneEl.canvas,n=this.yawObject;this.touchStarted&&(e=2*Math.PI*(t.touches[0].pageX-this.touchStart.x)/o.clientWidth,n.rotation.y-=.5*e,this.touchStart={x:t.touches[0].pageX,y:t.touches[0].pageY})},onTouchEnd:function(){this.touchStarted=!1},onExitVR:function(){this.previousHMDPosition.set(0,0,0)},updateGrabCursor:function(t){function e(){n.canvas.classList.add("a-grab-cursor")}function o(){n.canvas.classList.remove("a-grab-cursor")}var n=this.el.sceneEl;return n.canvas?t?void e():void o():void(t?n.addEventListener("render-target-loaded",e):n.addEventListener("render-target-loaded",o))}}); -},{"../core/component":126,"../lib/three":174,"../utils/bind":191}],92:[function(_dereq_,module,exports){ -function parseSide(e){switch(e){case"back":return THREE.BackSide;case"double":return THREE.DoubleSide;default:return THREE.FrontSide}}function parseVertexColors(e){switch(e){case"face":return THREE.FaceColors;case"vertex":return THREE.VertexColors;default:return THREE.NoColors}}function disposeMaterial(e,t){e.dispose(),t.unregisterMaterial(e)}var utils=_dereq_("../utils/"),component=_dereq_("../core/component"),THREE=_dereq_("../lib/three"),shader=_dereq_("../core/shader"),error=utils.debug("components:material:error"),registerComponent=component.registerComponent,shaders=shader.shaders,shaderNames=shader.shaderNames;module.exports.Component=registerComponent("material",{schema:{alphaTest:{default:0,min:0,max:1},depthTest:{default:!0},depthWrite:{default:!0},flatShading:{default:!1},npot:{default:!1},offset:{type:"vec2",default:{x:0,y:0}},opacity:{default:1,min:0,max:1},repeat:{type:"vec2",default:{x:1,y:1}},shader:{default:"standard",oneOf:shaderNames},side:{default:"front",oneOf:["front","back","double"]},transparent:{default:!1},vertexColors:{type:"string",default:"none",oneOf:["face","vertex"]},visible:{default:!0}},init:function(){this.material=null},update:function(e){var t=this.data;this.shader&&t.shader===e.shader||this.updateShader(t.shader),this.shader.update(this.data),this.updateMaterial(e)},updateSchema:function(e){var t=e.shader,a=this.data&&this.data.shader,r=t||a,s=shaders[r]&&shaders[r].schema;s||error("Unknown shader schema "+r),a&&t===a||(this.extendSchema(s),this.updateBehavior())},updateBehavior:function(){var e=this.schema,t=this,a=this.el.sceneEl,r={},s=function(e,a){Object.keys(r).forEach(function(t){r[t]=e}),t.shader.update(r)};this.tick=void 0,Object.keys(e).forEach(function(a){"time"===e[a].type&&(t.tick=s,r[a]=!0)}),a&&(this.tick?a.addBehavior(this):a.removeBehavior(this))},updateShader:function(e){var t,a=this.data,r=shaders[e]&&shaders[e].Shader;if(!r)throw new Error("Unknown shader "+e);t=this.shader=new r,t.el=this.el,t.init(a),this.setMaterial(t.material),this.updateSchema(a)},updateMaterial:function(e){var t=this.data,a=this.material;a.alphaTest=t.alphaTest,a.depthTest=t.depthTest!==!1,a.depthWrite=t.depthWrite!==!1,a.opacity=t.opacity,a.shading=t.flatShading?THREE.FlatShading:THREE.SmoothShading,a.side=parseSide(t.side),a.transparent=t.transparent!==!1||t.opacity<1,a.vertexColors=parseVertexColors(t.vertexColors),a.visible=t.visible,!Object.keys(e).length||e.alphaTest===t.alphaTest&&e.side===t.side&&e.vertexColors===t.vertexColors||(a.needsUpdate=!0)},remove:function(){var e=new THREE.MeshBasicMaterial,t=this.material,a=this.el.getObject3D("mesh");a&&(a.material=e),disposeMaterial(t,this.system)},setMaterial:function(e){var t=this.el.getOrCreateObject3D("mesh",THREE.Mesh),a=this.system;this.material&&disposeMaterial(this.material,a),this.material=t.material=e,a.registerMaterial(e)}}); -},{"../core/component":126,"../core/shader":135,"../lib/three":174,"../utils/":197}],93:[function(_dereq_,module,exports){ +function isNullVector(t){return 0===t.x&&0===t.y&&0===t.z}var registerComponent=_dereq_("../core/component").registerComponent,THREE=_dereq_("../lib/three"),DEFAULT_CAMERA_HEIGHT=_dereq_("../constants").DEFAULT_CAMERA_HEIGHT,bind=_dereq_("../utils/bind"),GRABBING_CLASS="a-grabbing",PI_2=Math.PI/2,radToDeg=THREE.Math.radToDeg;module.exports.Component=registerComponent("look-controls",{dependencies:["position","rotation"],schema:{enabled:{default:!0},touchEnabled:{default:!0},hmdEnabled:{default:!0},reverseMouseDrag:{default:!1},standing:{default:!0}},init:function(){var t=this.el.sceneEl;this.previousHMDPosition=new THREE.Vector3,this.hmdQuaternion=new THREE.Quaternion,this.hmdEuler=new THREE.Euler,this.position=new THREE.Vector3,this.rotation={},this.deltaRotation={},this.setupMouseControls(),this.setupHMDControls(),this.bindMethods(),t.addEventListener("exit-vr",this.onExitVR)},update:function(t){var e=this.data;e.enabled!==t.enabled&&this.updateGrabCursor(e.enabled),!t||e.hmdEnabled||t.hmdEnabled||(this.pitchObject.rotation.set(0,0,0),this.yawObject.rotation.set(0,0,0))},tick:function(t){var e=this.data;e.enabled&&(this.controls.standing=e.standing,this.controls.userHeight=this.getUserHeight(),this.controls.update(),this.updateOrientation(),this.updatePosition())},getUserHeight:function(){var t=this.el;return t.hasAttribute("camera")?t.getAttribute("camera").userHeight:DEFAULT_CAMERA_HEIGHT},play:function(){this.addEventListeners()},pause:function(){this.removeEventListeners()},remove:function(){this.removeEventListeners()},bindMethods:function(){this.onMouseDown=bind(this.onMouseDown,this),this.onMouseMove=bind(this.onMouseMove,this),this.onMouseUp=bind(this.onMouseUp,this),this.onTouchStart=bind(this.onTouchStart,this),this.onTouchMove=bind(this.onTouchMove,this),this.onTouchEnd=bind(this.onTouchEnd,this),this.onExitVR=bind(this.onExitVR,this)},setupMouseControls:function(){this.mouseDown=!1,this.pitchObject=new THREE.Object3D,this.yawObject=new THREE.Object3D,this.yawObject.position.y=10,this.yawObject.add(this.pitchObject)},setupHMDControls:function(){this.dolly=new THREE.Object3D,this.euler=new THREE.Euler,this.controls=new THREE.VRControls(this.dolly),this.controls.userHeight=0},addEventListeners:function(){var t=this.el.sceneEl,e=t.canvas;return e?(e.addEventListener("mousedown",this.onMouseDown,!1),window.addEventListener("mousemove",this.onMouseMove,!1),window.addEventListener("mouseup",this.onMouseUp,!1),e.addEventListener("touchstart",this.onTouchStart),window.addEventListener("touchmove",this.onTouchMove),void window.addEventListener("touchend",this.onTouchEnd)):void t.addEventListener("render-target-loaded",bind(this.addEventListeners,this))},removeEventListeners:function(){var t=this.el.sceneEl,e=t&&t.canvas;e&&(e.removeEventListener("mousedown",this.onMouseDown),e.removeEventListener("mousemove",this.onMouseMove),e.removeEventListener("mouseup",this.onMouseUp),e.removeEventListener("mouseout",this.onMouseUp),e.removeEventListener("touchstart",this.onTouchStart),e.removeEventListener("touchmove",this.onTouchMove),e.removeEventListener("touchend",this.onTouchEnd))},updateOrientation:function(){var t,e=this.deltaRotation,o=this.hmdEuler,i=this.hmdQuaternion,n=this.pitchObject,s=this.yawObject,a=this.el.sceneEl,r=this.rotation;i=i.copy(this.dolly.quaternion),o.setFromQuaternion(i,"YXZ"),a.isMobile?(r.x=radToDeg(o.x)+radToDeg(n.rotation.x),r.y=radToDeg(o.y)+radToDeg(s.rotation.y),r.z=radToDeg(o.z)):a.is("vr-mode")&&!isNullVector(o)&&this.data.hmdEnabled?(r.x=radToDeg(o.x),r.y=radToDeg(o.y),r.z=radToDeg(o.z)):(t=this.el.getAttribute("rotation"),this.calculateDeltaRotation(),this.data.reverseMouseDrag?(r.x=t.x-e.x,r.y=t.y-e.y,r.z=t.z):(r.x=t.x+e.x,r.y=t.y+e.y,r.z=t.z)),this.el.setAttribute("rotation",r)},calculateDeltaRotation:function(){var t=radToDeg(this.pitchObject.rotation.x),e=radToDeg(this.yawObject.rotation.y);return this.deltaRotation.x=t-(this.previousRotationX||0),this.deltaRotation.y=e-(this.previousRotationY||0),this.previousRotationX=t,this.previousRotationY=e,this.deltaRotation},updatePosition:function(){var t,e,o=this.el,i=this.position,n=this.previousHMDPosition,s=this.el.sceneEl;s.is("vr-mode")&&(t=this.calculateHMDPosition(),e=o.getAttribute("position"),i.copy(e).sub(n).add(t),o.setAttribute("position",i),n.copy(t))},calculateHMDPosition:function(){var t=new THREE.Vector3;return function(){return this.dolly.updateMatrix(),t.setFromMatrixPosition(this.dolly.matrix),t}}(),onMouseMove:function(t){var e,o,i=this.pitchObject,n=this.yawObject,s=this.previousMouseEvent;this.mouseDown&&this.data.enabled&&(e=t.movementX||t.mozMovementX,o=t.movementY||t.mozMovementY,void 0!==e&&void 0!==o||(e=t.screenX-s.screenX,o=t.screenY-s.screenY),this.previousMouseEvent=t,n.rotation.y-=.002*e,i.rotation.x-=.002*o,i.rotation.x=Math.max(-PI_2,Math.min(PI_2,i.rotation.x)))},onMouseDown:function(t){this.data.enabled&&0===t.button&&(this.mouseDown=!0,this.previousMouseEvent=t,document.body.classList.add(GRABBING_CLASS))},onMouseUp:function(){this.mouseDown=!1,document.body.classList.remove(GRABBING_CLASS)},onTouchStart:function(t){1===t.touches.length&&this.data.touchEnabled&&(this.touchStart={x:t.touches[0].pageX,y:t.touches[0].pageY},this.touchStarted=!0)},onTouchMove:function(t){var e,o=this.el.sceneEl.canvas,i=this.yawObject;this.touchStarted&&this.data.touchEnabled&&(e=2*Math.PI*(t.touches[0].pageX-this.touchStart.x)/o.clientWidth,i.rotation.y-=.5*e,this.touchStart={x:t.touches[0].pageX,y:t.touches[0].pageY})},onTouchEnd:function(){this.touchStarted=!1},onExitVR:function(){this.previousHMDPosition.set(0,0,0)},updateGrabCursor:function(t){function e(){i.canvas.classList.add("a-grab-cursor")}function o(){i.canvas.classList.remove("a-grab-cursor")}var i=this.el.sceneEl;return i.canvas?t?void e():void o():void(t?i.addEventListener("render-target-loaded",e):i.addEventListener("render-target-loaded",o))}}); +},{"../constants":117,"../core/component":126,"../lib/three":174,"../utils/bind":190}],92:[function(_dereq_,module,exports){ +function parseSide(e){switch(e){case"back":return THREE.BackSide;case"double":return THREE.DoubleSide;default:return THREE.FrontSide}}function parseVertexColors(e){switch(e){case"face":return THREE.FaceColors;case"vertex":return THREE.VertexColors;default:return THREE.NoColors}}function disposeMaterial(e,t){e.dispose(),t.unregisterMaterial(e)}var utils=_dereq_("../utils/"),component=_dereq_("../core/component"),THREE=_dereq_("../lib/three"),shader=_dereq_("../core/shader"),error=utils.debug("components:material:error"),registerComponent=component.registerComponent,shaders=shader.shaders,shaderNames=shader.shaderNames;module.exports.Component=registerComponent("material",{schema:{alphaTest:{default:0,min:0,max:1},depthTest:{default:!0},depthWrite:{default:!0},flatShading:{default:!1},npot:{default:!1},offset:{type:"vec2",default:{x:0,y:0}},opacity:{default:1,min:0,max:1},repeat:{type:"vec2",default:{x:1,y:1}},shader:{default:"standard",oneOf:shaderNames},side:{default:"front",oneOf:["front","back","double"]},transparent:{default:!1},vertexColors:{type:"string",default:"none",oneOf:["face","vertex"]},visible:{default:!0}},init:function(){this.material=null},update:function(e){var t=this.data;this.shader&&t.shader===e.shader||this.updateShader(t.shader),this.shader.update(this.data),this.updateMaterial(e)},updateSchema:function(e){var t=e.shader,a=this.data&&this.data.shader,r=t||a,s=shaders[r]&&shaders[r].schema;s||error("Unknown shader schema "+r),a&&t===a||(this.extendSchema(s),this.updateBehavior())},updateBehavior:function(){var e=this.schema,t=this,a=this.el.sceneEl,r={},s=function(e,a){Object.keys(r).forEach(function(t){r[t]=e}),t.shader.update(r)};this.tick=void 0,Object.keys(e).forEach(function(a){"time"===e[a].type&&(t.tick=s,r[a]=!0)}),a&&(this.tick?a.addBehavior(this):a.removeBehavior(this))},updateShader:function(e){var t,a=this.data,r=shaders[e]&&shaders[e].Shader;if(!r)throw new Error("Unknown shader "+e);t=this.shader=new r,t.el=this.el,t.init(a),this.setMaterial(t.material),this.updateSchema(a)},updateMaterial:function(e){var t=this.data,a=this.material;a.alphaTest=t.alphaTest,a.depthTest=t.depthTest!==!1,a.depthWrite=t.depthWrite!==!1,a.opacity=t.opacity,a.flatShading=t.flatShading,a.side=parseSide(t.side),a.transparent=t.transparent!==!1||t.opacity<1,a.vertexColors=parseVertexColors(t.vertexColors),a.visible=t.visible,!Object.keys(e).length||e.alphaTest===t.alphaTest&&e.side===t.side&&e.vertexColors===t.vertexColors||(a.needsUpdate=!0)},remove:function(){var e=new THREE.MeshBasicMaterial,t=this.material,a=this.el.getObject3D("mesh");a&&(a.material=e),disposeMaterial(t,this.system)},setMaterial:function(e){var t=this.el.getOrCreateObject3D("mesh",THREE.Mesh),a=this.system;this.material&&disposeMaterial(this.material,a),this.material=t.material=e,a.registerMaterial(e)}}); +},{"../core/component":126,"../core/shader":135,"../lib/three":174,"../utils/":196}],93:[function(_dereq_,module,exports){ var debug=_dereq_("../utils/debug"),registerComponent=_dereq_("../core/component").registerComponent,THREE=_dereq_("../lib/three"),warn=debug("components:obj-model:warn");module.exports.Component=registerComponent("obj-model",{schema:{mtl:{type:"model"},obj:{type:"model"}},init:function(){this.model=null,this.objLoader=new THREE.OBJLoader,this.mtlLoader=new THREE.MTLLoader(this.objLoader.manager),this.mtlLoader.crossOrigin=""},update:function(){var e=this.data;e.obj&&(this.remove(),this.loadObj(e.obj,e.mtl))},remove:function(){this.model&&this.el.removeObject3D("mesh")},loadObj:function(e,o){var t=this,r=this.el,a=this.mtlLoader,i=this.objLoader;return o?(r.hasAttribute("material")&&warn("Material component properties are ignored when a .MTL is provided"),a.setTexturePath(o.substr(0,o.lastIndexOf("/")+1)),void a.load(o,function(o){o.preload(),i.setMaterials(o),i.load(e,function(e){t.model=e,r.setObject3D("mesh",e),r.emit("model-loaded",{format:"obj",model:e})})})):void i.load(e,function(e){var o=r.components.material;o&&e.traverse(function(e){e instanceof THREE.Mesh&&(e.material=o.material)}),t.model=e,r.setObject3D("mesh",e),r.emit("model-loaded",{format:"obj",model:e})})}}); -},{"../core/component":126,"../lib/three":174,"../utils/debug":193}],94:[function(_dereq_,module,exports){ -var bind=_dereq_("../utils/bind"),registerComponent=_dereq_("../core/component").registerComponent,controllerUtils=_dereq_("../utils/tracked-controls"),TOUCH_CONTROLLER_MODEL_BASE_URL="https://cdn.aframe.io/controllers/oculus/oculus-touch-controller-",TOUCH_CONTROLLER_MODEL_OBJ_URL_L=TOUCH_CONTROLLER_MODEL_BASE_URL+"left.obj",TOUCH_CONTROLLER_MODEL_OBJ_MTL_L=TOUCH_CONTROLLER_MODEL_BASE_URL+"left.mtl",TOUCH_CONTROLLER_MODEL_OBJ_URL_R=TOUCH_CONTROLLER_MODEL_BASE_URL+"right.obj",TOUCH_CONTROLLER_MODEL_OBJ_MTL_R=TOUCH_CONTROLLER_MODEL_BASE_URL+"right.mtl",GAMEPAD_ID_PREFIX="Oculus Touch",PIVOT_OFFSET={x:0,y:-.015,z:.04};module.exports.Component=registerComponent("oculus-touch-controls",{schema:{hand:{default:"left"},buttonColor:{type:"color",default:"#999"},buttonTouchColor:{type:"color",default:"#8AB"},buttonHighlightColor:{type:"color",default:"#2DF"},model:{default:!0},rotationOffset:{default:0}},mapping:{left:{axes:{thumbstick:[0,1]},buttons:["thumbstick","trigger","grip","xbutton","ybutton","surface"]},right:{axes:{thumbstick:[0,1]},buttons:["thumbstick","trigger","grip","abutton","bbutton","surface"]}},bindMethods:function(){this.onModelLoaded=bind(this.onModelLoaded,this),this.onControllersUpdate=bind(this.onControllersUpdate,this),this.checkIfControllerPresent=bind(this.checkIfControllerPresent,this),this.onAxisMoved=bind(this.onAxisMoved,this)},init:function(){var t=this;this.onButtonChanged=bind(this.onButtonChanged,this),this.onButtonDown=function(e){t.onButtonEvent(e.detail.id,"down")},this.onButtonUp=function(e){t.onButtonEvent(e.detail.id,"up")},this.onButtonTouchStart=function(e){t.onButtonEvent(e.detail.id,"touchstart")},this.onButtonTouchEnd=function(e){t.onButtonEvent(e.detail.id,"touchend")},this.controllerPresent=!1,this.lastControllerCheck=0,this.previousButtonValues={},this.bindMethods(),this.emitIfAxesChanged=controllerUtils.emitIfAxesChanged,this.checkControllerPresentAndSetup=controllerUtils.checkControllerPresentAndSetup},addEventListeners:function(){var t=this.el;t.addEventListener("buttonchanged",this.onButtonChanged),t.addEventListener("buttondown",this.onButtonDown),t.addEventListener("buttonup",this.onButtonUp),t.addEventListener("touchstart",this.onButtonTouchStart),t.addEventListener("touchend",this.onButtonTouchEnd),t.addEventListener("axismove",this.onAxisMoved),t.addEventListener("model-loaded",this.onModelLoaded),this.controllerEventsActive=!0},removeEventListeners:function(){var t=this.el;t.removeEventListener("buttonchanged",this.onButtonChanged),t.removeEventListener("buttondown",this.onButtonDown),t.removeEventListener("buttonup",this.onButtonUp),t.removeEventListener("touchstart",this.onButtonTouchStart),t.removeEventListener("touchend",this.onButtonTouchEnd),t.removeEventListener("axismove",this.onAxisMoved),t.removeEventListener("model-loaded",this.onModelLoaded),this.controllerEventsActive=!1},checkIfControllerPresent:function(){this.checkControllerPresentAndSetup(this,GAMEPAD_ID_PREFIX,{hand:this.data.hand})},play:function(){this.checkIfControllerPresent(),this.addControllersUpdateListener(),window.addEventListener("gamepaddisconnected",this.checkIfControllerPresent,!1)},pause:function(){this.removeEventListeners(),this.removeControllersUpdateListener(),window.removeEventListener("gamepaddisconnected",this.checkIfControllerPresent,!1)},updateControllerModel:function(){var t,e;this.data.model&&("right"===this.data.hand?(t="url("+TOUCH_CONTROLLER_MODEL_OBJ_URL_R+")",e="url("+TOUCH_CONTROLLER_MODEL_OBJ_MTL_R+")"):(t="url("+TOUCH_CONTROLLER_MODEL_OBJ_URL_L+")",e="url("+TOUCH_CONTROLLER_MODEL_OBJ_MTL_L+")"),this.el.setAttribute("obj-model",{obj:t,mtl:e}))},injectTrackedControls:function(){var t=this.data,e="right"===t.hand?-90:90;this.el.setAttribute("tracked-controls",{id:"right"===t.hand?"Oculus Touch (Right)":"Oculus Touch (Left)",controller:0,rotationOffset:t.rotationOffset!==-999?t.rotationOffset:e}),this.updateControllerModel()},addControllersUpdateListener:function(){this.el.sceneEl.addEventListener("controllersupdated",this.onControllersUpdate,!1)},removeControllersUpdateListener:function(){this.el.sceneEl.removeEventListener("controllersupdated",this.onControllersUpdate,!1)},onControllersUpdate:function(){this.checkIfControllerPresent()},onButtonChanged:function(t){var e,o=this.mapping[this.data.hand].buttons[t.detail.id],n=this.buttonMeshes;o&&("trigger"!==o&&"grip"!==o||(e=t.detail.state.value),n&&("trigger"===o&&n.trigger&&(n.trigger.rotation.x=-e*(Math.PI/24)),"grip"===o&&n.grip&&(n.grip.rotation.y=("left"===this.data.hand?-1:1)*e*(Math.PI/60))),this.el.emit(o+"changed",t.detail.state))},onModelLoaded:function(t){var e,o=t.detail.model;if(this.data.model){var n="left"===this.data.hand;e=this.buttonMeshes={},e.grip=o.getObjectByName(n?"buttonHand_oculus-touch-controller-left.004":"buttonHand_oculus-touch-controller-right.005"),e.thumbstick=o.getObjectByName(n?"stick_oculus-touch-controller-left.007":"stick_oculus-touch-controller-right.004"),e.trigger=o.getObjectByName(n?"buttonTrigger_oculus-touch-controller-left.005":"buttonTrigger_oculus-touch-controller-right.006"),e.xbutton=o.getObjectByName("buttonX_oculus-touch-controller-left.002"),e.abutton=o.getObjectByName("buttonA_oculus-touch-controller-right.002"),e.ybutton=o.getObjectByName("buttonY_oculus-touch-controller-left.001"),e.bbutton=o.getObjectByName("buttonB_oculus-touch-controller-right.003"),o.position=PIVOT_OFFSET}},onButtonEvent:function(t,e){var o,n=this.mapping[this.data.hand].buttons[t];if(Array.isArray(n))for(o=0;o")},remove:function(){var e=this.el.object3D.fog;e&&(e.far=0,e.near=.1)}}); -},{"../../core/component":126,"../../lib/three":174,"../../utils/debug":193}],103:[function(_dereq_,module,exports){ +},{"../../core/component":126,"../../lib/three":174,"../../utils/debug":192}],102:[function(_dereq_,module,exports){ (function (process){ function getFuzzyPatchVersion(e){var n=e.split(".");return n[2]="x",n.join(".")}var AFRAME_INJECTED=_dereq_("../../constants").AFRAME_INJECTED,bind=_dereq_("../../utils/bind"),pkg=_dereq_("../../../package"),registerComponent=_dereq_("../../core/component").registerComponent,INSPECTOR_DEV_URL="https://aframe.io/aframe-inspector/dist/aframe-inspector.js",INSPECTOR_RELEASE_URL="https://unpkg.com/aframe-inspector@"+getFuzzyPatchVersion(pkg.version)+"/dist/aframe-inspector.min.js",INSPECTOR_URL="dev"===process.env.INSPECTOR_VERSION?INSPECTOR_DEV_URL:INSPECTOR_RELEASE_URL,LOADING_MESSAGE="Loading Inspector",LOADING_ERROR_MESSAGE="Error loading Inspector";module.exports.Component=registerComponent("inspector",{schema:{url:{default:INSPECTOR_URL}},init:function(){this.onKeydown=bind(this.onKeydown,this),this.onMessage=bind(this.onMessage,this),this.initOverlay(),window.addEventListener("keydown",this.onKeydown),window.addEventListener("message",this.onMessage)},initOverlay:function(){var e='...';this.loadingMessageEl=document.createElement("div"),this.loadingMessageEl.classList.add("a-inspector-loader"),this.loadingMessageEl.innerHTML=LOADING_MESSAGE+e},remove:function(){this.removeEventListeners()},onKeydown:function(e){var n=73===e.keyCode&&e.ctrlKey&&e.altKey;this.data&&n&&this.injectInspector()},showLoader:function(){document.body.appendChild(this.loadingMessageEl)},hideLoader:function(){document.body.removeChild(this.loadingMessageEl)},onMessage:function(e){"INJECT_AFRAME_INSPECTOR"===e.data&&this.injectInspector()},injectInspector:function(){var e,n=this;AFRAME.INSPECTOR||AFRAME.inspectorInjected||(this.showLoader(),e=document.createElement("script"),e.src=this.data.url,e.setAttribute("data-name","aframe-inspector"),e.setAttribute(AFRAME_INJECTED,""),e.onload=function(){AFRAME.INSPECTOR.open(),n.hideLoader(),n.removeEventListeners()},e.onerror=function(){n.loadingMessageEl.innerHTML=LOADING_ERROR_MESSAGE},document.head.appendChild(e),AFRAME.inspectorInjected=!0)},removeEventListeners:function(){window.removeEventListener("keydown",this.onKeydown),window.removeEventListener("message",this.onMessage)}}); }).call(this,_dereq_('_process')) -},{"../../../package":77,"../../constants":117,"../../core/component":126,"../../utils/bind":191,"_process":6}],104:[function(_dereq_,module,exports){ +},{"../../../package":77,"../../constants":117,"../../core/component":126,"../../utils/bind":190,"_process":6}],103:[function(_dereq_,module,exports){ var registerComponent=_dereq_("../../core/component").registerComponent,shouldCaptureKeyEvent=_dereq_("../../utils/").shouldCaptureKeyEvent;module.exports.Component=registerComponent("keyboard-shortcuts",{schema:{enterVR:{default:!0},exitVR:{default:!0}},init:function(){var e=this,t=this.el;this.listener=window.addEventListener("keyup",function(n){shouldCaptureKeyEvent(n)&&(e.enterVREnabled&&70===n.keyCode&&t.enterVR(),e.enterVREnabled&&27===n.keyCode&&t.exitVR())},!1)},update:function(e){var t=this.data;this.enterVREnabled=t.enterVR},remove:function(){window.removeEventListener("keyup",this.listener)}}); -},{"../../core/component":126,"../../utils/":197}],105:[function(_dereq_,module,exports){ +},{"../../core/component":126,"../../utils/":196}],104:[function(_dereq_,module,exports){ var debug=_dereq_("../../utils/debug"),registerComponent=_dereq_("../../core/component").registerComponent,warn=debug("components:pool:warn");module.exports.Component=registerComponent("pool",{schema:{mixin:{default:""},size:{default:0},dynamic:{default:!1}},multiple:!0,initPool:function(){var t,i=this.data.mixin;if(i)for(this.availableEls=[],this.usedEls=[],t=0;t0&&(this.stopSound(),e.removeObject3D("sound"));var o=this.listener=t.audioListener||new THREE.AudioListener;t.audioListener=o,t.camera&&t.camera.add(o),t.addEventListener("camera-set-active",function(e){e.detail.cameraEl.getObject3D("camera").add(o)}),this.pool=new THREE.Group;for(var i=0;i=0&&(t=30),t&&i.chars.map(function(e){e.yoffset+=t}),void r(i))})})}function loadTexture(e){return new Promise(function(t,r){(new THREE.ImageLoader).load(e,function(e){t(e)},void 0,function(){error("Error loading font image",e),r(null)})})}function createShader(e,t,r){var o,n;return n=new shaders[t].Shader,n.el=e,n.init(r),n.update(r),o=n.material,o.transparent=r.transparent,{material:o,shader:n}}function updateBaseMaterial(e,t){e.side=t.side}function computeWidth(e,t,r){return e||(.5+t)*r}function computeFontWidthFactor(e){var t=0,r=0,o=0;return e.chars.map(function(e){t+=e.xadvance,e.id>=48&&e.id<=57&&(o++,r+=e.xadvance)}),o?r/o:t/e.chars.length}function PromiseCache(){var e=this.cache={};this.get=function(t,r){return t in e?e[t]:(e[t]=r(),e[t])}}var createTextGeometry=_dereq_("three-bmfont-text"),loadBMFont=_dereq_("load-bmfont"),path=_dereq_("path"),registerComponent=_dereq_("../core/component").registerComponent,coreShader=_dereq_("../core/shader"),THREE=_dereq_("../lib/three"),utils=_dereq_("../utils/"),error=utils.debug("components:text:error"),shaders=coreShader.shaders,warn=utils.debug("components:text:warn"),DEFAULT_WIDTH=1,MAX_ANISOTROPY=16,FONT_BASE_URL="https://cdn.aframe.io/fonts/",FONTS={aileronsemibold:FONT_BASE_URL+"Aileron-Semibold.fnt",dejavu:FONT_BASE_URL+"DejaVu-sdf.fnt",exo2bold:FONT_BASE_URL+"Exo2Bold.fnt",exo2semibold:FONT_BASE_URL+"Exo2SemiBold.fnt",kelsonsans:FONT_BASE_URL+"KelsonSans.fnt",monoid:FONT_BASE_URL+"Monoid.fnt",mozillavr:FONT_BASE_URL+"mozillavr.fnt",roboto:FONT_BASE_URL+"Roboto-msdf.json",sourcecodepro:FONT_BASE_URL+"SourceCodePro.fnt"},MSDF_FONTS=["roboto"],DEFAULT_FONT="roboto";module.exports.FONTS=FONTS;var cache=new PromiseCache,fontWidthFactors={};module.exports.Component=registerComponent("text",{multiple:!0,schema:{align:{type:"string",default:"left",oneOf:["left","right","center"]},alphaTest:{default:.5},anchor:{default:"center",oneOf:["left","right","center","align"]},baseline:{default:"center",oneOf:["top","center","bottom"]},color:{type:"color",default:"#FFF"},font:{type:"string",default:DEFAULT_FONT},fontImage:{type:"string"},height:{type:"number"},letterSpacing:{type:"number",default:0},lineHeight:{type:"number"},opacity:{type:"number",default:1},shader:{default:"sdf",oneOf:shaders},side:{default:"front",oneOf:["front","back","double"]},tabSize:{default:4},transparent:{default:!0},value:{type:"string"},whiteSpace:{default:"normal",oneOf:["normal","pre","nowrap"]},width:{type:"number"},wrapCount:{type:"number",default:40},wrapPixels:{type:"number"},yOffset:{type:"number",default:0},zOffset:{type:"number",default:.001}},init:function(){this.texture=new THREE.Texture,this.texture.anisotropy=MAX_ANISOTROPY,this.geometry=createTextGeometry(),this.createOrUpdateMaterial(),this.mesh=new THREE.Mesh(this.geometry,this.material),this.el.setObject3D(this.attrName,this.mesh)},update:function(e){var t=coerceData(this.data),r=this.currentFont;return this.createOrUpdateMaterial(),e.font!==t.font?void this.updateFont():void(r&&(this.updateGeometry(this.geometry,t,r),this.updateLayout(t)))},remove:function(){this.geometry.dispose(),this.geometry=null,this.el.removeObject3D(this.attrName),this.material.dispose(),this.material=null,this.texture.dispose(),this.texture=null,this.shaderObject&&delete this.shaderObject},createOrUpdateMaterial:function(){var e,t,r,o,n=this.data,i=this.material;return o=n.shader,MSDF_FONTS.indexOf(n.font)!==-1||n.font.indexOf("-msdf.")>=0?o="msdf":n.font in FONTS&&MSDF_FONTS.indexOf(n.font)===-1&&(o="sdf"),e=(this.shaderObject&&this.shaderObject.name)!==o,r={alphaTest:n.alphaTest,color:n.color,map:this.texture,opacity:n.opacity,side:parseSide(n.side),transparent:n.transparent},e?(t=createShader(this.el,o,r),this.material=t.material,this.shaderObject=t.shader,updateBaseMaterial(this.material,r),void(this.mesh&&(this.mesh.material=this.material))):(this.shaderObject.update(r),i.transparent=r.transparent,void updateBaseMaterial(i,r))},updateFont:function(){var e,t=this.data,r=this.el,o=this.geometry,n=this;t.font||warn("No font specified. Using the default font."),this.mesh.visible=!1,e=this.lookupFont(t.font||DEFAULT_FONT)||t.font,cache.get(e,function(){return loadFont(e,t.yOffset)}).then(function(i){var a,s;if(1!==i.pages.length)throw new Error("Currently only single-page bitmap fonts are supported.");fontWidthFactors[e]||(i.widthFactor=fontWidthFactors[i]=computeFontWidthFactor(i)),a=coerceData(t),n.updateGeometry(o,n.data,i),n.currentFont=i,n.updateLayout(a),s=t.fontImage||e.replace(/(\.fnt)|(\.json)/,".png")||path.dirname(t.font)+"/"+i.pages[0],cache.get(s,function(){return loadTexture(s)}).then(function(e){n.mesh.visible=!0,n.texture.image=e,n.texture.needsUpdate=!0,r.emit("textfontset",{font:t.font,fontObj:i})}).catch(function(e){throw error(e),e})}).catch(function(e){throw error(e),e})},updateLayout:function(e){var t,r,o,n,i,a,s,h,d=this.el,u=this.geometry,l=d.getAttribute("geometry"),c=u.layout,f=this.mesh;if(l=d.getAttribute("geometry"),a=e.width||l&&l.width||DEFAULT_WIDTH,n=computeWidth(e.wrapPixels,e.wrapCount,this.currentFont.widthFactor),i=a/n,o=i*(c.height+c.descender),l&&(l.width||d.setAttribute("geometry","width",a),l.height||d.setAttribute("geometry","height",o)),t="align"===e.anchor?e.align:e.anchor,"left"===t)s=0;else if("right"===t)s=-1*c.width;else{if("center"!==t)throw new TypeError("Invalid text.anchor property value",t);s=-1*c.width/2}if(r=e.baseline,"bottom"===r)h=0;else if("top"===r)h=-1*c.height+c.ascender;else{if("center"!==r)throw new TypeError("Invalid text.baseline property value",r);h=-1*c.height/2}f.position.x=s*i,f.position.y=h*i,f.position.z=e.zOffset,f.scale.set(i,-1*i,i),this.geometry.computeBoundingSphere()},lookupFont:function(e){return FONTS[e]},updateGeometry:function(e,t,r){e.update(utils.extend({},t,{font:r,width:computeWidth(t.wrapPixels,t.wrapCount,r.widthFactor),text:t.value.replace(/\\n/g,"\n").replace(/\\t/g,"\t"),lineHeight:t.lineHeight||r.common.lineHeight}))}}); -},{"../core/component":126,"../core/shader":135,"../lib/three":174,"../utils/":197,"load-bmfont":25,"path":33,"three-bmfont-text":38}],112:[function(_dereq_,module,exports){ -var registerComponent=_dereq_("../core/component").registerComponent,THREE=_dereq_("../lib/three"),DEFAULT_CAMERA_HEIGHT=_dereq_("../constants").DEFAULT_CAMERA_HEIGHT,DEFAULT_HANDEDNESS=_dereq_("../constants").DEFAULT_HANDEDNESS,EYES_TO_ELBOW={x:.175,y:-.3,z:-.03},FOREARM={x:0,y:0,z:-.175};module.exports.Component=registerComponent("tracked-controls",{schema:{controller:{default:0},id:{type:"string",default:""},idPrefix:{type:"string",default:""},rotationOffset:{default:0},armModel:{default:!0},headElement:{type:"selector"}},init:function(){this.axis=[0,0,0],this.buttonStates={},this.dolly=new THREE.Object3D,this.controllerEuler=new THREE.Euler,this.controllerEuler.order="YXZ",this.controllerPosition=new THREE.Vector3,this.controllerQuaternion=new THREE.Quaternion,this.deltaControllerPosition=new THREE.Vector3,this.position={},this.rotation={},this.standingMatrix=new THREE.Matrix4,this.previousControllerPosition=new THREE.Vector3,this.updateGamepad()},tick:function(t,e){var i=this.el.getObject3D("mesh");i&&i.update&&i.update(e/1e3),this.updateGamepad(),this.updatePose(),this.updateButtons()},defaultUserHeight:function(){return DEFAULT_CAMERA_HEIGHT},getHeadElement:function(){return this.data.headElement||this.el.sceneEl.camera.el},updateGamepad:function(){var t,e=this.system.controllers,i=this.data,o=0;for(t=0;t=0&&(t=30),t&&i.chars.map(function(e){e.yoffset+=t}),void r(i))})})}function loadTexture(e){return new Promise(function(t,r){(new THREE.ImageLoader).load(e,function(e){t(e)},void 0,function(){error("Error loading font image",e),r(null)})})}function createShader(e,t,r){var o,n;return n=new shaders[t].Shader,n.el=e,n.init(r),n.update(r),o=n.material,o.transparent=r.transparent,{material:o,shader:n}}function updateBaseMaterial(e,t){e.side=t.side}function computeWidth(e,t,r){return e||(.5+t)*r}function computeFontWidthFactor(e){var t=0,r=0,o=0;return e.chars.map(function(e){t+=e.xadvance,e.id>=48&&e.id<=57&&(o++,r+=e.xadvance)}),o?r/o:t/e.chars.length}function PromiseCache(){var e=this.cache={};this.get=function(t,r){return t in e?e[t]:(e[t]=r(),e[t])}}var createTextGeometry=_dereq_("three-bmfont-text"),loadBMFont=_dereq_("load-bmfont"),path=_dereq_("path"),registerComponent=_dereq_("../core/component").registerComponent,coreShader=_dereq_("../core/shader"),THREE=_dereq_("../lib/three"),utils=_dereq_("../utils/"),error=utils.debug("components:text:error"),shaders=coreShader.shaders,warn=utils.debug("components:text:warn"),DEFAULT_WIDTH=1,MAX_ANISOTROPY=16,FONT_BASE_URL="https://cdn.aframe.io/fonts/",FONTS={aileronsemibold:FONT_BASE_URL+"Aileron-Semibold.fnt",dejavu:FONT_BASE_URL+"DejaVu-sdf.fnt",exo2bold:FONT_BASE_URL+"Exo2Bold.fnt",exo2semibold:FONT_BASE_URL+"Exo2SemiBold.fnt",kelsonsans:FONT_BASE_URL+"KelsonSans.fnt",monoid:FONT_BASE_URL+"Monoid.fnt",mozillavr:FONT_BASE_URL+"mozillavr.fnt",roboto:FONT_BASE_URL+"Roboto-msdf.json",sourcecodepro:FONT_BASE_URL+"SourceCodePro.fnt"},MSDF_FONTS=["roboto"],DEFAULT_FONT="roboto";module.exports.FONTS=FONTS;var cache=new PromiseCache,fontWidthFactors={};module.exports.Component=registerComponent("text",{multiple:!0,schema:{align:{type:"string",default:"left",oneOf:["left","right","center"]},alphaTest:{default:.5},anchor:{default:"center",oneOf:["left","right","center","align"]},baseline:{default:"center",oneOf:["top","center","bottom"]},color:{type:"color",default:"#FFF"},font:{type:"string",default:DEFAULT_FONT},fontImage:{type:"string"},height:{type:"number"},letterSpacing:{type:"number",default:0},lineHeight:{type:"number"},opacity:{type:"number",default:1},shader:{default:"sdf",oneOf:shaders},side:{default:"front",oneOf:["front","back","double"]},tabSize:{default:4},transparent:{default:!0},value:{type:"string"},whiteSpace:{default:"normal",oneOf:["normal","pre","nowrap"]},width:{type:"number"},wrapCount:{type:"number",default:40},wrapPixels:{type:"number"},yOffset:{type:"number",default:0},zOffset:{type:"number",default:.001}},init:function(){this.texture=new THREE.Texture,this.texture.anisotropy=MAX_ANISOTROPY,this.geometry=createTextGeometry(),this.createOrUpdateMaterial(),this.mesh=new THREE.Mesh(this.geometry,this.material),this.el.setObject3D(this.attrName,this.mesh)},update:function(e){var t=coerceData(this.data),r=this.currentFont;return this.createOrUpdateMaterial(),e.font!==t.font?void this.updateFont():void(r&&(this.updateGeometry(this.geometry,t,r),this.updateLayout(t)))},remove:function(){this.geometry.dispose(),this.geometry=null,this.el.removeObject3D(this.attrName),this.material.dispose(),this.material=null,this.texture.dispose(),this.texture=null,this.shaderObject&&delete this.shaderObject},createOrUpdateMaterial:function(){var e,t,r,o,n=this.data,i=this.material;return o=n.shader,MSDF_FONTS.indexOf(n.font)!==-1||n.font.indexOf("-msdf.")>=0?o="msdf":n.font in FONTS&&MSDF_FONTS.indexOf(n.font)===-1&&(o="sdf"),e=(this.shaderObject&&this.shaderObject.name)!==o,r={alphaTest:n.alphaTest,color:n.color,map:this.texture,opacity:n.opacity,side:parseSide(n.side),transparent:n.transparent},e?(t=createShader(this.el,o,r),this.material=t.material,this.shaderObject=t.shader,updateBaseMaterial(this.material,r),void(this.mesh&&(this.mesh.material=this.material))):(this.shaderObject.update(r),i.transparent=r.transparent,void updateBaseMaterial(i,r))},updateFont:function(){var e,t=this.data,r=this.el,o=this.geometry,n=this;t.font||warn("No font specified. Using the default font."),this.mesh.visible=!1,e=this.lookupFont(t.font||DEFAULT_FONT)||t.font,cache.get(e,function(){return loadFont(e,t.yOffset)}).then(function(i){var a,s;if(1!==i.pages.length)throw new Error("Currently only single-page bitmap fonts are supported.");fontWidthFactors[e]||(i.widthFactor=fontWidthFactors[i]=computeFontWidthFactor(i)),a=coerceData(t),n.updateGeometry(o,n.data,i),n.currentFont=i,n.updateLayout(a),s=t.fontImage||e.replace(/(\.fnt)|(\.json)/,".png")||path.dirname(t.font)+"/"+i.pages[0],cache.get(s,function(){return loadTexture(s)}).then(function(e){n.mesh.visible=!0,n.texture.image=e,n.texture.needsUpdate=!0,r.emit("textfontset",{font:t.font,fontObj:i})}).catch(function(e){throw error(e),e})}).catch(function(e){throw error(e),e})},updateLayout:function(e){var t,r,o,n,i,a,s,h,d=this.el,u=this.geometry,l=d.getAttribute("geometry"),c=u.layout,f=this.mesh;if(l=d.getAttribute("geometry"),a=e.width||l&&l.width||DEFAULT_WIDTH,n=computeWidth(e.wrapPixels,e.wrapCount,this.currentFont.widthFactor),i=a/n,o=i*(c.height+c.descender),l&&(l.width||d.setAttribute("geometry","width",a),l.height||d.setAttribute("geometry","height",o)),t="align"===e.anchor?e.align:e.anchor,"left"===t)s=0;else if("right"===t)s=-1*c.width;else{if("center"!==t)throw new TypeError("Invalid text.anchor property value",t);s=-1*c.width/2}if(r=e.baseline,"bottom"===r)h=0;else if("top"===r)h=-1*c.height+c.ascender;else{if("center"!==r)throw new TypeError("Invalid text.baseline property value",r);h=-1*c.height/2}f.position.x=s*i,f.position.y=h*i,f.position.z=e.zOffset,f.scale.set(i,-1*i,i),this.geometry.computeBoundingSphere()},lookupFont:function(e){return FONTS[e]},updateGeometry:function(e,t,r){e.update(utils.extend({},t,{font:r,width:computeWidth(t.wrapPixels,t.wrapCount,r.widthFactor),text:t.value.toString().replace(/\\n/g,"\n").replace(/\\t/g,"\t"),lineHeight:t.lineHeight||r.common.lineHeight}))}}); +},{"../core/component":126,"../core/shader":135,"../lib/three":174,"../utils/":196,"load-bmfont":25,"path":33,"three-bmfont-text":38}],111:[function(_dereq_,module,exports){ +var registerComponent=_dereq_("../core/component").registerComponent,controllerUtils=_dereq_("../utils/tracked-controls"),THREE=_dereq_("../lib/three"),DEFAULT_CAMERA_HEIGHT=_dereq_("../constants").DEFAULT_CAMERA_HEIGHT,DEFAULT_HANDEDNESS=_dereq_("../constants").DEFAULT_HANDEDNESS,EYES_TO_ELBOW={x:.175,y:-.3,z:-.03},FOREARM={x:0,y:0,z:-.175};module.exports.Component=registerComponent("tracked-controls",{schema:{controller:{default:0},id:{type:"string",default:""},hand:{type:"string",default:""},idPrefix:{type:"string",default:""},rotationOffset:{default:0},armModel:{default:!0},headElement:{type:"selector"}},init:function(){this.axis=[0,0,0],this.buttonStates={},this.targetControllerNumber=this.data.controller,this.dolly=new THREE.Object3D,this.controllerEuler=new THREE.Euler,this.controllerEuler.order="YXZ",this.controllerPosition=new THREE.Vector3,this.controllerQuaternion=new THREE.Quaternion,this.deltaControllerPosition=new THREE.Vector3,this.position=new THREE.Vector3,this.rotation={},this.standingMatrix=new THREE.Matrix4,this.previousControllerPosition=new THREE.Vector3,this.updateGamepad()},tick:function(t,e){var o=this.el.getObject3D("mesh");o&&o.update&&o.update(e/1e3),this.updateGamepad(),this.updatePose(),this.updateButtons()},defaultUserHeight:function(){return DEFAULT_CAMERA_HEIGHT},getHeadElement:function(){return this.data.headElement||this.el.sceneEl.camera.el},updateGamepad:function(){var t=this.data,e=controllerUtils.findMatchingController(this.system.controllers,t.id,t.idPrefix,t.hand,t.controller);this.controller=e},applyArmModel:function(t){var e,o,i,r,n,s,a=this.controller,l=this.controllerEuler,h=this.controllerQuaternion,u=this.deltaControllerPosition;i=this.getHeadElement(),r=i.object3D,o=i.components.camera,s=(o?o.data.userHeight:0)||this.defaultUserHeight(),n=a.pose,e=(a?a.hand:void 0)||DEFAULT_HANDEDNESS,t.copy(r.position),u.set(EYES_TO_ELBOW.x*("left"===e?-1:"right"===e?1:0),EYES_TO_ELBOW.y,EYES_TO_ELBOW.z),u.multiplyScalar(s),u.applyAxisAngle(r.up,r.rotation.y),t.add(u),u.set(FOREARM.x,FOREARM.y,FOREARM.z),u.multiplyScalar(s),n.orientation?h.fromArray(n.orientation):h.copy(r.quaternion),l.setFromQuaternion(h),l.set(l.x,l.y,0),u.applyEuler(l),t.add(u)},updatePose:function(){var t,e,o=this.controller,i=this.controllerEuler,r=this.controllerPosition,n=this.previousControllerPosition,s=this.dolly,a=this.el,l=this.standingMatrix,h=this.system.vrDisplay,u=this.getHeadElement(),d=u.components.camera,c=(d?d.data.userHeight:0)||this.defaultUserHeight();o&&(e=o.pose,null!==e.orientation&&s.quaternion.fromArray(e.orientation),null!==e.position?s.position.fromArray(e.position):this.data.armModel&&this.applyArmModel(s.position),null!=e.position&&h?h.stageParameters?(l.fromArray(h.stageParameters.sittingToStandingTransform),s.matrix.compose(s.position,s.quaternion,s.scale),s.matrix.multiplyMatrices(l,s.matrix)):(s.position.y+=c,s.matrix.compose(s.position,s.quaternion,s.scale)):s.matrix.compose(s.position,s.quaternion,s.scale),i.setFromRotationMatrix(s.matrix),r.setFromMatrixPosition(s.matrix),this.rotation.x=THREE.Math.radToDeg(i.x),this.rotation.y=THREE.Math.radToDeg(i.y),this.rotation.z=THREE.Math.radToDeg(i.z)+this.data.rotationOffset,a.setAttribute("rotation",this.rotation),t=a.getAttribute("position"),this.position.copy(t).sub(n).add(r),a.setAttribute("position",this.position),n.copy(r))},updateButtons:function(){var t,e,o=this.controller;if(o){for(e=0;eMAX_DELTA?(d[i]=0,void(d[s]=0)):(0!==d[i]&&(d[i]-=d[i]*r.easing*e),0!==d[s]&&(d[s]-=d[s]*r.easing*e),Math.abs(d[i])1&&t.setAttribute(m[0],m[1],rgbVectorToHex(i)),t.setAttribute(e,rgbVectorToHex(i))}}function d(){void 0===i?b[e]=parseFloat(t.getAttribute(e)):b[e]=parseFloat(i),g[e]=parseFloat(n),f=function(i){t.setAttribute(e,i[e])}}var h,c,p,v,f,m=e.split("."),b={},g={};return 2===m.length?o()?l():s():n&&isCoordinates(n)?r():["true","false"].indexOf(n)!==-1?u():isNaN(n)?l():d(),{from:b,partialSetAttribute:f,to:g}}function strToBool(t){return"true"===t}function boolToNum(t){return t?1:0}function componentToHex(t){var e=t.toString(16);return 1===e.length?"0"+e:e}function convertToIntegerColor(t){return Math.floor(255*Math.min(Math.abs(t),1))}function rgbVectorToHex(t){return"#"+["r","g","b"].map(function(e){return componentToHex(convertToIntegerColor(t[e]))}).join("")}var ANode=_dereq_("./a-node"),animationConstants=_dereq_("../constants/animation"),coordinates=_dereq_("../utils/").coordinates,parseProperty=_dereq_("./schema").parseProperty,registerElement=_dereq_("./a-register-element").registerElement,TWEEN=_dereq_("@tweenjs/tween.js"),THREE=_dereq_("../lib/three"),utils=_dereq_("../utils/"),bind=utils.bind,getComponentProperty=utils.entity.getComponentProperty,DEFAULTS=animationConstants.defaults,DIRECTIONS=animationConstants.directions,EASING_FUNCTIONS=animationConstants.easingFunctions,FILLS=animationConstants.fills,REPEATS=animationConstants.repeats,isCoordinates=coordinates.isCoordinates;module.exports.AAnimation=registerElement("a-animation",{prototype:Object.create(ANode.prototype,{createdCallback:{value:function(){this.bindMethods(),this.isRunning=!1,this.partialSetAttribute=function(){},this.tween=null}},attachedCallback:{value:function(){this.el=this.parentNode,this.handleMixinUpdate(),this.update(),this.load()}},attributeChangedCallback:{value:function(t,e,i){this.hasLoaded&&this.isRunning&&(this.stop(),this.handleMixinUpdate(),this.update())}},detachedCallback:{value:function(){this.isRunning&&this.stop()}},getTween:{value:function(){var t,e,i,n,a=this,o=a.data,s=a.el,r=o.attribute,u=parseInt(o.delay,10),l=getComponentProperty(s,r),d=a.getDirection(o.direction),h=EASING_FUNCTIONS[o.easing],c=o.fill,p=o.repeat===REPEATS.indefinite?1/0:0,v=!1;return t=getAnimationValues(s,r,o.from||a.initialValue,o.to,l),e=t.from,i=t.to,a.partialSetAttribute=t.partialSetAttribute,void 0===a.count&&(a.count=p===1/0?0:parseInt(o.repeat,10)),isNaN(u)&&(u=0),a.initialValue=a.initialValue||cloneValue(l),p===1/0&&c===FILLS.forwards&&[DIRECTIONS.alternate,DIRECTIONS.alternateReverse].indexOf(o.direction)!==-1&&(v=!0),d===DIRECTIONS.reverse&&(n=i,i=cloneValue(e),e=cloneValue(n)),[FILLS.backwards,FILLS.both].indexOf(c)!==-1&&a.partialSetAttribute(e),new TWEEN.Tween(cloneValue(e)).to(i,o.dur).delay(u).easing(h).repeat(p).yoyo(v).onUpdate(function(){a.partialSetAttribute(this)}).onComplete(bind(a.onCompleted,a))}},update:{value:function(){var t=this.data;"infinite"===t.repeat&&console.warn("Using 'infinite' as 'repeat' value is invalid. Use 'indefinite' instead."),""===t.begin||isNaN(t.begin)||(console.warn("Using 'begin' to specify a delay is deprecated. Use 'delay' instead."),t.delay=t.begin,t.begin="");var e=t.begin,i=t.end;this.evt&&this.removeEventListeners(this.evt),this.evt={begin:e,end:i},this.addEventListeners(this.evt),""===e&&(this.stop(),this.start())},writable:window.debug},onCompleted:{value:function(){var t=this.data;return this.isRunning=!1,[FILLS.backwards,FILLS.none].indexOf(t.fill)!==-1&&this.partialSetAttribute(this.initialValue),0===this.count?(this.count=void 0,void this.emit("animationend")):(this.isRunning=!1,this.count--,void this.start())}},start:{value:function(){var t=this;return this.el.hasLoaded?void(!this.isRunning&&this.el.isPlaying&&(this.tween=this.getTween(),this.isRunning=!0,this.tween.start(),this.emit("animationstart"))):void this.el.addEventListener("loaded",function(){t.start()})},writable:!0},stop:{value:function(){var t=this.tween;t&&(t.stop(),this.isRunning=!1,[FILLS.backwards,FILLS.none].indexOf(this.data.fill)!==-1&&this.partialSetAttribute(this.initialValue),this.emit("animationstop"))},writable:!0},getDirection:{value:function(t){return t===DIRECTIONS.alternate?(this.prevDirection=this.prevDirection===DIRECTIONS.normal?DIRECTIONS.reverse:DIRECTIONS.normal,this.prevDirection):t===DIRECTIONS.alternateReverse?(this.prevDirection=this.prevDirection===DIRECTIONS.reverse?DIRECTIONS.normal:DIRECTIONS.reverse,this.prevDirection):t}},bindMethods:{value:function(){this.start=bind(this.start,this),this.stop=bind(this.stop,this),this.onStateAdded=bind(this.onStateAdded,this),this.onStateRemoved=bind(this.onStateRemoved,this)}},addEventListeners:{value:function(t){var e=this.el,i=this;utils.splitString(t.begin).forEach(function(t){e.addEventListener(t,i.start)}),utils.splitString(t.end).forEach(function(t){e.addEventListener(t,i.stop)}),""===t.begin&&e.addEventListener("play",this.start),e.addEventListener("pause",this.stop),e.addEventListener("stateadded",this.onStateAdded),e.addEventListener("stateremoved",this.onStateRemoved)}},removeEventListeners:{value:function(t){var e=this.el,i=this.start,n=this.stop;utils.splitString(t.begin).forEach(function(t){e.removeEventListener(t,i)}),utils.splitString(t.end).forEach(function(t){e.removeEventListener(t,n)}),e.removeEventListener("stateadded",this.onStateAdded),e.removeEventListener("stateremoved",this.onStateRemoved)}},onStateAdded:{value:function(t){t.detail.state===this.data.begin&&this.start()},writable:!0},onStateRemoved:{value:function(t){t.detail.state===this.data.begin&&this.stop()},writable:!0},handleMixinUpdate:{value:function(){var t,e,i,n={};i=document.querySelector("#"+this.getAttribute("mixin")),e=i?utils.getElData(i,DEFAULTS):{},t=utils.getElData(this,DEFAULTS),utils.extend(n,DEFAULTS,e,t),this.data=n}}})}),module.exports.getAnimationValues=getAnimationValues; -},{"../constants/animation":116,"../lib/three":174,"../utils/":197,"./a-node":124,"./a-register-element":125,"./schema":134,"@tweenjs/tween.js":1}],120:[function(_dereq_,module,exports){ +},{"../constants/animation":116,"../lib/three":174,"../utils/":196,"./a-node":124,"./a-register-element":125,"./schema":134,"@tweenjs/tween.js":1}],120:[function(_dereq_,module,exports){ function mediaElementLoaded(e){if(e.hasAttribute("autoplay")||"auto"===e.getAttribute("preload"))return new Promise(function(t,r){function i(){for(var r=0,i=0;i=e.duration&&(THREE.Cache.files[e.getAttribute("src")]=e,t())}return 4===e.readyState?t():e.error?r():(e.addEventListener("loadeddata",i,!1),e.addEventListener("progress",i,!1),void e.addEventListener("error",r,!1))})}function fixUpMediaElement(e){var t=setCrossOrigin(e);return t.tagName&&"video"===t.tagName.toLowerCase()&&(t.setAttribute("playsinline",""),t.setAttribute("webkit-playsinline","")),t!==e&&(e.parentNode.appendChild(t),e.parentNode.removeChild(e)),t}function setCrossOrigin(e){var t,r;if(e.hasAttribute("crossorigin"))return e;if(r=e.getAttribute("src"),null!==r){if(r.indexOf("://")===-1)return e;if(extractDomain(r)===window.location.host)return e}return warn('Cross-origin element (e.g., ) was requested without `crossorigin` set. A-Frame will re-request the asset with `crossorigin` attribute set. Please set `crossorigin` on the element (e.g., )',r),e.crossOrigin="anonymous",t=e.cloneNode(!0)}function extractDomain(e){var t=e.indexOf("://")>-1?e.split("/")[2]:e.split("/")[0];return t.split(":")[0]}function inferResponseType(e){var t=e.lastIndexOf(".");if(t>=0){var r=e.slice(t,e.length);if(".gltf"===r||".glb"===r)return"arraybuffer"}return"text"}var ANode=_dereq_("./a-node"),bind=_dereq_("../utils/bind"),debug=_dereq_("../utils/debug"),registerElement=_dereq_("./a-register-element").registerElement,THREE=_dereq_("../lib/three"),fileLoader=new THREE.FileLoader,warn=debug("core:a-assets:warn");module.exports=registerElement("a-assets",{prototype:Object.create(ANode.prototype,{createdCallback:{value:function(){this.isAssets=!0,this.fileLoader=fileLoader,this.timeout=null}},attachedCallback:{value:function(){var e,t,r,i,o,n,s=this,a=[];if(!this.parentNode.isScene)throw new Error(" must be a child of a .");for(o=this.querySelectorAll("img"),e=0;e did not contain exactly six elements each with a `src` attribute.")},writable:window.debug}})}); -},{"../utils/debug":193,"./a-register-element":125}],122:[function(_dereq_,module,exports){ +},{"../utils/debug":192,"./a-register-element":125}],122:[function(_dereq_,module,exports){ function checkComponentDefined(t,e){return void 0!==t.defaultComponents[e]||(!(!t.components[e]||!t.components[e].attrValue)||isComponentMixedIn(e,t.mixinEls))}function isComponentMixedIn(t,e){var i,n=!1;for(i=0;i0?t.substring(0,a):t,COMPONENTS[s]?(!this.components[t]&&this.hasAttribute(t)&&this.updateComponent(t,window.HTMLElement.prototype.getAttribute.call(this,t)),"undefined"!=typeof i&&"string"==typeof e&&e.length>0&&"string"==typeof utils.styleParser.parse(e)?(n={},n[e]=i,o=!1):(n=e,o=i===!0),this.updateComponent(t,n,o),r=this.sceneEl&&this.sceneEl.getAttribute("debug"),void(r&&this.components[t].flushToDOM())):(ANode.prototype.setAttribute.call(this,t,e),void("mixin"===t&&this.mixinUpdate(e)))},writable:window.debug},flushToDOM:{value:function(t){var e,i,n,o=this.components,s=this.defaultComponents,a=this.children;for(n in o)o[n].flushToDOM(n in s);if(t)for(i=0;i outside of an A-Frame scene. Append this element to `` instead."),this.hasLoaded=!1,this.emit("nodeready",{},!1),e=this.getAttribute("mixin"),e&&this.updateMixins(e)},writable:window.debug},attributeChangedCallback:{value:function(e,t,i){"mixin"===e&&this.updateMixins(i,t)}},closestScene:{value:function(){for(var e=this;e&&!e.isScene;)e=e.parentElement;return e}},closest:{value:function(e){for(var t=this.matches||this.mozMatchesSelector||this.msMatchesSelector||this.oMatchesSelector||this.webkitMatchesSelector,i=this;i&&!t.call(i,e);)i=i.parentElement;return i}},detachedCallback:{value:function(){this.hasLoaded=!1}},load:{value:function(e,t){var i,n,s=this;this.hasLoaded||(t=t||isNode,i=this.getChildren(),n=i.filter(t).map(function(e){return new Promise(function(t){return e.hasLoaded?t():void e.addEventListener("loaded",t)})}),Promise.all(n).then(function(){s.hasLoaded=!0,e&&e(),s.emit("loaded",void 0,!1)}))},writable:!0},getChildren:{value:function(){return Array.prototype.slice.call(this.children,0)}},updateMixins:{value:function(e,t){var i=e?e.trim().split(/\s+/):[],n=t?t.trim().split(/\s+/):[];n.filter(function(e){return i.indexOf(e)<0}).forEach(bind(this.unregisterMixin,this)),this.mixinEls=[],i.forEach(bind(this.registerMixin,this))}},registerMixin:{value:function(e){if(this.sceneEl){var t=this.sceneEl.querySelector("a-mixin#"+e);t&&(this.attachMixinListener(t),this.mixinEls.push(t))}}},setAttribute:{value:function(e,t){"mixin"===e&&this.updateMixins(t),window.HTMLElement.prototype.setAttribute.call(this,e,t)}},unregisterMixin:{value:function(e){var t,i,n=this.mixinEls;for(i=0;i tag after the scene. Component