diff --git a/vendor/aframe.effects.js b/vendor/aframe.effects.js index c1c6ed1..118619c 100644 --- a/vendor/aframe.effects.js +++ b/vendor/aframe.effects.js @@ -76130,16 +76130,16 @@ var ATTR_NAME = 'loading-screen'; var LOADER_TITLE_CLASS = 'a-loader-title'; // It catches vrdisplayactivate early to ensure we can enter VR mode after the scene loads. -window.addEventListener('vrdisplayactivate', function () { - var vrManager = sceneEl.renderer.vr; - var vrDisplay = utils.device.getVRDisplay(); +// window.addEventListener('vrdisplayactivate', function () { +// var vrManager = sceneEl.renderer.vr; +// var vrDisplay = utils.device.getVRDisplay(); - vrManager.setDevice(vrDisplay); - vrManager.enabled = true; - if (!vrDisplay.isPresenting) { - return vrDisplay.requestPresent([{source: sceneEl.canvas}]).then(function () {}, function () {}); - } -}); +// vrManager.setDevice(vrDisplay); +// vrManager.enabled = true; +// if (!vrDisplay.isPresenting) { +// return vrDisplay.requestPresent([{source: sceneEl.canvas}]).then(function () {}, function () {}); +// } +// }); module.exports.setup = function setup (el, getCanvasSize) { sceneEl = el; @@ -77937,7 +77937,7 @@ _dereq_('./core/a-mixin'); _dereq_('./extras/components/'); _dereq_('./extras/primitives/'); -console.log('A-Frame Version: 0.8.2 (Date 2018-10-09, Commit #621221474)'); +console.log('A-Frame Version: 0.8.2 (Date 2018-10-10, Commit #1ab59cd99)'); console.log('three Version:', pkg.dependencies['three']); console.log('WebVR Polyfill Version:', pkg.dependencies['webvr-polyfill']); diff --git a/vendor/aframe.effects.js.map b/vendor/aframe.effects.js.map index 8fa1a64..ca589fa 100644 --- a/vendor/aframe.effects.js.map +++ b/vendor/aframe.effects.js.map @@ -321,7 +321,7 @@ "var schema = require('./schema');\n\nvar processSchema = schema.process;\nvar geometries = module.exports.geometries = {}; // Registered geometries.\nvar geometryNames = module.exports.geometryNames = []; // Names of registered geometries.\nvar THREE = require('../lib/three');\n\n/**\n * Geometry class definition.\n *\n * Geometries extend the geometry component API to create and register geometry types.\n */\nvar Geometry = module.exports.Geometry = function () {};\n\nGeometry.prototype = {\n /**\n * Contains the type schema and defaults for the data values.\n * Data is coerced into the types of the values of the defaults.\n */\n schema: {},\n\n /**\n * Init handler. Similar to attachedCallback.\n * Called during shader initialization and is only run once.\n */\n init: function (data) {\n this.geometry = new THREE.Geometry();\n return this.geometry;\n },\n\n /**\n * Update handler. Similar to attributeChangedCallback.\n * Called whenever the associated geometry data changes.\n *\n * @param {object} data - New geometry data.\n */\n update: function (data) { /* no-op */ }\n};\n\n/**\n * Registers a geometry to A-Frame.\n *\n * @param {string} name - Geometry name.\n * @param {object} definition - Geometry property and methods.\n * @returns {object} Geometry.\n */\nmodule.exports.registerGeometry = function (name, definition) {\n var NewGeometry;\n var proto = {};\n\n // Format definition object to prototype object.\n Object.keys(definition).forEach(function expandDefinition (key) {\n proto[key] = {\n value: definition[key],\n writable: true\n };\n });\n\n if (geometries[name]) {\n throw new Error('The geometry `' + name + '` has been already registered');\n }\n NewGeometry = function () { Geometry.call(this); };\n NewGeometry.prototype = Object.create(Geometry.prototype, proto);\n NewGeometry.prototype.name = name;\n NewGeometry.prototype.constructor = NewGeometry;\n geometries[name] = {\n Geometry: NewGeometry,\n schema: processSchema(NewGeometry.prototype.schema)\n };\n geometryNames.push(name);\n return NewGeometry;\n};\n", "var coordinates = require('../utils/coordinates');\nvar debug = require('debug');\n\nvar error = debug('core:propertyTypes:warn');\nvar warn = debug('core:propertyTypes:warn');\n\nvar propertyTypes = module.exports.propertyTypes = {};\nvar nonCharRegex = /[,> .[\\]:]/;\n\n// Built-in property types.\nregisterPropertyType('audio', '', assetParse);\nregisterPropertyType('array', [], arrayParse, arrayStringify);\nregisterPropertyType('asset', '', assetParse);\nregisterPropertyType('boolean', false, boolParse);\nregisterPropertyType('color', '#FFF', defaultParse, defaultStringify);\nregisterPropertyType('int', 0, intParse);\nregisterPropertyType('number', 0, numberParse);\nregisterPropertyType('map', '', assetParse);\nregisterPropertyType('model', '', assetParse);\nregisterPropertyType('selector', null, selectorParse, selectorStringify);\nregisterPropertyType('selectorAll', null, selectorAllParse, selectorAllStringify);\nregisterPropertyType('src', '', srcParse);\nregisterPropertyType('string', '', defaultParse, defaultStringify);\nregisterPropertyType('time', 0, intParse);\nregisterPropertyType('vec2', {x: 0, y: 0}, vecParse, coordinates.stringify);\nregisterPropertyType('vec3', {x: 0, y: 0, z: 0}, vecParse, coordinates.stringify);\nregisterPropertyType('vec4', {x: 0, y: 0, z: 0, w: 1}, vecParse, coordinates.stringify);\n\n/**\n * Register a parser for re-use such that when someone uses `type` in the schema,\n * `schema.process` will set the property `parse` and `stringify`.\n *\n * @param {string} type - Type name.\n * @param [defaultValue=null] -\n * Default value to use if component does not define default value.\n * @param {function} [parse=defaultParse] - Parse string function.\n * @param {function} [stringify=defaultStringify] - Stringify to DOM function.\n */\nfunction registerPropertyType (type, defaultValue, parse, stringify) {\n if ('type' in propertyTypes) {\n error('Property type ' + type + ' is already registered.');\n return;\n }\n\n propertyTypes[type] = {\n default: defaultValue,\n parse: parse || defaultParse,\n stringify: stringify || defaultStringify\n };\n}\nmodule.exports.registerPropertyType = registerPropertyType;\n\nfunction arrayParse (value) {\n if (Array.isArray(value)) { return value; }\n if (!value || typeof value !== 'string') { return []; }\n return value.split(',').map(trim);\n function trim (str) { return str.trim(); }\n}\n\nfunction arrayStringify (value) {\n return value.join(', ');\n}\n\n/**\n * For general assets.\n *\n * @param {string} value - Can either be `url()`, an ID selector to an asset, or\n * just string.\n * @returns {string} Parsed value from `url()`, src from ``, or\n * just string.\n */\nfunction assetParse (value) {\n var el;\n var parsedUrl;\n\n // If an element was provided (e.g. canvas or video), just return it.\n if (typeof value !== 'string') { return value; }\n\n // Wrapped `url()` in case of data URI.\n parsedUrl = value.match(/\\url\\((.+)\\)/);\n if (parsedUrl) { return parsedUrl[1]; }\n\n // ID.\n if (value.charAt(0) === '#') {\n el = document.getElementById(value.substring(1));\n if (el) {\n // Pass through media elements. If we have the elements, we don't have to call\n // three.js loaders which would re-request the assets.\n if (el.tagName === 'CANVAS' || el.tagName === 'VIDEO' || el.tagName === 'IMG') {\n return el;\n }\n return el.getAttribute('src');\n }\n warn('\"' + value + '\" asset not found.');\n return;\n }\n\n // Non-wrapped url().\n return value;\n}\n\nfunction defaultParse (value) {\n return value;\n}\n\nfunction defaultStringify (value) {\n if (value === null) { return 'null'; }\n return value.toString();\n}\n\nfunction boolParse (value) {\n return value !== 'false' && value !== false;\n}\n\nfunction intParse (value) {\n return parseInt(value, 10);\n}\n\nfunction numberParse (value) {\n return parseFloat(value, 10);\n}\n\nfunction selectorParse (value) {\n if (!value) { return null; }\n if (typeof value !== 'string') { return value; }\n if (value[0] === '#' && !nonCharRegex.test(value)) {\n // When selecting element by ID only, use getElementById for better performance.\n // Don't match like #myId .child.\n return document.getElementById(value.substring(1));\n }\n return document.querySelector(value);\n}\n\nfunction selectorAllParse (value) {\n if (!value) { return null; }\n if (typeof value !== 'string') { return value; }\n return Array.prototype.slice.call(document.querySelectorAll(value), 0);\n}\n\nfunction selectorStringify (value) {\n if (value.getAttribute) {\n return '#' + value.getAttribute('id');\n }\n return defaultStringify(value);\n}\n\nfunction selectorAllStringify (value) {\n if (value instanceof Array) {\n return value.map(function (element) {\n return '#' + element.getAttribute('id');\n }).join(', ');\n }\n return defaultStringify(value);\n}\n\nfunction srcParse (value) {\n warn('`src` property type is deprecated. Use `asset` instead.');\n return assetParse(value);\n}\n\nfunction vecParse (value) {\n return coordinates.parse(value, this.default);\n}\n\n/**\n * Validate the default values in a schema to match their type.\n *\n * @param {string} type - Property type name.\n * @param defaultVal - Property type default value.\n * @returns {boolean} Whether default value is accurate given the type.\n */\nfunction isValidDefaultValue (type, defaultVal) {\n if (type === 'audio' && typeof defaultVal !== 'string') { return false; }\n if (type === 'array' && !Array.isArray(defaultVal)) { return false; }\n if (type === 'asset' && typeof defaultVal !== 'string') { return false; }\n if (type === 'boolean' && typeof defaultVal !== 'boolean') { return false; }\n if (type === 'color' && typeof defaultVal !== 'string') { return false; }\n if (type === 'int' && typeof defaultVal !== 'number') { return false; }\n if (type === 'number' && typeof defaultVal !== 'number') { return false; }\n if (type === 'map' && typeof defaultVal !== 'string') { return false; }\n if (type === 'model' && typeof defaultVal !== 'string') { return false; }\n if (type === 'selector' && typeof defaultVal !== 'string' &&\n defaultVal !== null) { return false; }\n if (type === 'selectorAll' && typeof defaultVal !== 'string' &&\n defaultVal !== null) { return false; }\n if (type === 'src' && typeof defaultVal !== 'string') { return false; }\n if (type === 'string' && typeof defaultVal !== 'string') { return false; }\n if (type === 'time' && typeof defaultVal !== 'number') { return false; }\n if (type === 'vec2') { return isValidDefaultCoordinate(defaultVal, 2); }\n if (type === 'vec3') { return isValidDefaultCoordinate(defaultVal, 3); }\n if (type === 'vec4') { return isValidDefaultCoordinate(defaultVal, 4); }\n return true;\n}\nmodule.exports.isValidDefaultValue = isValidDefaultValue;\n\n/**\n * Checks if default coordinates are valid.\n *\n * @param possibleCoordinates\n * @param {number} dimensions - 2 for 2D Vector, 3 for 3D vector.\n * @returns {boolean} Whether coordinates are parsed correctly.\n */\nfunction isValidDefaultCoordinate (possibleCoordinates, dimensions) {\n if (possibleCoordinates === null) { return true; }\n if (typeof possibleCoordinates !== 'object') { return false; }\n\n if (Object.keys(possibleCoordinates).length !== dimensions) {\n return false;\n } else {\n var x = possibleCoordinates.x;\n var y = possibleCoordinates.y;\n var z = possibleCoordinates.z;\n var w = possibleCoordinates.w;\n\n if (typeof x !== 'number' || typeof y !== 'number') { return false; }\n if (dimensions > 2 && typeof z !== 'number') { return false; }\n if (dimensions > 3 && typeof w !== 'number') { return false; }\n }\n\n return true;\n}\nmodule.exports.isValidDefaultCoordinate = isValidDefaultCoordinate;\n", "/* global Promise, screen */\nvar initMetaTags = require('./metaTags').inject;\nvar initWakelock = require('./wakelock');\nvar loadingScreen = require('./loadingScreen');\nvar re = require('../a-register-element');\nvar scenes = require('./scenes');\nvar systems = require('../system').systems;\nvar THREE = require('../../lib/three');\nvar utils = require('../../utils/');\n// Require after.\nvar AEntity = require('../a-entity');\nvar ANode = require('../a-node');\nvar initPostMessageAPI = require('./postMessage');\n\nvar bind = utils.bind;\nvar isIOS = utils.device.isIOS();\nvar isMobile = utils.device.isMobile();\nvar registerElement = re.registerElement;\nvar warn = utils.debug('core:a-scene:warn');\n\n/**\n * Scene element, holds all entities.\n *\n * @member {array} behaviors - Component instances that have registered themselves to be\n updated on every tick.\n * @member {object} camera - three.js Camera object.\n * @member {object} canvas\n * @member {bool} isScene - Differentiates as scene entity as opposed to other entites.\n * @member {bool} isMobile - Whether browser is mobile (via UA detection).\n * @member {object} object3D - Root three.js Scene object.\n * @member {object} renderer\n * @member {bool} renderStarted\n * @member {object} systems - Registered instantiated systems.\n * @member {number} time\n */\nmodule.exports.AScene = registerElement('a-scene', {\n prototype: Object.create(AEntity.prototype, {\n createdCallback: {\n value: function () {\n this.isIOS = isIOS;\n this.isMobile = isMobile;\n this.isScene = true;\n this.object3D = new THREE.Scene();\n this.render = bind(this.render, this);\n this.systems = {};\n this.systemNames = [];\n this.time = this.delta = 0;\n\n this.behaviors = {tick: [], tock: []};\n this.hasLoaded = false;\n this.isPlaying = false;\n this.originalHTML = this.innerHTML;\n this.renderTarget = null;\n\n // Default components.\n this.setAttribute('inspector', '');\n this.setAttribute('keyboard-shortcuts', '');\n this.setAttribute('screenshot', '');\n this.setAttribute('vr-mode-ui', '');\n }\n },\n\n addFullScreenStyles: {\n value: function () {\n var htmlEl = document.documentElement;\n htmlEl.classList.add('a-html');\n document.body.classList.add('a-body');\n this.classList.add('fullscreen');\n }\n },\n\n removeFullScreenStyles: {\n value: function () {\n var htmlEl = document.documentElement;\n htmlEl.classList.remove('a-html');\n document.body.classList.remove('a-body');\n this.classList.remove('fullscreen');\n }\n },\n\n attachedCallback: {\n value: function () {\n var self = this;\n // Renderer initialization\n setupCanvas(this);\n this.setupRenderer();\n\n this.resize();\n this.addFullScreenStyles();\n initPostMessageAPI(this);\n\n initMetaTags(this);\n initWakelock(this);\n\n // Camera set up by camera system.\n this.addEventListener('cameraready', function () {\n self.attachedCallbackPostCamera();\n });\n\n this.initSystems();\n }\n },\n\n attachedCallbackPostCamera: {\n value: function () {\n var resize;\n var self = this;\n\n resize = bind(this.resize, this);\n window.addEventListener('load', resize);\n window.addEventListener('resize', function () {\n // Workaround for a Webkit bug (https://bugs.webkit.org/show_bug.cgi?id=170595)\n // where the window does not contain the correct viewport size\n // after an orientation change. The window size is correct if the operation\n // is postponed a few milliseconds.\n // self.resize can be called directly once the bug above is fixed.\n if (self.isIOS) {\n setTimeout(resize, 100);\n } else {\n resize();\n }\n });\n this.play();\n\n // Add to scene index.\n scenes.push(this);\n\n // Handler to exit VR (e.g., Oculus Browser back button).\n this.onVRPresentChangeBound = bind(this.onVRPresentChange, this);\n window.addEventListener('vrdisplaypresentchange', this.onVRPresentChangeBound);\n\n // bind functions\n this.enterVRBound = function () { self.enterVR(); };\n this.exitVRBound = function () { self.exitVR(); };\n this.exitVRTrueBound = function () { self.exitVR(true); };\n this.pointerRestrictedBound = function () { self.pointerRestricted(); };\n this.pointerUnrestrictedBound = function () { self.pointerUnrestricted(); };\n\n // Enter VR on `vrdisplayactivate` (e.g. putting on Rift headset).\n window.addEventListener('vrdisplayactivate', this.enterVRBound);\n\n // Exit VR on `vrdisplaydeactivate` (e.g. taking off Rift headset).\n window.addEventListener('vrdisplaydeactivate', this.exitVRBound);\n\n // Exit VR on `vrdisplaydisconnect` (e.g. unplugging Rift headset).\n window.addEventListener('vrdisplaydisconnect', this.exitVRTrueBound);\n\n // Register for mouse restricted events while in VR\n // (e.g. mouse no longer available on desktop 2D view)\n window.addEventListener('vrdisplaypointerrestricted', this.pointerRestrictedBound);\n\n // Register for mouse unrestricted events while in VR\n // (e.g. mouse once again available on desktop 2D view)\n window.addEventListener('vrdisplaypointerunrestricted', this.pointerUnrestrictedBound);\n },\n writable: window.debug\n },\n\n /**\n * Initialize all systems.\n */\n initSystems: {\n value: function () {\n var name;\n\n // Initialize camera system first.\n this.initSystem('camera');\n\n for (name in systems) {\n if (name === 'camera') { continue; }\n this.initSystem(name);\n }\n }\n },\n\n /**\n * Initialize a system.\n */\n initSystem: {\n value: function (name) {\n if (this.systems[name]) { return; }\n this.systems[name] = new systems[name](this);\n this.systemNames.push(name);\n }\n },\n\n /**\n * Shut down scene on detach.\n */\n detachedCallback: {\n value: function () {\n // Remove from scene index.\n var sceneIndex = scenes.indexOf(this);\n scenes.splice(sceneIndex, 1);\n\n window.removeEventListener('vrdisplaypresentchange', this.onVRPresentChangeBound);\n window.removeEventListener('vrdisplayactivate', this.enterVRBound);\n window.removeEventListener('vrdisplaydeactivate', this.exitVRBound);\n window.removeEventListener('vrdisplayconnect', this.enterVRBound);\n window.removeEventListener('vrdisplaydisconnect', this.exitVRTrueBound);\n window.removeEventListener('vrdisplaypointerrestricted', this.pointerRestrictedBound);\n window.removeEventListener('vrdisplaypointerunrestricted', this.pointerUnrestrictedBound);\n }\n },\n\n /**\n * Add ticks and tocks.\n *\n * @param {object} behavior - A component.\n */\n addBehavior: {\n value: function (behavior) {\n var behaviorArr;\n var behaviors = this.behaviors;\n var behaviorType;\n\n // Check if behavior has tick and/or tock and add the behavior to the appropriate list.\n for (behaviorType in behaviors) {\n if (!behavior[behaviorType]) { continue; }\n behaviorArr = this.behaviors[behaviorType];\n if (behaviorArr.indexOf(behavior) === -1) {\n behaviorArr.push(behavior);\n }\n }\n }\n },\n\n /**\n * For tests.\n */\n getPointerLockElement: {\n value: function () {\n return document.pointerLockElement;\n },\n writable: window.debug\n },\n\n /**\n * For tests.\n */\n checkHeadsetConnected: {\n value: utils.device.checkHeadsetConnected,\n writable: window.debug\n },\n\n /**\n * Call `requestPresent` if WebVR or WebVR polyfill.\n * Call `requestFullscreen` on desktop.\n * Handle events, states, fullscreen styles.\n *\n * @returns {Promise}\n */\n enterVR: {\n value: function () {\n var self = this;\n var effect = this.effect;\n // Don't enter VR if already in VR.\n if (this.is('vr-mode')) { return Promise.resolve('Already in VR.'); }\n // Enter VR via WebVR API.\n if (this.checkHeadsetConnected() || this.isMobile) {\n return effect && effect.requestPresent().then(enterVRSuccess, enterVRFailure) || Promise.reject(new Error('VREffect not initialized'));\n }\n enterVRSuccess();\n return Promise.resolve();\n\n function enterVRSuccess () {\n self.addState('vr-mode');\n self.emit('enter-vr', {target: self});\n // Lock to landscape orientation on mobile.\n if (self.isMobile && screen.orientation && screen.orientation.lock) {\n screen.orientation.lock('landscape');\n }\n self.addFullScreenStyles();\n\n // On mobile, the polyfill handles fullscreen.\n // TODO: 07/16 Chromium builds break when `requestFullscreen`ing on a canvas\n // that we are also `requestPresent`ing. Until then, don't fullscreen if headset\n // connected.\n if (!self.isMobile && !self.checkHeadsetConnected()) {\n requestFullscreen(self.canvas);\n }\n self.resize();\n }\n\n function enterVRFailure (err) {\n if (err && err.message) {\n throw new Error('Failed to enter VR mode (`requestPresent`): ' + err.message);\n } else {\n throw new Error('Failed to enter VR mode (`requestPresent`).');\n }\n }\n },\n writable: true\n },\n /**\n * Call `exitPresent` if WebVR or WebVR polyfill.\n * Handle events, states, fullscreen styles.\n *\n * @returns {Promise}\n */\n exitVR: {\n value: function () {\n var self = this;\n\n // Don't exit VR if not in VR.\n if (!this.is('vr-mode')) { return Promise.resolve('Not in VR.'); }\n\n exitFullscreen();\n // Handle exiting VR if not yet already and in a headset or polyfill.\n if (this.checkHeadsetConnected() || this.isMobile) {\n return this.effect.exitPresent().then(exitVRSuccess, exitVRFailure);\n }\n\n // Handle exiting VR in all other cases (2D fullscreen, external exit VR event).\n exitVRSuccess();\n\n return Promise.resolve();\n\n function exitVRSuccess () {\n self.removeState('vr-mode');\n // Lock to landscape orientation on mobile.\n if (self.isMobile && screen.orientation && screen.orientation.unlock) {\n screen.orientation.unlock();\n }\n // Exiting VR in embedded mode, no longer need fullscreen styles.\n if (self.hasAttribute('embedded')) { self.removeFullScreenStyles(); }\n self.resize();\n if (self.isIOS) { utils.forceCanvasResizeSafariMobile(self.canvas); }\n self.emit('exit-vr', {target: self});\n }\n\n function exitVRFailure (err) {\n if (err && err.message) {\n throw new Error('Failed to exit VR mode (`exitPresent`): ' + err.message);\n } else {\n throw new Error('Failed to exit VR mode (`exitPresent`).');\n }\n }\n },\n writable: true\n },\n\n pointerRestricted: {\n value: function () {\n if (this.canvas) {\n var pointerLockElement = this.getPointerLockElement();\n if (pointerLockElement && pointerLockElement !== this.canvas && document.exitPointerLock) {\n // Recreate pointer lock on the canvas, if taken on another element.\n document.exitPointerLock();\n }\n\n if (this.canvas.requestPointerLock) {\n this.canvas.requestPointerLock();\n }\n }\n }\n },\n\n pointerUnrestricted: {\n value: function () {\n var pointerLockElement = this.getPointerLockElement();\n if (pointerLockElement && pointerLockElement === this.canvas && document.exitPointerLock) {\n document.exitPointerLock();\n }\n }\n },\n\n /**\n * Handle `vrdisplaypresentchange` event for exiting VR through other means than\n * `` key. For example, GearVR back button on Oculus Browser.\n */\n onVRPresentChange: {\n value: function (evt) {\n // Polyfill places display inside the detail property\n var display = evt.display || evt.detail.display;\n // Entering VR.\n if (display.isPresenting) {\n this.enterVR(true);\n this.effectComposer && this.effectComposer.reset();\n return;\n }\n // Exiting VR.\n this.exitVR();\n }\n },\n\n /**\n * Wraps Entity.getAttribute to take into account for systems.\n * If system exists, then return system data rather than possible component data.\n */\n getAttribute: {\n value: function (attr) {\n var system = this.systems[attr];\n if (system) { return system.data; }\n return AEntity.prototype.getAttribute.call(this, attr);\n }\n },\n\n /**\n * `getAttribute` used to be `getDOMAttribute` and `getComputedAttribute` used to be\n * what `getAttribute` is now. Now legacy code.\n */\n getComputedAttribute: {\n value: function (attr) {\n warn('`getComputedAttribute` is deprecated. Use `getAttribute` instead.');\n this.getAttribute(attr);\n }\n },\n\n /**\n * Wraps Entity.getDOMAttribute to take into account for systems.\n * If system exists, then return system data rather than possible component data.\n */\n getDOMAttribute: {\n value: function (attr) {\n var system = this.systems[attr];\n if (system) { return system.data; }\n return AEntity.prototype.getDOMAttribute.call(this, attr);\n }\n },\n\n /**\n * Wrap Entity.setAttribute to take into account for systems.\n * If system exists, then skip component initialization checks and do a normal\n * setAttribute.\n */\n setAttribute: {\n value: function (attr, value, componentPropValue) {\n var system = this.systems[attr];\n if (system) {\n ANode.prototype.setAttribute.call(this, attr, value);\n system.updateProperties(value);\n return;\n }\n AEntity.prototype.setAttribute.call(this, attr, value, componentPropValue);\n }\n },\n\n /**\n * @param {object} behavior - A component.\n */\n removeBehavior: {\n value: function (behavior) {\n var behaviorArr;\n var behaviorType;\n var behaviors = this.behaviors;\n var index;\n\n // Check if behavior has tick and/or tock and remove the behavior from the appropriate\n // array.\n for (behaviorType in behaviors) {\n if (!behavior[behaviorType]) { continue; }\n behaviorArr = this.behaviors[behaviorType];\n index = behaviorArr.indexOf(behavior);\n if (index !== -1) { behaviorArr.splice(index, 1); }\n }\n }\n },\n\n resize: {\n value: function () {\n var camera = this.camera;\n var canvas = this.canvas;\n var embedded;\n var isVRPresenting;\n var size;\n isVRPresenting = this.effect.isPresenting;\n // Do not update renderer, if a camera or a canvas have not been injected.\n // In VR mode, three handles canvas resize based on the dimensions returned by\n // the getEyeParameters function of the WebVR API. These dimensions are independent of\n // the window size, therefore should not be overwritten with the window's width and\n // height, // except when in fullscreen mode.\n if (!camera || !canvas || (this.is('vr-mode') && (this.isMobile || isVRPresenting))) {\n return;\n }\n\n // Update camera.\n embedded = this.getAttribute('embedded') && !this.is('vr-mode');\n size = getCanvasSize(canvas, embedded, this.maxCanvasSize, this.is('vr-mode'));\n camera.aspect = size.width / size.height;\n camera.updateProjectionMatrix();\n\n // Notify renderer of size change.\n this.renderer.setSize(size.width, size.height, false);\n this.emit('rendererresize', null, false);\n },\n writable: true\n },\n\n setupRenderer: {\n value: function () {\n var self = this;\n var renderer;\n var rendererAttr;\n var rendererAttrString;\n var rendererConfig;\n\n rendererConfig = {alpha: true, antialias: !isMobile, canvas: this.canvas, logarithmicDepthBuffer: false};\n if (this.hasAttribute('antialias')) {\n rendererConfig.antialias = this.getAttribute('antialias') === 'true';\n }\n\n if (this.hasAttribute('logarithmicDepthBuffer')) {\n rendererConfig.logarithmicDepthBuffer = this.getAttribute('logarithmicDepthBuffer') === 'true';\n }\n\n this.maxCanvasSize = {height: 1920, width: 1920};\n\n if (this.hasAttribute('renderer')) {\n rendererAttrString = this.getAttribute('renderer');\n rendererAttr = utils.styleParser.parse(rendererAttrString);\n\n if (rendererAttr.antialias && rendererAttr.antialias !== 'auto') {\n rendererConfig.antialias = rendererAttr.antialias === 'true';\n }\n\n this.maxCanvasSize = {\n width: rendererAttr.maxCanvasWidth\n ? parseInt(rendererAttr.maxCanvasWidth)\n : this.maxCanvasSize.width,\n height: rendererAttr.maxCanvasHeight\n ? parseInt(rendererAttr.maxCanvasHeight)\n : this.maxCanvasSize.height\n };\n }\n\n renderer = this.renderer = new THREE.WebGLRenderer(rendererConfig);\n this.effect = new THREE.VREffect(renderer);\n this.effect.autoSubmitFrame = false;\n renderer.setPixelRatio(window.devicePixelRatio);\n renderer.sortObjects = false;\n renderer.vr.setPoseTarget(this.camera);\n this.addEventListener('camera-set-active', function () {\n renderer.vr.setPoseTarget(self.camera);\n });\n loadingScreen.setup(this, getCanvasSize);\n },\n writable: window.debug\n },\n\n /**\n * Handler attached to elements to help scene know when to kick off.\n * Scene waits for all entities to load.\n */\n play: {\n value: function () {\n var self = this;\n var sceneEl = this;\n\n if (this.renderStarted) {\n AEntity.prototype.play.call(this);\n return;\n }\n\n this.addEventListener('loaded', function () {\n AEntity.prototype.play.call(this); // .play() *before* render.\n\n if (sceneEl.renderStarted) { return; }\n\n sceneEl.resize();\n\n // Kick off render loop.\n if (sceneEl.renderer) {\n if (window.performance) { window.performance.mark('render-started'); }\n sceneEl.clock = new THREE.Clock();\n loadingScreen.remove();\n sceneEl.render();\n sceneEl.renderStarted = true;\n sceneEl.emit('renderstart');\n }\n });\n\n // setTimeout to wait for all nodes to attach and run their callbacks.\n setTimeout(function () {\n AEntity.prototype.load.call(self);\n });\n }\n },\n\n /**\n * Wrap `updateComponent` to not initialize the component if the component has a system\n * (aframevr/aframe#2365).\n */\n updateComponent: {\n value: function (componentName) {\n if (componentName in systems) { return; }\n AEntity.prototype.updateComponent.apply(this, arguments);\n }\n },\n\n /**\n * Behavior-updater meant to be called from scene render.\n * Abstracted to a different function to facilitate unit testing (`scene.tick()`) without\n * needing to render.\n */\n tick: {\n value: function (time, timeDelta) {\n var i;\n var systems = this.systems;\n\n // Components.\n for (i = 0; i < this.behaviors.tick.length; i++) {\n if (!this.behaviors.tick[i].el.isPlaying) { continue; }\n this.behaviors.tick[i].tick(time, timeDelta);\n }\n\n // Systems.\n for (i = 0; i < this.systemNames.length; i++) {\n if (!systems[this.systemNames[i]].tick) { continue; }\n systems[this.systemNames[i]].tick(time, timeDelta);\n }\n }\n },\n\n /**\n * Behavior-updater meant to be called after scene render for post processing purposes.\n * Abstracted to a different function to facilitate unit testing (`scene.tock()`) without\n * needing to render.\n */\n tock: {\n value: function (time, timeDelta, camera) {\n var i;\n var systems = this.systems;\n\n // Components.\n for (i = 0; i < this.behaviors.tock.length; i++) {\n if (!this.behaviors.tock[i].el.isPlaying) { continue; }\n this.behaviors.tock[i].tock(time, timeDelta, camera);\n }\n\n // Systems.\n for (i = 0; i < this.systemNames.length; i++) {\n if (!systems[this.systemNames[i]].tock) { continue; }\n systems[this.systemNames[i]].tock(time, timeDelta, camera);\n }\n }\n },\n\n /**\n * The render loop.\n *\n * Updates animations.\n * Updates behaviors.\n * Renders with request animation frame.\n */\n render: {\n value: function () {\n var effectComposer = this.effectComposer;\n var effect = this.effect;\n\n this.delta = this.clock.getDelta() * 1000;\n this.time = this.clock.elapsedTime * 1000;\n\n if (this.isPlaying) { this.tick(this.time, this.delta); }\n\n effect.requestAnimationFrame(this.render);\n if (effectComposer) {\n effectComposer.render();\n } else {\n effect.render(this.object3D, this.camera, this.renderTarget);\n }\n\n if (this.isPlaying) { this.tock(this.time, this.delta, this.camera); }\n\n this.components.overlay && this.components.overlay.render();\n\n effect.submitFrame();\n },\n writable: true\n }\n })\n});\n\n/**\n * Return the canvas size where the scene will be rendered.\n * Will be always the window size except when the scene is embedded.\n * The parent size (less than max size) will be returned in that case.\n *\n * @param {object} canvasEl - the canvas element\n * @param {boolean} embedded - Is the scene embedded?\n * @param {object} max - Max size parameters\n * @param {boolean} isVR - If in VR\n */\nfunction getCanvasSize (canvasEl, embedded, maxSize, isVR) {\n if (embedded) {\n return {\n height: canvasEl.parentElement.offsetHeight,\n width: canvasEl.parentElement.offsetWidth\n };\n }\n return getMaxSize(maxSize, isVR);\n}\n\n/**\n * Return the canvas size. Will be the window size unless that size is greater than the\n * maximum size (1920x1920 by default). The constrained size will be returned in that case,\n * maintaining aspect ratio\n *\n * @param {object} maxSize - Max size parameters (width and height).\n * @param {boolean} isVR - If in VR.\n * @returns {object} Width and height.\n */\nfunction getMaxSize (maxSize, isVR) {\n var aspectRatio;\n var size;\n var pixelRatio = window.devicePixelRatio;\n\n size = {height: document.body.offsetHeight, width: document.body.offsetWidth};\n if (!maxSize || isVR || (maxSize.width === -1 && maxSize.height === -1)) {\n return size;\n }\n\n if (size.width * pixelRatio < maxSize.width &&\n size.height * pixelRatio < maxSize.height) {\n return size;\n }\n\n aspectRatio = size.width / size.height;\n\n if ((size.width * pixelRatio) > maxSize.width && maxSize.width !== -1) {\n size.width = Math.round(maxSize.width / pixelRatio);\n size.height = Math.round(maxSize.width / aspectRatio / pixelRatio);\n }\n\n if ((size.height * pixelRatio) > maxSize.height && maxSize.height !== -1) {\n size.height = Math.round(maxSize.height / pixelRatio);\n size.width = Math.round(maxSize.height * aspectRatio / pixelRatio);\n }\n\n return size;\n}\n\nfunction requestFullscreen (canvas) {\n var requestFullscreen =\n canvas.requestFullscreen ||\n canvas.webkitRequestFullscreen ||\n canvas.mozRequestFullScreen || // The capitalized `S` is not a typo.\n canvas.msRequestFullscreen;\n requestFullscreen.apply(canvas);\n}\n\nfunction exitFullscreen () {\n if (document.exitFullscreen) {\n document.exitFullscreen();\n } else if (document.mozCancelFullScreen) {\n document.mozCancelFullScreen();\n } else if (document.webkitExitFullscreen) {\n document.webkitExitFullscreen();\n }\n}\n\nfunction setupCanvas (sceneEl) {\n var canvasEl;\n\n canvasEl = document.createElement('canvas');\n canvasEl.classList.add('a-canvas');\n // Mark canvas as provided/injected by A-Frame.\n canvasEl.dataset.aframeCanvas = true;\n sceneEl.appendChild(canvasEl);\n\n document.addEventListener('fullscreenchange', onFullScreenChange);\n document.addEventListener('mozfullscreenchange', onFullScreenChange);\n document.addEventListener('webkitfullscreenchange', onFullScreenChange);\n\n // Prevent overscroll on mobile.\n canvasEl.addEventListener('touchmove', function (event) { event.preventDefault(); });\n\n // Set canvas on scene.\n sceneEl.canvas = canvasEl;\n sceneEl.emit('render-target-loaded', {target: canvasEl});\n // For unknown reasons a synchronous resize does not work on desktop when\n // entering/exiting fullscreen.\n setTimeout(bind(sceneEl.resize, sceneEl), 0);\n\n function onFullScreenChange () {\n var fullscreenEl =\n document.fullscreenElement ||\n document.mozFullScreenElement ||\n document.webkitFullscreenElement;\n // No fullscren element === exit fullscreen\n if (!fullscreenEl) { sceneEl.exitVR(); }\n document.activeElement.blur();\n document.body.focus();\n }\n}\nmodule.exports.setupCanvas = setupCanvas; // For testing.\n", - "/* global THREE */\nvar utils = require('../../utils/');\nvar styleParser = utils.styleParser;\n\nvar sceneEl;\nvar raf;\nvar titleEl;\nvar getSceneCanvasSize;\n\nvar ATTR_NAME = 'loading-screen';\nvar LOADER_TITLE_CLASS = 'a-loader-title';\n\n// It catches vrdisplayactivate early to ensure we can enter VR mode after the scene loads.\nwindow.addEventListener('vrdisplayactivate', function () {\n var vrManager = sceneEl.renderer.vr;\n var vrDisplay = utils.device.getVRDisplay();\n\n vrManager.setDevice(vrDisplay);\n vrManager.enabled = true;\n if (!vrDisplay.isPresenting) {\n return vrDisplay.requestPresent([{source: sceneEl.canvas}]).then(function () {}, function () {});\n }\n});\n\nmodule.exports.setup = function setup (el, getCanvasSize) {\n sceneEl = el;\n getSceneCanvasSize = getCanvasSize;\n var loaderAttribute = sceneEl.hasAttribute(ATTR_NAME) ? styleParser.parse(sceneEl.getAttribute(ATTR_NAME)) : undefined;\n var dotsColor = loaderAttribute && loaderAttribute.dotsColor || 'white';\n var backgroundColor = loaderAttribute && loaderAttribute.backgroundColor || '#24CAFF';\n var loaderEnabled = loaderAttribute === undefined || loaderAttribute.enabled === true || loaderAttribute.enabled === undefined; // true default\n var loaderScene;\n var sphereGeometry;\n var sphereMaterial;\n var sphereMesh1;\n var sphereMesh2;\n var sphereMesh3;\n var camera;\n var clock;\n var time;\n var render;\n\n if (!loaderEnabled) { return; }\n\n // Setup Scene.\n loaderScene = new THREE.Scene();\n sphereGeometry = new THREE.SphereGeometry(0.20, 36, 18, 0, 2 * Math.PI, 0, Math.PI);\n sphereMaterial = new THREE.MeshBasicMaterial({color: dotsColor});\n sphereMesh1 = new THREE.Mesh(sphereGeometry, sphereMaterial);\n sphereMesh2 = sphereMesh1.clone();\n sphereMesh3 = sphereMesh1.clone();\n camera = new THREE.PerspectiveCamera(80, window.innerWidth / window.innerHeight, 0.0005, 10000);\n clock = new THREE.Clock();\n time = 0;\n render = function () {\n raf = sceneEl.effect.requestAnimationFrame(render);\n sceneEl.effect.render(loaderScene, camera);\n time = clock.getElapsedTime() % 4;\n sphereMesh1.visible = time >= 1;\n sphereMesh2.visible = time >= 2;\n sphereMesh3.visible = time >= 3;\n };\n\n loaderScene.background = new THREE.Color(backgroundColor);\n loaderScene.add(camera);\n sphereMesh1.position.set(-1, 0, -15);\n sphereMesh2.position.set(0, 0, -15);\n sphereMesh3.position.set(1, 0, -15);\n camera.add(sphereMesh1);\n camera.add(sphereMesh2);\n camera.add(sphereMesh3);\n setupTitle();\n\n // Delay 200ms to avoid loader flashes.\n setTimeout(function () {\n if (sceneEl.hasLoaded) { return; }\n resize(camera);\n titleEl.style.display = 'block';\n window.addEventListener('resize', function () { resize(camera); });\n render();\n }, 200);\n};\n\nmodule.exports.remove = function remove () {\n window.removeEventListener('resize', resize);\n if (!titleEl) { return; }\n // Hide title.\n titleEl.style.display = 'none';\n sceneEl.effect.cancelAnimationFrame(raf);\n};\n\nfunction resize (camera) {\n var size = getSceneCanvasSize(sceneEl.canvas, false, sceneEl.maxCanvasSize, sceneEl.is('vr-mode'));\n camera.aspect = size.width / size.height;\n camera.updateProjectionMatrix();\n // Notify renderer of size change.\n sceneEl.renderer.setSize(size.width, size.height, false);\n}\n\nfunction setupTitle () {\n titleEl = document.createElement('div');\n titleEl.className = LOADER_TITLE_CLASS;\n titleEl.innerHTML = document.title;\n titleEl.style.display = 'none';\n sceneEl.appendChild(titleEl);\n}\n", + "/* global THREE */\nvar utils = require('../../utils/');\nvar styleParser = utils.styleParser;\n\nvar sceneEl;\nvar raf;\nvar titleEl;\nvar getSceneCanvasSize;\n\nvar ATTR_NAME = 'loading-screen';\nvar LOADER_TITLE_CLASS = 'a-loader-title';\n\n// It catches vrdisplayactivate early to ensure we can enter VR mode after the scene loads.\n// window.addEventListener('vrdisplayactivate', function () {\n// var vrManager = sceneEl.renderer.vr;\n// var vrDisplay = utils.device.getVRDisplay();\n\n// vrManager.setDevice(vrDisplay);\n// vrManager.enabled = true;\n// if (!vrDisplay.isPresenting) {\n// return vrDisplay.requestPresent([{source: sceneEl.canvas}]).then(function () {}, function () {});\n// }\n// });\n\nmodule.exports.setup = function setup (el, getCanvasSize) {\n sceneEl = el;\n getSceneCanvasSize = getCanvasSize;\n var loaderAttribute = sceneEl.hasAttribute(ATTR_NAME) ? styleParser.parse(sceneEl.getAttribute(ATTR_NAME)) : undefined;\n var dotsColor = loaderAttribute && loaderAttribute.dotsColor || 'white';\n var backgroundColor = loaderAttribute && loaderAttribute.backgroundColor || '#24CAFF';\n var loaderEnabled = loaderAttribute === undefined || loaderAttribute.enabled === true || loaderAttribute.enabled === undefined; // true default\n var loaderScene;\n var sphereGeometry;\n var sphereMaterial;\n var sphereMesh1;\n var sphereMesh2;\n var sphereMesh3;\n var camera;\n var clock;\n var time;\n var render;\n\n if (!loaderEnabled) { return; }\n\n // Setup Scene.\n loaderScene = new THREE.Scene();\n sphereGeometry = new THREE.SphereGeometry(0.20, 36, 18, 0, 2 * Math.PI, 0, Math.PI);\n sphereMaterial = new THREE.MeshBasicMaterial({color: dotsColor});\n sphereMesh1 = new THREE.Mesh(sphereGeometry, sphereMaterial);\n sphereMesh2 = sphereMesh1.clone();\n sphereMesh3 = sphereMesh1.clone();\n camera = new THREE.PerspectiveCamera(80, window.innerWidth / window.innerHeight, 0.0005, 10000);\n clock = new THREE.Clock();\n time = 0;\n render = function () {\n raf = sceneEl.effect.requestAnimationFrame(render);\n sceneEl.effect.render(loaderScene, camera);\n time = clock.getElapsedTime() % 4;\n sphereMesh1.visible = time >= 1;\n sphereMesh2.visible = time >= 2;\n sphereMesh3.visible = time >= 3;\n };\n\n loaderScene.background = new THREE.Color(backgroundColor);\n loaderScene.add(camera);\n sphereMesh1.position.set(-1, 0, -15);\n sphereMesh2.position.set(0, 0, -15);\n sphereMesh3.position.set(1, 0, -15);\n camera.add(sphereMesh1);\n camera.add(sphereMesh2);\n camera.add(sphereMesh3);\n setupTitle();\n\n // Delay 200ms to avoid loader flashes.\n setTimeout(function () {\n if (sceneEl.hasLoaded) { return; }\n resize(camera);\n titleEl.style.display = 'block';\n window.addEventListener('resize', function () { resize(camera); });\n render();\n }, 200);\n};\n\nmodule.exports.remove = function remove () {\n window.removeEventListener('resize', resize);\n if (!titleEl) { return; }\n // Hide title.\n titleEl.style.display = 'none';\n sceneEl.effect.cancelAnimationFrame(raf);\n};\n\nfunction resize (camera) {\n var size = getSceneCanvasSize(sceneEl.canvas, false, sceneEl.maxCanvasSize, sceneEl.is('vr-mode'));\n camera.aspect = size.width / size.height;\n camera.updateProjectionMatrix();\n // Notify renderer of size change.\n sceneEl.renderer.setSize(size.width, size.height, false);\n}\n\nfunction setupTitle () {\n titleEl = document.createElement('div');\n titleEl.className = LOADER_TITLE_CLASS;\n titleEl.innerHTML = document.title;\n titleEl.style.display = 'none';\n sceneEl.appendChild(titleEl);\n}\n", "var constants = require('../../constants/');\nvar extend = require('../../utils').extend;\n\nvar MOBILE_HEAD_TAGS = module.exports.MOBILE_HEAD_TAGS = [\n Meta({name: 'viewport', content: 'width=device-width,initial-scale=1,maximum-scale=1,shrink-to-fit=no,user-scalable=no,minimal-ui'}),\n\n // W3C-standardised meta tags.\n Meta({name: 'mobile-web-app-capable', content: 'yes'}),\n Meta({name: 'theme-color', content: 'black'})\n];\n\nvar MOBILE_IOS_HEAD_TAGS = [\n // iOS-specific meta tags for fullscreen when pinning to homescreen.\n Meta({name: 'apple-mobile-web-app-capable', content: 'yes'}),\n Meta({name: 'apple-mobile-web-app-status-bar-style', content: 'black'}),\n Link({rel: 'apple-touch-icon', href: 'https://aframe.io/images/aframe-logo-152.png'})\n];\n\nfunction Meta (attrs) {\n return {\n tagName: 'meta',\n attributes: attrs,\n exists: function () { return document.querySelector('meta[name=\"' + attrs.name + '\"]'); }\n };\n}\n\nfunction Link (attrs) {\n return {\n tagName: 'link',\n attributes: attrs,\n exists: function () { return document.querySelector('link[rel=\"' + attrs.rel + '\"]'); }\n };\n}\n\n/**\n * Injects the necessary metatags in the document for mobile support:\n * 1. Prevent the user to zoom in the document.\n * 2. Ensure that window.innerWidth and window.innerHeight have the correct\n * values and the canvas is properly scaled.\n * 3. To allow fullscreen mode when pinning a web app on the home screen on\n * iOS.\n * Adapted from https://www.reddit.com/r/web_design/comments/3la04p/\n *\n * @param {object} scene - Scene element\n * @returns {Array}\n */\nmodule.exports.inject = function injectHeadTags (scene) {\n var headEl = document.head;\n var headScriptEl = headEl.querySelector('script');\n var tag;\n var headTags = [];\n MOBILE_HEAD_TAGS.forEach(createAndInjectTag);\n if (scene.isIOS) {\n MOBILE_IOS_HEAD_TAGS.forEach(createAndInjectTag);\n }\n return headTags;\n\n function createAndInjectTag (tagObj) {\n if (!tagObj || tagObj.exists()) { return; }\n\n tag = createTag(tagObj);\n if (!tag) { return; }\n\n if (headScriptEl) {\n headScriptEl.parentNode.insertBefore(tag, headScriptEl);\n } else {\n headEl.appendChild(tag);\n }\n\n headTags.push(tag);\n }\n};\n\nfunction createTag (tagObj) {\n if (!tagObj || !tagObj.tagName) { return; }\n var meta = document.createElement(tagObj.tagName);\n meta.setAttribute(constants.AFRAME_INJECTED, '');\n return extend(meta, tagObj.attributes);\n}\n", "var bind = require('../../utils/bind');\nvar isIframed = require('../../utils/').isIframed;\n\n/**\n * Provides a post message API for scenes contained\n * in an iframe.\n */\nmodule.exports = function initPostMessageAPI (scene) {\n // Handles fullscreen behavior when inside an iframe.\n if (!isIframed()) { return; }\n // postMessage API handler\n window.addEventListener('message', bind(postMessageAPIHandler, scene));\n};\n\nfunction postMessageAPIHandler (event) {\n var scene = this;\n if (!event.data) { return; }\n\n switch (event.data.type) {\n case 'vr': {\n switch (event.data.data) {\n case 'enter':\n scene.enterVR();\n break;\n case 'exit':\n scene.exitVR();\n break;\n }\n }\n }\n}\n", "/*\n Scene index for keeping track of created scenes.\n*/\nmodule.exports = [];\n", @@ -364,7 +364,7 @@ "var registerGeometry = require('../core/geometry').registerGeometry;\nvar THREE = require('../lib/three');\n\nvar degToRad = THREE.Math.degToRad;\n\nregisterGeometry('torus', {\n schema: {\n arc: {default: 360},\n radius: {default: 1, min: 0},\n radiusTubular: {default: 0.2, min: 0},\n segmentsRadial: {default: 36, min: 2, type: 'int'},\n segmentsTubular: {default: 32, min: 3, type: 'int'}\n },\n\n init: function (data) {\n this.geometry = new THREE.TorusGeometry(\n data.radius, data.radiusTubular * 2, data.segmentsRadial, data.segmentsTubular,\n degToRad(data.arc));\n }\n});\n", "var registerGeometry = require('../core/geometry').registerGeometry;\nvar THREE = require('../lib/three');\n\nregisterGeometry('torusKnot', {\n schema: {\n p: {default: 2, min: 1},\n q: {default: 3, min: 1},\n radius: {default: 1, min: 0},\n radiusTubular: {default: 0.2, min: 0},\n segmentsRadial: {default: 8, min: 3, type: 'int'},\n segmentsTubular: {default: 100, min: 3, type: 'int'}\n },\n\n init: function (data) {\n this.geometry = new THREE.TorusKnotGeometry(\n data.radius, data.radiusTubular * 2, data.segmentsTubular, data.segmentsRadial,\n data.p, data.q);\n }\n});\n", "var registerGeometry = require('../core/geometry').registerGeometry;\nvar THREE = require('../lib/three');\n\nvar quaternion = new THREE.Quaternion();\nvar rotateVector = new THREE.Vector3(0, 0, 1);\nvar uvMinVector = new THREE.Vector2();\nvar uvMaxVector = new THREE.Vector2();\nvar uvScaleVector = new THREE.Vector2();\n\nregisterGeometry('triangle', {\n schema: {\n vertexA: {type: 'vec3', default: {x: 0, y: 0.5, z: 0}},\n vertexB: {type: 'vec3', default: {x: -0.5, y: -0.5, z: 0}},\n vertexC: {type: 'vec3', default: {x: 0.5, y: -0.5, z: 0}}\n },\n\n init: function (data) {\n var geometry;\n var normal;\n var triangle;\n var uvA;\n var uvB;\n var uvC;\n\n triangle = new THREE.Triangle();\n triangle.a.set(data.vertexA.x, data.vertexA.y, data.vertexA.z);\n triangle.b.set(data.vertexB.x, data.vertexB.y, data.vertexB.z);\n triangle.c.set(data.vertexC.x, data.vertexC.y, data.vertexC.z);\n normal = triangle.getNormal(new THREE.Vector3());\n\n // Rotate the 3D triangle to be parallel to XY plane.\n quaternion.setFromUnitVectors(normal, rotateVector);\n uvA = triangle.a.clone().applyQuaternion(quaternion);\n uvB = triangle.b.clone().applyQuaternion(quaternion);\n uvC = triangle.c.clone().applyQuaternion(quaternion);\n\n // Compute UVs.\n // Normalize x/y values of UV so they are within 0 to 1.\n uvMinVector.set(Math.min(uvA.x, uvB.x, uvC.x), Math.min(uvA.y, uvB.y, uvC.y));\n uvMaxVector.set(Math.max(uvA.x, uvB.x, uvC.x), Math.max(uvA.y, uvB.y, uvC.y));\n uvScaleVector.set(0, 0).subVectors(uvMaxVector, uvMinVector);\n uvA = new THREE.Vector2().subVectors(uvA, uvMinVector).divide(uvScaleVector);\n uvB = new THREE.Vector2().subVectors(uvB, uvMinVector).divide(uvScaleVector);\n uvC = new THREE.Vector2().subVectors(uvC, uvMinVector).divide(uvScaleVector);\n\n geometry = this.geometry = new THREE.Geometry();\n geometry.vertices.push(triangle.a);\n geometry.vertices.push(triangle.b);\n geometry.vertices.push(triangle.c);\n geometry.faces.push(new THREE.Face3(0, 1, 2, normal));\n geometry.faceVertexUvs[0] = [[uvA, uvB, uvC]];\n }\n});\n", - "// Check before the polyfill runs.\nwindow.hasNativeWebVRImplementation = !!window.navigator.getVRDisplays || !!window.navigator.getVRDevices;\n\n// WebVR polyfill\nvar WebVRPolyfill = require('webvr-polyfill');\nwindow.webvrpolyfill = new WebVRPolyfill({\n BUFFER_SCALE: 1,\n CARDBOARD_UI_DISABLED: true,\n ROTATE_INSTRUCTIONS_DISABLED: true\n});\n\nvar utils = require('./utils/');\n\nvar debug = utils.debug;\nvar error = debug('A-Frame:error');\nvar warn = debug('A-Frame:warn');\n\nif (window.document.currentScript && window.document.currentScript.parentNode !==\n window.document.head && !window.debug) {\n warn('Put the A-Frame