-
Notifications
You must be signed in to change notification settings - Fork 0
/
__game-scripts.js.map
1 lines (1 loc) · 134 KB
/
__game-scripts.js.map
1
{"version":3,"sources":["scripts/touch-input.js","scripts/wonderingEye.js","scripts/bloom.js","scripts/hud.js","scripts/loadingscreen.js","scripts/selectionCursor.js","scripts/rigidbody-extensions.js","scripts/iframe-plane.js","materials/controlsButton.js","scripts/selectableMedia.js","scripts/hoverLabel.js","scripts/mediaObject.js","scripts/shortcutObject.js","scripts/shortcutButton.js","channelManager.js","scripts/video-texture.js","scripts/tv-screen.js","scripts/lazyClock.js","scripts/spin.js"],"names":[],"mappings":"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","sourcesContent":["// touch-input.js\nvar TouchInput = pc.createScript('touchInput');\n\nTouchInput.attributes.add('orbitSensitivity', {\n type: 'number', \n default: 0.4, \n title: 'Orbit Sensitivity', \n description: 'How fast the camera moves around the orbit. Higher is faster'\n});\n\nTouchInput.attributes.add('distanceSensitivity', {\n type: 'number', \n default: 0.2, \n title: 'Distance Sensitivity', \n description: 'How fast the camera moves in and out. Higher is faster'\n});\n\nTouchInput.attributes.add('cameraEntity', {type: 'entity'});\n\n// initialize code called once per entity\nTouchInput.prototype.initialize = function() {\n //this.orbitCamera = this.entity.script.orbitCamera;\n this.orbitCamera = this.cameraEntity;\n \n // Store the position of the touch so we can calculate the distance moved\n this.firstTouchPoint = new pc.Vec2();\n this.lastTouchPoint = new pc.Vec2();\n this.utilVec = new pc.Vec2();\n this.lastPinchMidPoint = new pc.Vec2();\n this.lastPinchDistance = 0;\n //console.log(this.orbitCamera);\n //console.log(this.app.touch);\n if (this.orbitCamera && this.app.touch) {\n // Use the same callback for the touchStart, touchEnd and touchCancel events as they \n // all do the same thing which is to deal the possible multiple touches to the screen\n this.app.touch.on(pc.EVENT_TOUCHSTART, this.onTouchStartEndCancel, this);\n this.app.touch.on(pc.EVENT_TOUCHEND, this.onTouchStartEndCancel, this);\n this.app.touch.on(pc.EVENT_TOUCHCANCEL, this.onTouchStartEndCancel, this);\n \n this.app.touch.on(pc.EVENT_TOUCHMOVE, this.onTouchMove, this);\n \n this.on('destroy', function() {\n this.app.touch.off(pc.EVENT_TOUCHSTART, this.onTouchStartEndCancel, this);\n this.app.touch.off(pc.EVENT_TOUCHEND, this.onTouchStartEndCancel, this);\n this.app.touch.off(pc.EVENT_TOUCHCANCEL, this.onTouchStartEndCancel, this);\n\n this.app.touch.off(pc.EVENT_TOUCHMOVE, this.onTouchMove, this);\n });\n }\n};\n\n\nTouchInput.prototype.getPinchDistance = function (pointA, pointB) {\n // Return the distance between the two points\n var dx = pointA.x - pointB.x;\n var dy = pointA.y - pointB.y; \n \n return Math.sqrt((dx * dx) + (dy * dy));\n};\n\n\nTouchInput.prototype.calcMidPoint = function (pointA, pointB, result) {\n result.set(pointB.x - pointA.x, pointB.y - pointA.y);\n result.scale(0.5);\n result.x += pointA.x;\n result.y += pointA.y;\n};\n\n\nTouchInput.prototype.onTouchStartEndCancel = function(event) {\n //var canvas = document.body.querySelector('#application-canvas');\n //canvas.requestFullscreen();\n document.documentElement.requestFullscreen();\n\n // We only care about the first touch for camera rotation. As the user touches the screen, \n // we stored the current touch position\n var touches = event.touches;\n if (touches.length == 1) {\n this.firstTouchPoint.set(touches[0].x, touches[0].y);\n this.lastTouchPoint.set(touches[0].x, touches[0].y);\n \n } else if (touches.length == 2) {\n // If there are 2 touches on the screen, then set the pinch distance\n this.lastPinchDistance = this.getPinchDistance(touches[0], touches[1]);\n this.calcMidPoint(touches[0], touches[1], this.lastPinchMidPoint);\n }\n};\n\n\nTouchInput.fromWorldPoint = new pc.Vec3();\nTouchInput.toWorldPoint = new pc.Vec3();\nTouchInput.worldDiff = new pc.Vec3();\n\n\nTouchInput.prototype.pan = function(midPoint) {\n var fromWorldPoint = TouchInput.fromWorldPoint;\n var toWorldPoint = TouchInput.toWorldPoint;\n var worldDiff = TouchInput.worldDiff;\n \n // For panning to work at any zoom level, we use screen point to world projection\n // to work out how far we need to pan the pivotEntity in world space \n var camera = this.entity.camera;\n var distance = this.orbitCamera.distance;\n \n camera.screenToWorld(midPoint.x, midPoint.y, distance, fromWorldPoint);\n camera.screenToWorld(this.lastPinchMidPoint.x, this.lastPinchMidPoint.y, distance, toWorldPoint);\n \n worldDiff.sub2(toWorldPoint, fromWorldPoint);\n \n //this.orbitCamera.pivotPoint.add(worldDiff); \n};\n\n\nTouchInput.pinchMidPoint = new pc.Vec2();\n\nTouchInput.prototype.onTouchMove = function(event) {\n var pinchMidPoint = TouchInput.pinchMidPoint;\n \n // We only care about the first touch for camera rotation. Work out the difference moved since the last event\n // and use that to update the camera target position \n var touches = event.touches;\n if (touches.length == 1) {\n var touch = touches[0];\n this.orbitCamera.pitch -= (touch.y - this.lastTouchPoint.y) * this.orbitSensitivity;\n this.orbitCamera.yaw -= (touch.x - this.lastTouchPoint.x) * this.orbitSensitivity;\n \n this.utilVec.set(touch.x, touch.y);\n if( this.utilVec.distance(this.lastTouchPoint) > 1 ) {\n this.app.fire('touch:move', {screen: {x: touch.x, y: touch.y}});//, startX: this.startTouchPoint.x, startY: this.startTouchPoint.y}\n //this.app.fire('cursor:move:global', {raycast: null, screen: {x: touch.x, y: touch.y}});\n }\n this.lastTouchPoint.set(touch.x, touch.y);\n \n } else if (touches.length == 2) {\n // Calculate the difference in pinch distance since the last event\n var currentPinchDistance = this.getPinchDistance(touches[0], touches[1]);\n var diffInPinchDistance = currentPinchDistance - this.lastPinchDistance;\n this.lastPinchDistance = currentPinchDistance;\n \n //this.orbitCamera.distance -= (diffInPinchDistance * this.distanceSensitivity * 0.1) * (this.orbitCamera.distance * 0.1);\n if( diffInPinchDistance > 0 ) {\n this.app.fire('cursor:wheel:global', -1, this);\n }\n else if( diffInPinchDistance < 0 ) {\n this.app.fire('cursor:wheel:global', 1, this);\n }\n \n // Calculate pan difference\n this.calcMidPoint(touches[0], touches[1], pinchMidPoint);\n this.pan(pinchMidPoint);\n this.lastPinchMidPoint.copy(pinchMidPoint);\n }\n};\n\n\n","// wonderingEye.js\nvar WonderingEye = pc.createScript('wonderingEye');\n\nWonderingEye.attributes.add('camera', {type: 'entity'});\n\n// initialize code called once per entity\nWonderingEye.prototype.initialize = function() {\n //this.app.mouse.on(pc.EVENT_MOUSEMOVE, this.onMouseMove, this);\n //this.app.on('touch:move', this.onMouseMove, this);\n this.app.on('cursor:move:global', this.onCursorMoveGlobal, this);\n this.app.on('cursor:wheel:global', this.onCursorWheelGlobal, this);\n //this.app.mouse.on(pc.EVENT_MOUSEWHEEL, this.onMouseWheel, this);\n this.originalEulers = this.entity.getEulerAngles();\n this.rotation = new pc.Quat();\n this.targetRotation = new pc.Quat();\n this.originRotation = new pc.Quat();\n this.lerpDuration = 0.5;\n this.lerpActive = false;\n};\n\nWonderingEye.prototype.postInitialize = function() {\n //if( this.app.qualitySettings.preset == 'low' ) {\n this.camera.camera.fov = 80;\n //}\n};\n\n//WonderingEye.prototype.onMouseMove = function(e) {\nWonderingEye.prototype.onCursorMoveGlobal = function(opts) {\n if( this.app.inputPaused ) {\n return;\n }\n\n var horizontal = opts.screen.x / window.innerWidth;\n var vertical = opts.screen.y / window.innerHeight;\n //if( e.hasOwnProperty('startX') ) {\n // TODO: Make it kind of slide in the direction you are pulling.\n // The further you pull from where you 1st touched, the faster the camera tries to spin that direction.\n //console.log(\"TODO: Add touch support!\");\n //}\n var factorHorizontal = (horizontal - 0.5);\n var factorVertical = (vertical - 0.5);\n var maxLookHorizontal = 20 * 3;\n var maxLookVertical = 3 * 4;\n //this.camera.setLocalEulerAngles((-maxLookVertical * factorVertical)-3, -maxLookHorizontal * factorHorizontal, 0);\n \n // setup a new lerp\n var temp = this.entity.getRotation();\n this.originRotation.set(temp.x, temp.y, temp.z, temp.w);\n this.targetRotation.setFromEulerAngles(this.originalEulers.x + ((-maxLookVertical * factorVertical)-3), this.originalEulers.y + (-maxLookHorizontal * factorHorizontal), 0);\n this.lerpElapsed = 0;\n this.lerpActive = true;\n};\n\nWonderingEye.prototype.onCursorWheelGlobal = function(delta) {\n this.onMouseWheel({wheelDelta: delta});\n};\n\nWonderingEye.prototype.onMouseWheel = function(e) {\n var fovMax = 90;\n var fovMin = 40;\n var delta = e.wheelDelta;\n var fov = this.camera.camera.fov;\n if( delta > 0 ) {\n if( fov + 1 <= fovMax ) {\n fov += 1;\n }\n }\n else {\n if( fov - 1 >= fovMin ) {\n fov -= 1;\n }\n }\n this.camera.camera.fov = fov;\n};\n\nWonderingEye.prototype.update = function(dt) {\n if( this.lerpActive ) {\n this.lerpElapsed += dt;\n var amount = this.lerpElapsed / this.lerpDuration;\n if( amount >= 1 ) {\n amount = 1;\n this.lerpActive = false;\n }\n \n this.rotation.slerp(this.originRotation, this.targetRotation, amount);\n this.camera.setRotation(this.rotation.x, this.rotation.y, this.rotation.z, this.rotation.w);\n }\n};\n\n","// bloom.js\n// --------------- POST EFFECT DEFINITION --------------- //\nObject.assign(pc, function () {\n var SAMPLE_COUNT = 15;\n\n function computeGaussian(n, theta) {\n return ((1.0 / Math.sqrt(2 * Math.PI * theta)) * Math.exp(-(n * n) / (2 * theta * theta)));\n }\n\n function calculateBlurValues(sampleWeights, sampleOffsets, dx, dy, blurAmount) {\n // Look up how many samples our gaussian blur effect supports.\n\n // Create temporary arrays for computing our filter settings.\n // The first sample always has a zero offset.\n sampleWeights[0] = computeGaussian(0, blurAmount);\n sampleOffsets[0] = 0;\n sampleOffsets[1] = 0;\n\n // Maintain a sum of all the weighting values.\n var totalWeights = sampleWeights[0];\n\n // Add pairs of additional sample taps, positioned\n // along a line in both directions from the center.\n var i, len;\n for (i = 0, len = Math.floor(SAMPLE_COUNT / 2); i < len; i++) {\n // Store weights for the positive and negative taps.\n var weight = computeGaussian(i + 1, blurAmount);\n sampleWeights[i * 2] = weight;\n sampleWeights[i * 2 + 1] = weight;\n totalWeights += weight * 2;\n\n // To get the maximum amount of blurring from a limited number of\n // pixel shader samples, we take advantage of the bilinear filtering\n // hardware inside the texture fetch unit. If we position our texture\n // coordinates exactly halfway between two texels, the filtering unit\n // will average them for us, giving two samples for the price of one.\n // This allows us to step in units of two texels per sample, rather\n // than just one at a time. The 1.5 offset kicks things off by\n // positioning us nicely in between two texels.\n var sampleOffset = i * 2 + 1.5;\n\n // Store texture coordinate offsets for the positive and negative taps.\n sampleOffsets[i * 4] = dx * sampleOffset;\n sampleOffsets[i * 4 + 1] = dy * sampleOffset;\n sampleOffsets[i * 4 + 2] = -dx * sampleOffset;\n sampleOffsets[i * 4 + 3] = -dy * sampleOffset;\n }\n\n // Normalize the list of sample weightings, so they will always sum to one.\n for (i = 0, len = sampleWeights.length; i < len; i++) {\n sampleWeights[i] /= totalWeights;\n }\n }\n\n /**\n * @class\n * @name pc.BloomEffect\n * @classdesc Implements the BloomEffect post processing effect.\n * @description Creates new instance of the post effect.\n * @augments pc.PostEffect\n * @param {pc.GraphicsDevice} graphicsDevice - The graphics device of the application.\n * @property {number} bloomThreshold Only pixels brighter then this threshold will be processed. Ranges from 0 to 1.\n * @property {number} blurAmount Controls the amount of blurring.\n * @property {number} bloomIntensity The intensity of the effect.\n */\n var BloomEffect = function (graphicsDevice) {\n pc.PostEffect.call(this, graphicsDevice);\n\n // Shaders\n var attributes = {\n aPosition: pc.SEMANTIC_POSITION\n };\n\n var passThroughVert = [\n \"attribute vec2 aPosition;\",\n \"\",\n \"varying vec2 vUv0;\",\n \"\",\n \"void main(void)\",\n \"{\",\n \" gl_Position = vec4(aPosition, 0.0, 1.0);\",\n \" vUv0 = (aPosition + 1.0) * 0.5;\",\n \"}\"\n ].join(\"\\n\");\n\n // Pixel shader extracts the brighter areas of an image.\n // This is the first step in applying a bloom postprocess.\n var bloomExtractFrag = [\n \"precision \" + graphicsDevice.precision + \" float;\",\n \"\",\n \"varying vec2 vUv0;\",\n \"\",\n \"uniform sampler2D uBaseTexture;\",\n \"uniform float uBloomThreshold;\",\n \"\",\n \"void main(void)\",\n \"{\",\n // Look up the original image color.\n \" vec4 color = texture2D(uBaseTexture, vUv0);\",\n \"\",\n // Adjust it to keep only values brighter than the specified threshold.\n \" gl_FragColor = clamp((color - uBloomThreshold) / (1.0 - uBloomThreshold), 0.0, 1.0);\",\n \"}\"\n ].join(\"\\n\");\n\n // Pixel shader applies a one dimensional gaussian blur filter.\n // This is used twice by the bloom postprocess, first to\n // blur horizontally, and then again to blur vertically.\n var gaussianBlurFrag = [\n \"precision \" + graphicsDevice.precision + \" float;\",\n \"\",\n \"#define SAMPLE_COUNT \" + SAMPLE_COUNT,\n \"\",\n \"varying vec2 vUv0;\",\n \"\",\n \"uniform sampler2D uBloomTexture;\",\n \"uniform vec2 uBlurOffsets[SAMPLE_COUNT];\",\n \"uniform float uBlurWeights[SAMPLE_COUNT];\",\n \"\",\n \"void main(void)\",\n \"{\",\n \" vec4 color = vec4(0.0);\",\n // Combine a number of weighted image filter taps.\n \" for (int i = 0; i < SAMPLE_COUNT; i++)\",\n \" {\",\n \" color += texture2D(uBloomTexture, vUv0 + uBlurOffsets[i]) * uBlurWeights[i];\",\n \" }\",\n \"\",\n \" gl_FragColor = color;\",\n \"}\"\n ].join(\"\\n\");\n\n // Pixel shader combines the bloom image with the original\n // scene, using tweakable intensity levels.\n // This is the final step in applying a bloom postprocess.\n var bloomCombineFrag = [\n \"precision \" + graphicsDevice.precision + \" float;\",\n \"\",\n \"varying vec2 vUv0;\",\n \"\",\n \"uniform float uBloomEffectIntensity;\",\n \"uniform sampler2D uBaseTexture;\",\n \"uniform sampler2D uBloomTexture;\",\n \"\",\n \"void main(void)\",\n \"{\",\n // Look up the bloom and original base image colors.\n \" vec4 bloom = texture2D(uBloomTexture, vUv0) * uBloomEffectIntensity;\",\n \" vec4 base = texture2D(uBaseTexture, vUv0);\",\n \"\",\n // Darken down the base image in areas where there is a lot of bloom,\n // to prevent things looking excessively burned-out.\n \" base *= (1.0 - clamp(bloom, 0.0, 1.0));\",\n \"\",\n // Combine the two images.\n \" gl_FragColor = base + bloom;\",\n \"}\"\n ].join(\"\\n\");\n\n this.extractShader = new pc.Shader(graphicsDevice, {\n attributes: attributes,\n vshader: passThroughVert,\n fshader: bloomExtractFrag\n });\n this.blurShader = new pc.Shader(graphicsDevice, {\n attributes: attributes,\n vshader: passThroughVert,\n fshader: gaussianBlurFrag\n });\n this.combineShader = new pc.Shader(graphicsDevice, {\n attributes: attributes,\n vshader: passThroughVert,\n fshader: bloomCombineFrag\n });\n\n // Render targets\n var width = graphicsDevice.width;\n var height = graphicsDevice.height;\n this.targets = [];\n for (var i = 0; i < 2; i++) {\n var colorBuffer = new pc.Texture(graphicsDevice, {\n format: pc.PIXELFORMAT_R8_G8_B8_A8,\n width: width >> 1,\n height: height >> 1\n });\n colorBuffer.minFilter = pc.FILTER_LINEAR;\n colorBuffer.magFilter = pc.FILTER_LINEAR;\n colorBuffer.addressU = pc.ADDRESS_CLAMP_TO_EDGE;\n colorBuffer.addressV = pc.ADDRESS_CLAMP_TO_EDGE;\n colorBuffer.name = 'pe-bloom';\n var target = new pc.RenderTarget(graphicsDevice, colorBuffer, { depth: false });\n\n this.targets.push(target);\n }\n\n // Effect defaults\n this.bloomThreshold = 0.25;\n this.blurAmount = 4;\n this.bloomIntensity = 1.25;\n\n // Uniforms\n this.sampleWeights = new Float32Array(SAMPLE_COUNT);\n this.sampleOffsets = new Float32Array(SAMPLE_COUNT * 2);\n };\n\n BloomEffect.prototype = Object.create(pc.PostEffect.prototype);\n BloomEffect.prototype.constructor = BloomEffect;\n\n Object.assign(BloomEffect.prototype, {\n render: function (inputTarget, outputTarget, rect) {\n var device = this.device;\n var scope = device.scope;\n\n // Pass 1: draw the scene into rendertarget 1, using a\n // shader that extracts only the brightest parts of the image.\n scope.resolve(\"uBloomThreshold\").setValue(this.bloomThreshold);\n scope.resolve(\"uBaseTexture\").setValue(inputTarget.colorBuffer);\n pc.drawFullscreenQuad(device, this.targets[0], this.vertexBuffer, this.extractShader);\n\n // Pass 2: draw from rendertarget 1 into rendertarget 2,\n // using a shader to apply a horizontal gaussian blur filter.\n calculateBlurValues(this.sampleWeights, this.sampleOffsets, 1.0 / this.targets[1].width, 0, this.blurAmount);\n scope.resolve(\"uBlurWeights[0]\").setValue(this.sampleWeights);\n scope.resolve(\"uBlurOffsets[0]\").setValue(this.sampleOffsets);\n scope.resolve(\"uBloomTexture\").setValue(this.targets[0].colorBuffer);\n pc.drawFullscreenQuad(device, this.targets[1], this.vertexBuffer, this.blurShader);\n\n // Pass 3: draw from rendertarget 2 back into rendertarget 1,\n // using a shader to apply a vertical gaussian blur filter.\n calculateBlurValues(this.sampleWeights, this.sampleOffsets, 0, 1.0 / this.targets[0].height, this.blurAmount);\n scope.resolve(\"uBlurWeights[0]\").setValue(this.sampleWeights);\n scope.resolve(\"uBlurOffsets[0]\").setValue(this.sampleOffsets);\n scope.resolve(\"uBloomTexture\").setValue(this.targets[1].colorBuffer);\n pc.drawFullscreenQuad(device, this.targets[0], this.vertexBuffer, this.blurShader);\n\n // Pass 4: draw both rendertarget 1 and the original scene\n // image back into the main backbuffer, using a shader that\n // combines them to produce the final bloomed result.\n scope.resolve(\"uBloomEffectIntensity\").setValue(this.bloomIntensity);\n scope.resolve(\"uBloomTexture\").setValue(this.targets[0].colorBuffer);\n scope.resolve(\"uBaseTexture\").setValue(inputTarget.colorBuffer);\n pc.drawFullscreenQuad(device, outputTarget, this.vertexBuffer, this.combineShader, rect);\n }\n });\n\n return {\n BloomEffect: BloomEffect\n };\n}());\n\n// ----------------- SCRIPT DEFINITION ------------------ //\nvar Bloom = pc.createScript('bloom');\n\nBloom.attributes.add('bloomIntensity', {\n type: 'number',\n default: 1,\n min: 0,\n title: 'Intensity'\n});\n\nBloom.attributes.add('bloomThreshold', {\n type: 'number',\n default: 0.25,\n min: 0,\n max: 1,\n precision: 2,\n title: 'Threshold'\n});\n\nBloom.attributes.add('blurAmount', {\n type: 'number',\n default: 4,\n min: 1,\n 'title': 'Blur amount'\n});\n\nBloom.prototype.initialize = function () {\n this.effect = new pc.BloomEffect(this.app.graphicsDevice);\n\n this.effect.bloomThreshold = this.bloomThreshold;\n this.effect.blurAmount = this.blurAmount;\n this.effect.bloomIntensity = this.bloomIntensity;\n\n var queue = this.entity.camera.postEffects;\n\n queue.addEffect(this.effect);\n\n this.on('attr', function (name, value) {\n this.effect[name] = value;\n }, this);\n\n this.on('state', function (enabled) {\n if (enabled) {\n queue.addEffect(this.effect);\n } else {\n queue.removeEffect(this.effect);\n }\n });\n\n this.on('destroy', function () {\n queue.removeEffect(this.effect);\n });\n};\n\n","// hud.js\nvar Hud = pc.createScript('hud');\n\nHud.attributes.add('css', {type: 'asset', assetType:'css', title: 'CSS Asset'});\nHud.attributes.add('html', {type: 'asset', assetType:'html', title: 'HTML Asset'});\nHud.attributes.add('buttonImage', {type: 'asset', assetType:'texture'});\n\nHud.prototype.initialize = function () {\n if( this.app.qualitySettings.preset == 'low' ) {\n var assets = this.app.assets.filter(function (asset) {\n return asset.type == 'material';\n });\n\n for( var i = 0; i < assets.length; i++ ) {\n assets[i].normalMap = null;\n }\n }\n\n // create STYLE element\n var style = document.createElement('style');\n\n // append to head\n document.head.appendChild(style);\n style.innerHTML = this.css.resource || '';\n \n // Add the HTML\n this.div = document.createElement('div');\n this.div.classList.add('container');\n this.div.innerHTML = this.html.resource || '';\n \n // append to body\n // can be appended somewhere else\n // it is recommended to have some container element\n // to prevent iOS problems of overfloating elements off the screen\n document.body.appendChild(this.div);\n \n this.app.on('trophyTweet', this.doTrophyTweet, this);\n\n this.menuTemplateHTML = this.div.querySelector('.menuTemplate').value;\n this.fullscreenMenuHTML = this.div.querySelector('.fullscreenMenu').value;\n\n this.menuSlate = null;\n this.bindEvents();\n this.app.on('hud:showMenu', this.showMenu, this);\n this.app.on('hud:closeMenu', this.closeMenu, this);\n this.app.on('hud:openLink', this.openLink, this);\n this.app.on('controls:max', this.onControlsMax, this);\n this.app.on('controls:newtab', this.onControlsNewTab, this);\n\n //setTimeout(function() {\n // this.app.fire('hud:showMenu', {name: 'welcome'});\n // }.bind(this), 3000);\n};\n\nHud.prototype.bindEvents = function() {\n var self = this;\n var tweetButton = this.div.querySelector('.tweetButton');\n tweetButton.style.backgroundImage = 'url(\"' + this.buttonImage.getFileUrl() + '\")';\n tweetButton.addEventListener('click', function() {\n self.tweet();\n });\n};\n\nHud.prototype.openLink = function(opts) {//{entity: this.entity, href: this.href, target: this.target}\n var linkSettings = localStorage.getItem('linkSettings');\n if( linkSettings ) {\n linkSettings = JSON.parse(linkSettings);\n }\n else {\n linkSettings = [];//{href: <string>}\n }\n \n function getLinkSetting(href) {\n for( var i = 0; i < linkSettings.length; i++ ) {\n if( linkSettings[i].href == href ) {\n return linkSettings[i];\n }\n }\n return null;\n }\n\n var self = this;\n var linkRememberCheckbox = null;\n function launchNewTab() {\n if( opts.closeTarget ) { \n self.app.fire('controls:close', {\n target: opts.closeTarget\n });\n }\n\n if( linkRememberCheckbox && linkRememberCheckbox.checked && !getLinkSetting(opts.href) ) {\n linkSettings.push({href: opts.href, method: 'newtab'});\n localStorage.setItem('linkSettings', JSON.stringify(linkSettings));\n }\n\n window.open(opts.href, opts.target);\n }\n\n function openIframe(target, url) {\n if( linkRememberCheckbox && linkRememberCheckbox.checked && !getLinkSetting(opts.href) ) {\n linkSettings.push({href: opts.href, method: 'iframe'});\n localStorage.setItem('linkSettings', JSON.stringify(linkSettings));\n }\n\n var didCreateIframe = false;\n var iframePlaneEntities = self.app.root.children[0].find(function (entity) {\n return entity.script && entity.script.iframePlane && entity.script.iframePlane.frameName == opts.target;\n });\n\n if( iframePlaneEntities.length == 1 ) {\n var iframePlaneEntity = iframePlaneEntities[0];\n var iframePlane = iframePlaneEntity.script.iframePlane;\n if( !iframePlane.iframe ) {\n // activate it\n iframePlane.activate(opts.href);\n didCreateIframe = true;\n }\n else {\n // otherwise, just set its last used url\n iframePlane.lastUsedUrl = opts.href;\n iframePlane.iframe.lastUrl = opts.href;\n }\n }\n\n if( !didCreateIframe ) {\n window.open(opts.href, opts.target);\n }\n\n return didCreateIframe;\n }\n\n var linkSetting = getLinkSetting(opts.href);\n if( linkSetting ) {\n if( linkSetting.method == 'newtab' ) {\n // open in new tab\n launchNewTab();\n self.closeMenu();\n return true;\n }\n else if( linkSetting.method == 'iframe' ) {\n // open in iframe\n openIframe(opts.target, opts.href);\n self.closeMenu();\n return true;\n }\n else {\n // ask\n askHow();\n }\n }\n else {\n if( this.app.qualitySettings.preset == 'verylow' || opts.target == '_blank' || opts.target == '_self' ) {\n // ask\n askHow();\n }\n else if( opts.target != '_blank' && opts.target != '_self' ) {\n // open in iframe\n openIframe(opts.target, opts.href);\n self.closeMenu();\n return true;\n }\n else { \n // ask\n askHow();\n\n //self.closeMenu();\n // open in new tab\n //launchNewTab();\n //return true;\n }\n }\n\n function askHow() {\n var menuSlate = self.showMenu({name: 'link'});\n var menuLinkPreview = menuSlate.querySelector('.menuLinkPreview');\n menuLinkPreview.value = opts.href;\n linkRememberCheckbox = menuSlate.querySelector('.linkRememberCheckbox');\n\n if( opts.target != '_blank' && opts.target != '_self' && self.app.qualitySettings.preset == 'verylow' ) {\n var menuLinkIframe = menuSlate.querySelector('.menuLinkIframe');\n menuLinkIframe.parentNode.style.display = 'block';\n menuLinkIframe.addEventListener('click', function(e) {\n self.closeMenu();\n // open in iframe\n openIframe(opts.target, opts.href);\n });\n }\n\n var menuLinkYes = menuSlate.querySelector('.menuLinkYes');\n menuLinkYes.addEventListener('click', function(e) {\n self.closeMenu();\n // open in new tab\n launchNewTab();\n });\n }\n};\n\nHud.prototype.showMenu = function(opts) {\n this.closeMenu();\n\n //var canvas = document.querySelector('#application-canvas');\n //canvas.classList.add('appNoInteract');\n\n //this.app.timeScale = 0;\n this.app.inputPaused = true;\n document.body.style.cursor = 'default';\n this.app.fire('pauseInput');\n\n var menuContentHTML = this.div.querySelector('.menuContent[name=\"' + opts.name + '\"]').value;\n \n var menuSlate = document.createElement('div');\n menuSlate.classList.add('menuSlate');\n menuSlate.innerHTML = this.menuTemplateHTML;\n\n var contentContainer = menuSlate.querySelector('.menuContentContainer');\n contentContainer.innerHTML = menuContentHTML;\n\n var menuContainer = menuSlate.querySelector('.menuContainer');\n\n var self = this;\n var closeButtons = menuSlate.querySelectorAll('.closeButton');\n for( var i = 0; i < closeButtons.length; i++ ) {\n closeButtons[i].addEventListener('click', function() {\n self.app.fire('hud:closeMenu');\n });\n }\n\n document.body.appendChild(menuSlate);\n var tmp = menuContainer.offsetWidth;\n menuContainer.classList.add('menuContainerActive');\n //menuSlate.classList.add('menuSlateActive');\n\n this.menuSlate = menuSlate;\n return menuSlate;\n};\n/*\nPause.prototype.togglePaused = function () {\n // More information about app.timeScale http://developer.playcanvas.com/en/api/pc.Application.html#timeScale\n // app.timeScale is global and affects the value of dt that is passed into the update functions\n if (this.paused) {\n this.app.timeScale = 1;\n } else {\n this.app.timeScale = 0;\n }\n \n this.paused = !this.paused;\n};*/\nHud.prototype.closeMenu = function() {\n if( !this.menuSlate ) {\n return;\n }\n\n this.menuSlate.remove();\n this.menuSlate = null;\n\n //var canvas = document.querySelector('#application-canvas');\n //canvas.classList.remove('appNoInteract');\n //this.app.timeScale = 1;\n this.app.inputPaused = false;\n this.app.fire('unpauseInput');\n};\n\nHud.prototype.tweet = function() {\n var text = \"Chillin' in this interactive #3Dstartpage right in my web browser, built by @m3org using #webgl & #playcanvas\";\n var pageUrl = 'https://m3org.com/spacebase';\n const tweetableText = \"https://twitter.com/intent/tweet?url=\" + pageUrl + \"&text=\" + encodeURIComponent(text);\n \n window.open(\n tweetableText,\n \"twitterwindow\", \n \"height=670, width=550, toolbar=0, location=0, menubar=0, directories=0,scrollbars=0\"\n );\n};\n\nHud.prototype.doTrophyTweet = function() {\n var text = \"Victory! Achievement unlocked: Collected 100% of the interactive object points in @m3org #3Dstartpage\";\n var pageUrl = 'https://3d.m3org.com/victory';\n const tweetableText = \"https://twitter.com/intent/tweet?url=\" + pageUrl + \"&text=\" + encodeURIComponent(text);\n \n window.open(\n tweetableText,\n \"twitterwindow\", \n \"height=670, width=550, toolbar=0, location=0, menubar=0, directories=0,scrollbars=0\"\n );\n};\n\nHud.prototype.onControlsNewTab = function(opts) {//{ target: this.target, href: this.href}\n //controls:newtab\n var iframe = document.querySelector('iframe[name=\"' + opts.target + '\"]');\n if( iframe ) {\n var lastIframeUrl = iframe.lastUrl;\n //window.open(lastIframeUrl, '_blank');\n this.app.fire('hud:openLink', {target: '_blank', href: lastIframeUrl, closeTarget: opts.target});\n }\n};\n\nHud.prototype.onControlsMax = function(opts) {//{ target: this.target}\n //controls:max\n var iframe = document.querySelector('iframe[name=\"' + opts.target + '\"]');\n if( iframe ) {\n var self = this;\n \n this.app.inputPaused = true;\n document.body.style.cursor = 'default';\n this.app.fire('pauseInput');\n \n var fullscreenSlate = document.createElement('div');\n fullscreenSlate.classList.add('fullscreenSlate');\n fullscreenSlate.innerHTML = this.fullscreenMenuHTML;\n document.body.appendChild(fullscreenSlate);\n\n iframe.oldParent = iframe.parentNode;\n var iframesContainer = iframe.parentNode;\n iframesContainer.classList.add('fullscreenActive');\n document.body.classList.add('fullscreenBodyMode');\n iframe.classList.add('fullscreenIframe');\n \n var canvas = document.querySelector('#application-canvas');\n //canvas.style.display = 'none';\n canvas.style.visibility = 'hidden';\n\n var menuControlRestore = fullscreenSlate.querySelector('.menuControlRestore');\n menuControlRestore.addEventListener('click', function(e) {\n iframe.classList.remove('fullscreenIframe');\n iframe.oldParent.classList.remove('fullscreenActive');\n document.body.classList.remove('fullscreenBodyMode');\n //canvas.style.display = 'block';\n canvas.style.visibility = 'visible';\n fullscreenSlate.remove();\n self.app.inputPaused = false;\n self.app.fire('unpauseInput');\n self.app.fire('controls:restore', {target: iframe.name}); // fixes iframe 03-27-23\n });\n\n var menuControlClose = fullscreenSlate.querySelector('.menuControlClose');\n menuControlClose.addEventListener('click', function(e) {\n iframe.classList.remove('fullscreenIframe');\n iframe.oldParent.classList.remove('fullscreenActive');\n document.body.classList.remove('fullscreenBodyMode');\n //canvas.style.display = 'block';\n canvas.style.visibility = 'visible';\n fullscreenSlate.remove();\n self.app.inputPaused = false;\n self.app.fire('unpauseInput');\n \n self.app.fire('controls:close', {\n target: opts.target\n });\n });\n\n var menuControlNewTab = fullscreenSlate.querySelector('.menuControlNewTab');\n menuControlNewTab.addEventListener('click', function(e) {\n iframe.classList.remove('fullscreenIframe');\n iframe.oldParent.classList.remove('fullscreenActive');\n document.body.classList.remove('fullscreenBodyMode');\n //canvas.style.display = 'block';\n canvas.style.visibility = 'visible';\n fullscreenSlate.remove();\n self.app.inputPaused = false;\n self.app.fire('unpauseInput');\n \n self.app.fire('controls:close', {\n target: opts.target\n });\n\n var goodUrl = iframe.lastUrl;\n if( !goodUrl ) {\n goodUrl = opt.href;\n }\n window.open(goodUrl, '_blank');\n });\n }\n};\n\n","// loadingscreen.js\npc.script.createLoadingScreen(function (app) {\n app.qualitySettings = {\n preset: 'high'\n };\n\n if( app.touch ) {\n app.qualitySettings.preset = 'low';\n }\n\n /*app.assets.on('load', function (asset) {\n if( asset.type == 'material' ) {\n asset.resources[0].normalMap = null;\n asset.resources[0].diffuseMap = null;\n asset.resources[0].update();\n }\n });*/\n \n var showSplash = function () {\n // splash wrapper\n var wrapper = document.createElement('div');\n wrapper.id = 'application-splash-wrapper';\n document.body.appendChild(wrapper);\n\n // splash\n var splash = document.createElement('div');\n splash.id = 'application-splash';\n wrapper.appendChild(splash);\n splash.style.display = 'none';\n\n var logo = document.createElement('img');\n logo.src = 'https://m3org.com/logo_big.png';\n splash.appendChild(logo);\n logo.onload = function () {\n splash.style.display = 'block';\n };\n\n var container = document.createElement('div');\n container.id = 'progress-bar-container';\n splash.appendChild(container);\n\n var bar = document.createElement('div');\n bar.id = 'progress-bar';\n container.appendChild(bar);\n\n };\n\n var hideSplash = function () {\n var splash = document.getElementById('application-splash-wrapper');\n splash.parentElement.removeChild(splash);\n\n\n /*if( app.qualitySettings.preset == 'low' ) {\n var assets = app.assets.filter(function (asset) {\n return asset.type == 'material';\n });\n\n for( var i = 0; i < assets.length; i++ ) {\n assets[i].normalMap = null;\n assets[i].diffuseMap = null;\n assets[i].update();\n }\n }*/\n };\n\n var setProgress = function (value) {\n var bar = document.getElementById('progress-bar');\n if(bar) {\n value = Math.min(1, Math.max(0, value));\n bar.style.width = value * 100 + '%';\n }\n };\n\n var createCss = function () {\n var css = [\n 'body {',\n ' background-color: #222;',\n\t\t\t\t'background: #222;',\n\t\t\t\t'background: -moz-linear-gradient(-45deg, #45484d 0%, #000000 100%);',\n\t\t\t\t'background: -webkit-linear-gradient(-45deg, #45484d 0%,#000000 100%);',\n\t\t\t\t'background: linear-gradient(135deg, #45484d 0%,#000000 100%);',\n\t\t\t\t'filter: progid:DXImageTransform.Microsoft.gradient( startColorstr=\"#45484d\", endColorstr=\"#000000\",GradientType=1 );',\n '}',\n\n '#application-splash-wrapper {',\n ' position: absolute;',\n ' top: 0;',\n ' left: 0;',\n ' height: 100%;',\n ' width: 100%;',\n ' background-color: #222;',\n\t\t\t\t'background: #222;',\n\t\t\t\t'background: -moz-linear-gradient(-45deg, #45484d 0%, #000000 100%);',\n\t\t\t\t'background: -webkit-linear-gradient(-45deg, #45484d 0%,#000000 100%);',\n\t\t\t\t'background: linear-gradient(135deg, #45484d 0%,#000000 100%);',\n\t\t\t\t'filter: progid:DXImageTransform.Microsoft.gradient( startColorstr=\"#45484d\", endColorstr=\"#000000\",GradientType=1 );',\n '}',\n\n '#application-splash {',\n ' position: absolute;',\n ' top: calc(50% - 128px);',\n ' width: 200px;',\n ' left: calc(50% - 100px);',\n '}',\n\n '#application-splash img {',\n ' width: 100%;',\n '}',\n\n '#progress-bar-container {',\n ' margin: 20px auto 0 auto;',\n ' height: 2px;',\n ' width: 167px;',\n ' background-color: #1d292c;',\n '}',\n\n '#progress-bar {',\n ' width: 0%;',\n ' height: 100%;',\n ' background-color: #f60;',\n '}',\n '@media (max-width: 480px) {',\n ' #application-splash {',\n ' width: 170px;',\n ' left: calc(50% - 85px);',\n ' }',\n '}'\n ].join(\"\\n\");\n\n var style = document.createElement('style');\n style.type = 'text/css';\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n\n document.head.appendChild(style);\n };\n\n\n createCss();\n\n showSplash();\n \n app.on('preload:end', function () {\n app.off('preload:progress');\n });\n app.on('preload:progress', setProgress);\n app.on('start', hideSplash);\n\n /*\n app.qualitySettings = {\n preset: 'low'\n };\n\n if( app.qualitySettings.preset == 'low' ) {\n var assets = app.assets.filter(function (asset) {\n return asset.type == 'material';\n });\n\n for( var i = 0; i < assets.length; i++ ) {\n assets[i].normalMap = null;\n assets[i].diffuseMap = null;\n }\n }\n */\n});\n\n","// selectionCursor.js\nvar SelectionCursor = pc.createScript('selectionCursor');\n\nSelectionCursor.attributes.add('cameraEntity', {type: 'entity'});\n\n// initialize code called once per entity\nSelectionCursor.prototype.initialize = function() {\n this.channelManagerEntity = this.app.root.findByName('ChannelManager');\n this.selectedMediaEntity = null;\n this.selectedMediaEntityCol = null;\n this.hoveredEntity = null;\n this.clickedEntity = null;\n this.app.mouse.on(pc.EVENT_MOUSEMOVE, this.onMouseMove, this);\n this.app.mouse.on(pc.EVENT_MOUSEDOWN, this.onMouseDown, this);\n this.app.mouse.on(pc.EVENT_MOUSEUP, this.onMouseUp, this);\n this.app.mouse.on(pc.EVENT_MOUSEWHEEL, this.onMouseWheel, this);\n this.app.on('touch:move', this.onTouchMove, this);\n this.app.on('pauseInput', this.onPauseInput, this);\n \n this.spawnModeEntity = null;\n var self = this;\n this.app.on('spawnMode:enter', function(spawnModeEntity) {\n self.spawnModeEntity = spawnModeEntity;\n \n // silently cancel out of any pending cursor interactions\n if( self.hoveredEntity ) {\n self.hoveredEntity = null;\n }\n if( self.clickedEntity ) {\n self.clickedEntity = null;\n }\n });\n this.app.on('spawnMode:exit', function() {\n self.spawnModeEntity = null;\n });\n \n this.app.keyboard.on(pc.EVENT_KEYUP, this.onKeyUp, this);\n};\n\nSelectionCursor.prototype.onPauseInput = function() {\n if( this.hoveredEntity ) {\n this.unhoverEntity(this.hoveredEntity);\n this.hoveredEntity = null;\n }\n if( this.clickedEntity ) {\n this.clickedEntity = null;\n }\n};\n\nSelectionCursor.prototype.onKeyUp = function(e) {\n if( e.key === pc.KEY_DELETE ) {\n var parent = this.hoveredEntity.parent;\n if( parent ) {\n if( parent && parent.networkId ) {\n this.channelManagerEntity.script.channelManager.removeMediaObject(parent);\n\n // silently cancel out of cursor events\n this.hoveredEntity = null;\n this.clickedEntity = null;\n document.body.style.cursor = 'default';\n }\n }\n }\n};\n\nSelectionCursor.prototype.unhoverEntity = function(entity) {\n if( entity ) {\n if( entity.hasEvent('cursor:exit') ) {\n entity.fire('cursor:exit');\n }\n }\n};\n\nSelectionCursor.prototype.hoverEntity = function(entity) {\n if( entity ) {\n if( entity.hasEvent('cursor:enter') ) {\n entity.fire('cursor:enter');\n }\n }\n};\n\nSelectionCursor.prototype.cursorDownEntity = function(entity) {\n if( entity ) {\n if( entity.hasEvent('cursor:down') ) {\n entity.fire('cursor:down');\n }\n }\n};\n\nSelectionCursor.prototype.cursorUpEntity = function(entity) {\n if( entity ) {\n if( entity.hasEvent('cursor:up') ) {\n entity.fire('cursor:up');\n }\n }\n};\n\nSelectionCursor.prototype.cursorClickEntity = function(entity) {\n if( entity ) {\n if( entity.hasEvent('cursor:click') ) {\n entity.fire('cursor:click');\n }\n }\n};\n\nSelectionCursor.prototype.onMouseDown = function(e) { \n if( this.app.inputPaused ) {\n return;\n }\n \n if( this.clickedEntity ) {\n this.clickedEntity = null;\n }\n \n if( this.hoveredEntity ) {\n this.cursorDownEntity(this.hoveredEntity);\n this.clickedEntity = this.hoveredEntity;\n }\n \n this.app.fire('cursor:down:global', this.clickedEntity);\n};\n\nSelectionCursor.prototype.onMouseUp = function(e) { \n if( this.app.inputPaused ) {\n return;\n }\n \n var wasClickedEntity = null;\n if( this.clickedEntity ) {\n if( this.clickedEntity == this.hoveredEntity ) {\n wasClickedEntity = this.clickedEntity;\n }\n \n this.clickedEntity = null;\n }\n \n if( this.hoveredEntity ) {\n this.cursorUpEntity(this.hoveredEntity);\n }\n \n if( wasClickedEntity ) {\n this.cursorClickEntity(wasClickedEntity);\n }\n this.app.fire('cursor:up:global', this.hoveredEntity);\n};\n\nSelectionCursor.prototype.onTouchMove = function(opts) {\n this.onMouseMove(opts.screen);\n};\n\nSelectionCursor.prototype.onMouseMove = function(e) {\n if( this.app.inputPaused ) {\n return;\n }\n\n var result = this.doRaycast({x: e.x, y: e.y});\n var entity = (result && result.entity) ? result.entity : null;\n if( !entity ) {\n if( this.hoveredEntity ) {\n this.unhoverEntity(this.hoveredEntity);\n this.hoveredEntity = null;\n }\n if( this.clickedEntity ) {\n this.clickedEntity = null;\n }\n }\n else {\n if( this.hoveredEntity ) {\n if( this.hoveredEntity == entity ) {\n // send cursormove event.\n }\n else {\n this.unhoverEntity(this.hoveredEntity);\n this.hoveredEntity = null;\n \n this.hoveredEntity = entity;\n this.hoverEntity(entity);\n }\n }\n else {\n this.hoveredEntity = entity;\n this.hoverEntity(entity);\n }\n \n if( this.clickedEntity && this.clickedEntity != entity ) {\n this.clickedEntity = null;\n }\n }\n this.app.lastCursorMove = {raycast: result, screen: {x: e.x, y: e.y}};\n this.app.fire('cursor:move:global', {raycast: result, screen: {x: e.x, y: e.y}});\n};\n\nSelectionCursor.prototype.doRaycast = function(screenPosition) {\n var from = this.cameraEntity.getPosition();\n var to = this.cameraEntity.camera.screenToWorld(screenPosition.x, screenPosition.y, this.cameraEntity.camera.farClip);\n var result;\n if( !this.spawnModeEntity ) {\n //result = this.app.systems.rigidbody.raycastFirst(from, to);\n }\n else {\n // do NOT cast against UI elements if we are in spawn mode.\n //result = this.app.systems.rigidbody.raycastFirstWithoutTag(from, to, 'ui');\n }\n \n if (result) {\n return result;\n }\n return null;\n};\n\nSelectionCursor.prototype.onMouseWheel = function(e) {\n this.app.fire('cursor:wheel:global', e.wheelDelta, this);\n};\n\nSelectionCursor.prototype.update = function(dt) {\n \n};\n\n","// rigidbody-extensions.js\n(function(){ \n var _distanceVec3 = new pc.Vec3();\n \n pc.RigidBodyComponentSystem.prototype.raycastFirstByTag = function (start, end, tag) {\n var closestDistanceSqr = Number.MAX_VALUE;\n var closestResult = null;\n \n // Go through all the entities that intersect with the raycast and \n // find the closest one that matches the tag query passed\n var results = this.app.systems.rigidbody.raycastAll(start, end);\n for (var i = 0; i < results.length; ++i) {\n var result = results[i];\n if (result.entity.tags.has(tag)) {\n _distanceVec3.sub2(result.point, start);\n var distanceSqr = _distanceVec3.lengthSq();\n if (distanceSqr < closestDistanceSqr) {\n closestDistanceSqr = distanceSqr;\n closestResult = result;\n }\n }\n }\n \n return closestResult;\n };\n \n pc.RigidBodyComponentSystem.prototype.raycastFirstWithoutTag = function (start, end, tag) {\n var closestDistanceSqr = Number.MAX_VALUE;\n var closestResult = null;\n \n // Go through all the entities that intersect with the raycast and \n // find the closest one that matches the tag query passed\n var results = this.app.systems.rigidbody.raycastAll(start, end);\n for (var i = 0; i < results.length; ++i) {\n var result = results[i];\n if (!result.entity.tags.has(tag)) {\n _distanceVec3.sub2(result.point, start);\n var distanceSqr = _distanceVec3.lengthSq();\n if (distanceSqr < closestDistanceSqr) {\n closestDistanceSqr = distanceSqr;\n closestResult = result;\n }\n }\n }\n \n return closestResult;\n };\n})();\n\n","// iframe-plane.js\nvar IframePlane = pc.createScript('iframePlane');\nIframePlane.attributes.add('iframeUrl', {type: 'string'});\nIframePlane.attributes.add('controls', {type: 'entity'});\nIframePlane.attributes.add('iframePixelsPerUnit', {\n type: 'number', \n default: 640, \n description: 'Number of canvas pixels per unit of world space. The larger the number, the higher the resolution of the iframe.'\n});\nIframePlane.attributes.add('frameName', {type: 'string', description: 'Leave blank usually. Only add if you have links that need to target specific iframes.'});\n\n\n// initialize code called once per entity\nIframePlane.prototype.initialize = function() {\n this.iframe = null;\n this.app.isFullscreened = false;\n\n var material = new pc.StandardMaterial();\n material.depthWrite = true;\n material.redWrite = false;\n material.greenWrite = false;\n material.blueWrite = false;\n material.alphaWrite = false;\n material.blendType = pc.BLEND_NONE;\n material.opacity = 0;\n material.update();\n this.entity.model.material = material;\n this.lastUsedUrl = null;\n this.app.on('controls:close', this.onControlsClose, this);\n this.app.on('controls:max', this.onControlsMax, this);\n this.app.on('controls:restore', this.onControlsRestore, this);\n};\n\nIframePlane.prototype.onControlsMax = function(opts) {//{ target: this.target}\n //controls:max\n var iframe = document.querySelector('iframe[name=\"' + opts.target + '\"]');\n if( iframe && this.iframe == iframe ) {\n let dom = this.iframe.dom;\n this.app.isFullscreened = true;\n dom.oldCssText = dom.style.cssText;\n dom.style.cssText = '';//'width: auto; height: auto; line-height: normal; -webkit-transform: none; transform: none;';\n let oldParent = dom.parentNode;\n dom.oldParent = oldParent;\n oldParent.oldCssText = oldParent.style.cssText;\n oldParent.style.cssText = '';//transform-style: preserve-3d; pointer-events: none; width: 1920px; height: 975px; transform: translateZ(580.98px) matrix3d(-0.0721039, 0.0269626, -0.997033, 0, -3.64832e-05, -0.999635, -0.0270303, 0, 0.997397, 0.00191261, -0.0720785, 0, 5.77315, 0.474969, -5.84647, 1) translate(960px, 487.5px);\n //transform-style: preserve-3d; pointer-events: none; width: 1920px; height: 975px; transform: translateZ(580.98px) matrix3d(-0.0721039, 0.0269626, -0.997033, 0, -3.64832e-05, -0.999635, -0.0270303, 0, 0.997397, 0.00191261, -0.0720785, 0, 5.77315, 0.474969, -5.84647, 1) translate(960px, 487.5px);\n \n //oldParent.parentNode.cssText = '';\n //console.log(oldParent);\n //console.log(oldParent.parentNode);\n //document.body.appendChild(dom);\n //oldParent.style.cssText = \"position: absolute; pointer-events: auto; width: 900px; height: 496px; line-height: 496px; transform: translate(-50%, -50%) matrix3d(0, 0, 0.005, 0, 0, -0.005, 0, 0, -0.749418, 0, 0, 0, -1.35128, 1.63056, -6.05592, 1);\";\n\n //console.log(dom.style.cssText);\n //console.log(dom.style.transform);\n /*dom.style.width = '100%';//Math.round(width) + \"px\";\n dom.style.height = '100%';//Math.round(height) + \"px\";\n dom.style.lineHeight = 'normal';//dom.style.height;\n dom.style.WebkitTransform = 'none';//style;\n dom.style.transform = 'none';//style;*/\n }\n};\n\nIframePlane.prototype.onControlsRestore = function(opts) {//{ target: this.target}\n //controls:max\n var iframe = document.querySelector('iframe[name=\"' + opts.target + '\"]');\n if( iframe && this.iframe == iframe ) {\n let dom = this.iframe.dom;\n this.app.isFullscreened = false;\n dom.style.cssText = dom.oldCssText;\n dom.parentNode.style.cssText = dom.parentNode.oldCssText;\n }\n};\n\n\nIframePlane.prototype.onControlsClose = function(opts) {\n if( opts.target != this.frameName ) {\n return;\n }\n\n if( this.iframe ) { \n var iframe = document.querySelector('iframe[name=\"' + opts.target + '\"]');\n if( this.app.isFullscreened && iframe && this.iframe == iframe ) {\n let dom = this.iframe.dom;\n this.app.isFullscreened = false;\n dom.style.cssText = dom.oldCssText;\n dom.parentNode.style.cssText = dom.parentNode.oldCssText;\n }\n\n this.deactivate();\n }\n};\n\nIframePlane.prototype.deactivate = function() {\n this._css3Plane.destroyPlane();\n this.entity.enabled = false;\n this.iframe.remove();\n this.iframe = null;\n //this.controls.enabled = false;\n};\n\nIframePlane.prototype.activate = function(url) {\n if( this.iframe ) {\n console.log('WARNING: Iframe already exists.');\n return false;\n }\n\n if( !url && !this.lastUsedUrl && false && this.app.qualitySettings.preset == 'verylow' ) {\n //this.app.fire('hud:openLink',{href: this.iframeUrl, target: this.frameName});\n return this.app.root.children[0].script.hud.openLink({href: this.iframeUrl, target: this.frameName});\n }\n\n this.entity.enabled = true;\n //this.controls.enabled = true;\n\n var element; \n //if (this.iframeUrl) {\n \n if( true ) {\n element = document.createElement(\"iframe\");\n element.allowfullscreen = true;\n element.allowusermedia = true;\n element.style.cssText = 'width: 100%; height: 100%;';\n //element.sandbox = 'allow-forms allow-modals allow-orientation-lock allow-pointer-lock allow-popups allow-popups-to-escape-sandbox allow-presentation allow-same-origin allow-scripts';\n //element.allow = 'camera; microphone; autoplay; fullscreen; picture-in-picture; xr-spatial-tracking; clipboard-write';\n if( !url ) {\n if( this.lastUsedUrl ) {\n url = this.lastUsedUrl;\n }\n else {\n url = this.iframeUrl; \n }\n }\n else {\n this.lastUsedUrl = url;\n }\n\n element.lastUrl = url;\n //console.log(this.lastUsedUrl);\n \n var goodUrl = url;\n if( goodUrl.indexOf('https://player.twitch.tv/?channel=') == 0 ) {\n var hostname = location.hostname;\n var found = goodUrl.indexOf('&parent=');\n goodUrl = goodUrl.substring(0, found+8) + hostname;\n }\n \n element.src = goodUrl;\n element.style.border = '0px';\n if( this.frameName ) {\n element.name = this.frameName;\n }\n this.iframe = element;\n } else {\n element = null;\n }\n\n this._css3Plane = new pc.Css3Plane(element, this.entity, this.iframePixelsPerUnit, null, this.iframe);\n this._css3Plane.dom.style.pointerEvents = 'none';\n return true;\n};\n\n\npc.extend(pc, function () {\n 'use strict';\n\n var epsilon = function (value) {\n return Math.abs(value) < 1e-10 ?0 :value;\n };\n\n // the Y axis of html is the opposite of gl,so multiply by minus one\n var getCameraCSSMatrix = function (matrix) {\n var elements = matrix.data;\n\n return 'matrix3d(' +\n epsilon( elements[ 0 ] ) + ',' +\n epsilon( - elements[ 1 ] ) + ',' +\n epsilon( elements[ 2 ] ) + ',' +\n epsilon( elements[ 3 ] ) + ',' +\n epsilon( elements[ 4 ] ) + ',' +\n epsilon( - elements[ 5 ] ) + ',' +\n epsilon( elements[ 6 ] ) + ',' +\n epsilon( elements[ 7 ] ) + ',' +\n epsilon( elements[ 8 ] ) + ',' +\n epsilon( - elements[ 9 ] ) + ',' +\n epsilon( elements[ 10 ] ) + ',' +\n epsilon( elements[ 11 ] ) + ',' +\n epsilon( elements[ 12 ] ) + ',' +\n epsilon( - elements[ 13 ] ) + ',' +\n epsilon( elements[ 14 ] ) + ',' +\n epsilon( elements[ 15 ] ) +\n ')';\n };\n\n // scaleX and scaleY represent how many pixels of div equlas to one unit of model.\n var getObjectCSSMatrix = function(matrix,scaleX,scaleY) { \n var elements = matrix.data;\n\n var matrix3d = 'matrix3d(' +\n epsilon( elements[ 0 ] / scaleX) + ',' +\n epsilon( elements[ 1 ] / scaleX) + ',' +\n epsilon( elements[ 2 ] / scaleX) + ',' +\n epsilon( elements[ 3 ] / scaleX) + ',' +\n epsilon( elements[ 8 ] / scaleY) + ',' +\n epsilon( elements[ 9 ] / scaleY) + ',' +\n epsilon( elements[ 10 ] / scaleY) + ',' +\n epsilon( elements[ 11 ] / scaleY) + ',' +\n epsilon( elements[ 4 ] ) + ',' +\n epsilon( elements[ 5 ] ) + ',' +\n epsilon( elements[ 6 ] ) + ',' +\n epsilon( elements[ 7 ] ) + ',' +\n epsilon( elements[ 12 ] ) + ',' +\n epsilon( elements[ 13 ] ) + ',' +\n epsilon( elements[ 14 ] ) + ',' +\n epsilon( elements[ 15 ] ) +\n ')';\n\n // Make sure the origin is in the center\n return 'translate(-50%,-50%)' + matrix3d;\n };\n\n var randomCssColor = function() {\n var r = Math.round(Math.random() * 255);\n var g = Math.round(Math.random() * 255);\n var b = Math.round(Math.random() * 255);\n\n return \"rgb(\" + r + \",\" + g + \",\" + b + \")\";\n };\n\n // construct a css3 renderer\n var Css3Renderer = function() {\n // make sure we only have one css3 renderer\n if(pc.app.css3Renderer)\n return pc.app.css3Renderer;\n pc.app.css3Renderer = this;\n\n // init data\n this._stageElement = null;\n this._cameras = [];\n this._cameraElements = [];\n this._defaultCameraElement = null;\n this._css3Targets = [];\n // cache\n this._cameraInvertMat = new pc.Mat4();\n this._cameraHalfSize = new pc.Vec2();\n\n // create a div to contain all elements\n var stageElement = document.createElement(\"div\");\n stageElement.style.overflow = \"hidden\";\n stageElement.style.pointerEvents = 'none';\n document.body.appendChild(stageElement);\n\n // make sure the div created is behind the canvas since we want to show the div when canvas is transparent\n var canvas = document.getElementById(\"application-canvas\");\n //canvas.style.pointerEvents = \"none\";\n document.body.insertBefore(stageElement,canvas);\n\n this._stageElement = stageElement;\n\n // add default camera\n this._defaultCameraElement = this.addCamera(pc.app.root.findComponent(\"camera\"));\n\n var self = this;\n function onWindowResize(){\n if( pc.app.isFullscreened ) {\n return;\n }\n self._width = window.innerWidth;\n self._height = window.innerHeight;\n self._widthHalf = self._width / 2;\n self._heightHalf = self._height / 2;\n self._stageElement.style.width = self._width + 'px';\n self._stageElement.style.height = self._height + 'px';\n for(var i = 0;i < self._cameraElements.length;i++) {\n self._cameraElements[i].style.width = self._width + 'px';\n self._cameraElements[i].style.height = self._height + 'px';\n }\n }\n onWindowResize();\n\n window.addEventListener(\"resize\", onWindowResize, false);\n };\n\n Css3Renderer.prototype = {\n // start render every frame\n render: function () {\n if(this._isRendering)\n return;\n\n this._isRendering = true;\n pc.app.on(\"update\",this._renderElements,this); \n },\n\n cancelRender: function() {\n pc.app.off(\"update\",this._renderElements,this);\n this._isRendering = false;\n\n },\n\n // add new camera\n addCamera: function (camera) {\n // make sure the camera we added is not duplicate\n if(!camera)\n return this._defaultCameraElement;\n if(this._cameras.indexOf(camera) > -1) {\n return this._cameraElements[this._cameras.indexOf(camera)]; \n }\n // create a div for this camera\n var cameraElement = document.createElement(\"div\");\n cameraElement.style.WebkitTransformStyle = 'preserve-3d';\n cameraElement.style.transformStyle = 'preserve-3d';\n cameraElement.style.pointerEvents = 'none';\n // add to html\n this._stageElement.appendChild(cameraElement);\n // camera cache\n this._cameras.push(camera);\n this._cameraElements.push(cameraElement);\n\n return cameraElement;\n },\n\n // add new render element\n addTarget: function (target) {\n if(this._css3Targets.indexOf(target) <= -1) \n this._css3Targets.push(target);\n },\n\n // set whether the div can be interacted\n blockEvents: function (state) {\n for(var i = 0;i < this._css3Targets.length;this._css3Targets[i++].blockEvents(state));\n },\n\n // render elements every frame\n _renderElements: function () {\n if( pc.app.isFullscreened ) {\n return;\n }\n for(var i = 0;i < this._cameras.length;i++) {\n var tx,ty,cameraCSSMatrix,style;\n var camera = this._cameras[i];\n var cameraElement = this._cameraElements[i];\n var fov = camera.projectionMatrix.data[5] * this._heightHalf;\n\n // update stage div\n if(camera.projection == pc.PROJECTION_PERSPECTIVE) {\n this._stageElement.style.WebkitPerspective = fov + 'px';\n this._stageElement.style.perspective = fov + 'px';\n }\n else {\n this._stageElement.style.WebkitPerspective = '';\n this._stageElement.style.perspective = '';\n }\n\n // update camera\n if(camera.projection == pc.PROJECTION_ORTHOGRAPHIC) {\n pc.Mat4._getPerspectiveHalfSize(this._cameraHalfSize, camera.fov, camera.aspectRatio, camera.nearClip, camera.horizontalFov);\n tx = - (this._cameraHalfSize.x - this._cameraHalfSize.x) / 2;\n ty = (this._cameraHalfSize.y - this._cameraHalfSize.y) / 2;\n }\n this._cameraInvertMat.copy(camera.entity.getWorldTransform()).invert();\n cameraCSSMatrix = camera.projection == pc.PROJECTION_ORTHOGRAPHIC ?'scale(' + fov + ')' + 'translate(' + epsilon(tx) + 'px,' + epsilon(ty) + 'px)' + getCameraCSSMatrix(this._cameraInvertMat) \n :'translateZ(' + fov +'px)' + getCameraCSSMatrix(this._cameraInvertMat);\n style = cameraCSSMatrix + 'translate(' + this._widthHalf + 'px,' + this._heightHalf + 'px)';\n cameraElement.style.WebkitTransform = style;\n cameraElement.style.transform = style;\n }\n\n // update all div\n for(var j = 0;j < this._css3Targets.length;this._css3Targets[j++].updateTransform());\n }\n };\n\n /**\n * @class\n * @name pc.Css3Plane\n * @classdesc merge the div and entity together.\n * @description merge the div and entity together,update the domElement transform according to the entity every frame so they look the same to the viewer.\n * @param {object} dom - the dom element to show,create a new one if not exist.\n * @param {pc.Entity} entity - the entity to attach,create a new one if not exist.\n * @param {number} pixelsPerWorldUnit - represent how many pixels of div equlas to one unit of model.\n * @param {pc.CameraComponent} camera - the camera.\n */\n var Css3Plane = function (dom, entity, pixelsPerWorldUnit, camera, iframe) { \n // create a css3 renderer if we don't have one\n if(!pc.app.css3Renderer) {\n pc.app.css3Renderer = new pc.Css3Renderer();\n }\n // set the renderer\n this._renderer = pc.app.css3Renderer;\n\n // create a div if we don't have one\n dom = document.createElement('div');\n dom.appendChild(iframe);\n dom.iframe = iframe;\n iframe.dom = dom;\n //dom = iframe;\n\n dom.style.position = 'absolute';\n dom.style.pointerEvents = 'auto';\n this.dom = dom;\n\n // create an entity and add it to scene if we don't have one\n if(!entity) {\n entity = new pc.Entity();\n pc.app.root.addChild(entity);\n }\n this.entity = entity;\n\n // add camera to renderer\n var cameraElement = this._renderer.addCamera(camera); \n // add div to cameraElement\n cameraElement.appendChild(dom);\n\n // set the max width and height\n this._maxWidth = 1920;\n this._maxHeight = 1080;\n // scaleFactor represent how many pixels of div equals to one unit of model.\n pixelsPerWorldUnit = pixelsPerWorldUnit || this._maxWidth;\n this.pixelsPerWorldUnit = new pc.Vec2(pixelsPerWorldUnit,pixelsPerWorldUnit);\n\n // start render\n this._renderer.addTarget(this); \n this._renderer.render();\n };\n\n Css3Plane.prototype = {\n // update model materix\n updateTransform: function () {\n //console.log(pc.app.isFullscreened);\n if( pc.app.isFullscreened ) {\n return;\n }\n var modelTransform = this.entity.getWorldTransform();\n var scale = modelTransform.getScale();\n var width = Math.min(scale.x * this.pixelsPerWorldUnit.x,this._maxWidth);\n var height = Math.min(scale.z * this.pixelsPerWorldUnit.y,this._maxHeight);\n var style = getObjectCSSMatrix(modelTransform,width,height);\n \n // Safari doesn't like multi decimal numbers for width and height\n // and misaligns the iframe in the plane\n \n this.dom.style.width = Math.round(width) + \"px\";\n this.dom.style.height = Math.round(height) + \"px\";\n this.dom.style.lineHeight = this.dom.style.height;\n this.dom.style.WebkitTransform = style;\n this.dom.style.transform = style;\n },\n\n // set whether the div can be interacted\n blockEvents: function (state) {\n this.dom.style.pointerEvents = state ?\"none\" :\"auto\"; \n },\n\n // attach other plane in scene\n attachPlane: function (entity) {\n this.entity = entity;\n },\n\n destroyPlane: function() {\n //var cameraElement = this._renderer.addCamera(camera);\n //cameraElement.appendChild(dom);\n //this.dom.remove();\n }\n };\n\n return {\n Css3Renderer: Css3Renderer,\n Css3Plane: Css3Plane\n };\n}());\n\n","// controlsButton.js\nvar ControlsButton = pc.createScript('controlsButton');\n\nControlsButton.attributes.add('action', {type: 'number', default: 0}); // 0 = close, 1 = maximize, 2 = restore, 3 = newtab\nControlsButton.attributes.add('target', {type: 'string'});\n\nControlsButton.prototype.initialize = function() {\n this.entity.on('cursor:enter', this.onCursorEnter, this);\n this.entity.on('cursor:exit', this.onCursorExit, this);\n this.entity.on('cursor:down', this.onCursorDown, this);\n this.highlightEntity = this.entity.findByName('Glow');\n};\n\nControlsButton.prototype.onCursorDown = function(e) {\n if( this.action == 0 ) {\n this.app.fire('controls:close', {\n target: this.target\n });\n }\n else if( this.action == 1 ) {\n this.app.fire('controls:max', {\n target: this.target\n });\n }\n else if( this.action == 3 ) {\n this.app.fire('controls:newtab', {\n target: this.target\n });\n }\n /*else if( this.action == 2 ) {\n this.app.fire('controls:restore', {\n target: this.target\n });\n }*/\n};\n\nControlsButton.prototype.onCursorEnter = function(e) {\n document.body.style.cursor = 'pointer';\n this.highlightEntity.enabled = true;\n};\n\nControlsButton.prototype.onCursorExit = function() {\n document.body.style.cursor = 'default';\n this.highlightEntity.enabled = false;\n};\n\n","// selectableMedia.js\nvar SelectableMedia = pc.createScript('selectableMedia');\n\nSelectableMedia.attributes.add('mediaEntity', {type: 'entity'});\n\nSelectableMedia.prototype.initialize = function() {\n this.selectionCursor = this.app.root.children[0].script.selectionCursor;\n //this.selectedMediaEntity = null;\n this.hasBeenInteracted = false;\n \n this.app.on('media:select', this.onMediaSelect, this);\n this.app.on('media:deselect', this.onMediaDeselect, this);\n this.app.on('cursor:down:global', this.onCursorDownGlobal, this);\n this.entity.on('cursor:click', this.onCursorClick, this);\n};\n\nSelectableMedia.prototype.onCursorDownGlobal = function(entity) {\n if( entity != this.entity ) {\n var selectedMediaEntity = this.selectionCursor.selectedMediaEntity;\n var selectedMediaEntityCol = this.selectionCursor.selectedMediaEntityCol;\n if( selectedMediaEntity == this.mediaEntity && selectedMediaEntityCol == this.entity ) {\n this.selectionCursor.selectedMediaEntity = null;\n this.selectionCursor.selectedMediaEntityCol = null;\n this.app.fire('media:deselect', selectedMediaEntity, this.entity);\n }\n }\n};\n\nSelectableMedia.prototype.onCursorClick = function() {\n var selectedMediaEntity = this.selectionCursor.selectedMediaEntity;\n var selectedMediaEntityCol = this.selectionCursor.selectedMediaEntityCol;\n if( selectedMediaEntity && selectedMediaEntityCol ) {\n if( selectedMediaEntity != this.mediaEntity || selectedMediaEntityCol != this.entity ) {\n this.selectionCursor.selectedMediaEntity = null;\n this.selectionCursor.selectedMediaEntityCol = null;\n this.app.fire('media:deselect', selectedMediaEntity, this.entity);\n }\n }\n \n if( selectedMediaEntity != this.mediaEntity || selectedMediaEntityCol != this.entity ) {\n if( !this.mediaEntity.script.iframePlane.iframe ) {\n if( this.mediaEntity.script.iframePlane.activate() ) { \n this.selectionCursor.selectedMediaEntity = this.mediaEntity;\n this.selectionCursor.selectedMediaEntityCol = this.entity;\n this.app.fire('media:select', this.mediaEntity, this.entity);\n console.log('select');\n }\n }\n else { \n this.selectionCursor.selectedMediaEntity = this.mediaEntity;\n this.selectionCursor.selectedMediaEntityCol = this.entity;\n this.app.fire('media:select', this.mediaEntity, this.entity);\n }\n }\n};\n\nSelectableMedia.prototype.onMediaDeselect = function(mediaEntity) {\n if( mediaEntity == this.mediaEntity ) {\n this.entity.enabled = true;\n \n // iframe-specific stuff\n mediaEntity.script.iframePlane._css3Plane.dom.style.pointerEvents = 'none';\n var canvas = document.getElementById(\"application-canvas\");\n canvas.style.pointerEvents = \"auto\";\n mediaEntity.script.iframePlane.controls.enabled = false;\n }\n};\n\nSelectableMedia.prototype.onMediaSelect = function(mediaEntity, selectableMediaEntity) { \n if( mediaEntity == this.mediaEntity ) {\n this.hasBeenInteracted = true;\n \n if( selectableMediaEntity == this.entity ) {\n this.entity.enabled = false;\n\n // label-specific stuff\n //console.log(this.entity.parent);\n //if( this.entity.parent ) {\n this.entity.parent.findByName('LabelSlate').enabled = false;\n //}\n\n // iframe-specific stuff\n if( !mediaEntity.script.iframePlane.iframe ) {\n mediaEntity.script.iframePlane.activate();\n }\n\n mediaEntity.script.iframePlane._css3Plane.dom.style.pointerEvents = 'auto';\n mediaEntity.script.iframePlane.controls.enabled = true;\n var canvas = document.getElementById(\"application-canvas\");\n canvas.style.pointerEvents = \"none\";\n }\n }\n};\n\n","// hoverLabel.js\nvar HoverLabel = pc.createScript('hoverLabel');\n\nHoverLabel.prototype.initialize = function() {\n this.labelEntity = this.entity.parent.findByName('LabelSlate');\n this.entity.on('cursor:enter', this.onCursorEnter, this);\n this.entity.on('cursor:exit', this.onCursorExit, this);\n};\n\nHoverLabel.prototype.onCursorEnter = function() {\n if( this.labelEntity ) {\n this.labelEntity.enabled = true;\n }\n document.body.style.cursor = 'pointer';\n};\n\nHoverLabel.prototype.onCursorExit = function() {\n if( this.labelEntity ) {\n this.labelEntity.enabled = false;\n }\n document.body.style.cursor = 'default';\n};\n\n","// mediaObject.js\nvar MediaObject = pc.createScript('mediaObject');\n\nMediaObject.attributes.add('dynamicMaterialName', {\n type: 'string',\n title: 'Dynamic Material Name',\n default: 'DynamicImage'\n});\n\nMediaObject.attributes.add('dynamicMaterial', {\n type: 'asset',\n assetType: 'material',\n title: 'Dynamic Material'\n});\n\n//MediaObject.attributes.add('selectableMediaEntity', {type: 'entity'});\nMediaObject.attributes.add('mediaObjectEntity', {type: 'entity'});\n\nMediaObject.prototype.initialize = function() {\n this.youTubeId = null;\n this.modelEntity = this.entity.findByName('Model');\n this.selectableMediaEntity = this.entity.findByName('Col');\n this.selectableMediaEntity.on('cursor:click', this.onCursorClick, this);\n \n var self = this;\n this.clonedDynamicMaterial = this.dynamicMaterial.resource.clone();\n \n var material = this.modelEntity.model.material;\n if( material.name == this.dynamicMaterialName ) {\n material = this.clonedDynamicMaterial;//material.clone();\n this.modelEntity.model.material = material;\n }\n else {\n var mesh;\n for( var i = 0; i < this.modelEntity.model.meshInstances.length; i++ ) {\n mesh = this.modelEntity.model.meshInstances[i];\n material = mesh.material;\n if( material && material.name == this.dynamicMaterialName ) {\n material = this.clonedDynamicMaterial;//material.clone();\n mesh.material = material;\n }\n }\n }\n \n /*\n var material = this.modelEntity.model.material;\n if( material.name == this.dynamicMaterialName ) {\n material = material.clone();\n this.modelEntity.model.material = material;\n }\n else {\n var mesh;\n for( var i = 0; i < this.modelEntity.model.meshInstances.length; i++ ) {\n mesh = this.modelEntity.model.meshInstances[i];\n material = mesh.material;\n if( material && material.name == this.dynamicMaterialName ) {\n material = material.clone();\n mesh.material = material;\n }\n }\n }\n */\n};\n\nMediaObject.prototype.stop = function() {\n if( this.mediaObjectEntity.script.iframePlane._css3Plane ) {\n this.mediaObjectEntity.script.iframePlane._css3Plane.dom.src = '';\n }\n else {\n this.mediaObjectEntity.script.iframePlane.iframeUrl = '';\n }\n //this.mediaObjectEntity.setPosition(pos.x, pos.y, pos.z);\n //this.mediaObjectEntity.setRotation(rot.x, rot.y, rot.z, rot.w);\n this.mediaObjectEntity.enabled = false;\n};\n\nMediaObject.prototype.assignMedia = function(youTubeId) {\n //var url = 'https://www.youtube.com/watch?v=0tn6nWYNK3Q';\n //var youTubeId = this.extractYouTubeId(url);\n //if( youTubeId ) {\n var thumbnailUrl = 'https://i.ytimg.com/vi/' + youTubeId + '/default.jpg';\n this.assignTextureImage(thumbnailUrl);\n this.youTubeId = youTubeId;\n //}\n ////this.assignTextureImage('https://static.onecms.io/wp-content/uploads/sites/20/2020/04/28/taylor-swift-1-2000.jpg');\n};\n\nMediaObject.prototype.onCursorClick = function() {\n var url = 'https://www.youtube.com/embed/' + this.youTubeId + '?autoplay=1';\n //if( !this.selectableMediaEntity.script.selectableMedia.hasBeenInteracted ) {\n // url += '&mute=1';\n //}\n if( this.mediaObjectEntity.script.iframePlane._css3Plane ) {\n this.mediaObjectEntity.script.iframePlane._css3Plane.dom.src = url;\n }\n else {\n this.mediaObjectEntity.script.iframePlane.iframeUrl = url;\n }\n \n var mediaPlanePoint = this.entity.findByName('MediaPlanePoint');\n var pos = mediaPlanePoint.getPosition();\n var rot = mediaPlanePoint.getRotation();\n this.mediaObjectEntity.setPosition(pos.x, pos.y, pos.z);\n this.mediaObjectEntity.setRotation(rot.x, rot.y, rot.z, rot.w);\n this.mediaObjectEntity.enabled = true;\n //if( this.mediaObjectEntity.script.iframePlane._css3Plane ) {\n // this.mediaObjectEntity.script.iframePlane._css3Plane.updateTransform();\n //}\n \n /*var self = this;\n this.mediaObjectEntity.model.enabled = false;\n setTimeout(function() {\n self.mediaObjectEntity.model.enabled = true;\n }, 1000);*/\n};\n\nMediaObject.prototype.assignTextureImage = function(url) {\n var self = this;\n function onTextureLoad(textureAsset) {\n var material = self.modelEntity.model.material;\n if( material.name == self.dynamicMaterialName ) {\n material.diffuseMap = textureAsset.resource;\n material.emissiveMap = textureAsset.resource;\n material.update();\n }\n else {\n var mesh;\n for( var i = 0; i < self.modelEntity.model.meshInstances.length; i++ ) {\n mesh = self.modelEntity.model.meshInstances[i];\n material = mesh.material;\n if( material && material.name == self.dynamicMaterialName ) {\n material.diffuseMap = textureAsset.resource;\n material.emissiveMap = textureAsset.resource;\n material.update();\n }\n }\n }\n }\n \n function onTextureError(err) {\n console.log(err);\n }\n \n var imageUrl = url;\n this.modelEntity.script.dynamicImage.loadTextureUrl(imageUrl)\n .then(onTextureLoad)\n .catch(onTextureError);\n};\n\n","// shortcutObject.js\nvar ShortcutObject = pc.createScript('shortcutObject');\n\nShortcutObject.attributes.add('href', {type: 'string'});\nShortcutObject.attributes.add('target', {type: 'string', default: '_blank'});\n\nShortcutObject.prototype.initialize = function() {\n this.entity.on('cursor:enter', this.onCursorEnter, this);\n this.entity.on('cursor:exit', this.onCursorExit, this);\n this.entity.on('cursor:click', this.onCursorClick, this);\n this.highlightEntity = this.entity.parent.findByName('Highlight');\n this.newIconEntity = this.entity.parent.findByName('NewIcon');\n this.notHighlightEntity = this.entity.parent.findByName('NotHighlight');\n /*this.labelSlate = this.entity.parent.findByName('LabelSlate');\n this.model = this.entity.parent.findByName('Icon').model;\n this.model.material = this.model.material.clone();\n this.originalColor = this.model.material.emissive.clone();*/\n\n this.app.on('hotspot:report', function() {\n this.app.fire('hotspot:reporting', this.entity);\n }, this);\n\n\n this.worldDynamicLight = this.app.root.children[0].findByName('_dynamic_light');\n if( !this.worldDynamicLight.hasOwnProperty('originalProperties') ) {\n var originalProperties = {\n color: this.worldDynamicLight.light.color.clone(),\n intensity: this.worldDynamicLight.light.intensity,\n range: this.worldDynamicLight.light.range,\n innerConeAngle: this.worldDynamicLight.light.innerConeAngle,\n outerConeAngle: this.worldDynamicLight.light.outerConeAngle,\n position: this.worldDynamicLight.getPosition().clone(),\n rotation: this.worldDynamicLight.getRotation().clone()\n };\n this.worldDynamicLight.originalProperties = originalProperties;\n }\n};\n\nShortcutObject.prototype.postInitialize = function() {\n this.highlightEntity.enabled = false;\n this.newIconEntity.enabled = false;\n this.worldDynamicLight.enabled = false;\n};\n\nShortcutObject.prototype.onCursorClick = function(e) {\n if( false && this.target != '_self' && this.target != '_blank' ) {\n var iframe = document.querySelector('iframe[name=\"' + this.target + '\"]');\n if( iframe.lastUrl != this.href ) {\n this.app.fire('interaction', {entity: this.entity, href: this.href, target: this.target});\n }\n\n iframe.lastUrl = this.href;\n }\n else {\n this.app.fire('interaction', {entity: this.entity, href: this.href, target: this.target});\n }\n\n this.app.fire('hud:openLink',{entity: this.entity, href: this.href, target: this.target});\n this.onCursorExit();\n //window.open(this.href, this.target);\n};\n\nShortcutObject.prototype.onCursorEnter = function() {\n document.body.style.cursor = 'pointer';\n if( this.notHighlightEntity ) {\n this.notHighlightEntity.enabled = false;\n }\n this.highlightEntity.enabled = true;\n\n var scoreData = localStorage.getItem('startpagescore');\n if( scoreData ) {\n scoreData = JSON.parse(scoreData);\n }\n else {\n scoreData = {usedUrls: []};\n }\n\n if( scoreData.usedUrls.indexOf(this.href) < 0 ) {\n this.newIconEntity.enabled = true;\n }\n else {\n this.newIconEntity.enabled = false;\n }\n\n var dynamicLight = this.highlightEntity.findByName('_dynamic_light');\n if( dynamicLight ) {\n this.worldDynamicLight.enabled = true;\n for( var x in this.worldDynamicLight.originalProperties ) {\n if( x == 'position' ) {\n var dpos = dynamicLight.getPosition();\n this.worldDynamicLight.setPosition(dpos.x, dpos.y, dpos.z);\n }\n else if( x == 'rotation' ) {\n var drot = dynamicLight.getRotation();\n this.worldDynamicLight.setRotation(drot.x, drot.y, drot.z, drot.w);\n }\n else {\n this.worldDynamicLight.light[x] = dynamicLight.light[x];\n }\n }\n }\n\n //this.labelSlate.enabled = true;\n //this.model.material.emissive = new pc.Color(255, 255, 255);\n //this.model.material.update();\n};\n\nShortcutObject.prototype.onCursorExit = function() {\n document.body.style.cursor = 'default';\n this.highlightEntity.enabled = false;\n if( this.notHighlightEntity ) {\n this.notHighlightEntity.enabled = true;\n }\n //this.labelSlate.enabled = false;\n //this.model.material.emissive = new pc.Color(this.originalColor.r, this.originalColor.g, this.originalColor.b);\n //this.model.material.update();\n\n var dynamicLight = this.highlightEntity.findByName('_dynamic_light');\n if( dynamicLight ) {\n this.worldDynamicLight.enabled = false;\n for( var x in this.worldDynamicLight.originalProperties ) {\n if( x == 'position' ) {\n this.worldDynamicLight.setPosition(this.worldDynamicLight.originalProperties[x].x, this.worldDynamicLight.originalProperties[x].y, this.worldDynamicLight.originalProperties[x].z);\n }\n else if( x == 'rotation' ) {\n this.worldDynamicLight.setRotation(this.worldDynamicLight.originalProperties[x].x, this.worldDynamicLight.originalProperties[x].y, this.worldDynamicLight.originalProperties[x].z, this.worldDynamicLight.originalProperties[x].w);\n }\n else {\n this.worldDynamicLight.light[x] = this.worldDynamicLight.originalProperties[x];\n }\n }\n }\n};\n\n","// shortcutButton.js\nvar ShortcutButton = pc.createScript('shortcutButton');\n\nShortcutButton.attributes.add('href', {type: 'string'});\nShortcutButton.attributes.add('target', {type: 'string', default: '_blank'});\n\nShortcutButton.prototype.initialize = function() {\n this.entity.on('cursor:enter', this.onCursorEnter, this);\n this.entity.on('cursor:exit', this.onCursorExit, this);\n this.entity.on('cursor:click', this.onCursorClick, this);\n this.labelSlate = this.entity.parent.findByName('LabelSlate');\n this.newIconEntity = this.entity.parent.findByName('NewIcon');\n this.model = this.entity.parent.findByName('Icon').model;\n this.model.material = this.model.material.clone();\n this.originalColor = this.model.material.emissive.clone();\n\n this.app.on('hotspot:report', function() {\n this.app.fire('hotspot:reporting', this.entity);\n }, this);\n};\n\nShortcutButton.prototype.postInitialize = function() {\n this.labelSlate.enabled = false;\n this.newIconEntity.enabled = false;\n};\n\nShortcutButton.prototype.onCursorClick = function() {\n if( false && this.target != '_self' && this.target != '_blank' ) {\n var iframe = document.querySelector('iframe[name=\"' + this.target + '\"]');\n if( iframe.lastUrl != this.href ) {\n this.app.fire('interaction', {entity: this.entity, href: this.href, target: this.target});\n }\n\n iframe.lastUrl = this.href;\n }\n else {\n this.app.fire('interaction', {entity: this.entity, href: this.href, target: this.target});\n }\n\n this.app.fire('hud:openLink',{entity: this.entity, href: this.href, target: this.target});\n this.onCursorExit();\n //window.open(this.href, this.target);\n};\n\nShortcutButton.prototype.onCursorEnter = function(e) {\n document.body.style.cursor = 'pointer';\n this.labelSlate.enabled = true;\n this.model.material.emissive = new pc.Color(255, 255, 255);\n this.model.material.update();\n\n var scoreData = localStorage.getItem('startpagescore');\n if( scoreData ) {\n scoreData = JSON.parse(scoreData);\n }\n else {\n scoreData = {usedUrls: []};\n }\n\n if( scoreData.usedUrls.indexOf(this.href) < 0 ) {\n this.newIconEntity.enabled = true;\n }\n else {\n this.newIconEntity.enabled = false;\n }\n\n var dynamicLight = this.labelSlate.findByName('_dynamic_light');\n if( dynamicLight ) {\n this.worldDynamicLight.enabled = true;\n for( var x in this.worldDynamicLight.originalProperties ) {\n if( x == 'position' ) {\n var dpos = dynamicLight.getPosition();\n this.worldDynamicLight.setPosition(dpos.x, dpos.y, dpos.z);\n }\n else if( x == 'rotation' ) {\n var drot = dynamicLight.getRotation();\n this.worldDynamicLight.setRotation(drot.x, drot.y, drot.z, drot.w);\n }\n else {\n this.worldDynamicLight.light[x] = dynamicLight.light[x];\n }\n }\n }\n};\n\nShortcutButton.prototype.onCursorExit = function(e) {\n document.body.style.cursor = 'default';\n this.labelSlate.enabled = false;\n this.model.material.emissive = new pc.Color(this.originalColor.r, this.originalColor.g, this.originalColor.b);\n this.model.material.update();\n\n var dynamicLight = this.labelSlate.findByName('_dynamic_light');\n if( dynamicLight ) {\n this.worldDynamicLight.enabled = false;\n for( var x in this.worldDynamicLight.originalProperties ) {\n if( x == 'position' ) {\n this.worldDynamicLight.setPosition(this.worldDynamicLight.originalProperties[x].x, this.worldDynamicLight.originalProperties[x].y, this.worldDynamicLight.originalProperties[x].z);\n }\n else if( x == 'rotation' ) {\n this.worldDynamicLight.setRotation(this.worldDynamicLight.originalProperties[x].x, this.worldDynamicLight.originalProperties[x].y, this.worldDynamicLight.originalProperties[x].z, this.worldDynamicLight.originalProperties[x].w);\n }\n else {\n this.worldDynamicLight.light[x] = this.worldDynamicLight.originalProperties[x];\n }\n }\n }\n};\n\n","// channelManager.js\nvar ChannelManager = pc.createScript('channelManager');\n\nChannelManager.attributes.add('cameraEntity', {type: 'entity'});\n\nChannelManager.prototype.initialize = function() {\n this.mediaObjects = {};\n /*{\n 'fakekey0': {\n 'youTubeId': 'Fp0BScQSSvg',\n 'position': {x: 1.673, y: 0, z: -3.092},\n 'rotation': {x: 0, y: 0, z: 0}\n }\n };*/\n \n this.lastSpawnPoint = null;\n this.vec3 = new pc.Vec3();\n this.spawnModeEntity = null;\n this.app.on('cursor:up:global', this.onCursorUpGlobal, this);\n this.app.on('cursor:move:global', this.onCursorMoveGlobal, this);\n this.mediaCabinets = this.app.root.findByName('MediaCabinets');\n this.selectionCursor = this.app.root.children[0].script.selectionCursor;\n //setTimeout(this.syncMediaObjectsInitial.bind(this), 4000);\n \n // initlaize Firebase\n this.firebaseConfig = {};\n //firebase.initializeApp(this.firebaseConfig);\n /*\n var database = firebase.database();\n var channelName = '';//'smsithlord';\n var channelRootRef = database.ref('channels/channelName');\n var mediaObjectsRef = channelRootRef.child('objects');\n mediaObjectsRef.on('child_added', this.onRemoteMediaObjectAdded.bind(this));\n mediaObjectsRef.on('child_removed', this.onRemoteMediaObjectRemoved.bind(this));\n mediaObjectsRef.on('child_changed', this.onRemoteMediaObjectChanged.bind(this));\n this.channelRootRef = channelRootRef;\n */\n this.channelRootRef = null;\n};\n\nChannelManager.prototype.onRemoteMediaObjectAdded = function(snapshot, prevChildKey) {\n var name = 'MediaObject_' + snapshot.key;\n var existingEntity = this.app.root.findByName(name); \n if( !existingEntity ) {\n // create the entity.\n var val = snapshot.val();\n this.mediaObjects[snapshot.key] = val;\n \n var cabinet = this.mediaCabinets.findByName('flatscreen_tv');\n var mediaObjectEntity = cabinet.clone();\n mediaObjectEntity.name = name;\n mediaObjectEntity.networkId = snapshot.key;\n this.app.root.addChild(mediaObjectEntity);\n mediaObjectEntity.setPosition(val.position.x, val.position.y, val.position.z);\n mediaObjectEntity.setEulerAngles(val.rotation.x, val.rotation.y, val.rotation.z);\n mediaObjectEntity.enabled = true;\n mediaObjectEntity.script.mediaObject.assignMedia(val.youTubeId);\n }\n};\n \nChannelManager.prototype.onRemoteMediaObjectRemoved = function(snapshot) {\n //var val = snapshot.val();\n //console.log('removed: ', val);\n var name = 'MediaObject_' + snapshot.key;\n var existingEntity = this.app.root.findByName(name); \n if( existingEntity ) {\n var needsToStop = false;\n var mediaPlanePoint = existingEntity.findByName('MediaPlanePoint');\n var pos = mediaPlanePoint.getPosition();\n var dist = pos.distance(existingEntity.script.mediaObject.mediaObjectEntity.getPosition());\n needsToStop = (dist < 0.01);\n if( needsToStop ) {\n existingEntity.script.mediaObject.stop();\n }\n existingEntity.destroy();\n }\n};\n\nChannelManager.prototype.onRemoteMediaObjectChanged = function(snapshot) {\n var val = snapshot.val();\n console.log('changed: ', val);\n};\n\nChannelManager.prototype.syncMediaObject = function(mediaObjectEntity) {\n var networkId;\n if( !mediaObjectEntity.networkId ) {\n networkId = this.channelRootRef.child('objects').push().key;\n mediaObjectEntity.networkId = networkId;\n mediaObjectEntity.name = 'MediaObject_' + networkId;\n }\n \n var pos = mediaObjectEntity.getPosition();\n var rot = mediaObjectEntity.getEulerAngles();\n var payload = {\n youTubeId: mediaObjectEntity.script.mediaObject.youTubeId,\n position: {x: pos.x, y: pos.y, z: pos.z},\n rotation: {x: rot.x, y: rot.y, z: rot.z}\n };\n \n //mediaObjectEntity.destroy();\n \n //console.log(payload);\n this.channelRootRef.child('objects').child(networkId).update(payload);\n};\n\n/*\nChannelManager.prototype.syncMediaObjectsInitial = function() {\n var cabinet = this.mediaCabinets.findByName('flatscreen_tv');\n \n var mediaObjectEntry = this.mediaObjects['fakekey0'];\n var mediaObjectEntity = cabinet.clone();\n mediaObjectEntity.setPosition(mediaObjectEntry.position.x, mediaObjectEntry.position.y, mediaObjectEntry.position.z);\n mediaObjectEntity.setEulerAngles(mediaObjectEntry.rotation.x, mediaObjectEntry.rotation.y, mediaObjectEntry.rotation.z);\n mediaObjectEntity.enabled = true;\n mediaObjectEntity.script.mediaObject.assignMedia('0tn6nWYNK3Q');\n};*/\n\nChannelManager.prototype.removeMediaObject = function(mediaObjectEntity) {\n var networkId = mediaObjectEntity.networkId;\n if( this.selectionCursor.selectedMediaEntityCol == mediaObjectEntity.findByName('Col') ) {\n mediaObjectEntity.script.mediaObject.stop();\n }\n mediaObjectEntity.destroy();\n this.channelRootRef.child('objects').child(networkId).remove();\n};\n\nChannelManager.prototype.enterSpawnMode = function(objectData) {\n var cabinet = this.mediaCabinets.findByName(objectData.cabinet);\n if( cabinet ) {\n var mediaObjectEntity = cabinet.clone();\n this.app.root.addChild(mediaObjectEntity);\n mediaObjectEntity.enabled = true;\n mediaObjectEntity.script.mediaObject.assignMedia(objectData.youTubeId);\n this.spawnModeEntity = mediaObjectEntity;\n this.app.fire('spawnMode:enter', this.spawnModeEntity);\n document.body.style.cursor = 'grabbing';\n }\n};\n\nChannelManager.prototype.onCursorUpGlobal = function(e) {\n if( this.spawnModeEntity && this.lastSpawnPoint ) {\n var entity = this.spawnModeEntity;\n this.spawnModeEntity = null;\n this.lastSpawnPoint = null;\n document.body.style.cursor = 'default';\n this.app.fire('spawnMode:exit');\n \n this.syncMediaObject(entity);\n }\n};\n\nChannelManager.prototype.onCursorMoveGlobal = function(e) {\n if( this.spawnModeEntity ) {\n //console.log(e.raycast);\n var point = (e.raycast && e.raycast.point) ? e.raycast.point : null;\n if( point ) {\n this.spawnModeEntity.setPosition(point.x, point.y, point.z);\n //this.spawnModeEntity.setEulerAngles(mediaObjectEntry.rotation.x, mediaObjectEntry.rotation.y, mediaObjectEntry.rotation.z);\n \n var cameraPos = this.cameraEntity.getPosition();\n this.vec3.set(cameraPos.x, point.y, cameraPos.z);\n this.spawnModeEntity.lookAt(this.vec3.x, this.vec3.y, this.vec3.z);\n this.spawnModeEntity.rotateLocal(0, 180, 0);\n this.lastSpawnPoint = point;\n }\n }\n};\n\n","// video-texture.js\nvar VideoTexture = pc.createScript('videoTexture');\n\nVideoTexture.attributes.add('video', {\n title: 'Video',\n description: 'MP4 video asset to play back on this video texture.',\n type: 'asset'\n});\nVideoTexture.attributes.add('playEvent', {\n title: 'Play Event',\n description: 'Event that is fired as soon as the video texture is ready to play.',\n type: 'string',\n default: ''\n});\n\n// initialize code called once per entity\nVideoTexture.prototype.initialize = function() {\n var app = this.app;\n \n // Create HTML Video Element to play the video\n var video = document.createElement('video');\n video.loop = true;\n\n // muted attribute is required for videos to autoplay\n video.muted = true;\n\n // critical for iOS or the video won't initially play, and will go fullscreen when playing\n video.playsInline = true;\n \n // needed because the video is being hosted on a different server url\n video.crossOrigin = \"anonymous\";\n \n // autoplay the video\n video.autoplay = true;\n\n // iOS video texture playback requires that you add the video to the DOMParser\n // with at least 1x1 as the video's dimensions\n var style = video.style;\n style.width = '1px';\n style.height = '1px';\n style.position = 'absolute';\n style.opacity = '0';\n style.zIndex = '-1000';\n style.pointerEvents = 'none';\n\n document.body.appendChild(video);\n\n // Create a texture to hold the video frame data \n this.videoTexture = new pc.Texture(app.graphicsDevice, {\n format: pc.PIXELFORMAT_R8_G8_B8,\n minFilter: pc.FILTER_LINEAR_MIPMAP_LINEAR,\n magFilter: pc.FILTER_LINEAR,\n addressU: pc.ADDRESS_REPEAT,\n addressV: pc.ADDRESS_REPEAT,\n mipmaps: true\n });\n this.videoTexture.setSource(video);\n\n video.addEventListener('canplaythrough', function (e) {\n app.fire(this.playEvent, this.videoTexture);\n try{\n video.play();\n } catch(e) {\n // do nothing\n }\n }.bind(this));\n \n // set video source\n video.src = this.video ? this.video.getFileUrl() : this.videoUrl; \n \n document.body.appendChild(video);\n video.load();\n};\n\n// update code called every frame\nVideoTexture.prototype.update = function(dt) {\n // Transfer the latest video frame to the video texture\n this.videoTexture.upload();\n};\n\n\n","// tv-screen.js\nvar TvScreen = pc.createScript('tvScreen');\n\n/*TvScreen.attributes.add('screenMaterial', {\n title: 'Screen Material',\n description: 'The screen material of the TV that displays the video texture.',\n type: 'asset',\n assetType: 'material'\n});*/\nTvScreen.attributes.add('screenMaterials', {\n title: 'Screen Material',\n description: 'The screen material of the TV that displays the video texture.',\n type: 'asset',\n assetType: 'material',\n array: true\n});\n\nTvScreen.attributes.add('playEvent', {\n title: 'Play Event',\n description: 'Set the TV screen material emissive map on this event.',\n type: 'string',\n default: ''\n});\n\n// initialize code called once per entity\nTvScreen.prototype.initialize = function() {\n this.app.on(this.playEvent, function (videoTexture) {\n for( var i = 0; i < this.screenMaterials.length; i++ ) {\n var material = this.screenMaterials[i].resource;\n material.emissiveMap = videoTexture;\n material.update();\n }\n }, this);\n};\n\n\n","// lazyClock.js\nvar LazyClock = pc.createScript('lazyClock');\n\nLazyClock.attributes.add('dateEntity', {type: 'entity'});\nLazyClock.attributes.add('timeEntity', {type: 'entity'});\n\n// initialize code called once per entity\nLazyClock.prototype.initialize = function() {\n this.lastMinutes = -1;\n this.lastDateString = '';\n this.lastTimeString = '';\n};\n\n// update code called every frame\nLazyClock.prototype.update = function(dt) {\n var now = new Date();\n var nowMinutes = now.getMinutes();\n if( this.lastMinutes != nowMinutes ) {\n this.lastMinutes = nowMinutes;\n\n var dateString = now.toDateString();\n var timeString = now.toLocaleTimeString();\n\n // remove seconds\n var found = timeString.lastIndexOf(':');\n var tmp = timeString.substring(found+1);\n timeString = timeString.substring(0, found);\n found = tmp.indexOf(' ');\n tmp = tmp.substring(found);\n timeString += tmp;\n\n this.updateDateString(dateString);\n this.updateTimeString(timeString);\n }\n};\n\nLazyClock.prototype.updateDateString = function(dateString) {\n if( this.lastDateString == dateString ) {\n return;\n }\n \n this.dateEntity.element.text = dateString;\n this.lastDateString = dateString;\n};\n\nLazyClock.prototype.updateTimeString = function(timeString) {\n if( this.lastTimeString == timeString ) {\n return;\n }\n \n this.timeEntity.element.text = timeString;\n this.lastTimeString = timeString;\n};\n\n","// spin.js\nvar Spin = pc.createScript('spin');\n\nSpin.attributes.add('speed', {\n type: 'number',\n default: 10,\n title: 'Spin Speed'\n});\n\nSpin.prototype.postUpdate = function(dt) {\n //console.log('spinnin');\n this.entity.rotateLocal(0, this.speed * dt, 0);\n};\n\n"]}